<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Jessica Temporal</title>
    <description>Sr. Dev Advocate 🥑 • 🎙 Podcaster @pizzadedados • Creator of @gitfichas • GitHub ⭐️ • cross stitch &amp; knitter • 🇧🇷 &amp; 🇨🇦 • she/her • Opinions are my own.
</description>
    <link>https://jtemporal.com/</link>
    <atom:link href="https://jtemporal.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sat, 20 Jun 2026 20:14:16 +0000</pubDate>
    <lastBuildDate>Sat, 20 Jun 2026 20:14:16 +0000</lastBuildDate>
    <generator>Jekyll v4.3.4</generator>
    
      <item>
        <title>Recuperando commits perdidos com git reflog</title>
        <description>&lt;p&gt;Tem um tipo específico de pânico que bate quando parece que um commit simplesmente sumiu. Talvez você tenha rodado um hard reset, ou um rebase deu errado, e o trabalho que estava aí um minuto atrás não aparece em lugar nenhum do seu histórico. Antes de assumir que ele foi embora para sempre, tem um comando que pode te ajudar a trazer isso de volta: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reflog&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;o-que-é-o-reflog&quot;&gt;O que é o reflog?&lt;/h2&gt;

&lt;p&gt;O Git mantém um registro privado de todos os lugares por onde o HEAD passou. Tudo o que você faz no Git que move &lt;a href=&quot;/desfazendo-um-ou-mais-commits/&quot;&gt;o ponteiro HEAD&lt;/a&gt; fica registrado, seja porque você fez um commit, deu um checkout, rodou um reset, ou porque um rebase ou merge mexeu nele.&lt;/p&gt;

&lt;p&gt;Esse registro de movimento fica no log de referência (do inglês &lt;em&gt;reference log&lt;/em&gt; ou reflog, para encurtar) e ele é local na sua máquina. Então, mesmo quando um commit não aparece mais no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git log&lt;/code&gt;, a referência para ele geralmente ainda está no reflog.&lt;/p&gt;

&lt;h2 id=&quot;encontrando-o-commit-que-você-perdeu&quot;&gt;Encontrando o commit que você perdeu&lt;/h2&gt;

&lt;p&gt;Para ver o reference log, você pode rodar o comando abaixo:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git reflog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Você vai ver uma lista de movimentos recentes, com a entrada mais recente no topo, como na imagem abaixo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reflog/Screenshot_2026-06-20_at_10.26.55_AM.webp&quot; alt=&quot;saída do git reflog mostrando movimentos recentes do HEAD&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Cada linha tem um hash curto, uma referência como &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HEAD@{2}&lt;/code&gt;, e uma descrição do que aconteceu, coisas como “commit”, “reset: moving to” ou “checkout”.&lt;/p&gt;

&lt;p&gt;Mesmo que seja difícil se acostumar a ler esse novo formato de log, a descrição e a ordem geralmente deixam claro onde você estava e podem ser a indicação que você precisa para saber para onde quer voltar.&lt;/p&gt;

&lt;h2 id=&quot;voltando-para-lá&quot;&gt;Voltando para lá&lt;/h2&gt;

&lt;p&gt;Quando você encontrar a entrada certa, copie o &lt;em&gt;hash&lt;/em&gt;. Depois, mova o seu branch de volta para aquele ponto:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git reset &lt;span class=&quot;nt&quot;&gt;--hard&lt;/span&gt; &amp;lt;&lt;span class=&quot;nb&quot;&gt;hash&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Substitua &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;hash&amp;gt;&lt;/code&gt; pelo hash que você encontrou no reflog.&lt;/p&gt;

&lt;p&gt;Por exemplo, pensando na imagem acima, se você quiser voltar para o estado antes do reset, você precisaria rodar o seguinte:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git reset &lt;span class=&quot;nt&quot;&gt;--hard&lt;/span&gt; a68cffa
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Depois disso, o seu estado de trabalho volta a bater com o momento antes do erro, como se nada tivesse acontecido.&lt;/p&gt;

&lt;p&gt;Uma observação rápida: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset --hard&lt;/code&gt; descarta as suas mudanças não commitadas. Então tenha certeza de que você realmente quer cair nesse estado anterior antes de rodar o comando. Se você não tiver certeza, você pode usar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git switch&lt;/code&gt; para ir até o hash primeiro e dar uma olhada sem mover o seu branch.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;A maioria das pessoas aprende sobre o reflog do jeito difícil, depois de perder trabalho por causa de um reset ou de um rebase. Então saber que ele existe pode ser uma mão na roda numa emergência.&lt;/p&gt;

&lt;p&gt;Recapitulando os passos para restaurar um estado anterior perdido com o reflog:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Encontre o estado para o qual você quer voltar e copie o hash.&lt;/li&gt;
  &lt;li&gt;Confira se esse é mesmo o estado que você quer restaurar com &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git switch &amp;lt;hash&amp;gt;&lt;/code&gt;. Se não for, repita os passos 1 e 2 até encontrar o estado certo.&lt;/li&gt;
  &lt;li&gt;Rode &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset --hard &amp;lt;hash&amp;gt;&lt;/code&gt; para voltar para ele.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O reflog combina bem com os outros comandos que movem o HEAD: &lt;a href=&quot;https://jtemporal.com/desfazendo-o-ultimo-commit-e-reaproveitando-a-mensagem/&quot;&gt;desfazendo o último commit e reaproveitando a mensagem&lt;/a&gt;, &lt;a href=&quot;https://jtemporal.com/atualizando-um-branch-com-git-rebase/&quot;&gt;atualizando um branch com git rebase&lt;/a&gt;, e &lt;a href=&quot;https://jtemporal.com/usando-git-stash-e-git-stash-pop/&quot;&gt;usando git stash&lt;/a&gt;. Se algum deles te fizer perder trabalho, o reflog é a sua rede de segurança.&lt;/p&gt;
</description>
        <pubDate>Sat, 20 Jun 2026 12:00:00 +0000</pubDate>
        <link>https://jtemporal.com/recuperando-commits-perdidos-com-git-reflog/</link>
        <guid isPermaLink="true">https://jtemporal.com/recuperando-commits-perdidos-com-git-reflog/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>Recovering lost commits with git reflog</title>
        <description>&lt;p&gt;There is a particular kind of panic that hits when a commit looks like it just vanished. Maybe you ran a hard reset, or a rebase went sideways, and the work you had a minute ago is nowhere in your history. Before you assume it is gone for good, there is one command that may be able to bring it back: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reflog&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;what-is-the-reflog&quot;&gt;What is the reflog?&lt;/h2&gt;

&lt;p&gt;Git keeps a private log of everywhere HEAD has been. Everything you do in Git that moves &lt;a href=&quot;https://jtemporal.com/undoing-the-last-commits-using-git-reset/&quot;&gt;the HEAD pointer&lt;/a&gt; is recorded, whether you made a commit, did a checkout, ran a reset, or a rebase or merge moved it around.&lt;/p&gt;

&lt;p&gt;The log of that movement lives in the reference log (reflog for short), and it is local to your machine. So even when a commit no longer shows up when you do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git log&lt;/code&gt;, the reference to it usually still lives in the reflog.&lt;/p&gt;

&lt;h2 id=&quot;finding-the-commit-you-lost&quot;&gt;Finding the commit you lost&lt;/h2&gt;

&lt;p&gt;To see the reference log you can run the command below:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git reflog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You get a list of recent moves, with the most recent entry at the top, like shown in the following image.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reflog/Screenshot_2026-06-20_at_10.26.55_AM.webp&quot; alt=&quot;git reflog output showing recent HEAD movements&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Each line has a short hash, a reference like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HEAD@{2}&lt;/code&gt;, and a description of what happened, things like “commit”, “reset: moving to”, or “checkout”.&lt;/p&gt;

&lt;p&gt;Even though it may be hard to get used to reading this new format of log, the description and order usually make it clear where you were and can be the indication you need to know where you want to go.&lt;/p&gt;

&lt;h2 id=&quot;getting-back-to-it&quot;&gt;Getting back to it&lt;/h2&gt;

&lt;p&gt;Once you have spotted the right entry, copy its hash. Then move your branch back to that point:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git reset &lt;span class=&quot;nt&quot;&gt;--hard&lt;/span&gt; &amp;lt;&lt;span class=&quot;nb&quot;&gt;hash&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;hash&amp;gt;&lt;/code&gt; with the hash you found in the reflog.&lt;/p&gt;

&lt;p&gt;For example, thinking of the image above, if you want to go to the state before the reset you’d need to run the following:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git reset &lt;span class=&quot;nt&quot;&gt;--hard&lt;/span&gt; a68cffa
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And after that, your working state matches the moment before the mistake, like it never happened.&lt;/p&gt;

&lt;p&gt;A quick note of caution: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset --hard&lt;/code&gt; discards your current uncommitted changes, so make sure you actually want to land on that older state before you run it. If you are not sure, you can use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git switch&lt;/code&gt; to the hash first to look around without moving your branch.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;Most people learn about the reflog the hard way after losing the work to a reset or a rebase, so knowing it exists can be extremely helpful in a pinch.&lt;/p&gt;

&lt;p&gt;Here’s a recap of the steps to restore a previous lost state with reflog:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Find the state you want to go back to, and copy its hash.&lt;/li&gt;
  &lt;li&gt;Check if that’s the actual state you want to restore with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git switch &amp;lt;hash&amp;gt;&lt;/code&gt;. If it’s not, repeat steps 1 and 2 until you find the correct state.&lt;/li&gt;
  &lt;li&gt;Run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset --hard &amp;lt;hash&amp;gt;&lt;/code&gt; to get back to it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The reflog pairs well with the other commands that move HEAD around: &lt;a href=&quot;https://jtemporal.com/undoing-the-last-commit-and-reusing-the-message/&quot;&gt;undoing the last commit and reusing the message&lt;/a&gt;, &lt;a href=&quot;https://jtemporal.com/updating-a-branch-with-git-rebase/&quot;&gt;updating a branch with git rebase&lt;/a&gt;, and &lt;a href=&quot;https://jtemporal.com/using-git-stash-and-git-stash-pop/&quot;&gt;using git stash&lt;/a&gt;. If any of those ever lose you some work, the reflog is your safety net.&lt;/p&gt;
</description>
        <pubDate>Sat, 20 Jun 2026 12:00:00 +0000</pubDate>
        <link>https://jtemporal.com/recovering-lost-commits-with-git-reflog/</link>
        <guid isPermaLink="true">https://jtemporal.com/recovering-lost-commits-with-git-reflog/</guid>
        
        <category>git</category>
        
        <category>english</category>
        
        <category>pro_tip</category>
        
        
      </item>
    
      <item>
        <title>Automating CSS versioning in staging through GitHub Actions</title>
        <description>&lt;p&gt;While setting up a staging environment in a new hosting platform, I ran into an issue where static assets were aggressively cached with no straightforward way to invalidate them. This made staging deploys unreliable and validating changes slow.&lt;/p&gt;

&lt;p&gt;I could have spent hours fighting with cache headers and purge APIs, but there’s a simpler approach. Rather than fighting the cache, I leaned into patterns that avoid invalidation entirely and make staging behaviour explicit and predictable.&lt;/p&gt;

&lt;h2 id=&quot;the-problem&quot;&gt;The Problem&lt;/h2&gt;

&lt;p&gt;This staging environment was behaving badly:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Static assets were cached aggressively&lt;/li&gt;
  &lt;li&gt;Cache purging is unavailable&lt;/li&gt;
  &lt;li&gt;Deploys appear as “successful” but changes were not visible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I was stuck with a cache that I couldn’t purge and changes I needed to validate somewhere other than my local machine. So I figured it was time to version the styling scripts.&lt;/p&gt;

&lt;h2 id=&quot;versioned-static-assets&quot;&gt;Versioned static assets&lt;/h2&gt;

&lt;p&gt;One reliable way to bypass aggressive caching is to change the asset URL on every deploy.&lt;/p&gt;

&lt;p&gt;Static assets are referenced with a deploy-specific version, in my case I went for short git SHA.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/static/css/base.css?v=6ea4bbe&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This was enough to fix the problem:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;CDNs cache by URL.&lt;/li&gt;
  &lt;li&gt;A new URL guarantees a cache miss.&lt;/li&gt;
  &lt;li&gt;No reliance on purge APIs or cache headers.&lt;/li&gt;
  &lt;li&gt;Simple, deterministic behaviour.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach works well for staging, where correctness matters more than caching efficiency. Then my next challenge was: &lt;em&gt;how to get this into my deployment without me manually editing the URLs every single time?&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;label-gated-staging-deploys&quot;&gt;Label-gated staging deploys&lt;/h2&gt;

&lt;p&gt;I can’t remember to update URLs manually every single time, so instead of suffering every time my CSS wouldn’t update accordingly, I adjusted my code and added a step in my GitHub Actions to take care of this for me.&lt;/p&gt;

&lt;p&gt;Since I’m the sole developer on this project, my staging deploys are explicitly controlled using pull request labels.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/css-caching-github-actions/01-preview-label-in-pr.webp&quot; alt=&quot;Pull request with preview label applied to enable staging deployment&quot; class=&quot;img-post&quot; style=&quot;max-width: 40%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A pull request is deployed to staging only when the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;preview&lt;/code&gt; is applied.&lt;/p&gt;

&lt;h2 id=&quot;github-actions&quot;&gt;GitHub Actions&lt;/h2&gt;

&lt;p&gt;In case you want to replicate this for yourself, here’s how to do it. The steps are pretty simple:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Run your tests;&lt;/li&gt;
  &lt;li&gt;If tests pass deploy the app to the staging environment&lt;/li&gt;
  &lt;li&gt;Make a comment on your PR so you know the version of the CSS that should be live&lt;/li&gt;
  &lt;li&gt;Enjoy QA-ing your staged deployment&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;First the setup for your action:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Run tests and stage changes&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;pull_request&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;types&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;opened&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;synchronize&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;reopened&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;labeled&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;unlabeled&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This names the action and tells it which Pull Requests to look at, in my case all of them.&lt;/p&gt;

&lt;h3 id=&quot;1-tests-running&quot;&gt;1. Tests running&lt;/h3&gt;

&lt;p&gt;I want to make sure that all pull requests pass my test suite, so the first job checks out the pull request, installs the dependencies and creates necessary files, then runs the tests:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class=&quot;na&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Checkout PR branch&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Install uv&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;astral-sh/setup-uv@v7&lt;/span&gt;

      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Install dependencies&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;uv sync --extra dev&lt;/span&gt;

      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Setup test environment&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;cp .env.example .env&lt;/span&gt;

      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Run tests&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;uv run pytest&lt;/span&gt;

  &lt;span class=&quot;na&quot;&gt;deploy-staging&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This guarantees code quality in all pull requests before I even consider deployment.&lt;/p&gt;

&lt;p&gt;With a successful test we can move on to deployment.&lt;/p&gt;

&lt;h3 id=&quot;2-stage-the-deployment&quot;&gt;2. Stage the deployment&lt;/h3&gt;

&lt;p&gt;The deployment job only needs to run when the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;preview&lt;/code&gt; label is included.&lt;/p&gt;

&lt;p&gt;Then a neat trick: you can get the SHA for the deployment with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;github.sha&lt;/code&gt; and write it out to a file, in this case &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.deploy_sha&lt;/code&gt; and once the code is sent to the cloud it can use that file to read the information.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;

  &lt;span class=&quot;na&quot;&gt;deploy-staging&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Only run after tests pass&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;needs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;test&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;contains(github.event.pull_request.labels.*.name, &apos;preview&apos;)&lt;/span&gt;

    &lt;span class=&quot;na&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ubuntu-latest&lt;/span&gt;
    
    &lt;span class=&quot;na&quot;&gt;permissions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;contents&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;read&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;pull-requests&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;write&lt;/span&gt;

    &lt;span class=&quot;na&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Checkout PR branch&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Install uv&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;astral-sh/setup-uv@v7&lt;/span&gt;

      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Set deploy SHA&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;echo &quot;$&quot; | cut -c1-7 &amp;gt; .deploy_sha&lt;/span&gt;

      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Deploy to staging&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;CLOUD_TOKEN&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;$&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;CLOUD_APP_ID&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;$&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# your deploy command here&lt;/span&gt;
      
      &lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;My code also needed to account for that. So first I created a function in my FastAPI app to grab the first few characters of the SHA from either the environment variable or the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.deploy_sha&lt;/code&gt; file. I also set a fall back to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dev&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Deploy SHA for cache busting - check env var first, then file, fallback to &quot;dev&quot;
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_deploy_sha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;sh&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Get deploy SHA from environment or .deploy_sha file.&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sha&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getenv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;DEPLOY_SHA&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    
    &lt;span class=&quot;c1&quot;&gt;# Try reading from file (created during CI/CD deploy)
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;.deploy_sha&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;strip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;FileNotFoundError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Automatically make the deploy_sha available in all templates
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;templates&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;globals&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;deploy_sha&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_deploy_sha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The environment variable is used in production which normally doesn’t change unless I see some weird caching I’m not expecting to, whereas while developing locally the fallback takes action and in staging we use the file.&lt;/p&gt;

&lt;p&gt;Finally the HTML template looks like this:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/static/css/base.css?v=&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Since we pass the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;deploy_sha&lt;/code&gt; automatically as part of the globals variables for templates, any page will have the information they need when the application is being built.&lt;/p&gt;

&lt;h3 id=&quot;3-get-a-comment&quot;&gt;3. Get a comment&lt;/h3&gt;

&lt;p&gt;Finally, I wanted to get a comment I can see both:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;That the deployment is live&lt;/li&gt;
  &lt;li&gt;The hash I should look for in case I notice some discrepancies between what I’m seeing and the deployment&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To this I added a final step to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;deploy-staging&lt;/code&gt; job with the following code:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;

  &lt;span class=&quot;na&quot;&gt;deploy-staging&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;

      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Comment staging URL on PR&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;actions/github-script@v7&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;|&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;const sha = &apos;$&apos;.substring(0, 7);&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;const marker = &apos;&amp;lt;!-- staging-deploy --&amp;gt;&apos;;&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;const body = `${marker}\n🚀 **Staging deploy complete**\n\nPreview: $\n\nCommit: \`${sha}\``;&lt;/span&gt;
            
            &lt;span class=&quot;s&quot;&gt;// Find existing comment&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;const { data: comments } = await github.rest.issues.listComments({&lt;/span&gt;
              &lt;span class=&quot;s&quot;&gt;owner: context.repo.owner,&lt;/span&gt;
              &lt;span class=&quot;s&quot;&gt;repo: context.repo.repo,&lt;/span&gt;
              &lt;span class=&quot;s&quot;&gt;issue_number: context.issue.number,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;});&lt;/span&gt;
            
            &lt;span class=&quot;s&quot;&gt;const existing = comments.find(c =&amp;gt; c.body.includes(marker));&lt;/span&gt;
            
            &lt;span class=&quot;s&quot;&gt;if (existing) {&lt;/span&gt;
              &lt;span class=&quot;s&quot;&gt;await github.rest.issues.updateComment({&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;owner: context.repo.owner,&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;repo: context.repo.repo,&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;comment_id: existing.id,&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;body: body,&lt;/span&gt;
              &lt;span class=&quot;s&quot;&gt;});&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;} else {&lt;/span&gt;
              &lt;span class=&quot;s&quot;&gt;await github.rest.issues.createComment({&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;owner: context.repo.owner,&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;repo: context.repo.repo,&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;issue_number: context.issue.number,&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;body: body,&lt;/span&gt;
              &lt;span class=&quot;s&quot;&gt;});&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Since I also didn’t want every new commit to generate a new comment, I used an HTML comment to mark the message:&lt;/p&gt;

&lt;div class=&quot;language-jsx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;marker&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;!-- staging-deploy --&amp;gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Since comments render Markdown the HTML shows up in edit mode but gets hidden when displayed.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/css-caching-github-actions/02-comment-trick-for-updating.webp&quot; alt=&quot;GitHub Actions comment showing staging deployment URL and commit SHA&quot; class=&quot;img-post&quot; style=&quot;max-width: 80%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And this is what that looks like as the final step of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;deploy-staging&lt;/code&gt; is completed:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/css-caching-github-actions/03-comment-from-github-actions.webp&quot; alt=&quot;Staging deployment comment on pull request with deployment link and version SHA&quot; class=&quot;img-post&quot; style=&quot;max-width: 90%;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;trade-offs-of-this-approach&quot;&gt;Trade-offs of this approach&lt;/h2&gt;

&lt;p&gt;This gave me full control over which pull request is staged and my staging represents “currently under review” making it easier for me to even QA the changes myself.&lt;/p&gt;

&lt;p&gt;The only downside from this approach is that I can’t have multiple ephemeral per-pull-request environments since I can only make one PR deployment at a time but that works well for my development workflow.&lt;/p&gt;

&lt;p&gt;The goal is clarity and control, not maximum automation.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Versioned static assets and label-gated deploys solved my staging cache problem. Now CSS files get a git SHA in the URL, GitHub Actions handles deployments when I apply the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;preview&lt;/code&gt; label, and I always know which version is live. No cache invalidation needed.&lt;/p&gt;
</description>
        <pubDate>Tue, 03 Feb 2026 06:00:00 +0000</pubDate>
        <link>https://jtemporal.com/automating-css-versioning-and-staging-through-github-actions/</link>
        <guid isPermaLink="true">https://jtemporal.com/automating-css-versioning-and-staging-through-github-actions/</guid>
        
        <category>github actions</category>
        
        <category>git</category>
        
        <category>deployments</category>
        
        <category>css caching invalidation</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        
      </item>
    
      <item>
        <title>AI-powered software development flow: Lessons from shipping My Yarn Stash</title>
        <description>&lt;p&gt;When I started building &lt;a href=&quot;https://myyarnstash.app&quot;&gt;&lt;strong&gt;My Yarn Stash&lt;/strong&gt;&lt;/a&gt;, I wasn’t trying to prove AI could build an app for me.&lt;/p&gt;

&lt;p&gt;I wanted to answer a practical question:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What actually changes when you treat AI tools as long-term collaborators across planning, implementation, and design?&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p&gt;Not with demos or toy examples, but with a real product that has users, persistent data, billing, authentication, and migrations—all the unglamorous constraints that come with shipping software meant to stick around.&lt;/p&gt;

&lt;p&gt;What follows is a breakdown of how AI fit into each phase, where it helped, where it failed, and what I learned or was reminded about tool boundaries by building something real.&lt;/p&gt;

&lt;h2 id=&quot;the-day-the-ai-deleted-my-database&quot;&gt;The day the AI deleted my database&lt;/h2&gt;

&lt;p&gt;Early in the project, I asked a coding agent to help with a schema change. It confidently suggested:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;rm &lt;/span&gt;yarn.db
&lt;span class=&quot;c&quot;&gt;# Then recreate with new schema&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And I let it.&lt;/p&gt;

&lt;p&gt;Gone. All the test data I’d been building up. Hours of manual entry to stress-test edge cases. Deleted in a single command because the AI treated the database like a throwaway artifact.&lt;/p&gt;

&lt;p&gt;The AI didn’t behave incorrectly. It did exactly what made sense if you assume databases are ephemeral. The problem was that &lt;strong&gt;I&lt;/strong&gt; hadn’t established guardrails.&lt;/p&gt;

&lt;p&gt;That moment reminded me to both pay more attention and adjust how I collaborated with AI tools. I needed to be very clear about constraints.&lt;/p&gt;

&lt;p&gt;Later I added rules to my copilot instructions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;NEVER delete database files&lt;/li&gt;
  &lt;li&gt;ALWAYS run migrations instead&lt;/li&gt;
  &lt;li&gt;Before any destructive operation, run backups first&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And went on to recreate my database. The AI didn’t change its behaviour. I changed mine.&lt;/p&gt;

&lt;p&gt;This became the pattern for the entire project: &lt;strong&gt;AI amplified my clarity and punished my ambiguity and lack of attention.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The database deletion reminded me of something fundamental: vague instructions produce unpredictable results. That lesson shaped how I approached every other phase of this project moving forward.&lt;/p&gt;

&lt;h2 id=&quot;separate-conversations-separate-contexts&quot;&gt;Separate conversations, separate contexts&lt;/h2&gt;

&lt;p&gt;After the database incident, I knew I needed better constraint management. That started with how I structured conversations.&lt;/p&gt;

&lt;p&gt;I treated ChatGPT like a colleague I’d grab for specific discussions.&lt;/p&gt;

&lt;p&gt;Each feature got its own conversation thread:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;One for billing and entitlements&lt;/li&gt;
  &lt;li&gt;One for the AI extraction flow&lt;/li&gt;
  &lt;li&gt;One for soft-delete patterns&lt;/li&gt;
  &lt;li&gt;One for launch strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This wasn’t about organization. It was about &lt;strong&gt;context management&lt;/strong&gt;.&lt;/p&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
graph TB
    %% Styles
    classDef orange fill:#FEF3E6,stroke:#F59E0B,stroke-width:2px,color:#7C2D12;
    classDef blue fill:#E8EEF6,stroke:#3C87C9,stroke-width:2px,color:#0f172a;
    classDef green fill:#E6F4F1,stroke:#00B478,stroke-width:2px,color:#064E3B;
    classDef purple fill:#ECE7F8,stroke:#9C8AD9,stroke-width:2px,color:#0f172a;
    classDef note fill:#F3F4F6,stroke:#6B7280,stroke-dasharray: 5 5,color:#111827;

    %% Central collaborator
    AI[ChatGPT&lt;br /&gt;as collaborator]:::purple

    %% Separate conversations
    Billing[Billing &amp;amp; entitlements&lt;br /&gt;conversation]:::blue
    Extraction[AI extraction flow&lt;br /&gt;conversation]:::blue
    SoftDelete[Soft-delete patterns&lt;br /&gt;conversation]:::blue
    Launch[Launch strategy&lt;br /&gt;conversation]:::blue

    %% Separate outputs
    BillingOut[billing.md]:::green
    ExtractionOut[extraction.md]:::green
    SoftDeleteOut[soft-delete.md]:::green
    LaunchOut[launch.md]:::green

    %% Connections (no cross-links!)
    AI --&amp;gt; Billing
    AI --&amp;gt; Extraction
    AI --&amp;gt; SoftDelete
    AI --&amp;gt; Launch

    Billing --&amp;gt; BillingOut
    Extraction --&amp;gt; ExtractionOut
    SoftDelete --&amp;gt; SoftDeleteOut
    Launch --&amp;gt; LaunchOut

    %% Note
    Note[Each conversation has a single purpose and is bounded context]:::note
    Note -.-&amp;gt; AI
&lt;/pre&gt;

&lt;p&gt;When everything lives in one chat, the AI starts to get slow and confused, that’s when constant “summarizing history” increase time to answers, so as an engineer leveraging AI, you have to dutifully manage the context window. A billing conversation shouldn’t bleed into UI discussions. Implementation details shouldn’t pollute planning threads.&lt;/p&gt;

&lt;p&gt;Separate chats forced clarity. Each conversation had a single purpose, which made it easier to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Stay focused on one problem&lt;/li&gt;
  &lt;li&gt;Evaluate outputs against specific goals&lt;/li&gt;
  &lt;li&gt;Make decisions without noise&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;what-those-conversations-actually-looked-like&quot;&gt;What those conversations actually looked like&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Branding: From vague to concrete&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I started with “I want it to feel cozy and calm.” Through discussion, we identified edge cases I hadn’t considered:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Text baked into images would need rework every time pricing changed&lt;/li&gt;
  &lt;li&gt;Realistic imagery would read as generic stock photos&lt;/li&gt;
  &lt;li&gt;“Organizing” visuals imply judgment. Better to frame as “inventory tracking”&lt;/li&gt;
  &lt;li&gt;Gradients applied inconsistently would create visual noise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The conversation forced specificity. By the end, I had constraints like “no text in images” and “single vertical gradient system” that my coding agent could implement reliably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Account page: Surfacing failure modes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When planning the account page, ChatGPT helped identify non-obvious problems:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Timezone drift&lt;/strong&gt;: Automatically updating timezone when users travel would silently change project dates. Solution: only update on explicit user action.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Empty state guilt&lt;/strong&gt;: Showing “0 finished projects” or prompting users to “finish your first project” creates pressure. Solution: gentle empty state with no call to action.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These weren’t implementation details. They were experience risks that would erode trust if missed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Launch strategy: Reframing the goal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I initially thought about launch as a visibility event: where to post, how to announce.&lt;/p&gt;

&lt;p&gt;The discussion reframed it as a &lt;strong&gt;state change&lt;/strong&gt;: from “only I use this” to “other people can use this safely.”&lt;/p&gt;

&lt;p&gt;That shifted focus from:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“How many people see this?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“What breaks when the first real users arrive?”&lt;/li&gt;
  &lt;li&gt;“Is this experience internally consistent?”&lt;/li&gt;
  &lt;li&gt;“Where can people get confused or succeed quickly?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I deprioritized announcements and spent more time on onboarding clarity instead.&lt;/p&gt;

&lt;p&gt;Every useful insight got distilled into markdown. Feature specs, constraints, architectural decisions: all rewritten in my own words with the help of ChatGPT, structured for clarity, stored alongside the code.&lt;/p&gt;

&lt;p&gt;This forced two things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;I had to actually understand the decision&lt;/li&gt;
  &lt;li&gt;The output became durable and reviewable&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;stack-decisions-what-i-chose-vs-what-i-asked-about&quot;&gt;Stack decisions: What I chose vs. what I asked about&lt;/h2&gt;

&lt;p&gt;With clear conversation boundaries established, I could make better stack decisions. I came into the project with strong opinions about some parts of the stack and no opinion at all about others.&lt;/p&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
graph TB
    %% Styles
    classDef orange fill:#FEF3E6,stroke:#F59E0B,stroke-width:2px,color:#7C2D12;
    classDef blue fill:#E8EEF6,stroke:#3C87C9,stroke-width:2px,color:#0f172a;
    classDef green fill:#E6F4F1,stroke:#00B478,stroke-width:2px,color:#064E3B;
    classDef purple fill:#ECE7F8,stroke:#9C8AD9,stroke-width:2px,color:#0f172a;

    %% end
    subgraph ME [&quot;Stack I chose&quot;]
            Auth0[Auth0 for auth]:::blue
            FastAPI[FastAPI]:::blue
            Supabase[Supabase for database + storage]:::blue
            Frontend[Vanilla JavaScript and CSS]:::blue
            Emails[Resend]:::blue
            AIproviders[Replicate]:::blue
        end

        %% Subgraph: What AI helped evaluate
        subgraph AI [&quot;AI evaluated&quot;]
            Payments[Payment gateway]:::orange
            Deploy[Deployment platform]:::orange
        end
    %% Relationship between the two
    ME:::green
    AI:::purple
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;What I decided before asking AI:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Auth0&lt;/strong&gt; for authentication (familiar, reliable, scalable)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;FastAPI&lt;/strong&gt; as the web framework (Python, async, good docs, also familiar and with great Auth0 support)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Supabase&lt;/strong&gt; for database and storage (Postgres with good tooling and prod database at 0 cost)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vanilla JavaScript&lt;/strong&gt; and &lt;strong&gt;handwritten CSS&lt;/strong&gt; to start instead of a framework (less abstraction, easier to reason about with AI and for me to follow along)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Resend for emailing users:&lt;/strong&gt; a welcome email for the users and another to notify myself when new user signed up&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Replicate:&lt;/strong&gt; to provide AI features like the label extraction information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These choices weren’t about AI compatibility. They were about reducing cognitive load and keeping a codebase I could jump in without the help of AI if needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I asked AI to help evaluate:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Payment gateway&lt;/strong&gt;: I had no strong opinion. We discussed options and landed on &lt;strong&gt;Polar&lt;/strong&gt; for simplicity and developer experience.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Deployment platform&lt;/strong&gt;: I wanted something low-cost that I already understood. Heroku fit both criteria.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pattern here matters: I brought constraints and context to the conversation instead of asking “what should I use?” in a vacuum.&lt;/p&gt;

&lt;p&gt;AI didn’t tell me what to build with. It helped me think through trade-offs for the decisions I hadn’t made yet.&lt;/p&gt;

&lt;h2 id=&quot;learning-which-model-does-what-well&quot;&gt;Learning which model does what well&lt;/h2&gt;

&lt;p&gt;Stack decisions settled, the next challenge was figuring out which AI tool to use when. Understanding model strengths came from repeated experience across different contexts.&lt;/p&gt;

&lt;p&gt;I didn’t use one AI tool for everything. That was deliberate. Through building, I found a flow that worked for me:&lt;/p&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
flowchart TB
    %% Styles (modern, readable, low contrast)
    classDef blue fill:#E8EEF6,stroke:#3C87C9,stroke-width:2px,color:#0f172a;
    classDef decision fill:#F3F4F6,stroke:#6B7280,stroke-width:2px,color:#111827;
    classDef simple fill:#E6F4F1,stroke:#00B478,stroke-width:2px,color:#064E3B;
    classDef complex fill:#FEF3E6,stroke:#F59E0B,stroke-width:2px,color:#7C2D12;
    style one fill:#E8E8E8,stroke:#CCCCCC,stroke-width:2px;
    style two fill:#E8E8E8,stroke:#CCCCCC,stroke-width:2px;

    %% Nodes
    A[Chat with ChatGPT:&lt;br /&gt;Map out the work&lt;br /&gt;and generate markdown]:::blue
    B[Commit markdown&lt;br /&gt;in GitHub Mobile app]:::blue

    D[Open GitHub issue&lt;br /&gt;Assign Copilot]:::simple
    H{PR stuck?}:::decision
    I[Download branch locally&lt;br /&gt;and unblock with Opus&lt;br /&gt;in Agent mode]:::simple

    F[Review markdown &lt;br /&gt;locally&lt;br /&gt;with Haiku &lt;br /&gt;in Plan mode]:::complex
    G[Implement with Opus&lt;br /&gt;in Agent mode]:::complex

    E[Review and &lt;br /&gt;merge PRs]:::blue


    EE[No]:::decision
    II[Yes]:::decision

    subgraph one [&quot;`For simple tasks`&quot;]
        direction TB
        D --&amp;gt; H
        H --&amp;gt; EE
        H --&amp;gt; II --&amp;gt; I
        %% Z@{ shape: brace-l, label: &quot;identifies the tool to use,&lt;br /&gt;packages user query in&lt;br /&gt;the format the server&lt;br /&gt;understands&quot;}
    end

    subgraph two [&quot;`For complex tasks`&quot;]
        direction TB
        F --&amp;gt; G
    end
    %% Flow
    A --&amp;gt; B
    B --&amp;gt; one
    B --&amp;gt; two
    G --&amp;gt; E
    EE --&amp;gt; E
    I --&amp;gt; E
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT for planning and exploration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most planning conversations happened in ChatGPT in the mobile app. I used it on my phone during downtime to think through features, identify edge cases, and explore design decisions before writing any code.&lt;/p&gt;

&lt;p&gt;The mobile accessibility mattered. I could sketch out billing logic while having my coffee in the morning or map out future features during a commute. By the time I grabbed my computer to code, I’d already worked through the conceptual problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Copilot Agents for straightforward work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Well-defined low-complexity features and bugs went to GitHub issues and I would let Copilot handle implementation through PRs asynchronously by assigning Copilot to a given issue. It freed me up to work on more-complex and high value things while Copilot handled the implementation of the “no-brainer” tasks.&lt;/p&gt;

&lt;p&gt;When agents got stuck online, I’d download the code and ask Claude Opus to step in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VS Code Copilot for local development&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I used VS Code with Copilot in different modes and with models depending on the work:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Claude Haiku:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Mostly in Plan mode;&lt;/li&gt;
  &lt;li&gt;Quick iterations when following up on features locally;&lt;/li&gt;
  &lt;li&gt;Good for refactoring and adjusting implementation details that didn’t require more scope other than one file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Claude Opus:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Mostly in Agent mode;&lt;/li&gt;
  &lt;li&gt;Complex situations with many moving pieces&lt;/li&gt;
  &lt;li&gt;Used when precision and accuracy mattered more than speed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No matter the model though, they were always constrained by explicit conventions in &lt;a href=&quot;http://copilot-instructions.md&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;copilot-instructions.md&lt;/code&gt;&lt;/a&gt;. The lesson wasn’t “use the best model.” It was knowing not only &lt;strong&gt;when to switch&lt;/strong&gt; models and modes but also &lt;strong&gt;why switching&lt;/strong&gt; should happen.&lt;/p&gt;

&lt;p&gt;That judgment is a skill. AI tools don’t remove it.&lt;/p&gt;

&lt;p&gt;The database deletion happened because I let my guard down. I got comfortable with AI-assisted coding and stopped questioning the suggestions. It was a good reminder that different contexts need different constraints. By this phase of the project, I’d learned to match tool capabilities to task requirements.&lt;/p&gt;

&lt;h2 id=&quot;functional-first-pretty-later-because-im-not-a-designer&quot;&gt;Functional first, pretty later (because I’m not a designer)&lt;/h2&gt;

&lt;p&gt;With implementation flowing more smoothly, I turned to design. This required a different kind of clarity.&lt;/p&gt;

&lt;p&gt;I deliberately delayed visual design work. Not because of anything AI-related, but because &lt;strong&gt;CSS and JavaScript are not my strong suit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I focused on making things functional first: flows, data models, interactions. Once those settled, I could tackle design from a more stable foundation. It didn’t look ugly but it clearly wasn’t beautiful:&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/UulQpVyeEMs?si=H_U2hXDIpeTHtwo-&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;My first exploration with &lt;a href=&quot;https://stitch.withgoogle.com&quot;&gt;Stitch&lt;/a&gt;, Google’s Gemini-based tool that transforms text descriptions into UI designs, showed me how powerful it was. I dropped the link of the working app and asked for a redesign. It made something pretty, but it didn’t look like &lt;em&gt;my&lt;/em&gt; product.&lt;/p&gt;

&lt;p&gt;So I used ChatGPT to put together the branding guidelines: tone, colour direction, what feelings I wanted the UI to convey. Once I had that document written down, I went back to Stitch with:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Screenshots of the functional app&lt;/li&gt;
  &lt;li&gt;The branding document&lt;/li&gt;
  &lt;li&gt;Specific constraints like “redesign this following the brand guidelines”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result you see below:&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/VHyfaJH969o?si=Mf0jGLxjQbp02ngQ&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;That combination worked. The design felt right because I’d done the thinking first. And did I mention it now supports dark mode as well?&lt;/p&gt;

&lt;p&gt;The lesson: &lt;strong&gt;Tools work better when you’ve already established intent.&lt;/strong&gt; Just like the database needed constraints, design tools needed direction.&lt;/p&gt;

&lt;h2 id=&quot;what-this-experience-taught-me-about-building-with-ai&quot;&gt;What this experience taught me about building with AI&lt;/h2&gt;

&lt;p&gt;Going through all these steps I noticed a few patterns that go beyond individual tool choices. These are a few things I’m carrying forward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. AI doesn’t replace judgment. It makes judgment more important&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The database deletion wasn’t an AI failure. It was a clarity failure. Once I added explicit constraints, the tools became more reliable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Context boundaries matter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Separate conversations for separate concerns reduced drift and forced focus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Model switching is a learned skill&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Understanding when to use a lightweight model versus a heavy one came from repeated friction, not documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Design still requires taste&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI can accelerate iteration, but you need to know what you’re aiming for. “Make it pretty” produces generic results. “Make it feel cozy and trustworthy” with examples gives you something to evaluate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Shipping something real teaches more than demos ever could&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most AI tool examples live in a world where you can always start over. Production software doesn’t. That constraint forced honesty about where AI helps and where it doesn’t.&lt;/p&gt;

&lt;h2 id=&quot;what-this-means-for-learning-ai-tools&quot;&gt;What this means for learning AI tools&lt;/h2&gt;

&lt;p&gt;I always believed developers do better when they learn the limitations of the tools they use when building software. Specially since development is no-longer my day job, this project became an outlet for experiment and trying new tools and it helped shape how I evaluate and talk about AI tools.&lt;/p&gt;

&lt;p&gt;Demos have their place in my world, but nothing beats the actual experience of building something and learn by doing.&lt;/p&gt;

&lt;p&gt;Building My Yarn Stash gave me a even clearer sense of where AI accelerates work and where it introduces risk. Not from reading about it, but from hitting the boundaries myself.&lt;/p&gt;

&lt;p&gt;If you’re trying to find your footing with AI tools: &lt;strong&gt;build something real.&lt;/strong&gt; Solve a problem you face often, try the new tools and find the flow that works for you.&lt;/p&gt;

&lt;p&gt;Step away for a moment from the tutorials and courses and build your own project free of the constraints instructors purposely impose in order to teach and give students a good experience. Something with users, data you can’t lose, and decisions that compound over time.&lt;/p&gt;

&lt;p&gt;You’ll learn more from one broken migration than from a hundred perfect prompts.&lt;/p&gt;
</description>
        <pubDate>Tue, 03 Feb 2026 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/ai-powered-development-workflow/</link>
        <guid isPermaLink="true">https://jtemporal.com/ai-powered-development-workflow/</guid>
        
        <category>ai</category>
        
        <category>software development</category>
        
        <category>chatgpt</category>
        
        <category>github copilot</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Field Notes: Hacktoberfest 2025, Week 5</title>
        <description>&lt;p&gt;After GitHub Universe, recovering from a nasty cold, and a lot of work, I know I’m a bit late but here it goes: Final week of Hacktoberfest 2025 report!&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;After the “&lt;em&gt;big slow down&lt;/em&gt;”, we actually saw some more engagement by the community with 5 pull requests in Hacktoberfest’s last week:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;5 PRs by the community
    &lt;ul&gt;
      &lt;li&gt;3 merged&lt;/li&gt;
      &lt;li&gt;2 open&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I, on the other hand, got Copilot to work on a few issues 👀: 35 pull requests by AI, all merged. This meant great progress was made and that huge bump in the last days of October in the burn up chart below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1762522080/images/hacktoberfest-2025-w5/burnup-week-5_p1nu1f.png&quot; alt=&quot;Burnup chart showing GitFichas progress for week 5&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The gap between closed and open issues is still there. I still plan to finish migrating the hand-drawn cards to mermaid before the end of the year but I also want to reach the 100 cards published number, let’s see how it goes.&lt;/p&gt;

&lt;p&gt;Here’s the distribution of pull requests worked on in the last week of Hacktoberfest:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1762522080/images/hacktoberfest-2025-w5/hacktoberfest-pull-request-type-distribution-w5_vedo5g.png&quot; alt=&quot;Bar chart showing pull request type distribution for week 5 of Hacktoberfest 2025&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Looking at the pull requests for the whole month of October, you can see that shift between a lot of translation pull requests in the beginning of the month to more migrations at the end of October in the chart below:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1762522081/images/hacktoberfest-2025-w5/weekly-distribution-of-pull-requests_ygjr1u.png&quot; alt=&quot;Line chart showing weekly distribution of pull requests throughout October 2025&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As far as issues go, the distribution is similar. Some PRs closed more than one issue and some PRs had no issues attached to them, so the numbers vary a bit between merged PRs and closed issues, but the distribution is similar on both:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1762522080/images/hacktoberfest-2025-w5/weekly-distribution-of-closed-issues_wxvbn8.png&quot; alt=&quot;Line chart showing weekly distribution of closed issues throughout October 2025&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;other-projects&quot;&gt;Other projects&lt;/h2&gt;

&lt;p&gt;I went back to those PRs I left hanging and worked on them. And now I’m off to work on other stuff, especially some content I want to work on through the end of this year beginning of next one.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;With this report we close a successful Hacktoberfest 2025. I was not expecting so many people interested in contributing to GitFichas, and I was very happy to review every pull request that came through.&lt;/p&gt;

&lt;p&gt;I hope the folks contributing also had an amazing time as I did.&lt;/p&gt;

&lt;p&gt;Happy hacking and see you next year 🎃&lt;/p&gt;
</description>
        <pubDate>Sat, 15 Nov 2025 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest-2025-week-5/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest-2025-week-5/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        
      </item>
    
      <item>
        <title>Hacktoberfest 2025: Diário de Campo, Semana 5</title>
        <description>&lt;p&gt;Depois do GitHub Universe, de me recuperar de uma gripe horrível, e de muito trabalho, eu sei que estou meio atrasada mas aqui vai: relatório da última semana da Hacktoberfest 2025!&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;Depois da “&lt;em&gt;grande desaceleração&lt;/em&gt;”, a comunidade voltou a se engajar mais com 5 pull requests na última semana da Hacktoberfest:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;5 PRs da comunidade
    &lt;ul&gt;
      &lt;li&gt;3 mergeados&lt;/li&gt;
      &lt;li&gt;2 abertos&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Já eu, consegui colocar o Copilot pra trabalhar em algumas issues 👀: 35 pull requests feitos por IA, todos mergeados. Isso resultou num progresso incrível e naquele grande pico no final de outubro que você vê no gráfico burnup abaixo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1762522080/images/hacktoberfest-2025-w5/burnup-week-5_p1nu1f.png&quot; alt=&quot;Gráfico burnup mostrando o progresso do GitFichas para a semana 5&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A diferença entre issues fechadas e abertas ainda continua lá. Minha meta ainda é terminar de migrar as fichas desenhadas à mão para mermaid antes do final do ano, mas também quero chegar nas 100 fichas publicadas, vamos ver o que vai dar.&lt;/p&gt;

&lt;p&gt;Assim ficou a distribuição dos pull requests na última semana da Hacktoberfest:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1762522080/images/hacktoberfest-2025-w5/hacktoberfest-pull-request-type-distribution-w5_vedo5g.png&quot; alt=&quot;Gráfico de barras mostrando a distribuição de tipos de pull request para a semana 5 da Hacktoberfest 2025&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Olhando pro mês de outubro como um todo, dá pra ver bem aquela mudança de foco: no começo do mês rolaram muitos pull requests de tradução, e no final foram mais migrações, como mostra o gráfico abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1762522081/images/hacktoberfest-2025-w5/weekly-distribution-of-pull-requests_ygjr1u.png&quot; alt=&quot;Gráfico de linha mostrando a distribuição semanal de pull requests ao longo de outubro de 2025&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Sobre as issues, o padrão é parecido. Alguns PRs resolveram várias issues de uma vez e outros não estavam associados a nenhuma issue específica, então os números ficaram um pouco diferentes entre PRs mergeados e issues fechadas, mas a tendência geral é a mesma:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1762522080/images/hacktoberfest-2025-w5/weekly-distribution-of-closed-issues_wxvbn8.png&quot; alt=&quot;Gráfico de linha mostrando a distribuição semanal de issues fechadas ao longo de outubro de 2025&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;outros-projetos&quot;&gt;Outros projetos&lt;/h2&gt;

&lt;p&gt;Voltei naqueles PRs que tinha deixado pra lá e consegui finalizar eles. Agora vou focar em outras coisas, principalmente uns conteúdos que quero terminar durante o final desse ano e começo do ano novo.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;E com esse relatório a gente encerra uma Hacktoberfest 2025 na minha opinião super bem-sucedida. Não imaginava que tanta gente ia se interessar em contribuir pro GitFichas, e adorei revisar cada pull request que apareceu por lá.&lt;/p&gt;

&lt;p&gt;Espero que quem contribuiu também tenha curtido esse momento tanto quanto eu.&lt;/p&gt;

&lt;p&gt;Espero te ver ano que vem para Hacktoberfest 2026 🎃&lt;/p&gt;
</description>
        <pubDate>Sat, 15 Nov 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest-2025-semana-5/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest-2025-semana-5/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        
      </item>
    
      <item>
        <title>Field Notes: Hacktoberfest 2025, Week 4</title>
        <description>&lt;p&gt;We are so close to the end of Hacktoberfest I can almost smell it. With one week left to go let’s take a look into how last week went.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;After the “&lt;em&gt;big slow down&lt;/em&gt;”, this week continued the trend of lower amount of pull requests received with only 8 pull requests for last week:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;8 PRs by the community
    &lt;ul&gt;
      &lt;li&gt;7 merged&lt;/li&gt;
      &lt;li&gt;1 closed&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn’t make any pull requests to GitFichas as I was working on a big pull request for work I’ll love to share on next week’s report.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/no-prs-open.webp&quot; alt=&quot;GitFichas repository showing no open pull requests&quot; class=&quot;img-post&quot; style=&quot;max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On other news, this weekend was the first time that GitFichas had no PRs open since the beginning of Hacktoberfest and to be honest this worked out great for me as I was spending most of my Saturday preparing to travel to GitHub Universe.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/burnup-week-4.webp&quot; alt=&quot;Burnup chart showing GitFichas progress for week 4&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The gap between closed and open issues is still there, from my side, since my plan is to finish migrating the hand-drawn cards to mermaid before the end of the year, I plan to start tackling some of the open migration issues with the help of Copilot:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/385&quot;&gt;Migrate all English 🇺🇸 cards to Mermaid&lt;/a&gt;: 27 issues to go&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/65&quot;&gt;Migrate all Portuguese 🇧🇷 cards to mermaid&lt;/a&gt;: 36 issues to go&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;contributor-badges&quot;&gt;Contributor Badges&lt;/h2&gt;

&lt;p&gt;Hacktoberfest is not over yet! You can still make your contributions and earn at least the 4 of the 6 badge levels:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;level 0 is for registering to Hacktoberfest&lt;/li&gt;
  &lt;li&gt;levels 1 through 4 are for making the 4 pull requests while contributing to open source&lt;/li&gt;
  &lt;li&gt;level 5 is the supercontributor badge you get while completing 6 pull requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/lvl0-human.webp&quot; alt=&quot;Hacktoberfest Level 0 badge&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/hacktoberfest2025/userbadge/cmfugxuyz0001l104bsvhumlx&quot;&gt;Level 0&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/lvl1-human.webp&quot; alt=&quot;Hacktoberfest Level 1 badge&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/hacktoberfest2025/userbadge/cmgjivt9x004wjv04tj9hiamp&quot;&gt;Level 1&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/lvl2-human.webp&quot; alt=&quot;Hacktoberfest Level 2 badge&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/hacktoberfest2025/userbadge/cmgjo5qd00047ld0487evw3y2&quot;&gt;Level 2&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/lvl3-human.webp&quot; alt=&quot;Hacktoberfest Level 3 badge&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/hacktoberfest2025/userbadge/cmgjtgwh800gbjo04fzjw6zev&quot;&gt;Level 3&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/lvl4-human.webp&quot; alt=&quot;Hacktoberfest Level 4 badge&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/hacktoberfest2025/userbadge/cmgjth6e9003wjr048lfiogn8&quot;&gt;Level 4&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/lvl5-human.webp&quot; alt=&quot;Hacktoberfest Supercontributor badge&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/hacktoberfest2025/userbadge/cmgjthekm004ol204irxkgqp6&quot;&gt;Supercontributor&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;I also got the &lt;strong&gt;Plant a tree&lt;/strong&gt; and &lt;strong&gt;1 Badge Club&lt;/strong&gt;, the first is for the tree planted when you get the shirt for completing 6 PRs, and the second is for anyone that has gotten a Hacktoberfest badge since 2022:&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/plantatree.webp&quot; alt=&quot;Hacktoberfest Plant a tree badge&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/userbadge/cmgjtujb20075jr04ik32pbcn&quot;&gt;Plant a tree&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/1-badge.webp&quot; alt=&quot;Hacktoberfest 1 Badge Club badge&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/userbadge/cmgzybiwe01pnl204bktxtxdt&quot;&gt;1 Badge Club&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;p&gt;I know this was a short one but that’s a wrap for week 4! See you soon for the final report on Hacktoberfest 2025. 🎃&lt;/p&gt;
</description>
        <pubDate>Sun, 26 Oct 2025 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest-2025-week-4/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest-2025-week-4/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        
      </item>
    
      <item>
        <title>Hacktoberfest 2025: Diário de Campo, Semana 4</title>
        <description>&lt;p&gt;Estamos tão perto do final da Hacktoberfest que já dá pra sentir o cheiro. Com menos de uma semana para o fim da Hacktoberfest, vamos dar uma olhada em como foi a semana passada.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;Após a “&lt;em&gt;grande desaceleração&lt;/em&gt;”, essa semana continuou a tendência com uma menor quantidade de pull requests recebidos: apenas 8 pull requests foram recebidos nessa semana que passou.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;8 PRs da comunidade:
    &lt;ul&gt;
      &lt;li&gt;7 mergeados&lt;/li&gt;
      &lt;li&gt;1 fechado&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eu não fiz nenhum pull request para o GitFichas pois estava trabalhando num pull request gigante para o trabalho que pretendo compartilhar mais sobre em breve.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/no-prs-open.webp&quot; alt=&quot;Repositório GitFichas mostrando nenhum pull request aberto&quot; class=&quot;img-post&quot; style=&quot;max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Por outro lado, este final de semana foi a primeira vez que o GitFichas não teve PRs abertos desde o começo da Hacktoberfest e para ser honesta, pra mim isso funcionou super bem, já que eu passei a maior parte do meu sábado me preparando para viajar para o GitHub Universe.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/burnup-week-4.webp&quot; alt=&quot;Gráfico burnup mostrando o progresso do GitFichas para a semana 4&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A lacuna entre issues fechadas e abertas ainda está lá, mas meu plano é terminar de migrar as fichas desenhadas à mão para mermaid antes do final do ano. Vou focar em algumas das issues de migração abertas com a ajuda do Copilot:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/385&quot;&gt;Migrar todos as fichas em inglês 🇺🇸 para Mermaid&lt;/a&gt;: 27 issues restantes&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/65&quot;&gt;Migrar todos as fichas em português 🇧🇷 para mermaid&lt;/a&gt;: 36 issues restantes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;medalhas-de-contribuição&quot;&gt;Medalhas de contribuição&lt;/h2&gt;

&lt;p&gt;Vale salientar que a Hacktoberfest ainda não acabou! Você ainda pode fazer suas contribuições e conquistar 4 dos 6 níveis de medalhas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;nível 0 é por se registrar no Hacktoberfest&lt;/li&gt;
  &lt;li&gt;níveis 1 a 4 são para fazer os 4 pull requests contribuindo para open source&lt;/li&gt;
  &lt;li&gt;nível 5 é a medalha para pessoas supercontribuidoras que você ganha ao completar 6 pull requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/lvl0-human.webp&quot; alt=&quot;Badge Hacktoberfest Nível 0&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/hacktoberfest2025/userbadge/cmfugxuyz0001l104bsvhumlx&quot;&gt;Nível 0&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/lvl1-human.webp&quot; alt=&quot;Badge Hacktoberfest Nível 1&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/hacktoberfest2025/userbadge/cmgjivt9x004wjv04tj9hiamp&quot;&gt;Nível 1&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/lvl2-human.webp&quot; alt=&quot;Badge Hacktoberfest Nível 2&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/hacktoberfest2025/userbadge/cmgjo5qd00047ld0487evw3y2&quot;&gt;Nível 2&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/lvl3-human.webp&quot; alt=&quot;Badge Hacktoberfest Nível 3&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/hacktoberfest2025/userbadge/cmgjtgwh800gbjo04fzjw6zev&quot;&gt;Nível 3&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/lvl4-human.webp&quot; alt=&quot;Badge Hacktoberfest Nível 4&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/hacktoberfest2025/userbadge/cmgjth6e9003wjr048lfiogn8&quot;&gt;Nível 4&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/lvl5-human.webp&quot; alt=&quot;Badge Hacktoberfest Supercontribuidor&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/hacktoberfest2025/userbadge/cmgjthekm004ol204irxkgqp6&quot;&gt;Supercontribuidor&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Também consegui as medalhas &lt;strong&gt;Plant a tree&lt;/strong&gt; e &lt;strong&gt;1 Badge Club&lt;/strong&gt;, a primeira é pela árvore plantada quando você ganha a camiseta por completar 6 PRs, e a segunda é para qualquer pessoa que já tenha conseguido uma medalha Hacktoberfest desde 2022:&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/plantatree.webp&quot; alt=&quot;Badge Hacktoberfest Plant a tree&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/userbadge/cmgjtujb20075jr04ik32pbcn&quot;&gt;Plant a tree&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w4/1-badge.webp&quot; alt=&quot;Badge Hacktoberfest 1 Badge Club&quot; /&gt; &lt;br /&gt;&lt;a href=&quot;https://www.holopin.io/userbadge/cmgzybiwe01pnl204bktxtxdt&quot;&gt;1 Badge Club&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;p&gt;Esse foi um relatório menorzinho que os dois ultimos, mas por hoje é só! Te vejo em breve para o relatório final do Hacktoberfest 2025. 🎃&lt;/p&gt;
</description>
        <pubDate>Sun, 26 Oct 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest-2025-semana-4/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest-2025-semana-4/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        
      </item>
    
      <item>
        <title>Field Notes: Hacktoberfest 2025, Week 3</title>
        <description>&lt;p&gt;We crossed over the halfway point of Hacktoberfest 2025 and here is what happened in my little corner of the open source world. In this series we overview some stats for contributions I received and made over this month. This week, like the last, I mostly focused on GitFichas due to limited availability, but I also implemented some new features on my blog so let’s go into the contributions.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;Like always, third week of Hacktoberfest symbolizes the big “&lt;em&gt;slow down&lt;/em&gt;”, where the volume from contributions from the first few weeks dip after many folks complete their 4 or 6 pull requests. So after the high from last week, this week we had 30 pull requests:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;23 PRs by the community
    &lt;ul&gt;
      &lt;li&gt;17 merged&lt;/li&gt;
      &lt;li&gt;5 closed&lt;/li&gt;
      &lt;li&gt;1 open&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Interestingly enough I tried having copilot draft a PR and it actually, did a good job. I also merged 6 PRs myself which were 2 for documentation, 2 for corrections, and 2 for improvements.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_0873.webp&quot; alt=&quot;A screenshot showing GitFichas repository statistics with pull request counts and contribution metrics&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The most exciting part for the week for me at least, was that on October 15th we reached the mark of over 100 issues closed. Which marks the milestone of more issues closed than open for GitFichas. 🎉&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_0862.webp&quot; alt=&quot;GitFichas repository showing milestone of 100+ closed issues, demonstrating project progress&quot; class=&quot;img-post&quot; style=&quot;max-width: 45%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I also worked on improving descriptions for some issues that were open a long time ago.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_6050.webp&quot; alt=&quot;Screenshot of GitHub issue improvement work showing better descriptions and titles for GitFichas issues&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As far as inviting people to contributing to your project, it is fundamental that you have both good descriptions &lt;em&gt;and&lt;/em&gt; good titles since in the list of issues every contributor sees mostly the titles and tags. I did some automating to help make this easier on me and help me with maintenance tasks but I’ll write about that in a separate post later. 👀&lt;/p&gt;

&lt;p&gt;Still on the issues subject this is the burn up chart since September 1st there’s still a gap but the trend is clear: the opening of issues is slowing down, and the closing of them is bridging the gap.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_0880.webp&quot; alt=&quot;Burn up chart showing GitFichas issue trends from September 1st, with lines indicating opened vs closed issues over time&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;One final thing: &lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/418&quot;&gt;someone decided to implement a search bar on GitFichas&lt;/a&gt;, there wasn’t an issue for this but it is something I definitely thought about having on the website.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/Screenshot_2025-10-20_at_10.29.58_AM.webp&quot; alt=&quot;GitFichas website homepage showing the new search bar feature implemented by a community contributor&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A search function is not a tiny thing, especially if you don’t have a database for indexing the content. Nonetheless someone implemented it and I do believe it will help others find cards more easily! So another big win of open source! 🎉&lt;/p&gt;

&lt;h2 id=&quot;the-blog&quot;&gt;The blog&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/jtemporal/jtemporal.github.io&quot;&gt;On the blog side&lt;/a&gt;, I worked on three main things:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Series of posts&lt;/li&gt;
  &lt;li&gt;Subtitles for posts&lt;/li&gt;
  &lt;li&gt;New covers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s dive in.&lt;/p&gt;

&lt;h3 id=&quot;series-in-a-blog&quot;&gt;Series in a blog&lt;/h3&gt;

&lt;p&gt;Two weeks ago I implemented a series widget so anyone reading the posts can quickly jump to other posts in the same collection much like the “Related Articles” or “Recent Articles” widgets I already have.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_0875.webp&quot; alt=&quot;Blog post showing the new series widget that allows readers to navigate between posts in the same series&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Until Saturday it was impossible to link to a series, so I set on to fix that and create a way to link to a series so I could refer to series without linking out to an specific blog post.&lt;/p&gt;

&lt;p&gt;To get series pages, I could think of a few ways to implement the behaviour:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Separate series into collections&lt;/strong&gt;: I’ve created collections before, but in this case collections is not a great solution as it would separate the posts away from the rest of posts;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Manually create a page for each series&lt;/strong&gt;: not scalable, that would create a bunch of other files for me to maintain;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Plugins&lt;/strong&gt;: hear me out, plugins felt like the right way to go given the fact that I could write a ruby script to automatically generate pages but you can’t use custom plugins on GitHub Pages.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After some consideration, and talking to Copilot, I felt confident that writing a custom plugin was the way to go but since my blog was served through GitHub Pages I needed to find a different way to deploy the blog, and I was not about to commit the built site to GitHub.&lt;/p&gt;

&lt;p&gt;Since I already use Netlify to preview the pull requests for both the blog and GitFichas, it felt like a natural step to migrate production deployment to Netlify as well. So I’d like to inform you all ladies and gentlemen, that I graduated from serving the production site from GitHub Pages to Netlify. I feel so much like a grown up dev. 🤣&lt;/p&gt;

&lt;p&gt;With Copilot’s help I &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/354/commits/db2e1e94f49bb3a7c134c35cad37b0b40b0f2bda&quot;&gt;implemented the plugin&lt;/a&gt; and successfully migrated prod to Netlify, I’ll probably write a post on this later.&lt;/p&gt;

&lt;p&gt;Here are some of the series:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://jtemporal.com/series/git-pro-tips/&quot;&gt;Git Pro Tips&lt;/a&gt;:&lt;/strong&gt; All about Git covering: conflicts, branches, rebase, and GitHub workflows.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://jtemporal.com/series/hacktoberfest-2025-weekly/&quot;&gt;Hacktoberfest 2025 Weekly&lt;/a&gt;:&lt;/strong&gt; Weekly updates about Hacktoberfest 2025 on GitFichas and other projects.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://jtemporal.com/series/mcp-mastery/&quot;&gt;MCP Mastery&lt;/a&gt;:&lt;/strong&gt; All you need to know about Model Context Protocol (MCP).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These and all others are available &lt;a href=&quot;https://jtemporal.com/series&quot;&gt;in the series page&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;subtitles-for-posts&quot;&gt;Subtitles for posts&lt;/h3&gt;

&lt;p&gt;Another thing I always wanted to do was to have subtitles on some posts. This weekend I figured out it was time, and so after some &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/352&quot;&gt;Liquid magic and some CSS adjustments&lt;/a&gt; I’m happy to inform that I can now have posts with title and subtitles.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_0878.webp&quot; alt=&quot;Blog post layout showing the new subtitle feature implementation with title and subtitle styling&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Just in time too for my fairy tale post.&lt;/p&gt;

&lt;h3 id=&quot;new-covers&quot;&gt;New covers&lt;/h3&gt;

&lt;p&gt;If you are asking yourself “&lt;em&gt;what fairy tale post?&lt;/em&gt;” well I also started to get a bit annoyed at the fact the covers in the blog were too repetitive lately since the last 14 posts had all the same cover.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/the-writer-and-the-bot-fairy-tale/&quot;&gt;&lt;img src=&quot;/images/fairy-tale/writer-looking-at-scrolls.webp&quot; alt=&quot;Illustration of a writer looking at scrolls, representing the fairy tale blog post cover&quot; class=&quot;img-post&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So it was time to create a few more covers and put them to good use, &lt;a href=&quot;https://jtemporal.com/the-writer-and-the-bot-fairy-tale/&quot;&gt;I tell the story of it here in this other post&lt;/a&gt;, which I strongly encourage you to read because it is in the form of a fairy tale, but here’s the TL;DR: I noticed the repeated covers, &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/351&quot;&gt;opened an issue, and had copilot do the code adjustments&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;super-contributor-status&quot;&gt;Super contributor status&lt;/h2&gt;

&lt;p&gt;Finally this week I updated my Holopin profile to show off my Hacktoberfest “supercontributor” badge.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_0883.webp&quot; alt=&quot;An image of @jesstemporal&apos;s Holopin badges, which is a link to view their full Holopin profile&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And shirt is already here too!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_5971.webp&quot; alt=&quot;Hacktoberfest 2025 supercontributor shirt in light color, representing the limited edition reward for top contributors&quot; class=&quot;img-post&quot; style=&quot;max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I prefer shirts with dark colors but this one feels special, since only 10,000 will be given away and this one has GitFichas written all over it. 😊&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;That’s a wrap for week 3! See you next week for Hacktoberfest 2025 week 4 report. 👻&lt;/p&gt;
</description>
        <pubDate>Mon, 20 Oct 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest-2025-week-3/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest-2025-week-3/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        
      </item>
    
      <item>
        <title>Hacktoberfest 2025: Diário de Campo, Semana 3</title>
        <description>&lt;p&gt;Passamos da metade da Hacktoberfest 2025 e bora falar do que aconteceu por aqui no meu cantinho do mundo open source.&lt;/p&gt;

&lt;p&gt;Nessa semana, mais uma vez com tempo limitado, foquei no GitFichas mas também implementei algumas funcionalidades novas no meu blog, então bora falar de contribuições.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;Como sempre, a terceira semana do Hacktoberfest simboliza a grande “&lt;em&gt;desaceleração&lt;/em&gt;”, onde o volume de contribuições das primeiras semanas diminui já que muitas pessoas já completaram seus 4 ou 6 pull requests. Então depois do pico da semana passada, esta semana tivemos 30 pull requests:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;23 PRs da comunidade:
    &lt;ul&gt;
      &lt;li&gt;17 merged&lt;/li&gt;
      &lt;li&gt;5 fechados&lt;/li&gt;
      &lt;li&gt;1 aberto&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Curiosamente eu coloquei o Copilot escrever um PR e ele até que fez um bom trabalho. Eu também fiz merge de 6 PRs meus: 2 com documentação, 2 com correções, e 2 com melhorias.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_0873.webp&quot; alt=&quot;Uma captura de tela mostrando estatísticas do repositório GitFichas com contagens de pull request e métricas de contribuição&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A parte mais empolgante da semana para mim pelo menos, foi que no dia 15 de outubro chegamos à marca de mais de 100 issues fechadas. O que marca o momento em que temos mais issues fechadas do que abertas no GitFichas. 🎉&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_0862.webp&quot; alt=&quot;Repositório GitFichas mostrando milestone de 100+ issues fechadas, demonstrando progresso do projeto&quot; class=&quot;img-post&quot; style=&quot;max-width: 45%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Eu também trabalhei em melhorar descrições para algumas issues que estavam abertas há muito tempo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_6050.webp&quot; alt=&quot;Captura de tela do trabalho de melhoria de issues do GitHub mostrando melhores descrições e títulos para issues do GitFichas&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Falando de convidar pessoas para contribuir com o seu projeto, é fundamental que você tenha tanto boas descrições &lt;em&gt;quanto&lt;/em&gt; bons títulos, já que na lista de issues pessoas vêem principalmente os títulos e tags de cada issue.&lt;/p&gt;

&lt;p&gt;Fiz também algumas automações para identificar essas issues que precisavam de ajuste mais facilmente e outras automações para me ajudar com tarefas de manutenção, mas vou escrever sobre isso em um post separado mais pra frente. 👀&lt;/p&gt;

&lt;p&gt;Ainda no assunto das issues, aqui em baixo temos o gráfico burn up desde 1º de setembro ainda há um vão, mas a tendência é clara: a abertura de issues está desacelerando, e o fechamento delas está quase fechando o vão.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_0880.webp&quot; alt=&quot;Gráfico burn up mostrando tendências de issues do GitFichas desde 1º de setembro, com linhas indicando issues abertas vs fechadas ao longo do tempo&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Uma última coisa: &lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/418&quot;&gt;alguém decidiu implementar uma barra de pesquisa no GitFichas&lt;/a&gt;, não havia uma issue para isso mas é algo que eu definitivamente pensei em ter no site.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/Screenshot_2025-10-20_at_10.30.05_AM.webp&quot; alt=&quot;Homepage do site GitFichas mostrando o novo recurso de barra de pesquisa implementado por um contribuidor da comunidade&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Uma função de busca não é uma coisa pequena, especialmente se você não tem um banco de dados para indexar o conteúdo. Mesmo assim alguém implementou uma forma de pesquisar fichas e eu acredito que vai ajudar outras pessoas a encontrarem fichas mais facilmente! Mais uma grande vitória do open source! 🎉&lt;/p&gt;

&lt;h2 id=&quot;o-blog&quot;&gt;O blog&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/jtemporal/jtemporal.github.io&quot;&gt;No lado do blog&lt;/a&gt;, trabalhei principalmente em três coisas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Séries de posts&lt;/li&gt;
  &lt;li&gt;Subtítulos para posts&lt;/li&gt;
  &lt;li&gt;Novas capas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bora lá.&lt;/p&gt;

&lt;h3 id=&quot;séries-de-posts-no-blog&quot;&gt;Séries de posts no blog&lt;/h3&gt;

&lt;p&gt;Duas semanas atrás implementei um widget de séries para que alguém lendo os posts possa pular rapidamente para outros posts na mesma coleção, muito parecido com os widgets de “&lt;em&gt;Artigos Relacionados&lt;/em&gt;” ou de “&lt;em&gt;Artigos Recentes&lt;/em&gt;” que eu já tenho.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_0876.webp&quot; alt=&quot;Post do blog mostrando o novo widget de séries que permite aos leitores navegar entre posts da mesma série&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Até sábado era impossível linkar para uma série, então esse final de semana eu disse que estava na hora de corrigir isso. Principalmente para que eu pudesse compartilhar uma série sem linkar para um post específico que fizesse parte da série.&lt;/p&gt;

&lt;p&gt;Eu queria ter uma página por série, e eu consegui pensar em algumas formas de implementar isso:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Separar séries em &lt;em&gt;collections&lt;/em&gt;&lt;/strong&gt;: Já criei coleções antes, mas neste caso &lt;em&gt;collections&lt;/em&gt; não é uma boa solução pois separaria os posts do resto dos posts;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Criar manualmente uma página para cada série&lt;/strong&gt;: não escalável, isso criaria um monte de outros arquivos para eu manter fora que toda nova série eu precisaria uma página nova, apenas não;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Plugins&lt;/strong&gt;: veja bem, plugins pareciam o caminho certo a seguir dado o fato de que eu poderia escrever um script ruby para gerar páginas automaticamente, mas se o seu site é deployado pelo GitHub Pages, tenho más notícias: não se pode usar &lt;em&gt;custom plugins&lt;/em&gt; no GitHub Pages.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depois de algumas considerações, e conversando com o Copilot, me senti confiante de que escrever um plugin customizado era o caminho certo, mas como meu blog era servido através do GitHub Pages eu precisava encontrar uma forma diferente de fazer o deploy do blog, e eu não estava disposta a fazer commit do site buildado no GitHub.&lt;/p&gt;

&lt;p&gt;Como eu já uso Netlify para preview dos pull requests tanto do blog quanto do GitFichas, pareceu um passo natural migrar o deployment de produção para o Netlify também. Então gostaria de informar vocês, senhoras e senhores, que agora eu sou uma dev que saiu do GitHub Pages para o Netlify para servir prod do meu site e eu me sinto como uma dev premium. 🤣&lt;/p&gt;

&lt;p&gt;Com a ajuda do Copilot eu &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/354/commits/db2e1e94f49bb3a7c134c35cad37b0b40b0f2bda&quot;&gt;implementei o plugin&lt;/a&gt; e migrei com sucesso prod para  Netlify, provavelmente vou escrever um post sobre isso em breve.&lt;/p&gt;

&lt;p&gt;Aqui estão algumas das séries:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://jtemporal.com/series-pt/dicas-de-git/&quot;&gt;Dicas de Git&lt;/a&gt;:&lt;/strong&gt; Tudo sobre Git cobrindo: conflitos, branches, rebase e fluxos GitHub.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://jtemporal.com/series-pt/hacktoberfest-2025/&quot;&gt;Hacktoberfest 2025&lt;/a&gt;:&lt;/strong&gt; Atualizações semanais sobre Hacktoberfest 2025 no GitFichas e outros projetos.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://jtemporal.com/series-pt/dominando-mcp/&quot;&gt;Dominando MCP&lt;/a&gt;:&lt;/strong&gt; Tudo o que você precisa saber sobre Model Context Protocol (MCP).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas e todas as outras estão disponíveis &lt;a href=&quot;https://jtemporal.com/series-pt&quot;&gt;na página de séries&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;subtítulos-para-posts&quot;&gt;Subtítulos para posts&lt;/h3&gt;

&lt;p&gt;Outra coisa que sempre quis fazer: ter subtítulos em alguns posts. Este fim de semana decidi que era hora, e então depois de um pouco de &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/352&quot;&gt;magia Liquid e alguns ajustes CSS&lt;/a&gt; estou feliz em informar que agora posso ter posts com título e subtítulos.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_0877.webp&quot; alt=&quot;Layout de post do blog mostrando a implementação do novo recurso de subtítulo com estilo de título e subtítulo&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Bem na hora para o meu post com um conto de fadas.&lt;/p&gt;

&lt;h3 id=&quot;novas-capas&quot;&gt;Novas capas&lt;/h3&gt;

&lt;p&gt;Se você está se perguntando “&lt;em&gt;que post de conto de fadas?&lt;/em&gt;” bem, eu também comecei a ficar um pouco incomodada com o fato de que as capas no blog estavam muito repetitivas ultimamente, já que os últimos 14 posts tinham &lt;strong&gt;todos&lt;/strong&gt; a &lt;strong&gt;mesma&lt;/strong&gt; capa.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/a-escritora-e-o-bot-conto-de-fadas/&quot;&gt;&lt;img src=&quot;/images/fairy-tale/writer-looking-at-scrolls.webp&quot; alt=&quot;Ilustração de uma escritora olhando pergaminhos, representando a capa do post do conto de fadas&quot; class=&quot;img-post&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então chegou a hora de criar algumas capas a mais e colocá-las em bom uso, &lt;a href=&quot;https://jtemporal.com/a-escritora-e-o-bot-conto-de-fadas/&quot;&gt;eu conto a história aqui neste outro post&lt;/a&gt;, que eu encorajo fortemente você a ler porque está na forma de um conto de fadas, mas aqui está o TL;DR: notei as capas repetidas, &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/351&quot;&gt;abri uma issue, fiz o copilot fazer os ajustes de código&lt;/a&gt; e agora temos novas capas no ar.&lt;/p&gt;

&lt;h2 id=&quot;medalha-de-supercontributor&quot;&gt;Medalha de &lt;em&gt;supercontributor&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;Finalmente esta semana atualizei meu perfil Holopin para mostrar minha badge de “supercontribuidora” do Hacktoberfest.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_0883.webp&quot; alt=&quot;Uma imagem das badges Holopin de @jesstemporal, que é um link para visualizar o perfil completo Holopin dela&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E a camiseta já chegou também!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hacktoberfest-2025-w3/IMG_5971.webp&quot; alt=&quot;Camiseta de supercontribuidora Hacktoberfest 2025 em cor clara, representando a recompensa de edição limitada para os principais contribuidores&quot; class=&quot;img-post&quot; style=&quot;max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Prefiro camisetas com cores escuras, mas tem um toque especial, já que apenas 10.000 serão distribuídas e essa em particular foi conquistada a base do GitFichas. 😊&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Por hoje é só! Te vejo no próximo relatório semanal do Hacktoberfest 2025. 👻&lt;/p&gt;
</description>
        <pubDate>Mon, 20 Oct 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest-2025-semana-3/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest-2025-semana-3/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        
      </item>
    
      <item>
        <title>The writer and the bot</title>
        <description>&lt;p&gt;Once upon a Friday morning, coffee in hand, the writer peered into the blog and found a tiny bug hiding between the posts.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;The writer and the robot looking at the little bug&quot; src=&quot;/images/fairy-tale/writer-finds-a-bug.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Between mixing posts and capturing PRs, a bug had been created without the writer realizing it.&lt;/p&gt;

&lt;p&gt;But this is not the tale of that bug, this tale is about a change made after the bug was dealt with when the writer and her faithful helper bot started their quest…&lt;/p&gt;

&lt;h2 id=&quot;something-woke-up-the-ick-monster&quot;&gt;Something woke up the &lt;em&gt;ick&lt;/em&gt; monster&lt;/h2&gt;

&lt;p&gt;For the last eight or so posts, the writer had forgotten to set a variable that routes articles to their language-specific pages.&lt;/p&gt;

&lt;p&gt;This bug wasn’t huge, but it still annoyed the writer just the same: new posts appeared on the main mixed-language feed, but not on the English or Portuguese pages.&lt;/p&gt;

&lt;p&gt;Noticing the issue the writer quickly cast away this tiny bug with the GitHub Mobile app and &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/349&quot;&gt;an equally tiny PR&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While reviewing the preview for the pull request, something else felt off. The cover images had started to feel a bit &lt;em&gt;too generic&lt;/em&gt; for what the writer have been publishing recently around Preptember and Hacktoberfest.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;A small, cute monster representing the baby ick - a tiny feeling of design dissatisfaction&quot; src=&quot;/images/fairy-tale/baby-ick.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;All posts said “miscellaneous” and the result was that the writer found a baby &lt;em&gt;ick&lt;/em&gt; for the covers she used and loved for such a long time.&lt;/p&gt;

&lt;p&gt;The ick is a terrible monster that makes every writer (and developer) want to change their website. If left alone, the ick always grows into a terrible monster that only gets defeated by a complete &lt;em&gt;website overhaul&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;A large, intimidating monster representing the fully grown ick that demands complete website overhauls&quot; src=&quot;/images/fairy-tale/the-ick-fully-grown.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As the coffee started to wake the writer’s brain, an idea popped into her head:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;it is time to brew a new cover image!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The writer normally cycles between a few covers, with the color scheme from the use on the blog and a cover saying “open source” felt descriptive and better aligned with the last few posts written.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Or so the writer thought…&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;setting-github-copilot-in-motion&quot;&gt;Setting GitHub Copilot in motion&lt;/h2&gt;

&lt;p&gt;After creating, exporting the new cover, and uploading it to the CDN, the writer had all the ingredients to brew a new spell.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;The writer preparing magical ingredients and spell components to defeat the ick monster&quot; src=&quot;/images/fairy-tale/the-writer-ready-for-the-spell.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The writer &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/issues/350&quot;&gt;opened an issue with the ingredients and the instructions to defeat &lt;em&gt;the ick&lt;/em&gt;&lt;/a&gt;: Change cover image on open source related posts to the new cover image. And gave everything to the trusty robot by assigning it to GitHub Copilot.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;GitHub Copilot&apos;s initial pull request description showing it will work on the issue and update the PR with progress&quot; src=&quot;/images/fairy-tale/01-initial-pr-description-by-copilot.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;When you assign an issue to your trusty robot, it will start to work right away &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/351&quot;&gt;creating a draft PR&lt;/a&gt;, saying that it is going to work on the issue and that it will update the PR while it progresses.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;The writer using her phone to quickly fix the tiny bug with GitHub Mobile&quot; src=&quot;/images/fairy-tale/writer-on-the-phone-fixing-the-tiny-bug.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A few minutes later, Copilot updated the PR with a checklist of the steps it would take to make the proposed changes. It read like a neat spell scroll, with steps listed line by line.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;GitHub Copilot&apos;s updated pull request description with a detailed checklist of steps to implement the changes&quot; src=&quot;/images/fairy-tale/02-copilot-update-description-with-checklist.webp&quot; class=&quot;img-post&quot; style=&quot;max-width: 50%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The writer was actually surprised by finding out that 27 posts about open source existed. So much so that the writer thought the bot made a mistake and gathered wrong posts to update the cover.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;The helpful robot discovering and gathering old blog posts from the archive&quot; src=&quot;/images/fairy-tale/robot-found-posts.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Little did the writer know that the bot found posts from a long time ago…&lt;/p&gt;

&lt;h2 id=&quot;work-done-but-minds-changed&quot;&gt;Work done but minds changed&lt;/h2&gt;

&lt;p&gt;With the work actually done the little robot updated the pull request, &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/351&quot;&gt;put together an overview of the changes&lt;/a&gt;, and called the writer in for a review of the spell before it could be cast to production.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;GitHub Copilot&apos;s comprehensive report showing all 27 posts that were updated with the new cover image, organized by category&quot; src=&quot;/images/fairy-tale/03-copilot-report-on-all-changes-made.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That’s how the writer confirmed that actually 27 posts were about open source:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;8 about Preptember&lt;/li&gt;
  &lt;li&gt;4 about GitFichas&lt;/li&gt;
  &lt;li&gt;2 about pull requests&lt;/li&gt;
  &lt;li&gt;And incredible 13 about Hacktoberfest&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The writer could feel the spell working and got really excited to see the preview of the posts with the new cover!&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;The writer showing excitement and anticipation while waiting to see the updated blog covers&quot; src=&quot;/images/fairy-tale/the-writer-excited-for-the-updates.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;But the excitement didn’t last long…&lt;/p&gt;

&lt;h2 id=&quot;the-ick-attacks-again&quot;&gt;The &lt;em&gt;ick&lt;/em&gt; attacks again&lt;/h2&gt;

&lt;p&gt;When the page loaded the writer’s happiness went a little bit like this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;YAY NEW COVER… wait…&lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;&lt;em&gt;awww every single post open source now 😮‍💨&lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;&lt;em&gt;at least the new cover looks great ¯\_(ツ)_/¯&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img alt=&quot;Blog homepage showing multiple posts all using the same &apos;open source&apos; cover image, creating visual monotony&quot; src=&quot;/images/fairy-tale/04-all-covers-with-open-source-ick.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The writer quickly realized that this baby &lt;em&gt;ick&lt;/em&gt; was strong and ready to fight.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;The baby ick monster now grown stronger and ready to battle, showing determination&quot; src=&quot;/images/fairy-tale/tiny-ick-ready-to-fight.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Fearing the ick would get out of control pretty soon, the writer created two new covers to add to the spell: one for Hacktoberfest and one for Preptember posts.&lt;/p&gt;

&lt;p&gt;Without delay the two new covers were added and with a comment the writer put the robot to work once again and waited.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Comment on the GitHub pull request tagging Copilot with instructions about the new cover images for Hacktoberfest and Preptember posts&quot; src=&quot;/images/fairy-tale/05-comment-tag-copilot-to-make-adjustments.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;watching-the-work-closely&quot;&gt;Watching the work closely&lt;/h2&gt;

&lt;p&gt;To avoid anymore problems this time around, the writer also looked at the work while it was happening by casting the &lt;strong&gt;View session&lt;/strong&gt; spell.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;GitHub Copilot session view showing the real-time progress as it processes the cover image adjustments task&quot; src=&quot;/images/fairy-tale/06-copilot-working-on-the-adjustments.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Viewing a session gives you a window to the little robot’s thinking. It let’s you observe all the steps the trusty robot is making while they are happening.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;The writer carefully monitoring and checking on Copilot&apos;s progress as it works on the task&quot; src=&quot;/images/fairy-tale/writer-checking-on-copilots-work.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-happy-ending&quot;&gt;The happy ending&lt;/h2&gt;

&lt;p&gt;A few minutes later, Copilot finished implementing the changes and writer could look at preview again.&lt;/p&gt;

&lt;p&gt;This time around the ick looked far away like it was weak. The variety helped keep the ick away. 😅&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Blog homepage now showing diverse cover images - Hacktoberfest posts with orange covers, Preptember posts with their own design, and other open source content with the new cover&quot; src=&quot;/images/fairy-tale/07-newcovers-in-place.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Sipping coffee, fixing bugs, and watching Copilot work gave the writer hope for an ick-less future. What started as a simple fix turned into a cover image overhaul.&lt;/p&gt;

&lt;p&gt;By the time of the second cup of coffee, the pull request was merged and the spell had taken root. The Hacktoberfest posts now have their own cover, the Preptember ones have theirs, and the rest of the open source content has a fresh new look.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;The writer celebrating happily with the robot after successfully defeating the ick monster&quot; src=&quot;/images/fairy-tale/happy-ending-happy-writer.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;ick&lt;/em&gt; is gone, replaced by covers that actually represent what the recent posts are about.&lt;/p&gt;

&lt;p&gt;Sometimes the smallest changes make the biggest difference. Sometimes, all it takes is a cup of coffee, a robot assistant, and a little bit of magic.&lt;/p&gt;

&lt;p&gt;And so, with a little bit of coffee and a helpful robot, the writer lived happily ever after, at least for now…&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The end&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;p&gt;Tiny side note: I find it extremely amusing when Copilot reacts with 👀 to the comments tagging it.&lt;/p&gt;
</description>
        <pubDate>Sun, 19 Oct 2025 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/the-writer-and-the-bot-fairy-tale/</link>
        <guid isPermaLink="true">https://jtemporal.com/the-writer-and-the-bot-fairy-tale/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        
      </item>
    
      <item>
        <title>A escritora e o robô</title>
        <description>&lt;p&gt;Era uma vez numa manhã de sexta-feira que com café na mão a escritora olhou para o seu blog e encontrou um pequeno bug escondido entre os posts.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;A escritora e o robô olhando o pequeno bug&quot; src=&quot;/images/fairy-tale/writer-finds-a-bug.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Entre misturar posts e capturar PRs, um bug havia sido criado sem a escritora perceber.&lt;/p&gt;

&lt;p&gt;Mas este não é o conto daquele bug, este conto é sobre uma mudança feita depois que o bug foi resolvido quando a escritora e seu fiel ajudante robô começaram sua missão…&lt;/p&gt;

&lt;h2 id=&quot;algo-acordou-o-monstro-do-rancinho&quot;&gt;Algo acordou o monstro do &lt;em&gt;rancinho&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;Nos últimos oito posts, a escritora havia esquecido de definir uma variável que direciona os artigos para suas páginas específicas de idioma.&lt;/p&gt;

&lt;p&gt;Esse bug não era grande, mas mesmo assim incomodou a escritora: novos posts apareciam no feed principal que é bilíngue, mas não nas páginas espeçifícas de inglês ou de português.&lt;/p&gt;

&lt;p&gt;Percebendo o problema, a escritora rapidamente se desfez desse pequeno bug com o GitHub Mobile e &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/349&quot;&gt;um PR igualmente pequeno&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Enquanto revisava a prévia do pull request, algo mais pareceu estranho. As imagens de capa tinham começado a parecer &lt;em&gt;genéricas demais&lt;/em&gt; para o que a escritora vinha publicando recentemente sobre Preptember e Hacktoberfest.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Um pequeno monstro fofo representando o bebê rancinho - uma pequena sensação de insatisfação com o design&quot; src=&quot;/images/fairy-tale/baby-ick.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Todos os posts diziam “variados” (&lt;em&gt;miscellaneous&lt;/em&gt;) e o resultado foi que a escritora encontrou um bebê &lt;em&gt;rancinho&lt;/em&gt; pelas capas que amou por tanto tempo.&lt;/p&gt;

&lt;p&gt;O rancinho é um monstro terrível que faz toda escritora (e desenvolvedora) querer mudar seu site. Se deixado sozinho, o rancinho sempre cresce e se torna um monstro terrível que só é derrotado por uma &lt;em&gt;refatoração completa do site&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Um monstro grande e intimidador representando o rancinho totalmente crescido que exige refatorações completas do site&quot; src=&quot;/images/fairy-tale/the-ick-fully-grown.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Enquanto o café começava a despertar o cérebro da escritora, uma ideia surgiu:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;é hora de preparar uma nova imagem de capa!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A escritora normalmente alterna entre algumas capas e uma capa dizendo “open source” parecia descritiva e mais alinhada com os últimos posts escritos.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ou pelo menos, assim pensava a escritora…&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;colocando-o-github-copilot-em-ação&quot;&gt;Colocando o GitHub Copilot em ação&lt;/h2&gt;

&lt;p&gt;Depois de criar, exportar a nova capa e fazer upload para o CDN, a escritora tinha todos os ingredientes para preparar um novo feitiço.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;A escritora preparando ingredientes mágicos e componentes do feitiço para derrotar o monstro rancinho&quot; src=&quot;/images/fairy-tale/the-writer-ready-for-the-spell.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A escritora &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/issues/350&quot;&gt;abriu uma issue com os ingredientes e as instruções para derrotar &lt;em&gt;o rancinho&lt;/em&gt;&lt;/a&gt;: Mudar a imagem de capa nos posts relacionados a open source para a nova imagem de capa. E deu tudo para o robô confiável atribuindo ao GitHub Copilot.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Descrição inicial do pull request do GitHub Copilot mostrando que vai trabalhar na issue e atualizar o PR com o progresso&quot; src=&quot;/images/fairy-tale/01-initial-pr-description-by-copilot.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Quando você atribui uma issue ao seu robô, ele vai começar a trabalhar imediatamente &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/351&quot;&gt;criando um PR em rascunho&lt;/a&gt;, dizendo que vai trabalhar na issue e que vai atualizar o PR conforme progridir.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;A escritora no telefone corrigindo o pequeno bug&quot; src=&quot;/images/fairy-tale/writer-on-the-phone-fixing-the-tiny-bug.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Alguns minutos depois, o Copilot atualizou o PR com uma lista de verificação dos passos que tomaria para fazer as mudanças propostas. Parecia um pergaminho dos antigos organizado, com os passos listados linha por linha.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Descrição atualizada do pull request do GitHub Copilot com uma lista detalhada de verificação dos passos para implementar as mudanças&quot; src=&quot;/images/fairy-tale/02-copilot-update-description-with-checklist.webp&quot; class=&quot;img-post&quot; style=&quot;max-width: 50%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A escritora ficou realmente surpresa ao descobrir que 27 posts sobre open source existiam. Tanto que a escritora pensou que o robô cometeu um erro e coletou os posts errados para atualizar a capa.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;O robô prestativo descobrindo e coletando posts antigos do blog do arquivo&quot; src=&quot;/images/fairy-tale/robot-found-posts.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Mal sabia a escritora, que o robô encontrou posts de muito tempo atrás…&lt;/p&gt;

&lt;h2 id=&quot;trabalho-feito-mas-mentes-mudaram&quot;&gt;Trabalho feito mas mentes mudaram&lt;/h2&gt;

&lt;p&gt;Com o trabalho realmente feito, o pequeno robô atualizou o pull request, &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/351&quot;&gt;escreveu um relatório das mudanças&lt;/a&gt;, e chamou a escritora para uma revisão do feitiço antes que ele pudesse ser lançado para produção.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Relatório abrangente do GitHub Copilot mostrando todos os 27 posts que foram atualizados com a nova imagem de capa, organizados por categoria&quot; src=&quot;/images/fairy-tale/03-copilot-report-on-all-changes-made.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Foi assim que a escritora confirmou que realmente 27 posts eram sobre open source:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;8 sobre Preptember&lt;/li&gt;
  &lt;li&gt;4 sobre GitFichas&lt;/li&gt;
  &lt;li&gt;2 sobre pull requests&lt;/li&gt;
  &lt;li&gt;E incríveis 13 sobre Hacktoberfest&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A escritora podia sentir o feitiço funcionando e ficou muito animada para ver a prévia dos posts com a nova capa!&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;A escritora mostrando animação e expectativa enquanto espera para ver as capas atualizadas do blog&quot; src=&quot;/images/fairy-tale/the-writer-excited-for-the-updates.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Mas a animação não durou muito…&lt;/p&gt;

&lt;h2 id=&quot;o-rancinho-ataca-novamente&quot;&gt;O &lt;em&gt;rancinho&lt;/em&gt; ataca novamente&lt;/h2&gt;

&lt;p&gt;Quando a página carregou, a felicidade da escritora durou pouco e foi mais ou menos assim:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;AEEE CAPA NOVA… espera…&lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;&lt;em&gt;afff todo post agora é open source 😮‍💨&lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;&lt;em&gt;pelo menos a nova capa tá massa ¯\_(ツ)_/¯&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img alt=&quot;Página inicial do blog mostrando vários posts todos usando a mesma imagem de capa &apos;open source&apos;, criando monotonia visual&quot; src=&quot;/images/fairy-tale/04-all-covers-with-open-source-ick.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A escritora rapidamente percebeu que esse bebê &lt;em&gt;rancinho&lt;/em&gt; era forte e estava pronto para lutar.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;O bebê monstro rancinho agora mais forte e pronto para a batalha, mostrando determinação&quot; src=&quot;/images/fairy-tale/tiny-ick-ready-to-fight.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Temendo que o rancinho saísse de controle muito em breve, a escritora criou duas novas capas para adicionar ao feitiço: uma para Hacktoberfest e uma para posts de Preptember.&lt;/p&gt;

&lt;p&gt;Sem demora, as duas novas capas foram adicionadas e com um comentário a escritora colocou o robô para trabalhar mais uma vez.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Comentário no pull request do GitHub marcando o Copilot com instruções sobre as novas imagens de capa para posts do Hacktoberfest e Preptember&quot; src=&quot;/images/fairy-tale/05-comment-tag-copilot-to-make-adjustments.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;observando-o-trabalho-de-perto&quot;&gt;Observando o trabalho de perto&lt;/h2&gt;

&lt;p&gt;Para evitar mais problemas desta vez, a escritora também olhou o trabalho enquanto estava acontecendo lançando o feitiço &lt;strong&gt;View session&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Visualização da sessão do GitHub Copilot mostrando o progresso em tempo real enquanto processa a tarefa de ajustes das imagens de capa&quot; src=&quot;/images/fairy-tale/06-copilot-working-on-the-adjustments.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Visualizar uma sessão te dá uma janela para o pensamento do pequeno robô e te permite observar todos os passos que o robôzinho está fazendo enquanto eles estão acontecendo.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;A escritora verificando o trabalho do Copilot&quot; src=&quot;/images/fairy-tale/writer-checking-on-copilots-work.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;o-final-feliz&quot;&gt;O final feliz&lt;/h2&gt;

&lt;p&gt;Alguns minutos depois, o Copilot terminou de implementar as mudanças e a escritora pôde olhar a prévia novamente.&lt;/p&gt;

&lt;p&gt;Desta vez o rancinho parecia distante e fraco. A variedade ajuda a manter o rancinho longe. 😅&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Página inicial do blog agora mostrando imagens de capa diversas - posts do Hacktoberfest com capas laranja, posts do Preptember com seu próprio design, e outros conteúdos de open source com a nova capa&quot; src=&quot;/images/fairy-tale/07-newcovers-in-place.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Tomando café, corrigindo bugs, e vendo o Copilot trabalhar deu à escritora esperança para um futuro sem rancinho.&lt;/p&gt;

&lt;p&gt;Quando a xícara de café estava vazia, o pull request havia sido mergeado e o feitiço tinha criado raízes: Os posts do Hacktoberfest agora têm sua própria capa, os de Preptember têm a deles, e o resto do conteúdo de open source tem uma nova cara.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;A escritora comemorando feliz com o robô após derrotar com sucesso o monstro rancinho&quot; src=&quot;/images/fairy-tale/happy-ending-happy-writer.webp&quot; class=&quot;img-post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;rancinho&lt;/em&gt; se foi, substituído por capas que realmente representam sobre o que os posts recentes falam.&lt;/p&gt;

&lt;p&gt;Às vezes as menores mudanças fazem a maior diferença. Às vezes, tudo que é preciso é uma xícara de café, um assistente robô, e um pouco de magia.&lt;/p&gt;

&lt;p&gt;E assim, com uma xícara de café e um robô prestativo, a escritora viveu feliz para sempre. Bem pelo menos por enquanto…&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Fim&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;p&gt;Pequena observação: Acho extremamente divertido quando o Copilot reage com 👀 aos comentários que marcam ele.&lt;/p&gt;
</description>
        <pubDate>Sun, 19 Oct 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/conto-da-escritora-e-do-robo/</link>
        <guid isPermaLink="true">https://jtemporal.com/conto-da-escritora-e-do-robo/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        
      </item>
    
      <item>
        <title>Contribute to GitFichas</title>
        <description>&lt;p&gt;Looking for an open source project to contribute to? Let me tell you about &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;GitFichas&lt;/a&gt;, a visual study cards project about Git in multiple languages.&lt;/p&gt;

&lt;h2 id=&quot;what-is-gitfichas&quot;&gt;What is GitFichas?&lt;/h2&gt;

&lt;p&gt;GitFichas creates visual study cards (fichas in Portuguese) that help developers understand Git concepts through diagrams and flowcharts. Think of it as flashcards for Git, but built with modern web technologies and designed to be accessible to developers worldwide.&lt;/p&gt;

&lt;p&gt;The project supports multiple languages: Portuguese, English, Spanish, and more coming! It uses Mermaid diagrams to create beautiful and friendly study materials.&lt;/p&gt;

&lt;h2 id=&quot;real-impact&quot;&gt;Real Impact&lt;/h2&gt;

&lt;p&gt;During the first 10 days of Hacktoberfest 2025, GitFichas saw incredible community engagement with &lt;a href=&quot;https://github.com/users/jtemporal/projects/1/views/10&quot;&gt;&lt;strong&gt;over 80 total pull requests merged&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This isn’t just about numbers - this proves the community wants to make Git education better for everyone.&lt;/p&gt;

&lt;h2 id=&quot;why-your-contribution-matters&quot;&gt;Why Your Contribution Matters&lt;/h2&gt;

&lt;p&gt;When you contribute to GitFichas, you’re not just adding code or content, you’re also helping other developers understand Git better. Every translation makes the project accessible to new communities. Every bug fix improves the learning experience. Every new study card helps someone grasp a complex concept.&lt;/p&gt;

&lt;h3 id=&quot;ready-to-contribute&quot;&gt;Ready to Contribute?&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Explore the project on GitHub&lt;/strong&gt;: &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;github.com/jtemporal/gitfichas&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Check out the issues&lt;/strong&gt;: Look for &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues&quot;&gt;issues with labels&lt;/a&gt; that match your interests like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bug&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;enhancement&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Join the conversation&lt;/strong&gt;: Comment on issues to ask questions or show interest in working on them&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then make your PR.&lt;/p&gt;

&lt;h4 id=&quot;set-up-your-environment&quot;&gt;Set Up Your Environment&lt;/h4&gt;

&lt;p&gt;I suggest you use GitHub Codespaces but you can also run things locally if you prefer:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone https://github.com/jtemporal/gitfichas.git
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;gitfichas
./setup.sh  &lt;span class=&quot;c&quot;&gt;# One command sets up everything!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;you-can-use-ai-to-help-you&quot;&gt;You Can Use AI to Help You&lt;/h4&gt;

&lt;p&gt;GitFichas embraces AI and there are GitHub Copilot instructions to help you:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Understand the codebase structure&lt;/li&gt;
  &lt;li&gt;Follow project conventions&lt;/li&gt;
  &lt;li&gt;Migrate cards from hand-drawn initial format to the current Mermaid format&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;make-your-contribution&quot;&gt;Make Your Contribution&lt;/h4&gt;

&lt;p&gt;Whether it’s translating a study card, fixing a typo, or migrating a card, every contribution makes Git learning better for developers worldwide. Don’t &lt;a href=&quot;https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue&quot;&gt;forget to link the issue in your PR description&lt;/a&gt; and wait for me to review.&lt;/p&gt;

&lt;h2 id=&quot;types-of-contributions-we-love&quot;&gt;Types of Contributions We Love&lt;/h2&gt;

&lt;p&gt;These are some of the contributions we have issues for at the moment:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Translations&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Translate existing study cards&lt;/li&gt;
  &lt;li&gt;Adapt Git terminology for different regions&lt;/li&gt;
  &lt;li&gt;Review and improve existing translations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you speak other languages, GitFichas is also capable of supporting more languages, feel free to &lt;a href=&quot;https://github.com/jtemporal/gitfichas/discussions/400&quot;&gt;add your vote here&lt;/a&gt; on what should be the next languages we tackle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Technical Contributions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Improve mobile responsiveness&lt;/li&gt;
  &lt;li&gt;Fix any bugs you find&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Content Addition&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Create new study cards for Git concepts and commands&lt;/li&gt;
  &lt;li&gt;Improve explanations in existing cards&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;connect-and-learn-more&quot;&gt;Connect and Learn More&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;github.com/jtemporal/gitfichas&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Live Site&lt;/strong&gt;: &lt;a href=&quot;https://gitfichas.com/&quot;&gt;gitfichas.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Create a new &lt;a href=&quot;http://github.com/jtemporal/gitfichas/discussions/&quot;&gt;Discussion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;Ready to make Git learning better for developers worldwide? I’m looking forward to your pull request! 🚀&lt;/p&gt;
</description>
        <pubDate>Tue, 14 Oct 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/contribute-to-gitfichas/</link>
        <guid isPermaLink="true">https://jtemporal.com/contribute-to-gitfichas/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        
      </item>
    
      <item>
        <title>Contribua com o GitFichas</title>
        <description>&lt;p&gt;Procurando um projeto open source para contribuir? Deixa eu te contar sobre o &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;GitFichas&lt;/a&gt;, um projeto de fichas de estudo visuais sobre Git em vários idiomas.&lt;/p&gt;

&lt;h2 id=&quot;o-que-é-o-gitfichas&quot;&gt;O que é o GitFichas?&lt;/h2&gt;

&lt;p&gt;O GitFichas cria fichas de estudo visuais que ajudam devs a entender conceitos do Git através de diagramas. Pense no GitFichas como flashcards de estudo sobre Git, mas construído com tecnologias web modernas e projetado para ser acessível a devs do mundo todo.&lt;/p&gt;

&lt;p&gt;O projeto suporta vários idiomas: português, inglês, espanhol, e mais por vir! O GitFichas usa diagramas Mermaid para criar materiais de estudo bonitos e amigáveis.&lt;/p&gt;

&lt;h2 id=&quot;impacto-real&quot;&gt;Impacto Real&lt;/h2&gt;

&lt;p&gt;Durante os primeiros 10 dias do Hacktoberfest 2025, o GitFichas viu um engajamento incrível da comunidade com &lt;a href=&quot;https://github.com/users/jtemporal/projects/1/views/10&quot;&gt;&lt;strong&gt;mais de 80 pull requests mergeados no total&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Isso não é só sobre números, isso prova que a comunidade quer tornar a educação sobre Git melhor para todos.&lt;/p&gt;

&lt;h2 id=&quot;por-que-sua-contribuição-importa&quot;&gt;Por que sua contribuição importa&lt;/h2&gt;

&lt;p&gt;Quando você contribui para o GitFichas, você não está apenas adicionando código ou conteúdo, você também está ajudando outras pessoas a entenderem Git melhor. Cada tradução torna o projeto acessível a novas comunidades. Cada correção de bug melhora a experiência de aprendizado. Cada nova ficha de estudo ajuda alguém a compreender um conceito ou comando novo.&lt;/p&gt;

&lt;h3 id=&quot;bora-contribuir&quot;&gt;Bora contribuir?&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Explore o projeto no GitHub&lt;/strong&gt;: &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;github.com/jtemporal/gitfichas&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Confira as issues&lt;/strong&gt;: Procure por &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues&quot;&gt;issues com labels&lt;/a&gt; que correspondam aos seus interesses como &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bug&lt;/code&gt; ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;enhancement&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Participe da conversa&lt;/strong&gt;: Comente nas issues e faça perguntas ou mostre interesse em trabalhar nelas&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depois faça seu PR.&lt;/p&gt;

&lt;h4 id=&quot;configure-seu-ambiente&quot;&gt;Configure seu ambiente&lt;/h4&gt;

&lt;p&gt;Eu sugiro que você use o GitHub Codespaces, mas você também pode executar tudo localmente se preferir:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone https://github.com/jtemporal/gitfichas.git
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;gitfichas
./setup.sh  &lt;span class=&quot;c&quot;&gt;# Um comando configura tudo!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;você-pode-usar-ia-para-te-ajudar&quot;&gt;Você pode usar IA para te ajudar&lt;/h4&gt;

&lt;p&gt;O GitFichas incorpora IA e há instruções do GitHub Copilot para te ajudar a:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Entender a estrutura do código&lt;/li&gt;
  &lt;li&gt;Seguir as convenções do projeto&lt;/li&gt;
  &lt;li&gt;Migrar fichas do formato inicial desenhado à mão para o formato atual do Mermaid&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;faça-sua-contribuição&quot;&gt;Faça sua contribuição&lt;/h4&gt;

&lt;p&gt;Seja traduzindo uma ficha de estudo, corrigindo um erro de digitação, ou migrando uma ficha, toda contribuição torna o aprendizado de Git melhor para pessoas desenvolvedoras do mundo todo. Não se &lt;a href=&quot;https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue&quot;&gt;esqueça de linkar a issue na descrição do seu PR&lt;/a&gt; e aguarde a revisão.&lt;/p&gt;

&lt;h2 id=&quot;tipos-de-contribuições-que-amamos&quot;&gt;Tipos de contribuições que amamos&lt;/h2&gt;

&lt;p&gt;Essas são algumas das contribuições para as quais temos issues no momento:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Traduções&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Traduzir fichas de estudo existentes&lt;/li&gt;
  &lt;li&gt;Adaptar terminologia do Git para diferentes regiões&lt;/li&gt;
  &lt;li&gt;Revisar e melhorar traduções existentes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você fala outras linguagens, o GitFichas também é capaz de suportar mais idiomas, aproveita pra &lt;a href=&quot;https://github.com/jtemporal/gitfichas/discussions/400&quot;&gt;adicionar seu voto aqui&lt;/a&gt; sobre quais deveriam ser os próximos idiomas que devemos implementar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Contribuições técnicas&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Melhorar responsividade mobile&lt;/li&gt;
  &lt;li&gt;Corrigir qualquer bug que você encontrar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Adição de conteúdo&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Criar novas fichas de estudo para conceitos e comandos do Git&lt;/li&gt;
  &lt;li&gt;Melhorar explicações em fichas existentes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;conecte-se-e-saiba-mais&quot;&gt;Conecte-se e saiba mais&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Repositório&lt;/strong&gt;: &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;github.com/jtemporal/gitfichas&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Site ao vivo&lt;/strong&gt;: &lt;a href=&quot;https://gitfichas.com/&quot;&gt;gitfichas.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Crie uma nova &lt;a href=&quot;http://github.com/jtemporal/gitfichas/discussions/&quot;&gt;Discussion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;Pronto para tornar o aprendizado de Git melhor para pessoas do mundo todo? Estou ansiosa pelo seu pull request! 🚀&lt;/p&gt;
</description>
        <pubDate>Tue, 14 Oct 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/contribua-com-o-gitfichas/</link>
        <guid isPermaLink="true">https://jtemporal.com/contribua-com-o-gitfichas/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        
      </item>
    
      <item>
        <title>Hacktoberfest 2025: Diário de Campo, Semana 2</title>
        <description>&lt;p&gt;Esta é a segunda semana do Hacktoberfest 2025! Para esta série de posts vamos revisar algumas estatísticas das contribuições que recebi e fiz durante este mês.&lt;/p&gt;

&lt;p&gt;Esta semana me concentrei principalmente no GitFichas devido à minha disponibilidade limitada, sem mais delongas, vamos falar sobre as contribuições.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;Esta é a primeira semana “completa” de outubro e o &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;GitFichas recebeu 54 pull requests&lt;/a&gt;! Aqui está o detalhamento:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;53 PRs feitos pela comunidade&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;48 mergeados&lt;/li&gt;
      &lt;li&gt;2 fechados&lt;/li&gt;
      &lt;li&gt;3 abertos&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse é o detalhamento das contribuições:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/pr-type-distribution-week-2-hacktoberfest.webp&quot; alt=&quot;Gráfico de barras empilhadas mostrando a distribuição de tipos de pull request para GitFichas durante a semana 2 do Hacktoberfest 2025, exibindo contribuições da comunidade vs contribuições do autor&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Esta semana tive pouco tempo disponível para focar em PRs durante a semana e você pode ver no gráfico acima que a maioria das contribuições foi feita pela comunidade em todas as categorias.&lt;/p&gt;

&lt;p&gt;Ao analisar os &lt;a href=&quot;https://github.com/users/jtemporal/projects/1/insights&quot;&gt;gráficos de insights&lt;/a&gt; no &lt;a href=&quot;https://github.com/users/jtemporal/projects/1&quot;&gt;projeto GitFichas Hacktoberfest 2025&lt;/a&gt;, percebi que minhas contribuições da primeira semana que focaram em fazer correções, apareceram nos gráficos de PRs mas não nos gráficos relacionados a Issues, já que estava fazendo as correções eu mesma sem abrir as issues para rastreá-las.&lt;/p&gt;

&lt;p&gt;Com o tempo limitado para trabalhar em PRs devido a algumas mudanças de prioridades no trabalho, ao invés de fazer as correções eu mesma, abri issues para cada correção. Isso me permitiu rastrear as mudanças para fazer no fim de semana e também dar uma chance para a comunidade trabalhar nelas também. O resultado dessa mudança de comportamento da minha parte pode ser visto no gráfico de distribuição abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/closed-issues-distribution-w1-w2.webp&quot; alt=&quot;Gráfico de barras empilhadas mostrando a distribuição de issues fechadas entre a semana 1 e semana 2 do Hacktoberfest 2025 para o projeto GitFichas&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Se você olhar o primeiro gráfico no post você também verá que a comunidade fez a maioria dos PRs desta semana.&lt;/p&gt;

&lt;p&gt;Falando em fechar issues, aqui está o burn up para a semana passada até 11 de outubro:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/burn-up-up-to-oct-11th.webp&quot; alt=&quot;Gráfico burn-up mostrando o progresso do projeto GitFichas até 12 de outubro de 2025, rastreando tarefas completadas ao longo do tempo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Embora as issues tenham aumentado em número, também fechamos várias delas. Se o ritmo continuar assim, é provável que tenhamos a maioria das issues fechadas no final do mês. 🎉&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Essa semana eu também fui mostrar o &lt;a href=&quot;https://www.youtube.com/live/GnFsorph358?si=sJ8BEpgLIfvduFN0&quot;&gt;GitFichas na Open Source Friday Brasil lá no canal do YouTube do GitHub&lt;/a&gt;, deixei várias dicas sobre usar AI para projetos, acho que vale a pena assistir:&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/GnFsorph358?si=KErUnHnjdRSysBVp&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;Segunda-feira é feriado para mim, então espero fazer algumas contribuições eu mesma já que não consegui fazer tantas quanto queria durante a semana.&lt;/p&gt;

&lt;p&gt;É isso pra semana 2! Fiquem ligados para a atualização da próxima semana sobre o Hacktoberfest 2025. 🎃&lt;/p&gt;

&lt;p&gt;Até jajá.&lt;/p&gt;
</description>
        <pubDate>Sun, 12 Oct 2025 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest-2025-semana-2/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest-2025-semana-2/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        
      </item>
    
      <item>
        <title>Field Notes: Hacktoberfest 2025, Week 2</title>
        <description>&lt;p&gt;This is the second week of Hacktoberfest 2025! For this series of posts we will overview some stats for contributions I received and made over this month. This week I mostly focused on GitFichas due to limited availability, without further ado, let’s talk about the contributions.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;This is the first full week of October &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;GitFichas received 54 pull requests&lt;/a&gt;! Here’s the breakdown:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;53 PRs made by the community&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;48 merged&lt;/li&gt;
      &lt;li&gt;2 closed&lt;/li&gt;
      &lt;li&gt;3 open&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s the breakdown of the contributions:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/pr-type-distribution-week-2-hacktoberfest.webp&quot; alt=&quot;Stacked bar chart showing pull request type distribution for GitFichas during Hacktoberfest 2025 week 2, displaying community contributions vs author contributions&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This week I had very little available time to focus on PRs during the week and you can see on the above chart that most contributions were made by the community across the board.&lt;/p&gt;

&lt;p&gt;While analyzing the &lt;a href=&quot;https://github.com/users/jtemporal/projects/1/insights&quot;&gt;insights charts&lt;/a&gt; in the &lt;a href=&quot;https://github.com/users/jtemporal/projects/1&quot;&gt;GitFichas Hacktoberfest 2025 project&lt;/a&gt;, I noticed that my contributions from the first week that focused on making corrections, showed up in the PRs charts but not Issues-related charts since I was making the corrections myself without even opening the issues to track them.&lt;/p&gt;

&lt;p&gt;This week unfortunately I had limited time to work on PRs myself due to some changing priorities at work. So instead of making the corrections myself I opened issues for every correction. This would allow me to track changes to make on the weekend and to give a chance to the community to work on them as well. The result from this change in behavior on my end can be seen in the distribution chart below:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/closed-issues-distribution-w1-w2.webp&quot; alt=&quot;Stacked bar chart showing closed issues distribution between week 1 and week 2 of Hacktoberfest 2025 for GitFichas project&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you look at the first chart in the blog post you’ll also see that the community made most of the PRs this week.&lt;/p&gt;

&lt;p&gt;Speaking of closing issues, here’s the burn up for this past week until October 11th:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/burn-up-up-to-oct-11th.webp&quot; alt=&quot;Burn-up chart showing GitFichas project progress up to October 12th, 2025, tracking completed tasks over time&quot; /&gt;&lt;/p&gt;

&lt;p&gt;While issues increased in numbers, we also closed a bunch of them. If the rhythm continues like this, it is likely that we’ll have most issues closed at the end of the month. 🎉&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Monday is a holiday for me so I expect to make a few contributions of my own that I couldn’t throughout the week.&lt;/p&gt;

&lt;p&gt;That’s a wrap for week 2! Stay tuned for next week’s update around Hacktoberfest 2025. 🎃&lt;/p&gt;

&lt;p&gt;See you in the next one.&lt;/p&gt;
</description>
        <pubDate>Sun, 12 Oct 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest-2025-week-2/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest-2025-week-2/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        
      </item>
    
      <item>
        <title>Hacktoberfest 2025: Diário de Campo, Semana 1</title>
        <description>&lt;p&gt;Conseguimos! Após quatro semanas de preptember, o Hacktoberfest finalmente chegou e eu não poderia estar mais animada! Meu emoji mais usado esta semana foi 🎉 com certeza e posso prever que ele vai levar o troféu de mais usado do mês!&lt;/p&gt;

&lt;p&gt;Nesta série de posts vou fazer um resumão das estatísticas de contribuições que recebi e fiz ao longo deste mês, então vamos nessa.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;Nesta primeira meia-semana de outubro, o &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;GitFichas recebeu 42 pull requests&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;26 PRs feitos pela comunidade&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;18 merged&lt;/li&gt;
      &lt;li&gt;6 fechados&lt;/li&gt;
      &lt;li&gt;2 ainda abertos&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse é o detalhamento das contribuições:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/pr-type-distribution-week-1-hacktoberfest.webp&quot; alt=&quot;Gráfico de barras empilhadas mostrando a distribuição de tipos de pull request para o GitFichas durante a semana 1 do Hacktoberfest 2025, exibindo contribuições da comunidade vs contribuições da autora&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Minhas contribuições (16 PRs) focaram em melhorar a documentação ou fazer correções baseadas nos PRs recebidos. Notei que algum tipo de diferença de sistema operacional está rolando e para alguns contribuidores a geração de SVG tem truncado o texto independente de onde estão as quebras de linha.&lt;/p&gt;

&lt;p&gt;O GitFichas também tem um projeto do GitHub que você pode acompanhar o andamento caso tenha curiosidade &lt;a href=&quot;https://github.com/users/jtemporal/projects/1&quot;&gt;o projeto está aqui&lt;/a&gt;. A parte interessante é a &lt;a href=&quot;https://github.com/users/jtemporal/projects/1/insights&quot;&gt;página de insights&lt;/a&gt; onde você pode ver alguns gráficos como o abaixo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/burn-up-up-to-oct-4th.webp&quot; alt=&quot;Gráfico burn-up mostrando o progresso do projeto GitFichas até 5 de outubro de 2025, rastreando tarefas completas ao longo do tempo&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;outros-projetos&quot;&gt;Outros projetos&lt;/h2&gt;

&lt;p&gt;Entre revisar os PRs recebidos e fazer outros para manter a saúde do GitFichas acabei não investindo tanto tempo quanto gostaria em outros projetos.&lt;/p&gt;

&lt;p&gt;Ainda adicionei 2 novos projetos na lista de projetos brasileiros: &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/325&quot;&gt;uvicorn&lt;/a&gt; e &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/324&quot;&gt;starlette&lt;/a&gt; ambos mantidos pelo &lt;a href=&quot;https://github.com/Kludex&quot;&gt;Marcelo Trylesinski&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;E finalmente implementei o &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/327&quot;&gt;widget de séries de posts aqui no blog&lt;/a&gt; para que você possa ver posts que fazem parte de uma série como a do Preptember e esta que começa agora.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Por hoje é só! Vamos ter ainda mais atualizações conforme o Hacktoberfest 2025 continua. 🎃&lt;/p&gt;
</description>
        <pubDate>Sun, 05 Oct 2025 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest-2025-semana-1/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest-2025-semana-1/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contributions</category>
        
        <category>GitHub</category>
        
        <category>open source</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Field Notes: Hacktoberfest 2025, Week 1</title>
        <description>&lt;p&gt;We made it! After four weeks of preptember, Hacktoberfest is finally here and I couldn’t be more excited! My most used emoji this week was 🎉 for sure and I can foresee that this one will take the trophy for the month!&lt;/p&gt;

&lt;p&gt;For this series of posts we will overview some stats for contributions I received and made over this month so let’s talk about the contributions.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;In this first half week of October &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;GitFichas received 42 pull requests&lt;/a&gt;! Here’s the breakdown:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;26 PRs made by the community&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;18 merged&lt;/li&gt;
      &lt;li&gt;6 closed&lt;/li&gt;
      &lt;li&gt;2 unmerged&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s the breakdown of the contributions:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/pr-type-distribution-week-1-hacktoberfest.webp&quot; alt=&quot;Stacked bar chart showing pull request type distribution for GitFichas during Hacktoberfest 2025 week 1, displaying community contributions vs author contributions&quot; /&gt;&lt;/p&gt;

&lt;p&gt;My contributions (16 PRs) focused on either improving documentation or make corrections based on the PRs received. I noticed some sort of OS difference is going on and for some contributors the SVG generation has been truncating the text no matter where the break lines are.&lt;/p&gt;

&lt;p&gt;GitFichas also has a project you can follow along if you are curious &lt;a href=&quot;https://github.com/users/jtemporal/projects/1&quot;&gt;you can check it here&lt;/a&gt;. The interesting part about it is the &lt;a href=&quot;https://github.com/users/jtemporal/projects/1/insights&quot;&gt;insights page&lt;/a&gt; where you can see some charts like the one below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/burn-up-up-to-oct-4th.webp&quot; alt=&quot;Burn-up chart showing GitFichas project progress up to October 5th, 2025, tracking completed tasks over time&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;other-projects&quot;&gt;Other projects&lt;/h2&gt;

&lt;p&gt;Between reviewing the PRs and making other ones to keep the health of GitFichas I ended up not spending as much time as I would like on other projects.&lt;/p&gt;

&lt;p&gt;I still added 2 new projects on the brazilian projects list: &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/325&quot;&gt;uvicorn&lt;/a&gt; and &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/324&quot;&gt;starlette&lt;/a&gt; both maintained by &lt;a href=&quot;https://github.com/Kludex&quot;&gt;Marcelo Trylesinski&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And finally implemented the &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/327&quot;&gt;series widget here on the blog&lt;/a&gt; so you can see related posts that are part of a series like the one from Preptember and this one.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;That’s a wrap for week 1! Stay tuned for more updates as Hacktoberfest 2025 continues. 🎃&lt;/p&gt;
</description>
        <pubDate>Sun, 05 Oct 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest-2025-week-1/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest-2025-week-1/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contributions</category>
        
        <category>GitHub</category>
        
        <category>open source</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Projetos Brasileiros para contribuir nesse #Hacktoberfest 2025</title>
        <description>&lt;p&gt;O mês da festa que celebra open source no mundo todo está chegando e a #Hacktoberfest 2025 está aqui!&lt;/p&gt;

&lt;p&gt;Por aqui você confere desde 2017 essa lista curada especialmente para te ajudar a encontrar projetos brasileiros para contribuir!&lt;/p&gt;

&lt;h2 id=&quot;regras-para-entrar-nessa-lista&quot;&gt;Regras para entrar nessa lista&lt;/h2&gt;

&lt;p&gt;As regras para adicionar projetos nessa lista:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ser um projeto criado/desenvolvido/mantido por pessoas brasileiras;&lt;/li&gt;
  &lt;li&gt;Precisa ser um &lt;strong&gt;projeto&lt;/strong&gt;, não pode ser uma organização, caso tenha mais de um projeto da organização adicione uma entrada por projeto;&lt;/li&gt;
  &lt;li&gt;Ter pelo menos uma &lt;em&gt;issue&lt;/em&gt; aberta;&lt;/li&gt;
  &lt;li&gt;Ser um repositório válido, ou seja, não arquivado.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;avisos-para-2025&quot;&gt;Avisos para 2025&lt;/h2&gt;

&lt;p&gt;Antes de mais nada não esqueça de &lt;a href=&quot;https://hacktoberfest.com/&quot;&gt;se registrar para a Hacktoberfest aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;prêmios&quot;&gt;Prêmios&lt;/h2&gt;

&lt;p&gt;Mais uma vez a Hacktoberfest irá premiar seus participantes com prêmios virtuais no formato de badges Holopin. Você consegue ver &lt;a href=&quot;https://www.holopin.io/@jesstemporal#badges&quot;&gt;as minhas aqui&lt;/a&gt; por exemplo.&lt;/p&gt;

&lt;p&gt;Além disso, esse ano as pessoas podem fazer de 4 a 6 pull requests, quem completar 6 PRs vai ganhar uma customização a mais na sua badge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Camisetas:&lt;/strong&gt; também teremos camisetas, porém serão apenas 10.000 camisetas para pessoas que completarem 6 PRs em projetos elegíveis. Também serão plantadas 10.000 árvores juntamente com as camisetas e uma badge correspondente.&lt;/p&gt;

&lt;h2 id=&quot;adicionando-projetos-nessa-lista&quot;&gt;Adicionando projetos nessa lista&lt;/h2&gt;

&lt;p&gt;Esse ano vamos manter a mesma forma de aumentar essa lista com mais projetos, como sempre, apenas abrindo um PR com o projeto. &lt;a href=&quot;https://jtemporal.com/adicionando-um-novo-projeto-na-lista-da-hacktoberfest-2019/&quot;&gt;As instruções de como adicionar projetos tão aqui&lt;/a&gt;. Todo mundo segue ganhando &amp;lt;3.&lt;/p&gt;

&lt;p&gt;Os projetos continuam separados pela linguagem principal para facilitar as buscas e também em ordem alfabética pela linguagem. 😉&lt;/p&gt;

&lt;h2 id=&quot;qualidade--quantidade&quot;&gt;Qualidade &amp;gt; Quantidade&lt;/h2&gt;

&lt;p&gt;Assim como em anos anteriores, qualidade é o mais importante então se liga que dois PRs inválidos resultará em &lt;strong&gt;desqualificação por período indeterminado&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Para um PR ser considerado inválido, ele deve ser marcado com as &lt;em&gt;tags&lt;/em&gt; &lt;strong&gt;spam&lt;/strong&gt; ou &lt;strong&gt;invalid&lt;/strong&gt;. Então é bom tentar fazer PRs de qualidade!&lt;/p&gt;

&lt;p&gt;Relembrando que para tornar seu PR válido para a hacktoberfest você precisa ter algumas coisas. PRs apenas contarão se:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;O PR precisa ser aberto em Outubro (entre os dias 1 e 31);&lt;/li&gt;
  &lt;li&gt;O PR precisa acontecer num projeto que tem o tópico &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hacktoberfest&lt;/code&gt; &lt;strong&gt;ou&lt;/strong&gt; ser marcado com o rótulo (&lt;em&gt;label&lt;/em&gt;) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hacktoberfest-accepted&lt;/code&gt; por um mantenedor &lt;strong&gt;ou&lt;/strong&gt; ser aceito (&lt;em&gt;merged&lt;/em&gt;) &lt;strong&gt;ou&lt;/strong&gt; ser aprovado pelo processo de revisão (&lt;em&gt;review&lt;/em&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;mais-informações&quot;&gt;Mais informações&lt;/h2&gt;

&lt;p&gt;Mais informações no &lt;a href=&quot;https://hacktoberfest.com/&quot;&gt;site oficial (em inglês)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Você pode comprar a versão virtual do meu livro &lt;a href=&quot;https://jtemporal.com/microlivrodegit/&quot;&gt;“O grande Microlivro de Git” na Amazon, Gumroad ou no Pix&lt;/a&gt; tanto em português quanto inglês.&lt;/p&gt;

&lt;p&gt;Nesse outro artigo tem &lt;a href=&quot;https://jtemporal.com/5-dicas-para-fazer-o-seu-pull-request-brilhar/&quot;&gt;5 Dicas Para Fazer o Seu Pull Request Brilhar ✨&lt;/a&gt; e por último confira o &lt;a href=&quot;https://gitfichas.com&quot;&gt;GitFichas&lt;/a&gt; para aprender ainda mais sobre Git (que também está aceitando pull requests, fica a dica).&lt;/p&gt;

&lt;p&gt;Happy Hacking! 🎉&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;acesso-rápido-por-linguagem&quot;&gt;Acesso rápido por linguagem&lt;/h2&gt;

&lt;ul&gt;

  
    &lt;li&gt;&lt;a href=&quot;#C#&quot;&gt;C#&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#C&quot;&gt;C&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#CSS&quot;&gt;CSS&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Clojure&quot;&gt;Clojure&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#C++&quot;&gt;C++&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Dart&quot;&gt;Dart&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Elixir&quot;&gt;Elixir&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Go&quot;&gt;Go&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Java&quot;&gt;Java&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#JavaScript&quot;&gt;JavaScript&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Julia&quot;&gt;Julia&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Kotlin&quot;&gt;Kotlin&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Lua&quot;&gt;Lua&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#PHP&quot;&gt;PHP&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Perl&quot;&gt;Perl&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Python&quot;&gt;Python&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Ruby&quot;&gt;Ruby&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Rust&quot;&gt;Rust&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Scala&quot;&gt;Scala&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Shell&quot;&gt;Shell&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#TypeScript&quot;&gt;TypeScript&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Variados&quot;&gt;Variados&lt;/a&gt; - Repositórios sem linguagem específica ex.: blogs, documentações e dicionários&lt;/li&gt;
  

&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;C#&quot;&gt;C#&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/afucher/Inquirer&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3756185?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;afucher/Inquirer&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A collection of common interactive command line user interfaces in C#.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alexsandro-xpt/ErysDownloader&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/845657?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alexsandro-xpt/ErysDownloader&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ErysDownloader, a frenetic and optimizate downloader library. Pure C# lightweight HTTP GET verb library for text/html content-type. No dependece.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/code-cracker/code-cracker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/9695920?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;code-cracker/code-cracker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An analyzer library for C# and VB that uses Roslyn to produce refactorings, code analysis, and other niceties.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;C&quot;&gt;C&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cmatsuoka/libxmp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/317355?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cmatsuoka/libxmp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Libxmp is a library that renders module files to PCM data.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/hardinfo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/hardinfo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;System profiler and benchmark tool for Linux systems&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/lwan&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/lwan&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Experimental, scalable, high performance HTTP server&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;CSS&quot;&gt;CSS&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/milligram/milligram&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16243913?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;milligram/milligram&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A minimalist CSS framework.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Clojure&quot;&gt;Clojure&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mauricioszabo/atom-chlorine&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/138037?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mauricioszabo/atom-chlorine&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; An Atom plugin to integrate with Socket-REPL over Clojure and ClojureScript&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;C++&quot;&gt;C++&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/OtacilioN/Brasilino&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10578275?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;OtacilioN/Brasilino&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Uma biblioteca que permite programar em linguagem Arduino utilizando comandos facilitados em PT-BR.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/vinipsmaker/tufao&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/865914?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;vinipsmaker/tufao&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An asynchronous web framework for C++ built on top of Qt&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Dart&quot;&gt;Dart&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/IldySilva/SnapInk&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/IldySilva.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;IldySilva/SnapInk&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Turns plain code snippets into visually appealing, shareable images, helping developers add a creative touch to their work and share it effortlessly across platforms&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Elixir&quot;&gt;Elixir&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/philss/floki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/381213?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;philss/floki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Floki is a simple HTML parser that enables search for nodes using CSS selectors.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Go&quot;&gt;Go&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/avelino/awesome-go&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/31996?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;avelino/awesome-go&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A curated list of awesome Go frameworks, libraries and software &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cuducos/minha-receita&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/4732915?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cuducos/minha-receita&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Sua API web para consulta de informações do CNPJ da Receita Federal &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/globocom/huskyci&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://huskyci.opensource.globo.com/img/logo.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;globocom/huskyci&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Orquestrador de testes de segurança no CI&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/goreleaser/goreleaser&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24697112?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;goreleaser/goreleaser&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Deliver Go binaries as fast and easily as possible&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/larien/learn-go-with-tests&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/29347337?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;larien/learn-go-with-tests&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tradução do livro de @quii sobre aprender Go com desenvolvimento orientado a testes&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/robertoduessmann/weather-api&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/9089383?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;robertoduessmann/weather-api&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A RESTful API to check the weather&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rodrigo-brito/gocity&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/44341229?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rodrigo-brito/gocity&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Code City metaphor for visualizing Go source code in 3D&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Java&quot;&gt;Java&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/BuildCLI/BuildCLI&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/151835616?s=60&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;BuildCLI/BuildCLI&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A command-line interface (CLI) tool for managing and automating common tasks in Java project development&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;JavaScript&quot;&gt;JavaScript&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/IgorRozani/filosofunk&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/802968?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;IgorRozani/filosofunk&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto com o intuito de juntar frases engraçadas, divertidas, filosóficas ou criativas de músicas de funk.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/MinisterioPublicoRJ/inloco&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/27096918?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;MinisterioPublicoRJ/inloco&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A Geographic Information System (GIS) used by Ministério Público do Estado do Rio de Janeiro to show social, institutional and administrative data , based on React and Leaflet, interacting with a GeoServer back-end. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/RocketChat/Rocket.Chat&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12508788?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;RocketChat/Rocket.Chat&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The ultimate Free Open Source Solution for team communications.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alexanmtz/material-sense&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/88840?s=60&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alexanmtz/material-sense&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A full simple application for react material ui&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/eguatech/egua&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/54448514?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;eguatech/egua&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem de Programação Egua&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/doom-fire-algorithm&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/4248081?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/doom-fire-algorithm&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Playground for the fire effect from DOOM. Really simple algorithm and all experiments are welcome!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/tabnews.com.br&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/4248081?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/tabnews.com.br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Conteúdos para quem trabalha com Programação e Tecnologia.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/video-maker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/4248081?v=4&amp;amp;size=200&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/video-maker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto open source para fazer vídeos automatizados.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/herbsjs/herbs-cli&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://herbsjs.org/img/logo-herbsjs.svg&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;herbsjs/herbs-cli&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A CLI ajuda a acelerar seu ciclo de desenvolvimento com HerbsJS gerando casos de uso e camadas de infraestrutura (REST, GraphQL, Repositórios, etc) com base em suas entidades.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/herbsjs/herbs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://herbsjs.org/img/logo-herbsjs.svg&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;herbsjs/herbs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Pare de gastar tempo com código redundante e de baixo impacto. Codifique seu domínio primeiro usando Herbs e a infraestrutura necessária será gerada na hora.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/OCDots&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/ocdots&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;OCDots is a javascript library for creating evenly distributed points inside a polygon. Check out the demo at https://luxedo.github.io/OCDots/&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mvfsillva/dialetus-service&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/4579340?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mvfsillva/dialetus-service&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API to Informal dictionary for the idiomatic expressions that each Brazilian region It has&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-FilaDaCreche&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-FilaDaCreche&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/react-ape&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/react-ape&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;• [Work in Progress] React Renderer to build UI interfaces using canvas/WebGL&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/klefki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/klefki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple substitution cipher module. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/redis-session-storage&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/redis-session-storage&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Node App Storage sessions with redis.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/simonardejr/matador-de-monstros&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3685303?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;simonardejr/matador-de-monstros&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Minigame feito em Vue&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/withmoney/withmoney-mobile&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/44231290?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;withmoney/withmoney-mobile&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;This is a mobile project for financial management, with vue.js.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/yanmagale/narigajs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/5148042?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;yanmagale/narigajs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; WIP. A node module that reports about air quality in a region&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zenorocha/clipboard.js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/398893?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zenorocha/clipboard.js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Modern copy to clipboard. No Flash. Just 3kb gzipped.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zeucxb/dymock&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/11702749?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zeucxb/dymock&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A CLI to simplify the way you create dynamics mocks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Julia&quot;&gt;Julia&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JSONWebTokens.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JSONWebTokens.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Secure your Julia APIs with JWT. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JuliaPackageWithRustDep.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JuliaPackageWithRustDep.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Example of a Julia Package with Rust dependency.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/Mongoc.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/Mongoc.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;MongoDB driver for the Julia Language &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Kotlin&quot;&gt;Kotlin&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/ftwfy&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/ftwfy&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The real life Command/Ctrl + F - Android App that uses the Mobile Vision API to allow you to search for any occurrence of a text using your camera&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/lmgtfyGen&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/lmgtfyGen&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Lmgtfy Generator Open Source Android App - built to learn Kotlin, MVP architecture, Dagger and Rx&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Lua&quot;&gt;Lua&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cuducos/yaml.nvim&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/4732915?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cuducos/yaml.nvim&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;YAML toolkit for Neovim users&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;PHP&quot;&gt;PHP&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PHPJasper/phpjasper&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/27956258?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PHPJasper/phpjasper&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A PHP report generator &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/comuREDE/core&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/14811323?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;comuREDE/core&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Back e frontend com sensor autônomo / Back and frontend with standalone sensor &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/corcel/corcel&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://camo.githubusercontent.com/6cfc6b23889643f4438a4da4ab4de7398da9337f/68747470733a2f2f692e696d6775722e636f6d2f66484d717754462e706e67&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;corcel/corcel&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A collection of Model classes that allows you to get data directly from a WordPress database.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gabrnunes/orbita&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/gabrnunes.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gabrnunes/orbita&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Plugin de Wordpress para criar um Hacker News-like para o ManualdoUsuario.net&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/laraerp/laraerp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10065592?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;laraerp/laraerp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ERP brasileiro de código fonte aberto escrito em PHP utilizando o Laravel Framework&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/openboleto/openboleto&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/33834590?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;openboleto/openboleto&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Biblioteca para geração de boletos bancários em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/paulohenriquenj/crudificator&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1184825?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;paulohenriquenj/crudificator&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Gerador de Cruds em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Perl&quot;&gt;Perl&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GouveaHeitor/nipe&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/10741284?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GouveaHeitor/nipe&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Nipe is a script to make Tor Network your default gateway.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Python&quot;&gt;Python&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GabrielRF/RastreioBot&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/7331540?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GabrielRF/RastreioBot&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Telegram Bot @RastreioBot &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/JVictorDias/Dinossauro-Google&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/32246598?v=4&amp;amp;size=200&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;JVictorDias/Dinossauro-Google&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto onde várias Redes Neurais competem para aprender a jogar o jogo do dinossauro no navegador Google Chrome.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/Liebelts/Gordura_Simulator&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/42952107?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Liebelts/Gordura_Simulator&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um jogo de gordura sendo feito no Python 3. Envie bugs e ideias.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/allisson/python-simple-rest-client&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/5202?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;allisson/python-simple-rest-client&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple REST client for python 3.5+ &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/mre&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10817238?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/maker-regular-expressions&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório de um pacote simples para fazer expressões regulares em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/validate-docbr&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/10817238?s=60&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/validate-docbr&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Pacote Python para validação de documentos brasileiros.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anapaulagomes/pytest-picked&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1899950?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anapaulagomes/pytest-picked&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Run the tests related to the changed files (according to Git)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ayr-ton/kamu&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1090517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ayr-ton/kamu&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;You favorite book library&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/berinhard/pyp5js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/238223?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;berinhard/pyp5js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python to P5.js Transcriptor&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brazilian-utils/brutils-python&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/40146460?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brazilian-utils/brutils-python&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Brazilian Utils é uma biblioteca com foco na resolução de problemas que enfrentamos diariamente no desenvolvimento de aplicações para o business Brasileiro.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cobrateam/splinter&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/403905?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cobrateam/splinter&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;splinter - python test framework for web applications&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cumbucadev/cinemaempoa&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/cumbucadev.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cumbucadev/cinemaempoa&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site que agrega filmes em cartaz em algumas das diversas salas de cinema de Porto Alegre.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/sentry-patrol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/sentry-patrol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Command line interface for Sentry API &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/tapioca-jarbas&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/tapioca-jarbas&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tapioca wrapper for jarbas api &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/dynaconf/dynaconf&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/dynaconf/dynaconf/blob/master/art/logomark@1x.png?raw=true&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;dynaconf/dynaconf&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Configuration Management for Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/fazedordecodigo/PyFlunt&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/38289677?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;fazedordecodigo/PyFlunt&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Implementação Python inspirada no Flunt (.NET)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/georgeyk/loafer&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/247603?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;georgeyk/loafer&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Asynchronous message dispatcher - Currently using asyncio and amazon SQS&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gilsondev/django-rest-localflavor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/265653?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gilsondev/django-rest-localflavor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Country-specific Django helpers, to use in Django Rest Framework &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/grupyrn/jararaca&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6994159?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;grupyrn/jararaca&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;GruPy-RN Event and Check-in System&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/guites/cinemaempoa&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/guites.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;guites/cinemaempoa&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site que agrega filmes em cartaz em algumas das diversas salas de cinema de Porto Alegre.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/internetlab-br/Twitter-Bots&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/40776372?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;internetlab-br/Twitter-Bots&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos utilizados para pesquisar sobre bots em perfis do Twitter &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/italomaia/flask-empty&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/14670?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;italo-maia/flask-empty&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An empty project skeleton / boilerplate for flask projects. Powered by CookieCutter. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/autogenfiles&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6595551?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jtemporal/autogenfiles&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Automatically generate files from templates&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/caipyra&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6595551?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jtemporal/caipyra&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;import caipyra module code&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/kludex/starlette&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/7353520?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;kludex/starlette&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The little ASGI framework that shines. 🌟&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/kludex/uvicorn&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/7353520?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;kludex/uvicorn&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An ASGI web server, for Python. 🦄&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lamenezes/simple-model&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3208493?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lamenezes/simple-model&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;data handling made easy &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luanfonceca/speakerfight&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1490875?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luanfonceca/speakerfight&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The Easier way to choose the best talks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/fakeRPiGPIO&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/fakerpigpio&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Fake RPi.GPIO module for testing&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/picamip&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/picamip&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python simple Raspberry-Pi camera module web interface&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mari-linhares/tensorflow-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/8157164?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mari-linhares/tensorflow-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos e materiais sobre TensorFlow em Português &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/odufrn/odufrn-api-py&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/52975911?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;odufrn/odufrn-api-py&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Wrapper da API da UFRN em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario-toolbox&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario-toolbox&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;This project empowers people who want to process the data in the context of Querido Diário to run their own analyses&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Brazilian government gazettes, accessible to everyone&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/serenata-de-amor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/serenata-de-amor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🕵 Artificial Intelligence for social control of public administration&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/serenata-toolbox/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/serenata-toolbox&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;pip module containing code shared across Serenata de Amor&apos;s projects&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/osantana/dicteval&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/160418?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;osantana/dicteval&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Evaluate expressions in dict/json objects&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/plenario/plenario&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/30255828?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;plenario/plenario&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-API&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-API&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Editor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Editor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; Plataforma de edição de cardápios da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pyladies-brazil/br-pyladies-pelican&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/8205116?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pyladies-brazil/br-pyladies-pelican&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site PyLadies Brasil usando Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/associados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/associados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Controle de associados a Associação PythonBrasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/wiki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/wiki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site python.org.br estático com Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rougeth/bottery&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/431892?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rougeth/bottery&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A bot framework with batteries included &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/scanapi/scanapi&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/55514558?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;scanapi/scanapi&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Automated Testing and Documentation for your REST API&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/thaisviana/AlgPedia&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1753143?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;thaisviana/AlgPedia&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto Final da Thata e do Tchotcho &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Ruby&quot;&gt;Ruby&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anonydog/anonydog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24738062?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anonydog/anonydog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;On the internet, nobody knows you&apos;re a dog &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/campuscode/rails-guides-pt-BR&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/10028214?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;campuscode/guia-rails-pt-br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tradução do guia oficial de Ruby on Rails para pt-BR&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/juuh42dias/transervicos&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1828204?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;juuh42dias/transervicos&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Plataforma de empregos para pessoas Trans.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/jekyll-theme-potato-hacker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/jekyll-theme-potato-hacker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A Jekyll theme based on hackers and potatoes&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/railsgirls/guides-ptbr&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1641104?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;railsgirls/guides-ptbr&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Rails Girls Guides - Brazilian Portuguese / Tutoriais Rails Girls - Português Brasileiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Rust&quot;&gt;Rust&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jonatasoli/keyrunes&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/26334101?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jonatasoli/keyrunes&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;⚔️ A modern, attribute-aware access control engine written in Rust. Supports RBAC, ABAC, ReBAC, PBAC, and fine-grained multi-tenant policies. Built to rival Keycloak&apos;s authorization module.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/rio&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/rio&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A hardware-accelerated GPU terminal emulator powered by WebGPU, focusing to run in desktops and browsers&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rochacbruno/marmite&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/458654?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rochacbruno/marmite&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Markdown makes sites - A Static Site Generator for Blogs&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Scala&quot;&gt;Scala&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/potigol/potigol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1438144?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;potigol/potigol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem Potigol - Linguagem de programação funcional moderna para iniciantes - A Functional Programming Language for Beginners &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Shell&quot;&gt;Shell&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/hemilioaraujo/Linux-Commands&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/28680369?s=400&amp;amp;u=547852267ebf487736da8ded44c916c53d1d37f4&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;hemilioaraujo/Linux-Commands&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um conjunto de comandos para terminal Linux.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-plataforma-curriculo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-plataforma-curriculo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;TypeScript&quot;&gt;TypeScript&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DesignLiquido/FolEs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/DesignLiquido/FolEs/raw/principal/recursos/imagens/icone-foles.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DesignLiquido/FolEs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Folhas de Estilo em Português, para geração de CSS.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DesignLiquido/delegua&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/DesignLiquido/delegua/raw/principal/recursos/imagens/icone-delegua.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DesignLiquido/delegua&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem de programação 100% em português baseada em TypeScript, independente de sistema operacional e dispositivo, e suporte a múltiplos dialetos.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DesignLiquido/vscode&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/DesignLiquido/vscode/blob/principal/recursos/icone.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DesignLiquido/vscode&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Extensão do Visual Studio Code para as linguagens da Design Líquido e dialetos de Portugol.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brazilian-utils/brazilian-utils&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40146460?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brazilian-utils/brazilian-utils&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Utils library for specific Brazilian businesses&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gabrnunes/tem-crase&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/gabrnunes.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gabrnunes/tem-crase&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O temcrase é uma ferramenta simples que verifica a frase que você digitou e responde se tem crase ou não.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/middy-idempotent&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/middy-idempotent&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🛵 📬 ‎‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎Idempotence Middy middleware for your AWS Lambdas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/middy-recaptcha&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/middy-recaptcha&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🛵 🔐 ‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎reCAPTCHA validation Middy middleware for yours AWS Lambdas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/react-lite-youtube-embed/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/react-lite-youtube-embed&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;📺 ‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎&amp;lt; A private by default, faster and cleaner YouTube embed component for React applications /&amp;gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mateusfg7/Noisekun&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/mateusfg7.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mateusfg7/Noisekun&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;WebApp feito para ouvir combinações de som abiente, para relaxar, estudar, trabalhar, ou se manter focado em uma atividade. Com temas, pomodoro, e playlists!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario-frontend/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario-frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório com a implementação do frontend da Plataforma de Busca do Querido Diário&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Frontend&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Website que permite à população acompanhar o cardápio das escolas públicas de São Paulo.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wellwelwel/poku&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/wellwelwel.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wellwelwel/poku&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🐷 Poku makes testing easy for Node.js, Bun, Deno, and you at the same time.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Variados&quot;&gt;Variados&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/jtemporal.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Jtemporal/gitfichas&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Git Study Cards for devs that might need a refresher about git commands 🗂️&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pizzadedados/pizzadedados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/40184305?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/PizzaDeDados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório do podcast Pizza de Dados - O podcast Brasileiro sobre ciência de dados&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PizzaDeDados/datascience-pizza&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40184305?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/datascience-pizza&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para juntar informações sobre materiais de estudo em análise de dados e áreas afins, empresas que trabalham com dados e dicionário de conceitos&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/VacaRoxa/gamedev4noobs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/36037965?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Vacaroxa/GameDev4Noobs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O propósito desse repositório, além de contribuir para o projeto 4noobs, é ensinar o básico do desenvolvimento de jogos para iniciantes e democratizar o conhecimento nesta área. Apresentando boas práticas e insumos para criar games incríveis.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/basedosdados/mais&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/71097635?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;basedosdados/mais&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Desenvolvimento de pacotes de acesso ao nosso datalake público em diversas linguagens (Python, R, Scala, Julia). O projeto faz parte da Base dos Dados, uma organização sem fins lucrativos com a missão e universalizar o acesso a dados de qualidade para todes.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/bellesamways/studynotes&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/38008212?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;bellesamways/studynotes&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para armazenar todas as anotações de cursos feitos para minha própria consulta ou de outros.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brasil-php/blog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/17454678?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brasil-php/blog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para agregar posts do grupo do Telegram&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/codamos/codamos.github.io/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/16601405?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;codamos/codamos.github.io&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para o site Codamos, que reune eventos, palestras, workshops etc pelo Brasil inteiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/codaqui/institucional&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/codaqui.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;codaqui/institucional&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório institucional do Codaqui&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/feministech/pessoas-streamers-feministech&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/68646156?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;feministech/pessoas-streamers-feministech&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório com as pessoas streamers da comunidade Feministech&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/globocom/secdevlabs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/globocom/secDevLabs/raw/master/images/secDevLabs-logo.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;globocom/secdevlabs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um laboratório para aprender segurança web e mobile de uma maneira prática.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/estrutura-e-interpretacao-de-programas-de-computador-javascript&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/estrutura-e-interpretacao-de-programas-de-computador-javascript&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;λ — Tradução em pt-br de &quot;Structure and Interpretation of Computer Programs — JavaScript Adaptation&quot;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/inspiradanacomputacao/tecnologistas-contra-bolsonaro&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/11424181?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;inspiradanacomputacao/tecnologistas-contra-bolsonaro&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório com Manifesto e Assinaturas de pessoas tecnologistas contra Bolsonaro.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/levxyca/diciotech&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/levxyca.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;levxyca/diciotech&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um dicionário tech para pessoas que querem aprender mais sobre termos técnicos dentro da tecnologia 📖&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ocarneiro/para-entender-a-internet&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/2953926?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ocarneiro/para-entender-a-internet&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Videos e memes obrigatórios para conversas do dia-a-dia &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/react-brasil/empresas-que-usam-react-no-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16929016?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;react-brasil/empresas-que-usam-react-no-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório que mostra empresas e projetos que utilizam React no Brasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rochacbruno/py2rs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/458654/33350327-50e76baa-d485-11e7-8a6e-b3dd0c337046.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rochacbruno/py2rs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Ebook - A quick reference guide for the Pythonista in process of becoming a Rustacean&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/walterfcarvalho/advpl-xlsxtocsv&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/11591494?s=460&amp;amp;u=41649eaf2caa648c59d2fcb157f573c3f210ad79&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;walterfcarvalho/advpl-xlsxtocsv&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Once the language ADVPL doen&apos;t have a tool to read xlsx files directly, I did this source to unable the user read and convert one xlsx file to an array&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/yaiks/vite-docs-pt-br&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/34862686?s=96&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;yaiks/vite-docs-pt-br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para tradução da documentação oficial do vite&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

</description>
        <pubDate>Tue, 30 Sep 2025 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/projetos-br-hacktoberfest-2025/</link>
        <guid isPermaLink="true">https://jtemporal.com/projetos-br-hacktoberfest-2025/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contribuições</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Quarto e último fim de semana de Preptember 2025: Planos mudam e tudo bem</title>
        <description>&lt;p&gt;O último fim de semana do preptember chegou! Achei que o fim de semana anterior foi diferente dos dois primeiros, mas este foi diferente de uma forma totalmente nova. Definitivamente superestimei meus níveis de energia voltando do &lt;a href=&quot;https://www.okta.com/oktane/&quot;&gt;Oktane&lt;/a&gt; e subestimei os efeitos do jet lag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resumo:&lt;/strong&gt; Novas issues abertas no GitFichas e dois PRs “fáceis” preparando a curadoria de projetos brasileiros para contribuir na Hacktoberfest 2025. Um dos PRs quebrou produção, o outro consertou o problema.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;No fim de semana passado implementei 6 esquemas de cores para o GitFichas, trazendo de volta a variedade visual que tornava as fichas originais desenhadas à mão especiais. Também melhorei as instruções do GitHub Copilot para ajudar contribuidores a terem melhores experiências assistidas por IA durante a Hacktoberfest. Apesar de uma agenda mais corrida devido à preparação para o Oktane, consegui fechar múltiplas issues enquanto migrava fichas em português e inglês para o novo formato Mermaid.&lt;/p&gt;

&lt;h2 id=&quot;trabalho-da-semana-passada&quot;&gt;Trabalho da semana passada&lt;/h2&gt;

&lt;p&gt;Entre trabalhar no estande da Auth0 for AI Agents e apresentar um workshop chamado “Auth-ing your GenAI” no Oktane, viajar cobrou seu preço. E eu nem comecei a falar sobre jet lag.&lt;/p&gt;

&lt;p&gt;Viajo para a costa oeste dos Estados Unidos o suficiente para saber que sempre vou acordar muito cedo e ir dormir muito tarde porque é uma conferência e sempre há outra conversa que não quero perder. Resumindo: acabei dormindo menos do que deveria essa semana.&lt;/p&gt;

&lt;p&gt;Dito isso, só fazia sentido que os planos para este fim de semana precisassem de algumas mudanças, principalmente porque precisava me recuperar da viagem antes de conseguir fazer algo útil. O único problema é que olhando para trás, percebi que provavelmente não descansei tanto quanto deveria antes de mexer em qualquer repositório. 😅&lt;/p&gt;

&lt;p&gt;Para o GitFichas, foquei apenas em criar novas issues. Durante a semana, antes do café da manhã um dia, abri mais de 50 issues para traduções para o espanhol já que agora temos suporte ao idioma. Todas as &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues?q=is%3Aissue%20state%3Aopen%20label%3Atranslation&quot;&gt;issues de tradução têm a tag translation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Com essas issues abertas, considero o GitFichas pronto para a Hacktoberfest. 🎉&lt;/p&gt;

&lt;p&gt;Falando em estar pronto para a Hacktoberfest, todos os PRs que fiz esse final de semana foram no &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io&quot;&gt;repositório deste blog&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/309&quot;&gt;PR #309&lt;/a&gt;:&lt;/strong&gt; Moveu os projetos do ano passado para sua própria pasta e criou a pasta 2025;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/310&quot;&gt;PR #310&lt;/a&gt;:&lt;/strong&gt; Contém a lista rascunho já que os repositórios, na hora de escrever isso, ainda precisam de revisão para que a lista possa ser publicada. Vou fazer isso logo depois de publicar este post;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/311&quot;&gt;PR #311&lt;/a&gt;:&lt;/strong&gt; Re-adiciona as versões passadas da lista como suas próprias collections, que por sinal chamei de “groupings” (agrupamentos) em todos os commits que fiz porque não conseguia lembrar da palavra “collections” (coleções)… &lt;em&gt;Falei que deveria ter descansado mais, num falei?.&lt;/em&gt; 👀&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;como-a-lista-começou&quot;&gt;Como a lista começou&lt;/h3&gt;

&lt;p&gt;Um pouco de contexto se você que acabou de chegar aqui: desde 2017 com a ajuda da comunidade dev brasileira eu faço a curadoria de uma lista de projetos brasileiros de código aberto.&lt;/p&gt;

&lt;p&gt;A lista começou no Medium e ficou lá pelas duas primeiras edições &lt;a href=&quot;https://medium.com/nossa-coletividad/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-4dc9b9b576c0&quot;&gt;em 2017&lt;/a&gt; e &lt;a href=&quot;https://medium.com/@jessicatemporal/projetos-brasileiros-para-contribuir-nesse-hacktoberfest-vers%C3%A3o-2018-4925959b9411&quot;&gt;em 2018&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Como eu queria que a comunidade pudesse contribuir com a lista, decidi mover a lista para o GitHub &lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-o-retorno/&quot;&gt;em 2019&lt;/a&gt; no meu próprio blog para facilitar para as pessoas contribuírem.&lt;/p&gt;

&lt;h3 id=&quot;mantendo-a-história&quot;&gt;Mantendo a história&lt;/h3&gt;

&lt;p&gt;Uma coisa que me incomodava na forma como eu estava estruturando os dados para a lista do Hacktoberfest entre 2019 e 2024, era que todo ano eu sobrescrevia a lista.&lt;/p&gt;

&lt;p&gt;Pra falar a verdade não era nada lá muito grave, o post da lista recebe visualizações principalmente no ano correspondente mesmo, mas ainda assim me incomodava, embora não o suficiente para consertar esse comportamento, pelo menos não até este ano.&lt;/p&gt;

&lt;p&gt;Por algum motivo, senti que 2025 merecia uma representação histórica adequada da lista, e agora se você navegar pelas listas dos anos anteriores, vai conseguir ver como a lista mudou. Essas são todas as listas passadas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/nossa-coletividad/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-4dc9b9b576c0&quot;&gt;2017&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/@jessicatemporal/projetos-brasileiros-para-contribuir-nesse-hacktoberfest-vers%C3%A3o-2018-4925959b9411&quot;&gt;2018&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-o-retorno&quot;&gt;2019&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2020&quot;&gt;2020&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2021&quot;&gt;2021&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-contribuir-hacktoberfest-2022&quot;&gt;2022&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/projetos-br-hacktoberfest-2023&quot;&gt;2023&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/projetos-br-hacktoberfest-2024&quot;&gt;2024&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;quebrando-produção-só-um-pouquinho&quot;&gt;Quebrando produção só um pouquinho&lt;/h3&gt;

&lt;p&gt;No meu cansaço cometi um pequeno erro.&lt;/p&gt;

&lt;p&gt;Veja bem, a lista funcionava baseada em uma única coleção: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_hacktoberfest_projects&lt;/code&gt;. Esta coleção então renderizava a lista no post com um código liquid que começava assim:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{% assign grouped = site.hacktoberfest_projects | group_by: &quot;principal_language&quot; %}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Eu copiei a lista original para a pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_hacktoberfest_projects_2025&lt;/code&gt; e para evitar confusão renomiei a pasta anterior para &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_hacktoberfest_projects_2024&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O pequeno problema disso: quando a pasta original de projetos não existia mais, o Jekyll não deu nenhum erro porém as versões anteriores da lista começaram a mostrar conteúdo vazio. Deveria haver uma lista de projetos antes da assinatura na imagem abaixo por exemplo.&lt;/p&gt;

&lt;center&gt;
&lt;img alt=&quot;Screenshot mostrando a página com conteúdo da lista de projetos faltando, mostrando apenas a assinatura na parte inferior&quot; src=&quot;/images/broken-build-with-missing-content.webp&quot; style=&quot;box-shadow: 4px 4px 4px rgba(51,51,51,0.57); border-radius: 8px; max-width: 80%; border: 1px solid #b6b6b6ff;&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Então o &lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/309&quot;&gt;PR #309&lt;/a&gt;&lt;/strong&gt; silenciosamente quebrou a produção já que eu, é claro, fiz merge do PR esquecendo dos anos anteriores.&lt;/p&gt;

&lt;p&gt;Então comecei a trabalhar neste post que você está lendo agora e queria dar o contexto das listas passadas, então percebi que as páginas não estavam mostrando o conteúdo de forma correta e foi assim que o &lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/311&quot;&gt;PR #311&lt;/a&gt;&lt;/strong&gt; surgiu.&lt;/p&gt;

&lt;h3 id=&quot;consertando-produção-com-um-pouco-de-trabalho&quot;&gt;Consertando produção com um pouco de trabalho&lt;/h3&gt;

&lt;p&gt;Agora eu precisava escolher um caminho e consertar o problema que a minha eu cansada criou:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Pegar o conteúdo de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_hacktoberfest_projects&lt;/code&gt; de antes do PR #309, e aplicar esse conteúdo para todas as listas antes de 2024 o que faria que elas ficassem todas iguais; ou&lt;/li&gt;
  &lt;li&gt;Pegar o conteúdo de cada ano e aplicar isso em um novo PR para que todas as listas tenham dados precisos para mostrar.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se você leu até aqui, provavelmente já sabe o que eu fiz. 👀&lt;/p&gt;

&lt;p&gt;Sim, escolhi a solução número 2.&lt;/p&gt;

&lt;p&gt;Na minha cabeça, a forma fácil de fazer isso era:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Escolher um commit depois de cada Hacktoberfest para pegar a pasta de projetos;&lt;/li&gt;
  &lt;li&gt;Copiar a pasta e adicionar isso ao meu branch de trabalho.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fácil né? O desafio se tornou encontrar um commit para cada período no qual eu pudesse “pular” para copiar a pasta. Então entrei na &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/commits/main&quot;&gt;lista de commits&lt;/a&gt; no GitHub e usei o botão de data para filtrar os commits:&lt;/p&gt;

&lt;center&gt;
&lt;img alt=&quot;Página de commits do GitHub mostrando interface de filtragem baseada em data para buscar commits dentro de períodos específicos&quot; src=&quot;/images/commits-search-based-on-date-on-github.webp&quot; style=&quot;max-width: 80%;&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;De lá escolhi um commit e pulei para ele:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git switch 73fb9b686218251be6f5b1770f0151150a664862 &lt;span class=&quot;nt&quot;&gt;--detach&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Então copiei a pasta e criei um stash com ela:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; _hacktoberfest_projects _hacktoberfest_projects_2019
git add _hacktoberfest_projects_2019
git stash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Voltei para o branch de trabalho e apliquei as mudanças do stash:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git switch hacktoberfest-projects-history
git stash pop
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Depois disso fiz as outras mudanças como atualizar os arquivos de configuração e posts anteriores e então finalmente fiz os commits necessários.&lt;/p&gt;

&lt;p&gt;Como não consegui pensar em uma forma melhor de fazer isso, repeti esse mesmo processo mais quatro vezes. Caso você tenha curiosidade, esses são os outros commits para os quais mudei:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git switch d4550d0c7f7ee492c334706749475d2235caec16 &lt;span class=&quot;nt&quot;&gt;--detach&lt;/span&gt;
git switch ad60ba9a1b950d521419e86cf5c7547b9b922827 &lt;span class=&quot;nt&quot;&gt;--detach&lt;/span&gt;
git switch 874b8f53cbe52e5c1d3f3832921c5d38b542dda1 &lt;span class=&quot;nt&quot;&gt;--detach&lt;/span&gt;
git switch d2fc775c9e02569b78a43391ab49330384ed26ab &lt;span class=&quot;nt&quot;&gt;--detach&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Provavelmente há uma forma mais fácil ou até mais inteligente de fazer isso, mas funcionou bem para a minha eu cansada de ontem e se tá funcionando você não mexe. Você pode ver todas as mudanças e commits no &lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/311&quot;&gt;PR #311&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;o-que-vem-por-aí&quot;&gt;O que vem por aí&lt;/h2&gt;

&lt;p&gt;Outubro começa esta semana, então no próximo fim de semana vou focar nos meus primeiros PRs para o Hacktoberfest, estes são os que estão na lista de prioridade:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/173&quot;&gt;Issue #173 no GitFichas&lt;/a&gt;: Gerar uma imagem de preview para cada um dos cards para facilitar o compartilhamento;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/pyladies/pyladiescon-portal/pull/166&quot;&gt;PR #166 no repositório do PyLadiesCon&lt;/a&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E eu sei que o PR #166 não conta para este Hacktoberfest, mas vai desbloquear outras contribuições, por isso quero dedicar um tempo a ele.&lt;/p&gt;

&lt;h2 id=&quot;junte-se-a-mim&quot;&gt;Junte-se a mim&lt;/h2&gt;

&lt;p&gt;Espero que este post também te inspire a aprender quando você precisa descansar e ajustar seus planos, mesmo que eu não ache que fiz isso particularmente bem desta vez. 😅&lt;/p&gt;

&lt;p&gt;Às vezes fazer uma pausa é tão importante quanto seguir em frente.&lt;/p&gt;

&lt;p&gt;Se você está procurando um projeto low-code para contribuir, o &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;GitFichas&lt;/a&gt; tem mais de 130 issues abertas agora. E se você precisar de ajuda com suas contribuições, &lt;a href=&quot;http://jtemporal.com/sociais/&quot;&gt;me mande uma mensagem em algum lugar&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https://hacktoberfest.com/&quot;&gt;Não esqueça de se registrar para a Hacktoberfest.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bom código! 🎉&lt;/p&gt;
</description>
        <pubDate>Mon, 29 Sep 2025 06:00:00 +0000</pubDate>
        <link>https://jtemporal.com/quarto-e-ultimo-fds-de-preptember-2025/</link>
        <guid isPermaLink="true">https://jtemporal.com/quarto-e-ultimo-fds-de-preptember-2025/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contribuições</category>
        
        <category>GitHub</category>
        
        <category>open source</category>
        
        <category>português</category>
        
        <category>preptember</category>
        
        
      </item>
    
      <item>
        <title>Preptember 2025 week 4: Final week is here, plans change and that&apos;s fine</title>
        <description>&lt;p&gt;The last weekend of preptember is here! I thought the previous weekend was different from the first two, but this one was different in a whole new way. I definitely overestimated my energy levels coming back from &lt;a href=&quot;https://www.okta.com/oktane/&quot;&gt;Oktane&lt;/a&gt; and underestimated the jet-lag effects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt; New issues open in GitFichas and two “easy” PRs preparing the curated list of Brazilian open source projects for Hacktoberfest 2025. One broke production, the other fixed the problem.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;Last weekend I implemented 6 color schemes for GitFichas, bringing back the visual variety that made the original hand-drawn cards special. I also improved the GitHub Copilot instructions to help contributors have better AI-assisted experiences during Hacktoberfest. Despite a busier schedule due to Oktane preparation, I managed to close multiple issues while migrating Portuguese and English cards to the new Mermaid format.&lt;/p&gt;

&lt;h2 id=&quot;past-weeks-work&quot;&gt;Past week’s work&lt;/h2&gt;

&lt;p&gt;Between staffing the Auth0 for AI Agents booth and presenting an awesome workshop called “Auth-ing your GenAI” at Oktane, traveling took its toll on me. And don’t even get me started on the jet lag.&lt;/p&gt;

&lt;p&gt;I travel to the west coast enough to know I’ll always wake up way too early and go to bed too late because it’s a conference and there’s always another conversation I don’t want to miss. Long story short: I ended up sleeping less than I should have this week.&lt;/p&gt;

&lt;p&gt;With that said, it only made sense that the plans for this weekend needed some changing, mainly because I needed to recover from the trip before I could make something useful. The only issue is that looking back, I noticed that I probably didn’t rest as much as I should have before touching any repo. 😅&lt;/p&gt;

&lt;p&gt;For GitFichas, I only focused on creating new issues. During the week, before breakfast one day, I opened over 50 issues for translations into Spanish since we can now support the language. All &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues?q=is%3Aissue%20state%3Aopen%20label%3Atranslation&quot;&gt;translation issues have the translation tag&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With these issues open, I consider GitFichas ready for Hacktoberfest. 🎉&lt;/p&gt;

&lt;p&gt;Speaking of being ready for Hacktoberfest, all PRs I made were on &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io&quot;&gt;this blog’s repository&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/309&quot;&gt;PR #309&lt;/a&gt;:&lt;/strong&gt; Moved the projects from last year into its own folder and created the 2025 folder;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/310&quot;&gt;PR #310&lt;/a&gt;:&lt;/strong&gt; Holds the draft list since the repositories, at the time of writing this, still require review so the list can be published. I will get to it right after publishing this one;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/311&quot;&gt;PR #311&lt;/a&gt;:&lt;/strong&gt; Re-adds the past versions of the list as their own collections, which by the way I called “groupings” in all commits I made because I couldn’t remember the word “collections”… &lt;em&gt;I told you I should’ve rested more.&lt;/em&gt; 👀&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;how-the-list-started&quot;&gt;How the list started&lt;/h3&gt;

&lt;p&gt;A little context if you are new here: since 2017 with the help of the Brazilian dev community I curate a list of Brazilian open source projects.&lt;/p&gt;

&lt;p&gt;The list started on Medium and stayed there for the first two editions &lt;a href=&quot;https://medium.com/nossa-coletividad/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-4dc9b9b576c0&quot;&gt;in 2017&lt;/a&gt; and &lt;a href=&quot;https://medium.com/@jessicatemporal/projetos-brasileiros-para-contribuir-nesse-hacktoberfest-vers%C3%A3o-2018-4925959b9411&quot;&gt;in 2018&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I ultimately wanted the community to be able to contribute to it, so I moved the list into GitHub &lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-o-retorno/&quot;&gt;in 2019&lt;/a&gt; under my own blog to make it easy for folks to contribute to it.&lt;/p&gt;

&lt;h3 id=&quot;keeping-the-history&quot;&gt;Keeping the history&lt;/h3&gt;

&lt;p&gt;One thing that made me unhappy with the way I was structuring the data for the Hacktoberfest list between 2019 and 2024 was that every year I would overwrite the list.&lt;/p&gt;

&lt;p&gt;Not too big of a deal if you ask me, the blog post mostly gets views in the corresponding year anyway, but it still bothered me, though not enough to fix it until this year.&lt;/p&gt;

&lt;p&gt;For some reason, I felt 2025 deserved a proper historical representation of the list, and now if you navigate to the previous years’ lists, you’ll get to see how the list changed.&lt;/p&gt;

&lt;p&gt;These are all the past lists:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/nossa-coletividad/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-4dc9b9b576c0&quot;&gt;2017&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/@jessicatemporal/projetos-brasileiros-para-contribuir-nesse-hacktoberfest-vers%C3%A3o-2018-4925959b9411&quot;&gt;2018&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-o-retorno&quot;&gt;2019&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2020&quot;&gt;2020&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2021&quot;&gt;2021&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-contribuir-hacktoberfest-2022&quot;&gt;2022&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/projetos-br-hacktoberfest-2023&quot;&gt;2023&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/projetos-br-hacktoberfest-2024&quot;&gt;2024&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;breaking-prod-just-a-little-bit&quot;&gt;Breaking prod just a little bit&lt;/h3&gt;

&lt;p&gt;In my tiredness I made a tiny mistake.&lt;/p&gt;

&lt;p&gt;You see, the list worked based on a single collection: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_hacktoberfest_projects&lt;/code&gt;. This collection would then render list on the post with a liquid code that started like this:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{% assign grouped = site.hacktoberfest_projects | group_by: &quot;principal_language&quot; %}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then I copied the original list into a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_hacktoberfest_projects_2025&lt;/code&gt; folder and to avoid confusion moved the previous folder into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_hacktoberfest_projects_2024&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The issue being: when the original projects folder no longer existed, Jekyll gave out zero errors and then previous versions of the list started to show empty content. There should be a list of projects before the signature on the image below.&lt;/p&gt;

&lt;center&gt;
&lt;img alt=&quot;Screenshot showing the page with missing project list content, showing only the signature at the bottom&quot; src=&quot;/images/broken-build-with-missing-content.webp&quot; style=&quot;box-shadow: 4px 4px 4px rgba(51,51,51,0.57); border-radius: 8px; max-width: 80%; border: 1px solid #b6b6b6ff;&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;So &lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/309&quot;&gt;PR #309&lt;/a&gt;&lt;/strong&gt; silently broke production since I, of course, merged the PR forgetting about the past years.&lt;/p&gt;

&lt;p&gt;I then started working on this blog post you are reading right now and wanted to give the context for past lists, so I noticed the broken pages and that is how &lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/311&quot;&gt;PR #311&lt;/a&gt;&lt;/strong&gt; came about.&lt;/p&gt;

&lt;h3 id=&quot;fixing-prod-with-some-work&quot;&gt;Fixing prod with some work&lt;/h3&gt;

&lt;p&gt;Now I had to pick a path and fix the problem of my own tired mind creation:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Pick the content from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_hacktoberfest_projects&lt;/code&gt; from before PR #309, and apply that so all lists before 2024 would look the same; or&lt;/li&gt;
  &lt;li&gt;Pick the content from each past year and apply that in a new PR so all lists will have accurate data to show.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you read until now, you can probably guess what I did. 👀&lt;/p&gt;

&lt;p&gt;Yep, I picked solution number 2.&lt;/p&gt;

&lt;p&gt;In my brain, the easy way to do this was to:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Pick a commit after each Hacktoberfest to grab the projects folder&lt;/li&gt;
  &lt;li&gt;Copy the folder and add that to my working branch&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Easy enough… The challenge became finding a commit in that period of time I could “jump into” to copy the folder from. So I got into the &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/commits/main&quot;&gt;commits list&lt;/a&gt; in GitHub and then used the date button to filter out the dates like this:&lt;/p&gt;

&lt;center&gt;
&lt;img alt=&quot;GitHub commits page showing date-based filtering interface to search for commits within specific time periods&quot; src=&quot;/images/commits-search-based-on-date-on-github.webp&quot; style=&quot;max-width: 80%;&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;From there I picked a commit and jumped into it:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git switch 73fb9b686218251be6f5b1770f0151150a664862 &lt;span class=&quot;nt&quot;&gt;--detach&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then copied the folder and created a stash with it:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; _hacktoberfest_projects _hacktoberfest_projects_2019
git add _hacktoberfest_projects_2019
git stash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then went back to the working branch and applied the changes from the stash:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git switch hacktoberfest-projects-history
git stash pop
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After that I made the other changes like updating the config files and previous posts and then finally made the necessary commits. Because I couldn’t think of a better way to do this, I repeated that same process four more times.&lt;/p&gt;

&lt;p&gt;In case you are curious these are the other commits I switched into:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git switch d4550d0c7f7ee492c334706749475d2235caec16 &lt;span class=&quot;nt&quot;&gt;--detach&lt;/span&gt;
git switch ad60ba9a1b950d521419e86cf5c7547b9b922827 &lt;span class=&quot;nt&quot;&gt;--detach&lt;/span&gt;
git switch 874b8f53cbe52e5c1d3f3832921c5d38b542dda1 &lt;span class=&quot;nt&quot;&gt;--detach&lt;/span&gt;
git switch d2fc775c9e02569b78a43391ab49330384ed26ab &lt;span class=&quot;nt&quot;&gt;--detach&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There’s probably an easier or even a smarter way to do this but this worked well for yesterday’s tired me and if it works you don’t mess with it. You can see all the changes and commits in &lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/311&quot;&gt;PR #311&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next&lt;/h2&gt;

&lt;p&gt;October starts this week, so next weekend I’ll be focusing on my first PRs for Hacktoberfest, these are the ones I plan on working on myself to start:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/173&quot;&gt;Issue #173 in GitFichas&lt;/a&gt;: Generating a preview image for each of the cards to make them easy to share;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/pyladies/pyladiescon-portal/pull/166&quot;&gt;PR #166 in the PyLadiesCon repository&lt;/a&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And I know the PR #166 doesn’t count for this Hacktoberfest but it will unblock others from contributing hence why I want to spend some time with it.&lt;/p&gt;

&lt;h2 id=&quot;join-me&quot;&gt;Join me&lt;/h2&gt;

&lt;p&gt;I hope this post also inspires you to learn when you need to rest and adjust your plans accordingly, even though I don’t think I did that particularly well this time around.&lt;/p&gt;

&lt;p&gt;Sometimes taking a pause is just as important as pushing forward.&lt;/p&gt;

&lt;p&gt;If you are looking for a low-code project to contribute to, &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;GitFichas&lt;/a&gt; has over 130 issues open right now. And if you need help with your contributions, &lt;a href=&quot;http://jtemporal.com/socials/&quot;&gt;drop me a note somewhere&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https://hacktoberfest.com/&quot;&gt;Don’t forget to register for Hacktoberfest.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Happy coding! 🎉&lt;/p&gt;
</description>
        <pubDate>Mon, 29 Sep 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/preptember-week-4-plans-change-brazilian-projects-list/</link>
        <guid isPermaLink="true">https://jtemporal.com/preptember-week-4-plans-change-brazilian-projects-list/</guid>
        
        <category>hacktoberfest</category>
        
        <category>ai</category>
        
        <category>git</category>
        
        <category>opensource</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contributions</category>
        
        <category>GitHub</category>
        
        <category>open source</category>
        
        <category>english</category>
        
        <category>preptember</category>
        
        
      </item>
    
      <item>
        <title>Terceiro fim de semana de Preptember 2025: Cores e IA no GitFichas</title>
        <description>&lt;p&gt;O final de semana três de Preptember chegou, mas este foi um pouco diferente dos finais de semana anteriores… Este fim de semana foi cheio de preparação para o &lt;a href=&quot;https://www.okta.com/oktane/&quot;&gt;Oktane&lt;/a&gt; já que vou apresentar um workshop por lá além de ajudar no estande da Auth0, então meu tempo foi mais limitado que o normal. Mesmo com tempo limitado ainda consegui fechar uma issue que estava na lista. 🎉🎉&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt; Um PR implementando os 6 esquemas de cores que apareciam nas fichas originais, além de algumas melhorias nas instruções do Copilot para melhores contribuições assistidas por IA.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;No fim de semana passado implementei suporte a múltiplos idiomas para o GitFichas com a ajuda do GitHub Copilot. O sistema agora é capaz de suportar qualquer idioma ao invés de apenas português e inglês, o que foi uma grande vitória para localização. Também fiz o Copilot revisar seu próprio trabalho pela primeira vez, o que foi uma experiência no mínimo curiosa, o Copilot até apontou documentação que precisava ser atualizada 👀&lt;/p&gt;

&lt;h2 id=&quot;o-que-foi-feito-neste-fim-de-semana&quot;&gt;O que foi feito neste fim de semana&lt;/h2&gt;

&lt;p&gt;Apesar da agenda mais corrida que o normal, consegui trabalhar em uma funcionalidade importante e fechar algumas issues.&lt;/p&gt;

&lt;h3 id=&quot;implementando-os-6-esquemas-de-cores&quot;&gt;Implementando os 6 esquemas de cores&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/209&quot;&gt;PR #209&lt;/a&gt;&lt;/strong&gt; fechou múltiplas issues de uma vez:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/63&quot;&gt;Issue #63&lt;/a&gt;: A issue principal para implementar diferentes esquemas de cores como eu costumava ter quando desenhava as fichas à mão;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/115&quot;&gt;Issues #115&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/114&quot;&gt;#114&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/113&quot;&gt;#113&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/112&quot;&gt;#112&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/110&quot;&gt;#110&lt;/a&gt;: Migração de fichas em português para formato Mermaid;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/162&quot;&gt;Issues #162&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/161&quot;&gt;#161&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/160&quot;&gt;#160&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/158&quot;&gt;#158&lt;/a&gt;: Migração adicional de fichas em inglês.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A implementação dos esquemas de cores traz de volta a variedade visual que tornava as fichas originais desenhadas à mão especiais. Agora cada ficha terá um dos 6 temas de cores diferentes:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Azul claro&lt;/li&gt;
  &lt;li&gt;Verde escuro&lt;/li&gt;
  &lt;li&gt;Roxo claro&lt;/li&gt;
  &lt;li&gt;Rosa&lt;/li&gt;
  &lt;li&gt;Roxo e rosa&lt;/li&gt;
  &lt;li&gt;Verde claro&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As cores são automaticamente atribuídas baseadas no número da ficha usando a operação módulo, então cada ficha tem uma aparência consistente, não importa quantas fichas tivermos.&lt;/p&gt;

&lt;p&gt;Cada esquema de cores é feito por um par de cores para que possamos ter subtítulos e pré-títulos em cores diferentes da cor principal do título, como nas imagens abaixo. No topo, a ficha original baseada em imagem, na parte inferior, a nova ficha gerada com Mermaid:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1758551570/gitfichas/IMG_0783_hr6q73.png&quot; alt=&quot;no topo a ficha original baseada em imagem, na parte inferior a nova ficha gerada com Mermaid&quot; style=&quot;box-shadow: 4px 4px 4px rgba(51,51,51,0.57); border-radius: 8px; max-width: 60%; border: 1px solid #b6b6b6ff; &quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Ao invés da cor única de antes:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1758551571/gitfichas/IMG_0781_b5by6k.jpg&quot; alt=&quot;tema de cores anterior do mermaid com apenas uma cor no título&quot; style=&quot;box-shadow: 4px 4px 4px rgba(51,51,51,0.57); border-radius: 8px; max-width: 60%; border: 1px solid #b6b6b6ff; &quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Você pode conferir todos os &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/3a23f984df5d9536ac6176f8367cb872d79c1b07/_includes/mermaid-graphs.html#L11-L29&quot;&gt;pares de cores neste arquivo&lt;/a&gt;. Você também pode ter notado que agora temos a borda na parte do título da ficha também. 🎉&lt;/p&gt;

&lt;h3 id=&quot;preparando-para-a-hacktoberfest-assistida-por-ia&quot;&gt;Preparando para a Hacktoberfest assistida por IA&lt;/h3&gt;

&lt;p&gt;Enquanto migrava as fichas, também aproveitei a oportunidade para melhorar as &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/main/.github/copilot-instructions.md&quot;&gt;instruções do GitHub Copilot&lt;/a&gt;. Com ferramentas de IA se tornando parte do fluxo de desenvolvimento, quero ajudar as pessoas contribuidoras a terem a melhor experiência possível ao usar essas ferramentas para também tornar seus PRs para o GitFichas melhores.&lt;/p&gt;

&lt;p&gt;As melhorias focam em:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Melhor orientação para geração de diagramas Mermaid&lt;/li&gt;
  &lt;li&gt;Instruções mais claras para a migração de fichas desenhadas à mão para Mermaid&lt;/li&gt;
  &lt;li&gt;Exemplos mais específicos de como lidar com casos extremos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eu espero um uso massivo de ferramentas de IA durante este Hacktoberfest, então acertar essas instruções agora vai ajudar todo mundo a ter sucesso, incluindo eu mesma já que vou estar do lado recebendo as contribuições e reviso cada PR pessoalmente mesmo quando peço para o copilot revisar primeiro.&lt;/p&gt;

&lt;p&gt;Usar IA para revisar PRs pode acelerar o processo de revisão já que a IA vai pegar detalhes que meus olhos humanos podem perder. Como mantenedora eu vou então poder revisar as mudanças sugeridas e adicioná-las antes de fazer o merge se fizer sentido.&lt;/p&gt;

&lt;h2 id=&quot;o-que-vem-por-aí&quot;&gt;O que vem por aí&lt;/h2&gt;

&lt;p&gt;Com apenas mais um fim de semana até outubro chegar, estou chegando perto dos preparativos finais do preptember. No próximo fim de semana vou focar em:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/173&quot;&gt;Issue #173 no GitFichas&lt;/a&gt;: Gerar uma imagem de preview para cada uma das fichas para torná-las fáceis de compartilhar;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/pyladies/pyladiescon-portal&quot;&gt;PR #166 no repositório PyLadiesCon&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;Abrir novas issues para traduções em espanhol e talvez até francês;&lt;/li&gt;
  &lt;li&gt;E finalmente, revisar e criar a lista de projetos open source brasileiros que faço todo ano.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitFichas está quase pronto para a chegada do Hacktoberfest!&lt;/p&gt;

&lt;h2 id=&quot;preparação-para-o-workshop-do-oktane&quot;&gt;Preparação para o workshop do Oktane&lt;/h2&gt;

&lt;p&gt;Falando em estar ocupada, a maior parte deste fim de semana foi investida me preparando para minha viagem ao Oktane, não só fazendo uma revisão final e ensaios do workshop que vou apresentar mas também garantindo que as roupas estejam prontas para fazer as malas e sim &lt;a href=&quot;https://jtemporal.com/sete-dicas-para-viajar-com-tranquilidade/&quot;&gt;ainda sigo minhas próprias dicas de viagem&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;É sempre empolgante compartilhar conhecimento com a comunidade, mesmo quando isso significa menos tempo para projetos pessoais. Como developer advocate eu amo encontrar pessoas desenvolvedoras onde elas estão e tanto palestras quanto trabalho open source, ao meu ver, são partes importantes de retribuir para a comunidade.&lt;/p&gt;

&lt;h2 id=&quot;bora-lá&quot;&gt;Bora lá&lt;/h2&gt;

&lt;p&gt;Como sempre, se você está planejando contribuir com open source durante o Hacktoberfest, agora é a hora de começar a explorar projetos e se familiarizar com seus processos de contribuição.&lt;/p&gt;

&lt;p&gt;Você sabia que a inscrição para o Hacktoberfest 2025 já está aberta? Você pode se inscrever agora mas vale lembrar que os pull requests só vão contar se feitos durante o mês de outubro. Eu já me inscrevi. 👇&lt;/p&gt;

&lt;center&gt;
&lt;img alt=&quot;perfil do hacktoberfest da jtemporal criado&quot; src=&quot;/images/jtemporal-hacktoberfest-profile-created.webp&quot; style=&quot;max-width: 60%; border-radius: 8px; box-shadow: 4px 4px 4px rgba(51, 51, 51, 0.57);&quot; /&gt;
&lt;/center&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https://hacktoberfest.com/&quot;&gt;Então vai se inscrever também!&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;GitFichas&lt;/a&gt; está esperando suas contribuições! E se você precisar de ajuda para começar sua jornada nesse Hacktoberfest, &lt;a href=&quot;http://jtemporal.com/sociais/&quot;&gt;entre em contato através de qualquer um das redes sociais&lt;/a&gt; na web.&lt;/p&gt;
</description>
        <pubDate>Mon, 22 Sep 2025 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/terceiro-fim-de-semana-preptember-2025/</link>
        <guid isPermaLink="true">https://jtemporal.com/terceiro-fim-de-semana-preptember-2025/</guid>
        
        <category>open source</category>
        
        <category>hacktoberfest</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contribuições</category>
        
        <category>open-source</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>português</category>
        
        <category>preptember</category>
        
        
      </item>
    
      <item>
        <title>Preptember 2025 week 3: Color schemes and Copilot improvements in GitFichas</title>
        <description>&lt;p&gt;Weekend 3 of preptember is here and this one was a bit different from the previous weekends… This weekend was packed with preparation for &lt;a href=&quot;https://www.okta.com/oktane/&quot;&gt;Oktane&lt;/a&gt; where I’ll be presenting a workshop, so my time was more limited than usual. But I still managed to close an issue that was on the list. 🎉🎉&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt; One PR implementing 6 color schemes so cards can look a little bit different from each other, plus some improvements to the Copilot instructions for better AI-assisted contributions.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;Last weekend I implemented multi-language support for GitFichas with GitHub Copilot’s help. The site is now able to support any number of languages instead of just Portuguese and English, which was a big win for localization. I also had Copilot review its own work for the first time, which was quite the experience specially when it called out documentation that needed updating 👀&lt;/p&gt;

&lt;h2 id=&quot;this-weekends-work&quot;&gt;This weekend’s work&lt;/h2&gt;

&lt;p&gt;Despite the busier than usual schedule as I was preparing for Oktane, this weekend a few issues were closed.&lt;/p&gt;

&lt;h3 id=&quot;implementing-the-6-color-schemes&quot;&gt;Implementing the 6 color schemes&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/209&quot;&gt;PR #209&lt;/a&gt;&lt;/strong&gt; closed multiple issues at once:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/63&quot;&gt;Issue #63&lt;/a&gt;: This was the main goal for the weekend. Implementing different color schemes like I used to have when I was hand-drawing the cards;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/115&quot;&gt;Issues #115&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/114&quot;&gt;#114&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/113&quot;&gt;#113&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/112&quot;&gt;#112&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/110&quot;&gt;#110&lt;/a&gt;: Migrating some Portuguese cards to Mermaid format in order to show off the cycling colors;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/162&quot;&gt;Issues #162&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/161&quot;&gt;#161&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/160&quot;&gt;#160&lt;/a&gt;, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/158&quot;&gt;#158&lt;/a&gt;: Additional English cards migration also to show off the new colors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The color scheme implementation brings back the visual variety that made the original hand-drawn cards special. Now each card has one of 6 different color themes:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Light Blue&lt;/li&gt;
  &lt;li&gt;Dark Green&lt;/li&gt;
  &lt;li&gt;Light Purple&lt;/li&gt;
  &lt;li&gt;Pink/Rose&lt;/li&gt;
  &lt;li&gt;Purple and Pink&lt;/li&gt;
  &lt;li&gt;Light Green&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The colors are automatically assigned based on the card number using the modulo operation, so each card gets a consistent appearance no matter how many builds we have.&lt;/p&gt;

&lt;p&gt;Each color scheme is made by a color pair so we can have subtitles and pretitles in a different color from the main title color like the ones below, at the top the original image based card, at the bottom the new Mermaid-powered card:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1758551570/gitfichas/IMG_0782_whaaw8.png&quot; alt=&quot;at the top the original image based card, at the bottom the new Mermaid-powered card&quot; style=&quot;box-shadow: 4px 4px 4px rgba(51,51,51,0.57); border-radius: 8px; max-width: 60%; border: 1px solid #b6b6b6ff; &quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Instead of the flat color from before:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1758551572/gitfichas/IMG_0778_qg1tqo.jpg&quot; alt=&quot;Previous mermaid title color scheme with only one color&quot; style=&quot;box-shadow: 4px 4px 4px rgba(51,51,51,0.57); border-radius: 8px; max-width: 60%; border: 1px solid #b6b6b6ff; &quot; /&gt;
&lt;/center&gt;

&lt;p&gt;You can check all the &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/3a23f984df5d9536ac6176f8367cb872d79c1b07/_includes/mermaid-graphs.html#L11-L29&quot;&gt;pairings in this file&lt;/a&gt;. You also may have noticed that we now have the border on the title portion of the card now as well. 🎉&lt;/p&gt;

&lt;h3 id=&quot;preparing-for-ai-assisted-hacktoberfest&quot;&gt;Preparing for AI-assisted Hacktoberfest&lt;/h3&gt;

&lt;p&gt;While migrating the cards, I also took the opportunity to improve the &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/main/.github/copilot-instructions.md&quot;&gt;GitHub Copilot instructions&lt;/a&gt;. With AI tools becoming part of any development flow, I want to make sure contributors have the best possible experience when using these tools to also make their PRs to GitFichas.&lt;/p&gt;

&lt;p&gt;The improvements focus on:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Better guidance for Mermaid diagram generation&lt;/li&gt;
  &lt;li&gt;Clearer instructions for the migration from hand-drawn cards to Mermaid ones&lt;/li&gt;
  &lt;li&gt;More specific examples of how to handle edge cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m expecting a massive use of AI tools during this year’s Hacktoberfest, so getting these instructions right now will help everyone succeed, including me since I’ll be on the receiving end of the contributions and I review every PR myself even when I ask copilot to review it first.&lt;/p&gt;

&lt;p&gt;Using AI to review PRs can speed the review process as AI will catch details my human eyes might miss. As a maintainer I’ll then be able to review the suggested changes and add those in before merging if it makes sense.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next&lt;/h2&gt;

&lt;p&gt;With only one weekend until October arrive, I’m getting close to the final preptember preparations. Next weekend I’ll be focusing on:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/173&quot;&gt;Issue #173 in GitFichas&lt;/a&gt;: Generating a preview image for each of the cards to make them easy to share;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/pyladies/pyladiescon-portal&quot;&gt;PR #166 in the PyLadiesCon repository&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;Open new issues for translations into Spanish and maybe French;&lt;/li&gt;
  &lt;li&gt;And finally, review and create the list of Brazilian open source projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitFichas is almost ready for Hacktoberfest!&lt;/p&gt;

&lt;h2 id=&quot;oktane-workshop-prep&quot;&gt;Oktane workshop prep&lt;/h2&gt;

&lt;p&gt;Speaking of being busy, most of this weekend was spent preparing for my trip to Oktane, not only doing a final review and rehearsals of the workshop I’m presenting but also making sure the clothes are ready for packing and yes &lt;a href=&quot;https://jtemporal.com/seven-tips-for-traveling-with-ease/&quot;&gt;I still follow my own traveling tips&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s always exciting to share knowledge with the community, even when it means less time for side projects. As a developer advocate, I love meeting developers where they are and both speaking at conferences and open source work are important parts of giving back to the community for me.&lt;/p&gt;

&lt;h2 id=&quot;join-me&quot;&gt;Join me&lt;/h2&gt;

&lt;p&gt;As always, if you’re planning to contribute to open source during Hacktoberfest, now’s the time to start exploring projects and getting familiar with their contribution processes.&lt;/p&gt;

&lt;p&gt;Did you know that the registration for Hacktoberfest 2025 is already open? You can register now but it is worth reminding that the pull requests will only count during the month of October. I’m already registered. 👇&lt;/p&gt;

&lt;center&gt;
&lt;img alt=&quot;jtemporal hacktoberfest profile created&quot; src=&quot;/images/jtemporal-hacktoberfest-profile-created.webp&quot; style=&quot;max-width: 60%; border-radius: 8px; box-shadow: 4px 4px 4px rgba(51, 51, 51, 0.57);&quot; /&gt;
&lt;/center&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https://hacktoberfest.com/&quot;&gt;So go register too!&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;GitFichas&lt;/a&gt; is ready and waiting for your contributions! And if you need help getting started with your Hacktoberfest journey, &lt;a href=&quot;http://jtemporal.com/socials/&quot;&gt;reach out through any of my social profiles&lt;/a&gt; on the web.&lt;/p&gt;

&lt;p&gt;Happy coding! 🎉&lt;/p&gt;
</description>
        <pubDate>Mon, 22 Sep 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/preptember-week-3-gitfichas-color-schemes/</link>
        <guid isPermaLink="true">https://jtemporal.com/preptember-week-3-gitfichas-color-schemes/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contributions</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>english</category>
        
        <category>preptember</category>
        
        
      </item>
    
      <item>
        <title>Segundo fim de semana de Preptember 2025: GitFichas trilingüe</title>
        <description>&lt;p&gt;Pois é, já estamos no meio de setembro e aqui está meu relatório da segunda semana do &lt;em&gt;preptember&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt; PR grande para fechar a issue de suporte a idiomas no GitFichas e mais alguns PRs menores.&lt;/p&gt;

&lt;p&gt;Finalmente atualizei o suporte a idiomas com a ajuda do GitHub Copilot em modo Agent e agora o GitFichas é capaz de suportar múltiplos idiomas ao invés de apenas português e inglês, então uma grande vitória para localização.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Si hablas español…&lt;/em&gt; estamos procurando contribuições em traduções para espanhol. Se você fala outros idiomas eles também são bem-vindos!&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Na semana passada comecei o preptember corrigindo um problema grande no GitFichas onde os gráficos Mermaid não estavam renderizando corretamente no navegador. A solução foi mudar de renderização no lado do cliente para pré-gerar arquivos SVG usando a CLI do Mermaid.&lt;/p&gt;

&lt;p&gt;Também adicionei várias funcionalidades novas incluindo um script de configuração com um comando só, instruções do GitHub Copilot para contribuidores, geração automática de SVG e documentação melhorada. O objetivo era preparar o GitFichas para o influxo de contribuições do Hacktoberfest tornando-o mais acolhedor e fácil de contribuir.&lt;/p&gt;

&lt;h2 id=&quot;issues-fechadas-e-pull-requests-feitos&quot;&gt;Issues fechadas e pull requests feitos&lt;/h2&gt;

&lt;p&gt;Esta é a lista do trabalho feito nesse final de semana:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/204&quot;&gt;Issue #204&lt;/a&gt;: Atualizar a seleção de idioma;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/205&quot;&gt;PR #205&lt;/a&gt;: Este PR implementou o suporte a múltiplos idiomas e fechou a issue acima 🎉&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/207&quot;&gt;PR #207&lt;/a&gt;: que atualizou o conteúdo da página de contato em português e inglês;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/206&quot;&gt;PR #206&lt;/a&gt;: Corrigiu um pequeno erro de lógica introduzido em um PR de fim de semana anterior para a renderização mermaid no navegador.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/208&quot;&gt;PR #208&lt;/a&gt;: Ajustes de renderização de fichas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Senta que lá vem história…&lt;/p&gt;

&lt;h3 id=&quot;usando-copilot-em-modo-agent-e-vibe-coding&quot;&gt;Usando Copilot em modo Agent e vibe coding&lt;/h3&gt;

&lt;p&gt;Pela primeira vez eu fiz o Copilot não apenas fazer a maior parte do trabalho mas também revisando seu próprio trabalho em um PR.&lt;/p&gt;

&lt;p&gt;Não sou muito fã de &lt;em&gt;vibe coding&lt;/em&gt;, não consigo simplesmente apertar “Keep” para todas as mudanças que a IA faz e não pensar duas vezes antes de fazer commit. Minha cabeça não aceita isso.&lt;/p&gt;

&lt;p&gt;Mas o mais próximo que chego de &lt;em&gt;vibe coding&lt;/em&gt; é pedir para a IA fazer algo e depois revisar, dar feedback específico sobre o que não está funcionando e pedir para corrigir o que está quebrado. Esse tipo de processo funciona bem mas definitivamente não é tão rápido quanto aceitar cegamente qualquer output que eu receba.&lt;/p&gt;

&lt;p&gt;Mesmo assim, os PRs que coloquei no ar esse final de semana me tomaram cerca de 6 horas de trabalho sem foco. Se eu tivesse sido mais focada, provavelmente teria levado 4 horas, mas é fim de semana né?!&lt;/p&gt;

&lt;p&gt;Posso dizer com certeza absoluta que sem nenhuma ajuda de IA, entre escrever código novo, refatorar código pré-existente, testar, fazer preview de deployments, ajustes e casos de borda esquecidos, isso provavelmente me tomaria cerca de dois dias para finalizar.&lt;/p&gt;

&lt;p&gt;Não só isso, provavelmente significaria que o deploy pra produção teria que esperar até o próximo fim de semana para ir ao ar já que eu gostaria de ter mais tempo para revisar meu próprio trabalho antes de fazer o merge do pull request.&lt;/p&gt;

&lt;h3 id=&quot;usando-copilot-como-revisor-de-pull-requests&quot;&gt;Usando Copilot como revisor de pull requests&lt;/h3&gt;

&lt;p&gt;E falando de revisão, esta foi a primeira vez que tive o Copilot fazendo a revisão para mim e foi &lt;em&gt;interessante&lt;/em&gt; para dizer o mínimo.&lt;/p&gt;

&lt;p&gt;Ele chamou minha atenção para a documentação que esqueci de atualizar, assim como para o fato de que meu PR não seguia as diretrizes do projeto. 😂&lt;/p&gt;

&lt;p&gt;Deixa eu explicar. Até agora o GitFichas tinha suporte apenas para duas linguagens faladas: português e inglês. E a forma como a localização estava implementada não permitia que outras traduções fossem facilmente adicionadas. Então parte da documentação do projeto deixava claro que o conteúdo do site estava apenas nessas duas linguagens iniciais.&lt;/p&gt;

&lt;p&gt;Então definitivamente &lt;em&gt;sorri&lt;/em&gt; quando o &lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/205#discussion_r2347005159&quot;&gt;Copilot apontou que meu PR&lt;/a&gt; estava indo contra as próprias diretrizes do projeto de suportar apenas português e inglês.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/copilot-review-identifies-pr-going-against-the-projects-guidelines.webp&quot; alt=&quot;Screenshot of GitHub Copilot review comment identifying that the PR goes against project guidelines by adding support for languages other than Portuguese and English&quot; style=&quot;box-shadow: 4px 4px 4px rgba(51, 51, 51, 0.57); border-radius: 8px; border: 1px solid #b6b6b6ff;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Esse comentário serviu como um lembrete bem colocado para não apenas atualizar a documentação (o que fiz &lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/205#discussion_r2347005149&quot;&gt;motivada por outro comentário similar&lt;/a&gt;) mas também as instruções do Copilot já que elas são usadas nas revisões além do chat no VS Code.&lt;/p&gt;

&lt;h2 id=&quot;próximos-passos&quot;&gt;Próximos passos&lt;/h2&gt;

&lt;p&gt;A lista de issues para os próximos fins de semana é a seguinte:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/173&quot;&gt;Issue #173 no GitFichas&lt;/a&gt;: Gerar uma imagem de preview para cada um dos cards para facilitar o compartilhamento&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/63&quot;&gt;Issue #63 no GitFichas&lt;/a&gt;: Criar temas diferentes para que cada card pareça um pouco diferente dos outros&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Também planejo voltar aos pull requests que deixei de lado durante o ano.&lt;/p&gt;

&lt;p&gt;Em particular o &lt;a href=&quot;https://github.com/pyladies/pyladiescon-portal&quot;&gt;#166 no repositório do PyLadiesCon&lt;/a&gt;. &lt;a href=&quot;https://mariatta.ca/&quot;&gt;Mariatta&lt;/a&gt; se você estiver lendo isso: &lt;em&gt;sinto muito a demora para voltar a ele&lt;/em&gt;, no próximo fim de semana vou resolver os conflitos para podermos fazer o merge.&lt;/p&gt;

&lt;p&gt;Nota à parte: Você viu &lt;a href=&quot;https://github.com/pulls&quot;&gt;sua lista de pull requests ultimamente&lt;/a&gt;? A minha parece que nunca chega a zero. 😂&lt;/p&gt;

&lt;h2 id=&quot;vamos-juntos&quot;&gt;Vamos juntos&lt;/h2&gt;

&lt;p&gt;Se você está pensando em contribuir para open source durante o Hacktoberfest, comece a procurar possíveis projetos para os quais quer contribuir. Faça uma lista de projetos, fork e clone os repos, confira os guias de contribuição e comece a se preparar porque outubro está quase aqui.&lt;/p&gt;

&lt;p&gt;Como sempre, &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;confira o GitFichas no GitHub&lt;/a&gt; e se precisar de ajuda com suas contribuições &lt;a href=&quot;http://jtemporal.com/sociais/&quot;&gt;me mande uma mensagem em um dos muitos lugares sociais por aí&lt;/a&gt;! 🎉&lt;/p&gt;
</description>
        <pubDate>Mon, 15 Sep 2025 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/segundo-fim-de-semana-2-preptember-2025/</link>
        <guid isPermaLink="true">https://jtemporal.com/segundo-fim-de-semana-2-preptember-2025/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contribuições</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>código aberto</category>
        
        <category>português</category>
        
        <category>preptember</category>
        
        
      </item>
    
      <item>
        <title>Preptember 2025 week 2: GitFichas now supports multi-language</title>
        <description>&lt;p&gt;Yes, we’re already in the middle of September and here’s my week 2 &lt;em&gt;preptember&lt;/em&gt; report!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt; Big PR to close the language support issue on GitFichas and a couple of other minor PRs.&lt;/p&gt;

&lt;p&gt;I finally updated the language support with the help of GitHub Copilot in agent mode and now GitFichas is capable of supporting multiple languages instead of just Portuguese and English, so big win for localization.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Si hablas español…&lt;/em&gt; we are looking for contributions in translations to Spanish. If you speak other languages they are also welcome!&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;Last week I kicked off preptember by fixing a major issue with GitFichas where Mermaid charts weren’t rendering properly in the browser. The solution was to switch from client-side rendering to pre-generating SVG files using the Mermaid CLI.&lt;/p&gt;

&lt;p&gt;I also added several new features including a one-command setup script, GitHub Copilot instructions for contributors, automated SVG generation, and improved documentation. The goal was to prepare GitFichas for the influx of Hacktoberfest contributions by making it more welcoming and easier to contribute to.&lt;/p&gt;

&lt;h2 id=&quot;issues-closed-and-pull-requests-merged-this-weekend&quot;&gt;Issues closed and pull requests merged this weekend&lt;/h2&gt;

&lt;p&gt;This is the list of work done:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/204&quot;&gt;Issue #204&lt;/a&gt;: Update the language selection;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/205&quot;&gt;PR #205&lt;/a&gt;: This PR implemented the multi-language support and closed the issue above 🎉&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/207&quot;&gt;PR #207&lt;/a&gt;: which updated the content from the contact page in both Portuguese and English;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/206&quot;&gt;PR #206&lt;/a&gt;: Fixed a minor error in logic introduced in a previous weekend PR for the in browser mermaid rendering.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/208&quot;&gt;PR #208&lt;/a&gt;: Tiny rendering adjustments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now story time…&lt;/p&gt;

&lt;h3 id=&quot;using-copilot-and-vibe-coding-for-non-vibe-coders&quot;&gt;Using Copilot and vibe coding for non-vibe-coders&lt;/h3&gt;

&lt;p&gt;For the first time I had Copilot not only do the bulk of the work but also review its own work in a PR.&lt;/p&gt;

&lt;p&gt;I’m not much of a vibe coder, I can’t just simply say “Keep” to the changes AI makes and not bat an eye on it before committing. That’s just not me.&lt;/p&gt;

&lt;p&gt;But the closest I get is to ask the AI to do something and then review it, then provide specific feedback on what is not working, and ask it to fix what is broken. That type of process works well but is definitely not as fast as just blindly accepting whatever output I get.&lt;/p&gt;

&lt;p&gt;Nonetheless, the PRs I put in place this weekend took me about 6 hours of unfocused work. If I had been more focused, it probably would’ve taken me 4 hours, but it is a weekend after all.&lt;/p&gt;

&lt;p&gt;But I can say with complete certainty that without any AI help, between writing new code, refactoring pre-existing code, testing, preview deployments, adjustments, and forgotten edge cases, this would probably take me about two days to get it done.&lt;/p&gt;

&lt;p&gt;Not only that, it would probably mean that the production deployment would probably wait till next weekend to be deployed since I’d like to have more time to review my own work before shipping it.&lt;/p&gt;

&lt;h3 id=&quot;using-copilot-to-review-pull-requests&quot;&gt;Using Copilot to review pull requests&lt;/h3&gt;

&lt;p&gt;And speaking of review… This was the first time that I had Copilot do the review for me and it was &lt;em&gt;interesting&lt;/em&gt; to say the least.&lt;/p&gt;

&lt;p&gt;It called my attention to the documentation I forgot to update, as well to the fact that my PR did not follow the project guidelines. 😂&lt;/p&gt;

&lt;p&gt;Let me explain. So far GitFichas had only support for two spoken languages: Portuguese and English. And the way the localization was implemented it didn’t allow for any other translations to be easily added. So part of the project documentation made it clear that the content on the website was only in those two initial languages.&lt;/p&gt;

&lt;p&gt;So I definitely &lt;em&gt;smirked&lt;/em&gt; when &lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/205#discussion_r2347005159&quot;&gt;Copilot pointed out that my PR&lt;/a&gt; was going against the project’s own guidelines for only supporting Portuguese and English.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/copilot-review-identifies-pr-going-against-the-projects-guidelines.webp&quot; alt=&quot;Screenshot of GitHub Copilot review comment identifying that the PR goes against project guidelines by adding support for languages other than Portuguese and English&quot; style=&quot;box-shadow: 4px 4px 4px rgba(51, 51, 51, 0.57); border-radius: 8px; border: 1px solid #b6b6b6ff&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Anyways it served as a well-placed reminder to not only update the documentation (which I did &lt;a href=&quot;https://github.com/jtemporal/gitfichas/pull/205#discussion_r2347005149&quot;&gt;prompted by another similar comment&lt;/a&gt;) but also the Copilot instructions as they are used in the reviews.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next&lt;/h2&gt;

&lt;p&gt;The list of issues for next weekends is the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/173&quot;&gt;Issue #173 in GitFichas&lt;/a&gt;: Generating a preview image for each of the cards to make them easy to share&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/63&quot;&gt;Issue #63 in GitFichas&lt;/a&gt;: Creating different themes so that each card looks a little bit different from each other&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also plan on going back to pull requests I left unattended over the year.&lt;/p&gt;

&lt;p&gt;In particular the &lt;a href=&quot;https://github.com/pyladies/pyladiescon-portal&quot;&gt;#166 in the PyLadiesCon repository&lt;/a&gt;. &lt;a href=&quot;https://mariatta.ca/&quot;&gt;Mariatta&lt;/a&gt; if you are reading this: &lt;em&gt;I’m terribly sorry it took me this long to get back to it&lt;/em&gt;, next weekend I’ll get the conflicts resolved so we can merge it.&lt;/p&gt;

&lt;p&gt;Side note: Have you seen &lt;a href=&quot;https://github.com/pulls&quot;&gt;your list of pull requests lately&lt;/a&gt;? Mine seems to never reach zero. 😂&lt;/p&gt;

&lt;h2 id=&quot;join-me&quot;&gt;Join me&lt;/h2&gt;

&lt;p&gt;If you are thinking about contributing to open source during Hacktoberfest, start working now on figuring out possible projects you want to contribute to. Make a list of them, fork and clone the repos, check out the contribution guides, and start getting ready because October is fast approaching.&lt;/p&gt;

&lt;p&gt;As always, &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;check out GitFichas on GitHub&lt;/a&gt; and if you need help figuring out your contributions &lt;a href=&quot;http://jtemporal.com/socials/&quot;&gt;send me a note in one of the many social places out there&lt;/a&gt;! 🎉&lt;/p&gt;
</description>
        <pubDate>Mon, 15 Sep 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/preptember-week-2-gitfichas-multi-language-support/</link>
        <guid isPermaLink="true">https://jtemporal.com/preptember-week-2-gitfichas-multi-language-support/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contributions</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>english</category>
        
        <category>preptember</category>
        
        
      </item>
    
      <item>
        <title>How to Configure the Auth0 MCP Server in VS Code for AI Assistant Integration</title>
        <description>
</description>
        <pubDate>Mon, 08 Sep 2025 06:00:00 +0000</pubDate>
        <link>https://jtemporal.com/auth0-mcp-server-in-vscode-for-ai-assistant-integration/</link>
        <guid isPermaLink="true">https://jtemporal.com/auth0-mcp-server-in-vscode-for-ai-assistant-integration/</guid>
        
        <category>auth0</category>
        
        <category>mcp</category>
        
        <category>vscode</category>
        
        <category>ai</category>
        
        <category>english</category>
        
        <category>tutorial</category>
        
        
      </item>
    
      <item>
        <title>Primeiro fim de semana de preptember 2025</title>
        <description>&lt;p&gt;O Hacktoberfest está chegando, e durante este fim de semana decidi começar minhas tarefas de &lt;em&gt;preptember&lt;/em&gt;. Então essa é a história da semana 1 do preptember.&lt;/p&gt;

&lt;h2 id=&quot;o-que-é-preptember&quot;&gt;O que é Preptember?&lt;/h2&gt;

&lt;p&gt;Para quem não conhece o termo, “Preptember” é o mês antes do Hacktoberfest onde quem mantém projetos preparam seus repositórios para as contribuições que outubro traz. É sobre configurar seus projetos para serem mais acolhedores e mais fáceis de contribuir.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas-e-preptember&quot;&gt;GitFichas e Preptember&lt;/h2&gt;

&lt;p&gt;Desde que eu &lt;a href=&quot;https://jtemporal.com/gitfichas-agora-e-open-source/&quot;&gt;abri o código do GitFichas&lt;/a&gt; comecei a usar &lt;a href=&quot;https://mermaid.js.org/&quot;&gt;Mermaid&lt;/a&gt; para criar novas fichas de estudo, ele tinha um problema com a renderização adequada do conteúdo: os gráficos Mermaid às vezes falhavam ao renderizar corretamente no navegador no primeiro load da página, causando problemas de layout e tornando as fichas difíceis de ler. Então neste fim de semana o desafio foi corrigir esse problema.&lt;/p&gt;

&lt;p&gt;Não importava o que eu fizesse no CSS da geração das fichas, por algum motivo o problema não deixava de existir. Então pareceu natural começar a gerar SVGs ao invés de renderizar gráficos Mermaid no carregamento da página. Essa abordagem gera os diagramas como arquivos SVG estáticos, eliminando completamente os problemas de renderização no lado do cliente.&lt;/p&gt;

&lt;p&gt;Para gerar SVGs precisávamos de algumas atualizações na dinâmica de como geramos cada ficha de estudo usando o &lt;a href=&quot;https://github.com/mermaid-js/mermaid-cli&quot;&gt;Mermaid CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;novas-funcionalidades&quot;&gt;Novas funcionalidades&lt;/h2&gt;

&lt;p&gt;Como minha expectativa é usar esse hacktoberfest para terminar de migrar todas as fichas para a configuração Mermaid, algumas atualizações foram necessárias no repositório.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;🚀 Configuração com Um Comando:&lt;/strong&gt; Script de configuração para instalar todas as dependências necessárias, incluindo pacotes Node.js para o Mermaid CLI e Puppeteer para renderização de navegador headless.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;🤖 Instruções do GitHub Copilot:&lt;/strong&gt; Estamos afinal de contas na era da IA e espero que o Copilot nos ajude a fechar a maioria das issues abertas.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;🎨 Geração de SVG Mermaid:&lt;/strong&gt; Script para gerar SVG usando o Mermaid CLI para que possamos fazer tudo isso automaticamente.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;📚 Documentação Melhorada:&lt;/strong&gt; Atualizações nas diretrizes de contribuição e documentação para todas as novas partes móveis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;o-que-vem-por-aí&quot;&gt;O que vem por aí&lt;/h2&gt;

&lt;p&gt;Com essa base sólida, estou animada para ver o que a comunidade vai construir durante o Hacktoberfest. As &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues&quot;&gt;mais de 90 issues abertas&lt;/a&gt; ainda estão disponíveis e pessoalmente vou trabalhar em algumas das melhorias durante este mês para que o GitFichas esteja ainda melhor quando o Hacktoberfest chegar.&lt;/p&gt;

&lt;p&gt;Algumas das issues que vou atacar nos próximos finais de semana são:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/173&quot;&gt;Issue #173&lt;/a&gt;: Gerar uma imagem de preview para cada ficha para facilitar o compartilhamento&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/63&quot;&gt;Issue #63&lt;/a&gt;: Criar diferentes temas para que cada ficha pareça um pouco diferente um da outra&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/204&quot;&gt;Issue #204&lt;/a&gt;: Atualizar a seleção de idioma&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Espero conseguir trabalhar nessas issues durante os fins de semana daqui para frente. Elas serão desafiadoras mas estou confiante de que vão melhorar o GitFichas &lt;em&gt;muito&lt;/em&gt;. E para ser honesta, talvez eu comece com o seletor de idioma primeiro já que fiz parte desse refactor no meu site. 😂&lt;/p&gt;

&lt;h2 id=&quot;vem-comigo&quot;&gt;Vem comigo&lt;/h2&gt;

&lt;p&gt;O GitFichas sempre foi sobre aprendizado em comunidade, e agora o processo de contribuição combina ainda mais com esse espírito. Se você estava esperando o momento certo para contribuir com um projeto open source, ele chegou.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;Confira o GitFichas no GitHub&lt;/a&gt; e vamos criar a melhor coleção de fichas de estudo sobre Git! 🎉&lt;/p&gt;
</description>
        <pubDate>Mon, 08 Sep 2025 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/primeiro-fim-de-semana-de-preptember-2025/</link>
        <guid isPermaLink="true">https://jtemporal.com/primeiro-fim-de-semana-de-preptember-2025/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contribuições</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>código aberto</category>
        
        <category>português</category>
        
        <category>preptember</category>
        
        
      </item>
    
      <item>
        <title>First weekend of preptember 2025</title>
        <description>&lt;p&gt;Hacktoberfest is just around the corner, and over this weekend I decided to start my &lt;em&gt;preptember&lt;/em&gt; tasks. So this is the story of the week 1 of preptember.&lt;/p&gt;

&lt;h2 id=&quot;whats-preptember&quot;&gt;What’s Preptember?&lt;/h2&gt;

&lt;p&gt;For those new to the term, “Preptember” is the month before Hacktoberfest where maintainers prepare their repositories for the influx of contributions that October brings. It’s about setting up your project to be as welcoming and easy to contribute to as possible.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas-and-preptember&quot;&gt;GitFichas and Preptember&lt;/h2&gt;

&lt;p&gt;Since &lt;a href=&quot;https://jtemporal.com/gitfichas-is-now-open-source/&quot;&gt;open-sourcing GitFichas&lt;/a&gt; and starting to use &lt;a href=&quot;https://mermaid.js.org/&quot;&gt;Mermaid&lt;/a&gt; to build new study cards, it had an issue with properly displaying content. The Mermaid charts would sometimes fail to render correctly in the browser, causing layout issues and making the cards hard to read. So this weekend the challenge was to fix that issue.&lt;/p&gt;

&lt;p&gt;The problem was that no matter which way I worked on the CSS for the card generation it still couldn’t fix the issue. So it felt natural to start generating SVGs instead of rendering Mermaid charts on load. This approach pre-generates the diagrams as static SVG files, eliminating the client-side rendering issues entirely.&lt;/p&gt;

&lt;p&gt;In order to generate SVGs we needed some updates to the dynamic on how we generate each study card using the &lt;a href=&quot;https://github.com/mermaid-js/mermaid-cli&quot;&gt;Mermaid CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;new-features&quot;&gt;New features&lt;/h2&gt;

&lt;p&gt;Since my expectation is to use this hacktoberfest to finish migrating all study cards to the Mermaid setup, some updates were required to the repository.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;🚀 One-Command Setup:&lt;/strong&gt; Setup script to install all necessary dependencies, including Node.js packages for the Mermaid CLI and Puppeteer for headless browser rendering.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;🤖 GitHub Copilot Instructions:&lt;/strong&gt; We are after all in the AI time and I expect that Copilot will help us closing most of the open issues.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;🎨 Mermaid SVG Generation:&lt;/strong&gt; Script for generating SVG using the Mermaid CLI so we can do all of that automatically.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;📚 Improved Documentation:&lt;/strong&gt; Updates to contribution guidelines and documentation to all new moving parts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next&lt;/h2&gt;

&lt;p&gt;With the solid foundation, I’m excited to see what the community builds during Hacktoberfest. The &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues&quot;&gt;90+ open issues&lt;/a&gt; are still up for grabs and personally I’ll be working on some of the enhancements through this month so that GitFichas is even better by Hacktoberfest time.&lt;/p&gt;

&lt;p&gt;Some of the ones I’ll be tackling next weekend will be:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/173&quot;&gt;Issue #173&lt;/a&gt;: Generating a preview image for each of the card so easy to share&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/63&quot;&gt;Issue #63&lt;/a&gt;: Creating different themes so that each card looks a little bit different from each other&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/204&quot;&gt;Issue #204&lt;/a&gt;: Update the language selection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I expect I can work on these over the weekends moving forward. These will be challenging but I’m confident that they will improve GitFichas &lt;em&gt;a lot&lt;/em&gt;. And to be honest I might start with the language selector first. 😂&lt;/p&gt;

&lt;h2 id=&quot;join-me&quot;&gt;Join me&lt;/h2&gt;

&lt;p&gt;GitFichas has always been about community learning, and now the contribution process matches that spirit. If you’ve been waiting for the right moment to contribute to an open source project, this is it.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;Check out GitFichas on GitHub&lt;/a&gt; and join me in creating the best collection of Git study cards on the internet! 🎉&lt;/p&gt;
</description>
        <pubDate>Mon, 08 Sep 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/preptember-week-1-getting-ready-for-hacktoberfest-2025/</link>
        <guid isPermaLink="true">https://jtemporal.com/preptember-week-1-getting-ready-for-hacktoberfest-2025/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contributions</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>english</category>
        
        <category>preptember</category>
        
        
      </item>
    
      <item>
        <title>Configurando um servidor MCP Python local no VS Code</title>
        <description>&lt;p&gt;Servidores MCP (Model Context Protocol) estendem assistentes de IA com capacidades customizadas e acesso a recursos. Embora usar um servidor MCP no Claude Desktop seja fantástico para pesquisa geral e descoberta de conteúdo, há ainda mais valor em integrar essas mesmas ferramentas diretamente no seu ambiente de desenvolvimento.&lt;/p&gt;

&lt;p&gt;Como escrevo meus posts de blog em Markdown e os gerencio através do GitHub, ter o servidor MCP disponível direto no VS Code significa que posso buscar por conteúdo relacionado, verificar referências e manter consistência sem sair do meu editor.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/flowchart-mcp-server-blog-search.webp&quot; alt=&quot;Fluxograma do servidor MCP para busca no blog&quot; style=&quot;max-width:80%;display: block; margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Então vamos também configurar nosso MCP em uma IDE para melhorar nosso processo de escrita e edição.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Em &lt;a href=&quot;https://auth0.com/blog/build-python-mcp-server-for-blog-search/&quot;&gt;um post anterior&lt;/a&gt; criamos um servidor MCP com duas ferramentas:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;search_posts&lt;/code&gt;&lt;/strong&gt;: busca através de posts do blog usando SerpApi para encontrar conteúdo que corresponde a uma consulta específica&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_post_content&lt;/code&gt;&lt;/strong&gt;: recupera o conteúdo completo em markdown de um post específico pelo título&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este MCP de busca e recuperação de conteúdo do blog nos permite usar nosso assistente de IA para rapidamente encontrar e acessar informações do nosso blog, facilitando referenciar trabalhos anteriores e manter consistência entre posts.&lt;/p&gt;

&lt;p&gt;Naquele post anterior, construímos um servidor MCP Python que aproveita o SerpApi para buscas específicas no site e usa o padrão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; para indexar e recuperar conteúdo completo dos posts. O servidor permite integração perfeita entre assistentes de IA e conteúdo do blog, transformando seu blog em uma base de conhecimento pesquisável.&lt;/p&gt;

&lt;p&gt;Se você quer aprender mais sobre tool calling confira o vídeo abaixo ou &lt;a href=&quot;https://auth0.com/blog/genai-tool-calling-intro/&quot;&gt;este post no blog do trabalho&lt;/a&gt; (ambos em inglês).&lt;/p&gt;

&lt;center&gt;&lt;iframe width=&quot;100%&quot; height=&quot;420&quot; src=&quot;https://www.youtube.com/embed/r7wEinUG0ns&quot; title=&quot;Empowering AI Automation Securely - Tool Calling in AI Agents&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;

&lt;h2 id=&quot;servidores-mcp-no-vs-code&quot;&gt;Servidores MCP no VS Code&lt;/h2&gt;

&lt;p&gt;Se você navegar até a aba Extensions no VS Code, verá uma seção dedicada para servidores MCP. Esta integração traz o poder do Model Context Protocol diretamente para seu ambiente de desenvolvimento, permitindo que você aproveite ferramentas e capacidades customizadas enquanto programa, escreve ou gerencia seus projetos.&lt;/p&gt;

&lt;p&gt;A extensão MCP para VS Code detecta automaticamente servidores configurados e fornece uma interface perfeita para interagir com eles através do GitHub Copilot Chat. Isso significa que você pode acessar suas ferramentas customizadas sem sair do seu editor, tornando seu fluxo de trabalho mais eficiente e integrado.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/00-mcp-servers-list.webp&quot; alt=&quot;Seção de servidores MCP na aba Extensions do VS Code&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;pré-requisitos&quot;&gt;Pré-requisitos&lt;/h2&gt;

&lt;p&gt;Antes de começarmos, certifique-se de ter:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Python 3.8+&lt;/strong&gt; instalado no seu sistema&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;uv&lt;/strong&gt; package manager (&lt;a href=&quot;https://docs.astral.sh/uv/getting-started/installation/&quot;&gt;guia de instalação&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;VS Code&lt;/strong&gt; com a extensão GitHub Copilot habilitada&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Uma chave SerpApi&lt;/strong&gt; para funcionalidade de busca (&lt;a href=&quot;https://serpapi.com/&quot;&gt;obtenha uma aqui&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;configurar-seu-servidor-local&quot;&gt;Configurar seu servidor local&lt;/h2&gt;

&lt;p&gt;Antes de configurar o servidor MCP no VS Code, você precisará configurar o projeto localmente. Aqui estão os passos:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Clone o repositório:&lt;/strong&gt;
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone https://github.com/jtemporal/blog-search-mcp-in-python.git
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;blog-search-mcp-in-python
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Instale as dependências usando uv:&lt;/strong&gt;
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;uv &lt;span class=&quot;nb&quot;&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Configure seu ambiente:&lt;/strong&gt;
Crie um arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.config&lt;/code&gt; baseado no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.config.example&lt;/code&gt; com sua chave SerpAPI e URL do blog.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Teste o servidor:&lt;/strong&gt;
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;uv run src/server.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Uma vez que seu servidor esteja funcionando localmente, você tem tudo que precisa para integrá-lo com o VS Code.&lt;/p&gt;

&lt;h2 id=&quot;adicionando-a-configuração-mcp&quot;&gt;Adicionando a configuração MCP&lt;/h2&gt;

&lt;p&gt;Para adicionar seu servidor MCP ao VS Code, pressione &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cmd+Shift+P&lt;/code&gt; (Mac) ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl+Shift+P&lt;/code&gt; (Windows/Linux) para abrir a paleta de comandos, então digite “MCP” e selecione “MCP: Add Server” da lista. Isso abrirá o assistente de configuração MCP.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/01-mcp-install-in-vscode.webp&quot; alt=&quot;Iniciando configuração do servidor MCP no VS Code&quot; /&gt;&lt;/p&gt;

&lt;p&gt;O primeiro passo é escolher a camada de transporte. Para nosso servidor Python local, selecione “stdio” como método de transporte. Isso permite que o VS Code se comunique com seu servidor através de fluxos de entrada/saída padrão.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/02-pick-the-transport-layer.webp&quot; alt=&quot;Selecionando a camada de transporte stdio&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;adicionando-o-comando-para-executar-seu-mcp&quot;&gt;Adicionando o comando para executar seu MCP&lt;/h2&gt;

&lt;p&gt;Em seguida, você precisará especificar o comando que o VS Code deve usar para iniciar seu servidor MCP. Como nosso servidor tem dependências externas (SerpAPI), precisamos incluí-las no comando.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; O caminho exato para &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uv&lt;/code&gt; pode variar dependendo do seu método de instalação. Se você instalou via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip&lt;/code&gt;, pode estar em uma localização diferente. Você pode encontrar o caminho do seu uv executando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;which uv&lt;/code&gt; no seu terminal.&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~/.local/bin/uv run &lt;span class=&quot;nt&quot;&gt;--with&lt;/span&gt; google-search-results &lt;span class=&quot;nt&quot;&gt;--with&lt;/span&gt; mcp[cli] mcp run ~/caminho/para/repositorio/blog-search-mcp-in-python/src/server.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Certifique-se de substituir &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/caminho/para/repositorio/blog-search-mcp-in-python/&lt;/code&gt; pelo caminho real para seu repositório clonado.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/03-command-to-run-your-mcp.webp&quot; alt=&quot;Inserindo o comando para executar seu servidor MCP&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Após inserir o comando, dê ao seu servidor MCP um nome descritivo que ajudará você a identificá-lo na interface do VS Code.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/04-give-the-name-to-your-mcp.webp&quot; alt=&quot;Fornecendo um nome para seu servidor MCP&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;definir-onde-a-configuração-deve-ser-aplicada&quot;&gt;Definir onde a configuração deve ser aplicada&lt;/h2&gt;

&lt;p&gt;O VS Code perguntará onde salvar a configuração MCP. Você pode escolher entre aplicá-la globalmente (para todos os workspaces) ou apenas para o workspace atual.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/05-choose-workspace.webp&quot; alt=&quot;Escolhendo entre configuração workspace e global&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Seguindo o princípio do menor privilégio, é recomendado escolher “Workspace” ao invés de “Global”. Isso mantém a configuração limitada ao seu projeto atual e previne potenciais conflitos com outros projetos.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/06-trust-the-authors.webp&quot; alt=&quot;Confiando nos autores do servidor MCP&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Isso criará uma pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.vscode/&lt;/code&gt; se ela não existir no seu repositório, e criará um arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mcp.json&lt;/code&gt; correspondente com a configuração. Deve ficar parecido com isso:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;servers&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
		&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;jtemporal-blog-search&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;stdio&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;~/.local/bin/uv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;run&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;--with&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;google-search-results&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;--with&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;mcp[cli]&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;mcp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;run&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;~/projects/blog-search-mcp-in-python/src/server.py&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
		&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;inputs&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;executando-ações-mcp-diretamente-do-mcpjson&quot;&gt;Executando ações MCP diretamente do mcp.json&lt;/h2&gt;

&lt;p&gt;Uma vez configurado, você não apenas verá o arquivo de configuração, mas o VS Code também mostrará um menu inline dentro do arquivo. Isso fornece acesso rápido às operações comuns do servidor MCP.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/08-mcp-server-actions.webp&quot; alt=&quot;Ações do servidor MCP disponíveis no arquivo de configuração&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Se você selecionar o botão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;More...&lt;/code&gt; no menu inline, verá opções adicionais em um menu de diálogo que fornece operações mais avançadas para gerenciar seu servidor MCP.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/09-mcp-server-more-options.webp&quot; alt=&quot;Opções adicionais do servidor MCP no menu de diálogo&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;dicas-de-debugging&quot;&gt;Dicas de debugging&lt;/h2&gt;

&lt;p&gt;Se você selecionar “Show output” do menu do servidor MCP, será levado para a saída de log no painel inferior da janela do VS Code. Isso é inestimável para fazer debugging de problemas com seu servidor MCP.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/10-mcp-server-log.webp&quot; alt=&quot;Saída de log do servidor MCP para debugging&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Os logs mostrarão informações detalhadas sobre inicialização do servidor, chamadas de ferramentas e quaisquer erros que ocorram. Isso é particularmente útil quando desenvolvendo ou fazendo troubleshooting do seu servidor MCP.&lt;/p&gt;

&lt;p&gt;Se você configurar seu servidor incorretamente (por exemplo, se esquecer parte das flags &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--with&lt;/code&gt; no comando), verá uma mensagem de erro diretamente na interface do arquivo de configuração:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/11-mcp-error-menu.webp&quot; alt=&quot;Mensagem de erro quando servidor MCP está mal configurado&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Essas mensagens de erro inline facilitam identificar e corrigir problemas de configuração sem ter que procurar através de arquivos de log.&lt;/p&gt;

&lt;p&gt;Dito isso, se você não souber qual é o erro, também pode acessar os arquivos de log indo para o painel inferior na aba Output e selecionando o nome do servidor no menu dropdown:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/12-mcp-log-through-lower-panel.webp&quot; alt=&quot;Acessando logs do servidor MCP através do painel de output&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;encontrando-seu-servidor-mcp&quot;&gt;Encontrando seu servidor MCP&lt;/h2&gt;

&lt;p&gt;Agora volte para a aba Extensions e você deve ver seu servidor MCP listado na seção de servidores MCP assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/13-list-of-mcp-servers.webp&quot; alt=&quot;Seu servidor MCP listado na aba Extensions&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A partir daqui, você pode investigar os detalhes do servidor, ver suas ferramentas disponíveis e até ajustar sua configuração se necessário. Isso fornece uma localização centralizada para gerenciar todos os seus servidores MCP dentro do VS Code.&lt;/p&gt;

&lt;h2 id=&quot;usando-seu-servidor-mcp&quot;&gt;Usando seu servidor MCP&lt;/h2&gt;

&lt;p&gt;Todo esse trabalho de configuração é ótimo, mas o objetivo real é poder buscar conteúdo do seu blog em um cenário de chat direto no VS Code. Vamos colocar nosso servidor MCP para trabalhar fazendo uma busca através do GitHub Copilot Chat:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/14-tool-call.webp&quot; alt=&quot;Primeira chamada de ferramenta mostrando intenção de busca&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A interface mostra a ferramenta que está pretendendo chamar (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;search_posts&lt;/code&gt;) bem como os parâmetros de entrada—neste caso, o tópico sobre o qual queremos encontrar posts do blog. Essa transparência ajuda você a entender exatamente o que a IA está fazendo em seu nome.&lt;/p&gt;

&lt;p&gt;Agora tem um truque legal: normalmente você teria que pedir pelo conteúdo depois de obter os resultados da primeira chamada de ferramenta, mas se você estiver usando o GitHub Copilot no &lt;a href=&quot;https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode&quot;&gt;modo agente&lt;/a&gt;, o agente é realmente inteligente o suficiente para oferecer a execução de ferramentas adicionais para obter o conteúdo completo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/15-secondary-tool-call.webp&quot; alt=&quot;Chamada de ferramenta secundária para obter conteúdo completo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Desta vez mostra a função &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_post_content&lt;/code&gt; sendo chamada, com a descrição docstring e os parâmetros de entrada para recuperar o conteúdo específico.&lt;/p&gt;

&lt;p&gt;Finalmente, os resultados são exibidos no chat como qualquer outra interação de ferramenta seria:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/16-mcp-result-in-vscode.webp&quot; alt=&quot;Resultado MCP final exibido no chat do VS Code&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Essa integração perfeita significa que você pode buscar seu blog, recuperar conteúdo e incorporá-lo ao seu trabalho atual sem nunca sair do VS Code.&lt;/p&gt;

&lt;h2 id=&quot;considerações-de-segurança&quot;&gt;Considerações de segurança&lt;/h2&gt;

&lt;p&gt;Ao executar servidores MCP locais, mantenha essas melhores práticas de segurança em mente:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Configuração a nível de workspace&lt;/strong&gt;: Sempre escolha nível de workspace sobre configuração global para limitar exposição&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Revise dependências&lt;/strong&gt;: Certifique-se de confiar em todos os pacotes e dependências que seu servidor MCP usa&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Acesso à rede&lt;/strong&gt;: Esteja ciente de que servidores MCP podem fazer requisições de rede (como nossas chamadas SerpApi)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Acesso a arquivos&lt;/strong&gt;: Servidores MCP têm acesso a arquivos dentro do seu escopo configurado&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;aprendizados&quot;&gt;Aprendizados&lt;/h2&gt;

&lt;p&gt;Ter seu servidor MCP integrado diretamente no seu ambiente de desenvolvimento cria um fluxo de trabalho simplificado onde você pode buscar, referenciar e incorporar seu conteúdo existente sem mudança de contexto. Isso é particularmente valioso para criadores de conteúdo, escritores técnicos e pessoas desenvolvedoras que precisam manter consistência ao longo do seu trabalho.&lt;/p&gt;

&lt;p&gt;Não importa qual IDE você está usando, lembre-se desses passos:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Configuração local&lt;/strong&gt;: clone o repositório do seu servidor MCP e certifique-se de que todas as dependências estão propriamente instaladas usando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uv sync&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Configuração&lt;/strong&gt;: use a extensão MCP do VS Code para configurar seu servidor com o comando apropriado, incluindo todas as flags e dependências necessárias&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Gerenciamento de escopo&lt;/strong&gt;: escolha configuração a nível de workspace sobre global para seguir melhores práticas de segurança&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Debugging&lt;/strong&gt;: aproveite os recursos de logging e relatório de erro integrados para fazer troubleshooting de problemas&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A combinação de servidor MCP customizado com GitHub Copilot no modo agente ajudará você a manter seu estado de flow que como pessoas escrevem código é tudo que realmente queremos.&lt;/p&gt;

&lt;p&gt;Agora só preciso descobrir a melhor abordagem para ter esse servidor sem ter que clonar um repositório e configurá-lo manualmente, 🤔 mas isso acontecerá em um post futuro.&lt;/p&gt;
</description>
        <pubDate>Sun, 07 Sep 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/configurando-servidor-mcp-python-local-no-vscode/</link>
        <guid isPermaLink="true">https://jtemporal.com/configurando-servidor-mcp-python-local-no-vscode/</guid>
        
        <category>ai</category>
        
        <category>ai agents</category>
        
        <category>jekyll</category>
        
        <category>blog</category>
        
        <category>vs code</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Como criar um arquivo llms.txt no Jekyll e GitHub Pages</title>
        <description>&lt;p&gt;Você já quis deixar o conteúdo do seu blog mais acessível para sistemas de IA e LLMs (large language models)? Ou talvez você tenha se perguntado como fornecer uma versão “limpa” dos seus posts sem todos as tags do HTML?&lt;/p&gt;

&lt;p&gt;O arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; é a solução. Ele fornece uma forma padronizada para sites exporem seu conteúdo para sistemas de IA. E se você está usando Jekyll com GitHub Pages, pode criar esse arquivo automaticamente com apenas algumas linhas e um template Liquid.&lt;/p&gt;

&lt;p&gt;Se você acabou de começar a usar o Jekyll: ele é um gerador de sites estáticos escrito em Ruby que é perfeito para blogs especialmente quando usado no GitHub Pages. Você pode aprender mais sobre Jekyll e como começar a usa-lo neste outro post: &lt;a href=&quot;https://jtemporal.com/do-tema-ao-ar/&quot;&gt;Colocando um site no ar com Jekyll&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;o-que-é-o-llmstxt&quot;&gt;O que é o llms.txt&lt;/h2&gt;

&lt;p&gt;O arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; é um formato de texto simples projetado para tornar sites mais acessíveis para sistemas de IA e LLMs. Baseado na especificação do &lt;a href=&quot;http://llmstxt.org/&quot;&gt;llmstxt.org&lt;/a&gt;, ele fornece uma forma padronizada de expor o conteúdo do seu site em um formato legível pelas IAs que tanto usamos hoje em dia.&lt;/p&gt;

&lt;p&gt;A estrutura básica inclui:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Uma breve descrição do seu site&lt;/li&gt;
  &lt;li&gt;Informações importantes sobre seus projetos, serviços ou conteúdo&lt;/li&gt;
  &lt;li&gt;Links para páginas ou conteúdo importantes&lt;/li&gt;
  &lt;li&gt;Qualquer outra informação que você gostaria que sistemas de IA soubessem sobre seu site&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para um blog em Jekyll armazenado num repositório do GitHub, o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; é perfeito para fornecer aos LLMs acesso direto aos seus posts em seu formato Markdown original, tornando mais fácil para a IA entender e referenciar seu conteúdo com precisão.&lt;/p&gt;

&lt;h2 id=&quot;criando-um-arquivo-llmstxt&quot;&gt;Criando um arquivo llms.txt&lt;/h2&gt;

&lt;p&gt;Criar um arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; para seu site Jekyll é relativamente simples. Você criará um novo arquivo na raiz do seu projeto Jekyll e usar Liquid para gerar automaticamente o conteúdo.&lt;/p&gt;

&lt;p&gt;Esse é o passo a passo:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Criar o arquivo&lt;/strong&gt;: No diretório raiz do seu repositóeion, crie um novo arquivo chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Adicionar o template&lt;/strong&gt;: Use o seguinte template como ponto de partida:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-liquid highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;---
layout: null
---

# Feed LLM para jtemporal.com
_Gerado em: &lt;span class=&quot;cp&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;site&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;date_to_rfc822&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;}}&lt;/span&gt;_


## Todos os posts
Os links abaixo levam você ao conteúdo Markdown original.

&lt;span class=&quot;cp&quot;&gt;{%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;site&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;posts&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;%}&lt;/span&gt;- [&lt;span class=&quot;cp&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;}}&lt;/span&gt;](https://raw.githubusercontent.com/jtemporal/jtemporal.github.io/refs/heads/main/&lt;span class=&quot;cp&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;}}&lt;/span&gt;)
&lt;span class=&quot;cp&quot;&gt;{%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;endfor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Algumas coisas para prestar atenção:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;layout: null&lt;/code&gt; garante que o arquivo seja gerado como texto puro, não HTML&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{{ site.time | date_to_rfc822 }}&lt;/code&gt; adiciona um timestamp mostrando quando o arquivo foi gerado pela última vez&lt;/li&gt;
  &lt;li&gt;O loop &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{% for post in site.posts %}&lt;/code&gt; cria automaticamente uma lista de todos os seus posts do blog&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{{ post.path }}&lt;/code&gt; dá o caminho relativo para o arquivo Markdown de cada post&lt;/li&gt;
  &lt;li&gt;O formato de URL do GitHub raw permite acesso direto ao Markdown fonte&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O resultado gerado deve ser algo assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/llms-txt-jtemporal.webp&quot; alt=&quot;Screenshot da saída do llms.txt mostrando a lista gerada de posts do blog com links para arquivos Markdown raw&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;adicionar-llmstxt-ao-_configyml&quot;&gt;Adicionar llms.txt ao _config.yml&lt;/h2&gt;

&lt;p&gt;Na lista de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;includes&lt;/code&gt; no seu arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; adicione o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt;. Essa lista tem todos os arquivos que devem ser servidos com seu site uma vez que o build seja feito. A minha ficava assim antes:&lt;/p&gt;

&lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Include list
&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;include:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[.well-known, EnJtResume.pdf, folium]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E agora também tem o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; no final do array:&lt;/p&gt;
&lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Include list
&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;include:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[.well-known, EnJtResume.pdf, folium, llms.txt]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;testando-suas-alterações&quot;&gt;Testando suas alterações&lt;/h2&gt;

&lt;p&gt;Antes de fazer o deploy das suas alterações, é uma boa ideia testá-las localmente:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Faça o build do seu site localmente&lt;/strong&gt;:
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;jekyll build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Sirva seu site&lt;/strong&gt;:
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Verifique seu arquivo llms.txt&lt;/strong&gt;: Uma vez que seu site esteja rodando (geralmente em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:4000&lt;/code&gt;), navegue para &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:4000/llms.txt&lt;/code&gt; para ver seu arquivo gerado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Você deve ver um arquivo de texto puro com as informações do seu site e uma lista de todos os seus posts do blog com links para seu conteúdo Markdown raw no GitHub. Se tudo estiver funcionando, chegou a hora de fazer o deploy!&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Criar um arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; para seu site Jekyll é um processo simples de três passos:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Criar o arquivo&lt;/strong&gt;: Adicione &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; ao diretório raiz do seu Jekyll com o template Liquid&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Configurar o Jekyll&lt;/strong&gt;: Adicione &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; à lista &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;include&lt;/code&gt; no seu &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Buildar e fazer deploy&lt;/strong&gt;: Seu arquivo estará disponível em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;seusite.com/llms.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Essa abordagem mantém automaticamente seu arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; atualizado conforme você adiciona novos posts do blog, e fornece aos sistemas de IA acesso direto ao seu conteúdo em seu formato Markdown original. É uma ótima forma de tornar seu blog Jekyll mais acessível para o ecossistema crescente de ferramentas e serviços de IA.&lt;/p&gt;

&lt;p&gt;A melhor parte? Uma vez configurado, não requer manutenção alguma: o Jekyll cuida de tudo automaticamente quando você fizer um novo build do seu site!&lt;/p&gt;
</description>
        <pubDate>Sun, 31 Aug 2025 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/como-criar-um-arquivo-llms-txt-no-jekyll/</link>
        <guid isPermaLink="true">https://jtemporal.com/como-criar-um-arquivo-llms-txt-no-jekyll/</guid>
        
        <category>ia</category>
        
        <category>agentes de ia</category>
        
        <category>jekyll</category>
        
        <category>blog</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Configure a Local Python MCP Server in VS Code</title>
        <description>&lt;p&gt;MCP (Model Context Protocol) servers extend AI assistants with custom capabilities and resource access. While using an MCP server in Claude Desktop is fantastic for general research and content discovery, there’s even more value in integrating these same tools directly into your development environment.&lt;/p&gt;

&lt;p&gt;Since I write my blog posts in Markdown and manage them through GitHub, having the MCP server available right in VS Code means I can search for related content, fact-check references, and maintain consistency without leaving my editor.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/flowchart-mcp-server-blog-search.webp&quot; alt=&quot;MCP server blog search flowchart&quot; style=&quot;max-width:80%;display: block; margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So let’s also configure our MCP in an IDE to improve our writing and editing process.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;In &lt;a href=&quot;https://auth0.com/blog/build-python-mcp-server-for-blog-search/&quot;&gt;a previous blog post&lt;/a&gt; we created an MCP server with two tools:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;search_posts&lt;/code&gt;&lt;/strong&gt;: searches through blog posts using SerpAPI to find content matching a specific query&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_post_content&lt;/code&gt;&lt;/strong&gt;: retrieves the full markdown content of a specific blog post by title&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This blog search and content retrieval MCP allows us to use our AI assistant to quickly find and access information from our blog, making it easier to reference previous work and maintain consistency across posts.&lt;/p&gt;

&lt;p&gt;In that previous post, we built a Python MCP server that leverages SerpAPI for site-specific searches and uses the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; standard to index and retrieve full post content. The server enables seamless integration between AI assistants and blog content, turning your blog into a searchable knowledge base.&lt;/p&gt;

&lt;p&gt;If you want to learn more about tool calling checkout the video below or &lt;a href=&quot;https://auth0.com/blog/genai-tool-calling-intro/&quot;&gt;this blog post&lt;/a&gt;.&lt;/p&gt;

&lt;center&gt;&lt;iframe width=&quot;100%&quot; height=&quot;420&quot; src=&quot;https://www.youtube.com/embed/r7wEinUG0ns&quot; title=&quot;Empowering AI Automation Securely - Tool Calling in AI Agents&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;

&lt;h2 id=&quot;mcp-servers-in-vs-code&quot;&gt;MCP Servers in VS Code&lt;/h2&gt;

&lt;p&gt;If you navigate to the Extensions tab in VS Code, you’ll see a dedicated section for MCP servers. This integration brings the power of Model Context Protocol directly into your development environment, allowing you to leverage custom tools and capabilities while coding, writing, or managing your projects.&lt;/p&gt;

&lt;p&gt;The MCP extension for VS Code automatically detects configured servers and provides a seamless interface for interacting with them through GitHub Copilot Chat. This means you can access your custom tools without leaving your editor, making your workflow more efficient and integrated.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/00-mcp-servers-list.webp&quot; alt=&quot;MCP servers section in VS Code Extensions tab&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h2&gt;

&lt;p&gt;Before we begin, make sure you have:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Python 3.8+&lt;/strong&gt; installed on your system&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;uv&lt;/strong&gt; package manager (&lt;a href=&quot;https://docs.astral.sh/uv/getting-started/installation/&quot;&gt;installation guide&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;VS Code&lt;/strong&gt; with the GitHub Copilot extension enabled&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;A SerpAPI key&lt;/strong&gt; for search functionality (&lt;a href=&quot;https://serpapi.com/&quot;&gt;get one here&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;set-up-your-local-server&quot;&gt;Set Up Your Local Server&lt;/h2&gt;

&lt;p&gt;Before configuring the MCP server in VS Code, you’ll need to set up the project locally. Here are the steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Clone the repository:&lt;/strong&gt;
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone https://github.com/jtemporal/blog-search-mcp-in-python.git
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;blog-search-mcp-in-python
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Install dependencies using uv:&lt;/strong&gt;
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;uv &lt;span class=&quot;nb&quot;&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Configure your environment:&lt;/strong&gt;
Create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.config&lt;/code&gt; file based on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.config.example&lt;/code&gt; with your SerpAPI key and blog URL.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Test the server:&lt;/strong&gt;
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;uv run src/server.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once your server is working locally, you’re ready to integrate it with VS Code.&lt;/p&gt;

&lt;h2 id=&quot;adding-the-mcp-configuration&quot;&gt;Adding the MCP Configuration&lt;/h2&gt;

&lt;p&gt;To add your MCP server to VS Code, press &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cmd+Shift+P&lt;/code&gt; (Mac) or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl+Shift+P&lt;/code&gt; (Windows/Linux) to open the command palette, then type “MCP” and select “MCP: Add Server” from the list. This will launch the MCP configuration wizard.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/01-mcp-install-in-vscode.webp&quot; alt=&quot;Starting MCP server configuration in VS Code&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The first step is to choose the transport layer. For our local Python server, select “stdio” as the transport method. This allows VS Code to communicate with your server through standard input/output streams.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/02-pick-the-transport-layer.webp&quot; alt=&quot;Selecting the stdio transport layer&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;adding-the-command-to-run-your-mcp&quot;&gt;Adding the Command to Run Your MCP&lt;/h2&gt;

&lt;p&gt;Next, you’ll need to specify the command that VS Code should use to start your MCP server. Since our server has external dependencies (SerpAPI), we need to include them in the command.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The exact path to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uv&lt;/code&gt; may vary depending on your installation method. If you installed via pip, it might be in a different location. You can find your uv path by running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;which uv&lt;/code&gt; in your terminal.&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~/.local/bin/uv run &lt;span class=&quot;nt&quot;&gt;--with&lt;/span&gt; google-search-results &lt;span class=&quot;nt&quot;&gt;--with&lt;/span&gt; mcp[cli] mcp run ~/path/to/repository/blog-search-mcp-in-python/src/server.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Make sure to replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/path/to/repository/blog-search-mcp-in-python/&lt;/code&gt; with the actual path to your cloned repository.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/03-command-to-run-your-mcp.webp&quot; alt=&quot;Entering the command to run your MCP server&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After entering the command, give your MCP server a descriptive name that will help you identify it in the VS Code interface.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/04-give-the-name-to-your-mcp.webp&quot; alt=&quot;Providing a name for your MCP server&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;define-where-the-configuration-should-be-applied&quot;&gt;Define Where the Configuration Should Be Applied&lt;/h2&gt;

&lt;p&gt;VS Code will ask you where to save the MCP configuration. You can choose between applying it globally (for all workspaces) or just for the current workspace.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/05-choose-workspace.webp&quot; alt=&quot;Choosing between workspace and global configuration&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Following the principle of least privilege, it’s recommended to pick “Workspace” instead of global. This keeps the configuration scoped to your current project and prevents potential conflicts with other projects.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/06-trust-the-authors.webp&quot; alt=&quot;Trusting the authors of the MCP server&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This will create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.vscode/&lt;/code&gt; folder if it doesn’t already exist in your repository, and create a corresponding &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mcp.json&lt;/code&gt; file with the configuration. It should look something like this:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;servers&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
		&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;jtemporal-blog-search&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;stdio&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;~/.local/bin/uv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;run&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;--with&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;google-search-results&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;--with&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;mcp[cli]&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;mcp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;run&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;~/projects/blog-search-mcp-in-python/src/server.py&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
		&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;inputs&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;taking-mcp-action-directly-from-mcpjson&quot;&gt;Taking MCP Action Directly from mcp.json&lt;/h2&gt;

&lt;p&gt;Once configured, not only will you see the configuration file, but VS Code will also show you an inline menu within the file. This provides quick access to common MCP server operations.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/08-mcp-server-actions.webp&quot; alt=&quot;MCP server actions available in the configuration file&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you select the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;More...&lt;/code&gt; button on the inline menu, you’ll see additional options in a dialog menu that provides more advanced operations for managing your MCP server.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/09-mcp-server-more-options.webp&quot; alt=&quot;Additional MCP server options in the menu dialog&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;debugging-tips&quot;&gt;Debugging Tips&lt;/h2&gt;

&lt;p&gt;If you select “Show output” from the MCP server menu, you’ll be taken to the log output in the lower panel of the VS Code window. This is invaluable for debugging issues with your MCP server.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/10-mcp-server-log.webp&quot; alt=&quot;MCP server log output for debugging&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The logs will show you detailed information about server startup, tool calls, and any errors that occur. This is particularly useful when developing or troubleshooting your MCP server.&lt;/p&gt;

&lt;p&gt;If you improperly configure your server (for example, if you forget part of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--with&lt;/code&gt; flags in the command), you’ll see an error message directly in the configuration file interface:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/11-mcp-error-menu.webp&quot; alt=&quot;Error message when MCP server is misconfigured&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These inline error messages make it easy to spot and fix configuration issues without having to dig through log files.&lt;/p&gt;

&lt;p&gt;With that said, if you don’t know what the error is, you can also access the log files by going to the lower panel in the Output tab and selecting the name of the server in the dropdown menu:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/12-mcp-log-through-lower-panel.webp&quot; alt=&quot;Accessing MCP server logs through the output panel&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;finding-your-mcp-server&quot;&gt;Finding Your MCP Server&lt;/h2&gt;

&lt;p&gt;Now go back to the Extensions tab and you should see your MCP server listed in the MCP servers section like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/13-list-of-mcp-servers.webp&quot; alt=&quot;Your MCP server listed in the Extensions tab&quot; /&gt;&lt;/p&gt;

&lt;p&gt;From here, you can investigate the details of the server, view its available tools, and even adjust its configuration if necessary. This provides a centralized location to manage all your MCP servers within VS Code.&lt;/p&gt;

&lt;h2 id=&quot;using-your-mcp-server&quot;&gt;Using Your MCP Server&lt;/h2&gt;

&lt;p&gt;All of this setup work is great, but the real goal is to be able to search your blog content in a chat scenario right within VS Code. Let’s put our MCP server to work by doing a search through GitHub Copilot Chat:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/14-tool-call.webp&quot; alt=&quot;First tool call showing search intent&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The interface shows the tool it’s intending to call (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;search_posts&lt;/code&gt;) as well as the input parameters—in this case, the topic we want to find blog posts about. This transparency helps you understand exactly what the AI is doing on your behalf.&lt;/p&gt;

&lt;p&gt;Now here’s a neat trick: normally you’d have to ask for the content after you get the results from the first tool call, but if you’re using GitHub Copilot in &lt;a href=&quot;https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode&quot;&gt;agent mode&lt;/a&gt;, the agent is actually smart enough to offer the execution of additional tools to obtain the full content:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/15-secondary-tool-call.webp&quot; alt=&quot;Secondary tool call to get full content&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This time it shows the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_post_content&lt;/code&gt; function being called, complete with the docstring description and the input parameters for retrieving the specific content.&lt;/p&gt;

&lt;p&gt;Finally, the results are displayed in the chat just like any other tool interaction would be:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mcp/local-mcp-in-vscode/16-mcp-result-in-vscode.webp&quot; alt=&quot;Final MCP result displayed in VS Code chat&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This seamless integration means you can search your blog, retrieve content, and incorporate it into your current work without ever leaving VS Code.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;When running local MCP servers, keep these security best practices in mind:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Workspace-level configuration&lt;/strong&gt;: Always choose workspace-level over global configuration to limit exposure&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Review dependencies&lt;/strong&gt;: Ensure you trust all packages and dependencies your MCP server uses&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Network access&lt;/strong&gt;: Be aware that MCP servers can make network requests (like our SerpAPI calls)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;File access&lt;/strong&gt;: MCP servers have access to files within their configured scope&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;learnings&quot;&gt;Learnings&lt;/h2&gt;

&lt;p&gt;Having your MCP server integrated directly in your development environment creates a streamlined workflow where you can search, reference, and incorporate your existing content without context switching. This is particularly valuable for content creators, technical writers, and developers who need to maintain consistency across their work.&lt;/p&gt;

&lt;p&gt;No matter what IDE you’re using, remember these steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Local Setup&lt;/strong&gt;: clone your MCP server repository and ensure all dependencies are properly installed using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uv sync&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Configuration&lt;/strong&gt;: use the VS Code MCP extension to configure your server with the proper command, including all necessary flags and dependencies&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scope Management&lt;/strong&gt;: choose workspace-level configuration over global to follow security best practices&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Debugging&lt;/strong&gt;: leverage the built-in logging and error reporting features to troubleshoot issues&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The combination of custom MCP server with GitHub Copilot in agent mode will help you maintain your flow state which as developers is all we really want.&lt;/p&gt;

&lt;p&gt;Now I just need to figure out the best approach to have this server without having to clone a repo and set it up manually, but that will happen on a later blog post.&lt;/p&gt;
</description>
        <pubDate>Sun, 31 Aug 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/configure-local-python-mcp-server-in-vscode/</link>
        <guid isPermaLink="true">https://jtemporal.com/configure-local-python-mcp-server-in-vscode/</guid>
        
        <category>ai</category>
        
        <category>ai agents</category>
        
        <category>jekyll</category>
        
        <category>blog</category>
        
        <category>vs code</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>How to create an llms.txt file in Jekyll and GitHub Pages</title>
        <description>&lt;p&gt;Have you ever wanted to make your blog content more accessible to AI systems and large language models? Or maybe you’ve wondered how to provide a clean, machine-readable version of your posts without the HTML clutter?&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; is the solution. It provides a standardized way for websites to expose their content to AI systems. And if you’re using Jekyll with GitHub Pages, you can create this file automatically with just a few lines of Liquid templating.&lt;/p&gt;

&lt;p&gt;If you’re new to Jekyll, it’s a static site generator written in Ruby that’s perfect for blogs specially when used in GitHub Pages. You can learn more about Jekyll and how to get started in this other post: &lt;a href=&quot;https://jtemporal.com/publishing-a-website-with-jekyll/&quot;&gt;Publishing a website with Jekyll&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;what-is-llmstxt&quot;&gt;What is llms.txt&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; file is a simple text format designed to make websites more accessible to AI systems and large language models (LLMs). Based on the specification at &lt;a href=&quot;http://llmstxt.org/&quot;&gt;llmstxt.org&lt;/a&gt;, it provides a standardized way to expose your site’s content in a machine-readable format.&lt;/p&gt;

&lt;p&gt;The basic structure includes:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;A brief description of your site&lt;/li&gt;
  &lt;li&gt;Key information about your projects, services, or content&lt;/li&gt;
  &lt;li&gt;Links to important pages or content&lt;/li&gt;
  &lt;li&gt;Any other information you’d like AI systems to know about your site&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a Jekyll blog, this is perfect for providing LLMs with direct access to your blog posts in their original Markdown format, making it easier for AI to understand and reference your content accurately.&lt;/p&gt;

&lt;h2 id=&quot;create-an-llmstxt&quot;&gt;Create an llms.txt&lt;/h2&gt;

&lt;p&gt;Creating an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; file for your Jekyll site is straightforward. You’ll create a new file in the root of your Jekyll project that uses Liquid templating to automatically generate the content.&lt;/p&gt;

&lt;p&gt;Here’s how to set it up step-by-step:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Create the file&lt;/strong&gt;: In your Jekyll root directory, create a new file called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Add the template&lt;/strong&gt;: Use the following template as your starting point:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-liquid highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;---
layout: null
---

# LLM Feed for jtemporal.com
_Generated: &lt;span class=&quot;cp&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;site&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;date_to_rfc822&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;}}&lt;/span&gt;_


## All posts
The links below take you to the raw Markdown content.

&lt;span class=&quot;cp&quot;&gt;{%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;site&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;posts&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;%}&lt;/span&gt;- [&lt;span class=&quot;cp&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;}}&lt;/span&gt;](https://raw.githubusercontent.com/jtemporal/jtemporal.github.io/refs/heads/main/&lt;span class=&quot;cp&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;}}&lt;/span&gt;)
&lt;span class=&quot;cp&quot;&gt;{%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;endfor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Some things to pay attention:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;layout: null&lt;/code&gt; ensures the file is output as plain text, not HTML&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{{ site.time | date_to_rfc822 }}&lt;/code&gt; adds a timestamp showing when the file was last generated&lt;/li&gt;
  &lt;li&gt;The loop &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{% for post in site.posts %}&lt;/code&gt; automatically creates a list of all your blog posts&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{{ post.path }}&lt;/code&gt; gives the relative path to each post’s Markdown file&lt;/li&gt;
  &lt;li&gt;The GitHub raw URL format allows direct access to the source Markdown&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s what the generated file looks like on my site:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/llms-txt-jtemporal.webp&quot; alt=&quot;Screenshot of llms.txt output showing the generated list of blog posts with links to raw Markdown files&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;add-to-_configyml&quot;&gt;Add to _config.yml&lt;/h2&gt;

&lt;p&gt;Look for the includes list on your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; file, that list has all files that should be served with your website once it is built. Mine looked like this before:&lt;/p&gt;

&lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Include list
&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;include:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[.well-known, EnJtResume.pdf, folium]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And now it also has the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; at the end of the array:&lt;/p&gt;
&lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Include list
&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;include:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[.well-known, EnJtResume.pdf, folium, llms.txt]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;test-your-changes&quot;&gt;Test your changes&lt;/h2&gt;

&lt;p&gt;Before deploying your changes, it’s a good idea to test them locally. Here’s how:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Build your site locally&lt;/strong&gt;:
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;jekyll build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Serve your site&lt;/strong&gt;:
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Check your llms.txt file&lt;/strong&gt;: Once your site is running (usually at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:4000&lt;/code&gt;), navigate to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:4000/llms.txt&lt;/code&gt; to see your generated file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You should see a plain text file with your site information and a list of all your blog posts with links to their raw Markdown content on GitHub. If everything looks good, you’re ready to deploy!&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;Creating an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; file for your Jekyll site is a painless three-step process:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Create the file&lt;/strong&gt;: Add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; to your Jekyll root directory with the Liquid template&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Configure Jekyll&lt;/strong&gt;: Add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;include&lt;/code&gt; list in your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Build and deploy&lt;/strong&gt;: Your file will be available at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yoursite.com/llms.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach automatically keeps your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llms.txt&lt;/code&gt; file up-to-date as you add new blog posts, and provides AI systems with direct access to your content in its original Markdown format. It’s a great way to make your Jekyll blog more accessible to the growing ecosystem of AI tools and services.&lt;/p&gt;

&lt;p&gt;The best part? Once set up, it requires zero maintenance: Jekyll handles everything automatically when you build your site!&lt;/p&gt;
</description>
        <pubDate>Fri, 29 Aug 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/how-to-create-llms-txt-in-jekyll/</link>
        <guid isPermaLink="true">https://jtemporal.com/how-to-create-llms-txt-in-jekyll/</guid>
        
        <category>ai</category>
        
        <category>ai agents</category>
        
        <category>jekyll</category>
        
        <category>blog</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>How to Build a Python MCP Server to Consult a Knowledge Base</title>
        <description>
</description>
        <pubDate>Thu, 28 Aug 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/how-to-build-a-python-mcp-server-to-consult-a-knowledge-base/</link>
        <guid isPermaLink="true">https://jtemporal.com/how-to-build-a-python-mcp-server-to-consult-a-knowledge-base/</guid>
        
        <category>python</category>
        
        <category>mcp</category>
        
        <category>ai</category>
        
        <category>english</category>
        
        <category>tutorial</category>
        
        
      </item>
    
      <item>
        <title>Model Context Protocol (MCP) Spec Updates from June 2025: One Small Step for a Spec, One Giant Leap for Security</title>
        <description>
</description>
        <pubDate>Thu, 26 Jun 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/mcp-specs-update-all-about-auth/</link>
        <guid isPermaLink="true">https://jtemporal.com/mcp-specs-update-all-about-auth/</guid>
        
        <category>mcp</category>
        
        <category>ai</category>
        
        <category>auth</category>
        
        <category>english</category>
        
        <category>tutorial</category>
        
        
      </item>
    
      <item>
        <title>Creating a Travel Diary With Django</title>
        <description>&lt;p&gt;You started learning Django by creating a blog from the DG tutorial at a Django Girls event near you. This is the first python event you’ve been to and you fell in love with both the language and the community. Now you have your first application you want to learn how to do more and improve your skills.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/travel-diaries-with-django/IMG_0680.jpeg&quot; alt=&quot;Image of the map in the Django Girls website showing all Django Girls events in a map&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This blog post narrates the process of implementing an interactive map and how to embed said map into Django website. You’ll learn how to create relationships between tables through foreign keys. You’ll also learn how to filter objects in the database using the Django ORM and create specific pages to show the filtered objects.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: You can also skip ahead to the section &lt;em&gt;Storing Spacial Data&lt;/em&gt; if you already have the blog from Django Girls tutorial.&lt;/p&gt;

&lt;p&gt;The code shown on this tutorial is also available &lt;a href=&quot;https://github.com/jtemporal/django-travel-diaries&quot;&gt;in this GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;putting-together-the-django-girls-tutorial-blog&quot;&gt;Putting together the Django Girls Tutorial blog&lt;/h2&gt;

&lt;p&gt;You can go to the &lt;a href=&quot;https://tutorial.djangogirls.org/en/&quot;&gt;Django Girls Tutorial here&lt;/a&gt; to learn in more detail how to put together the blog but below you’ll see the steps I’ve taken with some minor edits of my own for simplicity sake.&lt;/p&gt;

&lt;h3 id=&quot;getting-started-set-up&quot;&gt;Getting started: Set Up&lt;/h3&gt;

&lt;p&gt;Creating the python environment, installing Django, and creating the blog app:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;python -m venv .env
source .env/bin/activate# On Windows: .env\Scripts\activate
pip install django
django-admin startproject travel_diaries .
python manage.py startapp blog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The first thing to note is that by default Django uses SQLite as the default database, you can check that by looking in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;travel_diaries/settings.py&lt;/code&gt; and looking for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DATABASES&lt;/code&gt; variable and you should see something like this:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;DATABASES&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;ENGINE&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;django.db.backends.sqlite3&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;NAME&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BASE_DIR&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;db.sqlite3&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After creating the blog app you should add it to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INSTALLED_APPS&lt;/code&gt; list in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;travel_diaries/settings.py&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# ...
&lt;/span&gt;    &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;blog&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I also updated the timezone and the language settings in the same file:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;LANGUAGE_CODE&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;en-ca&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;TIME_ZONE&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;America/Toronto&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;creating-superusers&quot;&gt;Creating Superusers&lt;/h3&gt;

&lt;p&gt;One last thing to do before running the app: creating a user with admin powers.&lt;/p&gt;

&lt;p&gt;To do so, you need to run the migrations already created by default when you start your project. This creates the basic structure Django needs to create users for accessing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/admin&lt;/code&gt;, is through the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/admin&lt;/code&gt; that you can create blog posts.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;python manage.py migrate
python manage.py createsuperuser
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then run the server:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;python manage.py runserver
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now you can also access the admin page and login at &lt;a href=&quot;http://127.0.0.1:8000/admin&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://127.0.0.1:8000/admin&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;modeling-a-post&quot;&gt;Modeling a Post&lt;/h3&gt;

&lt;p&gt;The only thing you can do at this point is manage and create users. Let’s change that.&lt;/p&gt;

&lt;p&gt;For the purpose of this tutorial you’ll only have one user that is you, and you’ll be the author of the blog posts, so let’s move on to modeling a post. First create the blog app:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;python manage.py startapp blog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then add the following to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blog/models.py&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;django.db&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;django.conf&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;settings&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;django.utils&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;timezone&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;author&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ForeignKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;settings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AUTH_USER_MODEL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on_delete&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PROTECT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;CharField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;TextField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;created_at&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;DateTimeField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;timezone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;published_date&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;DateTimeField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blank&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;publish&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;published_date&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;timezone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__str__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that, differently from the Django Girls Tutorial, here we are protecting authors upon deletion of blog posts by using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;on_delete=models.Protect&lt;/code&gt;, this avoids the author being deleted when a blog post is deleted.&lt;/p&gt;

&lt;p&gt;Then remember to register your new model in the admin so you can see it in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/admin&lt;/code&gt; and be able to create blog posts, to do so open &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blog/admin.py&lt;/code&gt; and update the file like so:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;django.contrib&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;admin&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;.models&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Post&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;admin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;site&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you have the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/admin&lt;/code&gt; page open just refresh it and you should see your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Post&lt;/code&gt; model in there, if not run your server and login to see it.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/travel-diaries-with-django/IMG_0695.jpeg&quot; alt=&quot;Image of the Django Admin with the Post model&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;creating-posts&quot;&gt;Creating Posts&lt;/h3&gt;

&lt;p&gt;Before you can actually create a post you need to create the corresponding tables on the database, do that by running the two commands below:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;python manage.py makemigrations
python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;makemigrations&lt;/code&gt; command creates scripts to update the database called &lt;em&gt;migrations&lt;/em&gt;, since this is a new model, the script will create a new table to store the data for each new post. Then the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;migrate&lt;/code&gt; command actually run the migrations and creates the tables and other updates.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/travel-diaries-with-django/IMG_0709.jpeg&quot; alt=&quot;Image of the Django Admin with a post being edited&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Through the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/admin&lt;/code&gt; interface you should be able to create your blog posts. Take some time to add a couple so you can have some data, this will be used later too.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/travel-diaries-with-django/IMG_0707.jpeg&quot; alt=&quot;List of all posts in the Django Admin&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;listing-blog-posts-in-a-page&quot;&gt;Listing Blog Posts in a Page&lt;/h3&gt;

&lt;p&gt;Time to create HTML and CSS files so we can list our posts and render the posts beautifully.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Inside your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blog/&lt;/code&gt; folder, create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;templates/&lt;/code&gt; folder and then a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blog/&lt;/code&gt; folder inside templates;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Now create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;base.html&lt;/code&gt; with the following code:&lt;/p&gt;

    &lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; {% load static %}
 &lt;span class=&quot;cp&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
 &lt;span class=&quot;nt&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;{% block title %}Travel Diaries{% endblock %}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;integrity=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;crossorigin=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;anonymous&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{% static &apos;css/blog.css&apos; %}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
 &lt;span class=&quot;nt&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
 &lt;span class=&quot;nt&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;header&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;page-header&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;container&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
     &lt;span class=&quot;nt&quot;&gt;&amp;lt;h1&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Travel Diaries&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;/header&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;main&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;container&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
     &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;row&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
       &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;col&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
       {% block content %}
       {% endblock %}
       &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
     &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
 &lt;span class=&quot;nt&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
 &lt;span class=&quot;nt&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;This base template will hold all the bits of HTML you can reuse across all other pages that extend it.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Create also a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post_list.html&lt;/code&gt; like so:&lt;/p&gt;

    &lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; {% extends &apos;blog/base.html&apos; %}
    
 {% block content %}
   {% for post in posts %}
     &lt;span class=&quot;nt&quot;&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
       &lt;span class=&quot;nt&quot;&gt;&amp;lt;h2&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{% url &apos;post_detail&apos; pk=post.pk %}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;{{ post.title }}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;&amp;lt;small&amp;gt;&lt;/span&gt; • &lt;span class=&quot;nt&quot;&gt;&amp;lt;time&amp;gt;&lt;/span&gt;published: {{ post.published_date }}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/time&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
     &lt;span class=&quot;nt&quot;&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
   {% endfor %}
 {% endblock %}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;em&gt;Note: This post list is a bit different from that on the Django Girls tutorial as it only displays the Post title and publishing date.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;And finally &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post_detail.html&lt;/code&gt;:&lt;/p&gt;

    &lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    
 {% extends &apos;blog/base.html&apos; %}
    
 {% block content %}
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
     &lt;span class=&quot;nt&quot;&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;{{ post.title }}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
     &lt;span class=&quot;nt&quot;&gt;&amp;lt;small&amp;gt;&amp;lt;time&amp;gt;&lt;/span&gt;published: {{ post.published_date }}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/time&amp;gt;&amp;lt;/small&amp;gt;&lt;/span&gt;
     &lt;span class=&quot;nt&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{{ post.content | safe | linebreaks }}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
 {% endblock %}
    
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;em&gt;Note: This post detail is also a bit different from that on the Django Girls tutorial as it not only displays the Post content but also allow for rendering HTMLs that might be part of the post like the embedded code for a YouTube video for example.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Now you may have noticed the usage of a CSS file in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;base.html&lt;/code&gt;, but you currently don’t have that file, so let’s us create it, create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;static/&lt;/code&gt; folder inside your blog app folder and in it a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;css/&lt;/code&gt; folder containing a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blog.css&lt;/code&gt; file with the following content:&lt;/p&gt;

    &lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;nt&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;h2&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
     &lt;span class=&quot;nl&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;#c175ff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Make sure to change the color you see there as a hex code to one of your liking.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Now you need a view or better views to use these amazing templates. So update &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blog/views.py&lt;/code&gt; to this:&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;django.shortcuts&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_object_or_404&lt;/span&gt;
 &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;django.utils&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;timezone&lt;/span&gt;
 &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;.models&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Post&lt;/span&gt;
    
 &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;post_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
     &lt;span class=&quot;n&quot;&gt;posts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;published_date__lte&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;timezone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;order_by&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-published_date&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;blog/post_list.html&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;posts&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;posts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    
 &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;post_detail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
     &lt;span class=&quot;n&quot;&gt;post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_object_or_404&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pk&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;blog/post_detail.html&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post_list&lt;/code&gt; function will grab all posts you have order them by the publish date putting the most recent blog post first in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;posts&lt;/code&gt;. This filter returns a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QuerySet&lt;/code&gt; that gets injected into the page when the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;render()&lt;/code&gt; is called. You can think of this &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QuerySet&lt;/code&gt; as a list resulting of filtering the posts in the database.&lt;/p&gt;

    &lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post_detail&lt;/code&gt; function on the other hand, is responsible for rendering a given post in its own page, it finds the post if it exists using its primary key and injects that through the render function.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;To make use of the HTMLs and Views you need to update the URLs so your application know how to render the blog pages, so create the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;urls.py&lt;/code&gt; file within your blog app and update the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blog/urls.py&lt;/code&gt; like this:&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;django.urls&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;
 &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;views&lt;/span&gt;
    
 &lt;span class=&quot;n&quot;&gt;urlpatterns&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
     &lt;span class=&quot;nf&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;views&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;post_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;post_list&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
     &lt;span class=&quot;nf&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;post/&amp;lt;int:pk&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;views&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;post_detail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;post_detail&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;The first pattern uses the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post_list.html&lt;/code&gt; and corresponding homonyms view to render the list of posts while the second is responsible for generating a page for each individual post. Note that the post URL for an individual post follows a pattern like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post/1&lt;/code&gt; where the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; is the primary key of a post in the database.&lt;/p&gt;

    &lt;p&gt;An improvement for a later date is to use the post slug for generating the URL as opposed to the primary key.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now you can see a post like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/travel-diaries-with-django/IMG_0710.jpeg&quot; alt=&quot;Image showing one post&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;storing-spacial-data&quot;&gt;Storing Spacial Data&lt;/h2&gt;

&lt;p&gt;Up until now it you had a recap of the Django Girls Tutorial with some tiny differences. If you want more details you can find it in the &lt;a href=&quot;https://tutorial.djangogirls.org/en&quot;&gt;Django Girls Tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But let’s move to the fun parts! First things first, we need to make a decision: &lt;em&gt;should you store the location as part of the post model itself or should you create a separate object to store the information? And if you separate things in different models, should you keep things in the same app or put things in a separate app entirely?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To facilitate re-usability, since you can have more than one blog post for a given location, maybe a place you visit quite often, is better to separate the location as its own model.&lt;/p&gt;

&lt;p&gt;With the same mindset, we should be able to keep each module as specific to the part of the application it contains, it is a good practice to separate responsibilities into different apps, having a separate app also allows you to re-use this code in other projects, so that’s what we’ll do in this blog post.&lt;/p&gt;

&lt;h3 id=&quot;creating-map-app&quot;&gt;Creating Map App&lt;/h3&gt;

&lt;p&gt;The app to hold the locations will be named Map and will host all logic for locations and the map generation. Splitting this allow you for example to reutilize the code at other applications with little refactor, and also for the map to exist almost independently from your blog. Let’s create a new app:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;python manage.py startapp map
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then add that to your application by updating the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;travel_diaries/settings.py&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# ... previous installed apps
&lt;/span&gt;    &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;django.contrib.staticfiles&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;blog&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;modeling-a-location&quot;&gt;Modeling a Location&lt;/h3&gt;

&lt;p&gt;In order to show locations both on the blog and on the map you need to be able store them so we need a model, update &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map/models.py&lt;/code&gt; like so:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;django.db&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;CharField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;latitude&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;DecimalField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_digits&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;decimal_places&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blank&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;longitude&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;DecimalField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_digits&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;decimal_places&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blank&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__str__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Put simply a Location has a name and the coordinates to find it in a map (latitude and longitude).&lt;/p&gt;

&lt;p&gt;Since you now have a model is a good time to create the corresponding table on your database, run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;python manage.py makemigrations
python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;creating-a-map&quot;&gt;Creating a Map&lt;/h3&gt;

&lt;p&gt;Now that you have a model you need to both add a view for it, and add it to the admin so you can create new locations. Let’s start with the basics: creating the view. Go to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map/views.py&lt;/code&gt; and add the following code:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;django.http&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HttpResponse&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;.models&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Location&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;map_page&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;center&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;13.133932434766733&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;16.103938729508073&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;folium_map&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;center&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zoom_start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;HttpResponse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;folium_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get_root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Let’s breakdown what is happening:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium&lt;/code&gt;: is a library to that allows you to create maps in Python with Leafleet.js, you can check out the &lt;a href=&quot;https://python-visualization.github.io/folium/latest/&quot;&gt;Folium documentation here&lt;/a&gt; or this other &lt;a href=&quot;https://jtemporal-com.translate.goog/folium/?_x_tr_sl=auto&amp;amp;_x_tr_tl=en&amp;amp;_x_tr_hl=en-US&amp;amp;_x_tr_pto=wapp&quot;&gt;blog post I wrote to learn the Folium basics (translated with the help of Google from Portuguese - for now&lt;/a&gt;&lt;a href=&quot;https://jtemporal.com/folium/&quot;&gt;)&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium.Map&lt;/code&gt;: creates a map of the world far enough to see most of the world map;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium_map.get_root().render()&lt;/code&gt;: exports the created map into an HTML as a string that can be passed to the view.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After updating the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map/views.py&lt;/code&gt; install Folium like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install folium
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Define the URL patterns for map app in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map/urls.py&lt;/code&gt; like this:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;django.urls&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;views&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;urlpatterns&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;views&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_page&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And add the map app to the application URLs in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;travel_diaries/urls.py&lt;/code&gt; like this:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# ... pre-existing imports
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;urlpatterns&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;admin/&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;admin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;site&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;urls&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;blog.urls&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;map/&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;map.urls&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 👈 added code
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With these alterations every time someone access &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/map&lt;/code&gt; endpoint on your site they will see the map created.&lt;/p&gt;

&lt;p&gt;Double check your work: access &lt;a href=&quot;https://127.0.0.1:8000/map&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://127.0.0.1:8000/map&lt;/code&gt;&lt;/a&gt; to see the blank map.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/travel-diaries-with-django/IMG_0694.jpeg&quot; alt=&quot;Image showing showing the plain map&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That’s cool but too “basic” so let’s add some locations and pins to our map.&lt;/p&gt;

&lt;h3 id=&quot;creating-locations&quot;&gt;Creating Locations&lt;/h3&gt;

&lt;p&gt;Now that you have a view and a model make sure to register the model on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map/admin.py&lt;/code&gt; file in order to see locations in the admin UI:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;django.contrib&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;admin&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;.models&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Location&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;admin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;site&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If your server is running, refresh your page to see the update, if not, run your server and login to the admin panel in order to create locations.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/travel-diaries-with-django/IMG_0696.jpeg&quot; alt=&quot;Image of the Django admin now showing also Locations&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Make sure to add a few that would correspond to each of your blog posts.&lt;/p&gt;

&lt;h3 id=&quot;adding-locations-to-blog-posts&quot;&gt;Adding Locations to Blog Posts&lt;/h3&gt;

&lt;p&gt;Now since you want to associate each blog post to a given location we need to adjust the blog post model and make some improvements to the HTML templates.&lt;/p&gt;

&lt;p&gt;Let’s begin by updating the Post model in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blog/models.py&lt;/code&gt; you’ll add a new field called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;location&lt;/code&gt; and it will be a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ForeignKey&lt;/code&gt;. This will create a link between your post in the Post table and location that exists in the Location table.&lt;/p&gt;

&lt;p&gt;Since you want to be able to create blog posts that aren’t tied to a location, you’ll also want to make this field optional by using the parameters &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blank&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt;. This will also help since you want to put a default location or have to implement your own migration in order to fill the field in the database.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# other imports omitted
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;map.models&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Location&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 👈 new import
&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# other fields omitted
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;published_date&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;DateTimeField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blank&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# 👇 new code
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ForeignKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;related_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;place&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;blank&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# allow for blog posts without location
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;on_delete&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PROTECT&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# keep location if a blog post gets deleted
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# 👆 new code
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# omitted pre-existing code
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Okay now let’s update the templates, start with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post_detail.html&lt;/code&gt;. Add the following after the closing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;/time&amp;gt;&lt;/code&gt; tag in the HTML:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{% if post.location %} • {{ post.location }}{% endif %}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This will render the location of a post in the post page if that blog post has a location filled in. Since the location is part of the post object as foreign key, you can still access it through the post object we pass in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;render&lt;/code&gt; function of the post detail view.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/travel-diaries-with-django/IMG_0688.jpeg&quot; alt=&quot;Image of a post now with the Location&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Make sure to add some locations through the admin page &lt;em&gt;and&lt;/em&gt; update the blog posts to have locations&lt;/p&gt;

&lt;h2 id=&quot;linking-the-map-in-the-main-page&quot;&gt;Linking The Map in the Main Page&lt;/h2&gt;

&lt;p&gt;While you are editing templates might be a good time to link the Map in the footer of the base template. Open the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;base.html&lt;/code&gt; and add the code below after the closing of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;/main&amp;gt;&lt;/code&gt; tag:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;footer&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;page-footer&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;container&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;br&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;p&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/map&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt; Map &lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Finally, you may have noticed that this hyperlink is rendering in that awful blue color so update the CSS file so that this hyper link also renders in your chosen color, replace the content of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blog/static/css/blog.css&lt;/code&gt; with this:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;h2&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;#c175ff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This way you can see your map with the same color setting for all other links in your page like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/travel-diaries-with-django/IMG_0683.jpeg&quot; alt=&quot;Image of the post list from the user perspective with the map link in the footer circled&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;showing-locations-on-a-map&quot;&gt;Showing Locations on a Map&lt;/h2&gt;

&lt;p&gt;Okay now that you have locations you should be able to see them in the map, right? Wrong! Our map has no information to display yet, to change that you need to update the map view. Add this code to it:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# other imports omitted
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;django.http&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HttpResponse&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;.models&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Location&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;map_page&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;center&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;13.133932434766733&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;16.103938729508073&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;folium_map&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;center&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zoom_start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# 👇 new code
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;locations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;locations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;popup&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Marker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;latitude&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;longitude&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;popup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;popup&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;add_to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;folium_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# 👆 new code
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;HttpResponse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;folium_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get_root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This extra code does the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Queries all the locations in the database with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Location.objects.all()&lt;/code&gt;;&lt;/li&gt;
  &lt;li&gt;Then iterates over the QuerySet of locations to add a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium.Marker&lt;/code&gt; using the name and coordinates for each location.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After adding some locations you should be able to access &lt;a href=&quot;https://127.0.0.1:8000/map&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://127.0.0.1:8000/map&lt;/code&gt;&lt;/a&gt; and see a map with the locations you created with their corresponding pins.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/travel-diaries-with-django/IMG_0697.png&quot; alt=&quot;Image showing the map now with pins for each location&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;creating-location-pages&quot;&gt;Creating Location Pages&lt;/h2&gt;

&lt;p&gt;Now this is all fun, let’s make it more &lt;em&gt;complete&lt;/em&gt;. One fun thing to do using views is to generate pages based on the data you have stored in the database. So let’s create a new view to get a list of posts for a given location, add the code below on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map/views.py&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# other imports omitted
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;django.utils&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;timezone&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blog.models&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Post&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# other views omitted
&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;post_list_by_location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name__iexact&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;posts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;published_date__lte&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;timezone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;order_by&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-published_date&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;map/post_list_by_location.html&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;posts&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;posts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Lets breakdown the code:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Location.objects.get(name__iexact=name)&lt;/code&gt;: filters location based on the name without caring for capitalization;&lt;/li&gt;
  &lt;li&gt;Then we get all the posts using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Post.objects.filter&lt;/code&gt; passing the location from the previous step;&lt;/li&gt;
  &lt;li&gt;Finally we pass the posts and the location to the page rendered by the template &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map/post_list_by_location.html&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Speaking of template, now that we have a new view that actually uses templates create the templates folder to host the HTML that will be used by this view like this:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; map/templates/map/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then create a new template in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map/templates/map/&lt;/code&gt; folder named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post_list_by_location.html&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{% extends &apos;blog/base.html&apos; %}

{% block content %}
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Posts in {{ location }}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/h2&amp;gt;&amp;lt;br&amp;gt;&lt;/span&gt;

    {% for post in posts %}
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;h2&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{% url &apos;post_detail&apos; pk=post.pk %}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;{{ post.title }}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;&amp;lt;small&amp;gt;&lt;/span&gt; • &lt;span class=&quot;nt&quot;&gt;&amp;lt;time&amp;gt;&lt;/span&gt;published: {{ post.published_date }}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/time&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
    {% endfor %}
{% endblock %}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And to you can see the pages add the new URL patterns in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map/urls.py&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# imports omitted
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;urlpatterns&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;views&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_page&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;views&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;post_list_by_location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 👈 new code
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;name&amp;gt;&lt;/code&gt; ensures the part of the URL path that will contain the name of the location will be passed along to the view: for example accessing &lt;a href=&quot;https://127.0.0.1:8000/map/london&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://127.0.0.1:8000/map/london&lt;/code&gt;&lt;/a&gt; will render the corresponding London page with the collection of posts related to London.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/travel-diaries-with-django/IMG_0714.jpeg&quot; alt=&quot;Image showing the page for a given location with a list of corresponding blog posts&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;linking-location-pages-in-the-map&quot;&gt;Linking Location Pages in the Map&lt;/h2&gt;

&lt;p&gt;One final thing: might be fun to add a tiny preview map of the location on the page so lets update the view:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# pre-existing code
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;post_list_by_location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name__iexact&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# 👇 new code
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;folium_map&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;latitude&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;longitude&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;zoom_start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;400&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;300&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Marker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;latitude&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;longitude&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;popup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;add_to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;folium_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;location_map&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;folium_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;_repr_html_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# 👆 new code
&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;posts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;published_date__lte&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;timezone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;order_by&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-published_date&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;map/post_list_by_location.html&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 👇 updated code
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;posts&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;posts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;location_map&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;location_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 👆 updated code
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium.Map&lt;/code&gt;: creates a map;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium.Marker&lt;/code&gt;: adds the pin to map;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium_map._repr_html_()&lt;/code&gt;: generates the HTML for the map;&lt;/li&gt;
  &lt;li&gt;then finally, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;location_map&quot;: location_map&lt;/code&gt; we pass the HTML map to be injected into the page.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And now update the template HTML file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map/templates/map/post_list_by_location.html&lt;/code&gt; like so:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{% extends &apos;blog/base.html&apos; %}

{% block content %}
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Posts in {{ location }}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/h2&amp;gt;&amp;lt;br&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- 👇 new code --&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;row&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;style=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;width:50%&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;center&amp;gt;&lt;/span&gt;
            {{ location_map | safe }}
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/center&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- 👆 new code --&amp;gt;&lt;/span&gt;
    {% for post in posts %}
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;h2&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{% url &apos;post_detail&apos; pk=post.pk %}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;{{ post.title }}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;&amp;lt;small&amp;gt;&lt;/span&gt; • &lt;span class=&quot;nt&quot;&gt;&amp;lt;time&amp;gt;&lt;/span&gt;published: {{ post.published_date }}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/time&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
    {% endfor %}
{% endblock %}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This update then render the map as a part of the page:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/travel-diaries-with-django/IMG_0687.jpeg&quot; alt=&quot;Image of a location page showing a map&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now we need to add a link to this pages somewhere right? So let’s use our Map. Update the view that generate the markers on the map &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map/views.py&lt;/code&gt; like so:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;map_page&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;center&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;13.133932434766733&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;16.103938729508073&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;folium_map&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;center&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zoom_start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;locations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;locations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 👇 updated code
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;popup&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;
        &amp;lt;a href=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/map/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;lt;/a&amp;gt;
        &lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 👆 updated code
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Marker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;latitude&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;longitude&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;popup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;popup&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;add_to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;folium_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;folium_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;map/templates/map/map.html&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;map/map.html&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And that is it, you are good to go! Go checkout the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/map&lt;/code&gt; page and try clicking on the name of one of your locations:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/travel-diaries-with-django/IMG_0685.jpeg&quot; alt=&quot;Image showing that the location tool tip now has a hyperlink that takes users to the Location page&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;Wow, that was a lot! You learned or remembered how to create a blog in the style of the Django Girls tutorial with some tiny differences to make the experience more personalized. Then you got to have fun and learn how to use Folium to generate maps and embed those maps in pages on your page.&lt;/p&gt;

&lt;p&gt;On the Django side you saw how to use foreign keys to link your posts to locations and how filter posts based on the relationship they had with that location. And then you saw how to create specific pages with the filtered list of posts.&lt;/p&gt;

&lt;p&gt;I hope you had as much fun reading as I had writing this, if you read until here I’d love to hear/read your questions so &lt;a href=&quot;https://bsky.app/profile/jesstemporal.com&quot;&gt;send me a message on Bluesky&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Before you go if you want to think of next steps for you to stretch your skills I recommend you trying both saving the map once a new location is added this way you can just render the map as opposed to querying the the database every time &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/map&lt;/code&gt; is accessed and creating a 404 page in case some tries to access locations that don’t exist.&lt;/p&gt;

&lt;p&gt;Once again, the code shown on this tutorial is also available &lt;a href=&quot;https://github.com/jtemporal/django-travel-diaries&quot;&gt;in this GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;See ya on the next one.&lt;/p&gt;
</description>
        <pubDate>Sat, 05 Apr 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/creating-a-travel-diaries-blog-with-django/</link>
        <guid isPermaLink="true">https://jtemporal.com/creating-a-travel-diaries-blog-with-django/</guid>
        
        <category>django girls</category>
        
        <category>blog</category>
        
        <category>python</category>
        
        <category>django</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>RAG and Access Control: Where Do You Start?</title>
        <description>
</description>
        <pubDate>Tue, 21 Jan 2025 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/rag-and-access-control-where-do-you-start/</link>
        <guid isPermaLink="true">https://jtemporal.com/rag-and-access-control-where-do-you-start/</guid>
        
        <category>openai</category>
        
        <category>auth</category>
        
        <category>english</category>
        
        <category>fga</category>
        
        
      </item>
    
      <item>
        <title>Device Flow: Login em Dispositivos com Restrição de Entrada</title>
        <description>&lt;p&gt;Você já ouviu falar do fluxo de autorização de dispositivo (device flow)? Pode ser que você não tenha ouvido falar, mas é bem provável que você já tenha usado.&lt;/p&gt;

&lt;p&gt;O device flow permite que você faça login em seus aplicativos em dispositivos com restrição de entrada, pense em dispositivos IoT ou smart TVs, por exemplo.&lt;/p&gt;

&lt;p&gt;Ótimas aplicações permitem que o usuário continue o processo de login em um dispositivo mais confortável, ao invés de usar por exemplo o teclado virtual em uma SmartTV.&lt;/p&gt;

&lt;p&gt;Se você está desenvolvendo aplicações que precisam desse tipo de conectividade, assista essa palestra para aprender o que é o fluxo de dispositivo, como ele funciona e, melhor ainda, vê-lo funcionando em uma aplicação que integra Python (usando FastAPI) e MicroPython.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/slides/deviceflow-pyladiescon-2024&quot;&gt;Slides&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jtemporal/device-authz-flow-dino-badger2040w&quot;&gt;Code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Assista:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/eFRCGmU6scM?si=kBDwXtWPQOONKXk8&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Fri, 06 Dec 2024 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/pyladiescon2024/</link>
        <guid isPermaLink="true">https://jtemporal.com/pyladiescon2024/</guid>
        
        <category>português</category>
        
        <category>portugues</category>
        
        <category>fastapi</category>
        
        <category>micropython</category>
        
        <category>talk</category>
        
        <category>python</category>
        
        <category>R</category>
        
        
      </item>
    
      <item>
        <title>FastAPI Authentication by Example</title>
        <description>
</description>
        <pubDate>Thu, 05 Dec 2024 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/fastapi-authentication-by-example/</link>
        <guid isPermaLink="true">https://jtemporal.com/fastapi-authentication-by-example/</guid>
        
        <category>fastapi</category>
        
        <category>auth</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Apple Intelligence Clean Up: removendo objetos de fotos no iPhone</title>
        <description>&lt;p&gt;Estas duas fotos são a mesma foto.&lt;/p&gt;

&lt;div style=&quot;display: flex; justify-content: space-between;&quot;&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/initial-photo-with-items-to-be-removed.webp&quot; width=&quot;48%&quot; alt=&quot;Foto inicial da mesa&quot; /&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/final-photo-with-all-items-removed-from-desk.webp&quot; width=&quot;48%&quot; alt=&quot;Foto final da mesa &apos;limpa&apos;&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Não acredita em mim? Eu sei, eu sei. À primeira vista, você pode pensar “&lt;em&gt;uma foto é uma mesa com coisas de crochê e a outra é uma mesa vazia, não tem como serem a mesma foto&lt;/em&gt;”, mas a sua curiosidade pode começar a te incomodar e você passa a notar algumas coisas estranhas na segunda foto. Algumas sombras esquisitas e algumas linhas muito retas, quase retas demais, nos veios da madeira.&lt;/p&gt;

&lt;p&gt;Bem, a resposta é que eu tirei a primeira foto e usei a Apple Intelligence para “limpar a mesa” com a funcionalidade “Clean Up” (limpar) dentro do aplicativo Photos. Continue lendo para saber um pouco mais sobre essa nova funcionalidade.&lt;/p&gt;

&lt;h2 id=&quot;apple-intelligence&quot;&gt;Apple Intelligence&lt;/h2&gt;

&lt;p&gt;Do meu ponto de vista, a Apple Intelligence é o aprendizado de máquina (machine learning ou ML) da Apple. Com o avanço da inteligência artificial (IA) e dos grandes modelos de linguagem (large language models ou LLMs), a Apple tinha resistido a usar a sigla “IA” e se mantinha usando aprendizado de máquina sempre que tinha alguma funcionalidade alimentada por algum tipo de algoritmo sequer parecido com IA.&lt;/p&gt;

&lt;p&gt;Em uma jogada muito Apple, a empresa lançou a “Apple Intelligence”, e renomeou a IA que todos conhecemos para algo novo.&lt;/p&gt;

&lt;p&gt;Sim, Apple, todos percebemos que você fez.&lt;/p&gt;

&lt;p&gt;Agora com a Apple Intelligence, eles podem usar a sigla mais livremente. E, embora tenham lançado um novo telefone construído para IA, nenhuma funcionalidade da Apple Intelligence foi vista no iPhone 16 quando chegou às lojas em setembro de 2024.&lt;/p&gt;

&lt;p&gt;Em outubro, com o iOS 18.1, começamos a receber algumas funcionalidades da Apple Intelligence e eu, como muitas outras pessoas, atualizei meus dispositivos Apple, o iPhone e iPad, para o iOS 18.1 para usar as primeiras funcionalidades da Apple Intelligence.&lt;/p&gt;

&lt;h2 id=&quot;testando-apple-intelligence-no-photos&quot;&gt;Testando Apple Intelligence no Photos&lt;/h2&gt;

&lt;p&gt;Conversando com um amigo, percebemos que ainda não tínhamos usado essas funcionalidades, então entrei em modo de aprendizado para descobrir exatamente quais eram os recursos e como eles poderiam se encaixar na minha vida.&lt;/p&gt;

&lt;p&gt;De todas as novas funcionalidades, a que mais me chamou a atenção foi a “Clean Up” (limpeza) no aplicativo Photos.&lt;/p&gt;

&lt;p&gt;Claro, remover objetos indesejados e até pessoas das fotos não é novidade, muitos telefones Android já têm essa funcionalidade há algum tempo, e softwares tradicionais de edição de fotos são ótimos nisso, mas este não é um post sobre os méritos de cada sistema operacional ou software de edição.&lt;/p&gt;

&lt;p&gt;Se você me conhece, sabe que sempre tenho curiosidade sobre os limites das ferramentas e queria ver até onde eu poderia levar essa… Meu objetivo era “remover” um objeto por vez, salvar uma nova foto com o objeto removido e continuar assim até ter “uma mesa limpa”.&lt;/p&gt;

&lt;h2 id=&quot;iphone-ou-ipad&quot;&gt;iPhone ou iPad?&lt;/h2&gt;

&lt;p&gt;Para as pessoas curiosas de plantão, aqui estão minhas especificações: Estou usando o &lt;a href=&quot;https://amzn.to/4fjsRtE&quot;&gt;iPhone 16 Pro Max com 256GB&lt;/a&gt; e o &lt;a href=&quot;https://amzn.to/4fCriGN&quot;&gt;iPad Pro 13” M4 256GB lançado em 2024&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;começando-no-iphone&quot;&gt;Começando no iPhone&lt;/h3&gt;

&lt;p&gt;Comecei pelo celular. Organizei as coisas na mesa, tirei a foto e sentei no sofá com o telefone na mão para remover o primeiro objeto.&lt;/p&gt;

&lt;div style=&quot;display: flex; justify-content: space-between;&quot;&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/initial-photo-with-items-to-be-removed.webp&quot; width=&quot;48%&quot; alt=&quot;Foto inicial com itens a serem removidos&quot; /&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/photo-with-first-item-removed-from-desk.webp&quot; width=&quot;48%&quot; alt=&quot;Foto com primeiro item removido da mesa&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Consegue notar a diferença? Olhe para o canto inferior direito. Parecia mágica quando, após um simples círculo, o objeto simplesmente desapareceu.&lt;/p&gt;

&lt;p&gt;Salvei a edição, dupliquei a foto e parti para o segundo objeto: era hora de remover meu pequeno canivete no canto inferior esquerdo. Demorou um pouco mais que o primeiro para desaparecer, mas foi. No entanto, deixou uma “sombra”, então tive que circular a sombra também e esperar um pouco para que ela também sumisse.&lt;/p&gt;

&lt;div style=&quot;display: flex; justify-content: space-between;&quot;&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/photo-with-first-item-removed-from-desk.webp&quot; width=&quot;48%&quot; alt=&quot;Foto com primeiro item removido da mesa&quot; /&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/photo-with-first-and-second-item-removed-from-desk.webp&quot; width=&quot;48%&quot; alt=&quot;Foto com primeiro e segundo item removidos da mesa&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;Depois de duplicar a nova foto, o iPhone já estava oficialmente quente e começou a travar durante o processo de edição, então mudei para o iPad para continuar com a diversão.&lt;/p&gt;

&lt;p&gt;Duas observações aqui:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Primeiro, quando o iPhone 16 foi lançado, a Apple disse que este iPhone foi construído para IA, mas este pequeno teste que fiz sugere que o iPhone 17 pode ser melhor nisso,&lt;/li&gt;
  &lt;li&gt;segundo, que duplicar fotos também salva todas as edições da foto anterior como uma edição, então você pode reverter uma foto duplicada de volta ao original, por exemplo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Com isso em mente, eu simpatizo com as pessoas com iPhone 15 que vão querer usar este recurso extensivamente e espero que a Apple lance atualizações no futuro para resolver isso e alguns outros comportamentos estranhos que você verá abaixo.&lt;/p&gt;

&lt;h3 id=&quot;continuando-no-ipad&quot;&gt;Continuando no iPad&lt;/h3&gt;

&lt;p&gt;Considerando tudo, foi super divertido simplesmente circular o objeto que você quer remover, esperar alguns segundos e vê-lo fazer &lt;em&gt;poof&lt;/em&gt; e simplesmente desaparecer.&lt;/p&gt;

&lt;p&gt;Depois de “fazer desaparecer” um objeto, às vezes eu também tinha que lidar com algumas manchas escuras que sobravam, eu só precisava circular a área novamente para me livrar de quaisquer manchas escuras restantes (como mostrado no vídeo abaixo).&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/uCjBzMD0fms?si=v_Wby9oBd5N64j8H&amp;amp;controls=0&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;Como eu esperava, o iPad teve um desempenho melhor que o iPhone, não notei ele travando, embora a resposta da ferramenta tenha ficado mais lenta conforme fui avançando.&lt;/p&gt;

&lt;p&gt;E quanto à temperatura, o iPad só ficou morno, mas sempre que eu chegava perto da tela podia sentir o calor emanando de leve.&lt;/p&gt;

&lt;h3 id=&quot;coisas-estranhas-começaram-a-acontecer&quot;&gt;Coisas estranhas começaram a acontecer&lt;/h3&gt;

&lt;p&gt;Depois que todos os objetos, exceto um, foram removidos individualmente, eu tinha um último desafio: remover o maior item de toda a foto: O livro de crochê e terminar com uma mesa vazia.&lt;/p&gt;

&lt;div style=&quot;display: flex; justify-content: space-between;&quot;&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/book-last-item-to-be-removed-from-desk.webp&quot; width=&quot;48%&quot; alt=&quot;Book as last item to be removed from desk&quot; /&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/final-photo-with-all-items-removed-from-desk.webp&quot; width=&quot;48%&quot; alt=&quot;Final &apos;clean desk&apos; photo&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;Mas o que parecia uma coisa simples depois de tudo que já tinha feito acabou sendo o momento em que as coisas estranhas começaram a acontecer. Eu me pergunto… &lt;em&gt;Será que a Apple Intelligence, como qualquer outro modelo de IA, alucina?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Alucinação é um comportamento conhecido do aprendizado de máquina, especialmente em LLMs, e na minha opinião um dos mais perigosos. Uma alucinação em ML acontece quando um modelo produz uma resposta coerente, mas que é de fato incorreta.&lt;/p&gt;

&lt;p&gt;Como não sei se podemos qualificar se a Apple Intelligence estava tendo uma alucinação aqui, especialmente porque não estamos interagindo textualmente, vou chamar tudo no reino dos resultados inesperados de “comportamento estranho”.&lt;/p&gt;

&lt;h3 id=&quot;apenas-um-blur-para-você&quot;&gt;Apenas um “blur” para você&lt;/h3&gt;

&lt;p&gt;As duas primeiras tentativas de remover o livro não foram bem sucedidas. A ferramenta de limpeza parou de remover coisas completamente e começou a “borrar” as coisas em vez de remover objetos.&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;/images/apple-intelligence/clean-up/first-fail-item-not-removed-but-blurred.webp&quot; width=&quot;45%&quot; alt=&quot;Tentativa falha de remover item mostrando resultado borrado&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Depois de algumas tentativas fracassadas, uma delas você pode ver neste vídeo abaixo, eu finalmente consegui fazer o que queria e o livro foi removido. Note que isso exigiu um trabalho extra da minha parte, já que circular não estava tendo o resultado esperado.&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/LqJ1aX_Q3gg?si=eFMDrNbgWdIdnLJZ&amp;amp;controls=0&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;Eu queria que houvesse uma maneira de dizer à ferramenta que ela fez a coisa errada e que deveria tentar novamente, como muitos LLMs baseados em texto, mas não existe tal maneira. Aqui você tem que esperar que a funcionalidade entenda o que você quer que ela faça. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;¯\_(ツ)_/¯&lt;/code&gt;&lt;/p&gt;

&lt;h3 id=&quot;fantasmas-de-objetos&quot;&gt;Fantasmas de objetos&lt;/h3&gt;

&lt;p&gt;Ainda no espectro dos comportamentos estranhos, quando tentei pintar sobre a parte onde muitas das edições foram feitas anteriormente, apareceu o “recorte” dos objetos que haviam sido removidos previamente.&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;/images/apple-intelligence/clean-up/quirky-behavior-with-phantom-items.webp&quot; width=&quot;45%&quot; alt=&quot;Comportamento estranho mostrando itens fantasmas que foram removidos anteriormente&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;No final, deu tudo certo e consegui as fotos que você viu no início.&lt;/p&gt;

&lt;h2 id=&quot;limpeza-é-cansativo-até-mesmo-para-ia&quot;&gt;Limpeza é Cansativo, Até Mesmo Para IA&lt;/h2&gt;

&lt;p&gt;Outro detalhe importante é que essa foi uma tarefa que &lt;em&gt;consumiu muita bateria&lt;/em&gt;. A edição em si não demorou muito, cada remoção de objeto levou apenas alguns segundos.&lt;/p&gt;

&lt;p&gt;No entanto, eu podia ver a porcentagem da bateria diminuindo constantemente. Acredito que desde que comecei o processo de edição no iPad e até terminar, essa funcionalidae consumiu cerca de 20% da bateria disponível.&lt;/p&gt;

&lt;p&gt;Já fiz algumas tarefas intensivas no iPad antes, como editar vídeos e desenhar digitalmente com várias camadas, mas nada chegou perto disso.&lt;/p&gt;

&lt;p&gt;Também notei que o consumo começou a aumentar quanto mais edições eu acumulava em uma foto. Então, definitivamente não recomendaria usar isso quando depender apenas da bateria e não puder carregar seus dispositivos. Caso contrário, talvez seja bom ter um powerbank &lt;a href=&quot;https://amzn.to/3YHZOcf&quot;&gt;como esse&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;o-resultado-final&quot;&gt;O Resultado Final&lt;/h2&gt;

&lt;p&gt;Depois de conseguir todas as minhas fotos, só faltava uma coisinha: fazer este pequeno vídeo usando “apenas uma foto”.&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/K3N1ysMNQRU?si=ARBNKgSMNdYLa1m8&amp;amp;controls=0&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;&lt;em&gt;Eu poderia simplesmente tirar todas as fotos em metade do tempo que levei para fazer toda a “limpeza” virtual? Claro que poderia. Mas qual seria a graça disso?&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Se você leu até aqui, pode estar se perguntando qual é a utilidade disso tudo. Bem, imagine que você tem uma alface no meio dos dentes, mas tirando isso a foto está perfeita, agora você pode simplesmente removê-la.&lt;/p&gt;

&lt;p&gt;Um amigo me apontou que você também poderia &lt;a href=&quot;https://bsky.app/profile/gabubellon.me/post/3lahl7pjfxo23&quot;&gt;remover pessoas que você não gosta mais de uma foto antiga&lt;/a&gt; ou alguém fazendo photobomb na sua foto legal de férias.&lt;/p&gt;

&lt;p&gt;Em resumo, o novo recurso é útil, mas é importante estar ciente de suas limitações e peculiaridades, bem como do consumo de bateria.&lt;/p&gt;

&lt;p&gt;Obrigada por ler.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Esse post contém links afiliados.&lt;/em&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 09 Nov 2024 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/testando-a-funcionalidade-de-clean-up-da-apple-intelligence/</link>
        <guid isPermaLink="true">https://jtemporal.com/testando-a-funcionalidade-de-clean-up-da-apple-intelligence/</guid>
        
        <category>IA</category>
        
        <category>LLMs</category>
        
        <category>edição de fotos</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Apple Intelligence Clean Up: removing objects from iPhone photos</title>
        <description>&lt;p&gt;These two photos are the same photo.&lt;/p&gt;

&lt;div style=&quot;display: flex; justify-content: space-between;&quot;&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/initial-photo-with-items-to-be-removed.webp&quot; width=&quot;48%&quot; alt=&quot;Initial desk photo&quot; /&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/final-photo-with-all-items-removed-from-desk.webp&quot; width=&quot;48%&quot; alt=&quot;Final &apos;clean desk&apos; photo&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Don’t believe me? I know, I know. At a glance, you might think “&lt;em&gt;one is a desk with things another is and empty desk there’s no way these are the same photo&lt;/em&gt;”. But then you might give into curiosity and start to notice a few weird things about the second. Some weird shadows and some very straight lines, almost too straight, in the wood grain.&lt;/p&gt;

&lt;p&gt;Well the answer is that I took the first photo, and used Apple Intelligence to clean up the desk (pun not intended) with the Clean Up feature within the Photos app. Read on to know a little bit more about this new functionality.&lt;/p&gt;

&lt;h2 id=&quot;apple-intelligence&quot;&gt;Apple Intelligence&lt;/h2&gt;

&lt;p&gt;As I see it, Apple Intelligence is Apple’s machine learning (ML). With the advancement of artificial intelligence (AI) and large language models (LLMs), Apple had been resistant to using the acronym “AI” and stuck to machine learning whenever they had any feature powered by some sort of algorithm resembling AI.&lt;/p&gt;

&lt;p&gt;In a very Apple move, Apple launched “Apple Intelligence”, and rebranded the AI we all know to something new.&lt;/p&gt;

&lt;p&gt;Yes, Apple, we all saw what you did there.&lt;/p&gt;

&lt;p&gt;Now with Apple Intelligence, they can use the acronym more freely. And although they released a new phone built for AI, no Apple Intelligence features  were seen on the iPhone 16 when it hit the stores back in September 2024.&lt;/p&gt;

&lt;p&gt;In October with iOS 18.1 we started to get a few features from Apple Intelligence and I, like many others, updated my Apple gadgets, the iPhone and iPad, to iOS 18.1 in order to use the first few features from Apple Intelligence.&lt;/p&gt;

&lt;h2 id=&quot;testing-out-ai-in-photos&quot;&gt;Testing out AI in Photos&lt;/h2&gt;

&lt;p&gt;Talking to a friend we noticed we did not use the features yet, so I went into learning mode to figure out what the features were exactly and see how they could fit in my life.&lt;/p&gt;

&lt;p&gt;Out of all of them, the one that caught my eye was the “Clean Up” feature in the Photos app.&lt;/p&gt;

&lt;p&gt;Sure, removing unwanted objects and even people from photos is nothing new, many android phones have had this functionality for a while now, and traditional photo editing software are great at it, but this is not a blog post on the merits of each operating system or editing software.&lt;/p&gt;

&lt;p&gt;If you know me, you know I’m always curious about the  limitations of tools and I wanted to see how far I could push this one… My goal was to “remove” one object at a time, save a new photo with the removed object, and continue on until I had a clean desk top.&lt;/p&gt;

&lt;h2 id=&quot;iphone-or-ipad&quot;&gt;iPhone or iPad?&lt;/h2&gt;

&lt;p&gt;For the curious ones here are my specs: I’m using the &lt;a href=&quot;https://amzn.to/4fjsRtE&quot;&gt;iPhone 16 Pro Max with 256GB&lt;/a&gt; and the &lt;a href=&quot;https://amzn.to/4fCriGN&quot;&gt;iPad Pro 13” M4 256GB launched in 2024&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;starting-on-the-iphone&quot;&gt;Starting on the iPhone&lt;/h3&gt;

&lt;p&gt;I started on my phone, laid out the things on the desk, took the photo, and sat down on the couch with my phone in hand to remove the first object.&lt;/p&gt;

&lt;div style=&quot;display: flex; justify-content: space-between;&quot;&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/initial-photo-with-items-to-be-removed.webp&quot; width=&quot;48%&quot; alt=&quot;Initial photo with items to be removed&quot; /&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/photo-with-first-item-removed-from-desk.webp&quot; width=&quot;48%&quot; alt=&quot;Photo with first item removed from desk&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Can you spot the difference? Look at the bottom right corner. It felt like magic when after a simple circle the thing just vanished.&lt;/p&gt;

&lt;p&gt;I saved the edit, duplicated the photo and went on to the second object: it was time to remove my tiny army knife on the bottom left. It took a little while longer than the first one for it to disappear but it go way. But it left a “shadow”, so I had to also circle the shadow and wait a little while for it also vanish.&lt;/p&gt;

&lt;div style=&quot;display: flex; justify-content: space-between;&quot;&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/photo-with-first-item-removed-from-desk.webp&quot; width=&quot;48%&quot; alt=&quot;Photo with first item removed from desk&quot; /&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/photo-with-first-and-second-item-removed-from-desk.webp&quot; width=&quot;48%&quot; alt=&quot;Photo with first and second item removed from desk&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;After duplicating the new photo, the iPhone was officially a bit hot and started freeze up in the editing process, so I moved on to the iPad to continue with the fun.&lt;/p&gt;

&lt;p&gt;Two notes here:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;First, when the iPhone 16 launched, Apple said that this iPhone was built for AI, but this tiny test I did suggest that the iPhone 17 might be better at it,&lt;/li&gt;
  &lt;li&gt;second, that duplicating photos also saves up all the edits from the past photo as an edit, so you can revert a duplicated photo back to the original for example.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With these in mind I sympathize with the folks with the iPhone 15 that will want to use this feature extensively and that I hope Apple releases updates in the future to address this and some other quirky behaviors you’ll see below.&lt;/p&gt;

&lt;h3 id=&quot;continuing-on-to-the-ipad&quot;&gt;Continuing on to the iPad&lt;/h3&gt;

&lt;p&gt;All things considered, it was super fun to simply circle the object you want to remove and wait a few seconds and it go &lt;em&gt;poof&lt;/em&gt; and just vanish.&lt;/p&gt;

&lt;p&gt;After “vanishing” an object sometimes I also had to address some dark spots left over, I just had to circle the area again to get rid of any leftover dark spots (like shown in the video below).&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/uCjBzMD0fms?si=v_Wby9oBd5N64j8H&amp;amp;controls=0&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;As I expected, the iPad performed better than the iPhone, I didn’t notice it freezing up although the tool responsiveness got slower the further I went.&lt;/p&gt;

&lt;p&gt;And as far as temperature goes, the iPad only got warm, but whenever I got closer to the screen I could feel the warmth emanating from the iPad.&lt;/p&gt;

&lt;h3 id=&quot;then-some-weirdness-happened&quot;&gt;Then Some Weirdness Happened&lt;/h3&gt;

&lt;p&gt;After all objects but one were individually removed, I had a last challenge: to remove the biggest item of the whole photo. The objective was to go from the left to the right.&lt;/p&gt;

&lt;div style=&quot;display: flex; justify-content: space-between;&quot;&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/book-last-item-to-be-removed-from-desk.webp&quot; width=&quot;48%&quot; alt=&quot;Book as last item to be removed from desk&quot; /&gt;
    &lt;img src=&quot;/images/apple-intelligence/clean-up/final-photo-with-all-items-removed-from-desk.webp&quot; width=&quot;48%&quot; alt=&quot;Final &apos;clean desk&apos; photo&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;But what looked like a simple thing after everything I already done turned out to be the moment when the weird things started to happen. I wonder… &lt;em&gt;Does Apple Intelligence, like any other AI models, hallucinate?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hallucination is a known behavior of machine learning, especially in LLMs, and in my opinion one of the most dangerous ones. An hallucination in ML happens when a model produce a coherent response but that is in fact incorrect.&lt;/p&gt;

&lt;p&gt;Since I don’t know if we can qualify if Apple Intelligence was having a hallucination here, especially since we are not interacting textually, I’ll call everything in the realm of unexpected results a “weird behavior”.&lt;/p&gt;

&lt;h3 id=&quot;just-a-blur-for-you&quot;&gt;Just a blur for you&lt;/h3&gt;

&lt;p&gt;The first two attempts to remove the book did not go well. The clean up tool stopped removing things all together and started to “blur” things instead of removing objects.&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;/images/apple-intelligence/clean-up/first-fail-item-not-removed-but-blurred.webp&quot; width=&quot;45%&quot; alt=&quot;Failed attempt to remove item showing blurred result instead&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;After a few failed attempts (one of them you can see in this video below), I finally got to it to do what I wanted to do and the book was removed. Mind you that it required some extra work on my end since circling was not doing the job.&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/LqJ1aX_Q3gg?si=eFMDrNbgWdIdnLJZ&amp;amp;controls=0&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;I wish there was a way for me to tell the tool that it did the wrong thing and to try again, like many text-based LLMs, but there’s no such way. Here you have to hope the feature understands what you want it to do. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;¯\_(ツ)_/¯&lt;/code&gt;&lt;/p&gt;

&lt;h3 id=&quot;there-used-to-be-something-here&quot;&gt;There used to be something here&lt;/h3&gt;

&lt;p&gt;Still on the weird behaviour spectrum, when I tried to paint over the part where a lot of the editing was done before, it showed the “crop out” of the object that was removed previously.&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;/images/apple-intelligence/clean-up/quirky-behavior-with-phantom-items.webp&quot; width=&quot;45%&quot; alt=&quot;Quirky behavior showing phantom items that were previously removed&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Eventually it worked out and I managed to get the photos you saw in the beginning.&lt;/p&gt;

&lt;h2 id=&quot;cleaning-up-is-tiresome-even-for-ai&quot;&gt;Cleaning Up is Tiresome, Even for AI&lt;/h2&gt;

&lt;p&gt;One other tidbit of information was this was a &lt;em&gt;very battery-intensive task&lt;/em&gt;. Editing itself didn’t take long, each object removal took only a few seconds.&lt;/p&gt;

&lt;p&gt;However, I could see my battery percentage go down very steadily. I believe since I started the editing process in the iPad until I finished editing, this feature consumed about 20% of the battery available.&lt;/p&gt;

&lt;p&gt;I’ve done a few intensive tasks in the iPad before like editing videos and digital drawing with multiple layering, but nothing even got close to this.&lt;/p&gt;

&lt;p&gt;I also noticed that it started to drop faster the more I accumulated edits in a photo. So I definitely would not recommend using this while relying solely on battery and unable to charge your devices. If not maybe buy a powerbank (&lt;a href=&quot;https://amzn.to/4hJia55&quot;&gt;this is one I like&lt;/a&gt;).&lt;/p&gt;

&lt;h2 id=&quot;the-end-result&quot;&gt;The end result&lt;/h2&gt;

&lt;p&gt;After getting all my photos there was only one tiny thing left to do this tiny video from “only one photo”.&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/K3N1ysMNQRU?si=ARBNKgSMNdYLa1m8&amp;amp;controls=0&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;&lt;em&gt;Could I just take the bunch of photos in half the time it took me to do all the “cleaning up”? Sure I could. But what is the fun in that?&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;If you read until here you may be wondering why would this be useful at all? Well imagine you have a lettuce stuck in your teeth but otherwise the photo is perfect, now you can simply remove it.&lt;/p&gt;

&lt;p&gt;A friend pointed out to me that you could also &lt;a href=&quot;https://bsky.app/profile/gabubellon.me/post/3lahl7pjfxo23&quot;&gt;remove people you don’t like anymore from an old photo&lt;/a&gt; or someone photobombing your cool vacation photo too.&lt;/p&gt;

&lt;p&gt;In short the new feature is useful but it is important to be aware of its limitations and quirks as well as the possible battery drain.&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;This post contains affiliated links.&lt;/em&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 09 Nov 2024 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/testing-apple-intelligence-s-clean-up-tool/</link>
        <guid isPermaLink="true">https://jtemporal.com/testing-apple-intelligence-s-clean-up-tool/</guid>
        
        <category>AI</category>
        
        <category>LLMs</category>
        
        <category>photo editing</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Fazendo pull requests com GitHub Codespaces e contribuindo com um projeto open source</title>
        <description>&lt;p&gt;Existem diversas formas de fazer pull requests. Nesse blog post você vai aprender a fazer um pull request na prática usando GitHub Codespaces e fazendo um pull request pro GitFichas.&lt;/p&gt;

&lt;h2 id=&quot;o-gitfichas&quot;&gt;O GitFichas&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/gitfichas-agora-e-open-source/&quot;&gt;O GitFichas agora é um projeto open source&lt;/a&gt; e nesse momento está passando por uma migração que vai trazer várias melhorias. Para isso, toda ficha existente hoje precisa ser migrada para o novo formato usando &lt;a href=&quot;https://mermaid.js.org/&quot;&gt;Mermaid&lt;/a&gt;. Como o melhor jeito de aprender é praticando esse blog post vai te mostrar como fazer tudo na prática.&lt;/p&gt;

&lt;p&gt;Vale lembrar que os passos daqui são apenas um jeito de fazer pull requests e na verdade a única recomendação é seguir o guia de contribuição de cada projeto geralmente encontrado no arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONTRIBUTING.md&lt;/code&gt;, presente na maioria dos projetos de código aberto, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/main/CONTRIBUTING.md&quot;&gt;o guia de contribuição do GitFichas pode ser encontrado aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas-e-sua-estrutura&quot;&gt;GitFichas e sua estrutura&lt;/h2&gt;

&lt;p&gt;Um pouco de contexto. Pra começar a contribuir é importante aprender sobre o projeto e a sua estrutura. No caso do GitFichas, existem dois tipos de fichas: fichas de &lt;em&gt;comando&lt;/em&gt; ou fichas de &lt;em&gt;conceito&lt;/em&gt;.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Comando&lt;/strong&gt;: explica um comando como “&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git add -p&lt;/code&gt;” ou “&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git commit --allow-empty&lt;/code&gt;”;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Conceito&lt;/strong&gt;: explica conceitos relacionados ao git, versionamento e assuntos correlatos, como “pull requests” e “conflitos”;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cada tipo de ficha tem uma coleção de campos similar, mas com campos específicos de cada tipo. Esses campos que vão ser usados pelo mermaid para gerar a visualização. Todos os campos a serem usados para fichas &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/main/CONTRIBUTING.md#cards-types&quot;&gt;estão no guia de contribuição&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Falando na estrutura de pastas e arquivos do repositório, fichas em português estão na pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_posts/&lt;/code&gt; e fichas em inglês elas ficam na pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;en/_posts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tanto as fichas em português quanto as fichas em inglês seguem o mesmo padrão de nomes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;YYYY-MM-DD&amp;gt;-&amp;lt;NUMERO&amp;gt;.md&lt;/code&gt; e a data é usada para ordenação das fichas no site enquanto o número corresponde ao número da ficha.&lt;/p&gt;

&lt;p&gt;De resto, os arquivos seguem o padrão de blogs escritos usando &lt;a href=&quot;http://jekyllrb.com/&quot;&gt;Jekyll, um gerador de site estáticos&lt;/a&gt; feito em Ruby. Sim, o GitFichas é em essência um blog, ele usa &lt;a href=&quot;https://shopify.github.io/liquid/&quot;&gt;Liquid para fazer os templates&lt;/a&gt; que viram as páginas que você vê no site.&lt;/p&gt;

&lt;p&gt;Além disso vale mencionar que o site é construído e servido pelo GitHub e você consegue ver uma pré-visualização das mudanças graças ao Netlify.&lt;/p&gt;

&lt;h2 id=&quot;requisitos&quot;&gt;Requisitos&lt;/h2&gt;

&lt;p&gt;Você vai precisar de:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Uma conta no GitHub.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sim, só isso. Se você souber git seguir o passo a passo vai ficar mais fácil, mas se você ainda está aprendendo git você ainda vai conseguir acompanhar o passo a passo.&lt;/p&gt;

&lt;h2 id=&quot;por-onde-começar&quot;&gt;Por onde começar&lt;/h2&gt;

&lt;p&gt;O projeto para contribuir você já tem e você já deu uma olhada no guia de contribuição. Agora você precisa escolher uma &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues&quot;&gt;issue no repositório do GitFichas&lt;/a&gt;. Escolher uma issue vai te ajudar a identificar fichas que ainda não foram migradas para o novo formato além de saber qual nome dar para o seu branch.&lt;/p&gt;

&lt;p&gt;Aqui vou usar a ficha &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#050&lt;/code&gt; em inglês. A migração dessa ficha está anotada &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/116&quot;&gt;na issue #116&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/issue-116-gitfichas-repo.webp&quot; alt=&quot;issue 116 gitfichas repo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Com a issue escolhida podemos começar a trabalhar. Os passos são:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Fazer um fork;&lt;/li&gt;
  &lt;li&gt;Criar um novo branch;&lt;/li&gt;
  &lt;li&gt;Iniciar o Codespace;&lt;/li&gt;
  &lt;li&gt;Fazer as alterações;&lt;/li&gt;
  &lt;li&gt;Conferir as mudanças rodando o site;&lt;/li&gt;
  &lt;li&gt;Submeter o pull request.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;1-faça-um-fork&quot;&gt;1. Faça um fork&lt;/h2&gt;

&lt;p&gt;Crie um fork do repositório na sua conta, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/fork&quot;&gt;você pode clicar nesse link aqui&lt;/a&gt; ou na interface do GitHub no repositório clique no botão “Fork”.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/fork-button.webp&quot; alt=&quot;botao de fork&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Lembre-se de clicar em “Create” na página seguinte para criar o seu fork.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/create-fork-form.webp&quot; alt=&quot;form para criarfork&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Isso vai criar uma cópia do repositório original na sua conta o que vai te permitir fazer as suas contribuições já que um fork na usa conta vai te dar plenos poderes de edição.&lt;/p&gt;

&lt;h2 id=&quot;2-crie-um-novo-branch&quot;&gt;2. Crie um novo branch&lt;/h2&gt;

&lt;p&gt;Depois de ter um fork é sempre importante criar novos branches, um para cada contribuição. Usar branches ao invés de trabalhar direto na &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; vai te permitir fazer múltiplas contribuições ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;O nome do seu branch deverá seguir aquilo descrito no &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/main/CONTRIBUTING.md&quot;&gt;guia de contribuição do repositório&lt;/a&gt;. No caso do GitFichas o padrão a ser seguido é &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;nome de usuário&amp;gt;-&amp;lt;issue ou descrição&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/create-branch.webp&quot; alt=&quot;criar branch&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Como a nossa issue é a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#116&lt;/code&gt; e o nome do meu usuário é &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jesstemporal&lt;/code&gt; o nome do branch ficou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jesstemporal-fix-116&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para criar o branch com esse nom, você clica no seletor de branches que indica o branch atual o  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; e deve digitar o nome do novo branch na caixa de pesquisa, isso irá mostrar o botão de criação com o nome que você digitou como mostrado na imagem acima.&lt;/p&gt;

&lt;h2 id=&quot;3-inicie-o-seu-github-codespace&quot;&gt;3. Inicie o seu GitHub Codespace&lt;/h2&gt;

&lt;p&gt;Codespaces são ótimos pois você consegue um ambiente completo de desenvolvimento em poucos minutos, basta ter uma conexão com a internet. Outra vantagem é que Codespaces são efêmeros e te permite ter um ambiente completamente isolado sem você precisar instalar nada na sua máquina.&lt;/p&gt;

&lt;p&gt;Clique em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;&amp;gt; Code&lt;/code&gt; e na aba &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Codespaces&lt;/code&gt; clique no botão de criação como mostrado na imagem abaixo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/window-create-new-codespaces.webp&quot; alt=&quot;janela para criar criar um novo codespace&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Isso deve abrir uma nova aba no seu navegador. Criar um novo Codespaces pode demorar alguns segundos, mas uma vez que esteja pronto para uso você deve ver algo similar a tela abaixo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/new-github-codespaces-on-gitfichas-fork.webp&quot; alt=&quot;um novo codespace no fork do gitfichas&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Chegou a hora de fazer as alterações.&lt;/p&gt;

&lt;h2 id=&quot;4-faça-as-alterações&quot;&gt;4. Faça as alterações&lt;/h2&gt;

&lt;p&gt;Como vamos editar a ficha &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#050&lt;/code&gt; em inglês ela se encontra em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;en/_posts/2023-08-04-050.md&lt;/code&gt;. Ao abrir o arquivo você conseguirá ver o conteúdo atual da ficha e começar a fazer as alreações.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/github-codespaces-ficha-050-open.webp&quot; alt=&quot;ficha 050 aberta no codespace&quot; /&gt;&lt;/p&gt;

&lt;p&gt;O jeito mais fácil para saber que alterações fazer é olhar o que existe na ficha atual e copiar o conteúdo da página aos poucos seguindo os exemplos no guia de contribuição.&lt;/p&gt;

&lt;p&gt;A ficha &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#050&lt;/code&gt; desenhada aparece dessa forma na página:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/gitficha-050.webp&quot; alt=&quot;imagem da ficha 050 no site gitfichas.com&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;composição-de-uma-ficha&quot;&gt;Composição de uma ficha&lt;/h3&gt;

&lt;p&gt;Vamos entender o que compõe uma ficha:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Titulo: Part superior da ficha. Nesse caso “Pulling changes” títulos são compostos de 3 partes:
    &lt;ol&gt;
      &lt;li&gt;Pre-título: tudo escrito antes das letras quadradas, nesse caso não existe pre-título;&lt;/li&gt;
      &lt;li&gt;Principal: a parte principal do título, na ficha 50 é o “Pulling”;&lt;/li&gt;
      &lt;li&gt;Sub-título: tudo que vem depois da parte principal nesse caso “changes”;&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;Comando: O comando escrito em uma fonte cursiva, (essa parte só aparece em fichas do tipo comando);&lt;/li&gt;
  &lt;li&gt;Partes: as informações que explicam cada parte do comando. As partes são divididas em dois tipos:
    &lt;ol&gt;
      &lt;li&gt;Comando: Que é o comando em si, nesse caso &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pull&lt;/code&gt;;&lt;/li&gt;
      &lt;li&gt;Partes: Todas as informações depois do comando nesse caso &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remote&lt;/code&gt; e &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;branch&lt;/code&gt;;&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;Informação: parte final que adiciona mais informações sobre um comando.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/anatomia-de-uma-ficha.webp&quot; alt=&quot;anatomia de uma ficha&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;preenchendo-o-novo-conteúdo&quot;&gt;Preenchendo o novo conteúdo&lt;/h2&gt;

&lt;p&gt;Como essa ficha apresenta um comando, você precisa usar o &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/main/CONTRIBUTING.md#command-cards-example&quot;&gt;exemplo de ficha de comando do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONTRIBUTING.md&lt;/code&gt;&lt;/a&gt; e preencher as informações de acordo como mostrado abaixo:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;post&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;pretitle&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Pulling&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;subtitle&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;changes&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;git pull remote branch&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;descriptors&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;command to \ndowload changes&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;part1&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;repository from where\n to download changes&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;part2&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;branch to download\n changes from&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;usually both the remote and the branch can be omitted&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;@jtemporal&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;050&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;mermaid&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;translated&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/projects/050&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/en/050&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;en&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;pv&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/en/049&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;#049&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;target&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;nt&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/en/051&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;#051&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--allow-empty&quot;&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;

&lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;include mermaid-graphs.html %&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note que foi necessário alterar as variáveis &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;title&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;subtitle&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;command&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;descriptors&lt;/code&gt; e suas sub-variáveis, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;info&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;number&lt;/code&gt;. E adicionar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mermaid: true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As demais variáveis &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;layout&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;translated&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;permalink&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lang&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pv&lt;/code&gt; e sub-variáveis, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nt&lt;/code&gt; e sub-variáveis, vão ser as existentes no arquivo original e não precisam de alteração.&lt;/p&gt;

&lt;p&gt;Por fim, é necessário substituir o conteúdo da ficha que vem depois do front-matter e colocar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{% include mermaid-graphs.html %}&lt;/code&gt;. Essa linha vai garantir a apresentação da renderização do conteúdo que você acabou de preencher.&lt;/p&gt;

&lt;p&gt;Dicas na migração de fichas:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Atente para quebras de linha, para que uma ficha fique legível talvez seja necessário fazer quebras de linha diferentes daquelas vistas nas fichas originais. Você vai poder conferir isso na próxima seção.&lt;/li&gt;
  &lt;li&gt;Cada ficha tem uma tabela com a descrição das partes, use essa tabela para facilitar a sua contribuição.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;5-rode-o-site-e-confira-as-mudanças&quot;&gt;5. Rode o site e confira as mudanças&lt;/h2&gt;

&lt;p&gt;Como você está usando um novo Codespace você vai precisar instalar as dependências para então rodar o site. Comece instalando as dependências:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bundle &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Em seguida rode o site:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;jekyll s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Esse comando acima vai montar o site e te permitir conferir os ajustes que você acabou de fazer.&lt;/p&gt;

&lt;p&gt;Quando o site estiver rodando, uma pop-up vai aparecer no canto inferior esquerdo do seu Codespaces perguntando se você quer abrir a visualização do site.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/open-in-browser-pop-up.webp&quot; alt=&quot;&amp;quot;open in browser&amp;quot; pop up&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Clique &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Open in Browser&lt;/code&gt; isso vai abrir uma nova aba com o site que está rodando no seu Codespace. Navegue até a ficha que você alterou para ver as mudanças.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/after-changes-build.webp&quot; alt=&quot;build do site depois das mudanças&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Depois de conferir que a ficha está renderizando corretamente e que as informações estão legíveis você pode fazer o seu pull request.&lt;/p&gt;

&lt;p&gt;Note caso você tenha dificuldades em fazer a renderização da ficha e precisar de ajuda você sempre pode abrir uma issue para pedir ajuda ou um pull request com status “WIP” e descrever o problema que está encontrando. Isso segue a boa prática de receber feedback cedo e assim ajustar as suas contribuições de acordo.&lt;/p&gt;

&lt;h2 id=&quot;6-faça-o-pull-request&quot;&gt;6. Faça o pull request&lt;/h2&gt;

&lt;p&gt;Agora que está tudo nos conformes chegou a hora de mandar a contribuição.&lt;/p&gt;

&lt;h3 id=&quot;faça-o-commit-das-mudanças&quot;&gt;Faça o commit das mudanças&lt;/h3&gt;

&lt;p&gt;Primeiro adicione as alterações em staging:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git add en/_posts/2023-08-04-050.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Aqui é importante adicionar apenas o arquivo alterado. E agora faça o commit:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Migrates card 050&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Lembre-se de alterar a mensagem entre aspas para descrever as alterações que você está fazendo.&lt;/p&gt;

&lt;h3 id=&quot;faça-o-push-do-branch&quot;&gt;Faça o push do branch&lt;/h3&gt;

&lt;p&gt;Com o commit feito é necessário publicar as mudanças com o push, como é a primeira vez que estamos publicando mudanças precisamos fazer o setup do branch no upstream usando a opção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-u&lt;/code&gt; :&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git push &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; origin jtemporal-fix-116
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Quando o push for concluído, vai aparecer um link para fazer o pull request no próprio terminal.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/result-of-git-push.webp&quot; alt=&quot;resultado do git push&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Clique nele e, em seguida, clique no “Yes” no pop-up que pergunta se você quer abrir o pull request dentro do Codespaces usando a extensão para pull requests e issues.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/pull-request-pop-up-using-the-extension-in-codespaces.webp&quot; alt=&quot;pull request pop up usando extensão no codespaces&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;abra-o-pull-request-e-aguarde&quot;&gt;Abra o pull request e aguarde&lt;/h3&gt;

&lt;p&gt;Isso vai abrir um menu lateral esquerdo onde você pode ajustar as informações do pull request como mostrado na imagem abaixo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/opening-pull-request-from-codespaces.webp&quot; alt=&quot;abrindo pull request a partir do codespace&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Você pode por exemplo adicionar uma descrição das mudanças e &lt;a href=&quot;https://docs.github.com/pt/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue&quot;&gt;conectar o seu pull request à issue que ele resolve usando as palavras mágicas&lt;/a&gt;. Agora é a aguardar a revisão e merge. 🎉 🎉 🎉&lt;/p&gt;

&lt;h2 id=&quot;revisão-de-pull-requests&quot;&gt;Revisão de pull requests&lt;/h2&gt;

&lt;p&gt;Agora essa parte não depende só de você. Depois de submeter o seu pull request a pessoa ou pessoas que mantêm o projeto precisam revisar a sua contribuição. A partir de agora as coisas acontecem na página do repositório original onde o pull request existe.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/pull-request-187-on-gitfichas.webp&quot; alt=&quot;pull request 187 no gitfichas&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Como uma útima checagem você pode utilizar o “Deploy Preview” para ver as alterações que fez dessa vez na pre-visualização gerada pelo Netlify. Ela não deve ser diferente daquela que você viu ao rodar o site mais cedo, mas é sempre bom dar uma conferida.&lt;/p&gt;

&lt;p&gt;Outros projetos podem ou não ter ambientes de visualização semelhantes a esse. E agora entram as pessoas que mantém o projeto para fazer a revisão da sua contribuição.&lt;/p&gt;

&lt;p&gt;Depois de revisar, mantenedores podem pedir alterações pra você ou fazer as alterações no seu pull request para poder fazer o merge. &lt;em&gt;Fica com você a responsabilidade de conferir e fazer as alterações pedidas&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Uma vez que o pull request esteja de acordo com o esperado, mantenedores vão aprovar e fazer o merge e então as alterações devem ir ao ar no próximo build do site. No caso do GitFichas isso vai acontecer de forma automática pelo GitHub.&lt;/p&gt;

&lt;p&gt;E é isso, parabéns você acabou de fazer a sua contribuição.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Na maioria dos casos seguir o conjunto de passos descrito nesse blog post vai te ajudar a fazer contribuições de qualidade, então relembrando: Depois de escolher uma issue para trabalhar e se familiarizar com o guia de contribuição do projeto você precisa seguir os passos abaixo.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Fazer um fork;&lt;/li&gt;
  &lt;li&gt;Criar um novo branch;&lt;/li&gt;
  &lt;li&gt;Iniciar o Codespace;&lt;/li&gt;
  &lt;li&gt;Fazer as alterações;&lt;/li&gt;
  &lt;li&gt;Conferir as mudanças rodando o site;&lt;/li&gt;
  &lt;li&gt;Submeter o pull request.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Então é aguardar a revisão e aprovação do pull request. Vale lembrar que com grandes poderes vêm grandes responsabilidades e qualidade é mais importante que quantidade e embora esse pull request não tenha sido com código você agora tem as ferramentas para fazer contribuições de código ou não.&lt;/p&gt;

&lt;p&gt;Agora que você já sabe contribuir aproveita pra dar uma lida neste outro post com “&lt;a href=&quot;https://jtemporal.com/5-dicas-para-fazer-o-seu-pull-request-brilhar/&quot;&gt;5 Dicas Para Fazer o Seu Pull Request Brilhar ✨&lt;/a&gt;”.&lt;/p&gt;
</description>
        <pubDate>Tue, 29 Oct 2024 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/fazendo-pull-requests-com-github-codespaces/</link>
        <guid isPermaLink="true">https://jtemporal.com/fazendo-pull-requests-com-github-codespaces/</guid>
        
        <category>opensource</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>pull request</category>
        
        <category>portugues</category>
        
        
      </item>
    
      <item>
        <title>Learn to make pull requests using GitHub Codespaces and contribute to open source</title>
        <description>&lt;p&gt;There are several ways to make pull requests. In this blog post, you will learn how to make a pull request in practice using GitHub Codespaces and making a pull request to GitFichas.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/gitfichas-is-now-open-source/&quot;&gt;GitFichas is now an open source project&lt;/a&gt; and is currently undergoing a migration that will bring several improvements. For this, every existing card needs to be migrated to the new format using &lt;a href=&quot;https://mermaid.js.org/&quot;&gt;Mermaid&lt;/a&gt;. As the best way to learn is by practicing, this blog post will show you how to do everything in practice.&lt;/p&gt;

&lt;p&gt;It’s worth remembering that the steps here are just one way to make pull requests, and the only real recommendation is to follow the contribution guide for each project, usually found in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONTRIBUTING.md&lt;/code&gt; file, present in most open-source projects. &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/main/CONTRIBUTING.md&quot;&gt;The contribution guide for GitFichas can be found here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas-and-its-structure&quot;&gt;GitFichas and its structure&lt;/h2&gt;

&lt;p&gt;A bit of context first. To start contributing, it’s important to learn about the project and its structure. In the case of GitFichas, there are two types of cards: &lt;em&gt;command&lt;/em&gt; cards or &lt;em&gt;concept&lt;/em&gt; cards.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Command cards&lt;/strong&gt;: explains a command like “&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git add -p&lt;/code&gt;” or “&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git commit --allow-empty&lt;/code&gt;”;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Concept cards&lt;/strong&gt;: explains concepts related to git, versioning, and related topics, such as “pull requests” and “conflicts”;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each type of card has a similar collection of fields, but with specific fields for each type. These fields will be used by mermaid to generate the visualization. All the fields to be used for cards &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/main/CONTRIBUTING.md#cards-types&quot;&gt;are in the contribution guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Speaking of the repository’s folder and file structure, cards in Portuguese are in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_posts/&lt;/code&gt; folder, and cards in English are in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;en/_posts&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;Both Portuguese and English cards follow the same naming pattern &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;YYYY-MM-DD&amp;gt;-&amp;lt;NUMBER&amp;gt;.md&lt;/code&gt;. The date is used for ordering the cards on the site while the number corresponds to, well, the card number.&lt;/p&gt;

&lt;p&gt;Otherwise, the files follow the pattern of blogs written using &lt;a href=&quot;http://jekyllrb.com/&quot;&gt;Jekyll, a static site generator&lt;/a&gt; made in Ruby. Yes, GitFichas is essentially a blog, it uses &lt;a href=&quot;https://shopify.github.io/liquid/&quot;&gt;Liquid for templating&lt;/a&gt; which turns into the pages you see on the site.&lt;/p&gt;

&lt;p&gt;Additionally, it’s worth mentioning that the site is built and served by GitHub, and you can see a preview of the changes thanks to Netlify.&lt;/p&gt;

&lt;h2 id=&quot;requirements&quot;&gt;Requirements&lt;/h2&gt;

&lt;p&gt;You will need:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A GitHub account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, that’s it. If you know git, following the step-by-step will be easier, but if you are still learning git, you will still be able to follow along.&lt;/p&gt;

&lt;h2 id=&quot;where-to-start&quot;&gt;Where to Start&lt;/h2&gt;

&lt;p&gt;You already have the project to contribute to, and you’ve taken a look at the contribution guide. Now you need to choose an &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues&quot;&gt;issue in the GitFichas repository&lt;/a&gt;. Choosing an issue will help you identify cards that have not yet been migrated to the new format and know what name to give your branch.&lt;/p&gt;

&lt;p&gt;Here, I will use card &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#050&lt;/code&gt; in English. The migration of this card is noted &lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues/116&quot;&gt;in issue #116&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/issue-116-gitfichas-repo.webp&quot; alt=&quot;issue 116 gitfichas repo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;With the issue chosen, we can start working. The steps are:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Fork the repository;&lt;/li&gt;
  &lt;li&gt;Create a new branch;&lt;/li&gt;
  &lt;li&gt;Start the Codespace;&lt;/li&gt;
  &lt;li&gt;Make the changes;&lt;/li&gt;
  &lt;li&gt;Check the changes by running the site;&lt;/li&gt;
  &lt;li&gt;Submit the pull request.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;1-fork-the-repository&quot;&gt;1. Fork the repository&lt;/h2&gt;

&lt;p&gt;Create a fork of the repository in your account, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/fork&quot;&gt;you can click this link here&lt;/a&gt; or in the GitHub interface on the repository, click the “Fork” button.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/fork-button.webp&quot; alt=&quot;Fork button int the github interface&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Remember to click “Create” on the next page to create your fork.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/create-fork-form.webp&quot; alt=&quot;Form for creating a fork&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This will create a copy of the original repository in your account, allowing you to make your contributions since a fork in your account will give you full editing powers.&lt;/p&gt;

&lt;h2 id=&quot;2-create-a-new-branch&quot;&gt;2. Create a new branch&lt;/h2&gt;

&lt;p&gt;After forking the repository, it’s always important to create new branches, one for each contribution. Using branches instead of working directly on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; will allow you to make multiple contributions at the same time.&lt;/p&gt;

&lt;p&gt;The name of your branch should follow what is described in the &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/main/CONTRIBUTING.md&quot;&gt;repository’s contribution guide&lt;/a&gt;. In the case of GitFichas, the pattern to follow is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;username&amp;gt;-&amp;lt;issue or description&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/create-branch.webp&quot; alt=&quot;creating a branch in the github interface&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Since our issue is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#116&lt;/code&gt; and my username is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jesstemporal&lt;/code&gt;, the branch name will be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jesstemporal-fix-116&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To create the branch with this name, click on the branch selector that indicates the current branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; and type the name of the new branch in the search box. This will show the creation button with the name you typed, as shown in the image above.&lt;/p&gt;

&lt;h2 id=&quot;3-start-your-github-codespace&quot;&gt;3. Start your GitHub Codespace&lt;/h2&gt;

&lt;p&gt;Codespaces are great because you can get a complete development environment in just a few minutes, as long as you have an internet connection. Another advantage is that Codespaces are ephemeral and allow you to have a completely isolated environment without needing to install anything on your machine.&lt;/p&gt;

&lt;p&gt;Click on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;&amp;gt; Code&lt;/code&gt; and in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Codespaces&lt;/code&gt; tab, click the creation button as shown in the image below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/window-create-new-codespaces.webp&quot; alt=&quot;Window with the codespaces creation&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This should open a new tab in your browser. Creating a new Codespace may take a few seconds, but once it’s ready for use, you should see something similar to the screen below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/new-github-codespaces-on-gitfichas-fork.webp&quot; alt=&quot;New github codespaces on gitfichas fork&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s time to make the changes.&lt;/p&gt;

&lt;h2 id=&quot;4-make-the-changes&quot;&gt;4. Make the changes&lt;/h2&gt;

&lt;p&gt;Since we are editing card &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#050&lt;/code&gt; in English, it is located in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;en/_posts/2023-08-04-050.md&lt;/code&gt;. When you open the file, you will be able to see the current content of the card and start making the changes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/github-codespaces-ficha-050-open.webp&quot; alt=&quot;GitHub Codespaces with GitFicha 050 file open&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The easiest way to know what changes to make is to look at what exists in the current card and copy the content from the page gradually, following the examples in the contribution guide.&lt;/p&gt;

&lt;p&gt;Card &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#050&lt;/code&gt; appears on the page as follows:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/gitficha-050.webp&quot; alt=&quot;GitFicha 050&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;composition-of-a-card&quot;&gt;Composition of a card&lt;/h3&gt;

&lt;p&gt;Let’s understand what makes up a card:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Title: The top part of the card. In this case, “Pulling changes” titles are composed of 3 parts:
    &lt;ol&gt;
      &lt;li&gt;Pre-title: everything written before the square letters, in this case, there is no pre-title;&lt;/li&gt;
      &lt;li&gt;Main: the main part of the title, in card 50 it is “Pulling”;&lt;/li&gt;
      &lt;li&gt;Subtitle: everything that comes after the main part, in this case, “changes”;&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;Command: The command written in an italic font (this part only appears in command-type cards);&lt;/li&gt;
  &lt;li&gt;Parts: the information that explains each part of the command. The parts are divided into two types:
    &lt;ol&gt;
      &lt;li&gt;Command: Which is the command itself, in this case, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pull&lt;/code&gt;;&lt;/li&gt;
      &lt;li&gt;Parts: All the information after the command, in this case, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remote&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;branch&lt;/code&gt;;&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;Information: the final part that adds more information about a command.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/git-study-card-anatomy.webp&quot; alt=&quot;GitFichas anatomy&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;filling-in-the-new-content&quot;&gt;Filling in the new content&lt;/h2&gt;

&lt;p&gt;Since this card presents a command, you need to use the &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/main/CONTRIBUTING.md#command-cards-example&quot;&gt;command card example from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONTRIBUTING.md&lt;/code&gt;&lt;/a&gt; and fill in the information accordingly as shown below:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;post&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;pretitle&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Pulling&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;subtitle&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;changes&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;git pull remote branch&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;descriptors&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;command to \ndowload changes&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;part1&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;repository from where\n to download changes&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;part2&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;branch to download\n changes from&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;usually both the remote and the branch can be omitted&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;@jtemporal&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;050&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;mermaid&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;translated&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/projects/050&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/en/050&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;en&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;pv&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/en/049&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;#049&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;target&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;nt&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/en/051&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;#051&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--allow-empty&quot;&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;

&lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;include mermaid-graphs.html %&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that it was necessary to change the variables &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;title&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;subtitle&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;command&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;descriptors&lt;/code&gt; and their sub-variables, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;info&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;number&lt;/code&gt;. And add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mermaid: true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The other variables &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;layout&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;translated&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;permalink&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lang&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pv&lt;/code&gt; and sub-variables, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nt&lt;/code&gt; and sub-variables, will be the ones existing in the original file and do not need to be changed.&lt;/p&gt;

&lt;p&gt;Finally, it is necessary to replace the content of the card that comes after the front matter and place &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{% include mermaid-graphs.html %}&lt;/code&gt;. This line will ensure the rendering of the content you just filled in.&lt;/p&gt;

&lt;p&gt;Tips for migrating cards:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Pay attention to line breaks, for a card to be readable it may be necessary to make line breaks different from those seen in the original cards. You will be able to check this in the next section.&lt;/li&gt;
  &lt;li&gt;Each card has a table with the description of the parts, use this table to facilitate your contribution.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;5-run-the-site-and-check-the-changes&quot;&gt;5. Run the site and check the changes&lt;/h2&gt;

&lt;p&gt;Since you are using a new Codespace, you will need to install the dependencies before running the site. Start by installing the dependencies:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bundle &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Next, run the site:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;jekyll s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This command will build the site and allow you to check the adjustments you just made.&lt;/p&gt;

&lt;p&gt;When the site is running, a pop-up will appear in the lower-left corner of your Codespaces asking if you want to open the site preview.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/open-in-browser-pop-up.webp&quot; alt=&quot;open in browser pop up&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Open in Browser&lt;/code&gt; to open a new tab with the site running in your Codespace. Navigate to the card you modified to see the changes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/after-changes-build.webp&quot; alt=&quot;after changes build&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After confirming that the card is rendering correctly and the information is readable, you can proceed with your pull request.&lt;/p&gt;

&lt;p&gt;Note that if you have difficulties rendering the card and need help, you can always open an issue to ask for assistance or a pull request with “WIP” status and describe the problem you are encountering. This follows the best practice of getting early feedback and adjusting your contributions accordingly.&lt;/p&gt;

&lt;h2 id=&quot;6-submit-the-pull-request&quot;&gt;6. Submit the pull request&lt;/h2&gt;

&lt;p&gt;Now that everything is in order, it’s time to submit your contribution.&lt;/p&gt;

&lt;h3 id=&quot;commit-the-changes&quot;&gt;Commit the changes&lt;/h3&gt;

&lt;p&gt;First, add the changes to staging:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git add en/_posts/2023-08-04-050.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here it is important to add only the modified file. And now commit:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Migrates card 050&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Remember to change the message between quotes to describe the changes you are making.&lt;/p&gt;

&lt;h3 id=&quot;push-the-branch&quot;&gt;Push the branch&lt;/h3&gt;

&lt;p&gt;With the commit done, it is necessary to publish the changes with the push. Since this is the first time we are publishing changes, we need to set up the branch on the upstream using the -u option:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git push &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; origin jtemporal-fix-116
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When the push is completed, a link to create the pull request will appear in the terminal itself.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/result-of-git-push.webp&quot; alt=&quot;Result of git push and sending the code to the remote&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Click on it and then click “Yes” on the pop-up that asks if you want to open the pull request within Codespaces using the pull requests and issues extension.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/pull-request-pop-up-using-the-extension-in-codespaces.webp&quot; alt=&quot;pull request pop up using the extension in codespaces&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;open-the-pull-request-and-wait&quot;&gt;Open the pull request and wait&lt;/h3&gt;

&lt;p&gt;This will open a left sidebar where you can adjust the pull request information as shown in the image below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/opening-pull-request-from-codespaces.webp&quot; alt=&quot;opening pull request from codespaces&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can, for example, add a description of the changes and &lt;a href=&quot;https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue&quot;&gt;connect your pull request to the issue it resolves using magic words&lt;/a&gt;. Now you just have to wait for the review and merge. 🎉 🎉 🎉&lt;/p&gt;

&lt;h2 id=&quot;pull-requests-review&quot;&gt;Pull requests review&lt;/h2&gt;

&lt;p&gt;Now this part does not depend only on you. After submitting your pull request, the person or people who maintain the project need to review your contribution. From now on, things happen on the original repository page where the pull request exists.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/contributing-to-gitfichas/pull-request-187-on-gitfichas.webp&quot; alt=&quot;Pull request 187 on gitfichas&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As a final check, you can use the “Deploy Preview” to see the changes you made this time in the preview generated by Netlify. It should not be different from what you saw when running the site earlier, but it is always good to double-check.&lt;/p&gt;

&lt;p&gt;Other projects may or may not have similar preview environments. And now the project maintainers come in to review your contribution.&lt;/p&gt;

&lt;p&gt;After reviewing, maintainers may request changes from you or make changes to your pull request to be able to merge. &lt;em&gt;It is your responsibility to check and make the requested changes&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Once the pull request meets expectations, maintainers will approve and merge it, and then the changes should go live in the next site build. In the case of GitFichas, this will happen automatically via GitHub.&lt;/p&gt;

&lt;p&gt;And that’s it, congratulations, you just made your contribution.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;In most cases, following the set of steps described in this blog post will help you make quality contributions, so to recap: After choosing an issue to work on and familiarizing yourself with the project’s contribution guide, you need to follow the steps below.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Fork the repository;&lt;/li&gt;
  &lt;li&gt;Create a new branch;&lt;/li&gt;
  &lt;li&gt;Start the Codespace;&lt;/li&gt;
  &lt;li&gt;Make the changes;&lt;/li&gt;
  &lt;li&gt;Check the changes by running the site;&lt;/li&gt;
  &lt;li&gt;Submit the pull request.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then, wait for the review and approval of the pull request. It is worth remembering that with great power comes great responsibility, and quality is more important than quantity. Although this pull request did not involve code, you now have the tools to make code or non-code contributions.&lt;/p&gt;

&lt;p&gt;Now that you know how to contribute, take the opportunity to read this other post with “&lt;a href=&quot;https://jtemporal.com/tips-to-make-your-pull-request-shine&quot;&gt;5 Tips to Make Your Pull Request Shine ✨&lt;/a&gt;”.&lt;/p&gt;
</description>
        <pubDate>Tue, 29 Oct 2024 04:00:00 +0000</pubDate>
        <link>https://jtemporal.com/making-pull-requests-with-github-codespaces/</link>
        <guid isPermaLink="true">https://jtemporal.com/making-pull-requests-with-github-codespaces/</guid>
        
        <category>opensource</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>pull request</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>GitFichas agora é Open Source 🎉</title>
        <description>&lt;p&gt;Isso significa que se você está procurando um projeto para contribuir, você acabou de encontrar!&lt;/p&gt;

&lt;h2 id=&quot;o-que-é-gitfichas&quot;&gt;O que é GitFichas?&lt;/h2&gt;

&lt;p&gt;GitFichas é uma coleção de fichas de estudo sobre git. Foi inicialmente de código fechado e mantido somente por mim, principalmente devido ao fato de que eu desenhava cada uma das fichas à mão.&lt;/p&gt;

&lt;p&gt;Depois de algum tempo, até criei fontes para facilitar o processo, mas ainda precisava pegar meu iPad e o aplicativo Procreate para transformar minhas anotações em uma imagem.&lt;/p&gt;

&lt;p&gt;Eu sempre quis que o gitfichas fosse mais. Mais acessível, mais colaborativo, mais útil. E com &lt;a href=&quot;https://mermaid.js.org&quot;&gt;mermaid&lt;/a&gt; eu acho que podemos conseguir isso.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas-e-acessibilidade&quot;&gt;GitFichas e acessibilidade&lt;/h2&gt;

&lt;p&gt;Eu dei o meu melhor para melhorar a legibilidade, ajustando o contraste das cores nas fichas. Também adicionei texto alternativo a todas as imagens, bem como uma tabela em cada página individual de cada ficha descrevendo cada parte de cada comando ou conceito.&lt;/p&gt;

&lt;p&gt;Mas eu também queria ter um modo escuro, melhores opções de cores para diferentes habilidades visuais e, finalmente, também melhorar o resultado para leitores de tela. É aí que entra mermaid. Mermaid permite gerar fichas baseadas em texto que podem ser personalizados usando CSS e JS.&lt;/p&gt;

&lt;p&gt;Essas mudanças também levarão um tempo para acontecer, mas agora são possíveis. ☺️&lt;/p&gt;

&lt;h2 id=&quot;por-que-agora-virou-open-source&quot;&gt;Por que agora virou open source?&lt;/h2&gt;

&lt;p&gt;Como diria o Zen do Python: “Agora é melhor do que nunca”.&lt;/p&gt;

&lt;p&gt;Tenho trabalhado &lt;em&gt;lentamente&lt;/em&gt; para descobrir a próxima versão já tem um tempo e finalmente descobri como customizar e estruturar os gráficos mermaid para que pareçam mais com a versão anterior que eu tinha para as fichas. Então aqui estamos.&lt;/p&gt;

&lt;p&gt;Além de melhorar a acessibilidade, essa mudança tornará esse projeto mais parte da comunidade e permitirá melhorias mais rápidas e a publicação de mais fichas, podendo até mesmo ser um trampolim para a comunidade criar outros projetos como esse.&lt;/p&gt;

&lt;h2 id=&quot;como-contribuir&quot;&gt;Como contribuir&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues&quot;&gt;Abri um pouco mais de 100 issues no repositório do GitFichas&lt;/a&gt; que falam sobre melhorias que precisam acontecer para completar a migração para fichas no modo mermaid ao invés de imagens. Você pode trabalhar em uma delas ou em vários delas. Você também pode contar pra sua galera sobre o projeto e convidar geral pra colaborar.&lt;/p&gt;

&lt;p&gt;OU.&lt;/p&gt;

&lt;p&gt;Você pode enviar uma nova ficha com um novo comando ou conceito. Posso te ajudar a revisar e refinar palavras se precisar. Basta abrir um issue e enviar seu PR, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/main/CONTRIBUTING.md&quot;&gt;seguindo o guia de contribuição (em inglês)&lt;/a&gt; disponível no repositório.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;E do fundo do meu coração: embora já tenha passado um bom tempo desde que publiquei novas fichas, o GitFichas tem sido um dos meus projetos pessoais favoritos. Eu o criei para ajudar pessoas desenvolvedoras como você e eu que podem precisar de ajuda com comandos git de tempos em tempos.&lt;/p&gt;

&lt;p&gt;Espero que tornar o GitFichas open source ajude ainda mais pessoas desenvolvedoras com Git. Dito isso, o GitFichas agora é de open source e &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;estou ansiosa para sua contribuição no GitHub.&lt;/a&gt; 🎉&lt;/p&gt;
</description>
        <pubDate>Fri, 25 Oct 2024 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/gitfichas-agora-e-open-source/</link>
        <guid isPermaLink="true">https://jtemporal.com/gitfichas-agora-e-open-source/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>open-source</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>portugues</category>
        
        
      </item>
    
      <item>
        <title>Reflections from a maintainer and contributor during Hacktoberfest - is open source struggling?</title>
        <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href=&quot;https://dev.to/challenges/hacktoberfest&quot;&gt;2024 Hacktoberfest Writing challenge&lt;/a&gt;: Contributor Experience&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href=&quot;https://dev.to/challenges/hacktoberfest&quot;&gt;2024 Hacktoberfest Writing challenge&lt;/a&gt;: Maintainer Experience&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://dev.to/jesstemporal/reflections-from-a-maintainer-and-contributor-during-hacktoberfest-550j&quot;&gt;Also available on dev.to here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Since 2016, I curate a list of &lt;a href=&quot;http://jtemporal.com/projetos-br-hacktoberfest-2024/&quot;&gt;brazilian-maintained projects people can contribute to during hacktoberfest&lt;/a&gt;. The goal is to facilitate contributions from the brazilian dev community and also lower the entry barrier to the first open source contribution from Brazilians that might not speak english or don’t know where to start.&lt;/p&gt;

&lt;p&gt;Contributing to open source can be a thrilling experience, opening the pull request, watch the review come through, improve what needs improving, discuss what could be discussed. I personally love all of that.&lt;/p&gt;

&lt;p&gt;For a while now the list is maintained by the community. Folks will submit their projects for consideration and as long as they are maintained by Brazilians, valid (not archived), and have issues open, the project will be added to the list. No questions asked.&lt;/p&gt;

&lt;p&gt;For me, &lt;a href=&quot;https://hacktoberfest.com/&quot;&gt;hacktoberfest&lt;/a&gt; is only an excuse to give back to the community even if throughout the year I couldn’t do much. Unfortunately it is true, a lot of devs used to only focus on open source during hacktoberfest in order to win a shirt.&lt;/p&gt;

&lt;p&gt;Years pass, priority changes, and hacktoberfest has not been the same. I’ve seen less and less projects looking for contributions in Brazil as well people looking to contribute.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But we are still out here.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I recently delivered a lightning talk at Python Brasil, the largest python event in Latin America. In 2 minutes I spoke about open source and Hacktoberfest. Announced that &lt;a href=&quot;http://jtemporal.com/gitfichas-is-now-open-source/&quot;&gt;GitFichas, a collection of git study cards was going open source&lt;/a&gt;. And invited folks to participate in the contribution sprints that would happen the following day for a number of projects.&lt;/p&gt;

&lt;p&gt;To my surprise, most of the people in the audience never heard of hacktoberfest before. And yes, I asked.&lt;/p&gt;

&lt;p&gt;I feel that the hype changed. Most software built today relies on open source to exist. But with the changing world, or better yet, &lt;em&gt;the changed world “after” COVID&lt;/em&gt;, where layoffs happen every year, money is tight, and uncertainties are plenty, folks don’t have the energy to make contributions. Their time is spent trying to make sure they can put food on the table.&lt;/p&gt;

&lt;p&gt;I believe becoming contributor to a major project was a big goal for many pre-COVID, and it still might be, the thing is it’s not a high priority anymore. Because of this, open source seems be struggling, at least from the scope of Brazilian contributions that I can see.&lt;/p&gt;

&lt;p&gt;Don’t get me wrong, a pull request merged is still one of my favorite accomplishments as a developer. Contributions can be big or small. Technical or not. But taking the time to get involved in a project feels like a luxury not many have.&lt;/p&gt;

&lt;p&gt;Getting a shirt after 4 pull requests was the cherry on top of becoming a contributor. Without it how can you wear your PR to a conference and make a new friend using that as an ice breaker? Few will have the courage and curiosity to simply ask about open source and cool projects you’ve seen.&lt;/p&gt;

&lt;p&gt;So am I wrong in believing open source is struggling? Am I wrong in saying that hacktoberfest contributions were focused on getting a free t-shirt? I don’t know, but I’d love to see more projects and contributors alike. Even if you are contributing only during hacktoberfest every year.&lt;/p&gt;
</description>
        <pubDate>Wed, 23 Oct 2024 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest-reflections/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest-reflections/</guid>
        
        <category>devchallenge</category>
        
        <category>hacktoberfestchallenge</category>
        
        <category>hacktoberfest</category>
        
        <category>opensource</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>GitFichas is Now Open Source 🎉</title>
        <description>&lt;p&gt;This means if you are looking for a project to contribute to you’ve found it! And still in time for hacktoberfest too!&lt;/p&gt;

&lt;h2 id=&quot;what-is-gitfichas-or-gitstudycards&quot;&gt;What is GitFichas or GitStudyCards?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://gitfichas.com&quot;&gt;GitFichas&lt;/a&gt; is a collection of study cards about git. It was first closed source and maintained solely by me, mainly due to the fact I would hand draw each of the cards.&lt;/p&gt;

&lt;p&gt;After some time I even created fonts to facilitate the process but it still required me to grab my iPad and the Procreate app to turn my notes into an image.&lt;/p&gt;

&lt;p&gt;I always wanted GitFichas to be more. More accessible, more collaborative, more helpful. And with &lt;a href=&quot;https://mermaid.js.org&quot;&gt;mermaid&lt;/a&gt; I think we can achieve this.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas-and-accessibility&quot;&gt;GitFichas and Accessibility&lt;/h2&gt;

&lt;p&gt;I worked my best to improve readability of the cards, by adjusting contrast of the cards. Also added alt text to all images as well as table in each page for each individual card describing each part of each command or concept.&lt;/p&gt;

&lt;p&gt;But I also wanted to have dark mode, better color options for varying visual abilities, and finally also improve the result for screen readers. That’s where mermaid comes in. It would generate a text-based cards that can be customized using CSS and JS.&lt;/p&gt;

&lt;p&gt;These changes will also take a while to happen but now they are possible. ☺️&lt;/p&gt;

&lt;h2 id=&quot;why-is-it-open-source-now&quot;&gt;Why is it open source now?&lt;/h2&gt;

&lt;p&gt;As The Zen of Python would say ”&lt;em&gt;Now is better than never.&lt;/em&gt;”&lt;/p&gt;

&lt;p&gt;I’ve been &lt;em&gt;slowly&lt;/em&gt; working on figuring out the next version for a while now and finally figured out how to customize and structure the mermaid charts to look more like the previous version I had for the cards. So here we are.&lt;/p&gt;

&lt;p&gt;In addition to improving accessibility, this change will make this project more of the community and allow for faster improvements and more cards to be published and maybe even be stepping stone for the community to create other projects like this one.&lt;/p&gt;

&lt;h2 id=&quot;how-to-help&quot;&gt;How to help&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jtemporal/gitfichas/issues&quot;&gt;I opened a little over 100 issues in the repo for GitFichas&lt;/a&gt; that talks about improvements that need to happen to complete the migration over to mermaid cards instead of images. You can work on one of them or multiple of them. You can also tell your friends about the project and invite them to collaborate.&lt;/p&gt;

&lt;p&gt;OR.&lt;/p&gt;

&lt;p&gt;You can submit a new card with a new command. I can help review and refine words if you need help with it, just open an issue and submit your PR, &lt;a href=&quot;https://github.com/jtemporal/gitfichas/blob/main/CONTRIBUTING.md&quot;&gt;following contribution guide available&lt;/a&gt; in the repo.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;On a more personal note: even though it has been a while since I published any new cards, GitFichas has been one of my favorite personal projects to work on. I created it to help developers like you and me that might need help with git commands from time to time.&lt;/p&gt;

&lt;p&gt;It is my hope that open sourcing it will help even more developers with Git, with that said, GitFichas is now open source and &lt;a href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;I’m looking forward to your contribution on GitHub&lt;/a&gt;. 🎉&lt;/p&gt;
</description>
        <pubDate>Tue, 22 Oct 2024 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/gitfichas-is-now-open-source/</link>
        <guid isPermaLink="true">https://jtemporal.com/gitfichas-is-now-open-source/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contribuitions</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Hacktoberfest</title>
        <description>
</description>
        <pubDate>Sat, 19 Oct 2024 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest/</guid>
        
        
      </item>
    
      <item>
        <title>Keynote - Python Brasil 2024</title>
        <description>&lt;p&gt;&lt;a href=&quot;/slides/curiosidade&quot;&gt;Slides&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Thu, 17 Oct 2024 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/pybr2024/</link>
        <guid isPermaLink="true">https://jtemporal.com/pybr2024/</guid>
        
        <category>português</category>
        
        <category>portugues</category>
        
        <category>django</category>
        
        <category>talk</category>
        
        <category>python</category>
        
        <category>R</category>
        
        
      </item>
    
      <item>
        <title>Projetos Brasileiros para contribuir nesse #Hacktoberfest 2024</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/projetos-br-hacktoberfest-2025/&quot;&gt;Edição atual da lista disponível aqui&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Ontem começou Outubro e mais uma vez o mês inteirinho de celebração de open source! A festa que todo entusiasta e pessoas mantenedoras de open source espera está aqui é hora de  #Hacktoberfest.&lt;/p&gt;

&lt;p&gt;Por aqui você confere desde 2017 essa lista curada especialmente para te ajudar a encontrar projetos brasileiros para contribuir!&lt;/p&gt;

&lt;h2 id=&quot;regras-para-entrar-nessa-lista&quot;&gt;Regras para entrar nessa lista&lt;/h2&gt;

&lt;p&gt;As regras para adicionar projetos nessa lista:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ser um projeto criado/desenvolvido/mantido por pessoas brasileiras;&lt;/li&gt;
  &lt;li&gt;Precisa ser um &lt;strong&gt;projeto&lt;/strong&gt;, não pode ser uma organização, caso tenha mais de um projeto da organização precisa ser um PR por projeto com uma entrada por projeto;&lt;/li&gt;
  &lt;li&gt;Ter pelo menos uma &lt;em&gt;issue&lt;/em&gt; aberta;&lt;/li&gt;
  &lt;li&gt;Ser um repositório válido, ou seja, não arquivado.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;avisos-para-2024&quot;&gt;Avisos para 2024&lt;/h2&gt;

&lt;h2 id=&quot;prêmios&quot;&gt;Prêmios&lt;/h2&gt;

&lt;p&gt;Esse ano a Hacktoberfest &lt;strong&gt;não&lt;/strong&gt; terá camiseta, se o seu objetivo é ganhar camisetas esse evento não é para você. Os prêmios serão virtuais no formato de badges Holopin.&lt;/p&gt;

&lt;h2 id=&quot;adicionando-projetos-nessa-lista&quot;&gt;Adicionando projetos nessa lista&lt;/h2&gt;

&lt;p&gt;Esse ano vamos manter a mesma forma de aumentar essa lista com mais projetos, como sempre, apenas abrindo um PR com o projeto. &lt;a href=&quot;https://jtemporal.com/adicionando-um-novo-projeto-na-lista-da-hacktoberfest-2019/&quot;&gt;As instruções de como adicionar projetos tão aqui&lt;/a&gt;. Todo mundo segue ganhando &amp;lt;3.&lt;/p&gt;

&lt;p&gt;Os projetos continuam separados pela linguagem principal pra facilitar as buscas pra quem lê e também em ordem alfabética pela linguagem. 😉&lt;/p&gt;

&lt;h2 id=&quot;qualidade--quantidade&quot;&gt;Qualidade &amp;gt; Quantidade&lt;/h2&gt;

&lt;p&gt;Assim como em anos anteriores, qualidade é o mais importante então se liga que dois PRs inválidos resultará em &lt;strong&gt;desqualificação por período indeterminado&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Para um PR ser considerado inválido, ele deve ser marcado com as &lt;em&gt;tags&lt;/em&gt; &lt;strong&gt;spam&lt;/strong&gt; ou &lt;strong&gt;invalid&lt;/strong&gt;. Então é bom tentar fazer PRs de qualidade!&lt;/p&gt;

&lt;p&gt;Relembrando que para tornar seu PR válido para a hacktoberfest você precisa ter algumas coisas. PRs apenas contarão se:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;O PR precisa ser aberto em Outubro (entre os dias 1 e 31);&lt;/li&gt;
  &lt;li&gt;O PR precisa acontecer num projeto que tem o tópico &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hacktoberfest&lt;/code&gt; &lt;strong&gt;ou&lt;/strong&gt; ser marcado com o rótulo (&lt;em&gt;label&lt;/em&gt;) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hacktoberfest-accepted&lt;/code&gt; por um mantenedor &lt;strong&gt;ou&lt;/strong&gt; ser aceito (&lt;em&gt;merged&lt;/em&gt;) &lt;strong&gt;ou&lt;/strong&gt; ser aprovado pelo processo de revisão (&lt;em&gt;review&lt;/em&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;mais-informações&quot;&gt;Mais informações&lt;/h2&gt;

&lt;p&gt;Mais informações no &lt;a href=&quot;https://hacktoberfest.com/&quot;&gt;site oficial (em inglês)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Meu livro &lt;a href=&quot;https://jessicatemporal.gumroad.com/l/microlivrodegit/hacktoberfest&quot;&gt;“O grande Microlivro de Git” está com desconto 30% na Gumroad&lt;/a&gt; tanto em português quanto inglês. Se você preferir, &lt;a href=&quot;https://amzn.to/4erFcLU&quot;&gt;ele também está disponível na Amazon (sem desconto)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por último, nesse outro artigo tem &lt;a href=&quot;https://jtemporal.com/5-dicas-para-fazer-o-seu-pull-request-brilhar/&quot;&gt;5 Dicas Para Fazer o Seu Pull Request Brilhar ✨&lt;/a&gt; e pode ser útil.&lt;/p&gt;

&lt;p&gt;Happy Hacking! 🎉&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;acesso-rápido-por-linguagem&quot;&gt;Acesso rápido por linguagem&lt;/h2&gt;

&lt;ul&gt;

  
    &lt;li&gt;&lt;a href=&quot;#C#&quot;&gt;C#&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#C&quot;&gt;C&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#CSS&quot;&gt;CSS&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Clojure&quot;&gt;Clojure&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#C++&quot;&gt;C++&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Elixir&quot;&gt;Elixir&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Go&quot;&gt;Go&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#JavaScript&quot;&gt;JavaScript&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Julia&quot;&gt;Julia&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Kotlin&quot;&gt;Kotlin&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Lua&quot;&gt;Lua&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#PHP&quot;&gt;PHP&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Perl&quot;&gt;Perl&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Python&quot;&gt;Python&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Ruby&quot;&gt;Ruby&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Rust&quot;&gt;Rust&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Scala&quot;&gt;Scala&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Shell&quot;&gt;Shell&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#TypeScript&quot;&gt;TypeScript&lt;/a&gt;&lt;/li&gt;
  

  
    &lt;li&gt;&lt;a href=&quot;#Variados&quot;&gt;Variados&lt;/a&gt; - Repositórios sem linguagem específica ex.: blogs, documentações e dicionários&lt;/li&gt;
  

&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;C#&quot;&gt;C#&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/afucher/Inquirer&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3756185?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;afucher/Inquirer&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A collection of common interactive command line user interfaces in C#.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alexsandro-xpt/ErysDownloader&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/845657?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alexsandro-xpt/ErysDownloader&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ErysDownloader, a frenetic and optimizate downloader library. Pure C# lightweight HTTP GET verb library for text/html content-type. No dependece.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/code-cracker/code-cracker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/9695920?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;code-cracker/code-cracker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An analyzer library for C# and VB that uses Roslyn to produce refactorings, code analysis, and other niceties.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;C&quot;&gt;C&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cmatsuoka/libxmp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/317355?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cmatsuoka/libxmp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Libxmp is a library that renders module files to PCM data.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/hardinfo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/hardinfo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;System profiler and benchmark tool for Linux systems&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/lwan&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/lwan&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Experimental, scalable, high performance HTTP server&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;CSS&quot;&gt;CSS&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/milligram/milligram&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16243913?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;milligram/milligram&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A minimalist CSS framework.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Clojure&quot;&gt;Clojure&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mauricioszabo/atom-chlorine&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/138037?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mauricioszabo/atom-chlorine&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; An Atom plugin to integrate with Socket-REPL over Clojure and ClojureScript&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;C++&quot;&gt;C++&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/OtacilioN/Brasilino&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10578275?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;OtacilioN/Brasilino&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Uma biblioteca que permite programar em linguagem Arduino utilizando comandos facilitados em PT-BR.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/vinipsmaker/tufao&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/865914?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;vinipsmaker/tufao&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An asynchronous web framework for C++ built on top of Qt&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Elixir&quot;&gt;Elixir&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/philss/floki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/381213?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;philss/floki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Floki is a simple HTML parser that enables search for nodes using CSS selectors.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Go&quot;&gt;Go&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/avelino/awesome-go&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/31996?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;avelino/awesome-go&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A curated list of awesome Go frameworks, libraries and software &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cuducos/minha-receita&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/4732915?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cuducos/minha-receita&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Sua API web para consulta de informações do CNPJ da Receita Federal &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/globocom/huskyci&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://huskyci.opensource.globo.com/img/logo.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;globocom/huskyci&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Orquestrador de testes de segurança no CI&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/goreleaser/goreleaser&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24697112?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;goreleaser/goreleaser&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Deliver Go binaries as fast and easily as possible&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/larien/learn-go-with-tests&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/29347337?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;larien/learn-go-with-tests&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tradução do livro de @quii sobre aprender Go com desenvolvimento orientado a testes&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/robertoduessmann/weather-api&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/9089383?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;robertoduessmann/weather-api&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A RESTful API to check the weather&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rodrigo-brito/gocity&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/44341229?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rodrigo-brito/gocity&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Code City metaphor for visualizing Go source code in 3D&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;JavaScript&quot;&gt;JavaScript&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/IgorRozani/filosofunk&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/802968?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;IgorRozani/filosofunk&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto com o intuito de juntar frases engraçadas, divertidas, filosóficas ou criativas de músicas de funk.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/MinisterioPublicoRJ/inloco&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/27096918?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;MinisterioPublicoRJ/inloco&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A Geographic Information System (GIS) used by Ministério Público do Estado do Rio de Janeiro to show social, institutional and administrative data , based on React and Leaflet, interacting with a GeoServer back-end. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/RocketChat/Rocket.Chat&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12508788?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;RocketChat/Rocket.Chat&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The ultimate Free Open Source Solution for team communications.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alexanmtz/material-sense&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/88840?s=60&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alexanmtz/material-sense&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A full simple application for react material ui&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/eguatech/egua&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/54448514?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;eguatech/egua&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem de Programação Egua&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/doom-fire-algorithm&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/4248081?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/doom-fire-algorithm&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Playground for the fire effect from DOOM. Really simple algorithm and all experiments are welcome!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/tabnews.com.br&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/4248081?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/tabnews.com.br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Conteúdos para quem trabalha com Programação e Tecnologia.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/video-maker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/4248081?v=4&amp;amp;size=200&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/video-maker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto open source para fazer vídeos automatizados.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/herbsjs/herbs-cli&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://herbsjs.org/img/logo-herbsjs.svg&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;herbsjs-cli&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A CLI ajuda a acelerar seu ciclo de desenvolvimento com HerbsJS gerando casos de uso e camadas de infraestrutura (REST, GraphQL, Repositórios, etc) com base em suas entidades.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/herbsjs/herbs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://herbsjs.org/img/logo-herbsjs.svg&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;herbsjs-core&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Pare de gastar tempo com código redundante e de baixo impacto. Codifique seu domínio primeiro usando Herbs e a infraestrutura necessária será gerada na hora.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/OCDots&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/ocdots&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;OCDots is a javascript library for creating evenly distributed points inside a polygon. Check out the demo at https://luxedo.github.io/OCDots/&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/monumentum/astronode&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/32710755?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;monumentum/astronode&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Exporting mongoose model as rest endpoints&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mvfsillva/dialetus-service&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/4579340?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mvfsillva/dialetus-service&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API to Informal dictionary for the idiomatic expressions that each Brazilian region It has&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-FilaDaCreche&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-FilaDaCreche&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/react-ape&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/react-ape&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;• [Work in Progress] React Renderer to build UI interfaces using canvas/WebGL&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/klefki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/klefki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple substitution cipher module. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/redis-session-storage&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/redis-session-storage&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Node App Storage sessions with redis.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/simonardejr/matador-de-monstros&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3685303?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;simonardejr/matador-de-monstros&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Minigame feito em Vue&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/thamara/time-to-leave&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/846063?s=120&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;thamara/time-to-leave&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Log work hours and get notified when it&apos;s time to leave the office and start to live.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/withmoney/withmoney-mobile&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/44231290?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;withmoney/withmoney-mobile&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;This is a mobile project for financial management, with vue.js.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/yanmagale/narigajs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/5148042?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;yanmagale/narigajs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; WIP. A node module that reports about air quality in a region&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zenorocha/clipboard.js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/398893?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zenorocha/clipboard.js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Modern copy to clipboard. No Flash. Just 3kb gzipped.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zeucxb/dymock&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/11702749?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zeucxb/dymock&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A CLI to simplify the way you create dynamics mocks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Julia&quot;&gt;Julia&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JSONWebTokens.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JSONWebTokens.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Secure your Julia APIs with JWT. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JuliaPackageWithRustDep.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JuliaPackageWithRustDep.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Example of a Julia Package with Rust dependency.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/Mongoc.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/Mongoc.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;MongoDB driver for the Julia Language &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Kotlin&quot;&gt;Kotlin&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/ftwfy&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/ftwfy&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The real life Command/Ctrl + F - Android App that uses the Mobile Vision API to allow you to search for any occurrence of a text using your camera&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/lmgtfyGen&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/lmgtfyGen&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Lmgtfy Generator Open Source Android App - built to learn Kotlin, MVP architecture, Dagger and Rx&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Lua&quot;&gt;Lua&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cuducos/yaml.nvim&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/4732915?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cuducos/yaml.nvim&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;YAML toolkit for Neovim users&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;PHP&quot;&gt;PHP&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PHPJasper/phpjasper&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/27956258?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PHPJasper/phpjasper&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A PHP report generator &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/RamonSilva20/mapos&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12385697?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;RamonSilva20/mapos&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Sistema de Controle de Ordens de Serviço&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/comuREDE/core&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/14811323?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;comuREDE/core&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Back e frontend com sensor autônomo / Back and frontend with standalone sensor &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/corcel/corcel&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://camo.githubusercontent.com/6cfc6b23889643f4438a4da4ab4de7398da9337f/68747470733a2f2f692e696d6775722e636f6d2f66484d717754462e706e67&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;corcel/corcel&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A collection of Model classes that allows you to get data directly from a WordPress database.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gabrnunes/orbita&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/gabrnunes.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gabrnunes/orbita&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Plugin de Wordpress para criar um Hacker News-like para o ManualdoUsuario.net&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/laraerp/laraerp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10065592?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;laraerp/laraerp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ERP brasileiro de código fonte aberto escrito em PHP utilizando o Laravel Framework&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/openboleto/openboleto&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/33834590?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;openboleto/openboleto&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Biblioteca para geração de boletos bancários em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/paulohenriquenj/crudificator&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1184825?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;paulohenriquenj/crudificator&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Gerador de Cruds em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Perl&quot;&gt;Perl&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GouveaHeitor/nipe&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/10741284?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GouveaHeitor/nipe&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Nipe is a script to make Tor Network your default gateway.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Python&quot;&gt;Python&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GabrielRF/RastreioBot&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/7331540?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GabrielRF/RastreioBot&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Telegram Bot @RastreioBot &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/JVictorDias/Dinossauro-Google&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/32246598?v=4&amp;amp;size=200&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;JVictorDias/Dinossauro-Google&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto onde várias Redes Neurais competem para aprender a jogar o jogo do dinossauro no navegador Google Chrome.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/Liebelts/Gordura_Simulator&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/42952107?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Liebelts/Gordura_Simulator&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um jogo de gordura sendo feito no Python 3. Envie bugs e ideias.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/allisson/python-simple-rest-client&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/5202?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;allisson/python-simple-rest-client&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple REST client for python 3.5+ &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/mre&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10817238?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/maker-regular-expressions&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório de um pacote simples para fazer expressões regulares em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/validate-docbr&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/10817238?s=60&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/validate-docbr&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Pacote Python para validação de documentos brasileiros.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anapaulagomes/pytest-picked&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1899950?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anapaulagomes/pytest-picked&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Run the tests related to the changed files (according to Git)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ayr-ton/kamu&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1090517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ayr-ton/kamu&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;You favorite book library&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/berinhard/pyp5js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/238223?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;berinhard/pyp5js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python to P5.js Transcriptor&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brazilian-utils/brutils-python&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/40146460?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brazilian-utils/brutils-python&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Brazilian Utils é uma biblioteca com foco na resolução de problemas que enfrentamos diariamente no desenvolvimento de aplicações para o business Brasileiro.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cobrateam/splinter&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/403905?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cobrateam/splinter&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;splinter - python test framework for web applications&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/sentry-patrol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/sentry-patrol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Command line interface for Sentry API &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/tapioca-jarbas&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/tapioca-jarbas&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tapioca wrapper for jarbas api &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/dynaconf/dynaconf&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/dynaconf/dynaconf/blob/master/art/logomark@1x.png?raw=true&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;dynaconf/dynaconf&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Configuration Management for Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/georgeyk/loafer&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/247603?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;georgeyk/loafer&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Asynchronous message dispatcher - Currently using asyncio and amazon SQS&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gilsondev/django-rest-localflavor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/265653?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gilsondev/django-rest-localflavor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Country-specific Django helpers, to use in Django Rest Framework &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/grupyrn/jararaca&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6994159?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;grupyrn/jararaca&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;GruPy-RN Event and Check-in System&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/guites/cinemaempoa&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/guites.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;guites/cinemaempoa&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site que agrega filmes em cartaz em algumas das diversas salas de cinema de Porto Alegre.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/internetlab-br/Twitter-Bots&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/40776372?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;internetlab-br/Twitter-Bots&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos utilizados para pesquisar sobre bots em perfis do Twitter &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/italomaia/flask-empty&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/14670?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;italo-maia/flask-empty&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An empty project skeleton / boilerplate for flask projects. Powered by CookieCutter. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/autogenfiles&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6595551?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jtemporal/autogenfiles&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Automatically generate files from templates&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/caipyra&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6595551?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jtemporal/caipyra&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;import caipyra module code&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lamenezes/simple-model&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3208493?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lamenezes/simple-model&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;data handling made easy &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luanfonceca/speakerfight&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1490875?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luanfonceca/speakerfight&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The Easier way to choose the best talks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/fakeRPiGPIO&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/fakerpigpio&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Fake RPi.GPIO module for testing&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/picamip&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/picamip&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python simple Raspberry-Pi camera module web interface&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mari-linhares/tensorflow-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/8157164?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mari-linhares/tensorflow-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos e materiais sobre TensorFlow em Português &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/odufrn/odufrn-api-py&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/52975911?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;odufrn/odufrn-api-py&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Wrapper da API da UFRN em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario-toolbox&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario-toolbox&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;This project empowers people who want to process the data in the context of Querido Diário to run their own analyses&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Brazilian government gazettes, accessible to everyone&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/serenata-de-amor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/serenata-de-amor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🕵 Artificial Intelligence for social control of public administration&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/serenata-toolbox/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/serenata-toolbox&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;pip module containing code shared across Serenata de Amor&apos;s projects&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/osantana/dicteval&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/160418?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;osantana/dicteval&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Evaluate expressions in dict/json objects&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/plenario/plenario&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/30255828?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;plenario/plenario&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-API&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-API&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Editor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Editor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; Plataforma de edição de cardápios da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pyladies-brazil/br-pyladies-pelican&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/8205116?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pyladies-brazil/br-pyladies-pelican&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site PyLadies Brasil usando Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/associados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/associados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Controle de associados a Associação PythonBrasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/planet&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/planet&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repo público para atualização da lista de sites do Planet PythonBrasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/wiki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/wiki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site python.org.br estático com Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rougeth/bottery&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/431892?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rougeth/bottery&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A bot framework with batteries included &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/thaisviana/AlgPedia&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1753143?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;thaisviana/AlgPedia&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto Final da Thata e do Tchotcho &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Ruby&quot;&gt;Ruby&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anonydog/anonydog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24738062?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anonydog/anonydog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;On the internet, nobody knows you&apos;re a dog &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/campuscode/rails-guides-pt-BR&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/10028214?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;campuscode/guia-rails-pt-br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tradução do guia oficial de Ruby on Rails para pt-BR&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/juuh42dias/transervicos&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1828204?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;juuh42dias/transervicos&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Plataforma de empregos para pessoas Trans.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/jekyll-theme-potato-hacker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/jekyll-theme-potato-hacker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A Jekyll theme based on hackers and potatoes&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/railsgirls/guides-ptbr&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1641104?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;railsgirls/guides-ptbr&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Rails Girls Guides - Brazilian Portuguese / Tutoriais Rails Girls - Português Brasileiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Rust&quot;&gt;Rust&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/rio&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/rio&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A hardware-accelerated GPU terminal emulator powered by WebGPU, focusing to run in desktops and browsers&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Scala&quot;&gt;Scala&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/potigol/potigol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1438144?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;potigol/potigol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem Potigol - Linguagem de programação funcional moderna para iniciantes - A Functional Programming Language for Beginners &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Shell&quot;&gt;Shell&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/hemilioaraujo/Linux-Commands&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/28680369?s=400&amp;amp;u=547852267ebf487736da8ded44c916c53d1d37f4&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;hemilioaraujo/Linux-Commands&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um conjunto de comandos para terminal Linux.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-plataforma-curriculo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-plataforma-curriculo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;TypeScript&quot;&gt;TypeScript&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DesignLiquido/FolEs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/DesignLiquido/FolEs/raw/principal/recursos/imagens/icone-foles.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DesignLiquido/FolEs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Folhas de Estilo em Português, para geração de CSS.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DesignLiquido/delegua&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/DesignLiquido/delegua/raw/principal/recursos/imagens/icone-delegua.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DesignLiquido/delegua&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem de programação 100% em português baseada em TypeScript, independente de sistema operacional e dispositivo, e suporte a múltiplos dialetos.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DesignLiquido/vscode&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/DesignLiquido/vscode/blob/principal/recursos/icone.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DesignLiquido/vscode&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Extensão do Visual Studio Code para as linguagens da Design Líquido e dialetos de Portugol.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brazilian-utils/brazilian-utils&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40146460?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brazilian-utils/brazilian-utils&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Utils library for specific Brazilian businesses&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/doczjs/docz&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/39714731?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;doczjs/docz&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;✍🏻It has never been so easy to document your things!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gabrnunes/tem-crase&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/gabrnunes.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gabrnunes/tem-crase&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O temcrase é uma ferramenta simples que verifica a frase que você digitou e responde se tem crase ou não.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/middy-idempotent&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/middy-idempotent&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🛵 📬 ‎‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎Idempotence Middy middleware for your AWS Lambdas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/middy-recaptcha&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/middy-recaptcha&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🛵 🔐 ‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎reCAPTCHA validation Middy middleware for yours AWS Lambdas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/react-lite-youtube-embed/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/react-lite-youtube-embed&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;📺 ‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎&amp;lt; A private by default, faster and cleaner YouTube embed component for React applications /&amp;gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mateusfg7/Noisekun&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/mateusfg7.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mateusfg7/Noisekun&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;WebApp feito para ouvir combinações de som abiente, para relaxar, estudar, trabalhar, ou se manter focado em uma atividade. Com temas, pomodoro, e playlists!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario-frontend/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario-frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório com a implementação do frontend da Plataforma de Busca do Querido Diário&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Frontend&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Website que permite à população acompanhar o cardápio das escolas públicas de São Paulo.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;Variados&quot;&gt;Variados&lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/gitfichas&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/jtemporal.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Jtemporal/gitfichas&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Git Study Cards for devs that might need a refresher about git commands 🗂️&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pizzadedados/pizzadedados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/40184305?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/PizzaDeDados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório do podcast Pizza de Dados - O podcast Brasileiro sobre ciência de dados&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PizzaDeDados/datascience-pizza&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40184305?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/datascience-pizza&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para juntar informações sobre materiais de estudo em análise de dados e áreas afins, empresas que trabalham com dados e dicionário de conceitos&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/VacaRoxa/gamedev4noobs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/36037965?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Vacaroxa/GameDev4Noobs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O propósito desse repositório, além de contribuir para o projeto 4noobs, é ensinar o básico do desenvolvimento de jogos para iniciantes e democratizar o conhecimento nesta área. Apresentando boas práticas e insumos para criar games incríveis.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/basedosdados/mais&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/71097635?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;basedosdados/mais&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Desenvolvimento de pacotes de acesso ao nosso datalake público em diversas linguagens (Python, R, Scala, Julia). O projeto faz parte da Base dos Dados, uma organização sem fins lucrativos com a missão e universalizar o acesso a dados de qualidade para todes.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/bellesamways/studynotes&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/38008212?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;bellesamways/studynotes&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para armazenar todas as anotações de cursos feitos para minha própria consulta ou de outros.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brasil-php/blog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/17454678?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brasil-php/blog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para agregar posts do grupo do Telegram&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/codamos/codamos.github.io/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/16601405?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;codamos/codamos.github.io&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para o site Codamos, que reune eventos, palestras, workshops etc pelo Brasil inteiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/feministech/pessoas-streamers-feministech&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/68646156?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;feministech/pessoas-streamers-feministech&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório com as pessoas streamers da comunidade Feministech&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/globocom/secdevlabs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/globocom/secDevLabs/raw/master/images/secDevLabs-logo.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;globocom/secdevlabs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um laboratório para aprender segurança web e mobile de uma maneira prática.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/estrutura-e-interpretacao-de-programas-de-computador-javascript&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/estrutura-e-interpretacao-de-programas-de-computador-javascript&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;λ — Tradução em pt-br de &quot;Structure and Interpretation of Computer Programs — JavaScript Adaptation&quot;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/inspiradanacomputacao/tecnologistas-contra-bolsonaro&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/11424181?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;inspiradanacomputacao/tecnologistas-contra-bolsonaro&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório com Manifesto e Assinaturas de pessoas tecnologistas contra Bolsonaro.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/levxyca/diciotech&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/levxyca.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;levxyca/diciotech&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um dicionário tech para pessoas que querem aprender mais sobre termos técnicos dentro da tecnologia 📖&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ocarneiro/para-entender-a-internet&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/2953926?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ocarneiro/para-entender-a-internet&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Videos e memes obrigatórios para conversas do dia-a-dia &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/react-brasil/empresas-que-usam-react-no-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16929016?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;react-brasil/empresas-que-usam-react-no-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório que mostra empresas e projetos que utilizam React no Brasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rochacbruno/py2rs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/458654/33350327-50e76baa-d485-11e7-8a6e-b3dd0c337046.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rochacbruno/py2rs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Ebook - A quick reference guide for the Pythonista in process of becoming a Rustacean&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/walterfcarvalho/advpl-xlsxtocsv&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/11591494?s=460&amp;amp;u=41649eaf2caa648c59d2fcb157f573c3f210ad79&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;walterfcarvalho/advpl-xlsxtocsv&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Once the language ADVPL doen&apos;t have a tool to read xlsx files directly, I did this source to unable the user read and convert one xlsx file to an array&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/yaiks/vite-docs-pt-br&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/34862686?s=96&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;yaiks/vite-docs-pt-br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para tradução da documentação oficial do vite&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

</description>
        <pubDate>Wed, 02 Oct 2024 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/projetos-br-hacktoberfest-2024/</link>
        <guid isPermaLink="true">https://jtemporal.com/projetos-br-hacktoberfest-2024/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contribuitions</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Device Authorization Flow 101 - Logging in From Input Constrained Devices</title>
        <description>&lt;p&gt;Have you ever heard of device authorization flow? You may have not heard it but good chances are you already used it.&lt;/p&gt;

&lt;p&gt;Device flow allows you to login to your applications on input constrained devices, think of IoT devices or smart TVs for example.&lt;/p&gt;

&lt;p&gt;Great applications allow the user to continue the login process on a more comfortable device instead of using, for example, the virtual keyboard on a SmartTV.&lt;/p&gt;

&lt;p&gt;If you are developing applications that need this type of connectivity come to this talk to learn what device flow actually is, how it works, and better yet, see it working in an application that integrates Python (using FastAPI) and Micropython.&lt;/p&gt;

&lt;p&gt;This talk was presented at PyOhio 2024 and you can watch it below.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/slides/deviceauthzflow.pdf&quot;&gt;Slides&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jtemporal/device-authz-flow-dino-badger2040w&quot;&gt;Code&lt;/a&gt;.&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;500&quot; max-height=&quot;550&quot; src=&quot;https://www.youtube.com/embed/gjLUK6vT2KU?si=t_nXRNOFk5JDZDO8&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;center&gt;
&lt;/center&gt;&lt;/center&gt;
</description>
        <pubDate>Sun, 28 Jul 2024 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/pyohio24/</link>
        <guid isPermaLink="true">https://jtemporal.com/pyohio24/</guid>
        
        <category>english</category>
        
        <category>fastapi</category>
        
        <category>talk</category>
        
        <category>micropython</category>
        
        
      </item>
    
      <item>
        <title>Tutorial - Migrating a Web Application from Flask to FastAPI</title>
        <description>&lt;p&gt;Have you ever had to migrate code from one stack to another? Migrating stacks on an application can be a daunting task. The secret is to keep changes to a small size and watch out for blind copy-and-paste.&lt;/p&gt;

&lt;p&gt;Join me in this tutorial to learn the key differences between FastAPI and Flask plus how these differences will affect your stack migration.&lt;/p&gt;

&lt;p&gt;Learn by doing it: migrate a simple Flask application to FastAPI. Learn how templates work in each framework, how you can use routers to create more complex applications in both Flask and FastAPI, and finally some tips if you are considering migrating from one to the other and vice-versa.&lt;/p&gt;

&lt;p&gt;After this tutorial, you will feel confident to start your stack migrations between these two frameworks.&lt;/p&gt;

&lt;p&gt;This tutorial was made for EuroPython 2024.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/slides/flasktofastapi/&quot;&gt;Slides&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jtemporal/flask-to-fastapi/&quot;&gt;Code&lt;/a&gt;.&lt;/p&gt;

</description>
        <pubDate>Tue, 09 Jul 2024 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/flask-to-fastapi/</link>
        <guid isPermaLink="true">https://jtemporal.com/flask-to-fastapi/</guid>
        
        <category>english</category>
        
        <category>flask</category>
        
        <category>fastapi</category>
        
        <category>talk</category>
        
        <category>webapp</category>
        
        
      </item>
    
      <item>
        <title>Notas sobre publicar meu primeiro e-book</title>
        <description>&lt;p&gt;Uma vez escrevi sobre &lt;a href=&quot;https://jtemporal.com/o-meu-metodo-de-criacao-de-conteudo/&quot;&gt;meu processo de criação de conteúdo&lt;/a&gt; e ainda sigo as coisas que escrevi lá, mas agora, passando pelo processo de publicação do meu primeiro e-book &lt;a href=&quot;https://jtemporal.com/microlivrodegit/&quot;&gt;“O Grande Microlivro de Git”&lt;/a&gt;, posso dizer que aprendi algumas coisas novas. Continue lendo para conhecer a  minha aventura ao publicar meu primeiro e-book por conta própria.&lt;/p&gt;

&lt;h2 id=&quot;escrita-que-não-funcionou&quot;&gt;Escrita que não funcionou&lt;/h2&gt;

&lt;p&gt;Escrever em si foi difícil. Nunca escrevi algo tão longo e devo dizer que não é tão longo quanto poderia ser. &lt;a href=&quot;https://jtemporal.com/microlivrodegit/&quot;&gt;“O Grande Microlivro de Git”&lt;/a&gt; foi na verdade um respiro de ar fresco enquanto eu estava escrevendo outro livro ainda mais longo (ainda a ser publicado) e fiquei presa no temido “bloqueio de escritora”.&lt;/p&gt;

&lt;p&gt;Então em julho 2023, cansada de não terminar de escrever algum dos dois livros que estava escrevendo, resolvi terminar um deles. Afinal um livro que está apenas ocupando espaço no meu computador não está ajudando (nem a mim mesma). Acredito fortemente em aprender fazendo, então esta também foi uma oportunidade de aprendizado, já que usei este livro como uma espécie de experimento.&lt;/p&gt;

&lt;p&gt;Minha ideia era usar este livro não apenas para ajudar outras pessoas com Git, mas, no meu lado, para me livrar dos nós existentes no meu processo de escrita para um formato de conteúdo mais longo e descobrir como publicar esse tipo de trabalho. Ao publicar o primeiro livro, aprendi um processo que funciona para mim no mar de informações existente na internet.&lt;/p&gt;

&lt;p&gt;Para escrever de fato, comecei a usar o &lt;a href=&quot;https://www.apple.com/ca/pages/&quot;&gt;Apple Pages&lt;/a&gt;. Essa ferramenta me permitiria escrever em qualquer lugar, mesmo offline, mas comecei a perceber que a ferramenta em si não era ideal para a maneira como gosto de escrever: escrever tudo que tava na cabeça sem pensar, limpeza, edição, revisão, revisão, revisão, publicação.&lt;/p&gt;

&lt;p&gt;O Apple Pages não me permitiu avaliar o progresso em meu processo de escrita ou revisão. Imagine o seguinte: eu só foco nesse tipo de projeto no meu tempo livre, isso geralmente significa fins de semana. Confiar na memória para lembrar se revisei ou não uma seção era, na falta de melhores palavras: difícil. Então, depois de escrever muito e de uma pausa &lt;em&gt;muito&lt;/em&gt; longa, mudei do Apple Pages para o &lt;a href=&quot;https://www.notion.so/&quot;&gt;Notion&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;usando-o-notion-como-ferramenta-de-acompanhamento-para-escrita&quot;&gt;Usando o Notion como ferramenta de acompanhamento para escrita&lt;/h2&gt;

&lt;p&gt;Eu tenho usado o Notion pro meu blog e pro &lt;a href=&quot;https://gitfichas.com/&quot;&gt;GitFichas&lt;/a&gt; há mais ou menos um ano, quando decidi mudar o livro para o Notion, eu estava muito familiarizada com o uso de bancos de dados para fazer o que queria: acompanhar meu progresso.&lt;/p&gt;

&lt;p&gt;Mudar para o Notion também implicou em passar algumas horas em um determinado fim de semana:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Copiando todo o trabalho realizado anteriormente;&lt;/li&gt;
  &lt;li&gt;Estruturando o banco de dados com todos os campos que precisava.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depois de um copia-e-cola maçante, eu poderia voltar às tarefas mais interessantes: escrever e revisar.&lt;/p&gt;

&lt;p&gt;Mais importante ainda, depois que tudo estava no Notion, percebi que tinha feito mais trabalho do que pensava e estava muito perto de terminar o livro. E fui em frente, escrevendo as partes que faltavam. Também investi um tempo para recriar todas as imagens que já tinha.&lt;/p&gt;

&lt;h2 id=&quot;criando-imagens-padronizadas-com-carbon&quot;&gt;Criando imagens padronizadas com Carbon&lt;/h2&gt;

&lt;p&gt;Veja, eu estava tirando capturas de tela do terminal em um computador, então passei a usar apenas meu iPad para escrever e o &lt;a href=&quot;http://github.com/codespaces&quot;&gt;GitHub Codespaces&lt;/a&gt; para tirar captura de tela dos comandos no terminal, o que significava que nem todas as minhas imagens pareciam iguais e &lt;em&gt;eu gosto de padrões&lt;/em&gt;, então recriar as imagens era o única solução.&lt;/p&gt;

&lt;p&gt;Eu também queria remover quaisquer vieses de minhas próprias configurações, facilitar pra mim à ocultar informações sensíveis, como meu e-mail pessoal, e, finalmente, facilitar a criação de versões em outros idiomas. Depois de algumas tentativas com algumas ferramentas online, &lt;a href=&quot;http://carbon.now.sh/&quot;&gt;Carbon&lt;/a&gt; acabou sendo a escolhida.&lt;/p&gt;

&lt;p&gt;Depois de mais uma sessão repetitiva de copia-e-cola, consegui gerar novamente todas as imagens usando Carbon. Não gosto de fazer trabalhos repetitivos, então para aproveitar ao máximo o uso do Carbon, também iniciei um segundo banco de dados no Notion, desta vez para salvar as imagens que acabei de fazer.&lt;/p&gt;

&lt;p&gt;O Carbon é baseado em conteúdo, portanto, tudo em uma determinada imagem faz parte da URL dessa imagem; então, se você salvar essa URL, poderá recriar a imagem facilmente, caso seja necessário. No banco de dados de imagens salvei não só a referida imagem, mas também o texto presente em cada uma delas, e as URLs também.&lt;/p&gt;

&lt;p&gt;Com todas as imagens que fiz no Carbon pude iniciar a primeira revisão. Revisar tudo pela primeira vez ainda no Notion o que me permitiu fazer algumas correções rápidas, especialmente usando a &lt;a href=&quot;https://www.notion.so/product/ai&quot;&gt;Notion AI&lt;/a&gt; para detectar alguns erros de digitação fáceis de corrigir e vírgulas faltantes. Em seguida, exportei a primeira versão de um PDF diretamente do Notion para começar uma revisão mais “séria”.&lt;/p&gt;

&lt;h2 id=&quot;revise-três-vezes-e-depois-revise-novamente&quot;&gt;Revise três vezes e depois revise novamente&lt;/h2&gt;

&lt;p&gt;Se fosse em outra época, quando ainda usava papel e tinha uma impressora, provavelmente eu iria imprimir o primeiro PDF que gerei. Mas não dessa vez, eu nem tenho mais impressora nem papel por aí, então usei meu iPad e Apple Pencil para fazer o que faria normalmente - escrever em caneta vermelha correções - e comecei o processo de revisão.&lt;/p&gt;

&lt;p&gt;Agora, lembre-se de que, embora eu tenha revisado o conteúdo do livro uma vez, a pessoa que começou a escrever este livro &lt;em&gt;não&lt;/em&gt; é a pessoa que sou hoje. Gosto de pensar que nos últimos 2 anos minhas habilidades de comunicação melhoraram e estão melhores do que no início desta jornada, então fiz muitas melhorias.&lt;/p&gt;

&lt;p&gt;E aí entra meu primeiro revisor: depois de muita tinta vermelha virtual, enviei um segundo PDF - com as correções feitas da primeira revisão - &lt;a href=&quot;https://jairojair.com/&quot;&gt;para meu marido Jairo “JJ” Jair&lt;/a&gt;. Isso gerou uma discussão sobre como melhorar a ordem na qual o conteúdo estava apresentado.&lt;/p&gt;

&lt;p&gt;Este livro foi feito para parecer um dicionário. A pessoa leitora encontraria o comando desejado no índice, seguiria o &lt;em&gt;hiperlink&lt;/em&gt; e leria sobre o comando. Isso é indicado no início do livro, mas por mais que se tente, é impossível controlar quem lê, as pessoas farão o que querem e provavelmente lerão o livro pelo menos uma vez em ordem.&lt;/p&gt;

&lt;p&gt;Depois da revisão do meu marido, uma noite de descanso e muita conversa, nós descobrimos uma ordem que ambos concordamos que fazia sentido, mais ajustes foram feitos. Mais uma vez gerei um novo PDF e desta vez entrou em cena a segunda revisora: minha querida amiga &lt;a href=&quot;https://cecivieira.com/&quot;&gt;Ana “Ceci” Cecília&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Com um senso de pontuação melhor do que eu, Ceci sempre encontra uma maneira de melhorar minha escrita com algumas edições. Como estava um pouco ansiosa para terminar o livro fiz as edições finais e exportei o PDF e ePubs finais… Pelo menos naquele dia…&lt;/p&gt;

&lt;h2 id=&quot;publicando-um-livro-na-gumroad&quot;&gt;Publicando um livro na Gumroad&lt;/h2&gt;

&lt;p&gt;Finalmente, segurando a primeira versão da obra finalizada, chegou a hora de colocá-la numa vitrine em algum lugar. Lembre-se que no início eu queria publicar o livro em uma plataforma que eu controlasse tanto quanto possível e, em segundo lugar, na Amazon.&lt;/p&gt;

&lt;p&gt;Agora foi aqui que a diversão começou. “O Grande Microlivro de Git” foi &lt;a href=&quot;https://jtemporal.com/notes-on-self-publishing-first-ebook/#:~:text=published%20in%20Portuguese&quot;&gt;publicado primeiramente em português&lt;/a&gt; com foco em ajudar pessoas desenvolvedoras brasileiras, então a &lt;a href=&quot;https://hotmart.com&quot;&gt;Hotmart&lt;/a&gt;  parecia fazer sentido já que tinha suporte Reais e métodos de pagamento amplamente utilizados como o Pix, embora ainda seja uma plataforma internacional.&lt;/p&gt;

&lt;p&gt;A Hotmart era praticamente perfeita à primeira vista, até que li os termos de uso: Ela possuem cláusula de exclusividade, então ao utilizar qualquer um dos serviços da plataforma você aceita apenas vender seus produtos lá, e foi assim que desisti de usá-la.&lt;/p&gt;

&lt;p&gt;Também não queria desenvolver toda a infraestrutura necessária, parecia exigir muito de mim para ter as integrações que queria, então escolhi outra plataforma para produtos digitais: &lt;a href=&quot;http://gumroad.com/&quot;&gt;Gumroad&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A Gumroad é internacional, permite que você venda seus produtos digitais com uma configuração mínima, tem uma taxa fixa sobre as vendas e nenhuma cláusula de exclusividade, dito isso, a Gumroad é perfeita para necessidades como as minhas.&lt;/p&gt;

&lt;p&gt;Infelizmente a Gumroad não dá suporte à moeda brasileira e os mesmos métodos de pagamento que a Hotmart usa, o que eu sabia que provavelmente prejudicaria parte das minhas vendas, mas ainda assim era melhor que a Hotmart.&lt;/p&gt;

&lt;h2 id=&quot;criando-uma-página-de-livro-no-meu-site&quot;&gt;Criando uma página de livro no meu site&lt;/h2&gt;

&lt;p&gt;Inicialmente a ideia era a página ser como uma &lt;em&gt;landing page&lt;/em&gt; principal para o livro e usar a Hotmart apenas para finalizar a compra e enviar os e-books nos formatos PDF e ePub para os clientes, então implementei uma página no meu próprio site que me permitiria adicionar o detalhes do livro e botão para o portal de pagamento.&lt;/p&gt;

&lt;p&gt;A página em si é bem simples. Meu blog foi feito usando Jekyll, GitHub Pages e Netlify, então para criar uma nova página eu só tive que escrever um novo &lt;em&gt;markdown&lt;/em&gt;, mas queria ter alguns botões e a capa do livro ao lado da sua descrição.&lt;/p&gt;

&lt;p&gt;Então, depois de feito o &lt;em&gt;markdown&lt;/em&gt;, também adicionei um pouco de CSS para deixar tudo bonito e pronto. Com a página feita, mesmo acabando por não usar a Hotmart e a Gumroad tendo uma página independente, resolvi manter a página do livro. Agora ele exibe os detalhes sobre o livro e botões para comprá-lo na Gumroad e na Amazon.&lt;/p&gt;

&lt;h2 id=&quot;editando-um-e-book-para-a-loja-kindle&quot;&gt;Editando um e-book para a loja Kindle&lt;/h2&gt;

&lt;p&gt;Durante minhas análises, algo que fiz foi enviar o ePub para meu próprio Kindle para ver como ele seria renderizado lá. Embora o ePub tenha funcionado bem em outros leitores de e-book, a conversão da Amazon não funcionou tão bem…&lt;/p&gt;

&lt;p&gt;As imagens exportadas pelo Carbon eram PNG com fundo transparente e sombra, no Kindle elas apareciam com borda preta e as legendas também ficavam envolvidas na mesma borda preta impossibilitando a leitura.&lt;/p&gt;

&lt;p&gt;Então, ao invés de usar o ePub para publicar na Amazon, o que resultaria na falha na conversão da imagem, baixei e instalei o &lt;a href=&quot;https://www.amazon.com/Kindle-Create/b&quot;&gt;Kindle Create&lt;/a&gt;, software da Amazon para criar manuscritos Kindle.&lt;/p&gt;

&lt;p&gt;Existem basicamente dois layouts de livros para Kindle: os de &lt;em&gt;layout&lt;/em&gt; digitalmente otimizados e os de &lt;em&gt;layout&lt;/em&gt; fixo (&lt;em&gt;reflowable&lt;/em&gt; e &lt;em&gt;fixed&lt;/em&gt;, respectivamente). O problema é que, se você deseja que seu livro seja legível nos leitores Kindle mais comuns, você desejará um layout digitalmente otimizado e a forma de conseguir isso é usando o Kindle Create.&lt;/p&gt;

&lt;p&gt;Pense no Kindle Create como uma versão limitada do Google Docs ou do Microsoft Word. Por exemplo, para o modo digitalmente otimizado você só pode ter títulos em nível de capítulo. Para livros técnicos, como o Microlivro, isso é um pouco chato porque os subtítulos não aparecem no índice gerado automaticamente.&lt;/p&gt;

&lt;p&gt;Resumindo, depois de me acostumar com as funcionalidades limitadas de formatação de texto do Kindle Create, e também com a forma como você pode adicionar mais conteúdo a ele, é bem fácil obter o manuscrito, mas primeiro eu precisava cuidar de toda a situação das imagens.&lt;/p&gt;

&lt;p&gt;Uma pequena desvantagem do Kindle Create é que ele só aceita imagens JPG ou JPEG, o que também quer dizer que eu precisava converter todas as imagens PNG em arquivos JPG para usá-las. Usei o FFmpeg para converter todos os arquivos com extensão  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.png&lt;/code&gt; em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.jpg&lt;/code&gt;, &lt;a href=&quot;https://gist.github.com/jtemporal/e70da0ecf56ebb094598af1c5def0b10&quot;&gt;deixei um &lt;em&gt;script&lt;/em&gt; aqui&lt;/a&gt;. Depois de executar o script, converter todas as imagens e substituir imagens antigas mal convertidas no manuscrito, eu “apenas” tive que exportar o arquivo novamente e subir ele na Amazon.&lt;/p&gt;

&lt;h2 id=&quot;publicar-um-e-book-na-amazon&quot;&gt;Publicar um e-book na Amazon&lt;/h2&gt;

&lt;p&gt;Com o documento Kindle pronto, chegou a hora de criar um perfil no &lt;a href=&quot;http://kdp.amazon.com/&quot;&gt;Kindle Direct Publishing (KDP)&lt;/a&gt;. Isso é, adicionar informações sobre o livro, como nome da autora, capa, pessoa ilustradora e editora. Após a primeira parte dos metadados, você pode fazer o &lt;em&gt;upload&lt;/em&gt; do manuscrito, então você poderá ver uma prévia de como o livro ficará em diferentes dispositivos.&lt;/p&gt;

&lt;p&gt;Com todos os campos obrigatórios preenchidos, a última peça do quebra-cabeça é escolher um acordo de preço e &lt;em&gt;royalties&lt;/em&gt;. Para o preço escolhi o mesmo valor da Gumroad, mas você ainda precisa escolher um modelo para &lt;em&gt;royalties&lt;/em&gt;. Você pode escolher quanto a Amazon pagará por cada venda que você fizer e quanto a Amazon manterá. Hoje a Amazon tem duas opções no que diz respeito a &lt;em&gt;royalties&lt;/em&gt;:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Royalties de 35%: todos os e-books, desde que você venda pelo mesmo preço de outras plataformas, tá tudo pronto pra usar;&lt;/li&gt;
  &lt;li&gt;Royalties de 70%: se você optar por participar do KDP Select, mas precisa concordar com a cláusula de exclusividade do KDP Select.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depois de tudo isso, basta clicar no grande botão amarelo de publicação. Depois de clicar nesse botão, seu livro passará por duas etapas que podem levar até 72 horas cada: Revisão e Publicação. Para mim, as duas etapas foram concluídas em menos de duas horas no total. Após a publicação, seu livro passa a ter uma página que mostra os detalhes do livro e permite sua compra.&lt;/p&gt;

&lt;h2 id=&quot;reivindique-seu-livro&quot;&gt;Reivindique seu livro&lt;/h2&gt;

&lt;p&gt;Depois que seu livro estiver no ar, é hora de reivindicá-lo, para isso você precisa criar um perfil na &lt;a href=&quot;https://author.amazon.com/&quot;&gt;Central de Autores da Amazon&lt;/a&gt;. Este processo é bem parecido com a criação de um perfil em qualquer rede social, a única diferença principal é: antes de colocar seu livro em sua biblioteca, você precisa ter seu perfil aprovado.&lt;/p&gt;

&lt;p&gt;O processo de aprovação é semelhante aos processos de Revisão e Publicação do livro, você envia os dados e aguarda. Assim que o seu perfil for aprovado, você receberá um e-mail e poderá &lt;a href=&quot;https://www.amazon.com/author/jesstemporal&quot;&gt;adicionar o livro ao seu perfil, assim como adicionei os meus&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;As revisões, a loja na Gumroad, a criação de um perfil na Amazon, a formatação do livro para o Kindle, levaram cerca de 4 longos dias. Ou seja, dois finais de semana em que me concentrei exclusivamente em trabalhar no livro, desde o momento em que acordei até a hora de dormir, na maioria dos dias perto da meia-noite.&lt;/p&gt;

&lt;p&gt;Narrar tudo isso aqui me fez perceber como foi uma jornada intensa, mas também como é bom finalmente ter descoberto todas essas etapas. Mal posso esperar para passar por isso de novo, espero que em breve, se não tiver nenhum bloqueio de escritora novamente.&lt;/p&gt;

&lt;p&gt;Para você que leu até aqui, primeiro obrigada pela leitura, segundo parabéns, e terceiro: espero que isso possa trazer alguma clareza a todo o processo pra você e que agora você possa se sentir mais confiante para publicar seus livros, estou ansiosa para lê-los.&lt;/p&gt;
</description>
        <pubDate>Sun, 04 Feb 2024 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/notas-sobre-publicar-meu-primeiro-ebook/</link>
        <guid isPermaLink="true">https://jtemporal.com/notas-sobre-publicar-meu-primeiro-ebook/</guid>
        
        <category>pessoal</category>
        
        <category>escrita</category>
        
        
      </item>
    
      <item>
        <title>Dicas para migrar uma aplicação de Flask para FastAPI e vice-versa</title>
        <description>&lt;p&gt;Você está migrando do Flask para o FastAPI e enfrentando problemas? Neste post do blog, você aprenderá sobre alguns dos problemas que pode encontrar ao migrar uma aplicação web de Flask para FastAPI, e também como resolver tais problemas.&lt;/p&gt;

&lt;h2 id=&quot;a-aplicação-web-que-deu-início-a-tudo&quot;&gt;A aplicação web que deu início a tudo&lt;/h2&gt;

&lt;p&gt;Como devrel na Auth0, eu crio aplicações de exemplo que podem ser usadas para mostrar nosso produto. Por exemplo, eu utilizei uma &lt;a href=&quot;https://developer.auth0.com/resources/guides/web-app/flask/basic-authentication&quot;&gt;aplicação de amostra construída com Flask, Jinja e Auth0&lt;/a&gt; para criar uma demonstração para estandes patrocinados. Essa aplicação demonstra como Flask e Auth0 podem ser usados em conjunto para desenvolver aplicações web.&lt;/p&gt;

&lt;p&gt;Essa aplicação é uma aplicação web típica, composta por um backend construído com &lt;a href=&quot;http://flask.palletsprojects.com/&quot;&gt;Flask&lt;/a&gt;, um frontend feito com modelos &lt;a href=&quot;https://jinja.palletsprojects.com/en/3.1.x/&quot;&gt;Jinja&lt;/a&gt; e um pouco de CSS. Ela também é protegida com Auth0 para simplificar os processos de autenticação e autorização.&lt;/p&gt;

&lt;p&gt;Enquanto eu estava codificando uma amostra de código para responder uma pergunta de uma pessoa desenvolvedora na web, surgiu um pensamento na minha cabeça: “&lt;em&gt;Já que a Auth0 pode ser usada com qualquer framework, por que não criar uma versão da aplicação de exemplo usando FastAPI no backend em vez de Flask?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pensando no trabalho que eu faço, eu poderia usar a nova versão construída com &lt;a href=&quot;https://fastapi.tiangolo.com/&quot;&gt;FastAPI&lt;/a&gt; para escrever um guia que ajudaria pessoas desenvolvedoras a entender como proteger suas aplicações construídas em FastAPI usando o Auth0. Então, decidi usar o exemplo construído em Flask e migrar as coisas para uma aplicação feita em FastAPI. Para facilitar as coisas para mim, meu plano era:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Reutilizar o máximo possível da aplicação original construída com Flask:
    &lt;ol&gt;
      &lt;li&gt;Copiar templates e stylesheets como também qualquer JavaScript.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;Ajustar qualquer coisa necessária do código em Flask para funcionar com FastAPI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esse era um plano simples. Apenas dois passos. “&lt;em&gt;Quão difícil poderia ser?”&lt;/em&gt; Eu sei, eu sei, famosas últimas palavras. Então, assim que comecei a fazer a migração, percebi que haveria algumas coisas que eu precisaria ajustar para que a aplicação FastAPI funcionasse corretamente.&lt;/p&gt;

&lt;p&gt;Abaixo você pode ver o que é necessário ajustar se você tiver uma aplicação semelhante que queira migrar de Flask para FastAPI.&lt;/p&gt;

&lt;p&gt;Disclaimer: Since the authentication guide in FastAPI is not public yet, I have created two sample applications with all the code shown in the examples of this blog post. If you are interested in reviewing the code, both applications are available on GitHub. You can follow the links below:&lt;/p&gt;

&lt;p&gt;Pequeno aviso: Como o guia de autenticação no FastAPI ainda não é público, criei dois exemplos de aplicações com todo o código mostrado nos exemplos deste post do blog. Se você quiser revisar o código, ambas aplicações estão disponíveis no GitHub. Você pode seguir os links abaixo:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/minimal-flask-webapp-auth0&quot;&gt;Flask Minimal WebApp with Auth0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/minimal-fastapi-webapp-auth0&quot;&gt;FastAPI Minimal WebApp with Auth0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;templates&quot;&gt;Templates&lt;/h2&gt;

&lt;p&gt;Ambos Flask e FastAPI suportam templates usando Jinja, mas existem algumas diferenças em como usar templates.&lt;/p&gt;

&lt;p&gt;O Flask identificará automaticamente os templates em seu projeto para que você possa usar o método &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;render_template&lt;/code&gt; e o Flask procurará templates na pasta do seu projeto. &lt;a href=&quot;https://flask.palletsprojects.com/en/1.1.x/quickstart/#rendering-templates&quot;&gt;Você até pode ter dois formatos&lt;/a&gt;: seja como um módulo onde o modelo está na sua pasta raiz ou como um pacote onde o modelo está dentro da pasta da sua aplicação.&lt;/p&gt;

&lt;p&gt;Desde que você use uma pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;templates/&lt;/code&gt;, o Flask automaticamente irá reconhecê-la. Isso só varia se você estiver usando Blueprints, pois será necessário passar o caminho para as templates no blueprint que você criar.&lt;/p&gt;

&lt;p&gt;No FastAPI, por outro lado, não só é necessário garantir a instalação do Jinja2 em seu ambiente, mas também é preciso informar ao FastAPI onde encontrar os templates. Dito isso, você pode colocar a pasta de templates em qualquer lugar, mas precisará instanciar uma variável de templates para que o FastAPI a reconheça, desta forma:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi.templating&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Jinja2Templates&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;templates&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Jinja2Templates&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;directory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;templates&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Depois disso, você pode usar essa variável para renderizar o template para um determinado endpoint assim:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@app.get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;home&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;sh&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;
    Home endpoint
    &lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;templates&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;TemplateResponse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;home.html&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;filtros-no-jinja&quot;&gt;Filtros no Jinja&lt;/h4&gt;

&lt;p&gt;Para modificar variáveis dentro de uma página você pode usar filtros no Jinja. Nas aplicações de exemplo, criei um filtro &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;to_pretty_json&lt;/code&gt; para fazer o print “bonito” de um objeto JSON no na página de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/profile&lt;/code&gt;. Essa função existe do mesmo jeito em ambos os projetos, porém a forma de disponibilizá-la para páginas é um pouco diferente em cada framework.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nota:&lt;/em&gt; você vai perceber que ambos frameworks funcionarão de forma semelhante, mas os nomes das propriedades serão diferentes.&lt;/p&gt;

&lt;p&gt;Já que o Flask automaticamente reconhece os templates, a aplicação Flask possui uma propriedade chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jinja_env&lt;/code&gt; que corresponde ao ambiente do Jinja e que você pode editar usando o dicionário de filtros para criar novos filtros dessa forma:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jinja_env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;to_pretty_json&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to_pretty_json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Você também pode usar o &lt;a href=&quot;https://flask.palletsprojects.com/en/2.3.x/templating/#registering-filters&quot;&gt;decorador de filtro para templates&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Como no FastAPI você precisa criar a variável de templates, você também usará essa variável para passar um novo filtro. A variável &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;templates&lt;/code&gt; possui a propriedade &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;env&lt;/code&gt;, que permite acessar o dicionário de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;filters&lt;/code&gt;, como você pode ver abaixo:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;templates&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;to_pretty_json&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to_pretty_json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;pasta-de-arquivos-estáticos&quot;&gt;Pasta de arquivos estáticos&lt;/h2&gt;

&lt;p&gt;Assim como no caso dos templates, tanto Flask quanto FastAPI permitem agrupar os arquivos estáticos (CSS, JavaScript e imagens) na mesma pasta, mas mais uma vez existem algumas diferenças.&lt;/p&gt;

&lt;p&gt;Flask suporta arquivos estáticos “de cara”, sem necessidade de configuração, você só precisa adicionar a pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;static/&lt;/code&gt; ao seu projeto, e é isso, não é necessário nenhuma configuração extra para acessar arquivos estáticos a partir dos seus templates e páginas.&lt;/p&gt;

&lt;p&gt;Para o FastAPI, assim como a pasta de templates, você precisa definir a localização dos arquivos estáticos usando a propriedade &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mount&lt;/code&gt;, que “acopla” a pasta de arquivos estáticos à sua aplicação, e a classe &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StaticFiles&lt;/code&gt; para inicializar local do diretório.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi.staticfiles&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;StaticFiles&lt;/span&gt;

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

&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;mount&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/static&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;StaticFiles&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;directory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Observe que essa forma de acoplar a pasta de arquivos estáticos à sua aplicação web cria uma aplicação independente e ela não será detectada pelo OpenAPI ou pela documentação, mas você ainda poderá usar coisas como a função &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; em seus templates.&lt;/p&gt;

&lt;h3 id=&quot;usando-a-função-url_for-nos-templates&quot;&gt;Usando a função url_for nos templates&lt;/h3&gt;

&lt;p&gt;Templates em ambos Flask e FastAPI permitem que você defina programaticamente URLs para arquivos e endpoints usando a função &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt;, mas como você pode esperar, os parâmetros diferem em cada framework.&lt;/p&gt;

&lt;p&gt;Por exemplo, no Flask, para adicionar CSS em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;base.html&lt;/code&gt;, você passa o nome da pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;static&lt;/code&gt;, seguido do parâmetro chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;filename&lt;/code&gt;, contendo o nome do seu arquivo CSS.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{{ url_for(&apos;static&apos;, filename=&apos;style.css&apos;) }}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Para o FastAPI, a funcionalidade da função &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; será a mesma, mas o parâmetro para o nome do arquivo é chamado de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{{ url_for(&apos;static&apos;, path=&apos;style.css&apos;) }}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;sessões&quot;&gt;Sessões&lt;/h2&gt;

&lt;p&gt;Para aplicações web, normalmente se define uma forma de gerenciar sessões. Abaixo você pode ver como você pode interagir com uma sessão em cada framework. O exemplo mostrará como limpar uma sessão ao fazer logout.&lt;/p&gt;

&lt;p&gt;No Flask, você pode acessar a sessão a partir do objeto &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;session&lt;/code&gt; que pode ser importado do módulo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flask&lt;/code&gt;, como você pode ver abaixo:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# ... blueprint definition
&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@webapp_bp.route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;clear-session-example&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;session_clearing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;sh&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;
    example on how to clear a session, often used in logout endpoints
    &lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# ... continuação da lógica
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Enquanto isso, no FastAPI, a sessão faz parte do objeto &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Request&lt;/code&gt;, você pode acessá-la passando a requisição como parte da função de endpoint e, em seguida, usando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;request.session&lt;/code&gt;, assim:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Request&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# ... definição do router
&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@webapp_router.get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/profile&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;user_info&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;userinfo&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# ... continução da lógica
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;aplicações-modulares-blueprint-e-apirouter&quot;&gt;Aplicações modulares: Blueprint e APIRouter&lt;/h2&gt;

&lt;p&gt;Para aplicações mais complexas, que normalmente incluem vários módulos dentro de uma aplicação, você precisará usar um roteador para poder ter uma separação entre as responsabilidades de endpoints. Para isso, você terá um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Blueprint&lt;/code&gt; no Flask e um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;APIRouter&lt;/code&gt; no FastAPI.&lt;/p&gt;

&lt;p&gt;Depois de criar o Blueprint ou APIRouter, você precisará registrá-los em na sua aplicação. Veja como fazer isso para ambos os frameworks a seguir.&lt;/p&gt;

&lt;p&gt;O Blueprint precisará de mais algumas configurações, como o nome desse blueprint (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;webapp&apos;&lt;/code&gt;), bem como o nome de importação (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__name__&lt;/code&gt;) e qualquer outra configuração necessária. Neste exemplo, passamos a pasta de templates para o webapp:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Flask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Blueprint&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;webapp_bp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Blueprint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;webapp&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;template_folder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;templates&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Flask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Uma vez que o blueprint é criado, você pode registrá-lo na aplicação. Isso ajuda a disponibilizar qualquer visualização/rota dentro do seu blueprint para o app. O registro é feito chamando o método &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;register_blueprint&lt;/code&gt; do seu &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app&lt;/code&gt; e passando o blueprint da seguinte forma:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Flask&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Flask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;register_blueprint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;webapp_bp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;url_prefix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Para o FastAPI, o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;APIRouter&lt;/code&gt; funcionará de forma semelhante ao &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Blueprint&lt;/code&gt; no Flask, a diferença é que você não precisa passar nenhum nome, dê uma olhada:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;APIRouter&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;webapp_router&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;APIRouter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Em seguida, para registrar o roteador, você deve usar o método &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;include_router&lt;/code&gt; do aplicação FastAPI &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app&lt;/code&gt; e passar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;webapp_router&lt;/code&gt; da seguinte forma:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FastAPI&lt;/span&gt;

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

&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;include_router&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;webapp_router&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;usando-url_for-nos-endpoints&quot;&gt;Usando url_for nos endpoints&lt;/h3&gt;

&lt;p&gt;Além dos templates, você pode usar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; em um endpoint para definir programaticamente o caminho para um determinado endpoint ou rota.&lt;/p&gt;

&lt;p&gt;Para usar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; no Flask, você precisa importar a função da biblioteca &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flask&lt;/code&gt; e, em seguida, passar o nome do endpoint. Se o seu endpoint estiver em outro módulo, lembre-se de passar também o nome desse módulo, assim:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;url_for&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# ... definição da blueprint
&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@webapp_bp.route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/redirect-example&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;redirect_example&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;url_for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;webapp.home&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Enquanto isso, no FastAPI, o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; é um método e vem da classe &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Request&lt;/code&gt;. Você precisa passar o nome do endpoint, se esse endpoint fizer parte da aplicação, mesmo que esteja em outro módulo, tudo funcionará a partir daí e não há necessidade de passar o nome do módulo como no Flask.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Request&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi.responses&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RedirectResponse&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# ... router definition
&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@webapp_router.get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/redirect-example&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Depends&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ProtectedEndpoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;redirect_example&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RedirectResponse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;url_for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Migrar frameworks em uma aplicação pode ser uma tarefa assustadora, especialmente se você não souber onde as coisas podem dar errado após copiar e colar o código. Mas se você souber onde as coisas serão diferentes, a migração será muito mais tranquila.&lt;/p&gt;

&lt;p&gt;Aqui está uma versão resumida das coisas a serem observadas se você pretende migrar do Flask para o FastAPI e vice-versa:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;O Flask irá detectar automaticamente os templates, mas o FastAPI precisa ser informado onde encontrar os templates usando a classe &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Jinja2Templates&lt;/code&gt; e passando o diretório dos templates.&lt;/li&gt;
  &lt;li&gt;O Flask utilizará a função &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;render_template&lt;/code&gt; para renderizar páginas, enquanto o FastAPI utilizará &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TemplateResponse&lt;/code&gt; que vem da classe &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Jinja2Templates&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Para criar novos filtros no Flask, você usa a propriedade &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jinja_env&lt;/code&gt;, o FastAPI usará a propriedade &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;env&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;O Flask irá reconhecer automaticamente a pasta com arquivos estáticos, para o FastAPI você precisa “montar” a pasta e usar a classe &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StaticFiles&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;As sessões são tratadas de forma diferente, para o Flask existe um objeto &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;session&lt;/code&gt;, para o FastAPI o objeto &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;session&lt;/code&gt; faz parte da classe &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Request&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Para aplicações mais complexas, você usa &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Blueprint&lt;/code&gt; no Flask para definir novas rotas, enquanto no FastAPI você terá uma estrutura semelhante chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;APIRouter&lt;/code&gt;. Lembre-se de registrar seu blueprint ou seu router com a aplicação.&lt;/li&gt;
  &lt;li&gt;Por fim, lembre-se de usar a função &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; com o parâmetro correto &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;filename&lt;/code&gt; para o Flask e &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt; para o FastAPI, lembre-se também que nos seus endpoints &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; existe como uma função autônoma no Flask, enquanto é um método da classe &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Request&lt;/code&gt; no FastAPI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caso você queira ver as aplicações em cada framework e comparar as diferenças por conta própria, aqui estão os repositórios no GitHub:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/minimal-flask-webapp-auth0&quot;&gt;Flask Minimal WebApp with Auth0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/minimal-fastapi-webapp-auth0&quot;&gt;FastAPI Minimal WebApp with Auth0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finalmente, se você passou por um processo semelhante, quais outros problemas você enfrentou e como os resolveu? Eu adoraria saber mais sobre sua experiência, me envie uma &lt;a href=&quot;https://jtemporal.com/socials&quot;&gt;mensagem em qualquer uma das minhas redes sociais&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Fri, 19 Jan 2024 15:00:00 +0000</pubDate>
        <link>https://jtemporal.com/dicas-para-migrar-de-flask-para-fastapi-e-vice-versa/</link>
        <guid isPermaLink="true">https://jtemporal.com/dicas-para-migrar-de-flask-para-fastapi-e-vice-versa/</guid>
        
        <category>python</category>
        
        <category>portugues</category>
        
        <category>tutorial</category>
        
        
      </item>
    
      <item>
        <title>Tips on migrating from Flask to FastAPI and vice-versa</title>
        <description>&lt;p&gt;Are you migrating from Flask to FastAPI and facing problems? In this blog post, you will learn about some of the issues that you may encounter when migrating a web application from Flask to FastAPI, as well as how to solve them.&lt;/p&gt;

&lt;h2 id=&quot;the-web-app-that-started-it-all&quot;&gt;The web app that started it all&lt;/h2&gt;

&lt;p&gt;As a developer advocate at Auth0, I build sample applications that can be used to showcase our product. For example, I used a &lt;a href=&quot;https://developer.auth0.com/resources/guides/web-app/flask/basic-authentication&quot;&gt;sample app built with Flask, Jinja, and Auth0&lt;/a&gt; to build a demo for sponsored booths. This demo application showcases how Flask and Auth0 can be used together to develop web applications.&lt;/p&gt;

&lt;p&gt;This app is a typical web app, consisting of a backend built in &lt;a href=&quot;http://flask.palletsprojects.com&quot;&gt;Flask&lt;/a&gt;, a frontend made with &lt;a href=&quot;https://jinja.palletsprojects.com/en/3.1.x/&quot;&gt;Jinja&lt;/a&gt; templates, and some CSS. It is secured with Auth0 to simplify the authentication and authorization processes.&lt;/p&gt;

&lt;p&gt;While writing some code to answer a question from a developer a thought popped into my mind: “&lt;em&gt;Since Auth0 can be used with any framework, why not create a version of the sample app using FastAPI in the backend instead of Flask?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thinking of the work that I do, I could use the new version built with &lt;a href=&quot;https://fastapi.tiangolo.com&quot;&gt;FastAPI&lt;/a&gt; to write a guide that would help developers understand how to protect their applications built in FastAPI using Auth0. So I decided to use the sample built in Flask and migrate things over to a FastAPI-powered app. To make things easier on me, my plan was:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Reuse as much as possible of the original app built with Flask:
    &lt;ol&gt;
      &lt;li&gt;Copy templates and styling as well as any JavaScript.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;Adjust anything necessary for the Flask code to work the “FastAPI way”.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That was a simple plan. Only two steps. “&lt;em&gt;How hard could it be?”&lt;/em&gt; I know, I know, famous last words. So once I started migrating things over, I realized there were a few things that I would need to adjust for the app in FastAPI to function properly.&lt;/p&gt;

&lt;p&gt;Below you can see what you’ll also need to adjust if you have a similar application you want to migrate over from Flask to FastAPI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: Since the authentication guide in FastAPI is not public yet, I have created two sample applications with all the code shown in the examples of this blog post. If you are interested in reviewing the code, both applications are available on GitHub. You can follow the links below:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/minimal-flask-webapp-auth0&quot;&gt;Flask Minimal WebApp with Auth0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/minimal-fastapi-webapp-auth0&quot;&gt;FastAPI Minimal WebApp with Auth0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;templates&quot;&gt;Templates&lt;/h2&gt;

&lt;p&gt;Both Flask and FastAPI support templating using Jinja, but there are a few differences.&lt;/p&gt;

&lt;p&gt;Flask will automatically identify templates in your project so you can use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;render_template&lt;/code&gt; method and Flask will look for the template in your project folder. &lt;a href=&quot;https://flask.palletsprojects.com/en/1.1.x/quickstart/#rendering-templates&quot;&gt;You can even have two formats&lt;/a&gt;: either as a module where the template is on your root folder or as a package where the template lives inside your application folder.&lt;/p&gt;

&lt;p&gt;As long as you use a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;templates/&lt;/code&gt; folder Flask will automatically pick up on it. This will only vary if you are using Blueprints because you will need to pass the path for the templates to the blueprint you create.&lt;/p&gt;

&lt;p&gt;FastAPI on the other hand, not only you do have to make sure to install Jinja2 on your environment, but you also need to tell FastAPI where to find the templates. With that said you can put the templates folder anywhere, but you’ll need to instantiate a templates variable for FastAPI to pick up on it like so:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi.templating&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Jinja2Templates&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;templates&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Jinja2Templates&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;directory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;templates&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After that, you can use that variable to render the template for a given endpoint like this:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@app.get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;home&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;sh&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;
    Home endpoint
    &lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;templates&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;TemplateResponse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;home.html&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;jinja-filters&quot;&gt;Jinja Filters&lt;/h3&gt;

&lt;p&gt;Filters in Jinja serve as a way to modify variables. In this sample app, we created a filter &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;to_pretty_json&lt;/code&gt; to “pretty print” a JSON object into the  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/profile&lt;/code&gt; endpoint. Even though the function is the same on both projects, the way to pass it along to the templates is a little bit different in each framework.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; you are going to notice that both frameworks will work similarly but the property names will be different.&lt;/p&gt;

&lt;p&gt;Since Flask automatically picks up the templates, the Flask instance has a property called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jinja_env&lt;/code&gt; that corresponds to the Jinja environment and that you can edit using the filters dictionary to register new filter like so:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jinja_env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;to_pretty_json&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to_pretty_json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also use the &lt;a href=&quot;https://flask.palletsprojects.com/en/2.3.x/templating/#registering-filters&quot;&gt;template filter decorator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since in FastAPI you had to instantiate the templates variable, you’ll also use that variable to pass along the new filter. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;templates&lt;/code&gt; variable has the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;env&lt;/code&gt; property allowing you to access the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;filters&lt;/code&gt; dictionary as you can see below:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;templates&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;to_pretty_json&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to_pretty_json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;static-files-folder&quot;&gt;Static files folder&lt;/h2&gt;

&lt;p&gt;Much like templates, both Flask and FastAPI, allow you to bundle the static files (CSS, JavaScript, and images) under the same folder, but once again there are a few differences.&lt;/p&gt;

&lt;p&gt;Flask supports static files out of the gate with no configuration needed, you only need to add the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;static/&lt;/code&gt; folder to your project, and that’s it, you don’t need any extra configuration to access static files from your templates.&lt;/p&gt;

&lt;p&gt;For FastAPI, much like the template folder, you need to set the location of the static file by using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mount&lt;/code&gt; property, which is also known as “&lt;em&gt;mounting”&lt;/em&gt; the static files, and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StaticFiles&lt;/code&gt; class to instantiate the directory.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi.staticfiles&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;StaticFiles&lt;/span&gt;

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

&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;mount&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/static&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;StaticFiles&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;directory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that this way of creating the static files folder within the app creates an independent application and won’t be picked up by the OpenAPI or the docs but you’ll still be able to use things like the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; function on your templates.&lt;/p&gt;

&lt;h3 id=&quot;using-url_for-function-on-the-templates&quot;&gt;Using url_for function on the templates&lt;/h3&gt;

&lt;p&gt;Both templates on Flask and FastAPI will allow you to programmatically define URLs for files and endpoints using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; function, but as you can expect the parameters differ on each framework.&lt;/p&gt;

&lt;p&gt;For example, in Flask, to add the style sheet on your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;base.html&lt;/code&gt;, you pass along the folder name &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;static&lt;/code&gt; followed by the parameter named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;filename&lt;/code&gt; containing the name of your CSS file.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{{ url_for(&apos;static&apos;, filename=&apos;style.css&apos;) }}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For FastAPI the functionality of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; function will be the same, but the parameter for the filename is called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{{ url_for(&apos;static&apos;, path=&apos;style.css&apos;) }}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;sessions&quot;&gt;Sessions&lt;/h2&gt;

&lt;p&gt;For web applications, you usually have a way to manage sessions. Below you can see how you can interact with a session in each framework. The example will show how to clear a session when logging out.&lt;/p&gt;

&lt;p&gt;In Flask, you can access the session from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;session&lt;/code&gt; object that can be imported from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flask&lt;/code&gt; module as you can see below:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# ... blueprint definition
&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@webapp_bp.route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;clear-session-example&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;session_clearing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;sh&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;
    example on how to clear a session, often used in logout endpoints
    &lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# ... rest of your logic
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Meanwhile, in FastAPI the session is part of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Request&lt;/code&gt; object and it is rewritable, so you can for example add the session from an identity provider for example… You can access the session by passing the request as part of the endpoint function, and then using it &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;request.session&lt;/code&gt;, like so:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Request&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# ... router definition
&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@webapp_router.get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/profile&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;sam&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,},}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# ... rest of your profile endpoint logic
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;modular-applications-blueprint-and-apirouter&quot;&gt;Modular applications: Blueprint and APIRouter&lt;/h2&gt;

&lt;p&gt;For more complex applications, which usually include multiple modules inside of an app, you’ll need to use a  router so you can have some separation between responsibilities. For this, you will have a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Blueprint&lt;/code&gt; in Flask and an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;APIRouter&lt;/code&gt; in FastAPI.&lt;/p&gt;

&lt;p&gt;After creating the Blueprint or APIRouter you’ll need to register them with your app. Here’s what that looks like for both frameworks.&lt;/p&gt;

&lt;p&gt;The Blueprint will need some more configuration like the name of that blueprint (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;’webapp’&lt;/code&gt;) as well as the import name (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__name__&lt;/code&gt;) and any other configuration necessary, in this example, we passed along the template folder for the webapp:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Flask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Blueprint&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;webapp_bp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Blueprint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;webapp&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;template_folder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;templates&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Flask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once the blueprint is created you can register it to your app. This helps make available any views/routes within your blueprint for your application. The registration occurs by calling the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;register_blueprint&lt;/code&gt; method from your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app&lt;/code&gt;, and passing along the blueprint like so:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Flask&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Flask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;register_blueprint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;webapp_bp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;url_prefix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For FastAPI the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;APIRouter&lt;/code&gt; will function similarly to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Blueprint&lt;/code&gt; in Flask, the difference is that you don’t need to pass any names, take a look:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;APIRouter&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;webapp_router&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;APIRouter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then to register the router you can use the method &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;include_router&lt;/code&gt; from your FastAPI &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app&lt;/code&gt;, and pass along the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;webapp_router&lt;/code&gt; like this:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FastAPI&lt;/span&gt;

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

&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;include_router&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;webapp_router&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;using-url_for-in-the-endpoints&quot;&gt;Using url_for in the endpoints&lt;/h3&gt;

&lt;p&gt;Other than in templates, you can use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; in an endpoint to programmatically define the path for a given endpoint/route.&lt;/p&gt;

&lt;p&gt;For using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; in Flask you gotta import the function from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flask&lt;/code&gt; library and then pass the name of the endpoint. If your endpoint is in another module, remember to pass along the name of that module as well like so:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;url_for&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# ... blueprint definition
&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@webapp_bp.route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/redirect-example&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;redirect_example&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;url_for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;webapp.home&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Meanwhile, in FastAPI the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; is a method and comes from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Request&lt;/code&gt; class. You need to pass along the endpoint name, if that endpoint is part of your app, even if it is in another module, everything will work from there and there’s no need to pass the module name as well.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Request&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastapi.responses&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RedirectResponse&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# ... router definition
&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@webapp_router.get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/redirect-example&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Depends&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ProtectedEndpoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;redirect_example&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RedirectResponse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;url_for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;home&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;Migrating frameworks in an application can be a daunting task especially if you don’t know where things might go wrong after copying and pasting code. But if you know where things will differ the migration will go much more smoothly.&lt;/p&gt;

&lt;p&gt;Here’s a short version of the things to keep an eye out for if you are going to migrate from Flask to FastAPI and vice-versa:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Flask will pick up templates automatically, but FastAPI needs to be told where to find the templates using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Jinja2Templates&lt;/code&gt; class and passing along the templates directory.&lt;/li&gt;
  &lt;li&gt;Flask will use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;render_template&lt;/code&gt; function to render pages, whereas FastAPI will use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TemplateResponse&lt;/code&gt; which comes from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Jinja2Templates&lt;/code&gt; class.&lt;/li&gt;
  &lt;li&gt;To create new filters in Flask you use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jinja_env&lt;/code&gt; property, FastAPI will use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;env&lt;/code&gt; property.&lt;/li&gt;
  &lt;li&gt;Flask will pick up the static folder automatically, for FastAPI you need to “mount” the folder and use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StaticFiles&lt;/code&gt; class.&lt;/li&gt;
  &lt;li&gt;Sessions are handled differently, for Flask there’s a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;session&lt;/code&gt; object, for FastAPI the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;session&lt;/code&gt; object is part of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Request&lt;/code&gt; class.&lt;/li&gt;
  &lt;li&gt;For more complex applications you use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Blueprint&lt;/code&gt; in Flask to define new routes whereas in FastAPI you’ll have a similar structure called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;APIRouter&lt;/code&gt;. Remember to register your blueprint or your router with your app.&lt;/li&gt;
  &lt;li&gt;Finally, remember to use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; function with the correct parameter &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;filename&lt;/code&gt; for Flask and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt; for FastAPI, and that in your endpoints &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_for&lt;/code&gt; exists as a standalone function in Flask whereas it is a method from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Request&lt;/code&gt; class in FastAPI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In case you want to see apps in each framework and compare the differences for yourself here are the repositories on GitHub:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/minimal-flask-webapp-auth0&quot;&gt;Flask Minimal WebApp with Auth0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/minimal-fastapi-webapp-auth0&quot;&gt;FastAPI Minimal WebApp with Auth0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, if you went through a similar process what other problems did you face and how did you solve them? I’d love to know more about your experience, send me a &lt;a href=&quot;https://jtemporal.com/socials&quot;&gt;message on any of my social profiles&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Fri, 15 Dec 2023 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/tips-on-migrating-from-flask-to-fastapi-and-vice-versa/</link>
        <guid isPermaLink="true">https://jtemporal.com/tips-on-migrating-from-flask-to-fastapi-and-vice-versa/</guid>
        
        <category>python</category>
        
        <category>english</category>
        
        <category>tutorial</category>
        
        
      </item>
    
      <item>
        <title>Heroku CLI login from the terminal with MFA enabled</title>
        <description>&lt;p&gt;Let’s say you already know how to use the iterative way &lt;a href=&quot;https://jtemporal.com/login-to-heroku-from-github-codespaces/&quot;&gt;to log in to Heroku via the terminal&lt;/a&gt;, but now you’ve activated multi-factor authentication (MFA) on your profile and a simple username and password won’t be enough to log in.&lt;/p&gt;

&lt;p&gt;In this pro-tip you will learn how to use iterative mode with MFA.&lt;/p&gt;

&lt;h2 id=&quot;logging-into-heroku-using-the-terminal&quot;&gt;Logging into Heroku using the terminal&lt;/h2&gt;

&lt;p&gt;Just to review, if you use the following command&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;heroku login &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can enter your username and password directly on the terminal to log in to Heroku without having to use a browser.&lt;/p&gt;

&lt;p&gt;This feature is extremely useful when you are trying to log in to Heroku from a remote instance like GitHub Codespaces for example.&lt;/p&gt;

&lt;p&gt;With MFA (multi-factor authentication) activated, just  username and password won’t be enough as can be seen in the image above.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/heroku-login-cli-credentials-not-enough-mfa-enabled.webp&quot; alt=&quot;Result of trying an interactive login and failing due to MFA enabled&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To follow up with the login process in these cases, an authorization token must be generated.&lt;/p&gt;

&lt;h2 id=&quot;setting-up-an-authorization-token-to-log-in-to-the-mfa-enabled-endpoint&quot;&gt;Setting up an authorization token to log in to the MFA-enabled endpoint&lt;/h2&gt;

&lt;p&gt;Log in to your Heroku dashboard and click on your photo, then select “Account Settings”, when the page loads choose the “Applications” tab or &lt;a href=&quot;https://dashboard.heroku.com/account/applications&quot;&gt;click on this link to go directly to the applications dashboard&lt;/a&gt;. Then scroll down to the section called “Authorizations”.&lt;/p&gt;

&lt;p&gt;If you have never used Heroku authorization tokens before, this section will be empty, I already have some tokens as you can see in the image below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/heroku-lists-of-authorization-tokens.webp&quot; alt=&quot;Tokens listed in the Authorizations section&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then click on ”Create Authorization”. A side menu will appear as you can see in the image below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/lateral-menu-for-creating-new-authorization-token.webp&quot; alt=&quot;Side menu to create a new authorization token&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To create a new token, just give it a description and click on the “Create” button. In my case, I intend to use this token for a GitHub Codespaces, so I named it “Codespaces”.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/heroku-authorization-token-created-successfully.webp&quot; alt=&quot;Side menu after creating the new token showing this token&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Once created, the token will be shown on the screen so you can copy it. Oh and don’t worry, although I’m showing this token here (which you should never do) it no longer exists so no one can impersonate me.&lt;/p&gt;

&lt;p&gt;Note that, optionally, it is possible to give an “expiration date” or better said, a period of time for this token to expire, it is even recommended to do so.&lt;/p&gt;

&lt;h2 id=&quot;using-an-authorization-token-to-log-in&quot;&gt;Using an authorization token to log in&lt;/h2&gt;

&lt;p&gt;Remember to copy the token, now to log in, just use the token instead of your password when logging in. Run the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;heroku login -i&lt;/code&gt; again and pass your username and token as can be seen&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/successful-login-with-authorization-token-heroku.webp&quot; alt=&quot;Image showing a successful login using authorization token&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now just follow the traditional flow of using Heroku.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;In this post, you learned:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;How to log in to Heroku via command line with multi-factor authentication (MFA) enabled using an authorization token.&lt;/li&gt;
  &lt;li&gt;How to create an authorization token on Heroku.&lt;/li&gt;
  &lt;li&gt;That to log in with MFA activated, you need to copy the generated token and use it instead of the password when logging in via the command line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you can continue logging into Heroku via command line even with MFA enabled!&lt;/p&gt;
</description>
        <pubDate>Mon, 04 Dec 2023 09:01:00 +0000</pubDate>
        <link>https://jtemporal.com/login-on-heroku-via-cli-with-mfa/</link>
        <guid isPermaLink="true">https://jtemporal.com/login-on-heroku-via-cli-with-mfa/</guid>
        
        <category>github codespaces</category>
        
        <category>codespaces</category>
        
        <category>git</category>
        
        <category>github</category>
        
        <category>heroku</category>
        
        <category>auth</category>
        
        <category>authorization</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>7 lições que aprendi gravando e editando vídeos curtos</title>
        <description>&lt;p&gt;Como &lt;em&gt;developer advocate&lt;/em&gt;, eu queria ficar mais confortável com a gravação e edição de vídeos. Neste post, compartilho algumas das lições que aprendi com essa experiência. Continue lendo para descobrir o que aprendi e como isso pode te ajudar na criação de seu próprio conteúdo em vídeo!&lt;/p&gt;

&lt;h2 id=&quot;por-que-gravar-vídeos&quot;&gt;Por que gravar vídeos?&lt;/h2&gt;

&lt;p&gt;Percebi recentemente que agora tenho um nível de conforto muito bom com minha escrita, mas não tenho o mesmo nível de conforto quando preciso gravar algo.&lt;/p&gt;

&lt;p&gt;Sendo uma &lt;em&gt;developer advocate&lt;/em&gt;, às vezes vou precisar gravar vídeos, e estar confortável fazendo isso me ajudará a reduzir o estresse durante a gravação, gravando vídeos mais rápido e com menos erros, e talvez em algum momento no futuro eu até ame gravar tanto quanto eu adoro escrever.&lt;/p&gt;

&lt;p&gt;Então o desafio é gravar o máximo de vídeos possível até o final do ano. Meu objetivo é gravar 3 vídeos curtos por semana sobre um assunto com o qual me sinto confortável, neste caso: git. Reaproveitar parte do conteúdo que já tenho do GitFichas e do O Grande Microlivro de Git  ajudaria, para que eu não tivesse que criar muito conteúdo do zero.&lt;/p&gt;

&lt;h2 id=&quot;por-que-editar-vídeos&quot;&gt;Por que editar vídeos?&lt;/h2&gt;

&lt;p&gt;Não só gravar vídeos é muito importante para mim, como também queria me desafiar para aprender e me sentir confortável na edição de vídeos, principalmente aqueles que sou eu quem fala.&lt;/p&gt;

&lt;p&gt;E você pode perguntar “Por que?” e para mim a resposta é simples: quero ajudar mais pessoas.&lt;/p&gt;

&lt;p&gt;Embora escrever e ler sejam minhas formas preferidas de aprender, algumas pessoas desenvolvedoras preferem assistir vídeos. Tenho sonhado com o dia em que você poderá vir aqui no meu blog e ler algo ou assistir a um vídeo e aprender a mesma coisa. Você pode escolher a maneira que preferir aprender comigo.&lt;/p&gt;

&lt;p&gt;Mas para que isso seja verdade preciso 1) gravar os vídeos e 2) editá-los. Talvez no futuro eu tenha uma equipe para editá-los para mim. Não sendo essa a minha realidade hoje, vou aprender a editar.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/tiktok-jess-temporal-profile-showing-the-first-two-videos.webp&quot; alt=&quot;Uma foto do meu perfil do TikTok, mostrando os 2 primeiros vídeos&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;lição-1-vídeos-de-60-segundos-são-um-desafio&quot;&gt;Lição 1: Vídeos de 60 segundos são um desafio&lt;/h2&gt;

&lt;p&gt;Para mim, vídeos de 60 segundos são um desafio que vem do meu gosto de misturar anedotas pessoais com o conteúdo técnico.&lt;/p&gt;

&lt;p&gt;Acredito que sempre que você aprende algo novo com alguém você também está em busca de conexão, de se identificar com a pessoa com quem está aprendendo, e até mesmo de fazer com que um pouco da personalidade dessa pessoa apareça, Também percebo que um pouco da minha personalidade vai aparecer de outras maneiras, mesmo em tão pouco tempo.&lt;/p&gt;

&lt;p&gt;Garantir que cada vídeo tenha menos de 60 segundos adiciona uma camada extra de desafio. Mesmo tendo começado com o TikTok em mente, pretendo postar os vídeos também no YouTube como um &lt;em&gt;short&lt;/em&gt;. Infelizmente, os &lt;em&gt;shorts&lt;/em&gt; precisam ter 60 segundos ou menos, daí o desafio adicional.&lt;/p&gt;

&lt;h2 id=&quot;lição-2-não-fale-enquanto-digita&quot;&gt;Lição 2: Não fale enquanto digita&lt;/h2&gt;

&lt;p&gt;Embora eu tenha a habilidade de dizer algo enquanto digito outra coisa, depois de editar os primeiros vídeos, percebi que não falar enquanto digito irá:&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;Aumentar a velocidade na edição:&lt;/strong&gt; se eu errar fica mais fácil recortar sem ter que regravar todo o trecho ou ter que falar por cima da explicação depois;&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Permitir fazer vídeos mais curtos:&lt;/strong&gt; porque posso acelerar a parte do vídeo onde estou digitando e também recortá-la se quiser. Além disso, embora eu consiga falar e digitar, meu ritmo de fala muda e demoro um pouco mais dar obter a informação.&lt;/p&gt;

&lt;h2 id=&quot;lição-3-aprender-a-editar-vídeo-é-mais-fácil-com-um-resultado-em-mente&quot;&gt;Lição 3: Aprender a editar vídeo é mais fácil com um resultado em mente&lt;/h2&gt;

&lt;p&gt;Ainda tenho um longo caminho a percorrer na edição de vídeos mas, editando vídeos curtos, consigo dividir o processo de aprendizagem em pequenos passos, até agora aprendi a:&lt;/p&gt;

&lt;p&gt;1) Cortar um vídeo para cortar partes que não preciso;&lt;/p&gt;

&lt;p&gt;2) Adicionar um destaque ao que estou falando, como uma seta ou linha embaixo de uma parte específica no texto texto;&lt;/p&gt;

&lt;p&gt;3) Adicionar texto na tela;&lt;/p&gt;

&lt;p&gt;4) Adicionar uma transição.&lt;/p&gt;

&lt;p&gt;Espero aprender algumas outras coisas em breve, como remover o fundo se eu usar uma tela verde, legendar, adicionar efeitos para que as coisas pareçam mais engraçadas e assim por diante.&lt;/p&gt;

&lt;h2 id=&quot;lição-4-paciência-consigo-mesma-é-fundamental&quot;&gt;Lição 4: Paciência consigo mesma é fundamental&lt;/h2&gt;

&lt;p&gt;Estou editando as coisas no iMovie. 👀 não me julgue, ok? Eu estou começando agora.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1694286049/imovie-editing-tiktoks_cff1zz.png&quot; alt=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1694286049/imovie-editing-tiktoks_cff1zz.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;No momento eu sei exatamente um atalho: aquele para dividir o vídeo. Gostaria de saber mais atalhos, pois sei que provavelmente tornarão a edição mais rápida, também sei que a memória muscular virá com o tempo.&lt;/p&gt;

&lt;p&gt;Além de cometer menos erros ou saber exatamente como editar algo antes de começar, para não ter que desfazer algumas coisas porque não saíram como eu esperava.&lt;/p&gt;

&lt;h2 id=&quot;lição-5-mesmo-que-as-dimensões-estejam-corretas-telas-diferentes-mostrarão-o-vídeo-de-forma-diferente&quot;&gt;Lição 5: Mesmo que as dimensões estejam corretas, telas diferentes mostrarão o vídeo de forma diferente&lt;/h2&gt;

&lt;p&gt;O iPhone 14 por exemplo “come” no topo do vídeo no TikTok e se a ilha dinâmica estiver ligada é ainda pior.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1694300413/different-displays-of-same-content_wx0hwk.png&quot; alt=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1694300413/different-displays-of-same-content_wx0hwk.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Um amigo também me mostrou uma captura de tela no telefone dele mostrando que havia uma barra embaixo que cobriria uma parte do vídeo (principalmente meu rosto agora), então levar isso em consideração será bom para evitar colocar informações em uma parte que não aparecerá.&lt;/p&gt;

&lt;p&gt;Isso basicamente significa que preciso ajustar a configuração de gravação dos próximos vídeos para que ainda possa mostrar as coisas sem comprometer o conteúdo exibido.&lt;/p&gt;

&lt;h2 id=&quot;lição-6-eu-ainda-não-gosto-do-som-da-minha-própria-voz-no-vídeo&quot;&gt;Lição 6: Eu ainda não gosto do som da minha própria voz no vídeo&lt;/h2&gt;

&lt;p&gt;Provavelmente porque sou excessivamente crítica com meus próprios erros, não apenas em dizer a coisa errada, mas também em relação ao meu sotaque e à maneira como simplesmente não consigo pronunciar algumas palavras “corretamente”.&lt;/p&gt;

&lt;p&gt;Então, estou me concentrando em parar de prestar atenção em alguns deles, especialmente durante a edição, tenho que me ajudar e não gravar as mesmas coisas repetidamente. Isso também diz muito sobre como ficar confortável ao editar e gravar vídeos.&lt;/p&gt;

&lt;h2 id=&quot;7-a-parte-de-alcance-é-difícil&quot;&gt;7: A parte de alcance é difícil&lt;/h2&gt;

&lt;p&gt;Estou postando no &lt;a href=&quot;https://www.tiktok.com/@jess.temporal&quot;&gt;meu perfil no TikTok&lt;/a&gt;, também no &lt;a href=&quot;https://www.youtube.com/@gitfichas&quot;&gt;canal do YouTube do GitFichas como shorts&lt;/a&gt; e no &lt;a href=&quot;https://www.instagram.com/gitfichas/reels/&quot;&gt;perfil do Instagram do GitFichas como Reels&lt;/a&gt;, mas ainda não descobri “a maneira certa” de compartilhar isso em outras plataformas como o Twitter (X) , Mastodon, LinkedIn e Bluesky.&lt;/p&gt;

&lt;p&gt;Devo postar links para outras plataformas sempre que compartilhar um novo vídeo ou devo compartilhar o vídeo lá também? Não sei a resposta para essa pergunta agora, mas se eu descobrir te aviso.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Aqui está a versão resumida da lista de lições até agora:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Lição 1:&lt;/strong&gt; Vídeos de 60 segundos são um desafio;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Lição 2:&lt;/strong&gt; Não fale enquanto digita;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Lição 3:&lt;/strong&gt; Aprender a editar vídeos é mais fácil quando se tem um resultado em mente;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Lição 4:&lt;/strong&gt; Paciência consigo mesmo é fundamental;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Lição 5:&lt;/strong&gt; Mesmo que as dimensões estejam corretas, telas diferentes mostrarão o vídeo de forma diferente;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Lição 6:&lt;/strong&gt; Eu ainda não gosto do som da minha própria voz no vídeo;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Lição 7:&lt;/strong&gt; A parte de alcance é difícil.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Não esqueça de se inscrever ou seguir:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.tiktok.com/@jess.temporal&quot;&gt;TikTok&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/@gitfichas&quot;&gt;YouTube&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.instagram.com/gitfichas/reels/&quot;&gt;Instagram&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Continuarei compartilhando essa jornada por aqui… Enquanto isso, eu ia adorar saber a sua opinião, passa pra mandar uma mensagem em alguma &lt;a href=&quot;https://jtemporal.com/socials&quot;&gt;das minhas redes sociais&lt;/a&gt;. 😉&lt;/p&gt;
</description>
        <pubDate>Sun, 03 Dec 2023 09:01:00 +0000</pubDate>
        <link>https://jtemporal.com/sete-licoes-que-aprendi-gravando-e-editando-videos-curtos/</link>
        <guid isPermaLink="true">https://jtemporal.com/sete-licoes-que-aprendi-gravando-e-editando-videos-curtos/</guid>
        
        <category>devrel</category>
        
        <category>developer advocate</category>
        
        <category>developer relations</category>
        
        <category>developer advocacy</category>
        
        <category>git</category>
        
        <category>github</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Login to Heroku from GitHub Codespaces</title>
        <description>&lt;p&gt;These days I was using GitHub CodeSpaces to deploy an application to Heroku and I came across a problem: &lt;em&gt;How do I login to Heroku given that I don’t have access to a browser running on the same machine where I’m using the terminal?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you keep reading this blog post, I will show you exactly how to solve this.&lt;/p&gt;

&lt;h2 id=&quot;ip-mismatch-when-logging-in&quot;&gt;IP mismatch when logging in&lt;/h2&gt;

&lt;p&gt;You’ve just finished &lt;a href=&quot;https://devcenter.heroku.com/articles/heroku-cli#install-the-heroku-cli&quot;&gt;installing Heroku CLI&lt;/a&gt; and it’s time to log in. Then you run the following command:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;heroku login
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This command will give you a page that you can open in your browser and login. Typically you see this page here:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/heroku-login-page.webp&quot; alt=&quot;heroku login page&quot; /&gt;&lt;/p&gt;

&lt;p&gt;When you click on login, you can log into your account with your traditional method such as username and password, for example, and then your terminal will show that you have logged in successfully.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/heroku-successful-login-in-terminal.webp&quot; alt=&quot;image login made in the terminal using the browser&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s kind of magical how this happens, right? However, if you are using GitHub Codespaces, you don’t have a browser to view this login page, and if you try to open that same page using the traditional method of copying the URL and pasting it in your browser, you will find a page with the “IP mismatch” message.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/ip-mismatch-after-heroku-login.webp&quot; alt=&quot;Image showing IP mismatch from heroku&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And now what? The secret is to use the iterative way to login from the command line.&lt;/p&gt;

&lt;h2 id=&quot;logging-into-heroku-using-the-terminal&quot;&gt;Logging into Heroku using the terminal&lt;/h2&gt;

&lt;p&gt;For cases in which it is not possible to use the browser to see that familiar login screen, the solution is to login &lt;em&gt;interactively&lt;/em&gt;. Just use the same command as before followed by the  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-i&lt;/code&gt;option and then follow the instructions that will show up.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;heroku login &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After running the command above, you will see the user and password request as can be seen in the image below:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/heroku-login-cli-credentials-requested.webp&quot; alt=&quot;Image requesting for the username and password&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After entering your data and logging in, you can continue using Heroku via the CLI normally.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;In this post, you learned:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;How to login to Heroku from GitHub Codespaces.&lt;/li&gt;
  &lt;li&gt;How to resolve the “IP mismatch” error using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-i&lt;/code&gt; option when logging into Heroku via the command line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this post helps you login to Heroku from GitHub Codespaces.&lt;/p&gt;
</description>
        <pubDate>Sat, 02 Dec 2023 09:01:00 +0000</pubDate>
        <link>https://jtemporal.com/login-to-heroku-from-github-codespaces/</link>
        <guid isPermaLink="true">https://jtemporal.com/login-to-heroku-from-github-codespaces/</guid>
        
        <category>github codespaces</category>
        
        <category>codespaces</category>
        
        <category>git</category>
        
        <category>github</category>
        
        <category>heroku</category>
        
        <category>authorization</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Renaming files in Git: the right way (using git mv)</title>
        <description>&lt;p&gt;Have you ever tried to rename a file in your projects and had a hard time adding the adjustment to a commit? This doesn’t just happen to you. In this pro-tip you will learn how to rename your files in git projects correctly to avoid headaches.&lt;/p&gt;

&lt;h2 id=&quot;the-problem-with-renaming-a-file-without-using-git&quot;&gt;The problem with renaming a file without using git&lt;/h2&gt;

&lt;p&gt;Let’s say you decided to rename a file and, for simplicity’s sake, you decide to do it in the folder interface itself (or using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mv&lt;/code&gt; command in the terminal). After that you want to commit the name change and when you run the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt; you come across this situation:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-mv/001-renamed-file-deleted-git-status.webp&quot; alt=&quot;Git status showing the file was deleted and another created&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you rename the file without using Git, Git “gets lost” and thinks that the original file was deleted and a new file was created as shown in the image above. Because of this behavior, you end up having to do two steps to commit the name change:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Add the deleted file;&lt;/li&gt;
  &lt;li&gt;Add the new file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To make matters worse, it is not possible to add a “deleted” file without explicitly using the name of that file, which makes this whole process even more tedious, not to mention the weirdness of the phrase “add a deleted file”.&lt;/p&gt;

&lt;p&gt;Let’s say you persevered, added the deleted file and added the new file and once again you run  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt;, and then git finally understands that it was a change in the file name, like so:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-mv/002-renamed-file-git-status.webp&quot; alt=&quot;Git status showing the file was actually renamed&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is a relatively painless solution if you don’t need to do this often, but there is a better way.&lt;/p&gt;

&lt;h2 id=&quot;renaming-files-the-right-way-in-git&quot;&gt;Renaming files the right way in git&lt;/h2&gt;

&lt;p&gt;To begin, you need to resist the urge of renaming the file using the interface or the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mv&lt;/code&gt; command alone and start using the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git mv&lt;/code&gt;. Using the same example as the case above, in which the file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;books.md&lt;/code&gt; was renamed to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;book.md&lt;/code&gt;, the command looks like this:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git &lt;span class=&quot;nb&quot;&gt;mv &lt;/span&gt;books.md book.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The result of using just one command is the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Rename the file;&lt;/li&gt;
  &lt;li&gt;Add the name change to staging.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After that you can follow the normal commit flow and commit this change.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;Do not use the interface to rename files in your Git projects, use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git mv&lt;/code&gt; command to do this and add this staged change to a commit.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/052?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1692466960/gitfichas/en/052/052-full_l6yjdm.jpg&quot; alt=&quot;GitFicha #052: git mv  source target&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

</description>
        <pubDate>Fri, 01 Dec 2023 11:25:00 +0000</pubDate>
        <link>https://jtemporal.com/renaming-files-in-git-the-right-way/</link>
        <guid isPermaLink="true">https://jtemporal.com/renaming-files-in-git-the-right-way/</guid>
        
        <category>git</category>
        
        <category>english</category>
        
        <category>protip</category>
        
        
      </item>
    
      <item>
        <title>How to undo changes in a Git repository using git revert</title>
        <description>&lt;p&gt;There are a number of ways of undoing commits in this pro-tip you will learn how to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git revert&lt;/code&gt; to undo commits specially when they already been published.&lt;/p&gt;

&lt;h2 id=&quot;what-is-git-revert&quot;&gt;What is git revert?&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git revert&lt;/code&gt; is a command that will undo a change in a commit by performing two actions:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Using the changes in a commit or collection of commits, undo said changes;&lt;/li&gt;
  &lt;li&gt;And create a new commit with the reversed changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;why-use-git-revert&quot;&gt;Why use git revert?&lt;/h2&gt;

&lt;p&gt;Changes in git repositories are made so often that some times you might need to adjust them or even remove them from your codebase completely.&lt;/p&gt;

&lt;p&gt;Depending on your case, you could &lt;a href=&quot;https://jtemporal.com/undoing-the-last-commits-using-git-reset/&quot;&gt;undo commits using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset&lt;/code&gt;&lt;/a&gt; thus removing the changes. But using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset&lt;/code&gt; is only good if you haven’t published the commits with a given alteration. For those cases where a commit with a given change is public, a better way to undo those changes is to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git revert&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This command is made specially to remove the changes of a commit or collection of commits by making a new commit literally &lt;em&gt;reverting&lt;/em&gt; the changes.&lt;/p&gt;

&lt;h2 id=&quot;how-does-git-revert-work&quot;&gt;How does git revert work?&lt;/h2&gt;

&lt;p&gt;Every change in git is a collection of differences between the previous state of a given file and the alterations you made what is also know as a &lt;em&gt;patch&lt;/em&gt;. Ideally if you follow best practices, the alterations you made will be done in an atomic way and each atomic change will be part of a single commit.&lt;/p&gt;

&lt;p&gt;After choosing the commits with the corresponding changes you want to reverse, you can give the hash of said commits to the revert function and let the revert do it’s magic much like pressing Ctrl+Z or Cmd+Z on your computer.&lt;/p&gt;

&lt;h2 id=&quot;using-git-revert-in-a-repository&quot;&gt;Using git revert in a repository&lt;/h2&gt;

&lt;p&gt;Last weekend was Black Friday and Cyber Monday weekend so I wanted to have a discount code for my book as part of the book page. To do so, I made a bunch of commits all in this &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/pull/249&quot;&gt;Black Friday pull request&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1701353823/images/fmfmyqppkh66ftlukpox.png&quot; alt=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1701353823/images/fmfmyqppkh66ftlukpox.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The image above you can see the 4 commits I made as well as the four short version of the commit hashes. For simplicity sake I can copied those for hashes on GitHub. To undo each of this commit I can use a succession of git reverts passing along each commit like this:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git revert 59b322a
git revert 93c1c77
git revert 7f37472
git revert c37fb73
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Every time you run one of these commands, your editor will open up with a pre-populated message about the reversal of the commit like so:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1701356771/images/hv6greepoam9tzpqccst.png&quot; alt=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1701356771/images/hv6greepoam9tzpqccst.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can change this message if you want to but I tend to only keep it. Once you save the commit message, you’ll be able to check that the commit made has the correct changes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1701356918/images/o9hdlhen0ugn17vyzwjv.png&quot; alt=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1701356918/images/o9hdlhen0ugn17vyzwjv.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And that’s it, now you can push your changes and make a new pull request undoing your previous work.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;In this pro tip you learned that&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git revert&lt;/code&gt; is a command that undoes changes in a commit by creating a new commit with the reversed changes.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git revert&lt;/code&gt; is useful when you have already published the commits you want to undo.&lt;/li&gt;
  &lt;li&gt;Each revert command creates a new commit that undoes the changes made in the specified commit.&lt;/li&gt;
  &lt;li&gt;You can revert multiple commits by running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git revert&lt;/code&gt; for each commit in succession.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now go forth and reverse changes in your repo.&lt;/p&gt;
</description>
        <pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/how-to-undo-changes-in-a-git-repository-using-git-revert/</link>
        <guid isPermaLink="true">https://jtemporal.com/how-to-undo-changes-in-a-git-repository-using-git-revert/</guid>
        
        <category>git</category>
        
        <category>english</category>
        
        <category>pro tip</category>
        
        
      </item>
    
      <item>
        <title>Livestream Hacktoberfest - Contribuindo com Open Source</title>
        <description>&lt;p&gt;Em Outubro acontece o Hacktoberfest, festa anual de contribuição open source, embora em outubro role essa festa é possível contribuir com open source o ano todo.&lt;/p&gt;

&lt;p&gt;Se você tem interesse em contribuir com open source e precisa de um guia em como fazer isso, eu e &lt;a href=&quot;https://www.linkedin.com/in/morgannadev/&quot;&gt;Morganna Giovanneli&lt;/a&gt; tomamos conta do canal do GitHub Brasil para falar de open source e fazer pull requests.&lt;/p&gt;

&lt;p&gt;Alguns dos assuntos mencionados nessa livestream:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Projetos Open Source&lt;/li&gt;
  &lt;li&gt;GitHub Actions&lt;/li&gt;
  &lt;li&gt;A lista de projetos brasileiros para contribuição&lt;/li&gt;
  &lt;li&gt;Como fazer pull requests&lt;/li&gt;
  &lt;li&gt;Como revisar pull requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dá play no vídeo aqui em baixo pra conferir na íntegra. 👇&lt;/p&gt;

&lt;h2 id=&quot;livestream&quot;&gt;LiveStream&lt;/h2&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/c9voxuEmJeY?si=IDRLW986fhrzCuJd&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Sun, 05 Nov 2023 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest-livestream-github/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest-livestream-github/</guid>
        
        <category>português</category>
        
        <category>github</category>
        
        <category>open source</category>
        
        
      </item>
    
      <item>
        <title>Let&apos;s Talk About JWT</title>
        <description>&lt;h2 id=&quot;slides&quot;&gt;Slides&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;iframe src=&quot;https://slides.com/jtemporal/pybay23/embed?style=hidden&amp;amp;byline=hidden&amp;amp;share=hidden&amp;amp;shared_notes=hidden&quot; width=&quot;576&quot; height=&quot;420&quot; title=&quot;PyBay - Let’s Talk About JWT&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;talk&quot;&gt;Talk&lt;/h2&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/0vxVUjUL_Nw?si=y5zkt5NE2jsHJveK&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Sun, 08 Oct 2023 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/pybay23/</link>
        <guid isPermaLink="true">https://jtemporal.com/pybay23/</guid>
        
        <category>english</category>
        
        <category>pyjwt</category>
        
        <category>jwt</category>
        
        <category>talk</category>
        
        
      </item>
    
      <item>
        <title>Projetos Brasileiros para contribuir nesse #Hacktoberfest 2023</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/projetos-br-hacktoberfest-2025/&quot;&gt;Edição atual da lista disponível aqui&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Então Outubro chega mais uma vez para a alegria de devs e entusiastas open source do mundo todo, e com ele o evento mais esperado chega em sua décima edição: #Hacktoberfest.&lt;/p&gt;

&lt;p&gt;Desde 2017, essa lista vem pra te ajudar a fazer pull requests/merge requests e participar dessa festa que dura um mês completinho. Então aqui vai! Uma lista toda repleta de projetos brasileiros pra você contribuir nesse mês de Outubro!&lt;/p&gt;

&lt;h2 id=&quot;edições-anteriores&quot;&gt;Edições anteriores&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/nossa-coletividad/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-4dc9b9b576c0&quot;&gt;2017&lt;/a&gt;, &lt;a href=&quot;https://medium.com/@jessicatemporal/projetos-brasileiros-para-contribuir-nesse-hacktoberfest-vers%C3%A3o-2018-4925959b9411&quot;&gt;2018&lt;/a&gt;, &lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-o-retorno/&quot;&gt;2019&lt;/a&gt;, &lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2020/&quot;&gt;2020&lt;/a&gt;, &lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2021/&quot;&gt;2021&lt;/a&gt;, &lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-contribuir-hacktoberfest-2022/&quot;&gt;2022&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;regras-para-entrar-nessa-lista&quot;&gt;Regras para entrar nessa lista&lt;/h2&gt;

&lt;p&gt;As regras do ano passado se mantem:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ser um projeto criado/desenvolvido/mantido por pessoas brasileiras;&lt;/li&gt;
  &lt;li&gt;Precisa ser um &lt;strong&gt;projeto&lt;/strong&gt;, não pode ser uma organização, caso tenha mais de um projeto da organização precisa ser um PR por projeto com uma entrada por projeto;&lt;/li&gt;
  &lt;li&gt;Ter pelo menos uma &lt;em&gt;issue&lt;/em&gt; aberta.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;avisos-para-2023&quot;&gt;Avisos para 2023&lt;/h2&gt;

&lt;h3 id=&quot;prêmios&quot;&gt;Prêmios&lt;/h3&gt;

&lt;p&gt;Esse ano a Hacktoberfest não terá mais a tradicional camiseta. Por questões logísticas os prêmios serão virtuais para as cinquenta mil pessoas a completar os 4 pull/merge requests em Outubro.&lt;/p&gt;

&lt;h3 id=&quot;adicionando-projetos-nessa-lista&quot;&gt;Adicionando projetos nessa lista&lt;/h3&gt;

&lt;p&gt;Esse ano vamos manter a mesma forma de aumentar essa lista com mais projetos, como sempre, apenas abrindo um PR com o projeto. &lt;a href=&quot;https://jtemporal.com/adicionando-um-novo-projeto-na-lista-da-hacktoberfest-2019/&quot;&gt;As instruções de como adicionar projetos tão aqui&lt;/a&gt;. Todo mundo segue apenas ganhando &amp;lt;3.&lt;/p&gt;

&lt;p&gt;Os projetos continuam separados pela linguagem principal pra facilitar as buscas pra quem lê e também em ordem alfabética pela linguagem. 😉&lt;/p&gt;

&lt;h3 id=&quot;qualidade--quantidade&quot;&gt;Qualidade &amp;gt; Quantidade&lt;/h3&gt;

&lt;p&gt;Assim como em 2022, qualidade é o mais importante então se liga que dois PRs inválidos resultará em &lt;strong&gt;desqualificação por período indeterminado&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Para um PR ser considerado inválido, ele deve ser marcado com as &lt;em&gt;tags&lt;/em&gt; &lt;strong&gt;spam&lt;/strong&gt; ou &lt;strong&gt;invalid&lt;/strong&gt;. Então é bom tentar fazer PRs de qualidade!&lt;/p&gt;

&lt;p&gt;Relembrando que para tornar seu PR válido para a hacktoberfest você precisa ter algumas coisas. PRs apenas contarão se:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;O PR precisa ser aberto em Outubro (entre os dias 1 e 31);&lt;/li&gt;
  &lt;li&gt;O PR precisa acontecer num projeto que tem o tópico &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hacktoberfest&lt;/code&gt; &lt;strong&gt;ou&lt;/strong&gt; ser marcado com o rótulo (&lt;em&gt;label&lt;/em&gt;) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hacktoberfest-accepted&lt;/code&gt; por um mantenedor &lt;strong&gt;ou&lt;/strong&gt; ser aceito (&lt;em&gt;merged&lt;/em&gt;) &lt;strong&gt;ou&lt;/strong&gt; ser aprovado pelo processo de revisão (&lt;em&gt;review&lt;/em&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;mais-informações&quot;&gt;Mais informações&lt;/h3&gt;

&lt;p&gt;Mais informações no &lt;a href=&quot;https://hacktoberfest.com/&quot;&gt;site oficial (em inglês)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por último, nesse outro artigo tem &lt;a href=&quot;https://jtemporal.com/5-dicas-para-fazer-o-seu-pull-request-brilhar/&quot;&gt;5 Dicas Para Fazer o Seu Pull Request Brilhar ✨&lt;/a&gt; e pode ser útil.&lt;/p&gt;

&lt;p&gt;Happy Hacking! 🎉&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt; C# &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/afucher/Inquirer&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3756185?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;afucher/Inquirer&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A collection of common interactive command line user interfaces in C#.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alexsandro-xpt/ErysDownloader&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/845657?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alexsandro-xpt/ErysDownloader&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ErysDownloader, a frenetic and optimizate downloader library. Pure C# lightweight HTTP GET verb library for text/html content-type. No dependece.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/code-cracker/code-cracker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/9695920?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;code-cracker/code-cracker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An analyzer library for C# and VB that uses Roslyn to produce refactorings, code analysis, and other niceties.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; C &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cmatsuoka/libxmp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/317355?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cmatsuoka/libxmp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Libxmp is a library that renders module files to PCM data.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/hardinfo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/hardinfo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;System profiler and benchmark tool for Linux systems&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/lwan&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/lwan&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Experimental, scalable, high performance HTTP server&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; CSS &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/milligram/milligram&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16243913?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;milligram/milligram&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A minimalist CSS framework.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Clojure &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mauricioszabo/atom-chlorine&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/138037?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mauricioszabo/atom-chlorine&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; An Atom plugin to integrate with Socket-REPL over Clojure and ClojureScript&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; C++ &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/OtacilioN/Brasilino&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10578275?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;OtacilioN/Brasilino&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Uma biblioteca que permite programar em linguagem Arduino utilizando comandos facilitados em PT-BR.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/vinipsmaker/tufao&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/865914?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;vinipsmaker/tufao&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An asynchronous web framework for C++ built on top of Qt&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Elixir &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/philss/floki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/381213?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;philss/floki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Floki is a simple HTML parser that enables search for nodes using CSS selectors.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Go &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/avelino/awesome-go&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/31996?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;avelino/awesome-go&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A curated list of awesome Go frameworks, libraries and software &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cuducos/minha-receita&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/4732915?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cuducos/minha-receita&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Sua API web para consulta de informações do CNPJ da Receita Federal &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/globocom/huskyci&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://huskyci.opensource.globo.com/img/logo.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;globocom/huskyci&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Orquestrador de testes de segurança no CI&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/goreleaser/goreleaser&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24697112?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;goreleaser/goreleaser&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Deliver Go binaries as fast and easily as possible&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/larien/learn-go-with-tests&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/29347337?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;larien/learn-go-with-tests&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tradução do livro de @quii sobre aprender Go com desenvolvimento orientado a testes&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/robertoduessmann/weather-api&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/9089383?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;robertoduessmann/weather-api&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A RESTful API to check the weather&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rodrigo-brito/gocity&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/44341229?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rodrigo-brito/gocity&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Code City metaphor for visualizing Go source code in 3D&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; JavaScript &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/IgorRozani/filosofunk&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/802968?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;IgorRozani/filosofunk&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto com o intuito de juntar frases engraçadas, divertidas, filosóficas ou criativas de músicas de funk.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/MinisterioPublicoRJ/inloco&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/27096918?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;MinisterioPublicoRJ/inloco&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A Geographic Information System (GIS) used by Ministério Público do Estado do Rio de Janeiro to show social, institutional and administrative data , based on React and Leaflet, interacting with a GeoServer back-end. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/RocketChat/Rocket.Chat&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12508788?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;RocketChat/Rocket.Chat&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The ultimate Free Open Source Solution for team communications.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alexanmtz/material-sense&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/88840?s=60&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alexanmtz/material-sense&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A full simple application for react material ui&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/eguatech/egua&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/54448514?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;eguatech/egua&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem de Programação Egua&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/doom-fire-algorithm&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/4248081?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/doom-fire-algorithm&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Playground for the fire effect from DOOM. Really simple algorithm and all experiments are welcome!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/tabnews.com.br&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/4248081?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/tabnews.com.br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Conteúdos para quem trabalha com Programação e Tecnologia.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/video-maker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/4248081?v=4&amp;amp;size=200&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/video-maker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto open source para fazer vídeos automatizados.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/herbsjs/herbs-cli&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://herbsjs.org/img/logo-herbsjs.svg&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;herbsjs-cli&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A CLI ajuda a acelerar seu ciclo de desenvolvimento com HerbsJS gerando casos de uso e camadas de infraestrutura (REST, GraphQL, Repositórios, etc) com base em suas entidades.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/herbsjs/herbs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://herbsjs.org/img/logo-herbsjs.svg&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;herbsjs-core&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Pare de gastar tempo com código redundante e de baixo impacto. Codifique seu domínio primeiro usando Herbs e a infraestrutura necessária será gerada na hora.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/OCDots&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/ocdots&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;OCDots is a javascript library for creating evenly distributed points inside a polygon. Check out the demo at https://luxedo.github.io/OCDots/&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/monumentum/astronode&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/32710755?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;monumentum/astronode&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Exporting mongoose model as rest endpoints&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mvfsillva/dialetus-service&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/4579340?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mvfsillva/dialetus-service&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API to Informal dictionary for the idiomatic expressions that each Brazilian region It has&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/perfil-politico-frontend&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/perfil-politico-frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Front-end that consumes Perfil Político&apos;s API&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-FilaDaCreche&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-FilaDaCreche&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/origami.js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/origami.js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Powerful and Lightweight Library to create using HTML5 Canvas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/react-ape&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/react-ape&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;• [Work in Progress] React Renderer to build UI interfaces using canvas/WebGL&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/react-tv&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/react-tv&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;[Looking for maintainers] React development for TVs (Renderer for low memory applications and Packager for TVs) &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/klefki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/klefki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple substitution cipher module. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/redis-session-storage&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/redis-session-storage&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Node App Storage sessions with redis.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/simonardejr/matador-de-monstros&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3685303?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;simonardejr/matador-de-monstros&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Minigame feito em Vue&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/thamara/time-to-leave&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/846063?s=120&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;thamara/time-to-leave&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Log work hours and get notified when it&apos;s time to leave the office and start to live.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/withmoney/withmoney-mobile&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/44231290?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;withmoney/withmoney-mobile&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;This is a mobile project for financial management, with vue.js.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/yanmagale/narigajs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/5148042?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;yanmagale/narigajs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; WIP. A node module that reports about air quality in a region&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zenorocha/clipboard.js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/398893?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zenorocha/clipboard.js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Modern copy to clipboard. No Flash. Just 3kb gzipped.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zeucxb/dymock&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/11702749?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zeucxb/dymock&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A CLI to simplify the way you create dynamics mocks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Julia &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JSONWebTokens.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JSONWebTokens.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Secure your Julia APIs with JWT. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JuliaPackageWithRustDep.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JuliaPackageWithRustDep.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Example of a Julia Package with Rust dependency.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/Mongoc.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/Mongoc.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;MongoDB driver for the Julia Language &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Kotlin &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/ftwfy&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/ftwfy&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The real life Command/Ctrl + F - Android App that uses the Mobile Vision API to allow you to search for any occurrence of a text using your camera&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/lmgtfyGen&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/lmgtfyGen&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Lmgtfy Generator Open Source Android App - built to learn Kotlin, MVP architecture, Dagger and Rx&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Lua &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cuducos/yaml.nvim&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/4732915?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cuducos/yaml.nvim&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;YAML toolkit for Neovim users&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; PHP &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PHPJasper/phpjasper&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/27956258?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PHPJasper/phpjasper&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A PHP report generator &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/RamonSilva20/mapos&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12385697?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;RamonSilva20/mapos&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Sistema de Controle de Ordens de Serviço&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/comuREDE/core&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/14811323?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;comuREDE/core&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Back e frontend com sensor autônomo / Back and frontend with standalone sensor &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/corcel/corcel&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://camo.githubusercontent.com/6cfc6b23889643f4438a4da4ab4de7398da9337f/68747470733a2f2f692e696d6775722e636f6d2f66484d717754462e706e67&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;corcel/corcel&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A collection of Model classes that allows you to get data directly from a WordPress database.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gabrnunes/orbita&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/gabrnunes.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gabrnunes/orbita&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Plugin de Wordpress para criar um Hacker News-like para o ManualdoUsuario.net&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/laraerp/laraerp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10065592?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;laraerp/laraerp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ERP brasileiro de código fonte aberto escrito em PHP utilizando o Laravel Framework&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/openboleto/openboleto&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/33834590?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;openboleto/openboleto&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Biblioteca para geração de boletos bancários em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/paulohenriquenj/crudificator&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1184825?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;paulohenriquenj/crudificator&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Gerador de Cruds em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Pearl &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GouveaHeitor/nipe&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/10741284?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GouveaHeitor/nipe&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Nipe is a script to make Tor Network your default gateway.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Python &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DadosAbertosDeFeira/analises&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/57175538?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DadosAbertosDeFeira/analises&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para abrigar as análises dos Dados Abertos de Feira. A coleta é feita pela Maria Quitéria.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DadosAbertosDeFeira/maria-quiteria&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/57175538?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DadosAbertosDeFeira/maria-quiteria&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um projeto para libertar dados do município de Feira de Santana.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GabrielRF/RastreioBot&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/7331540?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GabrielRF/RastreioBot&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Telegram Bot @RastreioBot &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/JVictorDias/Dinossauro-Google&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/32246598?v=4&amp;amp;size=200&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;JVictorDias/Dinossauro-Google&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto onde várias Redes Neurais competem para aprender a jogar o jogo do dinossauro no navegador Google Chrome.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/Liebelts/Gordura_Simulator&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/42952107?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Liebelts/Gordura_Simulator&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um jogo de gordura sendo feito no Python 3. Envie bugs e ideias.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/allisson/python-simple-rest-client&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/5202?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;allisson/python-simple-rest-client&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple REST client for python 3.5+ &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/mre&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10817238?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/maker-regular-expressions&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório de um pacote simples para fazer expressões regulares em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/validate-docbr&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/10817238?s=60&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/validate-docbr&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Pacote Python para validação de documentos brasileiros.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anapaulagomes/pytest-picked&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1899950?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anapaulagomes/pytest-picked&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Run the tests related to the changed files (according to Git)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ayr-ton/kamu&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1090517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ayr-ton/kamu&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;You favorite book library&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/berinhard/pyp5js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/238223?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;berinhard/pyp5js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python to P5.js Transcriptor&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brazilian-utils/brutils-python&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/40146460?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brazilian-utils/brutils-python&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Brazilian Utils é uma biblioteca com foco na resolução de problemas que enfrentamos diariamente no desenvolvimento de aplicações para o business Brasileiro.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cobrateam/splinter&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/403905?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cobrateam/splinter&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;splinter - python test framework for web applications&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/sentry-patrol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/sentry-patrol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Command line interface for Sentry API &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/tapioca-jarbas&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/tapioca-jarbas&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tapioca wrapper for jarbas api &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/georgeyk/loafer&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/247603?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;georgeyk/loafer&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Asynchronous message dispatcher - Currently using asyncio and amazon SQS&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gilsondev/django-rest-localflavor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/265653?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gilsondev/django-rest-localflavor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Country-specific Django helpers, to use in Django Rest Framework &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/grupyrn/jararaca&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6994159?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;grupyrn/jararaca&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;GruPy-RN Event and Check-in System&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/internetlab-br/Twitter-Bots&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/40776372?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;internetlab-br/Twitter-Bots&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos utilizados para pesquisar sobre bots em perfis do Twitter &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/italomaia/flask-empty&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/14670?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;italo-maia/flask-empty&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An empty project skeleton / boilerplate for flask projects. Powered by CookieCutter. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/autogenfiles&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6595551?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jtemporal/autogenfiles&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Automatically generate files from templates&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/caipyra&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6595551?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jtemporal/caipyra&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;import caipyra module code&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/juditecypreste/PyRoles&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/36239583?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;juditecypreste/PyRoles&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Este é um bot no Telegram que faz upload automático de todas as fotos dos rolês que rolaram durante a PyBR!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lamenezes/simple-model&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3208493?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lamenezes/simple-model&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;data handling made easy &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luanfonceca/speakerfight&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1490875?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luanfonceca/speakerfight&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The Easier way to choose the best talks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/fakeRPiGPIO&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/fakerpigpio&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Fake RPi.GPIO module for testing&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/picamip&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/picamip&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python simple Raspberry-Pi camera module web interface&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mari-linhares/tensorflow-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/8157164?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mari-linhares/tensorflow-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos e materiais sobre TensorFlow em Português &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/odufrn/odufrn-api-py&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/52975911?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;odufrn/odufrn-api-py&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Wrapper da API da UFRN em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/perfil-politico&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/perfil-politico&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A platform for profiling public figures in Brazilian politics&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario-toolbox&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario-toolbox&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;This project empowers people who want to process the data in the context of Querido Diário to run their own analyses&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Brazilian government gazettes, accessible to everyone&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/serenata-de-amor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/serenata-de-amor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🕵 Artificial Intelligence for social control of public administration&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/serenata-toolbox/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/serenata-toolbox&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;pip module containing code shared across Serenata de Amor&apos;s projects&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/osantana/dicteval&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/160418?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;osantana/dicteval&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Evaluate expressions in dict/json objects&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/plenario/plenario&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/30255828?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;plenario/plenario&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-API&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-API&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Editor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Editor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; Plataforma de edição de cardápios da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pyladies-brazil/br-pyladies-pelican&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/8205116?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pyladies-brazil/br-pyladies-pelican&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site PyLadies Brasil usando Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/associados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/associados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Controle de associados a Associação PythonBrasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/planet&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/planet&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repo público para atualização da lista de sites do Planet PythonBrasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/wiki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/wiki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site python.org.br estático com Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rochacbruno/dynaconf&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/rochacbruno/dynaconf/raw/master/docs/img/logo_400.svg&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rochacbruno/dynaconf&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Configuration Management for Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rougeth/bottery&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/431892?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rougeth/bottery&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A bot framework with batteries included &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/thaisviana/AlgPedia&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1753143?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;thaisviana/AlgPedia&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto Final da Thata e do Tchotcho &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Ruby &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anonydog/anonydog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24738062?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anonydog/anonydog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;On the internet, nobody knows you&apos;re a dog &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/campuscode/rails-guides-pt-BR&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/10028214?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;campuscode/guia-rails-pt-br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tradução do guia oficial de Ruby on Rails para pt-BR&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/juuh42dias/transervicos&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1828204?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;juuh42dias/transervicos&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Plataforma de empregos para pessoas Trans.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/jekyll-theme-potato-hacker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/jekyll-theme-potato-hacker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A Jekyll theme based on hackers and potatoes&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/railsgirls/guides-ptbr&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1641104?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;railsgirls/guides-ptbr&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Rails Girls Guides - Brazilian Portuguese / Tutoriais Rails Girls - Português Brasileiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Rust &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/rio&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/rio&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A hardware-accelerated GPU terminal emulator powered by WebGPU, focusing to run in desktops and browsers&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Scala &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/potigol/potigol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1438144?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;potigol/potigol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem Potigol - Linguagem de programação funcional moderna para iniciantes - A Functional Programming Language for Beginners &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Shell &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/hemilioaraujo/Linux-Commands&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/28680369?s=400&amp;amp;u=547852267ebf487736da8ded44c916c53d1d37f4&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;hemilioaraujo/Linux-Commands&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um conjunto de comandos para terminal Linux.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-plataforma-curriculo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-plataforma-curriculo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; TypeScript &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brazilian-utils/brazilian-utils&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40146460?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brazilian-utils/brazilian-utils&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Utils library for specific Brazilian businesses&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/doczjs/docz&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/39714731?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;doczjs/docz&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;✍🏻It has never been so easy to document your things!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gabrnunes/tem-crase&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/gabrnunes.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gabrnunes/tem-crase&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O temcrase é uma ferramenta simples que verifica a frase que você digitou e responde se tem crase ou não.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/middy-idempotent&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/middy-idempotent&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🛵 📬 ‎‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎Idempotence Middy middleware for your AWS Lambdas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/middy-recaptcha&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/middy-recaptcha&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🛵 🔐 ‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎reCAPTCHA validation Middy middleware for yours AWS Lambdas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/react-lite-youtube-embed/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/react-lite-youtube-embed&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;📺 ‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎&amp;lt; A private by default, faster and cleaner YouTube embed component for React applications /&amp;gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mateusfg7/Noisekun&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/mateusfg7.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mateusfg7/Noisekun&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;WebApp feito para ouvir combinações de som abiente, para relaxar, estudar, trabalhar, ou se manter focado em uma atividade. Com temas, pomodoro, e playlists!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario-frontend/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario-frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório com a implementação do frontend da Plataforma de Busca do Querido Diário&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Frontend&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Website que permite à população acompanhar o cardápio das escolas públicas de São Paulo.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Variados &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pizzadedados/pizzadedados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/40184305?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/PizzaDeDados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório do podcast Pizza de Dados - O podcast Brasileiro sobre ciência de dados&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PizzaDeDados/datascience-pizza&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40184305?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/datascience-pizza&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para juntar informações sobre materiais de estudo em análise de dados e áreas afins, empresas que trabalham com dados e dicionário de conceitos&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/VacaRoxa/gamedev4noobs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/36037965?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Vacaroxa/GameDev4Noobs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O propósito desse repositório, além de contribuir para o projeto 4noobs, é ensinar o básico do desenvolvimento de jogos para iniciantes e democratizar o conhecimento nesta área. Apresentando boas práticas e insumos para criar games incríveis.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/basedosdados/mais&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/71097635?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;basedosdados/mais&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Desenvolvimento de pacotes de acesso ao nosso datalake público em diversas linguagens (Python, R, Scala, Julia). O projeto faz parte da Base dos Dados, uma organização sem fins lucrativos com a missão e universalizar o acesso a dados de qualidade para todes.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/bellesamways/studynotes&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/38008212?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;bellesamways/studynotes&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para armazenar todas as anotações de cursos feitos para minha própria consulta ou de outros.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brasil-php/blog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/17454678?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brasil-php/blog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para agregar posts do grupo do Telegram&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/codamos/codamos.github.io/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/16601405?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;codamos/codamos.github.io&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para o site Codamos, que reune eventos, palestras, workshops etc pelo Brasil inteiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/feministech/pessoas-streamers-feministech&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/68646156?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;feministech/pessoas-streamers-feministech&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório com as pessoas streamers da comunidade Feministech&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/globocom/secdevlabs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/globocom/secDevLabs/raw/master/images/secDevLabs-logo.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;globocom/secdevlabs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um laboratório para aprender segurança web e mobile de uma maneira prática.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/estrutura-e-interpretacao-de-programas-de-computador-javascript&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/estrutura-e-interpretacao-de-programas-de-computador-javascript&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;λ — Tradução em pt-br de &quot;Structure and Interpretation of Computer Programs — JavaScript Adaptation&quot;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/inspiradanacomputacao/tecnologistas-contra-bolsonaro&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/11424181?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;inspiradanacomputacao/tecnologistas-contra-bolsonaro&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório com Manifesto e Assinaturas de pessoas tecnologistas contra Bolsonaro.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/levxyca/diciotech&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/levxyca.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;levxyca/diciotech&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um dicionário tech para pessoas que querem aprender mais sobre termos técnicos dentro da tecnologia 📖&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ocarneiro/para-entender-a-internet&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/2953926?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ocarneiro/para-entender-a-internet&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Videos e memes obrigatórios para conversas do dia-a-dia &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/react-brasil/empresas-que-usam-react-no-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16929016?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;react-brasil/empresas-que-usam-react-no-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório que mostra empresas e projetos que utilizam React no Brasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/walterfcarvalho/advpl-xlsxtocsv&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/11591494?s=460&amp;amp;u=41649eaf2caa648c59d2fcb157f573c3f210ad79&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;walterfcarvalho/advpl-xlsxtocsv&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Once the language ADVPL doen&apos;t have a tool to read xlsx files directly, I did this source to unable the user read and convert one xlsx file to an array&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/yaiks/vite-docs-pt-br&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/34862686?s=96&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;yaiks/vite-docs-pt-br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para tradução da documentação oficial do vite&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

</description>
        <pubDate>Sun, 01 Oct 2023 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/projetos-br-hacktoberfest-2023/</link>
        <guid isPermaLink="true">https://jtemporal.com/projetos-br-hacktoberfest-2023/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contribuitions</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Using empty commits to rebuild GitHub Pages websites</title>
        <description>&lt;p&gt;Whether due to broken CSS or a change that seems to have had no effect, sometimes it is necessary to force a rebuild of a &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; website hosted on GitHub. Today’s pro tip explains one way to do this.&lt;/p&gt;

&lt;blockquote class=&quot;tiktok-embed&quot; cite=&quot;https://www.tiktok.com/@jess.temporal/video/7276637697509199110&quot; data-video-id=&quot;7276637697509199110&quot; style=&quot;max-width: 605px;min-width: 325px;border-left: 5px #1bacaf&quot;&gt;
  &lt;section&gt;
    &lt;a target=&quot;_blank&quot; title=&quot;@jess.temporal&quot; href=&quot;https://www.tiktok.com/@jess.temporal?refer=embed&quot;&gt;@jess.temporal&lt;/a&gt; Empty commits are awesome! That is, if you know how to make them &lt;a title=&quot;git&quot; target=&quot;_blank&quot; href=&quot;https://www.tiktok.com/tag/git?refer=embed&quot;&gt;#git&lt;/a&gt; &lt;a title=&quot;coding&quot; target=&quot;_blank&quot; href=&quot;https://www.tiktok.com/tag/coding?refer=embed&quot;&gt;#coding&lt;/a&gt; &lt;a title=&quot;softwareengineer&quot; target=&quot;_blank&quot; href=&quot;https://www.tiktok.com/tag/softwareengineer?refer=embed&quot;&gt;#softwareengineer&lt;/a&gt; &lt;a title=&quot;github&quot; target=&quot;_blank&quot; href=&quot;https://www.tiktok.com/tag/github?refer=embed&quot;&gt;#github&lt;/a&gt; &lt;a title=&quot;gittutorial&quot; target=&quot;_blank&quot; href=&quot;https://www.tiktok.com/tag/gittutorial?refer=embed&quot;&gt;#gittutorial&lt;/a&gt; &lt;a title=&quot;tutorial&quot; target=&quot;_blank&quot; href=&quot;https://www.tiktok.com/tag/tutorial?refer=embed&quot;&gt;#tutorial&lt;/a&gt; &lt;a title=&quot;techtok&quot; target=&quot;_blank&quot; href=&quot;https://www.tiktok.com/tag/techtok?refer=embed&quot;&gt;#techtok&lt;/a&gt; &lt;a title=&quot;technology&quot; target=&quot;_blank&quot; href=&quot;https://www.tiktok.com/tag/technology?refer=embed&quot;&gt;#technology&lt;/a&gt; &lt;a target=&quot;_blank&quot; title=&quot;♬ Empty commit - Jess Temporal&quot; href=&quot;https://www.tiktok.com/music/Empty-commit-7276637716422413061?refer=embed&quot;&gt;♬ Empty commit - Jess Temporal&lt;/a&gt;
  &lt;/section&gt;
&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://www.tiktok.com/embed.js&quot;&gt;&lt;/script&gt;

&lt;h2 id=&quot;what-is-github-pages&quot;&gt;What is GitHub Pages?&lt;/h2&gt;

&lt;p&gt;GitHub has a “service” for serving pages from repositories called &lt;a href=&quot;https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt;. This service allows you to create pages almost instantly from your repository and all you need is a markdown file like a project’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; and a basic configuration file.&lt;/p&gt;

&lt;p&gt;This is possible because GitHub Pages uses Jekyll, an open source static website generator, to build websites. Among other features that I won’t talk about today, an extremely positive point of using these two tools to get your website up and running is that you don’t need to push a build of your website to GitHub every time you want to publish a change. GitHub itself takes care of building the website for you.&lt;/p&gt;

&lt;p&gt;However, sometimes it is necessary to run the build process again and as this process happens on GitHub servers that we do not have access to, we need other ways to force the build.&lt;/p&gt;

&lt;h2 id=&quot;making-an-empty-commit&quot;&gt;Making an empty commit&lt;/h2&gt;

&lt;p&gt;One of the ways to force a rebuild and the way I use nowadays is to make an “empty” commit, that is, a commit that does not upload changes to any file in your directory.&lt;/p&gt;

&lt;p&gt;Just go to the website directory (here I will use my website as an example):&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;jtemporal.github.io
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and write a commit using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--allow-empty&lt;/code&gt; option:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;~/jtemporal.github.io $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git commit &lt;span class=&quot;nt&quot;&gt;--allow-empty&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Forcing website rebuild&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or if you prefer to edit the commit message in the text editor:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;~/jtemporal.github.io $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git commit &lt;span class=&quot;nt&quot;&gt;--allow-empty&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And that’s it. This is enough to force the build process again. Cool, right? 😜&lt;/p&gt;
</description>
        <pubDate>Wed, 20 Sep 2023 10:10:00 +0000</pubDate>
        <link>https://jtemporal.com/force-rebuild-jekyll-en/</link>
        <guid isPermaLink="true">https://jtemporal.com/force-rebuild-jekyll-en/</guid>
        
        <category>pro tip</category>
        
        <category>jekyll</category>
        
        <category>build</category>
        
        <category>rebuild</category>
        
        <category>github pages</category>
        
        <category>forcing rebuild with empty commits</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Getting the last element of a list in Python</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt; is known for making it easy to write beautiful, small code. Today’s pro tip is about how to get the last element of a list using this language \o/&lt;/p&gt;

&lt;p&gt;You can watch below or continue reading:&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;315px&quot; height=&quot;560&quot; src=&quot;https://www.youtube.com/embed/VyJzt_HmTlk&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;Coming from other languages like Java or C to Python, it’s normal to bring a bit of an accent to your codes and want to do something more or less like this to get the last element of a list:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;my_list&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;item_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;my_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# 4
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;last_one&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;my_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;last_one&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# 5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;len()&lt;/code&gt; size function to get the length of the list and subtract &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; to get the index of the last element in that list. And that’s ok! It works. However, Python presents a more elegant way of doing this, see:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;last_one&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;my_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;last_one&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# 5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/12NUbkX6p4xOO4/giphy.gif&quot; alt=&quot;magic gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Even though it may seem like this, it’s not magic! From the &lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#common-sequence-operations&quot;&gt;Python documentation&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If i or j is negative, the index is relative to the end of sequence &lt;em&gt;s&lt;/em&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;len(s) + i&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;len(s) + j&lt;/code&gt; is substituted. But note that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-0&lt;/code&gt; is still &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In a simpler way, &lt;a href=&quot;https://twitter.com/raymondh&quot;&gt;Raymond Hettinger&lt;/a&gt; explains in this tweet with code:&lt;/p&gt;

&lt;center&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;pt&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://twitter.com/hashtag/python?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#python&lt;/a&gt; tip:  How to support negative indexing:&lt;br /&gt;&lt;br /&gt;def __getitem__(self, i):&lt;br /&gt;    if i &amp;lt; 0:&lt;br /&gt;        i += len(self)&lt;br /&gt;    if i &amp;lt; 0 or i &amp;gt;= len(self):&lt;br /&gt;        raise IndexError&lt;br /&gt;    ...&lt;/p&gt;&amp;mdash; Raymond Hettinger (@raymondh) &lt;a href=&quot;https://twitter.com/raymondh/status/943615980650971136?ref_src=twsrc%5Etfw&quot;&gt;20 de dezembro de 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/center&gt;

&lt;p&gt;The implementation is actually more complex than this, but what happens in general terms: the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__getitem__&lt;/code&gt; method is invoked when we call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;my_list[-1]&lt;/code&gt; receiving the list itself (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;self&lt;/code&gt;) and the negative index (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i&lt;/code&gt;) then adds this index with the size of the list and returns the updated index value. Interestingly, this was the same thing I did on the first example but it is already implemented by default.&lt;/p&gt;

&lt;p&gt;And a little detail, the same can be done for strings!&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;word&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;yes&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;word&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dope, right? Now just use negative index in your codes too 😉&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;For more details on string slicing, check out this &lt;a href=&quot;https://docs.python.org/3.6/tutorial/introduction.html&quot;&gt;informal Introduction to Python&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Reference to the special case of negative indexes in the  &lt;a href=&quot;https://docs.python.org/3/reference/datamodel.html#object.__getitem__&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__getitem__&lt;/code&gt; method in the Python documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;special-thanks&quot;&gt;Special thanks&lt;/h2&gt;

&lt;p&gt;To Mário Sérgio, Diego Ponciano and Paulo Haddad for some of the links in this post!&lt;/p&gt;
</description>
        <pubDate>Mon, 11 Sep 2023 09:10:00 +0000</pubDate>
        <link>https://jtemporal.com/the-last-of-a-list-in-python/</link>
        <guid isPermaLink="true">https://jtemporal.com/the-last-of-a-list-in-python/</guid>
        
        <category>python</category>
        
        <category>english</category>
        
        <category>en</category>
        
        
      </item>
    
      <item>
        <title>How to count characters of a property on Notion easily using formulas</title>
        <description>&lt;p&gt;In this pro tip I’m going to show you one of the features I’ve learned and have been using for a while: the use of formulas in the properties of a Notion document.&lt;/p&gt;

&lt;h2 id=&quot;what-are-notion-formulas&quot;&gt;What are Notion Formulas?&lt;/h2&gt;

&lt;p&gt;In addition to the many more traditional types of Notion properties such as an option selector or a list of categories (&lt;em&gt;tags&lt;/em&gt;), it is also possible to extend properties features using formulas.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/notion/properties-blog-post-notion.webp&quot; alt=&quot;Image showing some properties of a document on Notion&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.notion.so/help/formulas&quot;&gt;Notion’s formulas&lt;/a&gt; allow you to make calculations or perform functions based on other properties from that document.&lt;/p&gt;

&lt;p&gt;The coolest part of these formulas is that once implemented, the result will be automatically updated if you make any changes to the property used in the formula.&lt;/p&gt;

&lt;h2 id=&quot;why-use-formulas-on-notion&quot;&gt;Why use formulas on Notion?&lt;/h2&gt;

&lt;p&gt;I recently started using Notion as a task organization system for GitFichas (git study cards) using Databases.&lt;/p&gt;

&lt;p&gt;As each card is followed up by a tweet, I also like to draft the tweets in the same interface to be able to pre-schedule the release of new cards. One of the problems of using Notion for this is that it lacks the character count that exists on Twitter interface, that’s where Notion’s formulas came into my life.&lt;/p&gt;

&lt;h2 id=&quot;how-to-create-a-formula-based-property&quot;&gt;How to create a formula-based property&lt;/h2&gt;

&lt;p&gt;I have a property called “Tweet” in the database that I use to keep track of &lt;a href=&quot;https://gitfichas.com/?utm_source=blog&quot;&gt;GitFichas&lt;/a&gt;. It is in this property that I draft the tweet for each new card.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/notion/document-properties-notion.webp&quot; alt=&quot;Image showing the document containing a drafted git study card with the tweet property&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 80%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Notice in the image above that the character count is missing so let’s add it. First click on “Add a property” to add a new property and choose the type “∑ Formula” from the menu. Then you will see the property edit menu, like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/notion/notion-formula-property-edit-menu.webp&quot; alt=&quot;Image showing a property&apos;s edit menu&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can give the property a name, something like “Tweet Size” by editing the field with the default value “Formula”. Then click on “Edit” to see the way of writing the formula itself.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/notion/notion-formula-property-function-length.webp&quot; alt=&quot;Formula writing menu&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In this menu you can either compose your formula by writing or selecting between functions, constants, operators and properties. To count characters you can write:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;length&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;prop&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Tweet&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Click Save and exit the menu then you will see your new property with the corresponding character count.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/notion/documento-ficha-properties-notion-with-formula.webp&quot; alt=&quot;Image showing the document containing the draft of a git study card with the property &amp;quot;tweet” and the formula property&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 80%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’ll leave it to you to play with changing the text and seeing the resulting value of the formula update automatically. 😉&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;Formulas on Notion are a powerful extensibility feature. You can use formulas in Database documents. Here’s a step-by-step guide on how to create a formula in a document:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Click on “&lt;em&gt;Add property&lt;/em&gt;”;&lt;/li&gt;
  &lt;li&gt;Choose the option “&lt;em&gt;∑ Formula&lt;/em&gt;”;&lt;/li&gt;
  &lt;li&gt;Name your formula in the “&lt;em&gt;Formula&lt;/em&gt;” field;&lt;/li&gt;
  &lt;li&gt;Click on “&lt;em&gt;Edit”&lt;/em&gt; to write the formula;&lt;/li&gt;
  &lt;li&gt;Write  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;length(prop(&quot;Tweet&quot;))&lt;/code&gt; in the field “&lt;em&gt;Type a formula&lt;/em&gt;” (remember to adjust the field name)&lt;em&gt;;&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Click on “&lt;em&gt;Save&lt;/em&gt;”.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And that’s it, now it’s time to have fun editing the corresponding field and see the value change automatically.&lt;/p&gt;
</description>
        <pubDate>Sun, 10 Sep 2023 15:10:00 +0000</pubDate>
        <link>https://jtemporal.com/counting-characters-of-a-notion-property-using-formulas/</link>
        <guid isPermaLink="true">https://jtemporal.com/counting-characters-of-a-notion-property-using-formulas/</guid>
        
        <category>Notion</category>
        
        <category>Notion databases</category>
        
        <category>Productivity</category>
        
        <category>english</category>
        
        <category>en</category>
        
        
      </item>
    
      <item>
        <title>Contando carácteres de uma propriedade no Notion usando fórmulas</title>
        <description>&lt;p&gt;Nessa colinha eu vou te mostrar umas das funcionalidades que aprendi pouco tempo atrás: o uso de fórmulas nas propriedades de um documento do Notion.&lt;/p&gt;

&lt;h2 id=&quot;o-que-são-fórmulas-no-notion&quot;&gt;O que são fórmulas no Notion&lt;/h2&gt;

&lt;p&gt;Além dos diversos tipos mais tradicionais de propriedades do Notion como um seletor de opções ou uma lista de categorias (&lt;em&gt;tags&lt;/em&gt;), também possível extender as funcionalidades das propriedades usando fórmulas.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/notion/properties-blog-post-notion.webp&quot; alt=&quot;Imagem mostrando propriedades de um documento no Notion&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.notion.so/help/formulas&quot;&gt;As fórmulas do Notion&lt;/a&gt; te permite fazer cálculos ou executar funções com base em outras propriedades daquele documento.&lt;/p&gt;

&lt;p&gt;A parte mais legal dessas fórmulas é que depois de implementada, o resultado será automaticamente atualizado caso você faça alguma alteração na propriedade usada na fórmula.&lt;/p&gt;

&lt;h2 id=&quot;para-que-usar-fórmulas-no-notion&quot;&gt;Para que usar fórmulas no Notion&lt;/h2&gt;

&lt;p&gt;Eu passei a usar o Notion a algum tempo atras como um sistema de organização de tarefas para o GitFichas com o uso das Databases.&lt;/p&gt;

&lt;p&gt;Como cada ficha é acompanhada de um tweet eu gosto também de rascunhar os tweets na mesma interface para conseguir deixar a divulgação de fichas novas pré-agendadas. Um dos problemas de usar o Notion para isso, é que falta a contagem de carácteres presente na  interface do Twitter, é aí que as fórmulas do Notion entraram na minha vida.&lt;/p&gt;

&lt;h2 id=&quot;como-criar-uma-propriedade-baseada-em-fórmula&quot;&gt;Como criar uma propriedade baseada em fórmula&lt;/h2&gt;

&lt;p&gt;Eu tenho uma propriedade chamada &lt;em&gt;“Tweet”&lt;/em&gt; na base de dados que uso para fazer o acompanhamento do &lt;a href=&quot;https://gitfichas.com/?utm_source=blog&quot;&gt;GitFichas&lt;/a&gt;. É nessa propriedade que rascunho o tweet de cada nova ficha.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/notion/document-properties-notion.webp&quot; alt=&quot;Imagem mostrando o documento contendo o rascunho de uma gitficha com a propriedade tweet&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 80%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note na imagem acima que falta a contagem de carácteres então vamos adicioná-la. Primeiro clique em “&lt;em&gt;Add a property&lt;/em&gt;” para adicionar uma propriedade nova e escolha o tipo “&lt;em&gt;∑ Formula&lt;/em&gt;” no menu. Então você verá o menu de edição da propriedade, assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/notion/notion-formula-property-edit-menu.webp&quot; alt=&quot;Imagem mostrando o menu de edição de uma propriedade&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Você pode dar um nome pra a propriedade, algo como &lt;em&gt;“Tweet Size”&lt;/em&gt; editando o campo com o valor padrão “&lt;em&gt;Formula&lt;/em&gt;”. Depois clique em “&lt;em&gt;Edit&lt;/em&gt;” para ver o modo de escrita da fórmula em si.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/notion/notion-formula-property-function-length.webp&quot; alt=&quot;Menu de escrita da fórmula&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Nesse menu você pode tanto compor a sua fórmula escrevendo quanto selecionando entre funções, constantes, operadores e propriedades. Para fazer a contagem de carácteres você pode escrever:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;length&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;prop&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Tweet&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Clique em Save e saia do menu então você verá a sua nova propriedade com a contagem de carácteres correspondente.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/notion/documento-ficha-properties-notion-with-formula.webp&quot; alt=&quot;Imagem mostrando o documento contendo o rascunho de uma gitficha com a propriedade tweet e a propriedade de fórmula&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 80%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Eu vou deixar para você brincar de alterar o texto e ver o valor resultante da fórmula atualizar automaticamente. 😉&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Fórmulas no Notion são uma funcionalidade poderosa de extensibilidade. Você pode usar fórmulas em documentos das Databases. Aqui está o passo-a-passo de como criar uma fórmula em um documento:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Clique em “&lt;em&gt;Add property&lt;/em&gt;”;&lt;/li&gt;
  &lt;li&gt;Escolha a opção “&lt;em&gt;∑ Formula&lt;/em&gt;”;&lt;/li&gt;
  &lt;li&gt;Dê um nome para sua fórmula no campo “&lt;em&gt;Formula&lt;/em&gt;”;&lt;/li&gt;
  &lt;li&gt;Clique em “&lt;em&gt;Edit”&lt;/em&gt; para escrever a fórmula;&lt;/li&gt;
  &lt;li&gt;Escreva &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;length(prop(&quot;Tweet&quot;))&lt;/code&gt; no campo “&lt;em&gt;Type a formula&lt;/em&gt;” (lembre-se de ajustar o nome do campo)&lt;em&gt;;&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Clique em “&lt;em&gt;Save&lt;/em&gt;”.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;E pronto, agora é se divertir editando o campo corresponde e ver o valor alterar automaticamente.&lt;/p&gt;
</description>
        <pubDate>Sun, 10 Sep 2023 09:01:00 +0000</pubDate>
        <link>https://jtemporal.com/contando-caracteres-de-uma-propriedade-no-notion-usando-formulas/</link>
        <guid isPermaLink="true">https://jtemporal.com/contando-caracteres-de-uma-propriedade-no-notion-usando-formulas/</guid>
        
        <category>Notion</category>
        
        <category>Notion Databases</category>
        
        <category>portugues</category>
        
        
      </item>
    
      <item>
        <title>Login no Heroku via linha de comando (CLI) com MFA ativado</title>
        <description>&lt;p&gt;Digamos que você já sabe usar &lt;a href=&quot;https://jtemporal.com/login-no-heroku-do-github-codespaces&quot;&gt;a forma iterativa para fazer login no Heroku pelo terminal&lt;/a&gt;, mas agora você ativou a autenticação multi fator (MFA) no seu perfil e um simples usuário e senha não vai ser o suficiente para login.&lt;/p&gt;

&lt;p&gt;Nessa colinha você vai aprender a usar o modo iterativo com MFA.&lt;/p&gt;

&lt;h2 id=&quot;fazendo-o-login-no-heroku-usando-o-terminal&quot;&gt;&lt;strong&gt;Fazendo o login no Heroku usando o terminal&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Só para revisar, se você usar o comando a seguir&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;heroku login &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Você poderá informar o seu usuário e senha diretamente no terminal para executar o login no Heroku sem precisar usar um navegador.&lt;/p&gt;

&lt;p&gt;Essa funcionalidade é extremamente util quando você está tentado fazer login no Heroku por uma instancia remota como o GitHub Codespaces por exemplo.&lt;/p&gt;

&lt;p&gt;Com a MFA (autenticação multifator) ativada, só usuário e senha não vai bastar como pode ser visto na imagem acima.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/heroku-login-cli-credentials-not-enough-mfa-enabled.webp&quot; alt=&quot;Resultado de fazer login interativo e falhar por conta do MFA ativado&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 80%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Para dar continuidade ao processo de login nesses casos, é preciso gerar um token de autorização.&lt;/p&gt;

&lt;h2 id=&quot;configurando-um-token-de-autorização-para-fazer-login-no-terminal-com-mfa-ativado&quot;&gt;Configurando um token de autorização para fazer login no terminal &lt;strong&gt;com MFA ativado&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Faça login no seu dashboard do Heroku e clique na sua foto, então selecione “&lt;em&gt;Account Settings&lt;/em&gt;”, quando a página carregar escolha a aba “&lt;em&gt;Applications&lt;/em&gt;” ou &lt;a href=&quot;https://dashboard.heroku.com/account/applications&quot;&gt;clique nesse link para ir diretamente ao dashboard de aplicações&lt;/a&gt;. Em seguida, desça a página até a seção chamada &lt;em&gt;Authorizations&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Se você nunca usou tokens de autorização do Heroku antes, essa seção estará vazia, eu já tenho alguns tokens como pode ver na imagem abaixo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/heroku-lists-of-authorization-tokens.webp&quot; alt=&quot;Tokens listados na seção Authorizations&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Então clique em &lt;em&gt;Create Authorization&lt;/em&gt;. Um menu lateral aparecerá como pode ver na imagem abaixo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/lateral-menu-for-creating-new-authorization-token.webp&quot; alt=&quot;Menu lateral para criar um novo token de autorização&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Para criar novo token basta dar uma descrição e clicar no botão &lt;em&gt;Create&lt;/em&gt;, no meu caso, pretendo usar esse token para um GitHub Codespaces por isso dei o nome de “Codespaces”&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/heroku-authorization-token-created-successfully.webp&quot; alt=&quot;Menu lateral após a criação do token novo mostrando esse token&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Depois de criado, o token será mostrado na tela para que você possa copiá-lo. Ah e não se preocupe, embora eu esteja mostrando esse token aqui (coisa que você nunca deve fazer) ele já não existe mais então ninguém poderá se passar por mim.&lt;/p&gt;

&lt;p&gt;Note que, opcionalmente, é possível dar uma “data de validade” ou melhor dizendo, um prazo de tempo para que esse token vença, inclusive é recomendado fazê-lo.&lt;/p&gt;

&lt;h2 id=&quot;usando-um-token-de-autorização-para-fazer-o-login&quot;&gt;Usando um token de autorização para fazer o login&lt;/h2&gt;

&lt;p&gt;Lembre-se de copiar o token, agora para fazer o login basta o token no lugar da sua senha ao fazer login. Rode novamente o comando  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;heroku login -i&lt;/code&gt; e passar o seu usuário e o token como pode ser observado&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/successful-login-with-authorization-token-heroku.webp&quot; alt=&quot;Imagem mostrando o login bem sucedido usando o token de autorização&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 80%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora basta seguir com o fluxo tradicional de uso do Heroku.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Neste post, você aprendeu:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Como fazer login no Heroku via linha de comando com autenticação multifator (MFA) ativada usando um token de autorização.&lt;/li&gt;
  &lt;li&gt;Como criar um token de autorização no Heroku.&lt;/li&gt;
  &lt;li&gt;Que para fazer login com MFA ativado, é preciso copiar o token gerado e usar ele no lugar da senha ao fazer login via linha de comando.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora você pode seguir fazendo login no Heroku pela linha de comando mesmo com MFA ativado!&lt;/p&gt;
</description>
        <pubDate>Sat, 09 Sep 2023 09:01:00 +0000</pubDate>
        <link>https://jtemporal.com/login-no-heroku-via-linha-de-comando-com-mfa-ativado/</link>
        <guid isPermaLink="true">https://jtemporal.com/login-no-heroku-via-linha-de-comando-com-mfa-ativado/</guid>
        
        <category>github codespaces</category>
        
        <category>codespaces</category>
        
        <category>git</category>
        
        <category>github</category>
        
        <category>heroku</category>
        
        <category>authorização</category>
        
        <category>portugues</category>
        
        
      </item>
    
      <item>
        <title>7 Lessons I learned from recording and editing short videos</title>
        <description>&lt;p&gt;As a developer advocate, I wanted to get more comfortable with recording and editing videos. In this post, I share some of the lessons I learned from this experience. Keep reading to find out what I learned and how it may help you with your own video content creation!&lt;/p&gt;

&lt;h2 id=&quot;why-record-videos&quot;&gt;Why record videos?&lt;/h2&gt;

&lt;p&gt;I realized recently that I have a pretty good comfort level of comfort with my writing now, but I don’t have the same level of comfort when I need to record something.&lt;/p&gt;

&lt;p&gt;Being a developer advocate, sometimes I’ll need to record videos, and being comfortable doing so will help me reduce stress when recording, recording videos faster with fewer mistakes, and maybe sometime in the future I’ll even love recording as much as I love writing.&lt;/p&gt;

&lt;p&gt;So the challenge is to record as many videos as can until the end of the year. My goal is to record 3 short videos a week on a subject I’m comfortable with, in this case: git. Repurposing part of the content I already have from GitFichas and The Big Git Microbook would help so I wouldn’t have to create too much content from scratch.&lt;/p&gt;

&lt;h2 id=&quot;why-edit-videos&quot;&gt;Why edit videos?&lt;/h2&gt;

&lt;p&gt;Not only recording videos is a big deal for me, but I also wanted to challenge myself to learn and get comfortable at editing videos, particularly the ones I’m the person speaking.&lt;/p&gt;

&lt;p&gt;And you may ask “W&lt;em&gt;hy though?&lt;/em&gt;” and for me the answer is simple: I want to help more people.&lt;/p&gt;

&lt;p&gt;Although writing and reading are my preferred ways to learn, some developers prefer to watch videos instead. I’ve been dreaming of the day when you can come here to my blog and read something or watch a video and learn the same thing. You could choose the way you prefer to learn from me.&lt;/p&gt;

&lt;p&gt;But for that to be true I need to  1) record the videos and 2) edit them. Maybe in the future, I’ll have a team to edit it for me. While that’s not my reality today, editing I shall learn.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/tiktok-jess-temporal-profile-showing-the-first-two-videos.webp&quot; alt=&quot;A photo of my TikTok profile, showing the first 2 videos&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 60%;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;lesson-1-60-seconds-videos-are-a-challenge&quot;&gt;Lesson 1: 60 seconds videos are a challenge&lt;/h2&gt;

&lt;p&gt;For me, 60 seconds videos are a challenge that comes from my liking to intertwine personal anecdotes with the technical content.&lt;/p&gt;

&lt;p&gt;I believe whenever you learn something new from someone you are also looking for connection, to identify yourself with the person you are learning from, and even get a bit of their personality to come through, I also realize that some of my personality will show up in other ways even in such a short time.&lt;/p&gt;

&lt;p&gt;Making sure every video is under 60 seconds adds an extra layer of challenge. Even though I started with TikTok in mind I plan to post the videos also on YouTube as a short. Unfortunately, shorts need to be 60 seconds or less hence the added challenge.&lt;/p&gt;

&lt;h2 id=&quot;lesson-2-do-not-speak-while-typing&quot;&gt;Lesson 2: Do not speak while typing&lt;/h2&gt;

&lt;p&gt;Although I have this skill of saying something while I type something else after editing the first few videos, I realized that not speaking while typing will:&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;Increase speed in editing:&lt;/strong&gt; if I make a mistake is easier to cut out without having to re-record the whole section or having to voice over the explanation later;&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Allow for shorter videos:&lt;/strong&gt; because I can speed up the portion of the video where I’m typing as well as cut it out if I want to. Also even though I can speak and type my speech rhythm changes and it takes me a little longer to get the information out.&lt;/p&gt;

&lt;h2 id=&quot;lesson-3-learning-to-edit-video-is-easier-with-an-outcome-in-mind&quot;&gt;Lesson 3: Learning to edit video is easier with an outcome in mind&lt;/h2&gt;

&lt;p&gt;I still have a long way to go in editing videos but, by editing short videos I can layer the learning process with small steps, so far I learned to:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Split a video to cut out parts I don’t need;&lt;/li&gt;
  &lt;li&gt;Add a highlight to the thing I’m speaking about like an arrow or line under a particular part of a text;&lt;/li&gt;
  &lt;li&gt;Add text to the screen;&lt;/li&gt;
  &lt;li&gt;Add a transition between clips.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I hope to learn a few other things soon too like removing the background if I use a green screen, captioning, adding effects so things look funnier, and so on.&lt;/p&gt;

&lt;h2 id=&quot;lesson-4-patience-with-yourself-is-key&quot;&gt;Lesson 4: Patience with yourself is key&lt;/h2&gt;

&lt;p&gt;I’m editing stuff on iMovie. 👀 don’t judge me okay? I’m new at this.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/imovie-editing-tiktoks.webp&quot; alt=&quot;editing videos on imovie&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 80%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Right now I know exactly one shortcut: the one for splitting the video. I wish I knew more shortcuts as I know they will probably make editing faster, I also know that muscle memory will come with time.&lt;/p&gt;

&lt;p&gt;As well as making fewer mistakes or knowing exactly how to edit something before I start so I don’t have to undo some things because they didn’t turn out as I expected them to.&lt;/p&gt;

&lt;h2 id=&quot;lesson-5-even-though-the-dimensions-are-right-different-screens-will-show-the-video-differently&quot;&gt;Lesson 5: Even though the dimensions are right, different screens will show the video differently&lt;/h2&gt;

&lt;p&gt;The iPhone 14 for example “bites” into the top of the video on TikTok and if the dynamic island is on is even worse.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/different-displays-of-same-content.webp&quot; alt=&quot;image showing the video in two different displays from tiktok&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 60%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A friend also showed me a screenshot on his phone that there was a bar below that would cover a portion of the video (mainly my face now) so accounting for that will be good to avoid having information in a portion that won’t show up.&lt;/p&gt;

&lt;p&gt;That basically means I need to adjust the recording setup for the next videos so I can still show things without compromising the content being shown.&lt;/p&gt;

&lt;h2 id=&quot;lesson-6-i-still-dislike-the-sound-of-my-own-voice-on-video&quot;&gt;Lesson 6: I still dislike the sound of my own voice on video&lt;/h2&gt;

&lt;p&gt;Probably because I’m overly critical of my own mistakes not only about saying the wrong thing but also about my accent and the way I just can’t pronounce some words “properly”.&lt;/p&gt;

&lt;p&gt;So I’m focusing on tuning out a few of these, especially when editing, I have to help myself and not record the same stuff over and over again. This also speaks volumes about getting comfortable when editing and recording videos.&lt;/p&gt;

&lt;h2 id=&quot;lesson-7-the-reach-side-is-hard&quot;&gt;Lesson 7: The reach side is hard&lt;/h2&gt;

&lt;p&gt;I’m posting on &lt;a href=&quot;https://www.tiktok.com/@jess.temporal&quot;&gt;my own profile on TikTok&lt;/a&gt;, also on &lt;a href=&quot;https://www.youtube.com/@gitfichas&quot;&gt;GitFichas’ YouTube channel as shorts&lt;/a&gt; and on &lt;a href=&quot;https://www.instagram.com/gitfichas/reels/&quot;&gt;GitFichas’ Instagram profile as Reels&lt;/a&gt;, but haven’t figured out “the right way” to share these to other platforms like Twitter (X), Mastodon, LinkedIn, and Bluesky.&lt;/p&gt;

&lt;p&gt;Should I post links to the other platforms every time I share a new video or should I share the video there as well? I do not know the answer to that question right now, but if I figure it out I’ll let you know.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;So here’s the short version of the lesson list so far:&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Lesson 1:&lt;/strong&gt; 60 seconds videos are a challenge;&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Lesson 2:&lt;/strong&gt; Do not speak while typing;&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Lesson 3:&lt;/strong&gt; Learning to edit video is easier with an outcome in mind;&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Lesson 4:&lt;/strong&gt; Patience with yourself is key;&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Lesson 5:&lt;/strong&gt; Even though the dimensions are right, different screens will show the video differently;&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Lesson 6:&lt;/strong&gt; I still dislike the sound of my own voice on video;&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Lesson 7:&lt;/strong&gt; The reach side is hard.&lt;/p&gt;

&lt;p&gt;Make sure to subscribe or follow:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.tiktok.com/@jess.temporal&quot;&gt;TikTok&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/@gitfichas&quot;&gt;YouTube&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.instagram.com/gitfichas/reels/&quot;&gt;Instagram&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ll continue to share this journey here… In the meantime, would love to hear your thoughts. 😉&lt;/p&gt;
</description>
        <pubDate>Fri, 08 Sep 2023 09:01:00 +0000</pubDate>
        <link>https://jtemporal.com/seven-lessons-learned-from-recording-and-editing-short-videos/</link>
        <guid isPermaLink="true">https://jtemporal.com/seven-lessons-learned-from-recording-and-editing-short-videos/</guid>
        
        <category>devrel</category>
        
        <category>developer advocate</category>
        
        <category>developer relations</category>
        
        <category>developer advocacy</category>
        
        <category>git</category>
        
        <category>github</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Login no Heroku a partir do GitHub Codespaces</title>
        <description>&lt;p&gt;Esses dias eu estava usando GitHub CodeSpaces pra fazer o deploy de uma aplicação pro Heroku e me deparei com um problema: Como fazer o login no Heroku dado que eu não tenho acesso a um navegador rodando na mesma máquina em que eu estou usando o terminal?&lt;/p&gt;

&lt;p&gt;Se você continuar lendo esse blog post, eu vou te mostrar exatamente como resolver isso.&lt;/p&gt;

&lt;h2 id=&quot;ip-mismatch-ao-fazer-login&quot;&gt;IP mismatch ao fazer login&lt;/h2&gt;

&lt;p&gt;Você acabou de fazer a &lt;a href=&quot;https://devcenter.heroku.com/articles/heroku-cli#install-the-heroku-cli&quot;&gt;instalação do Heroku CLI&lt;/a&gt; e chegou a hora de fazer o login. Então você roda a o comando a seguir:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;heroku login
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Esse comando vai te dar uma página para que você possa abrir no navegador e fazer o login. Normalmente você vê essa página aqui:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/heroku-login-page.webp&quot; alt=&quot;Página de login da heroku&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 60%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ao clicar em login, você pode entrar na sua conta com o seu método tradicional como usuário e senha por exemplo, e então o seu terminal vai mostrar que você fez login com sucesso.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/heroku-successful-login-in-terminal.webp&quot; alt=&quot;Imagem mostrando o login bem sucedido no terminal com ajuda do navegador&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 60%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Meio mágico como isso acontece né mesmo? Porém se você esta usando o GitHub Codespaces, você não tem um navegador para visualizar essa página de login, e se você tentar abrir aquela mesma página pelo método tradicional de copiar a URL e colocar ela no seu navegador, você vai encontrar uma página dizendo a mensagem de “IP mismatch”.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/ip-mismatch-after-heroku-login.webp&quot; alt=&quot;Imagem mostrando IP mismatch&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 60%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E agora? O segredo é usar a forma iterativa de login na linha de comando.&lt;/p&gt;

&lt;h2 id=&quot;fazendo-o-login-no-heroku-usando-o-terminal&quot;&gt;&lt;strong&gt;Fazendo o login no Heroku usando o terminal&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Para casos onde não é possível usar o navegador para ver a familiar tela de login, a solução é usar o login de forma interativa. Basta usar o mesmo comando de antes acompanhado da opção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-i&lt;/code&gt; e então seguir as instruções que vão aparecer.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;heroku login &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Após rodar o comando acima, você vai ver o pedido usuário e senha como pode ser observado na imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/heroku-login-cli-credentials-requested.webp&quot; alt=&quot;Imagem mostrando o pedido de usuário e senha&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 60%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Depois de colocar os seus dados e efetuar o seu login, você poderá seguir com o seu uso do Heroku via CLI.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Neste post, você aprendeu:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Como fazer o login no Heroku a partir do GitHub Codespaces.&lt;/li&gt;
  &lt;li&gt;Como resolver o erro de “IP mismatch” usando a opção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-i&lt;/code&gt; ao fazer login no Heroku através da linha de comando.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Espero que este post te ajude a fazer login no Heroku dentro do GitHub Codespaces.&lt;/p&gt;
</description>
        <pubDate>Thu, 07 Sep 2023 09:01:00 +0000</pubDate>
        <link>https://jtemporal.com/login-no-heroku-do-github-codespaces/</link>
        <guid isPermaLink="true">https://jtemporal.com/login-no-heroku-do-github-codespaces/</guid>
        
        <category>github codespaces</category>
        
        <category>codespaces</category>
        
        <category>git</category>
        
        <category>github</category>
        
        <category>heroku</category>
        
        <category>authorização</category>
        
        <category>portugues</category>
        
        
      </item>
    
      <item>
        <title>Renomeando arquivos no Git do jeito certo (usando git mv)</title>
        <description>&lt;p&gt;Você já tentou renomear um arquivo nos seus projetos e teve dificuldade adicionar o ajuste em um commit? Isso não acontece só com você. Nessa colinha você vai aprender a renomear os seus arquivos em projetos git da forma correta para evitar dores de cabeça.&lt;/p&gt;

&lt;h2 id=&quot;o-problema-de-renomear-um-arquivo-sem-usar-o-git&quot;&gt;O problema de renomear um arquivo sem usar o git&lt;/h2&gt;

&lt;p&gt;Vamos dizer que você decidiu renomear um arquivo e, por questão de simplicidade você decide fazer isso na interface de pasta mesmo (ou usando o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mv&lt;/code&gt; no terminal). Depois disso você quer fazer o commit da alteração de nomes e ao rodar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt; você se depara com essa situação:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-mv/001-renamed-file-deleted-git-status.webp&quot; alt=&quot;imagem mostrando o arquivo deletado e um arquivo novo criado&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Se você renomeia o arquivo sem usar o Git, o Git “se perde” e acha que o arquivo original foi apagado e um arquivo novo foi criado como mostrado na imagem acima. Por causa desse comportamento, você acaba tendo que obrigatoriamente fazer dois passos para commitar a alteração no nome:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Adicionar o arquivo deletado;&lt;/li&gt;
  &lt;li&gt;Adicionar o arquivo novo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para piorar, não é possível adicionar um arquivo “deletado” sem usar explicitamente o nome desse arquivo, o que torna esse processo todo ainda mais tedioso, pra não mencionar a esquisitice da frase “adicionar um arquivo deletado”.&lt;/p&gt;

&lt;p&gt;Vamos dizer que você perseverou, adicionou o arquivo deletado e adicionou o arquivo novo e mais uma vez você roda um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt;, e ai o git entende que foi uma alteração no nome do arquivo, veja:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-mv/002-renamed-file-git-status.webp&quot; alt=&quot;imagem mostrando o resultado de git status após adicionar o arquivo e o git entendendo que o arquivo foi nomeado&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Essa é uma solução relativamente tranquila se você não precisa fazer isso com frequência, mas existe uma solução melhor.&lt;/p&gt;

&lt;h2 id=&quot;renomeando-um-arquivo-no-git-do-jeito-certo&quot;&gt;Renomeando um arquivo no git do jeito certo&lt;/h2&gt;

&lt;p&gt;Para começar é necessário resistir ao impulso de renomear o arquivo usando a interface e passar a usar o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git mv&lt;/code&gt;. Usando o mesmo exemplo do caso acima, onde renomeamos o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;books.md&lt;/code&gt; para &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;book.md&lt;/code&gt;, o comando fica assim:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git &lt;span class=&quot;nb&quot;&gt;mv &lt;/span&gt;books.md book.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O resultado de usar apenas um comando é o seguinte:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Renomear o arquivo;&lt;/li&gt;
  &lt;li&gt;Adicionar a mudança de nome em staging.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depois disso você pode seguir o fluxo normal de commits e fazer o commit dessa alteração.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Não use a interface para renomear os arquivos nos seus projetos Git, use o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git mv&lt;/code&gt; para fazer isso e já adicionar essa mudança em staging para um commit.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/052?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1692471498/gitfichas/pt/052/052-full_cu0alv.jpg&quot; alt=&quot;GitFicha #052: git mv origem destino&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

</description>
        <pubDate>Sat, 19 Aug 2023 11:25:00 +0000</pubDate>
        <link>https://jtemporal.com/renomeando-arquivos-no-git-do-jeito-certo/</link>
        <guid isPermaLink="true">https://jtemporal.com/renomeando-arquivos-no-git-do-jeito-certo/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>What tools do you use?</title>
        <description>&lt;p&gt;I heard this question a few times, so I decided to make a list.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/IMG_0098.webp&quot; alt=&quot;A photo of my desk at night, you can see the computer monitor, computer, keyboard, mouse and other things like the ones in the lists of this post.&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 70%; border-radius: 10px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In case you are building your own setup or trying to improve the one you already got, actually seeing how others do theirs might help.&lt;/p&gt;

&lt;p&gt;The list is divided into the categories as follows:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Desk:&lt;/strong&gt; Everything on my desk that I use on a daily basis like my keyboard, mouse, and so on;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Recording or Streaming:&lt;/strong&gt; All material for recording videos and/or live-streaming, here you find my lighting, green screen, microphone, camera, and others;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Coding:&lt;/strong&gt; my favorite tools for writing code including setup personalization scripts;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Apps and Software:&lt;/strong&gt; Apps I use on my devices from password managers to writing tools;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Services:&lt;/strong&gt; Platforms I use for imaging, domains, and others;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Travel:&lt;/strong&gt; My preferred travel gear, since I’m on the road a lot, travel gear can make or break my traveling;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Storage:&lt;/strong&gt; SSDs and flash drives for when I need to store files locally;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Decor:&lt;/strong&gt; The little things you see in my background like funkos and LED panels.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keep in mind that these lists will change over time as add or remove things from my daily use. Also friendly disclaimer: some of these links are affiliated which means I’ll get a small percentage if you buy the items using the links I shared, and in some instances you might get store credits as well!&lt;/p&gt;

&lt;p&gt;Without further ado, here are the links:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/setup-can&quot;&gt;Setup links for my Canadian friends, click here&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/setup-us/&quot;&gt;Setup links for my USA friends, click here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 19 Aug 2023 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/what-tools-do-you-use/</link>
        <guid isPermaLink="true">https://jtemporal.com/what-tools-do-you-use/</guid>
        
        <category>pro tip</category>
        
        
      </item>
    
      <item>
        <title>Notes on self-publishing my first ebook</title>
        <description>&lt;p&gt;I once wrote &lt;a href=&quot;https://jtemporal.com/my-content-creation-process/&quot;&gt;about my content creation process&lt;/a&gt; and I still follow the things I wrote in there but now, going through the publishing process of my first ebook “The Big Git Microbook”, I can say I learned a few new things. Read through to understand learn about my adventure in self-publishing first ebook.&lt;/p&gt;

&lt;h2 id=&quot;writing-that-didnt-work&quot;&gt;Writing that didn’t work&lt;/h2&gt;

&lt;p&gt;Writing itself was hard. I never wrote something so long and I gotta say this isn’t as long as it could be. &lt;a href=&quot;http://jtemporal.com/gitmicrobook/&quot;&gt;“The Big Git Microbook”&lt;/a&gt; was actually a breath of fresh air as I was writing another longer book (still to be published) and got stuck with the dreaded “writer’s block”.&lt;/p&gt;

&lt;p&gt;So this July, tired of not finishing any of the two books I was writing, I decided to finish one of them, after all, a book sitting in my computer somewhere isn’t helping anyone. I strongly believe in learn by doing, so this was also a learning opportunity since I used this book as an experiment of sorts.&lt;/p&gt;

&lt;p&gt;My idea was to use this book not only to help others with Git but, on my side, to get rid of kinks in my writing process for longer content format and to figure out how to publish this type of work. By publishing the first book, I learned a process that works for me in the sea of information out there.&lt;/p&gt;

&lt;p&gt;For the actual writing, I started using &lt;a href=&quot;https://www.apple.com/ca/pages/&quot;&gt;Apple Pages&lt;/a&gt;. That tool would allow me to write anywhere even offline, but I started noticing that the tool itself wasn’t ideal for the way I like to write: brain dump, clean up, edit, review, review, review, publish.&lt;/p&gt;

&lt;p&gt;Apple Pages didn’t let me gauge the progress in my writing or review process. Consider this: I only focus on these types of projects on my free time, this usually means weekends. Relying on memory to remember whether or not I reviewed a section was, simply put, hard. So after writing a lot and a &lt;em&gt;very&lt;/em&gt; long break, I moved from Apple Pages to &lt;a href=&quot;https://www.notion.so/&quot;&gt;Notion&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;using-notion-as-follow-up-tool-for-writing&quot;&gt;Using Notion as follow up tool for writing&lt;/h2&gt;

&lt;p&gt;I had been using Notion for my blog and gitfichas for the past year or so, by the time I decided to move the book to Notion I was very familiar to using databases to do what I wanted to do: track my progress.&lt;/p&gt;

&lt;p&gt;Moving to Notion also meant that I spent a couple of hours one given weekend to:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Copy over all the work done before;&lt;/li&gt;
  &lt;li&gt;Structure the database with all the fields I needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After the tedious copying and pasting was done I could go back to the actual tasks: writing and reviewing.&lt;/p&gt;

&lt;p&gt;More importantly, after everything was in notion I realized that, the first time around I had done more work than I thought and I was super close to finishing it. And forward I went, writing the pieces that were missing. I also took my time to recreate all images I already had.&lt;/p&gt;

&lt;h2 id=&quot;creating-standardized-images-with-carbon&quot;&gt;Creating standardized images with Carbon&lt;/h2&gt;

&lt;p&gt;You see, I was taking screenshots from the terminal on a computer, then I converted into using only my iPad for writing and &lt;a href=&quot;http://github.com/codespaces&quot;&gt;GitHub Codespaces&lt;/a&gt; for screenshooting commands on a terminal, that meant not all my images looked the same and &lt;em&gt;I like patterns&lt;/em&gt;, so recreating the images was the only way to go.&lt;/p&gt;

&lt;p&gt;I also wanted to remove any biases of my own configurations, make easier on me to hide sensitive information like my personal e-mail, and finally to make easier to create versions in other languages. After a few tries with a few online tools, &lt;a href=&quot;http://carbon.now.sh/&quot;&gt;Carbon&lt;/a&gt; ended up being the chosen one.&lt;/p&gt;

&lt;p&gt;Another session of repetitive copying and pasting later, I managed to regenerate all images using Carbon. Now I don’t like doing repetitive work, so in order to take most advantage of using Carbon, I also started a second database in Notion, this time to save the images I just made.&lt;/p&gt;

&lt;p&gt;Carbon is content based, so everything in a given image is actually part of the URL for that image, so if you save that URL you can recreate the image easily should the need arise. In the image database I not only saved said image, but the text present in each one of them, and also the URLs as well.&lt;/p&gt;

&lt;p&gt;With all the images I had made in carbon I could start the first review. Reviewing everything for the first time still in notion allowed for some fast corrections especially using &lt;a href=&quot;https://www.notion.so/product/ai&quot;&gt;Notion AI&lt;/a&gt; to spot some easily fixable typos and missing commas. I then exported the first version of a PDF directly from Notion to start some “serious” reviewing.&lt;/p&gt;

&lt;h2 id=&quot;review-three-times-and-then-review-again&quot;&gt;Review three times, and then review again&lt;/h2&gt;

&lt;p&gt;Were this another other time, when I still used paper and had a printer, I would probably print out the first PDF I generated. But this is not that time, I don’t even own a printer or have paper lying around anymore, so I just used my iPad and Apple Pencil to do as I normally would and started the reviewing process.&lt;/p&gt;

&lt;p&gt;Now mind you that even though I did review the content of the book once, the person that started writing this book is &lt;em&gt;not&lt;/em&gt; the person I am today. I like to think that in  past 2 years, my communication skills improved and that they are better than in the beginning of this journey, so I did a lot of improvements.&lt;/p&gt;

&lt;p&gt;And here my first reviewer comes in: After a lot of virtual red ink, I sent a second PDF - with corrections made from the first review - &lt;a href=&quot;https://jairojair.com/&quot;&gt;to my husband Jairo “JJ” Jair&lt;/a&gt;. That sparkled a discussion around improving the order in which the content was presented.&lt;/p&gt;

&lt;p&gt;This book was meant to look like dictionary. The reader would find the command they want in the table of contents, follow the hyperlink, and read about the command. This much is stated in the beginning of the book but try as one might, it is impossible to control readers, they will do what they want and probably read the book at least once in order.&lt;/p&gt;

&lt;p&gt;After my husband’s review, a night of rest, and a lot of conversation we figured out a order that we both agreed made sense, more adjustments were made. Once again I generated a new PDF and this time, the second reviewer came into the picture: a dear friend &lt;a href=&quot;https://cecivieira.com/&quot;&gt;Ana “Ceci” Cecília&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With a better sense for ponctuation than me, Ceci always find a way to improve my writing with a few edits. Because I was a little antsy to finish the book I did the final edits and exported the final PDF and ePubs… At least for that day…&lt;/p&gt;

&lt;h2 id=&quot;publishing-a-book-on-gumroad&quot;&gt;Publishing a book on Gumroad&lt;/h2&gt;

&lt;p&gt;Finally, holding on to the first version of the finished work it was time to put a store front somewhere. Mind you that in the beginning I wanted to publish the book in a platform I control as much as possible and secondly on Amazon.&lt;/p&gt;

&lt;p&gt;Now this is where the fun began. The “The Big Git Microbook” was first &lt;a href=&quot;http://jtemporal.com/microlivrodegit&quot;&gt;published in Portuguese&lt;/a&gt; with a focus on helping Brazilian developers, so &lt;a href=&quot;https://hotmart.com&quot;&gt;Hotmart&lt;/a&gt; seemed to make sense since it had support to the country currency and widely used &lt;a href=&quot;https://en.wikipedia.org/wiki/Pix_(payment_system)&quot;&gt;payment methods like Pix&lt;/a&gt;, while still being an international platform.&lt;/p&gt;

&lt;p&gt;Hotmart was pretty much perfect at a first glance, until I read the terms of use: They have an exclusivity clause, so by using any of the platforms services, you accept to only sell your products there, and that’s how I gave up on using them.&lt;/p&gt;

&lt;p&gt;I also didn’t want to develop the whole infrastructure, it seemed to required a lot of me to have the integrations I wanted so I picked another platform for digital products: &lt;a href=&quot;http://gumroad.com/&quot;&gt;Gumroad&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Gumroad is international, allows you sell your digital products there with minimal setup, has a flat rate over sales, and no exclusivity clause, with that said, Gumroad is kinda perfect for needs like mine.&lt;/p&gt;

&lt;p&gt;Unfortunately Gumroad does not support the Brazilian currency and the same payment methods as Hotmart did, which I knew would probably hurt part of my sales, but it was still better than Hotmart.&lt;/p&gt;

&lt;h2 id=&quot;creating-a-book-page-on-my-website&quot;&gt;Creating a book page on my website&lt;/h2&gt;

&lt;p&gt;Initially the idea was to have the page be the main landing page for the book and use Hotmart only to checkout and send the ebooks in PDF and ePub formats to customers, so I implemented a page on my own website that would allow me to add the book details and link to the payment gateway.&lt;/p&gt;

&lt;p&gt;The page itself is pretty simple. My blog is built using Jekyll, GitHub Pages, and Netlify, so to create a new page I just had to write a new markdown but I wanted to have a few buttons and have the book cover next to it’s description.&lt;/p&gt;

&lt;p&gt;So after the markdown was done I also added a little of CSS to make everything look pretty and everything was done. With the page in place, even though I ended up not using Hotmart and Gumroad having a standalone store front, I decided to keep the book page. Now it displays the details about the book and buttons to purchase the book on both Gumroad and Amazon.&lt;/p&gt;

&lt;h2 id=&quot;editing-an-ebook-for-the-kindle&quot;&gt;Editing an ebook for the Kindle&lt;/h2&gt;

&lt;p&gt;During my reviews, one thing I did was send the ePub to my own kindle to see how it would render over there. Even though the ePub worked well on other e-readers, Amazon conversion kinda didn’t work as well…&lt;/p&gt;

&lt;p&gt;The images, exported by Carbon were PNG with an transparent background and a shadow, in the kindle they showed up with a black border and the captions were also involved in the same black border making it impossible to read.&lt;/p&gt;

&lt;p&gt;So instead of using the ePub to publish on Amazon, which would result in the failed image conversion, I downloaded and installed &lt;a href=&quot;https://www.amazon.com/Kindle-Create/b&quot;&gt;Kindle Create&lt;/a&gt;, Amazon’s software for creating Kindle manuscripts.&lt;/p&gt;

&lt;p&gt;There are a mainly two layouts of books for kindle: reflowable and fixed. The catch is, if you want your book to be readable on the most common Kindle readers, you will want a reflowable layout and the way to get that is by using Kindle Create.&lt;/p&gt;

&lt;p&gt;Think of Kindle Create as a limited version of Google Docs or Microsoft Word. For example, for reflowable you can only have chapter level headings. For technical books like the microbook that’s a little annoying because subheadings don’t appear in the automatically generated table of contents.&lt;/p&gt;

&lt;p&gt;Long story short, after getting used to the limited text formatting functionalities in Kindle Create, as well as how you can add more content to it, it is pretty easy to get the manuscript, but first I needed to take care of the whole images situation.&lt;/p&gt;

&lt;p&gt;A little draw back from Kindle Create is to only accepts JPG or JPEG images, which also meant that I needed to convert all PNG images into JPG files in order to use them. I just used FFmpeg to convert all files with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.png&lt;/code&gt; extention into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.jpg&lt;/code&gt;, &lt;a href=&quot;https://gist.github.com/jtemporal/e70da0ecf56ebb094598af1c5def0b10&quot;&gt;there’s a script here&lt;/a&gt;. After running the script, converting all the images, and replacing old-poorly-converted-images in the manuscript I “only” had to export the file again and upload it to Amazon.&lt;/p&gt;

&lt;h2 id=&quot;publishing-an-ebook-on-amazon&quot;&gt;Publishing an ebook on Amazon&lt;/h2&gt;

&lt;p&gt;With the Kindle document ready, it was time to create a profile on &lt;a href=&quot;http://kdp.amazon.com/&quot;&gt;Kindle Direct Publishing (KDP)&lt;/a&gt;. That’s add the information about the book like the author name, cover, illustrator and editor information. After the first part of the metadata, you can upload the manuscript, then you’ll be able to see a preview on how the book will look like in different devices.&lt;/p&gt;

&lt;p&gt;With all mandatory fields filled, the final piece of the puzzle is choosing a pricing and royalties agreement. For pricing I picked the same value as in Gumroad, but you still have to pick a model for royalties. You can choose how much Amazon will pay you out of every sale you make and how much amazon will keep. Today Amazon has two options as far as royalties are concerned:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;35% royalties: all ebooks, as long as you sell at the same price as other platforms you are good to go;&lt;/li&gt;
  &lt;li&gt;70% royalties: if you chose to participate in KDP Select, but you have to agree with the exclusivity KDP select clause.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After all of that is just hit the big yellow publish button. Once you hit that button, your book will go through two steps that can take up to 72 hours each: Review and Publishing. For me, both of these were finished in under two hours total. After publishing is done, your book now has a page that show the book details and allows it to be purchased.&lt;/p&gt;

&lt;h2 id=&quot;claim-your-book-as-the-author&quot;&gt;Claim your book as the Author&lt;/h2&gt;

&lt;p&gt;After your book is live, is time to claim it as the author, for that you need to create a profile &lt;a href=&quot;https://author.amazon.com/&quot;&gt;Amazon’s Author Central&lt;/a&gt;. This process is very similar to creating a profile on any social media, only main difference is: before you can put your book under your library, you need to get you profile approved.&lt;/p&gt;

&lt;p&gt;The approval process is similar to the Review and Publish processes for the book, you submit the data and wait. Once it is approved you’ll get an email and will be able to &lt;a href=&quot;https://www.amazon.com/author/jesstemporal&quot;&gt;add the book into your profile like I added both of mine&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;The reviews, store front on Gumroad, creating an Amazon profile, formatting the book for Kindle, took about 4 very long days. That is, two weekends when I solely focused on working in the book, from the moment I woke up to the moment I went bed, most days close to midnight.&lt;/p&gt;

&lt;p&gt;Narrating all of that here made me realize what an intense journey this was, but as well how good it is to finally have figured out all of these steps. I can’t wait to go through that again, hopefully soon if I don’t get any writer’s block.&lt;/p&gt;

&lt;p&gt;For you that read up to here, first thanks for reading, second congratulations, and third: I hope this could bring some clarity to the whole process for you and that now you can feel more confident into publishing your books, I’m looking forward to reading them.&lt;/p&gt;
</description>
        <pubDate>Wed, 16 Aug 2023 11:00:00 +0000</pubDate>
        <link>https://jtemporal.com/notes-on-self-publishing-first-ebook/</link>
        <guid isPermaLink="true">https://jtemporal.com/notes-on-self-publishing-first-ebook/</guid>
        
        <category>personal</category>
        
        <category>year in review</category>
        
        <category>retrospective</category>
        
        
      </item>
    
      <item>
        <title>Go with the flow</title>
        <description>&lt;p&gt;First international keynote ❤️&lt;/p&gt;

&lt;p&gt;Tired of getting confused about concepts like authentication, authorization, access tokens, ID tokens, client credentials, OpenID Connect, and OAuth2.0? In this talk, you’ll learn how they come into play for the different scenarios so you never get confused again.&lt;/p&gt;

&lt;p&gt;Unless you work implementing authorization and authentication flows on a daily basis, chances are that you don’t know the different types of flows your application could follow. In general, Pythonistas see every application as an API and there’s nothing wrong with that until you need to implement such flows on your application.&lt;/p&gt;

&lt;p&gt;In this talk, you will see how an API differs from a regular web application. We will dive into the differences between implementing a simple protected API to a web app with a front-end, login, and logout. You’ll understand key concepts like access tokens, client credentials, OpenID Connect, OAuth2.0, and how they come into play for the different scenarios.&lt;/p&gt;

&lt;p&gt;If you are tired of getting confused by all of these concepts, this talk is for you.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/slides/gowiththeflow/&quot;&gt;Slides&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jtemporal/gowiththeflow/&quot;&gt;Code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can watch it below:&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/IkInFbgI1QU?si=nwXRvlorJww1uvf1&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Mon, 13 Mar 2023 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/go-with-the-flow/</link>
        <guid isPermaLink="true">https://jtemporal.com/go-with-the-flow/</guid>
        
        <category>english</category>
        
        <category>oauth</category>
        
        <category>oidc</category>
        
        <category>talk</category>
        
        
      </item>
    
      <item>
        <title>Retrospectiva 2022: Um ano de aventuras</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/retrospectiva-2018/&quot;&gt;Em 2018&lt;/a&gt; e &lt;a href=&quot;https://jtemporal.com/retrospectiva-2017/&quot;&gt;em 2017&lt;/a&gt; eu fiz retrospectivas públicas e, por algum motivo, não senti necessidade de fazer isso em entre 2019 e 2021, possivelmente por que dois desses anos foram de pandemia e eu tava só tentando sobreviver? Sim. 2022 chegou e com ele a reabertura do mundo. Esse ano tanta coisa aconteceu que acho que vale a pena a reflexão.&lt;/p&gt;

&lt;p&gt;Vale salientar que a lista não tem uma ordem de importância.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Peguei COVID e não tive sintomas graves&lt;/strong&gt;: Depois de dois anos dentro de casa, esse ano voltei a sair de casa a trabalho. Com isso novos cuidados passaram a fazer parte da rotina de viagem como por exemplo fazer auto-teste todos os dias da viagem e durante tres depois de chegar ema casa, levar mascaras na mala e assim por diante… Mesmo tomando todas as vacinas e cuidados possíveis, eu previa que iria pegar COVID eventualmente e aconteceu em junho desse ano! Ao contrario de muitos outros sobrevivi e me recuperei, porem foi uma das coisas mais preocupantes do meu ano.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Mudei de país&lt;/strong&gt;: Há muito tempo eu queria viver fora do Brasil nem que fosse por um tempo, e com sorte, esse ano consegui fazer a mudanca para o Canada, a firma patrocinou o visto e em junho eu e mozao colocamos nossas vidas em duas malas e viemos morar em Toronto.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Fiz uma viagem internacional pela primeira vez em anos&lt;/strong&gt;: Fazia muito tempo que eu não fazia viagens internacionais. Desde antes da pandemia não me sobrava grana para tanto e esse ano finalmente quebrei o jejum de conhecer novos paises e novas culturas, passei por mais de 15 aeroportos e 7 paises, em resumo… Foi um ano incrível.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Passei por 7 países e mais de 10 cidades&lt;/strong&gt;: sim voce leu direito. Ja fazem quase dois anos que eu trabalho com developer relations e esse ano voltei a colocar o pé na estrada para encontrar pessoas desenvolvedoras onde elas estiverem. Isso me levou a voar alto e pousar em varias cidades em prol de compartilhar conhecimento e ver pessoas. Isso pra não falar nos eventos online que também rolaram nesse ano. Segue a lista de paises: 🇬🇧 🇮🇪 🇦🇺 🇩🇪 🇨🇦 🇺🇸 🇧🇷 .&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Consegui andar mais de 18km em um único dia sem sofrer&lt;/strong&gt;: No começo do ano com o início da volta a sair de casa, eu notei como 2 anos de pandemia foram detrimentais para minha saúde física. Eu não conseguia andar 100m sem precisar recuperar o fôlego. Então, comecei uma jornada de melhorar minha saúde. Voltei a me exercitar com foco de aproveitar os eventos sem ficar sofrendo e consegui chegar ao fim do ano tendo conseguido andar 18km num mesmo dia sem me sentir fadiga extrema ou precisando parar para recuperar o fôlego.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Fui convidada a fazer parte do programa GitHub Stars&lt;/strong&gt;: Que eu gosto de git e GitHub não é novidade, mas eu nunca acreditei que o meu trabalho para ajudar pessoas a usarem essas duas ferramentas fosse me trazer tamanho reconhecimento. Tudo que eu tenho feito é para ajudar pessoas e foi muito gostoso receber esse convite.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Organizei o primeiro meetup no escritório&lt;/strong&gt;: Veja bem, nem só de viagens vive a DevRel, depois de viajar um tantão, também consegui criar laços com algumas comunidades locais aqui por Toronto. Abri as portas do escritorio pro primeiro meetup presencial pós-pandemia do OWASP Toronto. Espero fazer mais disso ano que vem e já estou conversando com as PyLadies Toronto para me juntar ao capítulo.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vi neve pela primeira vez&lt;/strong&gt;: eu nunca tinha visto neve ao vivo antes, e esse ano consegui marcar essa atividade como feito. Ainda estou esperando a “neve de verdade” cair para que eu possa montar um boneco de neve e fazer um anjinho na neve, mas isso só deve rolar ano que vem.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;E por aí? Quais foram as coisas legais que rolaram no seu ano?&lt;/p&gt;
</description>
        <pubDate>Fri, 16 Dec 2022 11:00:00 +0000</pubDate>
        <link>https://jtemporal.com/retrospectiva-2022-um-ano-de-aventuras/</link>
        <guid isPermaLink="true">https://jtemporal.com/retrospectiva-2022-um-ano-de-aventuras/</guid>
        
        <category>pessoal</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>My year in review: 2022, a year of adventures</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/retrospectiva-2018/&quot;&gt;In 2018&lt;/a&gt; and &lt;a href=&quot;https://jtemporal.com/retrospectiva-2017/&quot;&gt;2017&lt;/a&gt;  I wrote public retrospectives, and for some reason I didn’t feel the need to do that in between 2019 and 2021, possibly because two of those years were pandemic years and I was just trying to survive? Yes. 2022 has arrived and with it the reopening of the world. So much has happened this year that I think it’s worth reflecting on.&lt;/p&gt;

&lt;p&gt;Note that the list is not ranked in order of importance.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;I caught COVID and had no serious symptoms&lt;/strong&gt;: After two years indoors, this year I went out again for work. As a result, new precautions became part of my travel routine, such as doing self-tests every day during the trip and three days after arriving back home, carrying masks in my suitcase and so on… Even taking all possible vaccines and precautions, I predicted that I would eventually get COVID and it happened in June! Unlike many others, I survived and recovered, but it was one of the most worrisome things about my year.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;I moved to another country&lt;/strong&gt;: I had wanted to live outside Brazil for a long time, and luckily, this year I managed to move to Canada, the company I work for sponsored the visa and in June, me and bae put our whole lives in two suitcases and came to live in Toronto (if you are here I’d love to meet 😉).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;I traveled internationally for the first time in years&lt;/strong&gt;: I hadn’t traveled internationally in a long time. Since before the pandemic there wasn’t much spare money for traveling and this year I finally ended up getting to know new countries and new cultures, I went through more than 15 airports and 7 countries, long story short… It was an incredible year.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;I’ve been to 7 countries and more than 10 cities&lt;/strong&gt;: yes, you read that right. I’ve been working with developer relations for almost two years now and this year I was back on the road to meet developers wherever they were. This led me to fly high and land in several cities in order to share knowledge and connect with people. Not to mention the online events that also took place this year. Here’s the list of countries: 🇬🇧 🇮🇪 🇦🇺 🇩🇪 🇨🇦 🇺🇸 🇧🇷.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;I managed to walk more than 18km in a single day without suffering&lt;/strong&gt;: At the beginning of the year, with the start of going out after the high of the pandemic, I noticed how 2 years of  pandemic had been detrimental to my physical health. I couldn’t walk 100m without needing to catch my breath. So, I started a journey of improving my health. I went back to exercising focusing on enjoying the events without suffering and reached the end of the year having managed to walk 18km in the same day without feeling extreme fatigue or needing to stop to catch my breath.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;I was invited to be part of the GitHub Stars program&lt;/strong&gt;: The fact that I like git and GitHub is nothing new, but I never believed that my work helping people to use these two tools would bring me such recognition. Everything I’ve been doing is to help people and it was really nice to receive this invitation.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;I organized the first meetup at the office&lt;/strong&gt;: You see, DevRel isn’t just about traveling, and after traveling a lot, I also managed to bond with some local communities here around Toronto. I opened the office doors for OWASP Toronto’s first post-pandemic in person  meetup. I hope to do more of this next year and I’m already talking to PyLadies Toronto.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Saw snow for the first time&lt;/strong&gt;: I had never seen snow in real life before, and this year I was able to mark this activity as done. I’m still waiting for the “real snow” to fall so I can build a snowman and make a snow angel, but that shouldn’t happen until next year.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What about you? What were the cool things that happened in your year?&lt;/p&gt;
</description>
        <pubDate>Fri, 16 Dec 2022 11:00:00 +0000</pubDate>
        <link>https://jtemporal.com/my-year-in-review-2022-year-of-adventures/</link>
        <guid isPermaLink="true">https://jtemporal.com/my-year-in-review-2022-year-of-adventures/</guid>
        
        <category>personal</category>
        
        <category>year in review</category>
        
        <category>retrospective</category>
        
        
      </item>
    
      <item>
        <title> 3 tips you should know about GitHub Codespaces</title>
        <description>&lt;p&gt;GitHub Codespaces is a great tool for anyone who wants to write code on the go. Recently, GitHub announced that now all accounts have a free monthly quota of 60 hours to use GitHub Codespaces, so I wrote this blog post with the 3 golden tips in case you want to start using the tool.&lt;/p&gt;

&lt;h2 id=&quot;set-up-dotfiles-to-customize-your-experience&quot;&gt;Set up dotfiles to customize your experience&lt;/h2&gt;

&lt;p&gt;I really like to customize my terminal so that it shows the things I need/like. Most of these settings stay in a set of files popularly known as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dotfiles&lt;/code&gt; these are those files that start with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.&lt;/code&gt; such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.zshrc&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bashrc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It is also common to store such files on a GitHub repository named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dotfiles&lt;/code&gt;, for example here is my &lt;a href=&quot;http://github.com/jtemporal/dotfiles&quot;&gt;collection of dotfiles&lt;/a&gt;. To enable the use of these files in your &lt;em&gt;Codespaces&lt;/em&gt;, click on your photo in the upper right corner and choose &lt;em&gt;Settings&lt;/em&gt; from the menu that appeared.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/codespaces/github-menu-selected-option-settings.webp&quot; alt=&quot;Image showing the Settings section in the profile menu on GitHub&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 30%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Once in the settings dashboard, find the &lt;em&gt;Codespaces&lt;/em&gt; option on the left side menu in the &lt;em&gt;Code, planning, and automation&lt;/em&gt; section and click on it.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/codespaces/codespaces-lefthand-side-menu-in-settings.webp&quot; alt=&quot;Image showing the Codespaces section in the left menu on the Settings page&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This will take you to the Codespaces settings page and then the first section called &lt;em&gt;Dotfiles&lt;/em&gt; will appear.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/codespaces/dotfiles-section-on-codespaces-settings.webp&quot; alt=&quot;Dotfiles settings section&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now click on the checkbox to install the dotfiles automatically on Codespaces and if you have a repository called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dotfiles&lt;/code&gt; GitHub will identify your corresponding repository and use it here.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/codespaces/dotfiles-section-on-codespaces-settings-configured.webp&quot; alt=&quot;Dotfiles settings section with the use of dotfiles enables&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Keep in mind that you can switch to another repository if you want. Finally, it is good to point out two things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Changes in files in the dotfiles will only take effect after the creation of a new Codespace;&lt;/li&gt;
  &lt;li&gt;Codespaces doesn’t use SSH to run git actions so if you have settings for that in your &lt;a href=&quot;https://github.com/jtemporal/dotfiles/blob/7a79829f40d5c62b261f5ffaaa808df9c12a1144/.gitconfig&quot;&gt;dotfiles like I did&lt;/a&gt; you’re going to have problems (the solution is to remove that).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;use-the-codespaces-management-dashboard&quot;&gt;Use the Codespaces Management Dashboard&lt;/h2&gt;

&lt;p&gt;Now that you have 60 hours free per month to play with Codespaces, you might be tempted to create Codespaces for all your repositories, after all, in theory, you can do that, but it’s good to learn to keep a clean house too.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/codespaces/github-codespaces-dashboard.webp&quot; alt=&quot;List of Codespaces in your profile&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To make your work easier there is a page where you can see all the Codespaces you have and the status of each one as seen in the image above, just access &lt;a href=&quot;http://github.com/codespaces&quot;&gt;github.com/codespaces&lt;/a&gt;. I also recommend you get into the habit of doing this regularly to help keep your free quota, well, free.&lt;/p&gt;

&lt;h2 id=&quot;learn-how-to-use-github-in-the-vs-code-interface&quot;&gt;Learn how to use GitHub in the VS Code interface&lt;/h2&gt;

&lt;p&gt;Finally, the part that can take the most time: using GitHub integration in the VS Code interface. There is a VS Code extension called &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github&quot;&gt;GitHub Pull Requests and Issues&lt;/a&gt; that basically allows you to do things like review pull requests and interact with issues directly on VS Code.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/codespaces/github-vscode-extension-in-action.webp&quot; alt=&quot;Image showing GitHub integration with Codespaces with a pull request as an example&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This will speed up your pull request review process because you don’t even have to switch tabs or leave your Codespace to interact.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;These are the three fastest tips to implement that I can think of, in about 15 minutes you can set up and become familiar with each one. Remember:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Set up dotfiles to customize your experience;&lt;/li&gt;
  &lt;li&gt;Get to know the Codespaces management panel;&lt;/li&gt;
  &lt;li&gt;Learn how to use the GitHub integration in the VS Code interface.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 30 Nov 2022 15:10:00 +0000</pubDate>
        <link>https://jtemporal.com/3-tips-you-should-know-about-github-codespaces/</link>
        <guid isPermaLink="true">https://jtemporal.com/3-tips-you-should-know-about-github-codespaces/</guid>
        
        <category>github codespaces</category>
        
        <category>codespaces</category>
        
        <category>english</category>
        
        <category>en</category>
        
        
      </item>
    
      <item>
        <title>3 dicas que você precisa saber sobre GitHub Codespaces</title>
        <description>&lt;p&gt;GitHub Codespaces é uma ferramenta ótima para quem quer escrever código em qualquer lugar. Recentemente o GitHub anunciou que agora todas as contas tem uma cota gratuita de 60h mensais para usar o GitHub Codespaces, por isso escrevi essa colinha com as 3 dicas de ouro caso você queira passar a usar a ferramenta.&lt;/p&gt;

&lt;h2 id=&quot;configure-dotfiles-para-personalizar-a-sua-experiência&quot;&gt;Configure dotfiles para personalizar a sua experiência&lt;/h2&gt;

&lt;p&gt;Eu gosto muito de personalizar meu terminal para que ele mostre as coisas que eu preciso/gosto. A maioria dessas configurações mora num conjunto de arquivos popularmente conhecido como &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dotfiles&lt;/code&gt; esses são aqueles arquivos que começam com um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.&lt;/code&gt; como &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.zshrc&lt;/code&gt; e &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bashrc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Também é comum armazenar tais arquivos dentro de um repositório no GitHub com o nome &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dotfiles&lt;/code&gt;, por exemplo aqui está a minha &lt;a href=&quot;http://github.com/jtemporal/dotfiles&quot;&gt;coleção de arquivos dotfiles&lt;/a&gt;. Para ativar o uso desses arquivos no seu Codespaces, clique na sua foto no canto superior direito e escolha &lt;em&gt;Settings&lt;/em&gt; no menu que apareceu.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/codespaces/github-menu-selected-option-settings.webp&quot; alt=&quot;Imagem mostrando a seção de Settings no menu do perfil no GitHub&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 30%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Uma vez no painel de configurações encontre a opção &lt;em&gt;Codespaces&lt;/em&gt; no menu lateral esquerdo na seção &lt;em&gt;Code, planning, and automation&lt;/em&gt; e clique nela.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/codespaces/codespaces-lefthand-side-menu-in-settings.webp&quot; alt=&quot;Imagem mostrando a seção de Codespaces no menu da esquerda na página de Settings&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Isso vai te levar para a página de configuração do Codespaces e logo aparece a primeira seção chamada &lt;em&gt;Dotfiles.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/codespaces/dotfiles-section-on-codespaces-settings.webp&quot; alt=&quot;Seção de configuração de Dotfiles no Settings antes de usar dotfiles&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora clique na caixa de seleção para instalar os dotfiles automaticamente nos Codespaces e, caso você tenha um repositório chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dotfiles&lt;/code&gt; o GitHub irá identificar o seu repositório correspondente e usá-lo aqui.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/codespaces/dotfiles-section-on-codespaces-settings-configured.webp&quot; alt=&quot;Seção de configuração de Dotfiles no Settings após ativar o uso de dotfiles&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Tenha em mente que você pode alterar para um outro repositório caso queira. Por fim, é bom salientar duas coisas:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Que mudanças nos arquivos presentes no dotfiles só entrarão em efeito na criação de um novo Codespace;&lt;/li&gt;
  &lt;li&gt;O Codespaces não usa SSH para executar as ações de git então se você tiver configurações em relação a isso no seus &lt;a href=&quot;https://github.com/jtemporal/dotfiles/blob/7a79829f40d5c62b261f5ffaaa808df9c12a1144/.gitconfig&quot;&gt;dotfiles como eu tinha&lt;/a&gt; você vai ter problemas (a solução é remover isso).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;use-o-painel-de-gerenciamento-do-codespaces&quot;&gt;Use o painel de gerenciamento do Codespaces&lt;/h2&gt;

&lt;p&gt;Agora que você tem 60h gratuitas por mês para brincar com o Codespaces você sofrer a tentação de criar Codespaces para todos os seus repositório, afinal de contas, em tese, você pode fazer isso, mas é bom aprender a manter a casa limpa também.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/codespaces/github-codespaces-dashboard.webp&quot; alt=&quot;Lista de Codespaces no seu perfil&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Para facilitar o seu trabalho existe uma página que você consegue ver todos os Codespaces que você tem e o status de cada um como visto na imagem acima, basta acessar &lt;a href=&quot;http://github.com/codespaces&quot;&gt;github.com/codespaces&lt;/a&gt;. Eu ainda recomendo você criar o hábito de fazer isso regularmente para ajudar a manter a sua cota gratuita livre.&lt;/p&gt;

&lt;h2 id=&quot;aprenda-a-usar-o-github-na-interface-do-vs-code&quot;&gt;Aprenda a usar o GitHub na interface do VS Code&lt;/h2&gt;

&lt;p&gt;Por fim a parte que pode demandar mais tempo: usar a integração do GitHub na interface do VS Code. Existe uma extensão do VS Code chamada &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github&quot;&gt;GitHub Pull Requests and Issues&lt;/a&gt; que te permite basicamente fazer coisas como revisar pull requests e interagir com issues diretamente no VS Code.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/codespaces/github-vscode-extension-in-action.webp&quot; alt=&quot;Imagem mostrando a integração de github com codespaces com um pull request de exemplo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Isso vai te trazer uma grande agilidade no seu processo de revisão de pull requests por que você nem precisa ficar trocando de aba ou sair do seu Codespace para interagir.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Essas são três dicas mais rápidas de implementar que eu consigo pensar, em cerca de 15 minutos você consegue configurar e se familiarizar com cada uma delas. Lembre-se:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Configure dotfiles para personalizar a sua experiência;&lt;/li&gt;
  &lt;li&gt;Conheça o painel de gerenciamento do Codespaces;&lt;/li&gt;
  &lt;li&gt;Aprenda a usar a integração do GitHub na interface do VS Code.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 30 Nov 2022 15:00:00 +0000</pubDate>
        <link>https://jtemporal.com/3-dicas-que-voce-deveria-saber-sobre-github-codespaces/</link>
        <guid isPermaLink="true">https://jtemporal.com/3-dicas-que-voce-deveria-saber-sobre-github-codespaces/</guid>
        
        <category>github codespaces</category>
        
        <category>codespaces</category>
        
        <category>portugues</category>
        
        <category>pt</category>
        
        
      </item>
    
      <item>
        <title>7 useful tips for traveling with ease ✈️</title>
        <description>&lt;p&gt;Traveling can be daunting, especially if you have never felt comfortable doing it before. Here you can find my personal take on things that helped me get through over 15 airports in seven countries in a timely manner in the past year.&lt;/p&gt;

&lt;p&gt;All these tips I learned on the go and figuring out what worked for me helped me get to my destination faster without feeling “that should be a better way of doing this”.&lt;/p&gt;

&lt;h2 id=&quot;1-check-in-online-if-you-can&quot;&gt;1. Check-in online if you can&lt;/h2&gt;

&lt;p&gt;This will help you save time at the airport because you won’t need to stay in line to check-in. Most airlines also have a fast drop-off for checked bags, which means you’ll spend less time standing at the airport before you go through security.&lt;/p&gt;

&lt;h2 id=&quot;2-pack-like-you-mean-it&quot;&gt;2. Pack like you mean it&lt;/h2&gt;

&lt;p&gt;Packing is an acquired skill. The more you do, the better you get at it. I like to have time for packing one day in advance since this gives me time to adjust if I remember anything I might have forgotten. &lt;a href=&quot;https://www.notion.so/Template-check-list-for-traveling-2f75c069edd8476aaa500ea1136dba8c&quot;&gt;I even have a checklist on Notion you can duplicate&lt;/a&gt; so you won’t forget to pack anything important.&lt;/p&gt;

&lt;p&gt;No matter how long or short the trip, I usually travel with a carry-on suitcase and a backpack. This requires me to be very intentional about what I take with me. Here’s how I divide my things between the suitcase and the backpack:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;In the backpack, I take:
    &lt;ol&gt;
      &lt;li&gt;&lt;em&gt;All my electronics:&lt;/em&gt; gimbal, iPad, work computer, noise-canceling headphones, camera, power bank, and chargers&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;All liquids:&lt;/em&gt; Medicine, lotions, hair products&lt;/li&gt;
      &lt;li&gt;A sweater or hoodie, an extra pair of underwear, and a t-shirt&lt;/li&gt;
      &lt;li&gt;Passport, currency, jewelry, and cards&lt;/li&gt;
      &lt;li&gt;An empty water bottle&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;In the carry-on goes:
    &lt;ol&gt;
      &lt;li&gt;&lt;em&gt;All my clothing:&lt;/em&gt; cardigans, underwear, a hairdryer bonnet for the curls;&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Anything that doesn’t have a battery:&lt;/em&gt; tripods, swag, selfie stick, and flip-flops.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;before-the-airport&quot;&gt;Before the airport&lt;/h3&gt;

&lt;p&gt;I started using packing cubes because they help me keep my clothes organized, especially when I have little time in between trips to wash everything. So whenever I’m packing to come home, I fit all my dirty clothes into one packing cube, so it is easy to find what I need to wash before the next trip.&lt;/p&gt;

&lt;p&gt;Always do a weight test. A good rule of thumb is to try to lift the carry-on over your head to make sure you can lift it yourself. Flight attendants can always help you, but it is a good measure to ensure you can carry your own weight.&lt;/p&gt;

&lt;h3 id=&quot;at-the-airport&quot;&gt;At the airport&lt;/h3&gt;

&lt;p&gt;Going through security at the airport, you’ll be asked to take out all liquids and large electronics from your bags. Keeping everything in one place will help you get cleared faster. Since you can’t take anything with over 100ml in the cabin, remember to empty your water bottle before getting in line. You can always find a water fountain to fill out again after you get cleared.&lt;/p&gt;

&lt;p&gt;You may be requested to check your suitcase at the gate. It is a good idea to plan your packing around that possibility. Keeping all batteries with you is a good measure, so you don’t have to go around opening your suitcase on the airport floor to take stuff out.&lt;/p&gt;

&lt;h2 id=&quot;3-research-how-to-get-around-at-your-destination&quot;&gt;3. Research how to get around at your destination&lt;/h2&gt;

&lt;p&gt;Research how to get around in the city you will be in. I always look for information on how easy it is to get around the city. This step helps me in two ways:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Reduces the anxiety of not knowing where I am, especially if I don’t speak the language.&lt;/li&gt;
  &lt;li&gt;Helps me prepare for any surprises that might arise, for example, strikes in public transportation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, the first time I went to Ireland, I discovered that Uber and taxis are “difficult” over there. All Uber drivers are actually taxi drivers. You also need to leave earlier or schedule taxis in advance. They also use an app called Free Now, which requires you to confirm your profile by receiving an SMS.&lt;/p&gt;

&lt;p&gt;Buses in Berlin can be a nightmare, but trains and trams work really well. Google will help you get around and pick the correct lines even if you don’t speak German. Another tip is to download the BVG app so you can buy tickets on the go, but pay attention to the ticket type and pick the correct starting point. There might be people checking your ticket in the tram/train car.&lt;/p&gt;

&lt;h2 id=&quot;4-if-you-need-to-be-connected-at-all-times-esim-is-the-way-to-go&quot;&gt;4. If you need to be connected at all times: eSIM is the way to go&lt;/h2&gt;

&lt;p&gt;If you need to be connected while away, buy and configure an eSIM before you go. I &lt;a href=&quot;https://ref.airalo.com/a1bF&quot;&gt;use an eSIM from Airalo&lt;/a&gt;. Airalo has a plethora of packages and works in a lot of countries. Because it is right there on your phone is easier than buying a new SIM every time, lowering the decision burden. Since they are digital, using an eSIM also generates less trash.&lt;/p&gt;

&lt;p&gt;Another good thing, the data or mobile plan you pick may expire, but the eSIM itself doesn’t, so you only have to set up the eSIM once. I bought one global data eSIM that I can add more data to it whenever I need to travel again.&lt;/p&gt;

&lt;p&gt;Just remember to set it up and know how to configure it before traveling since you’ll need a stable internet connection.&lt;/p&gt;

&lt;h2 id=&quot;5-be-ready-to-take-your-shoes-off&quot;&gt;5. Be ready to take your shoes off&lt;/h2&gt;

&lt;p&gt;Be prepared to take your shoes off. This is one most of us forget. Depending on several factors, you may be asked to take your shoes off and put them through the X-ray machine. Avoid shoes that might get stuck or require a lot of effort to take out or put back on your feet.&lt;/p&gt;

&lt;h2 id=&quot;6-no-noise-is-better&quot;&gt;6. No noise is better&lt;/h2&gt;

&lt;p&gt;Have a good pair of noise-canceling headphones. My favorite one so far is the Sony WH-1000XM3. I keep thinking about upgrading mine to a newer version of it. Still, this one serves me soooo well that I can not justify buying the new ones for myself just yet.&lt;/p&gt;

&lt;p&gt;I bought the Sony WH-1000XM3 around 4 years ago. Out of its features, I like that the battery lasts a long time even after so long using it and that you can configure the noise-canceling level. There’s nothing fancier than not hearing the airplane noises during an 8h red eye.&lt;/p&gt;

&lt;h2 id=&quot;7-jet-lag-is-real&quot;&gt;7. Jet-Lag is real&lt;/h2&gt;

&lt;p&gt;Make sure to respect yourself. If you haven’t crossed timezones before, you might be hard on yourself and feel like “you should be enjoying this more,” but be mindful that our bodies need time to adjust to new routines and time zones.&lt;/p&gt;

&lt;p&gt;For me takes about 5 days to completely adjust to a new timezone. That’s just how my body works. Even with me going to bed and getting out of bed at the correct time every day, I still feel tired or that I should be sleeping at odd hours. Exercising and having a plan for working or touristing helps fight it off, but if I can, I’ll take naps after lunch and extra long walks to tire myself before bed.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;In short, here’s what you need to keep in mind:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;🎟️ Check-in online if you can;&lt;/li&gt;
  &lt;li&gt;🧳 Pack like you mean it;&lt;/li&gt;
  &lt;li&gt;📱 Find a phone plan that works for you; eSIM is a great thing;&lt;/li&gt;
  &lt;li&gt;👟 Be prepared to take your shoes off;&lt;/li&gt;
  &lt;li&gt;🎧 Noise-canceling headphones are REALLY helpful;&lt;/li&gt;
  &lt;li&gt;🗺️ Check how to get around the city before you actually get there;&lt;/li&gt;
  &lt;li&gt;😴 Jet-Lag is real. Respect your body.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before you go, I’d like to leave you with one bonus tip: take more pictures than you think you need. I always arrive home feeling like I could use more pictures or videos, even if I don’t post them.&lt;/p&gt;
</description>
        <pubDate>Mon, 31 Oct 2022 09:01:00 +0000</pubDate>
        <link>https://jtemporal.com/seven-tips-for-traveling-with-ease/</link>
        <guid isPermaLink="true">https://jtemporal.com/seven-tips-for-traveling-with-ease/</guid>
        
        <category>devrel</category>
        
        <category>developer advocate</category>
        
        <category>developer relations</category>
        
        <category>developer advocacy</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>7 dicas úteis para viajar com tranquilidade ✈️</title>
        <description>&lt;p&gt;Viajar pode ser assustador, especialmente se você nunca se sentiu confortável fazendo isso. Aqui você vai encontrar minha opinião pessoal sobre coisas que me ajudaram a passar por mais de 15 aeroportos em sete países em tempo hábil durante o ano passado.&lt;/p&gt;

&lt;p&gt;Todas essas dicas eu aprendi durante as viagens e descobrir o que funcionava para mim me ajudou a chegar ao meu destino mais rápido sem sentir “que deveria haver uma maneira melhor de fazer isso”.&lt;/p&gt;

&lt;h2 id=&quot;1-faça-seu-check-in-on-line-se-possível&quot;&gt;1. Faça seu check-in on-line se possível&lt;/h2&gt;

&lt;p&gt;Isso ajudará você a economizar tempo no aeroporto, pois não precisará ficar na fila para fazer o check-in. A maioria das companhias aéreas também tem uma fila de despacho rápido para malas despachadas, o que significa que você passará menos tempo no aeroporto antes de passar pela segurança.&lt;/p&gt;

&lt;h2 id=&quot;2-faça-as-malas-com-intenção&quot;&gt;2. Faça as malas com &lt;em&gt;intenção&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;Fazer as malas é uma habilidade adquirida. Quanto mais você faz, melhor você fica nisso. Eu gosto de ter tempo para fazer as malas com um dia de antecedência, pois isso me dá tempo para ajustar se eu me lembrar de algo que possa ter esquecido. &lt;a href=&quot;https://rose-chicory-ed7.notion.site/Checklist-de-Viagem-Template-83cb93cbbf1042eba65e186157212018&quot;&gt;Eu até tenho um checklist no Notion que você pode duplicar&lt;/a&gt; para não esquecer de levar nada importante.&lt;/p&gt;

&lt;p&gt;Não importa quão longa ou curta a viagem vai ser, eu costumo viajar com uma mala de mão e uma mochila. Isso exige que eu seja muito intencional sobre o que levo comigo. Eu divido minhas coisas entre a mala de mão e a mochila assim:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Na mochila, eu levo:
    &lt;ol&gt;
      &lt;li&gt;&lt;em&gt;Todos os meus eletrônicos:&lt;/em&gt; gimbal, iPad, computador do trabalho, fone de ouvido com cancelamento de ruído, câmera, power bank e carregadores&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Todos os líquidos:&lt;/em&gt; Remédios, loções, produtos para cabelo&lt;/li&gt;
      &lt;li&gt;Um casaco ou moletom, um par extra de roupas de baixo e uma camiseta&lt;/li&gt;
      &lt;li&gt;Passaporte, dinheiro, joias e cartões&lt;/li&gt;
      &lt;li&gt;Uma garrafa de água vazia&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;Na mala de mão, vão:
    &lt;ol&gt;
      &lt;li&gt;&lt;em&gt;Todas as minhas roupas:&lt;/em&gt; casacos levinhos, roupas de baixo, touca difusora para os meus cachinhos;&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Tudo que não tenha bateria:&lt;/em&gt; tripé, brindes da empresa, pau de selfie e chinelos.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;antes-do-aeroporto&quot;&gt;Antes do aeroporto&lt;/h3&gt;

&lt;p&gt;Comecei a usar organizadores de mala porque me ajudam a manter minhas roupas organizadas, principalmente quando tenho pouco tempo entre as viagens para lavar tudo. Então, sempre que estou fazendo as malas para voltar para casa, coloco todas as minhas roupas sujas em um organizador só, para que seja fácil encontrar o que preciso lavar antes da próxima viagem.&lt;/p&gt;

&lt;p&gt;Sempre faça um teste de peso da mala. Um bom parâmetro é tentar levantar a bagagem de mão sobre a cabeça para ter certeza de que você pode levantá-la sem ajuda. A equipe de pessoas comissárias de bordo sempre pode te ajudar, mas isso é uma boa medida para garantir que você consegue carregar seu próprio peso.&lt;/p&gt;

&lt;h3 id=&quot;no-aeroporto&quot;&gt;No aeroporto&lt;/h3&gt;

&lt;p&gt;Passando pela segurança do aeroporto, irão te solicitar que você retire todos os líquidos e eletrônicos maiores de suas malas. Manter tudo em um só lugar ajudará você a ficar livre mais rapidamente. Como você não pode levar nada com mais de 100ml no vôo, lembre-se de esvaziar sua garrafa de água antes de entrar na fila. Você sempre pode encontrar um bebedouro para encher a garrafa novamente depois que estiver na área de embarque.&lt;/p&gt;

&lt;p&gt;Podem te pedir despachar sua mala de mão no portão. É uma boa ideia planejar a arrumação da sua mala em torno dessa possibilidade. Manter todas as baterias com você é uma boa medida para que você não precise abrir a sua mala no chão do aeroporto para tirar coisas.&lt;/p&gt;

&lt;h2 id=&quot;3-pesquise-como-vai-se-locomover-no-seu-destino&quot;&gt;3. Pesquise como vai se locomover no seu destino&lt;/h2&gt;

&lt;p&gt;Pesquise como se locomover na cidade em que você estará. Sempre procuro informações sobre o quão fácil é se locomover pela cidade. Esta etapa me ajuda de duas formas:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Reduz a ansiedade de não saber onde eu estou, especialmente se eu não falo o idioma nativo.&lt;/li&gt;
  &lt;li&gt;Ajuda a me preparar para quaisquer surpresas que possam surgir, como por exemplo, greves no transporte público.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por exemplo, na primeira vez que fui à Irlanda, descobri que Uber e táxis são “difíceis” por lá. Todos os motoristas do Uber são, na verdade, motoristas de táxi. Você também precisa sair mais cedo ou agendar táxis com antecedência. Eles também usam um aplicativo chamado Free Now, que exige que você confirme seu perfil recebendo um SMS.&lt;/p&gt;

&lt;p&gt;Os ônibus em Berlim podem ser um pesadelo, mas os trens e &lt;em&gt;trams&lt;/em&gt; funcionam muito bem. O Google vai te ajudar a se locomover e escolher as linhas corretas, mesmo que você não fale alemão. Outra dica é baixar o aplicativo do BVG para comprar bilhetes na hora, mas preste atenção ao tipo de bilhete e escolha o ponto de partida correto. Pode haver pessoas verificando seu ele no vagão do trem/&lt;em&gt;tram&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;4-se-você-precisar-estar-com-conexão-à-internet-o-tempo-todo-esim-é-pra-você&quot;&gt;4. Se você precisar estar com conexão à internet o tempo todo: eSIM é pra você&lt;/h2&gt;

&lt;p&gt;Se você precisar de internet enquanto estiver fora do seu país, compre e configure um eSIM (cartão SIM eletrônico) antes de ir. Eu &lt;a href=&quot;https://ref.airalo.com/a1bF&quot;&gt;uso um eSIM da Airalo&lt;/a&gt;. A Airalo tem uma infinidade de pacotes e funciona em muitos países. Por já estar no seu celular, é mais fácil do que comprar um novo SIM toda vez, diminuindo a carga de decisão. Por serem digitais, o uso de um eSIM também gera menos lixo.&lt;/p&gt;

&lt;p&gt;Outra coisa boa, o plano de dados ou celular que você escolher pode expirar, mas o eSIM em si não, então você só precisa configurar o eSIM uma vez. Comprei um eSIM de dados global que posso adicionar mais pacote de dados a ele sempre que precisar viajar novamente.&lt;/p&gt;

&lt;p&gt;Apenas lembre-se de saber como configurá-lo antes de viajar, pois você vai precisar de uma conexão estável à Internet.&lt;/p&gt;

&lt;h2 id=&quot;5-se-prepare-para-tirar-os-sapatos&quot;&gt;5. Se prepare para tirar os sapatos&lt;/h2&gt;

&lt;p&gt;Se prepare para tirar os sapatos. Este é algo que a maioria de nós esquece. Dependendo de vários fatores, você podem te pedir a tirar os sapatos e colocá-los na máquina de raio-X. Evite sapatos que possam ficar presos ou que exijam muito esforço para tirar ou calçar novamente.&lt;/p&gt;

&lt;h2 id=&quot;6-sem-ruído-é-melhor&quot;&gt;6. Sem ruído é melhor&lt;/h2&gt;

&lt;p&gt;Tenha um bom par de fones de ouvido com cancelamento de ruído. Meu favorito até agora é o Sony WH-1000XM3. Eu continuo pensando em fazer um upgrade do meu para uma versão mais recente dele. Ainda assim, este me serve tãaaaao bem que ainda não consigo justificar a compra de um modelo novo para mim mesma.&lt;/p&gt;

&lt;p&gt;Comprei o Sony WH-1000XM3 há cerca de 4 anos. Além dos seus recursos, gosto que a bateria dura muito tempo mesmo depois de tanto tempo de uso e que você pode configurar o nível de cancelamento de ruído. Não há nada mais chique do que não ouvir os ruídos do avião durante um voo noturno de 8h.&lt;/p&gt;

&lt;h2 id=&quot;7-jet-lag-é-real&quot;&gt;7. Jet-Lag é real&lt;/h2&gt;

&lt;p&gt;Certifique-se de se respeitar. Se você nunca cruzou fusos horários antes, você pode ficar se cobrando e sentir que “você deveria estar aproveitando mais isso”, porém lembre-se de que nossos corpos precisam de tempo para se ajustar a novas rotinas e fusos horários.&lt;/p&gt;

&lt;p&gt;Para mim, leva cerca de 5 dias para se ajustar completamente a um novo fuso horário. É assim que meu corpo funciona. Mesmo comigo indo para a cama e levantando na hora certa todos os dias, ainda me sinto cansada ou que deveria estar dormindo em horários estranhos. Fazer exercícios e ter um plano para trabalhar ou turistar ajuda a combater esse sentimento, mas se eu puder, tiro sonecas depois do almoço e faço longas caminhadas para me cansar antes de dormir.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Resumindo, aqui está o que você precisa manter em mente:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;🎟️ Faça seu check-in on-line se possível;&lt;/li&gt;
  &lt;li&gt;🧳 Faça as malas com intenção;&lt;/li&gt;
  &lt;li&gt;📱 Encontre um plano de telefone que funcione para você; eSIM é ótimo pra isso;&lt;/li&gt;
  &lt;li&gt;👟 Se prepare para tirar os sapatos;&lt;/li&gt;
  &lt;li&gt;🎧 Fones de ouvido com cancelamento de ruído são REALMENTE úteis;&lt;/li&gt;
  &lt;li&gt;🗺️ Confira como se locomover pela cidade antes mesmo de chegar lá;&lt;/li&gt;
  &lt;li&gt;😴 Jet-Lag é real. Respeite seu corpo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Antes de ir, gostaria de deixar uma dica bônus pra você: tire mais fotos do que você acha que precisa. Sempre chego em casa sentindo que poderia ter mais fotos ou vídeos, mesmo que não poste.&lt;/p&gt;
</description>
        <pubDate>Mon, 31 Oct 2022 09:01:00 +0000</pubDate>
        <link>https://jtemporal.com/sete-dicas-para-viajar-com-tranquilidade/</link>
        <guid isPermaLink="true">https://jtemporal.com/sete-dicas-para-viajar-com-tranquilidade/</guid>
        
        <category>devrel</category>
        
        <category>developer advocate</category>
        
        <category>developer relations</category>
        
        <category>developer advocacy</category>
        
        <category>portugues</category>
        
        <category>pt</category>
        
        
      </item>
    
      <item>
        <title>Projetos Brasileiros para contribuir nesse #Hacktoberfest 2022</title>
        <description>&lt;p&gt;Parece que esse ano passou num passe de mágica, Outubro já está aqui de novo e mais uma vez o evento mais esperado mundo &lt;em&gt;open source&lt;/em&gt;: #Hacktoberfest.&lt;/p&gt;

&lt;p&gt;Desde 2017 essa lista aqui acontece para te ajudar a fazer os seus pull requests/merge requests e participar dessa festa que dura um mes todo. Então aqui vai! Uma lista toda repleta de projetos brazileiros pra você contribuir nesse mês de Outubro!&lt;/p&gt;

&lt;h2 id=&quot;edições-anteriores&quot;&gt;Edições anteriores&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/nossa-coletividad/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-4dc9b9b576c0&quot;&gt;2017&lt;/a&gt;, &lt;a href=&quot;https://medium.com/@jessicatemporal/projetos-brasileiros-para-contribuir-nesse-hacktoberfest-vers%C3%A3o-2018-4925959b9411&quot;&gt;2018&lt;/a&gt;, &lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-o-retorno/&quot;&gt;2019&lt;/a&gt;, &lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2020/&quot;&gt;2020&lt;/a&gt;, &lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2021/&quot;&gt;2021&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;regras-para-entrar-nessa-lista&quot;&gt;Regras para entrar nessa lista&lt;/h2&gt;

&lt;p&gt;As regrinhas do ano passado se repetem:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ser um projeto criado/desenvolvido/mantido por brasileiras(os);&lt;/li&gt;
  &lt;li&gt;Precisa ser um &lt;strong&gt;projeto&lt;/strong&gt;, não pode ser uma organização, caso tenha mais de um projeto da organização precisa ser um PR por projeto com uma entrada por projeto&lt;/li&gt;
  &lt;li&gt;Ter pelo menos uma &lt;em&gt;issue&lt;/em&gt; aberta.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;avisos-para-2022&quot;&gt;Avisos para 2022&lt;/h2&gt;

&lt;p&gt;Esse ano vamos manter a mesma forma de aumentar essa lista com mais projetos, como sempre, apenas abrindo um PR com o projeto. &lt;a href=&quot;https://jtemporal.com/adicionando-um-novo-projeto-na-lista-da-hacktoberfest-2019/&quot;&gt;As instruções de como adicionar projetos tão aqui&lt;/a&gt;. Todo mundo segue apenas ganhando &amp;lt;3.&lt;/p&gt;

&lt;p&gt;Os projetos continuam separados pela linguagem principal pra facilitar as buscas pra quem lê e também em ordem alfabética pela linguagem. 😉&lt;/p&gt;

&lt;p&gt;Assim como em 2021, qualidade é o mais importante então se liga que dois PRs inválidos resultará em &lt;strong&gt;desqualificação por período indeterminado&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Para um PR ser considerado inválido, ele deve ser marcado com as &lt;em&gt;tags&lt;/em&gt; &lt;strong&gt;spam&lt;/strong&gt; ou &lt;strong&gt;invalid&lt;/strong&gt;. Então é bom tentar fazer PRs de qualidade!&lt;/p&gt;

&lt;p&gt;Relembrando que para tornar seu PR válido para a hacktoberfest você precisa ter algumas coisas. PRs apenas contarão se:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;O PR precisa ser aberto em Outubro (entre os dias 1 e 31);&lt;/li&gt;
  &lt;li&gt;O PR preicisa acontecer num projeto que tem o tópico &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hacktoberfest&lt;/code&gt; &lt;strong&gt;ou&lt;/strong&gt; ser marcado com o rótulo (&lt;em&gt;label&lt;/em&gt;) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hacktoberfest-accepted&lt;/code&gt; por um mantenedor &lt;strong&gt;ou&lt;/strong&gt; ser aceito (&lt;em&gt;merged&lt;/em&gt;) &lt;strong&gt;ou&lt;/strong&gt; ser aprovado pelo processo de revisão (&lt;em&gt;review&lt;/em&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mais informações no &lt;a href=&quot;https://hacktoberfest.com&quot;&gt;site oficial (em inglês)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por último, nesse outro artigo tem &lt;a href=&quot;https://jtemporal.com/5-dicas-para-fazer-o-seu-pull-request-brilhar/&quot;&gt;5 Dicas Para Fazer o Seu Pull Request Brilhar ✨&lt;/a&gt; e pode ser útil.&lt;/p&gt;

&lt;p&gt;Happy Hacking! 🎉&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt; C# &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/MelonRuntime/Melon&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/105192336?s=400&amp;amp;u=4375e36be647d2a64727bbefc2382c2801897b39&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;MelonRuntime/Melon&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Melon is a declarative modern .NET JavaScript runtime focused in rapid prototyping of projects, using minimal dependencies without breaking nothing.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/afucher/Inquirer&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3756185?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;afucher/Inquirer&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A collection of common interactive command line user interfaces in C#.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alexsandro-xpt/ErysDownloader&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/845657?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alexsandro-xpt/ErysDownloader&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ErysDownloader, a frenetic and optimizate downloader library. Pure C# lightweight HTTP GET verb library for text/html content-type. No dependece.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/code-cracker/code-cracker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/9695920?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;code-cracker/code-cracker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An analyzer library for C# and VB that uses Roslyn to produce refactorings, code analysis, and other niceties.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; C &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cmatsuoka/libxmp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/317355?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cmatsuoka/libxmp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Libxmp is a library that renders module files to PCM data.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/hardinfo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/hardinfo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;System profiler and benchmark tool for Linux systems&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/lwan&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/lwan&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Experimental, scalable, high performance HTTP server&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; CSS &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/milligram/milligram&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16243913?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;milligram/milligram&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A minimalist CSS framework.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Clojure &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mauricioszabo/atom-chlorine&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/138037?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mauricioszabo/atom-chlorine&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; An Atom plugin to integrate with Socket-REPL over Clojure and ClojureScript&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; C++ &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/OtacilioN/Brasilino&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10578275?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;OtacilioN/Brasilino&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Uma biblioteca que permite programar em linguagem Arduino utilizando comandos facilitados em PT-BR.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/vinipsmaker/tufao&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/865914?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;vinipsmaker/tufao&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An asynchronous web framework for C++ built on top of Qt&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Elixir &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/philss/floki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/381213?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;philss/floki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Floki is a simple HTML parser that enables search for nodes using CSS selectors.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Go &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/avelino/awesome-go&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/31996?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;avelino/awesome-go&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A curated list of awesome Go frameworks, libraries and software &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cuducos/minha-receita&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/4732915?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cuducos/minha-receita&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Sua API web para consulta de informações do CNPJ da Receita Federal &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/globocom/huskyci&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://huskyci.opensource.globo.com/img/logo.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;globocom/huskyci&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Orquestrador de testes de segurança no CI&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gofn/gofn&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/25033801?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gofn/gofn&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Function process via docker provider (serverless minimalist)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/goreleaser/goreleaser&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24697112?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;goreleaser/goreleaser&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Deliver Go binaries as fast and easily as possible&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/larien/learn-go-with-tests&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/29347337?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;larien/learn-go-with-tests&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tradução do livro de @quii sobre aprender Go com desenvolvimento orientado a testes&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/robertoduessmann/weather-api&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/9089383?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;robertoduessmann/weather-api&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A RESTful API to check the weather&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rodrigo-brito/gocity&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/44341229?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rodrigo-brito/gocity&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Code City metaphor for visualizing Go source code in 3D&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; JavaScript &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/Coderockr/vitrine-social&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/846756?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Coderockr/vitrine-social&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O classificado de doações&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/IgorRozani/filosofunk&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/802968?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;IgorRozani/filosofunk&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto com o intuito de juntar frases engraçadas, divertidas, filosóficas ou criativas de músicas de funk.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/MinisterioPublicoRJ/inloco&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/27096918?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;MinisterioPublicoRJ/inloco&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A Geographic Information System (GIS) used by Ministério Público do Estado do Rio de Janeiro to show social, institutional and administrative data , based on React and Leaflet, interacting with a GeoServer back-end. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/RocketChat/Rocket.Chat&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12508788?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;RocketChat/Rocket.Chat&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The ultimate Free Open Source Solution for team communications.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alexanmtz/material-sense&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/88840?s=60&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alexanmtz/material-sense&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A full simple application for react material ui&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/eguatech/egua&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/54448514?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;eguatech/egua&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem de Programação Egua&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/doom-fire-algorithm&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/4248081?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/doom-fire-algorithm&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Playground for the fire effect from DOOM. Really simple algorithm and all experiments are welcome!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/video-maker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/4248081?v=4&amp;amp;size=200&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/video-maker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto open source para fazer vídeos automatizados.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/herbsjs/herbs-cli&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://herbsjs.org/img/logo-herbsjs.svg&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;herbsjs-cli&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A CLI ajuda a acelerar seu ciclo de desenvolvimento com HerbsJS gerando casos de uso e camadas de infraestrutura (REST, GraphQL, Repositórios, etc) com base em suas entidades.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/herbsjs/herbs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://herbsjs.org/img/logo-herbsjs.svg&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;herbsjs-core&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Pare de gastar tempo com código redundante e de baixo impacto. Codifique seu domínio primeiro usando Herbs e a infraestrutura necessária será gerada na hora.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/OCDots&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/ocdots&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;OCDots is a javascript library for creating evenly distributed points inside a polygon. Check out the demo at https://luxedo.github.io/OCDots/&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/monumentum/astronode&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/32710755?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;monumentum/astronode&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Exporting mongoose model as rest endpoints&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mvfsillva/dialetus-service&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/4579340?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mvfsillva/dialetus-service&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API to Informal dictionary for the idiomatic expressions that each Brazilian region It has&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/perfil-politico-frontend&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/perfil-politico-frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Front-end that consumes Perfil Político&apos;s API&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-FilaDaCreche&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-FilaDaCreche&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rafaelcastrocouto/foda&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/422159?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rafaelcastrocouto/foda&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;You are at FODA source code. Play now for free https://foda.app&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/origami.js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/origami.js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Powerful and Lightweight Library to create using HTML5 Canvas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/react-ape&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/react-ape&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;• [Work in Progress] React Renderer to build UI interfaces using canvas/WebGL&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/react-tv&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/react-tv&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;[Looking for maintainers] React development for TVs (Renderer for low memory applications and Packager for TVs) &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/klefki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/klefki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple substitution cipher module. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/redis-session-storage&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/redis-session-storage&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Node App Storage sessions with redis.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/simonardejr/matador-de-monstros&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3685303?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;simonardejr/matador-de-monstros&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Minigame feito em Vue&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/thamara/time-to-leave&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/846063?s=120&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;thamara/time-to-leave&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Log work hours and get notified when it&apos;s time to leave the office and start to live.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/withmoney/withmoney-mobile&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/44231290?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;withmoney/withmoney-mobile&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;This is a mobile project for financial management, with vue.js.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/yanmagale/narigajs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/5148042?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;yanmagale/narigajs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; WIP. A node module that reports about air quality in a region&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zenorocha/clipboard.js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/398893?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zenorocha/clipboard.js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Modern copy to clipboard. No Flash. Just 3kb gzipped.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zeucxb/dymock&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/11702749?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zeucxb/dymock&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A CLI to simplify the way you create dynamics mocks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Julia &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JSONWebTokens.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JSONWebTokens.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Secure your Julia APIs with JWT. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JuliaPackageWithRustDep.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JuliaPackageWithRustDep.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Example of a Julia Package with Rust dependency.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/Mongoc.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/Mongoc.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;MongoDB driver for the Julia Language &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Kotlin &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/ftwfy&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/ftwfy&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The real life Command/Ctrl + F - Android App that uses the Mobile Vision API to allow you to search for any occurrence of a text using your camera&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/lmgtfyGen&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/lmgtfyGen&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Lmgtfy Generator Open Source Android App - built to learn Kotlin, MVP architecture, Dagger and Rx&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Lua &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cuducos/yaml.nvim&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/4732915?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cuducos/yaml.nvim&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;YAML toolkit for Neovim users&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; PHP &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PHPJasper/phpjasper&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/27956258?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PHPJasper/phpjasper&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A PHP report generator &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/RamonSilva20/mapos&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12385697?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;RamonSilva20/mapos&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Sistema de Controle de Ordens de Serviço&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/comuREDE/core&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/14811323?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;comuREDE/core&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Back e frontend com sensor autônomo / Back and frontend with standalone sensor &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/corcel/corcel&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://camo.githubusercontent.com/6cfc6b23889643f4438a4da4ab4de7398da9337f/68747470733a2f2f692e696d6775722e636f6d2f66484d717754462e706e67&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;corcel/corcel&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A collection of Model classes that allows you to get data directly from a WordPress database.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gabrnunes/orbita&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/gabrnunes.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gabrnunes/orbita&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Plugin de Wordpress para criar um Hacker News-like para o ManualdoUsuario.net&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/laraerp/laraerp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10065592?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;laraerp/laraerp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ERP brasileiro de código fonte aberto escrito em PHP utilizando o Laravel Framework&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/openboleto/openboleto&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/33834590?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;openboleto/openboleto&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Biblioteca para geração de boletos bancários em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/paulohenriquenj/crudificator&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1184825?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;paulohenriquenj/crudificator&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Gerador de Cruds em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/portabilis/i-educar&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/721282?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;portabilis/i-educar&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Lançando o maior software livre de educação do Brasil!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Pearl &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GouveaHeitor/nipe&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/10741284?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GouveaHeitor/nipe&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Nipe is a script to make Tor Network your default gateway.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Python &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DadosAbertosDeFeira/analises&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/57175538?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DadosAbertosDeFeira/analises&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para abrigar as análises dos Dados Abertos de Feira. A coleta é feita pela Maria Quitéria.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DadosAbertosDeFeira/maria-quiteria&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/57175538?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DadosAbertosDeFeira/maria-quiteria&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um projeto para libertar dados do município de Feira de Santana.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GabrielRF/RastreioBot&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/7331540?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GabrielRF/RastreioBot&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Telegram Bot @RastreioBot &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/JVictorDias/Dinossauro-Google&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/32246598?v=4&amp;amp;size=200&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;JVictorDias/Dinossauro-Google&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto onde várias Redes Neurais competem para aprender a jogar o jogo do dinossauro no navegador Google Chrome.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/Liebelts/Gordura_Simulator&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/42952107?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Liebelts/Gordura_Simulator&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um jogo de gordura sendo feito no Python 3. Envie bugs e ideias.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/allisson/python-simple-rest-client&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/5202?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;allisson/python-simple-rest-client&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple REST client for python 3.5+ &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/mre&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10817238?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/maker-regular-expressions&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório de um pacote simples para fazer expressões regulares em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/python-adt-extension&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10817238?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/python-adt-extension&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python abstract data structure (ADT) extension.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/validate-docbr&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/10817238?s=60&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/validate-docbr&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Pacote Python para validação de documentos brasileiros.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anapaulagomes/pytest-picked&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1899950?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anapaulagomes/pytest-picked&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Run the tests related to the changed files (according to Git)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ayr-ton/kamu&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1090517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ayr-ton/kamu&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;You favorite book library&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/berinhard/pyp5js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/238223?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;berinhard/pyp5js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python to P5.js Transcriptor&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cobrateam/splinter&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/403905?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cobrateam/splinter&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;splinter - python test framework for web applications&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cuducos/calculadora-do-cidadao&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/4732915?s=120&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cuducos/calculadora-do-cidadao&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tool for Brazilian Reais monetary adjustment/correction&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/sentry-patrol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/sentry-patrol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Command line interface for Sentry API &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/tapioca-jarbas&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/tapioca-jarbas&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tapioca wrapper for jarbas api &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/georgeyk/loafer&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/247603?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;georgeyk/loafer&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Asynchronous message dispatcher - Currently using asyncio and amazon SQS&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gilsondev/django-rest-localflavor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/265653?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gilsondev/django-rest-localflavor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Country-specific Django helpers, to use in Django Rest Framework &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/grupyrn/jararaca&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6994159?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;grupyrn/jararaca&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;GruPy-RN Event and Check-in System&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/internetlab-br/Twitter-Bots&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/40776372?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;internetlab-br/Twitter-Bots&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos utilizados para pesquisar sobre bots em perfis do Twitter &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/italomaia/flask-empty&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/14670?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;italo-maia/flask-empty&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An empty project skeleton / boilerplate for flask projects. Powered by CookieCutter. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/autogenfiles&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6595551?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jtemporal/autogenfiles&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Automatically generate files from templates&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/caipyra&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6595551?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jtemporal/caipyra&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;import caipyra module code&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/juditecypreste/PyRoles&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/36239583?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;juditecypreste/PyRoles&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Este é um bot no Telegram que faz upload automático de todas as fotos dos rolês que rolaram durante a PyBR!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lamenezes/simple-model&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3208493?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lamenezes/simple-model&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;data handling made easy &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luanfonceca/speakerfight&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1490875?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luanfonceca/speakerfight&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The Easier way to choose the best talks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/fakeRPiGPIO&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/fakerpigpio&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Fake RPi.GPIO module for testing&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/picamip&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/picamip&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python simple Raspberry-Pi camera module web interface&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/manipuladordedados/pdiary&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1189862?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;manipuladordedados/pdiary&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A simple terminal-based diary journal application written in Python. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mari-linhares/tensorflow-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/8157164?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mari-linhares/tensorflow-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos e materiais sobre TensorFlow em Português &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/odufrn/odufrn-api-py&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/52975911?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;odufrn/odufrn-api-py&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Wrapper da API da UFRN em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/perfil-politico&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/perfil-politico&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A platform for profiling public figures in Brazilian politics&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario-toolbox&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario-toolbox&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;This project empowers people who want to process the data in the context of Querido Diário to run their own analyses&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Brazilian government gazettes, accessible to everyone&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/serenata-de-amor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/serenata-de-amor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🕵 Artificial Intelligence for social control of public administration&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/serenata-toolbox/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/serenata-toolbox&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;pip module containing code shared across Serenata de Amor&apos;s projects&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/osantana/dicteval&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/160418?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;osantana/dicteval&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Evaluate expressions in dict/json objects&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/plenario/plenario&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/30255828?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;plenario/plenario&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-API&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-API&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Editor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Editor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; Plataforma de edição de cardápios da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pyladies-brazil/br-pyladies-pelican&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/8205116?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pyladies-brazil/br-pyladies-pelican&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site PyLadies Brasil usando Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/associados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/associados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Controle de associados a Associação PythonBrasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/planet&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/planet&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repo público para atualização da lista de sites do Planet PythonBrasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/wiki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/wiki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site python.org.br estático com Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rochacbruno/dynaconf&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/rochacbruno/dynaconf/raw/master/docs/img/logo_400.svg&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rochacbruno/dynaconf&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Configuration Management for Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rougeth/bottery&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/431892?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rougeth/bottery&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A bot framework with batteries included &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/thaisviana/AlgPedia&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1753143?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;thaisviana/AlgPedia&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto Final da Thata e do Tchotcho &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Ruby &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anonydog/anonydog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24738062?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anonydog/anonydog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;On the internet, nobody knows you&apos;re a dog &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/campuscode/rails-guides-pt-BR&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/10028214?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;campuscode/guia-rails-pt-br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tradução do guia oficial de Ruby on Rails para pt-BR&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/juuh42dias/transervicos&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1828204?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;juuh42dias/transervicos&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Plataforma de empregos para pessoas Trans.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luxedo/jekyll-theme-potato-hacker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/14118472?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luxedo/jekyll-theme-potato-hacker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A Jekyll theme based on hackers and potatoes&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/railsgirls/guides-ptbr&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1641104?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;railsgirls/guides-ptbr&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Rails Girls Guides - Brazilian Portuguese / Tutoriais Rails Girls - Português Brasileiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Scala &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/potigol/potigol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1438144?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;potigol/potigol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem Potigol - Linguagem de programação funcional moderna para iniciantes - A Functional Programming Language for Beginners &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Shell &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/hemilioaraujo/Linux-Commands&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/28680369?s=400&amp;amp;u=547852267ebf487736da8ded44c916c53d1d37f4&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;hemilioaraujo/Linux-Commands&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um conjunto de comandos para terminal Linux.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-plataforma-curriculo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-plataforma-curriculo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; TypeScript &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brazilian-utils/brazilian-utils&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40146460?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brazilian-utils/brazilian-utils&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Utils library for specific Brazilian businesses&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/doczjs/docz&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/39714731?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;doczjs/docz&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;✍🏻It has never been so easy to document your things!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gabrnunes/tem-crase&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/gabrnunes.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gabrnunes/tem-crase&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O temcrase é uma ferramenta simples que verifica a frase que você digitou e responde se tem crase ou não.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/middy-idempotent&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/middy-idempotent&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🛵 📬 ‎‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎Idempotence Middy middleware for your AWS Lambdas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/middy-recaptcha&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/middy-recaptcha&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🛵 🔐 ‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎reCAPTCHA validation Middy middleware for yours AWS Lambdas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/react-lite-youtube-embed/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/react-lite-youtube-embed&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;📺 ‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎&amp;lt; A private by default, faster and cleaner YouTube embed component for React applications /&amp;gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario-frontend/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario-frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório com a implementação do frontend da Plataforma de Busca do Querido Diário&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Frontend&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Website que permite à população acompanhar o cardápio das escolas públicas de São Paulo.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/unform/unform&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/69817179?sv=4&amp;amp;size=200&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;unform/unform&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ReactJS form library to create uncontrolled form structures with nested fields, validations and much more!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Variados &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pizzadedados/pizzadedados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/40184305?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/PizzaDeDados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório do podcast Pizza de Dados - O podcast Brasileiro sobre ciência de dados&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PizzaDeDados/datascience-pizza&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40184305?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/datascience-pizza&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para juntar informações sobre materiais de estudo em análise de dados e áreas afins, empresas que trabalham com dados e dicionário de conceitos&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pyladiesrecife/site&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/pyladiesrecife/site/main/img/pyladies-rec.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PyLadiesRecife/SiteDoPyladiesRecife&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório voltado para constribuições das pessoas PyLadies para criação do site da comunidade PyLadies Recife.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/VacaRoxa/gamedev4noobs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/36037965?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Vacaroxa/GameDev4Noobs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O propósito desse repositório, além de contribuir para o projeto 4noobs, é ensinar o básico do desenvolvimento de jogos para iniciantes e democratizar o conhecimento nesta área. Apresentando boas práticas e insumos para criar games incríveis.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/basedosdados/mais&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/71097635?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;basedosdados/mais&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Desenvolvimento de pacotes de acesso ao nosso datalake público em diversas linguagens (Python, R, Scala, Julia). O projeto faz parte da Base dos Dados, uma organização sem fins lucrativos com a missão e universalizar o acesso a dados de qualidade para todes.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/bellesamways/studynotes&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/38008212?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;bellesamways/studynotes&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para armazenar todas as anotações de cursos feitos para minha própria consulta ou de outros.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brasil-php/blog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/17454678?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brasil-php/blog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para agregar posts do grupo do Telegram&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/codamos/codamos.github.io/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/16601405?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;codamos/codamos.github.io&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para o site Codamos, que reune eventos, palestras, workshops etc pelo Brasil inteiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/feministech/pessoas-streamers-feministech&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/68646156?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;feministech/pessoas-streamers-feministech&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório com as pessoas streamers da comunidade Feministech&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/globocom/secdevlabs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/globocom/secDevLabs/raw/master/images/secDevLabs-logo.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;globocom/secdevlabs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um laboratório para aprender segurança web e mobile de uma maneira prática.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/estrutura-e-interpretacao-de-programas-de-computador-javascript&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/estrutura-e-interpretacao-de-programas-de-computador-javascript&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;λ — Tradução em pt-br de &quot;Structure and Interpretation of Computer Programs — JavaScript Adaptation&quot;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/inspiradanacomputacao/tecnologistas-contra-bolsonaro&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/11424181?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;inspiradanacomputacao/tecnologistas-contra-bolsonaro&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório com Manifesto e Assinaturas de pessoas tecnologistas contra Bolsonaro.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ocarneiro/para-entender-a-internet&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/2953926?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ocarneiro/para-entender-a-internet&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Videos e memes obrigatórios para conversas do dia-a-dia &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/react-brasil/empresas-que-usam-react-no-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16929016?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;react-brasil/empresas-que-usam-react-no-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório que mostra empresas e projetos que utilizam React no Brasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/walterfcarvalho/advpl-xlsxtocsv&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/11591494?s=460&amp;amp;u=41649eaf2caa648c59d2fcb157f573c3f210ad79&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;walterfcarvalho/advpl-xlsxtocsv&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Once the language ADVPL doen&apos;t have a tool to read xlsx files directly, I did this source to unable the user read and convert one xlsx file to an array&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/yaiks/vite-docs-pt-br&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/34862686?s=96&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;yaiks/vite-docs-pt-br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para tradução da documentação oficial do vite&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

</description>
        <pubDate>Sat, 01 Oct 2022 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/projetos-brasileiros-para-contribuir-hacktoberfest-2022/</link>
        <guid isPermaLink="true">https://jtemporal.com/projetos-brasileiros-para-contribuir-hacktoberfest-2022/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contribuitions</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>How to create a new collection in MongoDB by joining two collections</title>
        <description>&lt;p&gt;If you use MongoDB, you probably understand all there’s to know about it, so I recommend you skip this blog post here, but if you are starting with MongoDB, see this blog post as a gentle introduction 😉.&lt;/p&gt;

&lt;h2 id=&quot;before-starting&quot;&gt;Before starting&lt;/h2&gt;

&lt;p&gt;This blog post assumes you already have an account set up with MongoDB. Remember that if you don’t have one yet, &lt;a href=&quot;https://www.mongodb.com/cloud/atlas/register&quot;&gt;you can create one for free here&lt;/a&gt;, and MongoDB has a free tier you can set up while creating your account.&lt;/p&gt;

&lt;p&gt;You’ll be using the sample data from MongoDB to learn how to do an aggregation and create a new collection.&lt;/p&gt;

&lt;h2 id=&quot;getting-acquainted-with-the-data&quot;&gt;Getting acquainted with the data&lt;/h2&gt;

&lt;p&gt;In Mongo, a dataset is called a &lt;em&gt;collection&lt;/em&gt;; think of it as a special spreadsheet. Whereas the records in a spreadsheet are lines, in MongoDB, a record is called a &lt;em&gt;document&lt;/em&gt;. You’ll use the collection &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sample_mflix&lt;/code&gt; that contains movies, comments, users, etc.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mongodb/sample-data-mongodb-mflix.webp&quot; alt=&quot;Sample data information from MongoDB&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;make-a-basic-filter&quot;&gt;Make a basic filter&lt;/h2&gt;

&lt;p&gt;Your objective is to create a collection containing all the comments each movie received in August 2002.&lt;/p&gt;

&lt;p&gt;Start by going into the project’s database. My project is called “Project 0” and has the “Example” database comprising three databases and 15 collections.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mongodb/02-my-project-details-in-mongodb.webp&quot; alt=&quot;project details in the mongo database&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Each project has a set of tabs, one of which is the “Collections” tab, where you can see the databases and the documents in each collection, as shown in the image above. From within the Collections tab, you can see the data and make simple queries if you want.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{date: {$gte:ISODate(&apos;2002-08-18&apos;)}}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For example, the query above shows every document with a date value later than August 18th, 2002.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mongodb/03-simple-filter-query-mongodb.webp&quot; alt=&quot;simple filter result&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Using queries like that is great to see the preliminary results of the collection you are trying to build. But to actually create the collection, we need to use &lt;em&gt;aggregations&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;constructing-the-aggregation&quot;&gt;Constructing the aggregation&lt;/h2&gt;

&lt;p&gt;Aggregations are one way you can build collections inside MongoDB, and there’s a tab for that, as shown in the image below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mongodb/04-aggregation-tab-for-mflix-comments.webp&quot; alt=&quot;Aggregation tab on the collection&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To see the Aggregation tab, you need to click on the collection you want to investigate or use as the basis for your new collection. On the aggregation tab, you’ll see the pipeline builder. A pipeline is a set of steps; each step is called a stage; each stage does one thing and one thing only. You will do three stages:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Filter comments based on a date;&lt;/li&gt;
  &lt;li&gt;Add the movie’s details into each comment;&lt;/li&gt;
  &lt;li&gt;Output the results into a brand new collection.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;filter-comments&quot;&gt;Filter comments&lt;/h3&gt;

&lt;p&gt;To avoid dealing with unnecessary data, that is, data outside of your interest date window, the first thing you’ll want to do is find the comments in that particular period (August 2002).&lt;/p&gt;

&lt;p&gt;On the drop-down menu for the first stage, select the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$match&lt;/code&gt; operator; this operator will allow you to filter the records based on the date. Note that once you select the operator, Mongo will auto-populate the editable field with the standard structure for that operator.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mongodb/05-match-operator-pre-filled-on-aggregation-stage.webp&quot; alt=&quot;First stage: $match operator selection&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now you need to add the following code in the query section there:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/056a2fad3d8c3c2339f2f0f0fe26f80d.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Once that is done, you’ll see that the sample result will start displaying.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mongodb/06-preliminary-results-match-operator.webp&quot; alt=&quot;first stage $match operator sample results&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now let’s break down each step of that operation, shall we?&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;em&gt;Lines 1-4&lt;/em&gt;: Just comments, mainly to explain what the operator is. Note that MQL stands for MongoDB Query Language;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Lines 6&lt;/em&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;date:&lt;/code&gt;): corresponds to the field you want to use to filter your date;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Line 7&lt;/em&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$gte:ISODate(&quot;2002-08-01&quot;)&lt;/code&gt;): this line uses the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$gte&lt;/code&gt; operator to grab all dates after the date returned in ISODate format;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Line 8&lt;/em&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$lt:ISODate(&quot;2002-08-31&quot;)&lt;/code&gt;): this line uses the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$lt&lt;/code&gt; operator to grab all dates before the date returned in ISODate format.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This operator result will be &lt;em&gt;all the documents between August 1st and August 31st 2002&lt;/em&gt;.&lt;/p&gt;

&lt;h3 id=&quot;adding-movie-information-to-each-comment&quot;&gt;Adding movie information to each comment&lt;/h3&gt;

&lt;p&gt;You’ll notice that the comments don’t have the movie information, but the movie identification number (ID) is present, as shown in the image below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mongodb/07-one-comment-record-from-mongodb.webp&quot; alt=&quot;One comment document without the movie information&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Including the movie information in the filtered comments you just got from the first stage is the second step of our aggregation. Click the “Add stage” button below the first stage to start working on adding the movie information to the collection using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$lookup&lt;/code&gt; operator.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$lookup&lt;/code&gt; operator does a “left outer join”. Think of it as a “filtered join”. Based on the collection on the “left” (comments), select the documents on the “right” (movies) that match a given field in both, in this case, the movie id. This way, we don’t have to care about removing movies without comments, but all comments from the time window.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mongodb/08-lookup-stage-added-pre-filled.webp&quot; alt=&quot;pre-filled lookup stage&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On the drop-down menu for the second stage, select the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$lookup&lt;/code&gt; operator, as shown in the image above. Once again, Mongo will pre-fill the operator sample code, and you can update the code section with the code below.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/43336d966c612007b68bb304d6ccb9e9.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Once more, let’s break down each step of that operation:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;em&gt;Lines 1-9&lt;/em&gt;: Just comments, mainly to explain what the operator is;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Line 11&lt;/em&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from: &quot;movies&quot;,&lt;/code&gt;): Since the left side in the dashboard is the collection from which you are running the pipeline, this is where you define the “right” side of the join, so you chose the “movies” collection to add the movie information into the comments;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Line 12&lt;/em&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localField: &quot;movie_id&quot;,&lt;/code&gt;): the field on the current collection (comments) that correspond to a field in the other (movies) collection;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Line 13&lt;/em&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;foreignField: &quot;_id&quot;,&lt;/code&gt;): the field on the other collection;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Line 14&lt;/em&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as: &quot;movie_info&quot;&lt;/code&gt;): the field name to add information in, note that the lookup will add the information as an array.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And you should see the results show up like in the image below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mongodb/09-preliminary-results-lookup-operator.webp&quot; alt=&quot;New stage with the $lookup operator premliminary results&quot; /&gt;&lt;/p&gt;

&lt;p&gt;All the data manipulation is done. Time to save the results and actually create your new collection.&lt;/p&gt;

&lt;h3 id=&quot;save-the-results&quot;&gt;Save the results&lt;/h3&gt;

&lt;p&gt;Once again, click the “Add stage” button to create a stage that outputs the result into a new collection, and on the drop-down menu for the third stage, select the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$out&lt;/code&gt; operator.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mongodb/10-pre-filled-out-operator.webp&quot; alt=&quot;New stage with the $out operator pre-filled&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now update the code in the code field in the out section with the code below.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/84f28ec4d148c83c627b0c9642378e13.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Let’s break down this part.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;em&gt;Lines 1-4&lt;/em&gt;: Just comments, mainly to explain what the operator is;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Line 5&lt;/em&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;augustmoviescomments&apos;&lt;/code&gt;): is the name for the new collection;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After filling out the new collection’s name, you should click the “Save documents” button.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mongodb/11-out-operator-with-save-documents-button.webp&quot; alt=&quot;Out operator filled with the correct code&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Once the collection is created (it might take a few seconds), you’ll see a message stating that documents were persisted in the collection and a “Go to collection” link that you should click.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mongodb/12-out-operator-saved-documents.webp&quot; alt=&quot;Documents persisted note&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Clicking the “Go to collection” link will open a new tab. If you do not want to see another tab, refresh the page, and you’ll see the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;augustmoviecomments&lt;/code&gt; show up on the left-hand side menu.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mongodb/13-final-collection-result.webp&quot; alt=&quot;New collection details&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now that your collection is ready, you can see the collection analytics data, like how many activities were logged and how much space that takes into our storage.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;Now you know how to create collections by aggregating two other collections using pipelines. You also know:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Datasets in MongoDB are called collections;&lt;/li&gt;
  &lt;li&gt;One collection is a set of documents;&lt;/li&gt;
  &lt;li&gt;To create collections by joining other collections, you can use pipelines;&lt;/li&gt;
  &lt;li&gt;Pipelines are a set of steps called stages;&lt;/li&gt;
  &lt;li&gt;Each stage does only one thing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now you can explore what else to use pipelines for.&lt;/p&gt;
</description>
        <pubDate>Tue, 27 Sep 2022 08:00:00 +0000</pubDate>
        <link>https://jtemporal.com/agregating-data-on-mongodb/</link>
        <guid isPermaLink="true">https://jtemporal.com/agregating-data-on-mongodb/</guid>
        
        <category>tutorial</category>
        
        <category>English</category>
        
        <category>mongodb</category>
        
        <category>atlas</category>
        
        <category>mongodb atlas</category>
        
        <category>collections</category>
        
        <category>aggregations</category>
        
        
      </item>
    
      <item>
        <title>Let&apos;s talk about JWT</title>
        <description>&lt;p&gt;First talk at PyCon US was amazing. If you missed it or need a recap, here it is:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/JyvJYkbzBNc&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Sat, 30 Apr 2022 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/let-s-talk-about-jwt/</link>
        <guid isPermaLink="true">https://jtemporal.com/let-s-talk-about-jwt/</guid>
        
        <category>english</category>
        
        <category>jwt</category>
        
        <category>talk</category>
        
        
      </item>
    
      <item>
        <title>Como é se preparar para palestrar pela primeira vez num evento tech presencial</title>
        <description>&lt;p&gt;Se nada mais, compartilhar conhecimento é uma experiência feliz. Pense na primeira vez que você aprendeu a fazer algo. Que &lt;em&gt;realmente&lt;/em&gt; aprendeu. Não foi incrível? Você não queria contar para todo mundo e ver a reação das pessoas quando vissem aquela coisa massa?&lt;/p&gt;

&lt;p&gt;Eu sei que sim. Esse é o mesmo sentimento que tenho em mente quando estou criando um novo conteúdo, seja um artigo pro blog, um vídeo, um episódio de podcast ou uma nova palestra. É sempre a mesma coisa. Eu quero compartilhar essa coisa legal com qualquer pessoa que queira ouvir.&lt;/p&gt;

&lt;p&gt;O problema é que, nos últimos dois anos, tenho falado para uma câmera. Eu tive que mudar a interação e as perguntas que eu normalmente fazia para o público ninguém poderia responder. Claro que tinha os chats, mas não era a mesma coisa, e tudo bem, mas sinto falta da troca. É como falar com o vazio e nunca obter uma resposta de volta.&lt;/p&gt;

&lt;p&gt;Eu tinha esquecido como acontece a antecipação com a felicidade antes da viagem. Planejar a palestra, preparar a mala, fazer uma anotação mental para imprimir cartas de convite, pegar o passaporte e assim por diante.&lt;/p&gt;

&lt;p&gt;Depois de dois anos, poderei fazer perguntas e ver a luz acender no rosto das pessoas quando elas chegarem a uma conclusão que desejam compartilhar.&lt;/p&gt;

&lt;p&gt;Pela primeira vez em muito tempo, farei as perguntas e haverá pessoas lá para de fato responder. É ótimo saber que não estarei mais falando apenas para uma câmera.&lt;/p&gt;

&lt;p&gt;Se você dá palestra em eventos, pode não sentir pronto ou pronta para voltar à estrada ainda, e tudo bem. Leve o seu tempo e não se apresse. É difícil mudar hábitos de dois anos.&lt;/p&gt;

&lt;p&gt;Mas, à medida que o mundo entra em um ritmo pós-pandêmico de nova normalidade, lembre-se de como se sentiu quando você compartilhou aquela coisa legal com outros seres humanos. Se prenda nisso para quando quiser voltar à estrada. Tenho certeza que será ótimo.&lt;/p&gt;
</description>
        <pubDate>Sun, 24 Apr 2022 01:34:34 +0000</pubDate>
        <link>https://jtemporal.com/como-e-se-preparar-para-palestrar-pela-primeira-vez-num-evento-tech-presencial/</link>
        <guid isPermaLink="true">https://jtemporal.com/como-e-se-preparar-para-palestrar-pela-primeira-vez-num-evento-tech-presencial/</guid>
        
        <category>pessoal</category>
        
        <category>português</category>
        
        <category>portugues</category>
        
        <category>pt</category>
        
        
      </item>
    
      <item>
        <title>What does getting ready for the first time speaking in person at a tech conference feels like</title>
        <description>&lt;p&gt;If nothing else, sharing knowledge is a joyful experience. Think of the first time you learned to do something. Really learned. Didn’t it feel amazing? Didn’t you want to tell everyone and see their reactions when they saw that cool thing?&lt;/p&gt;

&lt;p&gt;I know I did. This is the same feeling I have in mind when I’m creating a new piece of content, be it a blog post, a video, a podcast episode, or a new talk. It is always the same. I want to share this cool thing with anyone that will listen.&lt;/p&gt;

&lt;p&gt;The thing is, for the past two years, I’ve been talking to a camera. I had to change the interaction and questions to the crowd into questions that nobody could answer back. Sure there were chats, but it wasn’t the same thing, and that is okay, but I miss the exchange. It feels like talking to the void and never getting an answer back.&lt;/p&gt;

&lt;p&gt;I had forgotten how the build-up of happiness goes right before the trip. Planning the talk, getting the suitcase ready, making a mental note to print invitation letters, grabbing the passport, and so on.&lt;/p&gt;

&lt;p&gt;After two years, I’ll be able to ask questions and see the people’s faces light up when they arrive at a conclusion they want to share.&lt;/p&gt;

&lt;p&gt;For the first time in forever, I’ll ask the questions, and there will be people there to actually answer. It feels great to know that I won’t be only talking to a camera anymore.&lt;/p&gt;

&lt;p&gt;If you talk at events, you may not be ready to get back on the road just yet, and that’s okay. Take your time, and don’t rush it. It is hard to change two years’ worth of habits.&lt;/p&gt;

&lt;p&gt;But as the world falls into a post-pandemic rhythm of new normalcy, remember what it felt like when you shared that cool thing with other humans. Hold on to that for when you are ready to get back on the road. I’m sure it will be great.&lt;/p&gt;
</description>
        <pubDate>Sun, 24 Apr 2022 01:33:34 +0000</pubDate>
        <link>https://jtemporal.com/what-does-getting-ready-for-the-first-time-speaking-in-person-at-a-tech-conference-feels-like/</link>
        <guid isPermaLink="true">https://jtemporal.com/what-does-getting-ready-for-the-first-time-speaking-in-person-at-a-tech-conference-feels-like/</guid>
        
        <category>pessoal</category>
        
        <category>English</category>
        
        
      </item>
    
      <item>
        <title>Vamos falar sobre JWT</title>
        <description>&lt;p&gt;Você consegue conferir a palestra na íntegra aqui:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/rG_2ApMMT1A?start=923&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Thu, 31 Mar 2022 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/vamos-falar-sobre-jwt/</link>
        <guid isPermaLink="true">https://jtemporal.com/vamos-falar-sobre-jwt/</guid>
        
        <category>portugues</category>
        
        
      </item>
    
      <item>
        <title>Primeiro ano sendo uma Developer Advocate 🥑</title>
        <description>&lt;p&gt;Antes de trabalhar com DevRel, eu pagava as contas sendo uma cientista de dados. Hoje eu posso dizer que troquei a ciência de dados para trabalhar em &lt;em&gt;developer relations&lt;/em&gt; com sucesso já que atingi a marca de 1 um ano trabalhando como &lt;em&gt;Developer Advocate&lt;/em&gt;! 🎉&lt;/p&gt;

&lt;center&gt;&lt;img style=&quot;max-width: 70%;&quot; src=&quot;/images/166827422_515510042769353_3494362086546822067_n.webp&quot; /&gt;
&lt;br /&gt;  &lt;br /&gt;
&lt;i&gt;Eu no primeiro dia de trabalho oficial em Março de 2021&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Por isso achei que seria interessante escrever sobre os aprendizados deste ano e compartilhar isso com você que está lendo. Um pequeno aviso: esse texto é um pouco longo, então sente-se confortavelmente. 😉&lt;/p&gt;

&lt;h2 id=&quot;o-que-eu-costumava-fazer-antes-de-ser-contratada-como-uma-developer-advocate&quot;&gt;O que eu costumava fazer antes de ser contratada como uma Developer Advocate&lt;/h2&gt;

&lt;p&gt;Um pouquinho de história antes de mergulhar nos aprendizados já que, talvez você não me conheça ou saiba com o que eu trabalhava antes.&lt;/p&gt;

&lt;p&gt;Há algum tempo, eu costumava trabalhar como cientista de dados. No primeiro emprego que tive, eu cheguei a apresentar mais de 13 palestras sobre o projeto em que eu trabalhava, chamado de Serenata. Incluindo uma palestra em Taiwan, tudo isso em menos de um ano. O Serenata, é um projeto de tecnologia cívica e de código aberto que dependia de nós, pessoas desenvolvedoras e cientistas de dados, para espalhar a palavra sobre esse projeto para que ele pudesse prosperar.&lt;/p&gt;

&lt;center&gt;&lt;img style=&quot;max-width: 60%;&quot; src=&quot;/images/31909575_955979771244859_4044473679331983360_n.webp&quot; /&gt;
&lt;br /&gt;  &lt;br /&gt;
&lt;i&gt;Eu apresentando sobre Rosie, AI do Serenata, num Meetup lá em 2017&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Além de apresentar palestras em vários eventos e conhecer muitas pessoas, também criamos muito conteúdo técnico para tornar o projeto mais acessível para quem não tem o conhecimento para ler e entender código. Você &lt;a href=&quot;https://serenata.ai/&quot;&gt;pode conferir a página do projeto aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mais ou menos na mesma época, eu também criei com amigos o &lt;a href=&quot;http://pizzadedados.com/&quot;&gt;Pizza de Dados&lt;/a&gt;, o primeiro e mais querido podcast sobre ciência de dados do Brasil. Compartilhar conhecimento em vários formatos virou uma paixão. Eu amo dar palestras, ministrar tutoriais, falar com pessoas e ajudá-las.&lt;/p&gt;

&lt;p&gt;Acontece que isso tudo é grande parte de ser uma &lt;em&gt;developer advocate&lt;/em&gt;. Eu só não sabia disso naquela época. Veja bem, isso foi por volta de 2017, nós estamos agora em 2022, e &lt;em&gt;developer relations&lt;/em&gt; ainda é algo muito novo no Brasil, então imagina como não era lá em 2017.&lt;/p&gt;

&lt;h2 id=&quot;o-que-é-developer-relations-ou-developer-advocacy&quot;&gt;O que é Developer Relations ou Developer Advocacy?&lt;/h2&gt;

&lt;p&gt;Acho que a primeira pergunta que me fazem quando digo que sou uma &lt;em&gt;developer advocate&lt;/em&gt; é &lt;em&gt;“developer o quê?”&lt;/em&gt;. As pessoas geralmente não entendem logo de cara. &lt;em&gt;Developer advocacy&lt;/em&gt; é algo tão novo que nem tem um nome oficial em Português, mas se vê sendo chamado de Evangelismo às vezes.&lt;/p&gt;

&lt;p&gt;Por isso, não me surpreende quando as pessoas não entendem o que eu faço apenas dizendo o nome do meu cargo, mas com certa frequência rola um entendimento quando eu explico o que eu faço. Sempre rola um &lt;em&gt;“ah, sim, combina com você”&lt;/em&gt;, especialmente se a pessoa conhece a minha participação nas comunidades de tecnologia.&lt;/p&gt;

&lt;p&gt;Se você não sabe o que é DevRel, aqui está a breve descrição: Faço amizade com pessoas que desenvolvem para ajudá-las a entender tópicos complexos e trabalhar com mais eficiência. Agora, existem muitas maneiras de você alcançar esse objetivo, eu faço isso dando palestras, escrevendo artigos em blogs, vídeos, podcasts, etc.&lt;/p&gt;

&lt;p&gt;Você pode estar se perguntando por que eu digo que “&lt;em&gt;faço amizade”&lt;/em&gt;, certo? Bem, eu gosto de descrever dessa maneira porque as pessoas tendem a pedir ajuda a &lt;em&gt;seus amigos e amigas&lt;/em&gt;, e esse é o meu objetivo maior, ser alguém que qualquer pessoa pode pedir ajuda, especialmente quando se fala de criar e manter software.&lt;/p&gt;

&lt;p&gt;Palestras, tutoriais escritos, workshops, podcasts, vídeos e assim por diante, são apenas uma parte do processo de ser uma developer advocate. A parte que as pessoas costumam ver. Há também a outra parte, a parte em que você tem que fazer relatórios sobre eventos e iniciativas em que trabalhou. Você precisa testar novos recursos e fornecer feedback internamente. Você documenta os processos e ajuda a estruturar as formas de ajudar o negócio a ter sucesso. E tudo isso enquanto você passa parte ou a maior parte do seu tempo viajando para encontrar com as pessoas desenvolvedoras onde elas estiverem.&lt;/p&gt;

&lt;p&gt;As relações com uma pessoa desenvolvedora são um tópico complicado se você pensar sobre isso. Você precisa ter muitas habilidades: habilidades técnicas, de comunicação e interpessoais, também senso de negócios, ser orientada a dados e ainda ser uma participante ativo de qualquer comunidade de tecnologia e colocar as pessoas em primeiro lugar. Isso me lembra esse tweet:&lt;/p&gt;

&lt;center&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Developer advocacy is simple. You just need skills in engineering, marketing, business development, product management, content creation, and be a skilled communicator, both written and verbal. After that, the job really takes care of itself.&lt;/p&gt;&amp;mdash; Sean Falconer (@seanfalconer) &lt;a href=&quot;https://twitter.com/seanfalconer/status/1489618627359698952?ref_src=twsrc%5Etfw&quot;&gt;February 4, 2022&lt;/a&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/center&gt;

&lt;p&gt;&lt;em&gt;Tradução livre: Developer advocacy é simples. Você só precisa de habilidades de engenharia, marketing, desenvolvimento de negócios, gerenciamento de produto, criação de conteúdo e ser uma pessoa habilidosa em comunicação, tanto na forma escrita, quanto na fala. Depois disso, o trabalho meio que rola sozinho.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Se você estiver considerando quais habilidades melhorar para se tornar DevRel, pense nas habilidades que mencionei neste artigo e tente desenvolvê-las no seu dia-a-dia. Acontece que a maioria dessas habilidades são úteis independentemente do seu papel e, quanto mais cedo você começar, mais fácil será a sua jornada para se tornar uma DevRel. 😉&lt;/p&gt;

&lt;h2 id=&quot;como-eu-decidi-que-devrel-era-o-que-eu-queria&quot;&gt;Como eu decidi que DevRel era o que eu queria?&lt;/h2&gt;

&lt;p&gt;Além de palestrar em diversos eventos e conhecer várias pessoas enquanto eu trabalhava no Serenata, eu também criei muito conteúdo técnico sempre buscando fazer o projeto ser mais acessível para as pessoas que não tinham um conhecimento técnico para entender o código.&lt;/p&gt;

&lt;p&gt;Depois de sair do Serenata, eu fiz questão de participar ativamente na comunidade Python, não importando onde eu estivesse trabalhando. Sempre que pude, dei palestras no meu tempo livre, mantive o meu blog e continuei gravando o Pizza de Dados.&lt;/p&gt;

&lt;center&gt;&lt;img style=&quot;max-width: 60%;&quot; src=&quot;/images/231808710_2879851062263859_1016560339918884759_n.webp&quot; /&gt;
&lt;br /&gt;  &lt;br /&gt;
&lt;i&gt;Eu, Lele Portella e Ceci Vieira numa live stream&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Em resumo, chegou um dia em que eu decidi que queria mudar o meu trabalho para que ele incluísse mais atividades de compartilhamento de conhecimento ao invés de só fazer isso no meu tempo livre. Com um pouco de sorte, na mesma época, a Auth0 estava tentando contratar uma pessoa &lt;em&gt;developer advocate&lt;/em&gt;. Foi nesse momento que decidi agarrar a minha chance.&lt;/p&gt;

&lt;p&gt;Antes de começar o processo seletivo, eu fiz o que eu sempre faço: pesquisa. Pesquisei mais a fundo o que queria dizer “ser DevRel” e aí numas sessões de pesquisa achei um ebook escrito por &lt;a href=&quot;http://twitter.com/samjulien&quot;&gt;Sam Julien&lt;/a&gt;, naquela época, Head de DevRel na Auth0. O ebook chamava &lt;em&gt;&lt;a href=&quot;https://learn.samjulien.com/getting-started-in-developer-relations&quot;&gt;“Getting Started in Developer Relations”&lt;/a&gt;,&lt;/em&gt; e eu devorei o livro em menos de dois dias. Foi nessa hora que &lt;em&gt;caiu a ficha&lt;/em&gt;: Eu já fiz isso antes… E eu &lt;em&gt;amei&lt;/em&gt; fazer isso!&lt;/p&gt;

&lt;h2 id=&quot;como-é-o-dia-de-uma-dev-advocate&quot;&gt;Como é o dia de uma Dev Advocate?&lt;/h2&gt;

&lt;p&gt;No lugar de falar sobre o meu dia, eu vou falar da minha semana por que eu acho que isso vai ilustrar melhor o que uma pessoa pode fazer na posição de DevRel.&lt;/p&gt;

&lt;table style=&quot; width: 90%; margin-left: 5%; margin-right: 5%; text-align: left;&quot;&gt;
  &lt;thead&gt;
    &lt;tr style=&quot;text-align: left;&quot;&gt;
      &lt;th&gt;Dia da semana&lt;/th&gt;
      &lt;th&gt;Atividades&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Segunda&lt;/td&gt;
      &lt;td&gt;
        • Fazer a triagem dos pedidos de colaboração&lt;br /&gt;
        • Conferir as perguntas de pessoas embaixadoras&lt;br /&gt;
        • Praticar uma palestra que vou apresentar no dia seguinte e garantir que ajustes não são necessários
      &lt;/td&gt;  
    &lt;/tr&gt;
    &lt;tr style=&quot;background-color: #f3f3f3;&quot;&gt;
      &lt;td&gt;Terça&lt;/td&gt;
      &lt;td&gt;
        • Participar da reunião 1:1 com meu gerente direto&lt;br /&gt;
        • Participar da reunião 1:1 com um colega de outro time sobre uma iniciativa nova&lt;br /&gt;
        • Apresentar uma palestra num evento&lt;br /&gt;
        • Preparar o rascunho de uma palestra para uma chamada que acaba no fim da semana
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Quarta&lt;/td&gt;
      &lt;td&gt;
        • Participar da reunião semanal do time&lt;br /&gt;
        • Documentar um processo novo&lt;br /&gt;
        • Escrever o rascunho de um novo vídeo que eu vou gravar&lt;br /&gt;
        • Revisar o trabalho da especialista de localização
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr style=&quot;background-color: #f3f3f3;&quot;&gt;
      &lt;td&gt;Quinta&lt;/td&gt;
      &lt;td&gt;
        • Fazer análise de dados da newsletter enviada semana passada&lt;br /&gt;
        • Rascunhar um blog post que vai acompanhar o vídeo&lt;br /&gt;
        • Rascunhar uma amostra de código que vai ser usada no vídeo e no blog post
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Sexta&lt;/td&gt;
      &lt;td&gt;        
        • Participar da reunião semanal de alinhamento e novidades da empresa&lt;br /&gt;
        • Participar do happy hour semanal com os colegas de time&lt;br /&gt;
        • Revisar um blog post de um colega
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Você pode fazer tudo que eu listei na semana acima e ainda ter uma agenda completamente diferente para semana seguinte, especialmente se você estiver viajando para participar de um evento presencial. Você ainda pode arrumar tempo para ajudar a comunidade em algo ou trabalhar em algum projeto pessoal.&lt;/p&gt;

&lt;p&gt;Uma coisa eu garanto, isso tudo pode até parecer repetitivo - tudo que você faz é sempre sobre compartilhar conhecimento ou ajudar alguém -, mas nunca tem um momento sem graça.&lt;/p&gt;

&lt;h2 id=&quot;onde-o-time-de-devrel-se-encontra-em-uma-organização&quot;&gt;Onde o time de DevRel se encontra em uma organização?&lt;/h2&gt;

&lt;p&gt;Pelo que andei vendo, existem três locais para encontrar o time de developer relations dentro de uma empresa:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Engenharia: como parte do time de engenharia de software&lt;/li&gt;
  &lt;li&gt;Marketing: como parte da organização de marketing&lt;/li&gt;
  &lt;li&gt;Produto: como parte de desenvolvimento de produto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Onde você encontra o time geralmente dita como o time é visto por outras pessoas na empresa: Se é um cargo técnico e se é compensado como tal. No caso da Auth0, o time de DevRel está sobre a organização de Developer Marketing debaixo do guarda-chuva de Marketing e é visto como um cargo técnico.&lt;/p&gt;

&lt;h2 id=&quot;o-que-eu-aprendi-como-cientista-de-dados-e-ainda-uso-diariamente&quot;&gt;O que eu aprendi como cientista de dados e ainda uso diariamente?&lt;/h2&gt;

&lt;p&gt;Acima de tudo, trabalhar com ciência de dados me ajudou a desenvolver a habilidade de comunicar conceitos complexos com facilidade para qualquer audiência, habilidade que levo comigo em tudo que eu faço, mas além disso, existem outras habilidades que eu aprendi enquanto cientista de dados que uso diariamente. É importante ressaltar que algumas dessas habilidades se não todas elas podem ser desenvolvidas independentemente do seu trabalho. 😉&lt;/p&gt;

&lt;h3 id=&quot;-priorização&quot;&gt;📆 Priorização&lt;/h3&gt;

&lt;p&gt;A pergunta que eu e meus colegas mais fazemos nas sessões de planejamentos sempre é: &lt;em&gt;“O que vai trazer maior impacto pro que estamos tentando fazer?”.&lt;/em&gt; A cientista de dados que mora em mim sempre diz: Bem, depende do que estamos tentando otimizar, e por consequência me faz pensar em qual área queremos crescer. Qual a fundação que queremos construir para que possamos colher os frutos desse trabalho no futuro?&lt;/p&gt;

&lt;p&gt;Pra ser sincera, essas perguntas se aplicam a qualquer trabalho de desenvolvimento de software também. A ciência de dados me ajudou a encontrar respostas baseadas em dados e observações do passado. Também me ajudou a definir um caminho saudável de crescimento com base nas informações disponíveis.&lt;/p&gt;

&lt;h3 id=&quot;-habilidades-de-comunicação&quot;&gt;🗣 Habilidades de comunicação&lt;/h3&gt;

&lt;p&gt;A maior parte do que eu faço é: entender os pontos problemáticos e fornecer orientação para aliviar ou se livrar deles. Para fazer isso bem é necessário se comunicar e adaptar o estilo de comunicação baseado no público com quem se está falando.&lt;/p&gt;

&lt;p&gt;Em um ano, você pode falar em mais de 10 eventos, todos eles com audiências contendo níveis variados de conhecimento, habilidades, &lt;em&gt;stack&lt;/em&gt; favorita e muito mais. Você pode trabalhar em uma palestra para um evento mês que vem enquanto termina o material de um tutorial para um &lt;em&gt;hackathon&lt;/em&gt; da semana que vem. Esses dois eventos requerem um formato diferente de comunicação e estruturação de conteúdo.&lt;/p&gt;

&lt;p&gt;Eu tenho que escrever relatórios sobre os eventos e iniciativas que eu fiz ou contribui de tempos em tempos. Também preciso conversar com outros times na empresa para fornecer &lt;em&gt;feedback&lt;/em&gt; em projetos e &lt;em&gt;features&lt;/em&gt;. Comunicação está no centro de DevRel.&lt;/p&gt;

&lt;h3 id=&quot;-time-boxing-e-criação-de-código-de-exemplo&quot;&gt;⏱ Time-boxing e criação de código de exemplo&lt;/h3&gt;

&lt;p&gt;Isso eu aprendi faz um tempão quando eu usava ciência de dados para aquele projeto Serenata e, acredite se quiser, eu ainda uso diariamente, especialmente para saber quando pedir ajuda. Por exemplo, eu tinha que implementar uma aplicação de exemplo para demonstrar uma &lt;em&gt;feature&lt;/em&gt; de extensibilidade nova: &lt;a href=&quot;https://auth0.com/docs/customize/actions&quot;&gt;Auth0 Actions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Eu tinha um plano.&lt;/p&gt;

&lt;p&gt;Eu queria fazer uma aplicação baseada em um dos tutoriais que temos no &lt;a href=&quot;http://auth0.com/blog/?utm_source=jesstemporalblog&quot;&gt;Blog da Auth0&lt;/a&gt;. Eu separei um tempo para trabalhar nisso: “&lt;em&gt;Eu tenho 2 dias para para fazer isso funcionar e, se não funcionar, eu replanejarei&lt;/em&gt;”. Dois dias se passaram e adivinha? Não consegui fazer a amostra de código funcionar como eu queria. Eu percebi que tava complicando uma coisa que deveria ser simples: a parte de código que não tinha nada a ver com a &lt;em&gt;feature&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A parte boa disso tudo, é que eu não tava sozinha nisso tudo. Chamei um colega de trabalho para conversar. A gente bolou um plano juntos para fazer a minha ideia dar certo usando uma aplicação beeeem mais simples e já pronta. O resultado dá pra ver aqui:&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/noLO8qv1jjs&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;Time-boxing é uma técnica fundamental para me dar tempo de testar as coisas que eu to fazendo e saber quando pedir ajuda. Principalmente, me ajuda a ter tempo para redirecionar o meu plano caso seja necessário. Assim eu consigo ser efetiva em criar coisas novas em um tempo aceitável.&lt;/p&gt;

&lt;h3 id=&quot;-análise-de-dados-básica&quot;&gt;📈 Análise de dados básica&lt;/h3&gt;

&lt;p&gt;Uma pergunta constante em DevRel, não importando a empresa que você trabalha, é: &lt;em&gt;“Como medimos sucesso?”&lt;/em&gt; E, às vezes, é bem difícil responder isso. É aí que um entendimento básico sobre dados se torna relevante.&lt;/p&gt;

&lt;p&gt;Por exemplo, eu lidero e mantenho a &lt;em&gt;newsletter&lt;/em&gt; para pessoas desenvolvedoras Zero Index. Ela sai mensalmente e contém uma coleção de conteúdo curado para pessoas desenvolvedoras — aliás se você quiser, &lt;a href=&quot;https://developer.auth0.com/newsletter?utm_source=event&amp;amp;utm_medium=signupform&amp;amp;utm_campaing=devrel&amp;amp;utm_content=jesstpersonalblog&quot;&gt;dá pra assinar e conferir edições passadas aqui&lt;/a&gt;. Dá pra dizer que uma definição de sucesso para esse projeto seria enviar a &lt;em&gt;newsletter&lt;/em&gt; para mais pessoas, mas eu vejo muito mais possibilidades além disso.&lt;/p&gt;

&lt;p&gt;A gente quer enviar para mais devs, claro, mas queremos enviar informação que seja relevante, mas como você pode entender isso se você não sabe medir a relevância de uma informação? Provavelmente você vai trabalhar com pessoas que podem te ajudar a entender os dados, né?&lt;/p&gt;

&lt;p&gt;Como eu ainda tenho o coração de cientista de dados, eu coloquei os músculos que desenvolvi durante anos e apliquei isso para tentar entender como as pessoas interagem com conteúdo que a gente compartilha. Fiz uns gráficos, e dei uma olhada na estrutura e como ela mudou ao longo do tempo. Tudo isso resultou em ideias de testes A/B que pudemos fazer com o intuito de melhorar a experiência de quem lê a &lt;em&gt;newsletter&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Você pode deixar a ciência de dados, mas a ciência de dados nunca te deixa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Então é verdade que de tempos em tempos eu ainda uso dados para entender o mundo à minha volta mesmo que isso não seja parte da descrição do meu trabalho. 😉&lt;/p&gt;

&lt;h2 id=&quot;coisas-novas-que-tive-que-aprender&quot;&gt;Coisas novas que tive que aprender&lt;/h2&gt;

&lt;p&gt;Veja bem, muitas coisas novas apareceram junto com a nova carreira especialmente no domínio de identidade, autenticação e autorização, que eram algo completamente novo para mim, além disso também surgiram coisas sobre criação de conteúdo para uma empresa e não para mim ou meus amigos.&lt;/p&gt;

&lt;h3 id=&quot;reaproveitar-conteúdo&quot;&gt;Reaproveitar conteúdo&lt;/h3&gt;

&lt;p&gt;Uma coisa engraçada, quando estamos escrevendo código queremos usar o conceito DRY (&lt;em&gt;don’t repeat yourself&lt;/em&gt;) de não ficar repetindo código, mas quando se fala de conteúdo, nós fazemos o oposto. Reaproveitar conteúdo é algo &lt;em&gt;bom&lt;/em&gt;. Um artigo no blog pode virar um fio no twitter, uma palestra, um episódio de podcast, ou até mesmo um vídeo no YouTube.&lt;/p&gt;

&lt;p&gt;Você precisa fazer o seu conteúdo “escalar” e distribuir esse conteúdo em plataformas variadas é uma forma de fazer isso, principalmente por que pessoas diferentes aprendem de jeitos diferentes. Por exemplo, algumas pessoas, como eu, preferem conteúdo escrito, outras preferem vídeo ou podcasts e assim por diante. Para você ser efetiva no seu trabalho você provavelmente vai fazer mais um formato ou se juntar com algum colega para que você faça um formato e essa outra pessoa cuide de outro formato.&lt;/p&gt;

&lt;h3 id=&quot;identidade-autorização-e-autenticação&quot;&gt;Identidade, autorização e autenticação&lt;/h3&gt;

&lt;p&gt;Como eu trabalhei com ciência de dados na maior parte da minha vida profissional, os desafios ligados ao mundo da identidade não era algo que eu tinha contato, pelo menos não até eu entrar na Auth0. Identidade é difícil. É complexo e tem várias sutilezas que às vezes passam despercebidas até para pessoas desenvolvedoras mais experientes.&lt;/p&gt;

&lt;p&gt;Vale salientar que identidade aqui não é o seu RG ou CNH mas sim quem você é no mundo da tecnologia, seus cadastros de usuário, seus acessos a sistemas e muito mais.&lt;/p&gt;

&lt;p&gt;Vamos ser honestas, por causa de quão difícil identidade pode ser, autenticação e autorização são sempre uma preocupação secundária para muitas pessoas desenvolvedoras. Não é comum ter uma abordagem que lida com identidade primeiro - tenha em mente que isso deve mudar nos próximos anos.&lt;/p&gt;

&lt;p&gt;A parte boa disso tudo, é que eu abraço os desafios trazidos por problemas e conceitos complexos. Eu gosto de entender essas coisas e destrinchá-las para tornar tudo isso mais fácil de absorver. Eu vejo isso como algo que eu fazia quando eu começava um cargo novo em ciência de dados: Eu estudava os dados e o negócio para entender os problemas que a empresa estava tentando resolver e começava a construir coisas a partir desse conhecimento.&lt;/p&gt;

&lt;p&gt;Então eu não comecei a fazer de fato DevRel, mas também eu estava aprendendo coisas novas e complexas. Eu me divirto aprendendo conceitos como MFA e SSO dessa vez não só como usuária, mas também como desenvolvedora. Eu ainda estou longe de ser uma &lt;em&gt;expert&lt;/em&gt; nesse novo domínio, mas eu estou adorando cada pedacinho dessa jornada de conhecimento.&lt;/p&gt;

&lt;h3 id=&quot;desenferrujando-os-conhecimentos-sobre-api-e-desenvolvimento-web&quot;&gt;Desenferrujando os conhecimentos sobre API e desenvolvimento web&lt;/h3&gt;

&lt;p&gt;Além da parte sobre identidade, tinha mais uma coisinha que eu precisei relembrar conceitos e sobre como fazer: APIs e aplicações web. Eu não só trabalhei com ciência de dados, mas também trabalhei uma parte do tempo como desenvolvedora web, então em algum ponto da minha carreira eu sabia sobre APIs e como construí-las.&lt;/p&gt;

&lt;p&gt;A verdade é que, embora os modelos que eu costumava fazer deploy na AWS Sagemaker tivessem endpoints, já fazia um bom tempo que eu não desenvolvia APIs de verdade. Então eu tive que relembrar conceitos sobre RESTful, OpenAPI e outros verbos HTTP além de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUT&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POST&lt;/code&gt; e &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GET&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;entregar-conteúdo-e-não-código&quot;&gt;Entregar conteúdo e não código&lt;/h3&gt;

&lt;p&gt;Se eu tivesse que dizer quanto tempo eu passo codando, acho que só chega a 10% do meu mês. Apesar de que eu ainda escrevo código de vez em quando — até JS eu escrevi outro dia — a quantidade hoje em dia é bem menor se comparado com a época que eu fazia análise de dados e criava modelos de &lt;em&gt;machine learning&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Tenha em mente que isso não quer dizer que todas pessoas em DevRel são assim… Até mesmo no meu time temos developer advocates que escrevem muito mais código. A quantidade de código escrito vai depender das iniciativas que cada developer advocate cuida. Afinal de contas, nós ainda somos pessoas desenvolvedoras e mantemos sites como &lt;a href=&quot;https://jwt.io&quot;&gt;jwt.io&lt;/a&gt; ou &lt;a href=&quot;https://webauthn.me/&quot;&gt;webauthn.me&lt;/a&gt;, isso quer dizer que parte dos meus colegas passa mais tempo escrevendo código do que eu especialmente para manter essas iniciativas.&lt;/p&gt;

&lt;p&gt;O meu foco não &lt;em&gt;escrever código&lt;/em&gt;, mas sim ajudar pessoas e ensiná-las como implementar coisas nas suas aplicações. Eventualmente eu acabo escrevendo código para isso, afinal de contas eu estou ajudando a aumentar a adoção de um produto para devs, mas mais do que codar, a minha obrigação é entender como construir aplicações para ajudar &lt;em&gt;outras pessoas a fazerem o mesmo&lt;/em&gt;.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;https://youtu.be/X1BrOOHFwGc&quot;&gt;&lt;img style=&quot;max-width: 60%;&quot; src=&quot;/images/jess-at-devday2021.webp&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;  &lt;br /&gt;
&lt;i&gt;Eu apresentando minha palestra sobre Auth0 no Developer Day 2021, &lt;a href=&quot;https://youtu.be/X1BrOOHFwGc&quot;&gt;clica aqui pra ver o video por completo&lt;/a&gt;&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Agora, ao invés de resolver bugs, eu devo entregar um blog post que ensina como implementar fluxos de login/logout numa aplicação de página única em Python por exemplo. Isso não me impede de fazer contribuições para os SDKs da Auth0, isso só quer dizer que eu foco em outras coisas &lt;em&gt;além do código&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;No caso da Auth0 em particular, os códigos estão quase prontos. Nós temos uma biblioteca imensa &lt;a href=&quot;https://developer.auth0.com/resources/code-samples&quot;&gt;amostras de codigo&lt;/a&gt; e quick-starts. Eu posso me apoiar em materiais feitos por pessoas que entendem muito desse novo domínio, e criar coisas novas com o foco em compartilhar conhecimento e, se eu conseguir fazer tudo isso ser divertido, ainda “ganho pontos extras”.&lt;/p&gt;

&lt;p&gt;Empresas menores podem ter responsabilidades relacionadas a atividades para comunidades, como por exemplo gerenciar fóruns e comentários em redes sociais além de ter algum envolvimento com a parte de experiência da pessoa desenvolvedora (developer experience), vale salientar que isso não acontece na Auth0, nós temos times específicos focados em cada um desses meios, mas trabalhamos em conjunto para ajudar as pessoas que usam a gente.&lt;/p&gt;

&lt;p&gt;Vale apontar que a forma que a Auth0 lida com DevRel eh bem madura e que isso nem sempre é o caso de outras empresas. Para esses casos menos maduros, eu consigo ver que pessoas de DevRel passariam mais tempo escrevendo código do que eu por exemplo.&lt;/p&gt;

&lt;h2 id=&quot;a-progressão-de-carreira&quot;&gt;A progressão de carreira&lt;/h2&gt;

&lt;p&gt;A parte boa de fazer DevRel num time bem estabelecido, entre outras coisas, é que a sua vida fica um pouco mais fácil quando você começa a pensar na sua progressão de carreira.&lt;/p&gt;

&lt;p&gt;Na Auth0 temos a pessoa contribuidora individual (IC) esse caminho pode levar ao &lt;em&gt;Staff Developer Advocate&lt;/em&gt; e &lt;em&gt;Lead Developer Advocate&lt;/em&gt;, e também tem o que eu gosto de chamar de caminho da liderança, onde você consegue seguir para posições como &lt;em&gt;Diretora de Developer Relations&lt;/em&gt;. É importante salientar que essas divisões não impedem as pessoas de virar gerente uma vez que elas são &lt;em&gt;staff&lt;/em&gt; e vice-versa, mas esses caminhos estão lá para garantir que cada pessoa tem uma forma de se desenvolver e avançar na carreira.&lt;/p&gt;

&lt;p&gt;Outras empresas podem ter progressões de carreira diferente da que descrevi. Essas posições também podem ser alteradas ou adaptadas com o crescimento do time. Quem sabe? Pode ser que um dia eu vire diretora de Developer Relations América Latina… As possibilidades são muitas.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Esse ano foi muito divertido. Eu me sinto ainda mais criativa quando olho pro meu trabalho. Eu consigo ajudar pessoas. Deu pra perceber que eu amo o que eu faço? Criar conteúdo para ajudar outras pessoas é a minha missão de vida e é maravilhoso conseguir fazer isso no meu trabalho.&lt;/p&gt;

&lt;p&gt;Mal posso esperar pra ver o que vai rolar daqui pra frente.&lt;/p&gt;

&lt;style&gt;
.big-table { 
    width: 90%;
    margin-left: 5%;
    margin-right: 5%;
}
&lt;/style&gt;

</description>
        <pubDate>Tue, 29 Mar 2022 09:01:00 +0000</pubDate>
        <link>https://jtemporal.com/primeiro-ano-sendo-uma-developer-advocate/</link>
        <guid isPermaLink="true">https://jtemporal.com/primeiro-ano-sendo-uma-developer-advocate/</guid>
        
        <category>devrel</category>
        
        <category>developer advocate</category>
        
        <category>developer relations</category>
        
        <category>developer advocacy</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>First year as a Developer Advocate 🥑</title>
        <description>&lt;p&gt;Before doing DevRel for a living, I used to pay the bills by being a data scientist. Today I can say that I successfully switched from being a Data Scientist to be a &lt;em&gt;Developer Advocate&lt;/em&gt; for a whole year! 🎉&lt;/p&gt;

&lt;center&gt;&lt;img style=&quot;max-width: 70%;&quot; src=&quot;/images/166827422_515510042769353_3494362086546822067_n.webp&quot; /&gt;
&lt;br /&gt;  &lt;br /&gt;
&lt;i&gt;Me on the first day of work March, 2021&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;So I thought I share the learnings from this year with you. Also, full disclaimer, this will be a long one, so sit comfortably. 😉&lt;/p&gt;

&lt;h2 id=&quot;what-i-used-to-do-before-being-hired-as-developer-advocate&quot;&gt;What I used to do before being hired as Developer Advocate&lt;/h2&gt;

&lt;p&gt;A little history before we dive into the learnings since you may not know me or what I used to work with.&lt;/p&gt;

&lt;p&gt;So a long time ago, I used to work as a data scientist. On the first job I ever had, I actually gave over 13 talks about the open-source civic tech project I was working on at the time called Serenata, including one talk in Taiwan and all of that in just one year. The project relied on us, the devs and data scientists, to spread the word about it so it could thrive.&lt;/p&gt;

&lt;center&gt;&lt;img style=&quot;max-width: 60%;&quot; src=&quot;/images/31909575_955979771244859_4044473679331983360_n.webp&quot; /&gt;
&lt;br /&gt;  &lt;br /&gt;
&lt;i&gt;Me presenting about Rosie, Serenata&apos;s AI, on a Meetup back in 2017&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Besides talking at a number events and meeting many people, we would also create a lot of technical content to make the project more accessible to those without the technical knowledge to read and understand code. You can check out &lt;a href=&quot;https://serenata.ai/en/&quot;&gt;the page of the project right here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Around the same time, I even created, with friends, a podcast about data science in Portuguese called &lt;a href=&quot;http://pizzadedados.com/en/&quot;&gt;Pizza de Dados&lt;/a&gt;. Sharing knowledge in various formats became a passion. I love to give talks, do workshops, and just talk to people and help in any way I can.&lt;/p&gt;

&lt;p&gt;Turns out that this is a huge part of being a developer advocate. I just didn’t know it at the time. Notice this was around 2017, now it is 2022, and developer relations is still pretty new in Brazil, so imagine how it was back then.&lt;/p&gt;

&lt;h2 id=&quot;what-is-developer-relations-or-developer-advocacy&quot;&gt;What is Developer Relations or Developer Advocacy?&lt;/h2&gt;

&lt;p&gt;I think the first question I get asked when I say I’m a  developer advocate is &lt;em&gt;“developer what?”&lt;/em&gt;. People usually don’t get it. Developer advocacy is so new here that it doesn’t even have a name for it in Portuguese. So it isn’t surprising when people don’t get what I do by just stating my job title. What also happens is that they feel like they understand what it is once I explain it. Based on my community work some people usually are aware of, I get the &lt;em&gt;“oh yeah, it suits you”&lt;/em&gt; comments.&lt;/p&gt;

&lt;p&gt;If you also don’t understand what DevRel is, here’s the short description: I make friends with developers to help them understand complex topics and work more efficiently. Now, there are many ways you achieve that, I do it by giving talks, creating blog posts, videos, podcasts, etc.&lt;/p&gt;

&lt;p&gt;You may be wondering why I say I &lt;em&gt;make friends&lt;/em&gt; though, am I right? Well, that’s because people tend to ask &lt;em&gt;their friends&lt;/em&gt; for help, and that is my utmost goal, be someone anyone can reach out to and ask for help, especially when coding is involved.&lt;/p&gt;

&lt;p&gt;Talks, written tutorials, workshops, podcasts, videos, and so on are only part of the process of being an advocate. The part people usually see. There’s also the other part, the part where you have to do reporting on events and initiatives you worked on. You have to test out new features and provide feedback internally. You document processes internally and help structure ways to help the business succeed. And all of that while you spend some or most of your time traveling to reach developers where they are.&lt;/p&gt;

&lt;p&gt;Developer relations is a complicated topic if you think about it. You have to have a lot of skills: technical, communication, and interpersonal skills, also business sense, be data-driven while still being an active participant of any tech community and putting people first. This reminds me of this tweet:&lt;/p&gt;

&lt;center&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Developer advocacy is simple. You just need skills in engineering, marketing, business development, product management, content creation, and be a skilled communicator, both written and verbal. After that, the job really takes care of itself.&lt;/p&gt;&amp;mdash; Sean Falconer (@seanfalconer) &lt;a href=&quot;https://twitter.com/seanfalconer/status/1489618627359698952?ref_src=twsrc%5Etfw&quot;&gt;February 4, 2022&lt;/a&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/center&gt;

&lt;p&gt;If you are considering what skills to improve to become a DevRel, think of the ones I mention in this post and try to develop them along the way. Turns out that most of these skills can be used no matter what job you have, and if you start working on them earlier, it will make your path to become a DevRel a lot easier. 😉&lt;/p&gt;

&lt;h2 id=&quot;and-how-did-i-decide-devrel-was-my-thing&quot;&gt;And how did I decide DevRel was my thing?&lt;/h2&gt;

&lt;p&gt;Other than talking at many events and meeting a lot of people while working at Serenata, I would also create a lot of technical content seeking to make the project more accessible to those without the technical knowledge to read and understand code.&lt;/p&gt;

&lt;p&gt;After moving on from Serenata, I made sure I was active in the Python community, no matter where I worked. In my spare time, I gave talks whenever possible, maintained my blog, and kept recording episodes for the Pizza de Dados podcast.&lt;/p&gt;

&lt;center&gt;&lt;img style=&quot;max-width: 60%;&quot; src=&quot;/images/231808710_2879851062263859_1016560339918884759_n.webp&quot; /&gt;
&lt;br /&gt;  &lt;br /&gt;
&lt;i&gt;Me, Lele Portella and Ceci Vieira on a live stream&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Long story short, some day I decided to change my day job to have more knowledge sharing instead of it just being a spare-time effort. Luckily around the same time, Auth0 was hiring a new developer advocate. So, I decided it was time to give it a chance.&lt;/p&gt;

&lt;p&gt;Before the hiring process started, I did what I usually do: research. I researched what DevRel was, and guess what? &lt;a href=&quot;http://twitter.com/samjulien&quot;&gt;Sam Julien&lt;/a&gt;, at the time, head of DevRel at Auth0, had an ebook called &lt;em&gt;&lt;a href=&quot;https://learn.samjulien.com/getting-started-in-developer-relations&quot;&gt;“Getting Started in Developer Relations”&lt;/a&gt;,&lt;/em&gt; which I read in two days, and that’s when I had that &lt;em&gt;a-ha moment:&lt;/em&gt; I did this before… and &lt;em&gt;loved&lt;/em&gt; it!&lt;/p&gt;

&lt;h2 id=&quot;how-is-the-day-of-a-dev-advocate&quot;&gt;How is the day of a Dev Advocate?&lt;/h2&gt;

&lt;p&gt;Instead of speaking of my day, I’ll talk about my week as it draws a fuller picture of what one might do daily as a DevRel.&lt;/p&gt;

&lt;table style=&quot; width: 90%; margin-left: 5%; margin-right: 5%; text-align: left;&quot;&gt;
  &lt;thead&gt;
    &lt;tr style=&quot;text-align: left;&quot;&gt;
      &lt;th&gt;Day of the week&lt;/th&gt;
      &lt;th&gt;Activities&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Monday&lt;/td&gt;
      &lt;td&gt;
        • Go through the collaboration requests&lt;br /&gt;
        • Check in with ambassadors questions&lt;br /&gt;
        • Practice a talk I’m giving the following day and make sure that no adjustments are required
      &lt;/td&gt;  
    &lt;/tr&gt;
    &lt;tr style=&quot;background-color: #f3f3f3;&quot;&gt;
      &lt;td&gt;Tuesday&lt;/td&gt;
      &lt;td&gt;
        • Attend the 1:1 meeting with my direct manager&lt;br /&gt;
        • Attend the 1:1 meeting with a colleague from another team about a new initiative&lt;br /&gt;
        • Give a talk at an event&lt;br /&gt;
        • Prepare a draft of a talk for a CFP I need to submit by the end of the week
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Wednesday&lt;/td&gt;
      &lt;td&gt;
        • Attend the team weekly meeting&lt;br /&gt;
        • Write documentation for a new process&lt;br /&gt;
        • Draft video outline for the new video I need to record&lt;br /&gt;
        • Review the work of a localization specialist
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr style=&quot;background-color: #f3f3f3;&quot;&gt;
      &lt;td&gt;Thursday&lt;/td&gt;
      &lt;td&gt;
        • Data analysis on the results for the newsletter that came out last week&lt;br /&gt;
        • Draft blog post that will accompany the video&lt;br /&gt;
        • Draft the sample code for the video and blog post
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Friday&lt;/td&gt;
      &lt;td&gt;        
        • Attend the company all hands meeting&lt;br /&gt;
        • Attend the team weekly happy hour&lt;br /&gt;
        • Review the blog post of a colleague
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;You might do all of that in a week and have a very different schedule for next week, especially when traveling to attend in-person events. You might even squeeze in some community work during your week or work on personal projects.&lt;/p&gt;

&lt;p&gt;One thing I can guarantee, even if this may seem repetitive — it is always about sharing knowledge and helping someone out — there’s never a dull moment.&lt;/p&gt;

&lt;h2 id=&quot;where-does-the-devrel-team-land-in-an-organization&quot;&gt;Where does the DevRel team land in an organization?&lt;/h2&gt;

&lt;p&gt;From what I’ve seen, there are three main locations in an organization for placing a developer relations team:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Engineering: as part of the software engineering team&lt;/li&gt;
  &lt;li&gt;Marketing: as part of the developer marketing organization&lt;/li&gt;
  &lt;li&gt;Product: as part of the product development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where you find the team usually speaks to how the developer relations team is seen by other peers in the organization: Whether it is a technical role and if it is compensated as such. In Auth0’s case, the DevRel team is under the Developer Marketing umbrella, and it is seen as a technical role.&lt;/p&gt;

&lt;h2 id=&quot;what-i-learned-as-a-data-scientist-and-i-still-use-daily&quot;&gt;What I learned as a data scientist and I still use daily?&lt;/h2&gt;

&lt;p&gt;If anything, data science helped me develop the skills for communicating complex concepts with ease for any audience, something I keep close to my heart at all times. But other than that, I still have some skills I learned as a data scientist that I use daily. Is worth noting that some, if not all, of these skills can be developed in other jobs too. 😉&lt;/p&gt;

&lt;h3 id=&quot;prioritization&quot;&gt;📆 Prioritization&lt;/h3&gt;

&lt;p&gt;The question my colleagues and I always ask ourselves every planning session is: &lt;em&gt;“What will bring the most impact to what we are trying to accomplish?”.&lt;/em&gt;
 The data scientist in me always says: Well, it depends on what we are trying to optimize for, which always gets me thinking about the area we want to grow. What is the foundation we need to build to collect the fruits from it in the future?&lt;/p&gt;

&lt;p&gt;These questions apply to any development role, to be honest. Data science taught me to find the answers based on data and observations from the past. It also taught me to define a healthy path to grow based on such information.&lt;/p&gt;

&lt;h3 id=&quot;communication-skills&quot;&gt;🗣 Communication skills&lt;/h3&gt;

&lt;p&gt;Most of what I do is understand pain points and provide guidance for easing or getting rid of them. To do this, you have to know how to communicate and adapt your communication based on the public.&lt;/p&gt;

&lt;p&gt;In a year, you may speak at more the 10 events, all of them varying in audience skill level, knowledge, preferred stack, and so on. I may work on a talk content to present at next month’s event while finishing up a workshop for a sponsored hackathon that will be held next week. Both have very different formats of communication.&lt;/p&gt;

&lt;p&gt;I have to write reports about the events and initiatives I did or contributed to from time to time. I need to reach out to other teams in the company to provide feedback on projects and features. So communication is at the core of DevRel.&lt;/p&gt;

&lt;h3 id=&quot;time-boxing-and-creating-sample-apps&quot;&gt;⏱ Time-boxing and creating sample apps&lt;/h3&gt;

&lt;p&gt;This I learned way back in the day when I used to do data science for that open source project, and I still use it daily, especially to know when to ask for help. For example, I had to code a sample app to demonstrate the new feature: &lt;a href=&quot;https://auth0.com/docs/customize/actions&quot;&gt;Auth0 Actions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I had a plan.&lt;/p&gt;

&lt;p&gt;I wanted to make an app based on one of the tutorials we have on the &lt;a href=&quot;http://auth0.com/blog/&quot;&gt;Auth0 Blog&lt;/a&gt;, and I set aside time for it: “&lt;em&gt;I have two full days to get this working, and if it doesn’t work, I’ll get back to the drawing board”&lt;/em&gt;. Two days passed, and I couldn’t get it to work the way I wanted. I realized I was overcomplicating the sample application.&lt;/p&gt;

&lt;p&gt;The good thing is, I was not alone in this. I discussed it with a colleague and we figured out a way to do the same thing in a simpler environment. You can check the result here:&lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/noLO8qv1jjs&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;Time-boxing is fundamental to make sure that I test things, know when to ask for help, and I have time to go into a different path when needed. It also helps me effectively test new things and create my sample apps in a timely manner.&lt;/p&gt;

&lt;h3 id=&quot;basic-data-analysis&quot;&gt;📈 Basic data analysis&lt;/h3&gt;

&lt;p&gt;One constant question in DevRel, no matter what company you work for, is &lt;em&gt;“How do we measure success?”&lt;/em&gt; And that is sometimes hard to answer. So having a basic understanding of data is important.&lt;/p&gt;

&lt;p&gt;For example, I lead the Zero Index Developer Newsletter. It comes out once a month, and it contains curated content for developers — by the way, &lt;a href=&quot;https://info.auth0.com/devrel-event-zeroindex-subscribe.html?utm_source=event&amp;amp;utm_medium=signupform&amp;amp;utm_campaing=devrel&amp;amp;utm_content=jesstpersonalblog&quot;&gt;you can sign up for it here&lt;/a&gt;. You could say that one definition of success would be delivering the newsletter to more and more developers, but the way I see it is much more than that.&lt;/p&gt;

&lt;p&gt;We want to reach more developers, sure, we also want to provide relevant information. So how would you do that if you don’t understand how to measure it? You probably would partner up with the data people in the company, right?&lt;/p&gt;

&lt;p&gt;Still being a data scientist at heart, I decided to flex my data analysis muscles and try to understand how developers interact with the content we share. I did some basic visualizations, a few bar plots here and there, and took a look at the structural changes in the content. All of that put together gave ideas on doing some A/B testing to deliver more quality content to subscribers.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;You may leave data science, but data science never leaves you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So from time to time, I still take a look at data to make sense of the world around me. 😉&lt;/p&gt;

&lt;h2 id=&quot;what-were-the-new-things-i-had-to-learn&quot;&gt;What were the new things I had to learn?&lt;/h2&gt;

&lt;p&gt;There were a lot of new things, especially in the business of identity, authorization, and authentication, which was brand new to me. But there was also a lot about creating content for a company and not for myself.&lt;/p&gt;

&lt;h3 id=&quot;repurposing-content&quot;&gt;Repurposing content&lt;/h3&gt;

&lt;p&gt;Funny thing, as developers, we learn to apply the DRY (don’t repeat yourself) principle to our code, but when the goal is to share content, we do the opposite. It is &lt;em&gt;good&lt;/em&gt; to repurpose content. A blog post can become a Twitter thread, a talk, a podcast episode, or even a video on YouTube.&lt;/p&gt;

&lt;p&gt;You need to scale your content by distributing it on many platforms, mainly because different people learn in different ways. For example, some prefer written content, others prefer video, and so on. To be effective, you will probably do more than one format or partner up with colleagues so that one of them can take care of other formats.&lt;/p&gt;

&lt;h3 id=&quot;identity-authorization-and-authentication&quot;&gt;Identity, authorization and authentication&lt;/h3&gt;

&lt;p&gt;Since I worked on data science most of my life, the challenges of the identity world weren’t something I was in contact with, at least not until I started working at Auth0. Identity is hard. It is complex and has various subtleties that sometimes eludes even seasoned developers.&lt;/p&gt;

&lt;p&gt;Let’s be honest, because of how hard it is, authentication and authorization are usually an afterthought for most developers. We aren’t used to an identity-first approach — be aware that this may change in the coming years.&lt;/p&gt;

&lt;p&gt;The good thing is that I welcome the challenge of those complex concepts. I like to understand them and break them down into digestible pieces of information. The way I see it, it is the same thing I used to do when I started a new data science job: I would study the data and the business, understand what problems the company was trying to solve, and build from there.&lt;/p&gt;

&lt;p&gt;So not only I started doing DevRel, I was also learning new things, new complex things. I find it really fun to understand concepts like MFA and single sign-on now as a developer and not as just a user. I’m still far from being an expert in the field, but I’m enjoying every little bit of the learning journey.&lt;/p&gt;

&lt;h3 id=&quot;brush-the-dust-off-of-the-api-and-webdev-knowledge&quot;&gt;Brush the dust off of the API and WebDev knowledge&lt;/h3&gt;

&lt;p&gt;Apart from identity, there was one other little thing I needed to remember how to do: APIs and web apps. Other than data science, I spent some time being a web developer, so I did, at some point, understand APIs and knew how to build them.&lt;/p&gt;

&lt;p&gt;The truth is that even though the models I used to ship on AWS Sagemaker had endpoints in them, it had been some time since I really used or developed APIs. So I had to remind myself things like RESTful, OpenAPI, and what other HTTP methods there were other than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUT&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POST&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GET&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;deliver-content-and-not-code&quot;&gt;Deliver content and not code&lt;/h3&gt;

&lt;p&gt;If I had to say, out of my daily responsibilities, only 10% of the time I spend coding. Even though I do still code from time to time — I even wrote some JS the other day — it is a lot less than when you have to deliver data analysis notebooks and machine learning models.&lt;/p&gt;

&lt;p&gt;Even in my team, this is not the case to all of the dev advocates, some of us code a lot more depending on what initiatives they are involved with, we are still developers, and we maintain sites like &lt;a href=&quot;https://jwt.io&quot;&gt;jwt.io&lt;/a&gt; or &lt;a href=&quot;https://webauthn.me/&quot;&gt;webauthn.me&lt;/a&gt;, which means some of my colleagues spend more time coding than I do especially to maintain these initiatives.&lt;/p&gt;

&lt;p&gt;The thing is, my goal isn’t &lt;em&gt;to code&lt;/em&gt; but to teach people how to implement things on their applications. Eventually, I have to code. After all, it is a product for developers that I’m driving adoption, but more than coding, you have to understand how to build an application &lt;em&gt;to help others&lt;/em&gt; do so.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;https://youtu.be/X1BrOOHFwGc&quot;&gt;&lt;img style=&quot;max-width: 60%;&quot; src=&quot;/images/jess-at-devday2021.webp&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;  &lt;br /&gt;
&lt;i&gt;Me presenting my first talk ever about Auth0 on 2021&apos;s Developer Day, &lt;a href=&quot;https://youtu.be/X1BrOOHFwGc&quot;&gt;click here for the video&lt;/a&gt;&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;So instead of regularly fixing bug, I might deliver a blog post that teaches developers how to implement login/logout flows in a single page application in Python, for example. This does not prevent me from making contributions to our SDKs, is just that I focus more on other things than just coding.&lt;/p&gt;

&lt;p&gt;For Auth0 usage in particular, the coding is mostly done. We have a great library of &lt;a href=&quot;https://auth0.com/developers/hub&quot;&gt;code samples&lt;/a&gt; and quick-starts. It is like sitting on the shoulders of giants. I can build on top of what has been created to do new things while focusing on sharing knowledge, and if you can make it fun for the ones learning, you get extra points.&lt;/p&gt;

&lt;p&gt;Smaller companies may also have responsibilities related to community tasks like managing forums and comments on social networks, as well as some involvement in developer experience, this is not my case at Auth0, we have different teams for each of these things, but we all work together to help our customers.&lt;/p&gt;

&lt;p&gt;Is worth pointing out that Auth0 has a very seasoned approach to DevRel, which may not be the case for younger organizations. In this case, I foresee that all advocates would spend more time coding than I usually do.&lt;/p&gt;

&lt;h2 id=&quot;the-career-path&quot;&gt;The career path&lt;/h2&gt;

&lt;p&gt;The good thing about doing Developer Relations at a well-established team, among other things, is that it makes your life easier when you think of what you want to do in a growing career.&lt;/p&gt;

&lt;p&gt;At Auth0 there is the individual contributor (IC) path that takes you up to the &lt;em&gt;Staff Developer Advocate&lt;/em&gt; and &lt;em&gt;Lead Developer Advocate&lt;/em&gt;, and there’s also what I like to call the leadership path, where you can follow the manager ladder and can take up to positions such as &lt;em&gt;Director of Developer Relations&lt;/em&gt;. Is worth noting that these divisions do not prevent you from becoming a manager or an IC later, is just a guide so you can make sure you are developing yourself.&lt;/p&gt;

&lt;p&gt;Other companies may have different career progression in their sights. These positions can be changed or adapted as the team grows. Some day I might be Director of Developer Relations Latin America. Who knows? The possibilities are endless.&lt;/p&gt;

&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;

&lt;p&gt;This has been an exciting year. I feel even more creative when I look at the work I do. I see that I can help people. I also love what I do at work. Creating content to help others has been my life’s mission, and it is awesome to do that for a living.&lt;/p&gt;

&lt;p&gt;I can’t wait to see what the future holds.&lt;/p&gt;

&lt;style&gt;
.big-table { 
    width: 90%;
    margin-left: 5%;
    margin-right: 5%;
}
&lt;/style&gt;

</description>
        <pubDate>Tue, 29 Mar 2022 09:00:00 +0000</pubDate>
        <link>https://jtemporal.com/one-year-as-a-developer-advocate/</link>
        <guid isPermaLink="true">https://jtemporal.com/one-year-as-a-developer-advocate/</guid>
        
        <category>devrel</category>
        
        <category>english</category>
        
        <category>developer advocate</category>
        
        <category>developer relations</category>
        
        <category>developer advocacy</category>
        
        
      </item>
    
      <item>
        <title>Esquenta 2022 - Carreira: DevRel - Feministech 16.3</title>
        <description>&lt;p&gt;Quer saber o que é DevRel? O que quer dizer Developer Relations, Developer Advocacy ou Evangelism? E entender como eu vim parar nesse mundo novo?&lt;/p&gt;

&lt;p&gt;Você confere tudo lá no esquenta da temporada nova do Feministech Podcast ou apertando o play ali em baixo 👇&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;iframe src=&quot;https://anchor.fm/feministech/embed/episodes/Esquenta-2022---Carreira-Devrel-com-Jess-Temporal---Episdio-16-3-e1enl4q/a-a747dcb&quot; height=&quot;102px&quot; width=&quot;400px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt; &lt;/center&gt;
</description>
        <pubDate>Mon, 28 Feb 2022 13:00:00 +0000</pubDate>
        <link>https://jtemporal.com/esquenta-2022-carreira-devrel-feministech-16.3/</link>
        <guid isPermaLink="true">https://jtemporal.com/esquenta-2022-carreira-devrel-feministech-16.3/</guid>
        
        <category>português</category>
        
        <category>portugues</category>
        
        <category>pt_br</category>
        
        <category>pt_BR</category>
        
        
      </item>
    
      <item>
        <title>Meu processo de criação de conteúdo</title>
        <description>&lt;p&gt;Eu tenho mantido um blog por alguns anos e, desde que, criar conteúdos passou a ser meu ganha pão, eu tenho pensado bastante sobre métodos de escrita.&lt;/p&gt;

&lt;p&gt;Assim como programar bem, escrever bem, requer prática e dedicação. Depois de um certo tempo escrevendo, você passa a ter um sistema, uma coleção de passos que você sempre segue e aí você começa a pensar em como otimizar meu trabalho para obter resultados  cada vez melhores e entregas de alto nível mais rápidas.&lt;/p&gt;

&lt;p&gt;Esse texto é uma reflexão que eu estou fazendo sobre o meu “método de escrita”, que vale salientar é o mesmo método que uso para qualquer conteúdo que eu faço como palestras, vídeos e podcasts. Além disso, eu quero te mostrar de forma prática como você pode passar a escrever.&lt;/p&gt;

&lt;h2 id=&quot;por-onde-eu-comecei&quot;&gt;Por onde eu comecei&lt;/h2&gt;

&lt;p&gt;Bem, se você me acompanha pode saber que eu &lt;a href=&quot;https://jtemporal.com/de-0-a-17-mil-pageviews/&quot;&gt;não era a melhor aluna de português e redação na escola e eu nunca quis ser escritora&lt;/a&gt;, mas o mundo dá voltas e cá estamos. Escrever virou um hábito, depois passou a ser um gosto e hoje, posso dizer, que eu adoro escrever.&lt;/p&gt;

&lt;p&gt;Pra mim escrever é como eu organizo as minhas ideias, como eu entendo o mundo e os conceitos que eu estudo, como eu fixo informação. É parte tão integral do meu dia-a-dia de comunicação assíncrona que, se você tirar escrever de mim, eu provavelmente ficarei perdida.&lt;/p&gt;

&lt;p&gt;Meu primeiro blog era um site que eu usava como caderno de notas, escolhi um tema e coloquei no ar. Ele era mais pra mim do que pra qualquer outra pessoa e, acima de tudo, o seu objetivo não era ser um blog. Ele era um site onde eu colocava anotações e aprendizados.&lt;/p&gt;

&lt;p&gt;Acredito que o foco do meu primeiro site não ser o conteúdo, tirou de mim toda a pressão que vem com &lt;em&gt;“e se as pessoas não lerem o que eu escrevo?”&lt;/em&gt; ou &lt;em&gt;“e se as pessoas me julgarem?”&lt;/em&gt; ou ainda &lt;em&gt;“e se eu cometer erros?”&lt;/em&gt;, me dando tempo e um lugar seguro para praticar a escrita em si.&lt;/p&gt;

&lt;p&gt;Como o processo de escrita era relativamente custoso, já que eu tinha que recriar os markdowns que geravam os posts manualmente, e no boom inicial do Medium, eu passei um tempo escrevendo por lá, justamente pela facilidade de escrever em qualquer lugar.&lt;/p&gt;

&lt;p&gt;Depois de um tempo o Medium começou a cobrar por leitura e bloquear pessoas com &lt;em&gt;paywall&lt;/em&gt;. Foi então que eu decidi sair da plataforma e voltar a manter o conteúdo num lugar livre e que pessoas pudessem acessar sem pagar.&lt;/p&gt;

&lt;p&gt;Depois de mais de um ano escrevendo nesse site eu decidi transformá-lo em um blog &lt;em&gt;“content-first”&lt;/em&gt;. Um blog de verdade onde o foco era o conteúdo e que fosse melhor para pessoas encontrarem o que elas estavam procurando. A primeira coisa que eu fiz foi trocar de tema e passar usar &lt;em&gt;cards&lt;/em&gt; para dar ênfase no conteúdo.&lt;/p&gt;

&lt;h2 id=&quot;a-prática-leva-a-perfeição&quot;&gt;A prática leva a perfeição&lt;/h2&gt;

&lt;p&gt;Como falei antes, escrever é como programar, você precisa praticar diariamente, estudar, ler o material de outras pessoas para ver como elas enquadram seus assuntos, revisar o que fez e soltar para o mundo. Mas se você estiver começando agora isso pode parecer assustador e, muitas vezes, eu vejo pessoas focando nas coisas erradas.&lt;/p&gt;

&lt;p&gt;Eu tenho quatro dicas para te dar, duas delas são “teóricas” e as outras duas são práticas, todas essas são para quem tá começando a querer escrever, ou criar a prática. Coloquei “teóricas” entre aspas, porque elas se referem mais a uma forma de enxergar o hábito da escrita do que uma ação em si.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dicas teóricas:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Evite a otimização precoce e foque em escrever;&lt;/li&gt;
  &lt;li&gt;Tenha dois momentos diferentes: um para escrever e outro para editar;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Dicas práticas:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Anote o objetivo do texto antes de começar a escrever o conteúdo;&lt;/li&gt;
  &lt;li&gt;Depois do objetivo, escreva um esboço em tópicos;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Essas frases resumem bem cada dica, mas vamos passar por cada uma com mais carinho.&lt;/p&gt;

&lt;h2 id=&quot;evite-a-otimização-precoce-e-foque-em-escrever&quot;&gt;Evite a otimização precoce e foque em escrever&lt;/h2&gt;

&lt;p&gt;Se o seu objetivo é escrever, esse não é o momento de desenvolver o seu próprio blog, às vezes você quer usar o blog como um momento de estudo para aprender como usar um gerador de páginas estáticas novo, ou aquele &lt;em&gt;framework&lt;/em&gt; que tá dando o que falar, e eu entendo essa vontade, de verdade, mas se você quer escrever, talvez usar o blog como espaço de aprendizado de uma nova tecnologia não seja uma boa ideia.&lt;/p&gt;

&lt;p&gt;Nós, pessoas que desenvolvem, temos o péssimo hábito de querer implementar tudo do nosso jeito, de implementar uma versão melhor, mais completa, mais cheia de fru-fru, e esquecemos de focar no importante: &lt;em&gt;a entrega de valor&lt;/em&gt;. Isso vale tanto, para código quanto para escrita de texto e, no caso do conteúdo, a entrega de valor é exatamente essa, &lt;em&gt;o conteúdo&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Por exemplo, eu tenho usado muito o Notion para escrever rascunhos e outros projetos. Já vi outras pessoas também querem usar essa mesma ferramenta por que ela tem uma &lt;em&gt;feature&lt;/em&gt; chamada &lt;em&gt;Databases&lt;/em&gt;, que permite criar conteúdo de forma interconectada, mas será que você precisa mesmo usar databases agora? Talvez não, principalmente se você quer escrever.&lt;/p&gt;

&lt;p&gt;Você pode retrucar falando: &lt;em&gt;“Eu quero usar databases já para evitar retrabalho no futuro”&lt;/em&gt;. E aí eu te falo mais: Se você estivesse escrevendo código, que um dia, talvez, precise usar uma base de dados, você iria pensar em escrever a integração com base de dados agora? Gosto de acreditar que não. No máximo você estruturaria seu código para facilitar a refatoração no futuro, não é mesmo? Então, aplique o mesmo pensamento à sua escrita, facilite o seu lado até onde der, mas não se prenda ao que você vai precisar no futuro.&lt;/p&gt;

&lt;p&gt;Se prender ao futuro te impede de focar no mais importante de entregar agora: criar a prática de escrever. Você pode escrever até no bloco de notas se você quiser, o importante é focar naquilo que você precisa de verdade.&lt;/p&gt;

&lt;h2 id=&quot;escreva-em-um-momento-e-edite-em-outro&quot;&gt;Escreva em um momento e edite em outro&lt;/h2&gt;

&lt;p&gt;Para estarmos na mesma página, acho importante definir o que eu encaro como edição. Para mim, editar é ato de remover coisas desnecessárias, ajustar parágrafos e frases para que façam mais sentido e corrigir erros de digitação. Todas as atividades que envolvem melhorar o que já foi escrito. Isso só é possível depois que você tem algo na página.&lt;/p&gt;

&lt;p&gt;Eu conheço pessoas que conseguem escrever e já irem editando o texto ao mesmo tempo. Isso não funciona para mim, eu preciso ter dois momentos separados, um para cada parte. Eu gosto de dizer que primeiro eu derrubo tudo que tô pensando na página e &lt;em&gt;depois&lt;/em&gt; eu faço isso ficar bonito.&lt;/p&gt;

&lt;p&gt;Todas as vezes que eu fiz os dois ao mesmo tempo, eu acabei desistindo de publicar o conteúdo ou até mesmo de terminar o artigo. Além disso, editar em um momento e escrever em outro, me ajuda a melhorar bastante os meus textos e terminar um texto num espaço mais curto de tempo.&lt;/p&gt;

&lt;p&gt;Além de reduzir o tempo de criação de um artigo, fazer as coisas separadamente me ajuda também a chegar ao objetivo de todo conteúdo que eu faço: &lt;em&gt;publicá-los para que eles possam ajudar alguém&lt;/em&gt;. Afinal, o texto existir apenas no meu computador não serve para nada além de ocupar espaço.&lt;/p&gt;

&lt;p&gt;Já que estamos falando de edição, se você chegar na minha casa e eu estiver editando um texto, você vai me encontrar lendo ele em voz alta. Ler em voz alta me força a ler o conteúdo devagar, encontrar falhas nas explicações que pareciam claras no momento da escrita se torna mais fácil, assim como encontrar erros de digitação. Leia os seus textos em voz alta antes de publicá-los, confie em mim.&lt;/p&gt;

&lt;h2 id=&quot;comece-pelo-objetivo-e-retorne-a-ele-sempre-que-preciso&quot;&gt;Comece pelo objetivo e retorne a ele sempre que preciso&lt;/h2&gt;

&lt;p&gt;Às vezes, eu tenho um problema de foco: de tempos em tempos me ataca uma vontade de querer abordar mais de uma coisa no mesmo texto. Para vencer esse problema de foco eu sempre começo anotando a introdução do texto no formato de um objetivo a ser alcançado:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Aprenda X conceito;&lt;/li&gt;
  &lt;li&gt;Veja como implementar Y;&lt;/li&gt;
  &lt;li&gt;Descubra como fazer Z.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Obviamente embalado com mais algumas palavras de contextualização e num formato de &lt;em&gt;call-to-action&lt;/em&gt; para atrair a atenção de quem lê. O objetivo serve, ao meu ver, principalmente para duas coisas:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Do lado de quem lê: despertar interesse e dar clareza sobre o que vai ser abordado ou o problema a ser resolvido;&lt;/li&gt;
  &lt;li&gt;Do lado de quem escreve: guiar a sua escrita e te manter na linha evitando desfocar daquilo que você se propôs a resolver no texto.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por isso, anotar o objetivo primeiro é de grande valia. Após terminar a escrita do rascunho, o primeiro &lt;em&gt;check&lt;/em&gt; que eu faço é conferir se eu resolvi aquilo que eu propus no início do texto. Caso a resposta seja não, ou eu ajusto o texto para atingir o objetivo ou eu guardo a ideia inicial para um novo blog post e reescrevo a introdução para combinar com aquilo que eu realmente entreguei.&lt;/p&gt;

&lt;p&gt;Uma revelação que me ocorreu também nesse processo é que os meus melhores artigos tem como objetivo uma pergunta muito clara a ser respondida. É uma verdade que, se você não puder pagar ferramentas ou fazer pesquisas para otimizar o seu texto, a melhor otimização que você pode fazer é responder &lt;em&gt;apenas uma&lt;/em&gt; pergunta por artigo. Ao fazer isso, tanto quem lê quanto o Google, vão entender o que aquele artigo propõe.&lt;/p&gt;

&lt;h2 id=&quot;escreva-um-esboço-em-tópicos&quot;&gt;Escreva um esboço em tópicos&lt;/h2&gt;

&lt;p&gt;Depois de escrever o foco do artigo, eu sempre tento organizar as minhas ideias, então eu anoto o que preciso escrever sem falta no formato de tópicos. Digamos que esses tópicos são a receita mínima, mas sem detalhes, que garante que eu respondi a pergunta inicial.&lt;/p&gt;

&lt;p&gt;Geralmente, esses tópicos definem as seções do texto e muitas vezes eles viram os títulos e subtítulos de determinadas seções. Por exemplo, eu estou trabalhando em um material que fala sobre o uso de um CDN no &lt;a href=&quot;https://gitfichas.com/&quot;&gt;GitFichas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Eu escrevi os tópicos no formato das perguntas que eu faria para entender a justificativa de usar uma nova ferramenta num projeto. Comecei com o motivo de usar um CDN, passando pelo o que é e a sua relação com a velocidade de carregamento de uma página. Em seguida, eu pensei em falar sobre qual serviço eu escolhi como CDN. Depois conto como eu subi e organizei as imagens no CDN e finalizei com a parte de atualização de posts para usar as imagens de lá.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/tabela-de-conteudo-com-o-blog-post-sobre-usar-um-cdn.webp&quot; alt=&quot;índice contendo os títulos das seções do artigo sobre CDN&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Se esse blog post do CDN fosse em um formato de tutorial (que ele não é hoje) ele provavelmente ainda teria uma seção de fechamento para rever os conceitos aprendidos  ou para ressaltar pontos principais.&lt;/p&gt;

&lt;p&gt;Escrever esses tópicos me ajuda a definir a estrutura inicial do texto e também a quebrar a tarefa que é escrever um artigo. Ao invés de pensar em escrever um artigo por completo, eu pode começo com apenas uma seção, posso fazer uma pausa, ir para outra e assim sucessivamente.&lt;/p&gt;

&lt;p&gt;Depois de escrever os tópicos das seções mais importantes, eu listo também em formato de tópicos, os assuntos que vou abordar em cada seção. Pensar em tópicos antes de escrever o texto por completo pode ajudar também a encontrar falhas de estruturação e facilitar a adaptação antes de ter retrabalho para reescrever seções por completo, assim eu facilito a minha vida caso precise fazer alguma alteração maior logo de cara.&lt;/p&gt;

&lt;h2 id=&quot;conclusão&quot;&gt;Conclusão&lt;/h2&gt;

&lt;p&gt;É importante lembrar que esse é o meu processo e ele funciona muito bem para mim embora tenha levado uns três anos pra eu ficar realmente feliz com ele.&lt;/p&gt;

&lt;p&gt;Eu estou te contando que isso demorou uns três anos, não para te desestimular, mas para te garantir que, se encontrar esse método estiver demorando para você, tudo bem.&lt;/p&gt;

&lt;p&gt;O mais importante é você encontrar o que funciona para você, o seu processo, no seu ritmo.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Pra finalizar, eu aposto que você quer um resumo de tudo que você acabou de ler, não é mesmo? Aqui estão os pontos principais:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Evite a otimização precoce e foque em escrever;&lt;/li&gt;
  &lt;li&gt;Tenha dois momentos diferentes: um para escrever e outro para editar;&lt;/li&gt;
  &lt;li&gt;Anote o objetivo do texto antes de começar a escrever o conteúdo;&lt;/li&gt;
  &lt;li&gt;Escreva um esboço em tópicos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para finalizar, tente colocar em prática, pelo menos, uma das coisas que você aprendeu com esse texto o quanto antes, enquanto a memória está recente, assim a probabilidade de você fixar esse novo jeito de pensar é maior.&lt;/p&gt;
</description>
        <pubDate>Sat, 12 Feb 2022 11:00:00 +0000</pubDate>
        <link>https://jtemporal.com/o-meu-metodo-de-criacao-de-conteudo/</link>
        <guid isPermaLink="true">https://jtemporal.com/o-meu-metodo-de-criacao-de-conteudo/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>My content creation process</title>
        <description>&lt;p&gt;I’ve been blogging for a few years, and since creating content has become my bread and butter, I’ve been thinking a lot about writing methods.&lt;/p&gt;

&lt;p&gt;Just like programming well, writing well takes practice and dedication. After some time writing, you have a system, a collection of steps that you always follow, and then you start thinking about how to optimize your work to get better results and faster high-level deliveries.&lt;/p&gt;

&lt;p&gt;This text is a reflection I’m doing about my own “writing method”, which is worth noting is the same method I use for any content I produce such as talks, videos, and podcasts. Besides, I want to show you in a practical way how you can start writing.&lt;/p&gt;

&lt;h2 id=&quot;where-i-started&quot;&gt;Where I started&lt;/h2&gt;

&lt;p&gt;Well, if you follow me you may know that &lt;a href=&quot;https://jtemporal.com/from-0-to-17-thousand-pageviews/&quot;&gt;I was not the best language and writing student in school and I never wanted to be a writer&lt;/a&gt;, but the world turns and here we are. Writing became a habit, later it became something I liked to do. Today, I can say that I love writing.&lt;/p&gt;

&lt;p&gt;For me, writing is how I organize my ideas, how I understand the world and the concepts I study, and how I get information into my head. It’s such a fundamental part of my day-to-day asynchronous communication that if you take the writing away from me, I’ll probably be lost.&lt;/p&gt;

&lt;p&gt;My first blog was a website that I used as a notepad, I basically chose a theme and deployed it. It was more for me than for anyone else, and above all, its goal was not to be a blog. It was a website where I posted notes and learnings.&lt;/p&gt;

&lt;p&gt;I believe that not having content as the focus of my first website took off all the pressure that comes with &lt;em&gt;“what if people don’t read what I write?”&lt;/em&gt; or &lt;em&gt;“what if people judge me?”&lt;/em&gt; or even &lt;em&gt;“what if I make mistakes?”,&lt;/em&gt; which gave me time and a safe place to practice writing itself.&lt;/p&gt;

&lt;p&gt;As the writing process was relatively costly, since I had to recreate the markdowns that generated the posts manually, and with the initial boom of Medium, I spent some time writing there, especially because it was easy to write anywhere.&lt;/p&gt;

&lt;p&gt;After a while Medium started charging per reading and blocking people with a paywall. It was then that I decided to leave the platform and go back to keeping the content in a free place where people could access it without paying.&lt;/p&gt;

&lt;p&gt;After more than a year of writing on this site, I decided to turn it into a &lt;em&gt;“content-first”&lt;/em&gt; blog. A real blog where the focus was on content and that was better for people to find what they were looking for. The first thing I did was change the theme and also started using &lt;em&gt;cards&lt;/em&gt; to emphasize the content.&lt;/p&gt;

&lt;h2 id=&quot;practice-leads-to-perfection&quot;&gt;&lt;strong&gt;Practice leads to perfection&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;As I said before, writing is like programming, you need to practice daily, study, read other people’s materials to see how they frame their subjects, review what you’ve done, and release it to the world. But if you’re just starting out this can seem daunting and I often see people focusing on the wrong things.&lt;/p&gt;

&lt;p&gt;I have four tips to give you, two of them are “theoretical” and the other two are practical, all of these are for those who are starting to grow that writing needs, or that want to practice. I say “theoretical” - in quotation marks - because they refer more to a way of looking at the habit of writing than the habit itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Theoretical tips:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Avoid early optimization and focus on writing;&lt;/li&gt;
  &lt;li&gt;Have two different moments: one for writing and another one for editing;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Practical tips:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Write down the purpose of the text before starting to write the content;&lt;/li&gt;
  &lt;li&gt;After writing the purpose, write a bulleted outline;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These statements sum up each tip well, but let’s go through each one more carefully.&lt;/p&gt;

&lt;h2 id=&quot;avoid-early-optimization-and-focus-on-writing&quot;&gt;Avoid early optimization and focus on writing&lt;/h2&gt;

&lt;p&gt;If your goal is writing, this is not the time to develop your own blog. Sometimes you want to use the blog as a study moment to learn how to use a new static page generator, or that framework that sets tongues wagging, and I understand that desire, really, but if you want to write, maybe using the blog as a space for learning a new technology is not a good idea.&lt;/p&gt;

&lt;p&gt;We, people who develop, have a bad habit of wanting to implement everything our way, of implementing a better, more complete, full-of-features version of something, and we forget to focus on what’s important: &lt;em&gt;delivering value&lt;/em&gt;. This goes for both code and writing and, in the case of content, the delivery of value is exactly that, &lt;em&gt;the content&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For example, I’ve been using Notion a lot for writing drafts and keeping track of other projects. I’ve seen other people also want to use this same tool because it has a feature called &lt;em&gt;Databases&lt;/em&gt;, which allows you to create content in an interconnected way, but do you really need to use databases now? Maybe not, especially if you want to write.&lt;/p&gt;

&lt;p&gt;You can argue by saying: “I want to use databases now to avoid rework in the future”. And then I’ll tell you more: If you were writing code, which one day, maybe, you need to use a database, would you think about writing the integration with a database now? I like to believe you wouldn’t. At most you would structure your code to make refactoring easier in the future, wouldn’t you? So, apply the same thinking to your writing, make it easier on yourself as much as you can, but don’t get caught up on what you might need in the future.&lt;/p&gt;

&lt;p&gt;Holding on to the future prevents you from focusing on the most important thing to deliver now: creating the practice of writing. You can even write on a notepad if you want, the important thing is to focus on what you really need.&lt;/p&gt;

&lt;h2 id=&quot;write-in-a-moment-and-edit-in-another&quot;&gt;Write in a moment, and edit in another&lt;/h2&gt;

&lt;p&gt;To be on the same page, I think it’s important to define what I see as editing. For me, editing is the act of removing unnecessary things, adjusting paragraphs and sentences to make more sense, and correcting typos. All activities that involve improving what has already been written. This is only possible after you have something on the page.&lt;/p&gt;

&lt;p&gt;I know people who can write and edit text at the same time. This doesn’t work for me, I need to have two separate moments, one for each part. I like to say that first I drop everything I’m thinking about on the page and &lt;em&gt;then&lt;/em&gt; I make it look nice.&lt;/p&gt;

&lt;p&gt;Every time I did both things at the same time, I ended up giving up on publishing the content or even finishing the article. Besides, editing at one time and writing at another helps me to improve my content a lot and finish a piece in a shorter time span.&lt;/p&gt;

&lt;p&gt;In addition to reducing the time to create an article, doing things separately also helps me reach the goal of all the content I make: &lt;em&gt;publishing them so they can help someone else&lt;/em&gt;. After all, the content existing only on my computer serves no purpose other than taking up space.&lt;/p&gt;

&lt;p&gt;Since we’re on the subject of editing, if you come to my house and I’m editing a text, you’ll find me reading it out loud. Reading out loud forces me to read content slowly, so finding flaws in explanations that seemed clear at the time of writing becomes easier, as does finding typos. Read your texts aloud before publishing them, trust me.&lt;/p&gt;

&lt;h2 id=&quot;start-with-the-purpose-and-return-to-it-whenever-needed&quot;&gt;Start with the purpose and return to it whenever needed&lt;/h2&gt;

&lt;p&gt;Sometimes I have a problem with focusing: from time to time I feel like I want to cover more than one thing in the same piece of content. To overcome this focus problem I always start by writing down the text intro in the format of a goal to be achieved:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Learn concept X;&lt;/li&gt;
  &lt;li&gt;See how to implement Y;&lt;/li&gt;
  &lt;li&gt;Find out how to do Z.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Obviously, that comes wrapped with a few more words of context and in a call-to-action format to grab the reader’s attention. The goal serves, in my view, mainly for two purposes:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;On the side of the reader: spark interest and provide clarity about what will be addressed or the problem to be solved;&lt;/li&gt;
  &lt;li&gt;On the side of the writer: guide your writing and keep you in line, avoiding blurring the lines of the problem you set out to solve in the text.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Therefore, writing down the goal first is of great value. After finishing writing the draft, the first thing I do is check if I solved what I proposed at the beginning of the content. If the answer is no, either I adjust the content to achieve the goal or save the initial idea for a new blog post and rewrite the intro to match what I actually delivered.&lt;/p&gt;

&lt;p&gt;A revelation that also occurred to me in this process is that my best articles aim at a very clear question to be answered. It’s true that if you can’t afford tools or research to optimize your text, the best optimization you can do is answer &lt;em&gt;just one&lt;/em&gt; question per article. By doing this, both readers and Google will understand what that article proposes.&lt;/p&gt;

&lt;h2 id=&quot;write-an-outline-in-topics&quot;&gt;&lt;strong&gt;Write an outline in topics&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;After writing the main point of the article, I always try to organize my ideas, so I write down what I need to c without fail in topics. Let’s say these topics are the minimal recipe, but with no details, which ensures I’ve answered the initial question.&lt;/p&gt;

&lt;p&gt;These topics usually define the sections of the text and they often become the headings and subheadings of certain sections. For example, I’m working on a material that talks about using a CDN in &lt;a href=&quot;https://gitfichas.com/en?utm_source=blog&quot;&gt;GitFichas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I wrote the topics in the format of the questions I would ask to understand the reason for using a new tool in a project. I started with the reason for using a CDN, going through what it is and its relationship to the speed of a page load. Next, I thought I’d talk about which service I chose as a CDN. Then I’d tell you how I uploaded and organized the images on the CDN and finished with the update of the posts section to use the images from the CDN.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/tabela-de-conteudo-com-o-blog-post-sobre-usar-um-cdn.webp&quot; alt=&quot;Index containing the sectio titles of an article about CDN in portuguese&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; max-width: 50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If this CDN blog post were in a tutorial format (which it is not today) it would likely still have a closing section to review concepts learned or to highlight key points.&lt;/p&gt;

&lt;p&gt;Writing these topics helps me to define the initial structure of the text and also to break down the task of writing an article. Rather than thinking about writing an entire article, I might start with just one section, pause, move on to another, and so on.&lt;/p&gt;

&lt;p&gt;After writing the topics of the most important sections, I also list in bullet points format the topics I will cover in each section. Thinking about topics before writing the entire text can also help to find structure flaws and facilitate adaptation before having to completely rewrite sections, so I make my life easier in case I need to make any major changes right away.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;It’s important to remember that this is my process and it works really well for me although it took me about three years to get really happy with it.&lt;/p&gt;

&lt;p&gt;I’m telling you that it took about three years, not to put you off, but to reassure you that if finding your method is taking a while, that’s okay.&lt;/p&gt;

&lt;p&gt;The most important thing is that you find what works for you, your process, at your own pace.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;Finally, I bet you want a summary of everything you just read, right? Here are the main points:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Avoid early optimization and focus on writing;&lt;/li&gt;
  &lt;li&gt;Have two different moments: one for writing and another for editing;&lt;/li&gt;
  &lt;li&gt;Write down the purpose of the text before starting to write the content;&lt;/li&gt;
  &lt;li&gt;Write an outline.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Finally, try to put into practice at least one of the things you learned from this text as soon as possible, while your memory is fresh, chances are that will incorporate this new way of thinking faster if you do so.&lt;/p&gt;
</description>
        <pubDate>Sat, 12 Feb 2022 11:00:00 +0000</pubDate>
        <link>https://jtemporal.com/my-content-creation-process/</link>
        <guid isPermaLink="true">https://jtemporal.com/my-content-creation-process/</guid>
        
        <category>english</category>
        
        <category>pro tip</category>
        
        
      </item>
    
      <item>
        <title>Entenda a diferença entre git stash pop e git stash apply</title>
        <description>&lt;p&gt;Você pode saber criar seus stashes, listar eles e tudo mais, mas na hora de voltar a usar o trabalho salvo em um stash sempre rola aquela dúvida: “&lt;em&gt;apply ou pop? Eis a questão&lt;/em&gt;”. E essa dúvida é muito normal já que ambos tem um funcionamento parecido, ambos aplicam as mudanças guardadas em um stash.&lt;/p&gt;

&lt;p&gt;Nessa colinha você vai ver quando usar um e quando usar o outro. 😉&lt;/p&gt;

&lt;h2 id=&quot;o-git-stash-apply&quot;&gt;O git stash apply&lt;/h2&gt;

&lt;p&gt;O &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt; aplica as mudanças de um stash no seu diretório de trabalho e mantém a entrada na lista de stashes. Por exemplo, considere que você tem a seguinte pilha de stashes:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/listagem-stashes-fig1.webp&quot; alt=&quot;imagem mostrando a lista de stashes como resultado do comando git stash list com dois stashes na lista&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E você quer aplicar as mudanças do primeiro stash o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stash@{0}&lt;/code&gt;. Para isso, rode o comando:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git stash apply
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O resultado esperado é encontrar as mudanças guardadas naquele stash no seu branch local:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-git-stash-apply-fig2.webp&quot; alt=&quot;imagem mostrando o resultado do comando git stash apply com as mudanças presentes&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E também encontrar aquelas mudanças ao listar os stashes:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/git-stash/listagem-stashes-fig1.webp&quot;&gt;imagem mostrando a lista de stashes como resultado do comando git stash list com dois stashes na lista&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note que o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt; assim como o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;drop&lt;/code&gt; e o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pop&lt;/code&gt; sem passar um índice irá usar a stash mais recente da pilha.&lt;/p&gt;

&lt;h2 id=&quot;o-git-stash-pop&quot;&gt;O git stash pop&lt;/h2&gt;

&lt;p&gt;O &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pop&lt;/code&gt; por sua vez, vai aplicar as mudanças de um stash à sua área de trabalho e remover aquele stash da pilha em seguida. O pop nada mais é do que um atalho para &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash apply&lt;/code&gt; seguido de &lt;a href=&quot;https://jtemporal.com/para-que-serve-o-git-stash-drop/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash drop&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por exemplo, levando em consideração a mesma lista de stashes anterior, e um ambiente de trabalho sem mudanças, você quer tirar da lista e aplicar as mudanças do primeiro stash o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stash@{0}&lt;/code&gt;. Então você roda o comando:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git stash pop
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O resultado esperado é encontrar as mudanças guardadas naquele stash no seu branch local, assim como no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-git-stash-pop-fig3.webp&quot; alt=&quot;imagem mostrando o resultado do comando git stash pop com as mudanças presentes&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E, diferentemente do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt;, ele já mostra que o stash correspondente foi removido da lista na mensagem de resultado. Se você rodar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash list&lt;/code&gt; não vai encontrar mais aquele stash na lista:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/listagem-stashes-pos-dropfig3.webp&quot; alt=&quot;imagem mostrando a lista de stashes só com um stash como resultado de ter feito o pop do stash mais recente&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;quando-usar-apply-e-quando-usar-pop&quot;&gt;Quando usar apply e quando usar pop&lt;/h2&gt;

&lt;p&gt;Digamos que você queira reaproveitar as mudanças que você fez em outro lugar também, ou não tem certeza se você quer usar elas agora, então você pode usar a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt; e caso não queira continuar com elas, usar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset HEAD&lt;/code&gt; para descartá-las, assim mantendo as mudanças armazenadas num stash para mais tarde.&lt;/p&gt;

&lt;p&gt;Caso você tenha certeza que quer aplicar as mudanças use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pop&lt;/code&gt;, assim além de aplicar as mudanças você mantém a lista de stash limpinha. Via de regra, eu prefiro sempre usar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pop&lt;/code&gt; e refazer o stash caso eu precise guardar as mudanças para mais tarde.&lt;/p&gt;

&lt;p&gt;O importante é que agora você entende a diferença entre um e outro e não precisa mais ter medo do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/044?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1644151679/gitfichas/pt/046/full_mutfuw.jpg&quot; alt=&quot;GitFicha #046: git stash drop&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/044?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642964759/gitfichas/pt/044/full_sbhjsb.jpg&quot; alt=&quot;GitFicha #044: git stash pop&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

</description>
        <pubDate>Sun, 06 Feb 2022 11:00:00 +0000</pubDate>
        <link>https://jtemporal.com/entenda-a-diferenca-git-stash-pop-git-stash-apply/</link>
        <guid isPermaLink="true">https://jtemporal.com/entenda-a-diferenca-git-stash-pop-git-stash-apply/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>Learn why the command git stash drop is useful</title>
        <description>&lt;p&gt;Need to clear the stash list and don’t know how? Don’t worry, in this pro tip you will learn how to “throw away” stashes that you no longer need using the command  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash drop&lt;/code&gt;. 😉&lt;/p&gt;

&lt;h2 id=&quot;the-usual-git-stash-workflow&quot;&gt;The usual git stash workflow&lt;/h2&gt;

&lt;p&gt;Usually, you probably use git stash to store changes that are temporary and not yet ready for a commit. This often happens when you need to interrupt work to fix a bug or something similar on another branch. So your workflow should look like this:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;work work work
&lt;span class=&quot;go&quot;&gt;git stash
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;switch branches and &lt;span class=&quot;k&quot;&gt;do &lt;/span&gt;other deliveries
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;go back to the initial branch
&lt;span class=&quot;go&quot;&gt;git stash pop
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So far so good, but what happens when you store changes for another reason, like cleaning up the work environment? Eventually you’ll want to get rid of these changes to keep your work environment clean, right? This is where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash drop&lt;/code&gt; comes in.&lt;/p&gt;

&lt;h2 id=&quot;discarding-a-stash&quot;&gt;Discarding a stash&lt;/h2&gt;

&lt;p&gt;Old stashes can be a source of a lot of headache, &lt;em&gt;yes conflicts, I’m talking about you&lt;/em&gt;, so it’s important to keep your stash list up to date. Suppose you currently have the following stash list:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/listagem-stashes-fig1.webp&quot; alt=&quot;Image showing the stash list as output of the command git stash list with two stashes in the list&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You want to get rid of stash number &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; which contains the creation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-2.txt&lt;/code&gt;. To do this, run the following command:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git stash drop stash@{0}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You should see a message informing the stash has been removed:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-git-stash-drop-fig2.webp&quot; alt=&quot;Image showing the output of the command git stash drop &quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then you can double check the stash listing:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/listagem-stashes-pos-dropfig3.webp&quot; alt=&quot;imagem mostrando a lista de stashes só com um stash como resultado de ter feito o drop de um dos stashes anteriores&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s worth mentioning that just like &lt;a href=&quot;https://jtemporal.com/using-git-stash-and-git-stash-pop&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash pop&lt;/code&gt;&lt;/a&gt;, if you don’t pass the stash name to the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash drop&lt;/code&gt;, it will remove the most recent stash from the stack.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas--gitstudycards&quot;&gt;GitFichas | GitStudyCards&lt;/h2&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/045?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1644148964/gitfichas/en/045/full_zugn9f.jpg&quot; alt=&quot;GitFicha #045: git stash drop&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/043?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642964722/gitfichas/en/043/full_qdsc7t.jpg&quot; alt=&quot;GitFicha #043: git stash list&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Hope these commands help you to remove stashes when needed.&lt;/p&gt;
</description>
        <pubDate>Sat, 05 Feb 2022 13:25:00 +0000</pubDate>
        <link>https://jtemporal.com/why-the-git-stash-drop-is-useful/</link>
        <guid isPermaLink="true">https://jtemporal.com/why-the-git-stash-drop-is-useful/</guid>
        
        <category>git</category>
        
        <category>english</category>
        
        <category>pro tip</category>
        
        
      </item>
    
      <item>
        <title>Aprenda para que serve o comando git stash drop</title>
        <description>&lt;p&gt;Tá precisando limpar a lista de stashes e não sabe como? Não se preocupe, nessa colinha você vai aprender a “jogar fora” stashes que não precisa mais usando o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash drop&lt;/code&gt;. 😉&lt;/p&gt;

&lt;h2 id=&quot;o-fluxo-comum-de-uso-do-git-stash&quot;&gt;O fluxo comum de uso do git stash&lt;/h2&gt;

&lt;p&gt;Comumente você provavelmente usa o git stash para armazenar mudanças temporárias e que ainda não estão prontas para um commit. Muitas vezes isso acontece quando você precisa interromper o trabalho para corrigir um bug ou algo similar em outra branch. Então o seu fluxo de trabalho deve ser algo semelhante a esse:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;trabalha trabalha trabalha
&lt;span class=&quot;go&quot;&gt;git stash
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;muda de branch e faz outras entregas
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;volta pro branch inicial
&lt;span class=&quot;go&quot;&gt;git stash pop
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E até aí tudo bem, mas o que acontece quando você armazena mudanças por outro motivo, por exemplo, limpar o ambiente de trabalho? Eventualmente você vai querer se livrar dessas mudanças para manter a casa limpa não é mesmo? É nessa hora que entra o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash drop&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;jogando-fora-um-stash&quot;&gt;Jogando fora um stash&lt;/h2&gt;

&lt;p&gt;Stashes antigos podem ser fonte de muita dor de cabeça, &lt;em&gt;sim conflitos, eu estou falando de vocês&lt;/em&gt;, então é importante manter a lista de stashes sempre em dia. Suponha que atualmente você tem a lista a seguir de stashes:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/listagem-stashes-fig1.webp&quot; alt=&quot;imagem mostrando a lista de stashes como resultado do comando git stash list com dois stashes na lista&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Você quer se livrar do stash de número &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; que contém a criação do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-2.txt&lt;/code&gt;. Para isso rode o comando a seguir:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git stash drop stash@{0}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Você deverá ver uma mensagem informando que o stash foi removido:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-git-stash-drop-fig2.webp&quot; alt=&quot;imagem mostrando o resultado do comando git stash drop&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Em seguida, você pode conferir novamente a listagem de stashes:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/listagem-stashes-pos-dropfig3.webp&quot; alt=&quot;imagem mostrando a lista de stashes só com um stash como resultado de ter feito o drop de um dos stashes anteriores&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Vale salientar que assim como o &lt;a href=&quot;https://jtemporal.com/usando-git-stash-e-git-stash-pop&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash pop&lt;/code&gt;&lt;/a&gt;, se você não passar o nome do stash para o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash drop&lt;/code&gt; ele vai remover o stash mais recente da pilha.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/045?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1644148850/gitfichas/pt/045/full_pketo7.jpg&quot; alt=&quot;GitFicha #045: git stash drop&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/043?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642964759/gitfichas/pt/043/full_uuuiaz.jpg&quot; alt=&quot;GitFicha #043: git stash list&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Espero que esses comandos te ajudem a remover stashes quando necessário.&lt;/p&gt;
</description>
        <pubDate>Sat, 05 Feb 2022 13:25:00 +0000</pubDate>
        <link>https://jtemporal.com/para-que-serve-o-git-stash-drop/</link>
        <guid isPermaLink="true">https://jtemporal.com/para-que-serve-o-git-stash-drop/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>Using git stash: pop, apply, and drop</title>
        <description>&lt;p&gt;Switching branches during the middle of work is something that happens quite often, for example, when &lt;em&gt;”hotfixing”&lt;/em&gt; a bug in another branch while you’re implementing a task.&lt;/p&gt;

&lt;p&gt;There are a few ways of stopping work, including making commits. My favorite way of doing that is using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash pop&lt;/code&gt;. People often mix up how these work, along with the related &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash apply&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash drop&lt;/code&gt;, so let’s sort all of them out. 😉&lt;/p&gt;

&lt;h2 id=&quot;what-is-a-stash&quot;&gt;What is a stash&lt;/h2&gt;

&lt;p&gt;Stash can be seen as a bundle of the current, not-yet-committed changes that are saved locally on your computer in a stack. Each change bundle is called a stash.&lt;/p&gt;

&lt;p&gt;When a stash is created, your directory reverts to a &lt;em&gt;clean state&lt;/em&gt;, that is, with no changes to the files that are tracked by Git. This also means that new files, which have not yet been added in a commit, are not stashed.&lt;/p&gt;

&lt;p&gt;Each stash receives a “name”, an index, in the format of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stash@{&amp;lt;n&amp;gt;}&lt;/code&gt;, where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;n&quot;&lt;/code&gt; refers to a number corresponding to the stash position in the stash stack. This number always changes if more stashes are added to the stack, so the most recent stash is always &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stash@{0}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Stacks are a common concept in programming, and this is important to understand the stash behavior, because, without indicating the stash index, the commands will follow the LIFO order (“last in, first out”), where the last stash, that is, the most recent stash to be added to the stack is removed first.&lt;/p&gt;

&lt;h2 id=&quot;saving-a-work-in-progress-with-a-stash&quot;&gt;Saving a work in progress with a stash&lt;/h2&gt;

&lt;p&gt;So let’s say you are working on the branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa&lt;/code&gt; that corresponds to the implementation of some feature, but now you need to go back to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; branch and solve a very important problem. To make it easier, we will not focus on problem solving. This is the current state of your work:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/git-status-trabalho-em-adamento.webp&quot; alt=&quot;Image of the terminal showing that there are changes to a file&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now you need to save the work you’ve already done before going back to the branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;. To do so, use the following command:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git stash
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This command is a shortcut to the full command, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash push&lt;/code&gt;. Now that the stash is done, you will see an output similar to the following:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-comando-git-stash.webp&quot; alt=&quot;Image showing the output of git stash&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can also see the stash you just made using the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash list&lt;/code&gt; to see the list of existing stashes:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-comando-git-stash-list.webp&quot; alt=&quot;Image showing the output of git stash list&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note in the image above that the stash listing always displays the stash index and a message. Now that your work is saved, you can seamlessly switch branches and resolve whatever you need to. It’s worth pointing out that stashes are not tied to a branch, so you will still be able to see your stash in the list even after switching branches.&lt;/p&gt;

&lt;h2 id=&quot;getting-back-to-work-with-a-pop&quot;&gt;Getting back to work with a pop&lt;/h2&gt;

&lt;p&gt;After you finish adjustments on the branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;, you can finally get back to working on that feature on branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa&lt;/code&gt;. To &lt;em&gt;“unstash”&lt;/em&gt; the stack and apply the changes you saved, use the following command:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git stash pop
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pop&lt;/code&gt; will remove the most recent stash from the stack and apply the changes it contains, and you should see an output that looks like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resutlado-comando-git-stash-pop.webp&quot; alt=&quot;Image showing the output of the command git stash pop &quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now you have everything you need to continue your work.&lt;/p&gt;

&lt;h2 id=&quot;keeping-the-stash-with-apply&quot;&gt;Keeping the stash with apply&lt;/h2&gt;

&lt;p&gt;What if you want your changes back but you would like to keep the stash around, maybe to apply it on more than one branch? That is what &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash apply&lt;/code&gt; is for. It works just like pop, except it does not remove the stash from the stack:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git stash apply
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The short version: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pop&lt;/code&gt; applies the stash and removes it, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt; applies it and keeps it. Reach for apply when you are not sure you are done with those changes yet.&lt;/p&gt;

&lt;h2 id=&quot;cleaning-up-with-drop&quot;&gt;Cleaning up with drop&lt;/h2&gt;

&lt;p&gt;Since &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt; leaves the stash on the stack, at some point you will want to clear it out. Use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash drop&lt;/code&gt; to remove the most recent stash without applying it:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git stash drop
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also drop a specific stash by passing its index, for example &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash drop stash@{2}&lt;/code&gt; to remove the one at index two. And if you want to wipe every stash at once, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash clear&lt;/code&gt; does that.&lt;/p&gt;

&lt;h2 id=&quot;how-to-add-a-new-file-to-a-stash&quot;&gt;How to add a new file to a stash&lt;/h2&gt;

&lt;p&gt;As I said before, new files don’t get stashed. This happens because they don’t have previous tracking. For example, let’s say that while working on the branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa&lt;/code&gt;, in addition to modifying the file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-tarefa.txt&lt;/code&gt;, you’ve also created the file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-2.txt&lt;/code&gt;, leaving you with the following result in your working directory:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/git-status-trabalho-em-adamento-arquivo-novo.webp&quot; alt=&quot;git status output showing a modified file and a new file&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you try to stash these changes, you’ll see that the new file is still there, alive and kicking:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/git-stash-falha-adiocionar-arquivo-novo.webp&quot; alt=&quot;Commands git stash and git status output showing that the new file has not been stashed&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And then you might be wondering, since the stash command doesn’t take new files into account, how do we get around this behavior? And the good news is that there is a trick to adding new files to a stash: you need to add them to staging!&lt;/p&gt;

&lt;p&gt;Then add the new file with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git add&lt;/code&gt; and you’ll have something like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-adicionar-o-arquivo-novo-em-staging.webp&quot; alt=&quot;Image showing the staging area with the new file&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And if you run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash&lt;/code&gt; again you will see that now your stash also saves the new file and as a result you have your working directory clean:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-stash-salvando-tambem-o-arquivo-novo.webp&quot; alt=&quot;Image showing the result of stashing the new file on staging&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And since you know how to stash it and remove it from the list with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash pop&lt;/code&gt;, you will see that the new file also comes back from the stash on staging:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-git-stash-pop-com-arquivo-novo-em-staging.webp&quot; alt=&quot;Image showing git stash pop result after the last stash&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And now you already know how to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash&lt;/code&gt;. 🎉&lt;/p&gt;

&lt;p&gt;If a stash ever seems to vanish, or you lose work to a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;reset&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rebase&lt;/code&gt;, the &lt;a href=&quot;https://jtemporal.com/recovering-lost-commits-with-git-reflog/&quot;&gt;git reflog&lt;/a&gt; can help you recover it.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas--gitstudycards&quot;&gt;GitFichas | GitStudyCards&lt;/h2&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/041?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642964723/gitfichas/en/041/full_iswlps.jpg&quot; alt=&quot;GitFicha #041: git stash push&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/043?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642964722/gitfichas/en/043/full_qdsc7t.jpg&quot; alt=&quot;GitFicha #043: git stash list&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/044?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642964724/gitfichas/en/044/full_hvzjs2.jpg&quot; alt=&quot;GitFicha #044: git stash pop&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Hope these commands help you to stop the work you’ve done and get back to working on the changes.&lt;/p&gt;
</description>
        <pubDate>Sun, 23 Jan 2022 13:25:00 +0000</pubDate>
        <link>https://jtemporal.com/using-git-stash-and-git-stash-pop/</link>
        <guid isPermaLink="true">https://jtemporal.com/using-git-stash-and-git-stash-pop/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>Usando git stash: pop, apply e drop</title>
        <description>&lt;p&gt;Mudar de branches durante o meio de trabalho é algo que acontece com certa frequência, por exemplo, para resolver um bug fazendo um &lt;em&gt;“hotfix”&lt;/em&gt; em um outro branch enquanto você está desenvolvendo uma tarefa.&lt;/p&gt;

&lt;p&gt;Existem algumas formas de interromper o trabalho, incluindo fazer commits. A minha forma favorita é usando os comandos &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash&lt;/code&gt; e &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash pop&lt;/code&gt;. Muitas pessoas confundem o funcionamento desses dois comandos, assim como os relacionados &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash apply&lt;/code&gt; e &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash drop&lt;/code&gt;, então vamos esclarecer todos eles. 😉&lt;/p&gt;

&lt;h2 id=&quot;o-que-é-o-stash&quot;&gt;O que é o stash&lt;/h2&gt;

&lt;p&gt;Stash pode ser visto com um empacotamento das mudanças atuais, que ainda não foram feitas o commit, que fica salvo localmente no seu computador numa pilha. Cada pacote de mudanças é chamado de stash.&lt;/p&gt;

&lt;p&gt;Quando um stash é criado, o seu diretório volta a um &lt;em&gt;estado limpo&lt;/em&gt;, ou seja, sem mudanças nos arquivos que são acompanhados pelo Git. Isso também quer dizer que arquivos novos, que ainda não foram adicionados em um commit, não são adicionados em stash.&lt;/p&gt;

&lt;p&gt;Cada stash recebe um “nome”, um índice, no formato &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stash@{&amp;lt;n&amp;gt;}&lt;/code&gt;, onde &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;n&quot;&lt;/code&gt; se refere a um número correspondente a localização do stash na pilha de stashes. Esse número sempre se altera se mais stashes forem adicionados a pilha, o stash mais recente sempre é o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stash@{0}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pilhas, são um conceito comum em programação, e isso é importante para entender o comportamento do stash, pois, sem indicar o índice do stash, os comandos vão seguir a ordem LIFO (“last in, first out”), onde o último stash, ou seja, o stash mais recente, a ser adicionado na pilha é removido primeiro.&lt;/p&gt;

&lt;h2 id=&quot;guardando-trabalho-em-progresso-com-stash&quot;&gt;Guardando trabalho em progresso com stash&lt;/h2&gt;

&lt;p&gt;Então vamos dizer que você está trabalhando no branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa&lt;/code&gt; que corresponde a implementação de uma &lt;em&gt;feature&lt;/em&gt; qualquer, mas agora você precisa voltar para o branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; e resolver um problema muito importante, por questões de simplicidade não vamos focar na resolução de problemas. Esse é o estado corrente do seu trabalho:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/git-status-trabalho-em-adamento.webp&quot; alt=&quot;imagem do terminal mostrando que há modificações em um arquivo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora você precisa salvar o trabalho que você já fez antes de retornar ao branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;. Para isso use o comando a seguir:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git stash
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Esse comando é um atalho para o comando completo, o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash push&lt;/code&gt;. Agora que o stash foi feito, você vai ver um resultado semelhante ao seguinte:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-comando-git-stash.webp&quot; alt=&quot;imagem mostrando o resultado do git stash&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Você também pode ver o stash que acabou de fazer usando o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash list&lt;/code&gt; para ver a lista de stashes existentes:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-comando-git-stash-list.webp&quot; alt=&quot;imagem mostrando o resultado do git stash list&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note na imagem acima que a listagem de stashes sempre apresenta o índice do stash e uma mensagem. Agora que o trabalho está salvo, você pode trocar de branch tranquilamente e resolver o que precisar. Vale salientar que stashes não são amarrados a um branch, então você ainda vai poder ver o seu stash na lista mesmo depois de trocar de branches.&lt;/p&gt;

&lt;h2 id=&quot;voltando-a-trabalhar-com-o-pop&quot;&gt;Voltando a trabalhar com o pop&lt;/h2&gt;

&lt;p&gt;Depois de terminar os ajustes no branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;, você finalmente pode voltar a trabalhar naquela &lt;em&gt;feature&lt;/em&gt; do branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa&lt;/code&gt;. Para tirar o stash da pilha e aplicar as mudanças que você guardou, use o comando a seguir:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git stash pop
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pop&lt;/code&gt; vai remover o stash mais recente da pilha e aplicar as mudanças que ele contém, e você deve ver um resultado parecido com isso:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resutlado-comando-git-stash-pop.webp&quot; alt=&quot;imagem mostrando o resultado do comando git stash pop&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora você tem tudo que precisa pra continuar seu trabalho.&lt;/p&gt;

&lt;h2 id=&quot;mantendo-o-stash-com-apply&quot;&gt;Mantendo o stash com apply&lt;/h2&gt;

&lt;p&gt;E se você quiser suas mudanças de volta, mas prefere manter o stash por aí, talvez para aplicar em mais de um branch? É para isso que serve o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash apply&lt;/code&gt;. Ele funciona como o pop, só que não remove o stash da pilha:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git stash apply
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Na versão curta: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pop&lt;/code&gt; aplica o stash e remove ele, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt; aplica e mantém. Use o apply quando você ainda não tem certeza de que terminou com aquelas mudanças.&lt;/p&gt;

&lt;h2 id=&quot;limpando-com-drop&quot;&gt;Limpando com drop&lt;/h2&gt;

&lt;p&gt;Como o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt; deixa o stash na pilha, em algum momento você vai querer limpar isso. Use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash drop&lt;/code&gt; para remover o stash mais recente sem aplicá-lo:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git stash drop
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Você também pode remover um stash específico passando o índice dele, por exemplo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash drop stash@{2}&lt;/code&gt; para remover o que está no índice dois. E se quiser apagar todos os stashes de uma vez, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash clear&lt;/code&gt; faz isso.&lt;/p&gt;

&lt;h2 id=&quot;como-adicionar-um-arquivo-novo-à-um-stash&quot;&gt;Como adicionar um arquivo novo à um stash&lt;/h2&gt;

&lt;p&gt;Como falei anteriormente, arquivos novos não entram num stash, isso acontece por que eles não possuem rastreamento anterior. Por exemplo, digamos que enquanto estivesse trabalhando no branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa&lt;/code&gt;, você, além de modificar o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-tarefa.txt&lt;/code&gt;, você tenha criado o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-2.txt&lt;/code&gt;, de deixando com o resultado a seguir no seu diretório de trabalho:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/git-status-trabalho-em-adamento-arquivo-novo.webp&quot; alt=&quot;resultado do git status mostrando um arquivo modificado e um arquivo novo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Se você tentar fazer o stash dessas alterações, vai ver que o arquivo novo continua lá firme e forte:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/git-stash-falha-adiocionar-arquivo-novo.webp&quot; alt=&quot;resultado dos comandos git stash e git status mostrando que o arquivo novo não entrou no stash&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E aí você deve estar se perguntando, já que o stash não leva em consideração arquivos novos, como a gente burla esse comportamento? E a boa notícia é que existe um truque para adicionar arquivos novos à um stash: você precisa adicionar eles em staging!&lt;/p&gt;

&lt;p&gt;Então adicione o arquivo novo com &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git add&lt;/code&gt; e você terá uma situação assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-adicionar-o-arquivo-novo-em-staging.webp&quot; alt=&quot;imagem mostrando o ambiente de staging com o arquivo novo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E se você fizer novamente o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash&lt;/code&gt; verá que agora seu stash guarda também o arquivo novo e como resultado você tem o seu diretório de trabalho limpo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-stash-salvando-tambem-o-arquivo-novo.webp&quot; alt=&quot;imagem mostrando o resultado de fazer o stash com o arquivo novo em staging&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E já que você sabe aplicar um stash e remover ele da lista com o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash pop&lt;/code&gt;, você vai ver que o arquivo novo também volta do stash em staging:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-stash/resultado-git-stash-pop-com-arquivo-novo-em-staging.webp&quot; alt=&quot;imagem mostrando o resultado de git stash pop depois do ultimo stash&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E agora você já sabe usar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git stash&lt;/code&gt;. 🎉&lt;/p&gt;

&lt;p&gt;Se um stash parecer ter sumido, ou você perder trabalho por causa de um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;reset&lt;/code&gt; ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rebase&lt;/code&gt;, o &lt;a href=&quot;/recuperando-commits-perdidos-com-git-reflog/&quot;&gt;git reflog&lt;/a&gt; pode te ajudar a recuperar.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/041?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642964758/gitfichas/pt/041/full_m1zqzv.jpg&quot; alt=&quot;GitFicha #041: git stash push&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/043?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642964759/gitfichas/pt/043/full_uuuiaz.jpg&quot; alt=&quot;GitFicha #043: git stash list&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/044?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642964759/gitfichas/pt/044/full_sbhjsb.jpg&quot; alt=&quot;GitFicha #044: git stash pop&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Espero que esses comandos te ajudem a interromper o trabalho feito e voltar a trabalhar nas mudanças.&lt;/p&gt;
</description>
        <pubDate>Sun, 23 Jan 2022 13:25:00 +0000</pubDate>
        <link>https://jtemporal.com/usando-git-stash-e-git-stash-pop/</link>
        <guid isPermaLink="true">https://jtemporal.com/usando-git-stash-e-git-stash-pop/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>Tips to improve your LinkedIn profile</title>
        <description>&lt;p&gt;You might be thinking about switching jobs and you may be wondering “&lt;em&gt;How do I improve my profile on the networks most used by recruiters?&lt;/em&gt;” and you may already havheard things like “&lt;em&gt;keep your resume up to date&lt;/em&gt;” and “&lt;em&gt;create a portfolio&lt;/em&gt;” specially in tech.&lt;/p&gt;

&lt;p&gt;I can give you more advice on how to improve your profile if I know better who you are and what you do, but with the tips below, you can do a few improvements by yourself, even if we don’t know each other, so here we go.&lt;/p&gt;

&lt;h2 id=&quot;let-the-world-see-your-face&quot;&gt;Let the world see your face&lt;/h2&gt;

&lt;p&gt;Let’s start with the photo. Not long ago, people used to put photos in CVs to help the person hiring to know who the person on the page was. I won’t go into the merits of this practice, but for LinkedIn, if you don’t have a photo, chances are two things will happen:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;people won’t accept your connection request;&lt;/li&gt;
  &lt;li&gt;people recruiting let your profile pass along.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, take the opportunity to put a nice picture of yourself on your profile. Some tips for choosing the photo:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Choose an updated photo. After two+ years of the pandemic, there are many people who have changed their appearance, let their hair or beard grow so provide a brand new photo, there’s nothing better than doing an interview and putting a face to the name of the person you will see on the video call;&lt;/li&gt;
  &lt;li&gt;Choose a photo that has only you in it, it’s fine if you crop part of a photo, but a photo of just you is ideal;&lt;/li&gt;
  &lt;li&gt;Leave the profile picture available for people to see even without a LinkedIn connection, there’s no point in posting a beautiful picture and not letting the network see it, right?;&lt;/li&gt;
  &lt;li&gt;When taking the picture, remember to have your face facing the camera, that picture showing only your profile or covering part of your face is fine for other networks but defeats the purpose, okay? The idea is to make it easier for people to recognize you.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Found a good photo? Let’s work on your professional background. 😉&lt;/p&gt;

&lt;h2 id=&quot;write-an-about-me-text&quot;&gt;Write an “about me” text&lt;/h2&gt;

&lt;p&gt;People like to hire other people they understand. The more clarity you can convey with your resume the better, no one will know your skills as well as you do and it’s up to you to talk about them. I know, this is hard for a lot of people, even I have a hard time doing this sometimes so practice it. Practice makes perfect.&lt;/p&gt;

&lt;p&gt;You can start practicing talking about your past experiences by writing the “about me” field. Write about what motivates you and/or about the things you’ve done. It doesn’t have to be a long text, but following the school’s writing tips is a good thing: your text, even if it’s short, needs a beginning, a middle and an end.&lt;/p&gt;

&lt;p&gt;There are those who say that you shouldn’t talk about what you did at work and that this text should have a more personal tone, in mine I spoke a little about both things because, for me, both go hand in hand. I’ll give you two examples:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;My complete “about me” goes both on LinkedIn and on my GitHub page and on my website, &lt;a href=&quot;https://jtemporal.com/about/&quot;&gt;you can have a sneak peek here&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;In my CV I have a shorter version that I copy below:&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
  &lt;p&gt;I’m a technology enthusiast passionate about learning with more than four years experience in development and public speaking. I co-founded the first Brazilian podcast about data science, Pizza de Dados, to help improve data literacy in Portuguese. Currently, my work consists of assisting developers worldwide learn how they can leverage Auth0 to protect the identities of their users and their products.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The “recipe” I followed was: A little of what motivates me, a little of what I did, a project that I am proud of and maintain today, and finally what I’m currently doing. The most important thing is to have a “&lt;em&gt;this is so you!&lt;/em&gt;” text and give the person interviewing a way to break the ice during the interview.&lt;/p&gt;

&lt;p&gt;For every job you’ve had, you must have done something, right? So why not share what you’ve done and help the person recruiting understand your skills?&lt;/p&gt;

&lt;p&gt;Another thing in favor of describing what you did in each job is that even though positions have similar names across multiples companies, the responsibilities of a said role vary from company to company, so explaining what you did at a previous company is fundamental.&lt;/p&gt;

&lt;p&gt;A model I like to follow is:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Talk about your main responsibility or responsibilities if there is more than one;&lt;/li&gt;
  &lt;li&gt;Speak about results achieved;&lt;/li&gt;
  &lt;li&gt;And finish with the tools you used.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You already covered the first question recruiters ask: “&lt;em&gt;What did you do in your previous job?&lt;/em&gt;” and moved on to a more interesting question: “&lt;em&gt;tell me how you helped achieving those results…&lt;/em&gt;”, giving you more time to take advantage in an initial interview. And, most importantly, it will help your profile to appear in the recruiters’ daily searches for candidates.&lt;/p&gt;

&lt;p&gt;Then you can ask “&lt;em&gt;Wow, I can’t talk about the results I had due to NDAs, what now?&lt;/em&gt;” in this case, you don’t need to put this information in your text, try to write what is possible.&lt;/p&gt;

&lt;h2 id=&quot;adapt-when-necessary&quot;&gt;Adapt when necessary&lt;/h2&gt;

&lt;p&gt;If you have changed areas or positions, this task of describing what you did/do can be a little scary since the biggest concern is always: “&lt;em&gt;my job has nothing to do with what I want to do, help&lt;/em&gt;”. At this time you will have to play the game of skills.&lt;/p&gt;

&lt;p&gt;In the series “&lt;em&gt;Who is afraid to become a data scientist?&lt;/em&gt;” (in Portuguese), &lt;a href=&quot;http://leportella.com/&quot;&gt;Leticia Portella&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/gusrabbit&quot;&gt;Gustavo Coelho&lt;/a&gt;, and I talked about the main doubts from people wanting to switch careers to data science. We covered the “&lt;em&gt;&lt;a href=&quot;https://medium.com/databootcamp/quem-tem-medo-de-virar-cientista-de-dados-1-3-148ae98a01dd&quot;&gt;Am I going to make it?&lt;/a&gt;&lt;/em&gt;” phase, which is always followed by the “&lt;a href=&quot;https://medium.com/pizzadedados/quem-tem-medo-de-virar-cientista-de-dados-e0a32f45af1a&quot;&gt;&lt;em&gt;Is it really worth it to start working in a completely new area?&lt;/em&gt;&lt;/a&gt;”, and ends with “&lt;em&gt;&lt;a href=&quot;https://medium.com/pizzadedados/quem-tem-medo-de-virar-cientista-de-dados-3-3-f46b118ae12a#1926&quot;&gt;Why would they want to hire me?&lt;/a&gt;&lt;/em&gt;”&lt;/p&gt;

&lt;p&gt;Today, after a few years of writing the posts for the series, I realized that although the focus was data science, the advice there is for everyone. And these advices are valid particularly in what I call the game of skills.&lt;/p&gt;

&lt;p&gt;In this case, it is as important to relate what you do today with the skills expected for the future role, as it is to show that even if you still do not perform the future role, you have some of the expected skills. So, in addition to describing what you do, remember to mention that course, that technology that you used and that will be used in future positions.&lt;/p&gt;

&lt;h2 id=&quot;review-it-once-twice-even-three-times&quot;&gt;Review it once, twice, even three times&lt;/h2&gt;

&lt;p&gt;It might seem silly or even obvious, but proofreading what you write is very important. Spelling, grammar and similar errors will hurt your credibility. You might be someone who doesn’t get carried away by these details, but it could be that the person reading your resume is exactly the type of person who judges based on these mistakes, so it’s better to be safe than sorry.&lt;/p&gt;

&lt;p&gt;To avoid this type of problem, write the job description in softwares that make these corrections, for example, Google Docs. Also, and this is a personal tip, read what you’ve written out loud. Seriously &lt;em&gt;out loud&lt;/em&gt;. You’ll be amazed at how many possible improvements you’ll get to your text just by reading it out loud. Trust me.&lt;/p&gt;

&lt;p&gt;After that, send it to a friend and ask them if they understand what you meant. It might sound like it’s a lot, but I did it, my friends do it, and it works. A second person who doesn’t have the context bias that you have about something you’ve written will be much more effective in identifying if something is missing, that’s why teams that write, for example like the one I work at Auth0, have reviewers.&lt;/p&gt;

&lt;h2 id=&quot;have-someone-to-inspire-you&quot;&gt;Have someone to inspire you&lt;/h2&gt;

&lt;p&gt;Last but not least, look at the resumes of other people who are actively working on their resumes.&lt;/p&gt;

&lt;p&gt;Also look at the resumes of people who do what you want to do and how they present the information.&lt;/p&gt;

&lt;p&gt;There’s nothing better than having someone to inspire and follow. This will help you shape how you can organize information effectively.&lt;/p&gt;

&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;

&lt;p&gt;Updating your resume can be a lot of work, especially if you don’t know what to do, so I hope that with these tips, this task will be easier for you and you will get a great job.&lt;/p&gt;

&lt;p&gt;Finally, if you’re still not sure if these things you read here really work, I have a statement from a friend of mine to inspire you to tidy up your LinkedIn:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;These LinkedIn tips from Jess are PERFECT &amp;lt;3
She gave me these tips when I was thinking about switching companies and thinking about going through some hiring processes just for practicing.
Result: one day after starting to update my LinkedIn profile, I received an invitation to do a job interview. As I wanted to practice, I accepted, I loved the company and I’m there until now &amp;lt;3&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;small&gt;
&lt;i&gt;Ana Dulce, Python Back-end developer | Tembici&lt;/i&gt;
&lt;/small&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 18 Jan 2022 23:00:00 +0000</pubDate>
        <link>https://jtemporal.com/tips-to-improve-your-linkedin-profile/</link>
        <guid isPermaLink="true">https://jtemporal.com/tips-to-improve-your-linkedin-profile/</guid>
        
        <category>career</category>
        
        <category>step by step</category>
        
        <category>english</category>
        
        <category>linkedin</category>
        
        
      </item>
    
      <item>
        <title>Dicas para melhorar o seu perfil no LinkedIn</title>
        <description>&lt;p&gt;Você pode estar pensando em trocar de emprego ou de área e pode estar se perguntando &lt;em&gt;“Como eu melhoro o meu perfil na rede mais utilizada por recrutadores?”&lt;/em&gt; e aí você possivelmente já pode ter ouvido coisas como &lt;em&gt;“mantenha o seu currículo atualizado”&lt;/em&gt; e &lt;em&gt;“crie um portfólio”&lt;/em&gt; principalmente em TI.&lt;/p&gt;

&lt;p&gt;Eu consigo dar mais conselhos sobre como melhorar o perfil se souber melhor quem é você e o que você faz, mas as dicas a seguir, você consegue seguir sozinha ou sozinho, mesmo sem que a gente se conheça então vamos lá.&lt;/p&gt;

&lt;h2 id=&quot;bota-a-cara-no-mundo&quot;&gt;Bota a cara no mundo&lt;/h2&gt;

&lt;p&gt;Pra começar a foto, na época e nas profissões que precisam de currículos físicos, se coloca uma foto no currículo para ajudar a pessoa contratando a saber quem era a pessoa da folhinha, eu não vou entrar no mérito dessa prática, mas para o LinkedIn, se você não tem uma foto, grandes chances que duas coisas aconteçam:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;pessoas não aceitem o seu pedido de conexão;&lt;/li&gt;
  &lt;li&gt;pessoas recrutando deixem o seu currículo passar.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Então, aproveita pra colocar uma foto bem legal você no seu perfil. Algumas dicas para escolher a foto:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Pegue uma foto atualizada. Depois de dois+ anos de pandemia, tem muita gente que mudou a aparência, deixou o cabelo crescer ou a barba então providencie uma foto novinha, nada melhor do que fazer entrevista e saber qual a pessoa você vai ver na videochamada;&lt;/li&gt;
  &lt;li&gt;Escolha uma foto que só tenha você nela, tudo bem se você cortar parte de uma foto, mas uma foto só com você é o ideal;&lt;/li&gt;
  &lt;li&gt;Deixe a foto de perfil disponível para pessoas mesmo sem conexão, não adianta colocar uma foto lindona e não deixar a rede ver né?;&lt;/li&gt;
  &lt;li&gt;Na hora de tirar a foto lembre de estar com o rosto virado para câmera, nada disso de foto de perfil ou cobrindo parte do rosto tá? A ideia é facilitar que te reconheçam mesmo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Achou uma foto boa? Bora arrumar o histórico profissional. 😉&lt;/p&gt;

&lt;h2 id=&quot;escreva-um-texto-de-apresentação&quot;&gt;Escreva um texto de apresentação&lt;/h2&gt;

&lt;p&gt;Pessoas gostam de contratar outras pessoas que elas entendem, por isso eu quero dizer que, quanto mais clareza você puder passar com o seu currículo melhor, ninguém vai conhecer tão bem as suas habilidades quanto você e cabe a você falar delas. Eu sei, isso é difícil para muitas pessoas, eu inclusive tenho dificuldade de fazer isso às vezes então pratique, a prática leva a perfeição.&lt;/p&gt;

&lt;p&gt;E você pode começar praticando por texto, no campo “sobre” escreva sobre o que te motiva e/ou sobre as coisas que você fez. Não precisa ser um texto longo, mas seguir as dicas de redação da escola é uma boa dica: o seu texto, mesmo que curto, precisa de um começo, um meio e um fim.&lt;/p&gt;

&lt;p&gt;Há quem diga que você não deve falar sobre o que você fez no trabalho e que esse texto deve ter um tom mais pessoal, no meu eu falei um pouco das duas coisas até por que, pra mim, ambas andam de mãos dadas. Vou te dar dois exemplos:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;O meu “sobre” completo vai tanto no LinkedIn quanto na minha página do GitHub e no meu site, &lt;a href=&quot;https://jtemporal.com/sobre/&quot;&gt;você pode espiar eles aqui&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;No meu currículo eu tenho uma versão mais curta que copio abaixo:&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
  &lt;p&gt;Eu sou uma entusiasta da tecnologia apaixonada por aprendizado com mais de quatro anos de experiência em desenvolvimento e falar em público. Eu co-criei o primeiro podcast brasileiro sobre ciência de dados, o Pizza de dados, para ajudar a aumentar a alfabetização em dados em Português. Atualmente, meu trabalho consiste ajudar pessoas desenvolvedoras mundialmente para que elas possam usar Auth0 para proteger as suas aplicações e as identidades de seus usuários.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A receita que eu segui foi: Um pouco do que me motiva, um pouco do que eu fiz, um projeto que me orgulho e mantenho hoje e pra finalizar o que eu faço hoje em dia. O mais importante é deixar o texto com a sua cara e dar a pessoa entrevistando uma forma de quebrar o gelo durante a entrevista.&lt;/p&gt;

&lt;h2 id=&quot;conte-o-que-você-fez-e-os-resultados&quot;&gt;Conte o que você fez e os resultados&lt;/h2&gt;

&lt;p&gt;Para cada emprego que você teve, você deve ter feito alguma coisa, certo? Então por que não falar o que você fez e ajudar a pessoa recrutando a entender as suas habilidades?&lt;/p&gt;

&lt;p&gt;Outro ponto a favor de descrever o que você faz em cada emprego, é que por mais que cargos tenham nomes parecidos, em empresas diferentes as responsabilidades de um mesmo cargo variam, então explicar o que você fez é fundamental.&lt;/p&gt;

&lt;p&gt;Um modelo que eu gosto de seguir é o seguinte:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Fale a sua principal responsabilidade ou responsabilidades se forem mais do que uma;&lt;/li&gt;
  &lt;li&gt;Conte o resultado disso;&lt;/li&gt;
  &lt;li&gt;E finalize com as ferramentas que você usou.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Assim, você já cobre a primeira pergunta que as pessoas recrutando fazem: &lt;em&gt;“o que você fazia no seu cargo anterior?”&lt;/em&gt; e passa para uma pergunta mais interessante: &lt;em&gt;“me conta como você ajudou a atingir aqueles resultados…”&lt;/em&gt;, te dando mais tempo pra aproveitar numa entrevista inicial. E, mais importante, vai ajudar o seu perfil a aparecer nas buscas de pessoas candidatas que são feitas diariamente.&lt;/p&gt;

&lt;p&gt;Aí você pode perguntar &lt;em&gt;“Nossa mas eu não posso falar dos resultados que eu tive por sigilo de negócio, e agora?”&lt;/em&gt; nesse caso não precisa colocar essa informação no seu texto, tente colocar o que for possível.&lt;/p&gt;

&lt;h2 id=&quot;adapte-quando-necessário&quot;&gt;Adapte quando necessário&lt;/h2&gt;

&lt;p&gt;Se você tiver mudando de área ou de cargo, essa tarefa de descrever o que você fez/faz pode ser um pouco assustadora já que a maior preocupação sempre é: &lt;em&gt;“o meu trabalho não tem a ver com o que eu quero fazer, socorro”&lt;/em&gt;. Nessa hora você vai ter que jogar o jogo das habilidades.&lt;/p&gt;

&lt;p&gt;Na série &lt;em&gt;“Quem tem medo de virar cientista de dados?”&lt;/em&gt;, eu, &lt;a href=&quot;http://leportella.com/&quot;&gt;Leticia Portella&lt;/a&gt; e &lt;a href=&quot;https://twitter.com/gusrabbit&quot;&gt;Gustavo Coelho&lt;/a&gt;, falamos das principais dúvidas sobre pessoas querendo trocar de carreira para a ciência de dados. Cobrimos a fase do &lt;a href=&quot;https://medium.com/databootcamp/quem-tem-medo-de-virar-cientista-de-dados-1-3-148ae98a01dd&quot;&gt;&lt;em&gt;“Será que eu vou conseguir?”&lt;/em&gt;&lt;/a&gt;, que sempre vem seguida da fase do &lt;a href=&quot;https://medium.com/pizzadedados/quem-tem-medo-de-virar-cientista-de-dados-e0a32f45af1a&quot;&gt;&lt;em&gt;“Vale a pena mesmo começar a trabalhar numa área totalmente nova para mim?”&lt;/em&gt;&lt;/a&gt;, e que finaliza com &lt;a href=&quot;https://medium.com/pizzadedados/quem-tem-medo-de-virar-cientista-de-dados-3-3-f46b118ae12a#1926&quot;&gt;&lt;em&gt;“Por que vão querer me contratar?”&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hoje, depois de alguns anos que escrevemos os textos da série, me dei conta que embora o foco fosse ciência de dados, os conselhos ali servem para todo mundo. E esses conselhos são válidos principalmente no que eu chamo do jogo das habilidades.&lt;/p&gt;

&lt;p&gt;Nesse caso, cabe tanto relacionar o que você faz hoje com as habilidades esperadas para o cargo futuro de forma sútil, quanto mostrar que mesmo não desempenhando o cargo futuro você tem parte das habilidades esperadas. Então, além de descrever o que faz, lembre-se de mencionar aquele curso, aquela tecnologia que você usou e que serão usados nos próximos cargos.&lt;/p&gt;

&lt;h2 id=&quot;revise-uma-duas-ou-até-mesmo-três-vezes&quot;&gt;Revise uma, duas, ou até mesmo três vezes&lt;/h2&gt;

&lt;p&gt;Pode parecer bobagem ou até mesmo óbvio, mas &lt;em&gt;revisar o que você escreve é muito importante&lt;/em&gt;. Erros de escrita, gramática e similares vão ferir a sua credibilidade. Você pode ser uma pessoa que não se deixa levar por esses detalhes, mas pode ser que a pessoa lendo seja exatamente o tipo de pessoa que julga com base nesses erros, então melhor prevenir do que remediar.&lt;/p&gt;

&lt;p&gt;Para evitar esse tipo de problema, escreva a descrição do cargo em programas que façam essas correções como, por exemplo, o Google Docs. Além disso, e isso é uma dica pessoal, leia em voz alta o que você escreveu. Sério &lt;em&gt;em voz alta&lt;/em&gt;. Você vai se surpreender com o tanto de possíveis melhorias que você vai conseguir no seu texto só de ler ele em voz alta. Confie em mim.&lt;/p&gt;

&lt;p&gt;Depois disso, manda pra um amigo ou amiga e pede pra essa pessoa falar se entende o que você quis dizer. Parece muito, mas eu fiz isso, minhas amigas fazem isso, e funciona. Uma segunda pessoa que não está com o viés de contexto que você tem sobre algo que você escreveu, vai ser muito mais eficaz em identificar se está faltando algo, é por isso que times que escrita, por exemplo como o que eu trabalho na Auth0, tem revisores.&lt;/p&gt;

&lt;h2 id=&quot;tenha-alguém-para-se-inspirar&quot;&gt;Tenha alguém para se inspirar&lt;/h2&gt;

&lt;p&gt;Por fim, mas não menos importante, olhe o currículo de outras pessoas que trabalham em seus currículos ativamente.&lt;/p&gt;

&lt;p&gt;Olhe também o currículo de pessoas que fazem o que você quer fazer e como elas colocam as informações.&lt;/p&gt;

&lt;p&gt;Nada melhor do que ter alguém para se inspirar e seguir. Isso vai te ajudar a moldar como você pode enquadrar as informações de forma efetiva.&lt;/p&gt;

&lt;h2 id=&quot;finalizando&quot;&gt;Finalizando&lt;/h2&gt;

&lt;p&gt;Atualizar currículo pode ser trabalhoso principalmente se você não sabe o que fazer, então eu espero que com essas dicas, essa tarefa fique mais fácil para você e você consiga um emprego legal.&lt;/p&gt;

&lt;p&gt;Pra finalizar, se você estiver na dúvida se essas coisas que você leu aqui realmente funcionam, eu tenho a declaração de uma amiga minha pra te inspirar a arrumar o seu LinkedIn:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Essas dicas de LinkedIn da Jess são PERFEITAS &amp;lt;3
Ela me deu essas dicas quando tava pensando em trocar de empresa e pensando fazer uns processos seletivos só pra treinar.
Resultado: um dia depois de começar a atualizar o LinkedIn, recebi um convite pra fazer um processo seletivo. Como queria treinar, aceitei, amei a empresa e tô lá até agora &amp;lt;3
&lt;small&gt;
&lt;i&gt;Ana Dulce, Desenvolvedora Python Back-end | Tembici&lt;/i&gt;
&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Tue, 18 Jan 2022 23:00:00 +0000</pubDate>
        <link>https://jtemporal.com/dicas-para-melhorar-o-seu-perfil-no-linkedin/</link>
        <guid isPermaLink="true">https://jtemporal.com/dicas-para-melhorar-o-seu-perfil-no-linkedin/</guid>
        
        <category>emprego</category>
        
        <category>passo a passo</category>
        
        <category>português</category>
        
        <category>linkedin</category>
        
        
      </item>
    
      <item>
        <title>Introducing GitFichas!</title>
        <description>&lt;p&gt;I started a new project, and I want to tell you all about it! 👀&lt;/p&gt;

&lt;p&gt;For some time now I’ve been helping anyone who needs help with Git. From what I’ve seen, most people use git commands on a daily basis without necessarily understanding them…&lt;/p&gt;

&lt;p&gt;This is not a problem, especially if you are starting your journey with versioning, however, not understanding the commands can get you into trouble with Git (conflicts, I’m looking at you). And as much as Git helps us in the development process to track changes, conflicts and detached heads are annoying things to solve, especially if you don’t understand what you need to do, right?&lt;/p&gt;

&lt;p&gt;In order to improve the lives of those who use Git, I started &lt;a href=&quot;https://gitfichas.com/?utm_source=blog&quot;&gt;GitFichas&lt;/a&gt;. GitFichas is nothing more than a site that aggregates Git study cards, in its original form, it was intend as a friendly resource in Portuguese, and now it officially has its version in English. Each card is made to be the simplest possible way so anyone can understand each command or concept.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://gitfichas.com/en/008?utm_source=blog&quot;&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878595/gitfichas/en/008/full_mur6v1.jpg&quot; alt=&quot;GitFicha explaining how to interactively with command git add -p&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;
&lt;i&gt;GitFicha number 008 talking about git add -p&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;The cards are images that explain commands or concepts that I use daily in Git. They even bring little-known or used tips, that when properly applied, they can really come in handy.&lt;/p&gt;

&lt;p&gt;Every week a new card is released on Wednesday.&lt;/p&gt;

&lt;p&gt;I post the cards on my profile on &lt;a href=&quot;http://twitter.com/jesstemporal&quot;&gt;Twitter&lt;/a&gt; and &lt;a href=&quot;https://www.linkedin.com/in/jessicatemporal/&quot;&gt;LinkedIn&lt;/a&gt;, but you can enjoy and follow &lt;a href=&quot;https://instagram.com/gitfichas&quot;&gt;GitFichas on Instagram&lt;/a&gt; or subscribe to the &lt;a href=&quot;https://t.me/gitfichas&quot;&gt;GitFichas’ channel on Telegram&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And if you want to suggest a command or concept you’d like to see in the form of a card reply to this tweet below, and even though the tweet is in Portuguese is in Portuguese, don’t be shy and say &lt;em&gt;hi&lt;/em&gt;. 👇&lt;/p&gt;

&lt;center&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pt&quot; dir=&quot;ltr&quot;&gt;Perguntando pro meu TCC: Que comando &lt;a href=&quot;https://twitter.com/hashtag/git?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#git&lt;/a&gt; você tem dificuldade mesmo rodando ele com frequência?&lt;/p&gt;— Jessica Temporal (@jesstemporal) &lt;a href=&quot;https://twitter.com/jesstemporal/status/1419992266828091408?ref_src=twsrc%5Etfw&quot;&gt;July 27, 2021&lt;/a&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;I’m saving the commands and questions that are sent to me in a queue to make new cards as soon as possible. 😉&lt;/p&gt;
</description>
        <pubDate>Sun, 16 Jan 2022 15:44:33 +0000</pubDate>
        <link>https://jtemporal.com/introducing-gitfichas/</link>
        <guid isPermaLink="true">https://jtemporal.com/introducing-gitfichas/</guid>
        
        <category>english</category>
        
        <category>git</category>
        
        
      </item>
    
      <item>
        <title>Undoing the last commit and keeping the changes for a next commit</title>
        <description>&lt;p&gt;Undoing and redoing commits is part of everyday life, so it is important to understand the commands that help along the way. Sometimes people call this uncommitting: you want to undo the last commit but keep your changes so you can recommit them somewhere else. In this pro tip I will teach you two things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Undo the last commit so you can keep the changes on &lt;em&gt;staging&lt;/em&gt;;&lt;/li&gt;
  &lt;li&gt;Reuse the content of the undone commit to make a new commit.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With these two commands in your repertoire of Git commands, you will be way happier. 😉&lt;/p&gt;

&lt;h2 id=&quot;creating-the-scenario&quot;&gt;Creating the scenario&lt;/h2&gt;

&lt;p&gt;I talked about the command &lt;a href=&quot;https://jtemporal.com/undoing-the-last-commits-using-git-reset&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset&lt;/code&gt; in this other pro tip&lt;/a&gt;. In a nutshell, it is a command that allows you to return to a previous state. The most basic use of this command is to use it to undo one or more of the most recent commits. With that, let’s assume you’re in the following situation (interestingly I went through this last Friday):&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;You committed to the wrong branch;&lt;/li&gt;
  &lt;li&gt;You haven’t pushed this new commit to the remote yet;&lt;/li&gt;
  &lt;li&gt;You want to undo this commit and redo it to the correct branch.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As an example, I have here a history of a project in which there are two commits: the initial commit on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; branch (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;d815be&lt;/code&gt;) and the second commit (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5e8ae2&lt;/code&gt;) adding &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-1.txt&lt;/code&gt; that should be on another branch, see:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-8.webp&quot; alt=&quot;Screenshot showing the Git history in the terminal with two commits&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now it’s time to undo our wrong commit.&lt;/p&gt;

&lt;h2 id=&quot;undoing-the-last-commit-while-keeping-the-changes-git-reset-soft&quot;&gt;Undoing the last commit while keeping the changes (git reset –soft)&lt;/h2&gt;

&lt;p&gt;Given this scenario, the first step is to use the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset&lt;/code&gt;. Maybe you don’t know that there is a flag that while undoing a commit with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset&lt;/code&gt;, it allows you to keep the commit changes on staging and the commit message stored in a special variable that I’ll show you in a bit. That flag is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--soft&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So we can create our command like this:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git reset HEAD^ --soft
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--soft&lt;/code&gt; indicates that you want to undo the commit subtly, in other words, keeping the changes. When running this command, you will not get any message, but the changes are on &lt;em&gt;staging&lt;/em&gt;, which you can check with the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt;, and the result is as follows:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-9.webp&quot; alt=&quot;Screenshot showing the output of the command git reset HEAD^ --soft&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now let’s redo the commit in the right place and reuse the message.&lt;/p&gt;

&lt;p&gt;If you ever go further than a soft reset, say a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset --hard&lt;/code&gt;, and lose work in the process, do not panic: the &lt;a href=&quot;https://jtemporal.com/recovering-lost-commits-with-git-reflog/&quot;&gt;git reflog&lt;/a&gt; can usually bring it back.&lt;/p&gt;

&lt;h2 id=&quot;reusing-the-commit-message&quot;&gt;Reusing the commit message&lt;/h2&gt;

&lt;p&gt;Now that you’ve undone the commit and you have the changes on staging, you can create the new branch and switch to it. I mentioned &lt;a href=&quot;https://jtemporal.com/creating-a-new-branch-and-switching-to-it-with-only-one-command/&quot;&gt;this previous command in this other pro tip&lt;/a&gt; just in case you want to check it out:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git switch -c add-arquivos-novos
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With that, the long-awaited moment arrives! You probably already know that to make commits, you need to use the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git commit&lt;/code&gt;. As our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;reset&lt;/code&gt; was &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;soft&lt;/code&gt;-like, the commit message was stored in the variable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ORIG_HEAD&lt;/code&gt;, so to reuse it you should use the flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-C&lt;/code&gt; followed by the variable, like this:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git commit -C ORIG_HEAD
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-C&lt;/code&gt; literally means “reuse message”, and this is the result:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-10.webp&quot; alt=&quot;Screenshot showing the output of the commands git switch -c add-arquivos-novos followed by git commit -C ORIG_HEAD&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Finally, if you want to edit the message, you should use the flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-c&lt;/code&gt; in place of the current flag. This will give you the opportunity to adjust the previous message before finishing the commit.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas--gitstudycards&quot;&gt;GitFichas | GitStudyCards&lt;/h2&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/038?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642882051/gitfichas/en/038/full_ytpvz2.jpg&quot; alt=&quot;GitFicha #038: git reset HEAD^ --soft&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/039?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878601/gitfichas/en/039/full_cvowy3.jpg&quot; alt=&quot;GitFicha #039: git commit -C ORIG_HEAD&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Hope these commands help you to reuse the work done.&lt;/p&gt;
</description>
        <pubDate>Sat, 15 Jan 2022 13:25:00 +0000</pubDate>
        <link>https://jtemporal.com/undoing-the-last-commit-and-reusing-the-message/</link>
        <guid isPermaLink="true">https://jtemporal.com/undoing-the-last-commit-and-reusing-the-message/</guid>
        
        <category>git</category>
        
        <category>english</category>
        
        <category>pro tip</category>
        
        
      </item>
    
      <item>
        <title>Desfazendo o último commit e mantendo as alterações para um próximo commit</title>
        <description>&lt;p&gt;Desfazer e refazer commits faz parte do dia a dia, então é importante entender os comandos que podem ajudar a gente nesse caminho. Às vezes isso é chamado de “descommitar”: você quer desfazer o último commit mas manter suas alterações para commitar de novo em outro lugar. Nessa colinha eu vou te ensinar a fazer duas coisas:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Desfazer o último commit de forma que você possa manter as alterações em &lt;em&gt;staging&lt;/em&gt;;&lt;/li&gt;
  &lt;li&gt;Reaproveitar o conteúdo do commit desfeito para fazer um novo commit.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Com esses dois comandos no seu repertório de comandos Git você será muito mais feliz. 😉&lt;/p&gt;

&lt;h2 id=&quot;criando-o-cenário&quot;&gt;Criando o cenário&lt;/h2&gt;

&lt;p&gt;Eu falei sobre o comando &lt;a href=&quot;https://jtemporal.com/desfazendo-um-ou-mais-commits&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset&lt;/code&gt; nesta outra colinha&lt;/a&gt;, em resumo ele é um comando que permite retornar à um estado anterior. O uso mais básico deste comando é usá-lo para desfazer um ou mais commits dos mais recentes. Com isso, vamos supor que você está na seguinte situação (curiosamente eu passei por isso na última sexta):&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Você fez um commit no branch incorreto;&lt;/li&gt;
  &lt;li&gt;Ainda não enviou esse novo commit para o &lt;em&gt;remote;&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Você quer desfazer esse commit e refazer-lo no branch correto.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para exemplificar eu tenho aqui um histórico de um projeto em que temos dois commits: o commit inicial no branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;d815be&lt;/code&gt;) e o segundo commit (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5e8ae2&lt;/code&gt;) adicionando o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-1.txt&lt;/code&gt; que deveria ser em outro branch, veja:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-8.webp&quot; alt=&quot;captura de tela mostrando o histórico do git no terminal com dois commits&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora chegou a hora de desfazer o nosso commit incorreto.&lt;/p&gt;

&lt;h2 id=&quot;desfazendo-o-último-commit-mantendo-as-alterações-git-reset-soft&quot;&gt;Desfazendo o último commit mantendo as alterações (git reset –soft)&lt;/h2&gt;

&lt;p&gt;Dado esse cenário, o primeiro passo é usar o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset&lt;/code&gt;. Talvez você não saiba que existe uma &lt;em&gt;flag&lt;/em&gt; que ao desfazer um commit com o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset&lt;/code&gt; permite que você mantenha as alterações do commit em staging e a mensagem de commit guardada numa variável especial que vou te mostrar jájá, essa &lt;em&gt;flag&lt;/em&gt; é a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--soft&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Então podemos montar o nosso comando assim:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git reset HEAD^ --soft
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--soft&lt;/code&gt; indica que você quer desfazer o commit de forma mais sutil, ou seja, mantendo as alterações. Ao executar esse comando, você não receberá nenhuma mensagem, mas as alterações estão em &lt;em&gt;staging&lt;/em&gt;, o que você pode conferir com o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt;  e o resultado é o seguinte:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-9.webp&quot; alt=&quot;captura de tela mostrando o resultado do comando git reset HEAD^ --soft&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos refazer o commit no lugar certo e reaproveitar a mensagem.&lt;/p&gt;

&lt;p&gt;Se você for além de um reset soft, digamos um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset --hard&lt;/code&gt;, e perder trabalho no processo, não entre em pânico: o &lt;a href=&quot;/recuperando-commits-perdidos-com-git-reflog/&quot;&gt;git reflog&lt;/a&gt; geralmente consegue trazer de volta.&lt;/p&gt;

&lt;h2 id=&quot;reaproveitando-a-mensagem-de-commit&quot;&gt;Reaproveitando a mensagem de commit&lt;/h2&gt;

&lt;p&gt;Agora que você já desfez o commit e tem as alterações em staging, pode criar o novo branch e mudar pra ele, eu falei do &lt;a href=&quot;https://jtemporal.com/criando-um-novo-branch-e-mudando-pra-ele-com-um-comando/&quot;&gt;comando anterior nesta outra colinha&lt;/a&gt; caso você queira conferir:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git switch -c add-arquivos-novos
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Com isso, chega o momento tão esperado, provavelmente você já sabe que para fazer commits, precisa usar o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git commit&lt;/code&gt; . Como nosso &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;reset&lt;/code&gt; foi do tipo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;soft&lt;/code&gt;  a mensagem do commit ficou armazenada na variável &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ORIG_HEAD&lt;/code&gt;, então para reaproveitá-la você deve usar a flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-C&lt;/code&gt; seguida da variável, assim:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git commit -C ORIG_HEAD
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Essa flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-C&lt;/code&gt;  quer dizer literalmente “reutilizar mensagem”, e esse é o resultado:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-10.webp&quot; alt=&quot;captura de tela mostrando o resultado dos comandos git switch -c add-arquivos-novos seguido de git commit -C ORIG_HEAD&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Por fim, se você quiser editar a mensagem, você deve usar a flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-c&lt;/code&gt; no lugar da flag atual, isso vai te dar a oportunidade de ajustar a mensagem anterior antes de terminar o commit.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/038?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642881912/gitfichas/pt/038/full_rpeam6.jpg&quot; alt=&quot;GitFicha #038: git reset HEAD^ --soft&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/039?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878678/gitfichas/pt/039/full_y7qwus.jpg&quot; alt=&quot;GitFicha #039: git commit -C ORIG_HEAD&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Espero que esses comandos te ajudem a reaproveitar o trabalho feito.&lt;/p&gt;
</description>
        <pubDate>Sat, 15 Jan 2022 13:25:00 +0000</pubDate>
        <link>https://jtemporal.com/desfazendo-o-ultimo-commit-e-reaproveitando-a-mensagem/</link>
        <guid isPermaLink="true">https://jtemporal.com/desfazendo-o-ultimo-commit-e-reaproveitando-a-mensagem/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>Undoing the last commits using git reset</title>
        <description>&lt;p&gt;Since everything we do in git can be done in countless different ways, there are a few ways to get rid of commits. The most common way to undo one or more recent commits is using the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset&lt;/code&gt; that you’ll see in this pro tip.&lt;/p&gt;

&lt;h2 id=&quot;what-is-the-head&quot;&gt;What is the HEAD?&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HEAD&lt;/code&gt; is a pointer that indicates which branch and commit you’re on. It is used frequently, and often without you even knowing it. For example, did you know the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HEAD&lt;/code&gt; is used to switch branches?&lt;/p&gt;

&lt;h2 id=&quot;what-is-git-reset&quot;&gt;What is git reset?&lt;/h2&gt;

&lt;p&gt;On the other hand, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset&lt;/code&gt; is a command that restores a previous state of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HEAD&lt;/code&gt;. That’s why we use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HEAD&lt;/code&gt; when undoing commits, to indicate which previous state you want to go back to.&lt;/p&gt;

&lt;p&gt;For example, let’s suppose you have a state like the following:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/main-with-2-commits.webp&quot; alt=&quot;Picture showing the main branch with two commits A and B&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you want to undo the last &lt;em&gt;commit&lt;/em&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B&lt;/code&gt;, you want to go back to the state of &lt;em&gt;commit&lt;/em&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;undoing-the-last-commit&quot;&gt;Undoing the last commit&lt;/h2&gt;

&lt;p&gt;To undo the last &lt;em&gt;commit&lt;/em&gt; made, you should use the following command:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git reset HEAD~1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Or the following command, which is a shortcut for the command above:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git reset HEAD^
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Or even the following shortcut:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git reset HEAD~
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;These three commands mean:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Go back to the state before the last commit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Note that when executing these commands, you will not see a message stating that the commit was undone, but if you run the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt; after executing any of these three commands you will see that files added and/or changes made went back to being marked as changes to be committed (added to a commit).&lt;/p&gt;

&lt;p&gt;Suppose you have a history like the one in the following image, in which the last &lt;em&gt;commit&lt;/em&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;48ccb8&lt;/code&gt;) adds the file called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-4.txt&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-2.webp&quot; alt=&quot;Screenshot showing the commit history containing 5 commits in the terminal&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And if you run any of the commands above, followed by a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt;, you will see a result like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-3.webp&quot; alt=&quot;Screenshot showing the result of undoing a commit and then running git status&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And you can see that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-4.txt&lt;/code&gt; has returned to its previous state, which was waiting to be committed. And if you check the history again you will see that the commit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;48ccb8&lt;/code&gt; no longer appears.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-4.webp&quot; alt=&quot;Screenshot showing the detail in the commit history without the undone commit in the history&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can now discard the changes or keep up with them and make a new commit.&lt;/p&gt;

&lt;h2 id=&quot;undoing-the-last-three-commits&quot;&gt;Undoing the last three commits&lt;/h2&gt;

&lt;p&gt;Now that you know how to undo a commit, you can use the first command you’ve just seen and adapt it to undo more commits. To do so, just add the number of commits you want to undo after &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~&lt;/code&gt;. Let’s take another look at our history, which now contains only four commits (since I already undid one):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-5.webp&quot; alt=&quot;Screenshot showing the commit history containing 4 commits in the terminal&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now let’s suppose I want to go back to the state of commit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;d815be&lt;/code&gt; which is the initial commit that added the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; file. To do so it is necessary to undo three commits, so for that a suitable command is the following:&lt;/p&gt;

&lt;p&gt;Agora vamos supor que eu quero voltar ao estado do commit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;d815be&lt;/code&gt; que é o commit inicial que adicionou o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt;. Para isso é necessário desfazer três &lt;em&gt;commits&lt;/em&gt;, então para isso o comando indicado é este:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git reset HEAD~3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After executing this command and running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt; once more, we have the three files that were added by the unmade commits:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-6.webp&quot; alt=&quot;Screenshot showing the result of undoing 3 commits and running git status again&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note that before running these commands I removed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-4.txt&lt;/code&gt; as I won’t need it anymore. And looking into the history again we only see the initial commit:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-7.webp&quot; alt=&quot;Screenshot with the commit history showing only the initial commit as the others were undone&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Before finishing this pro tip I want to leave a recommendation: it is a good practice to avoid undoing commits that you have already pushed to prevent causing detached &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HEAD&lt;/code&gt; problems for other people working with you.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas-ß-gitstudycards&quot;&gt;GitFichas ß| GitStudyCards&lt;/h2&gt;

&lt;p&gt;Below you can find some &lt;a href=&quot;https://gitfichas.com&quot;&gt;Git study cards to help you remember these commands and shortcuts&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/013?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878596/gitfichas/en/013/full_crgtzp.jpg&quot; alt=&quot;GitFicha #013: What is HEAD?&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/036?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878600/gitfichas/en/036/full_rkilqa.jpg&quot; alt=&quot;GitFicha #036: git reset HEAD\~3&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/037?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878601/gitfichas/en/037/full_dko55b.jpg&quot; alt=&quot;GitFicha #037: git reset HEAD^&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Hope this pro tip helps you undo commits. 😉&lt;/p&gt;
</description>
        <pubDate>Fri, 14 Jan 2022 13:00:00 +0000</pubDate>
        <link>https://jtemporal.com/undoing-the-last-commits-using-git-reset/</link>
        <guid isPermaLink="true">https://jtemporal.com/undoing-the-last-commits-using-git-reset/</guid>
        
        <category>git</category>
        
        <category>english</category>
        
        <category>pro_tip</category>
        
        
      </item>
    
      <item>
        <title>Desfazendo os últimos commits usando git reset</title>
        <description>&lt;p&gt;Como tudo que fazemos em git pode ser feito de inúmeras formas diferentes, existem alguns jeitos de se livrar de commits, a forma mais comum de desfazer um ou mais commits recentes é usando o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset&lt;/code&gt; que vou te mostrar nessa colinha.&lt;/p&gt;

&lt;h2 id=&quot;o-que-é-o-head&quot;&gt;O que é o HEAD?&lt;/h2&gt;

&lt;p&gt;O &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HEAD&lt;/code&gt; é um ponteiro que indica qual branch e commit você está. Ele é usado com frequência e muitas vezes sem você mesmo saber que ele é acessado para trocar de branches por exemplo.&lt;/p&gt;

&lt;h2 id=&quot;o-que-é-o-git-reset&quot;&gt;O que é o git reset?&lt;/h2&gt;

&lt;p&gt;O &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git reset&lt;/code&gt; por sua vez é um comando que restaura um estado anterior do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HEAD&lt;/code&gt;, por isso que usamos o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HEAD&lt;/code&gt; ao desfazer commits, para indicar qual o estado anterior que você quer voltar.&lt;/p&gt;

&lt;p&gt;Por exemplo suponha que você tem um estado como o a seguir:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/main-with-2-commits.webp&quot; alt=&quot;figura mostrando o ramo main com dois commits A e B&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Se você quer desfazer o último &lt;em&gt;commit&lt;/em&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B&lt;/code&gt; você quer voltar ao estado do &lt;em&gt;commit&lt;/em&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;desfazendo-o-último-commit&quot;&gt;Desfazendo o último commit&lt;/h2&gt;

&lt;p&gt;Para desfazer o último &lt;em&gt;commit&lt;/em&gt; feito você deve usar o comando a seguir:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git reset HEAD~1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ou o comando a seguir, que é um atalho para o comando acima:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git reset HEAD^
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ou até mesmo o atalho a seguir:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git reset HEAD~
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Esses três comandos querem dizer o seguinte:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Volte ao estado anterior ao último commit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Note que ao executar esses comandos, você não verá mensagem informando que o &lt;em&gt;commit&lt;/em&gt; foi desfeito, mas se você rodar o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt; após fazer algum desses três comandos verá que arquivos adicionados e/ou alterações feitas voltam a serem marcados como alterações a serem commitadas (adicionadas à um &lt;em&gt;commit&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Veja, suponha que você tenha um histórico como o da imagem a seguir, onde o último &lt;em&gt;commit&lt;/em&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;48ccb8&lt;/code&gt;) adiciona o arquivo chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-4.txt&lt;/code&gt;: &lt;img src=&quot;/images/git-reset/git-reset-fig-2.webp&quot; alt=&quot;captura de tela mostrando o histórico de commits contendo 5 commits no terminal&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E se você executar algum dos comandos acima seguido de um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt; você verá um resultado assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-3.webp&quot; alt=&quot;captura de tela mostrando o resultado de desfazer um commit e fazer o git status em seguida&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E pode ver que o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-4.txt&lt;/code&gt; voltou ao seu estado anterior que era esperando ser feito o &lt;em&gt;commit&lt;/em&gt;. E se investigar o histórico novamente verá que o commit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;48ccb8&lt;/code&gt; não aparece mais.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-4.webp&quot; alt=&quot;captura de tela mostrando o detalhe do histórico de commits sem a presença do commit desfeito&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora você pode descartar as alterações ou continuar com elas e fazer um novo &lt;em&gt;commit&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;desfazendo-os-três-últimos-commits&quot;&gt;Desfazendo os três últimos commits&lt;/h2&gt;

&lt;p&gt;Agora que você sabe desfazer um commit, você pode usar o primeiro comando que acabou de ver e adpatá-lo para desfazer mais commits, para isso basta adicionar a quantidade de commits que você quer desfazer depois do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~&lt;/code&gt;. Vamos olhar novamente o nosso histórico que agora contém apenas quatro os commits (pois já desfiz um):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-5.webp&quot; alt=&quot;captura de tela mostrando o histórico de commits contendo 4 commits no terminal&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos supor que eu quero voltar ao estado do commit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;d815be&lt;/code&gt; que é o commit inicial que adicionou o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt;. Para isso é necessário desfazer três &lt;em&gt;commits&lt;/em&gt;, então para isso o comando indicado é este:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git reset HEAD~3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ao executá-lo e rodar mais uma vez o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt; temos os três arquivos que foram adicionados pelos commits desfeitos:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-6.webp&quot; alt=&quot;captura de tela mostrado o resultado de desfazer 3 commits e executar o git status novamente&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note que antes de executar esses comandos eu removi o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo-4.txt&lt;/code&gt; já que não vou precisar mais dele. E investigando novamente o histórico vemos apenas o commit inicial:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-reset/git-reset-fig-7.webp&quot; alt=&quot;captura de tela mostrando o histórico de commits mostrando apenas o commit inicial já que os outros foram desfeitos&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Antes de terminar a colinha eu quero deixar uma recomendação: é uma boa prática evitar desfazer commits que você já tenha feito &lt;em&gt;push&lt;/em&gt; para evitar de causar problemas de &lt;em&gt;detached&lt;/em&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HEAD&lt;/code&gt; para outras pessoas trabalhando junto com você.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;Abaixo você encontra &lt;a href=&quot;https://gitfichas.com&quot;&gt;GitFichas pra te ajudar a lembrar desses comandos e atalhos&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/013?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878672/gitfichas/pt/013/full_tznrem.jpg&quot; alt=&quot;GitFicha #013: O que é o HEAD&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/036?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878677/gitfichas/pt/036/full_mstasz.jpg&quot; alt=&quot;GitFicha #036: git reset HEAD\~3&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/037?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878677/gitfichas/pt/037/full_uakvoe.jpg&quot; alt=&quot;GitFicha #037: git reset HEAD^&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Espero que essa colinha te ajude a desfazer commits. 😉&lt;/p&gt;
</description>
        <pubDate>Fri, 14 Jan 2022 13:00:00 +0000</pubDate>
        <link>https://jtemporal.com/desfazendo-um-ou-mais-commits/</link>
        <guid isPermaLink="true">https://jtemporal.com/desfazendo-um-ou-mais-commits/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>Criando um novo branch e mudando pra ele com apenas um comando</title>
        <description>&lt;p&gt;Criar um branch novo no Git é um daqueles comandos do dia a dia que você roda sem pensar, até perceber que está digitando dois comandos quando um bastaria. Toda vez que você cria um branch, também precisa mudar para ele antes de começar a commitar, e existe um atalho que faz as duas coisas de uma vez. Nessa colinha eu vou te mostrar a forma tradicional de criar um branch e depois o meu atalho favorito para criar um e mudar para ele em um único comando.&lt;/p&gt;

&lt;h2 id=&quot;formas-tradicionais-de-criar-um-branch&quot;&gt;Formas tradicionais de criar um branch&lt;/h2&gt;

&lt;p&gt;No Git é possível criar um branch. E mudar para ele usando a sequência de comandos a seguir:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git branch ramo-1
git checkout ramo-1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Como você pode ver na imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-atalhos/criando-e-mudando-de-branch-fig-1.webp&quot; alt=&quot;imagem mostrando o resultado dos comandos git branch e git checkout&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ou até mesmo a sequência a seguir:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git branch ramo-2
git switch ramo-2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Também visível na imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-atalhos/criando-e-mudando-de-branch-fig-2.webp&quot; alt=&quot;imagem mostrando o resultado dos comandos git branch e git switch &quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;atalhos-para-criar-branches-e-trocar-de-branch-ao-mesmo-tempo&quot;&gt;Atalhos para criar branches e trocar de branch ao mesmo tempo&lt;/h2&gt;

&lt;p&gt;Não tem nada errado com essas duas sequências de comandos mostradas anteriormente, mas existem dois atalhos para obter o mesmo resultado usando apenas um comando. O primeiro usando o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git checkout&lt;/code&gt; seguido da &lt;em&gt;flag&lt;/em&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-b&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git checkout -b ramo-3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Que você pode ver o resultado semelhante àquele mostrado no primeiro exemplo dessa colinha:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-atalhos/criando-e-mudando-de-branch-fig-3.webp&quot; alt=&quot;imagem mostrando o resultado do comando git checkout -b ramo-3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E se você preferir usar o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git switch&lt;/code&gt; temos o seguinte atalho usando a &lt;em&gt;flag&lt;/em&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-c&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git switch -c ramo-4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Também com resultado semelhante ao que vimos anteriormente:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-atalhos/criando-e-mudando-de-branch-fig-4.webp&quot; alt=&quot;imagem mostrando o resultado do comando git switch -c ramo-4&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Para criar um branch novo e mudar para ele em um comando, você tem duas opções: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git checkout -b nome-do-branch&lt;/code&gt; ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git switch -c nome-do-branch&lt;/code&gt;. Os dois criam o branch e te colocam nele na hora, para você começar a commitar. O caminho mais longo, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git branch&lt;/code&gt; seguido de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git checkout&lt;/code&gt; ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git switch&lt;/code&gt;, continua funcionando, mas o atalho economiza um passo toda vez.&lt;/p&gt;

&lt;p&gt;Se você está organizando o seu fluxo no Git, talvez também goste de saber como &lt;a href=&quot;/atualizando-um-branch-com-git-rebase/&quot;&gt;atualizar um branch com git rebase&lt;/a&gt; e &lt;a href=&quot;/desfazendo-o-ultimo-commit-e-reaproveitando-a-mensagem/&quot;&gt;desfazer o último commit e reaproveitar a mensagem&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;Abaixo você encontra &lt;a href=&quot;https://gitfichas.com&quot;&gt;duas GitFichas pra te ajudar a lembrar desses atalhos&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/014?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878672/gitfichas/pt/014/full_wkqgez.jpg&quot; alt=&quot;GitFicha #014: git checkout -b nome&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/035?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878677/gitfichas/pt/035/full_uz9o0d.jpg&quot; alt=&quot;GitFicha #035: git switch -c nome&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Agora você sabe dois atalhos para criar um branch e mudar pra ele. Qual desses você vai adotar?&lt;/p&gt;
</description>
        <pubDate>Sat, 01 Jan 2022 14:34:20 +0000</pubDate>
        <link>https://jtemporal.com/criando-um-novo-branch-e-mudando-pra-ele-com-um-comando/</link>
        <guid isPermaLink="true">https://jtemporal.com/criando-um-novo-branch-e-mudando-pra-ele-com-um-comando/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>Creating a new branch and switching to it with just one command</title>
        <description>&lt;p&gt;Creating a new branch in Git is one of those everyday commands you run without thinking, until you realize you have been typing two commands when one would do. Every time you create a branch you also need to switch to it before you start committing, and there is a shortcut that does both at once. In this pro tip I will show you the traditional way to create a branch, then my favorite shortcut to create one and switch to it in a single command.&lt;/p&gt;

&lt;h2 id=&quot;traditional-ways-to-create-a-branch&quot;&gt;Traditional ways to create a branch&lt;/h2&gt;

&lt;p&gt;In Git, it is possible to create a branch and switch to it using the following command sequence:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git branch branch-1
git checkout branch-1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;As you can see in the image below:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-atalhos/git-chekout-branch-fig1.webp&quot; alt=&quot;image showing the result of the commands git branch and git checkout&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Or even with the following sequence:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git branch branch-2
git switch branch-2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Also visible in the image bellow:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-atalhos/git-switch-branch-fig2.webp&quot; alt=&quot;image showing the result of the commands git branch and git switch&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;shortcuts-to-create-branches-and-switch-branches-at-the-same-time&quot;&gt;Shortcuts to create branches and switch branches at the same time&lt;/h2&gt;

&lt;p&gt;There’s nothing wrong with these two sequences of commands shown earlier, but there are two shortcuts to get the same result using just one command. The first using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git checkout&lt;/code&gt; followed by the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-b&lt;/code&gt; flag:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git checkout -b branch-3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can see the similar result to the one shown in the first example of this blog post:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-atalhos/git-checkout-b-fig3.webp&quot; alt=&quot;image showing the result of the command git checkout -b branch-3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And if you prefer using the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git switch&lt;/code&gt; we have the following shortcut using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-c&lt;/code&gt; flag:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git switch -c branch-4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Also with a similar result to what we saw previously:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-atalhos/git-switch-c-fig4.webp&quot; alt=&quot;image showing the result of the command git switch -c branch-4&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;recapping&quot;&gt;Recapping&lt;/h2&gt;

&lt;p&gt;To create a new branch and switch to it in one command, you have two options: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git checkout -b branch-name&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git switch -c branch-name&lt;/code&gt;. Both create the branch and move you onto it right away, so you can start committing. The longer way, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git branch&lt;/code&gt; followed by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git checkout&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git switch&lt;/code&gt;, still works, but the shortcut saves you a step every time.&lt;/p&gt;

&lt;p&gt;If you are tidying up your Git workflow, you might also like how to &lt;a href=&quot;https://jtemporal.com/updating-a-branch-with-git-rebase/&quot;&gt;update a branch with git rebase&lt;/a&gt; and &lt;a href=&quot;https://jtemporal.com/undoing-the-last-commit-and-reusing-the-message/&quot;&gt;undoing the last commit and reusing the message&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;gitfichas&quot;&gt;GitFichas&lt;/h2&gt;

&lt;p&gt;Below you’ll find &lt;a href=&quot;https://gitfichas.com&quot;&gt;two GitFichas to help you remember these shortcuts&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/014?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878596/gitfichas/en/014/full_tatfxp.jpg&quot; alt=&quot;GitFicha #014: git checkout -b name&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/035?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878600/gitfichas/en/035/full_krt83d.jpg&quot; alt=&quot;GitFicha #035: git switch -c name&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Now you know two shortcuts to create a branch and change to it with &lt;em&gt;only one command&lt;/em&gt;.&lt;/p&gt;
</description>
        <pubDate>Sat, 01 Jan 2022 14:34:20 +0000</pubDate>
        <link>https://jtemporal.com/creating-a-new-branch-and-switching-to-it-with-only-one-command/</link>
        <guid isPermaLink="true">https://jtemporal.com/creating-a-new-branch-and-switching-to-it-with-only-one-command/</guid>
        
        <category>git</category>
        
        <category>english</category>
        
        <category>protip</category>
        
        
      </item>
    
      <item>
        <title>Updating a branch with git rebase</title>
        <description>&lt;p&gt;The command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt; can be used to make various history adjustments, from rewriting the commit tree (and by doing that rewriting the history) to even pushing commits forward as if the branch were created in the future.&lt;/p&gt;

&lt;p&gt;In this pro tip I will show you how to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt; to update a branch, bringing in the latest commits from main (or master) so your working branch is current.&lt;/p&gt;

&lt;h2 id=&quot;creating-a-example-history&quot;&gt;Creating a example history&lt;/h2&gt;

&lt;p&gt;Suppose you have a project and you were working on a task on the branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task-2&lt;/code&gt;, meanwhile someone else was working on the branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task-1&lt;/code&gt; that was merged into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; and thus making the branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; more up-to-date as shown in the drawing below:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/branches-before-rebase.webp&quot; alt=&quot;drawing showing the current history state&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Similarly, the history graph should look like the image below:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/branch-main-merged-fig8.webp&quot; alt=&quot;image showing the main branch history&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Knowing that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; is more up-to-date than your branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task-2&lt;/code&gt; and following the good practice of always working with the most up-to-date project, you decide it’s time to update your working branch, which has the current history looking like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-log-graph-correct-branch-fig7.webp&quot; alt=&quot;image showing the result of git log --graph command showing the branch task-2 with outdated history&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;updating-your-branch-from-main-with-git-rebase&quot;&gt;Updating your branch from main with git rebase&lt;/h2&gt;

&lt;p&gt;There are a few ways to update the current branch, one of them is using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git merge&lt;/code&gt; and merging the most updated branch, in this case &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;, into the branch you want to update in this case &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task-2&lt;/code&gt;. The other way is using the rebase that I’m going to show you now.&lt;/p&gt;

&lt;p&gt;There are two ways of using rebase to make this update, let’s see the first one which is &lt;strong&gt;being on the branch you want to update&lt;/strong&gt;, so you need to go to the branch to be updated, in this case &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task-2&lt;/code&gt; and use &lt;em&gt;rebase&lt;/em&gt; indicating the branch that is the source of changes:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git checkout task-2
git rebase main
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;By running these commands you will see in your terminal the message  saying that the update was done successfully &lt;em&gt;“Successfully rebased and updated refs/heads/task-2.”&lt;/em&gt; as you can see in the following image:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-branch-fig9.webp&quot; alt=&quot;imagem com o resultado dos comandos anteriores&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The second way is &lt;strong&gt;independent of the current branch&lt;/strong&gt;, this format is a shortcut for the two previous commands, just use rebase, pass the source branch of the changes followed by the target branch:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git rebase main task-2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This command should also show the same message as the previous image. Regardless of the way you choose to use rebase, your history should look something like the drawing below:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/branches-after-rebase.webp&quot; alt=&quot;desenho do histórico atualizado após o git rebase&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And the history graph should look like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/updated-history-after-git-reabse-fig10.webp&quot; alt=&quot;grafo de histórico após atualizar o ramo task-2 com o rebase&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;

&lt;p&gt;Wrapping up, we have an important thing to point out now that our branch is updated: the rebase will only happen without interruptions, as shown in this pro tip blog post, if there are no conflicts, otherwise the rebase will be suspended and the &lt;a href=&quot;https://jtemporal.com/solving-conflicts/&quot;&gt;conflicts must be resolved&lt;/a&gt; before continuing.&lt;/p&gt;

&lt;p&gt;Now you know how to update a branch using rebase, if you want more details about the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt;, I recommend &lt;a href=&quot;https://git-scm.com/docs/git-rebase/&quot;&gt;reading its documentation&lt;/a&gt;. And if a rebase ever goes sideways and you lose a commit, the &lt;a href=&quot;https://jtemporal.com/recovering-lost-commits-with-git-reflog/&quot;&gt;git reflog&lt;/a&gt; can help you get it back.&lt;/p&gt;

&lt;p&gt;Below you can see the git study card that can help you remember the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt; to update a branch:&lt;/p&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/027?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878599/gitfichas/en/027/full_zjjwxe.jpg&quot; alt=&quot;GitFicha #027: git rebase&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
</description>
        <pubDate>Thu, 30 Dec 2021 14:34:20 +0000</pubDate>
        <link>https://jtemporal.com/updating-a-branch-with-git-rebase/</link>
        <guid isPermaLink="true">https://jtemporal.com/updating-a-branch-with-git-rebase/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>Atualizando um branch com git rebase</title>
        <description>&lt;p&gt;O comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt; pode ser usado para fazer vários ajustes de histórico, desde reescrever a árvore de commits, reescrevendo assim o histórico, até mesmo empurrar commits para um ponto mais a frente como se o branch fosse criado no futuro.&lt;/p&gt;

&lt;p&gt;Nessa colinha vou te mostrar como usar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt; para atualizar um branch, trazendo os commits mais recentes do main (ou master) para o seu branch de trabalho ficar em dia.&lt;/p&gt;

&lt;h2 id=&quot;criando-um-histórico-de-exemplo&quot;&gt;Criando um histórico de exemplo&lt;/h2&gt;

&lt;p&gt;Suponha que você tem um projeto e estava trabalhando numa tarefa no branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa-2&lt;/code&gt;, enquanto isso outra pessoa estava trabalhando no branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa-1&lt;/code&gt; que foi feito o merge para o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; e assim tornando o branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; mais atualizado como mostrado no desenho abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-origem-fig-11.webp&quot; alt=&quot;desenho mostrando o estado corrente do histórico&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Similarmente, o grafo do histórico deverá se mostrar como a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-origem-fig-8.webp&quot; alt=&quot;imagem mostrando o branch main com o histórico atualizado&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Sabendo que o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; está mais atualizado que o seu branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa-2&lt;/code&gt; e seguindo a boa prática de trabalhar sempre com o projeto mais atualizado, você decide que é hora de atualizar o seu branch de trabalho, que tem o histórico corrente assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-origem-fig-7.webp&quot; alt=&quot;imagem com o resultado do comando git log --graph mostrando o ramo tarefa-2 com histórico antes da atualização&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;atualizando-seu-branch-a-partir-do-main-com-git-rebase&quot;&gt;Atualizando seu branch a partir do main com git rebase&lt;/h2&gt;

&lt;p&gt;Existem algumas formas de atualizar o branch atual, uma delas é usando o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git merge&lt;/code&gt; e fazendo o &lt;em&gt;merge&lt;/em&gt; do branch mais atualizado, nesse caso o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;, no branch que você quer atualizar nesse caso o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa-2&lt;/code&gt;. A outra forma é usando o &lt;em&gt;rebase&lt;/em&gt; que vou te mostrar agora.&lt;/p&gt;

&lt;p&gt;Tem duas formas de usar o rebase para fazer essa atualização, vamos ver a primeira que é &lt;strong&gt;estando no branch que você quer atualizar&lt;/strong&gt;, então você precisa ir pro branch a ser atualizado, nesse caso o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa-2&lt;/code&gt; e usar o &lt;em&gt;rebase&lt;/em&gt; indicando o branch de origem das mudanças:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git checkout tarefa-2
git rebase main
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Ao executar esses comandos você verá no seu terminal a mensagem avisando que a atualização foi feita com sucesso &lt;em&gt;“Successfully rebased and updated refs/heads/tarefa-2.”&lt;/em&gt; (ou &lt;em&gt;“Rebase e atualização das refs/heads/tarefa-2 bem sucedida.”&lt;/em&gt; em tradução livre) como você pode ver na imagem a seguir:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-origem-fig-9.webp&quot; alt=&quot;imagem com o resultado dos comandos anteriores&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A segunda forma é &lt;strong&gt;independente do branch corrente&lt;/strong&gt;, esse formato é um atalho para os dois comandos anteriores, basta usar o rebase, passar o branch de origem das mudanças seguido do branch de destino:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git rebase main tarefa-2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Esse comando também deverá mostrar a mesma mensagem da imagem anterior. Independentemente da forma escolhida para usar o &lt;em&gt;rebase&lt;/em&gt;, o seu histórico deverá ser algo semelhante ao desenho abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-origem-fig-12.webp&quot; alt=&quot;desenho do histórico atualizado após o git rebase&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E o grafo de histórico deverá se mostrar assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-origem-fig-10.webp&quot; alt=&quot;grafo de histórico após atualizar o ramo tarefa-2 com o rebase&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;conclusão&quot;&gt;Conclusão&lt;/h2&gt;

&lt;p&gt;Para finalizar temos uma coisa importante de notar agora que nosso branch está atualizado: o rebase só acontecerá sem interrupções, como mostrado nessa colinha, caso não existam conflitos, caso contrário o rebase será suspendido e os &lt;a href=&quot;https://jtemporal.com/resolvendo-conflitos/&quot;&gt;conflitos devem ser resolvidos&lt;/a&gt; antes de continuar.&lt;/p&gt;

&lt;p&gt;Agora você sabe atualizar um branch usando o rebase, caso queira mais detalhes sobre o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt;, recomendo a leitura da &lt;a href=&quot;https://git-scm.com/docs/git-rebase/pt_BR&quot;&gt;documentação do mesmo em português&lt;/a&gt;. E se um rebase der errado e você perder um commit, o &lt;a href=&quot;/recuperando-commits-perdidos-com-git-reflog/&quot;&gt;git reflog&lt;/a&gt; pode te ajudar a recuperá-lo.&lt;/p&gt;

&lt;p&gt;Abaixo você pode ver uma ficha que pode te ajudar a lembrar do comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt; para atualizar um branch:&lt;/p&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/027?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878675/gitfichas/pt/027/full_eqj0ec.jpg&quot; alt=&quot;GitFicha #027: git rebase&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
</description>
        <pubDate>Thu, 30 Dec 2021 14:34:20 +0000</pubDate>
        <link>https://jtemporal.com/atualizando-um-branch-com-git-rebase/</link>
        <guid isPermaLink="true">https://jtemporal.com/atualizando-um-branch-com-git-rebase/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>Fixing the branch source with git rebase</title>
        <description>&lt;p&gt;The command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt; can be used to make various history adjustments, from rewriting the commit tree (and by doing that rewriting the history) to even pushing commits forward as if the branch were created in the future.&lt;/p&gt;

&lt;p&gt;In this pro tip I will show you how to use git rebase to fix the source of a given branch.&lt;/p&gt;

&lt;h2 id=&quot;creating-a-branch-from-an-incorrect-branch&quot;&gt;Creating a branch from an incorrect branch&lt;/h2&gt;

&lt;p&gt;Suppose you have two tasks to do in the next few weeks and you want to work on each task in a different branch.&lt;/p&gt;

&lt;p&gt;So to work on task #1 you create a branch with that name from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-checkout-fig1.webp&quot; alt=&quot;image showing the result of creating the branch task-1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Let’s say that during your implementation you got tired of messing with that problem and decided that it would be a good idea to change the context for a bit and start working on task 2.&lt;/p&gt;

&lt;p&gt;For that you need to create a new branch also from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;, however, without realizing it you ended up creating your branch from branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task-1&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-switch-fig2.webp&quot; alt=&quot;image showing the result of creating the branch task-2 from task-1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And then, you started working and only realized the mistake later. After you commit to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task-2&lt;/code&gt; your history looks something like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/rebase-fixing-source-fig3.webp&quot; alt=&quot;drawing showing that the branch task-2 depends on the branch task-1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you look at your history graph you’ll see that it shows that the most recent commit (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1078aa&lt;/code&gt;) on the branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task-2&lt;/code&gt; depends on the commit made on the branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task-1&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a7f89a&lt;/code&gt;):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-log-graph-worng-branch-fig4.webp&quot; alt=&quot;image showing the result of command git log --graph on branch tarefa-2 showing the history dependant of the branch tarefa-1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So we need to fix this.&lt;/p&gt;

&lt;h2 id=&quot;fixing-the-branch-source&quot;&gt;Fixing the branch source&lt;/h2&gt;

&lt;p&gt;With this mistake in hand and since the implementations of each task are independent of each other you want to make this correction.&lt;/p&gt;

&lt;p&gt;For this you must use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt; followed by the flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--onto&lt;/code&gt; and the name &lt;strong&gt;of the three branches&lt;/strong&gt;, the full command looks like this:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git rebase --onto main task-1 task-2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The result should look similar to the image below:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-onto-main-task1-task2-fig5.webp&quot; alt=&quot;image showing the result of the command git rebase --onto main tarefa-1 task-2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, having run the above command, your history becomes what it should have been from the beginning:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/rebase-fixed-source-fig6.webp&quot; alt=&quot;drawing showing the branch task-2 as dependant of the branch main&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And if you check the history graph again, you’ll see that we only see the commits from task 2 in the corresponding branch:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-log-graph-correct-branch-fig7.webp&quot; alt=&quot;image showing the result of the command git log --graph showing the branch task-2 with the correct history&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Three important things to notice:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;First, it is always necessary to give the names of the three branches involved to avoid missing commits;&lt;/li&gt;
  &lt;li&gt;Second, now branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task-2&lt;/code&gt; has its source in the branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;;&lt;/li&gt;
  &lt;li&gt;And third, the hash of the commit on the branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task-2&lt;/code&gt; is no longer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1078aa&lt;/code&gt; but &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;b25a97&lt;/code&gt; since the commit has changed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With that now you know how to change or fix the source of a branch, if you want more details about the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt;, I recommend &lt;a href=&quot;https://git-scm.com/docs/git-rebase&quot;&gt;reading the command’s documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Below you can see a card that can help you remember the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase --onto&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/en/028?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878599/gitfichas/en/028/full_thuxcg.jpg&quot; alt=&quot;GitFicha #028: git rebase --onto&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
</description>
        <pubDate>Wed, 29 Dec 2021 14:40:00 +0000</pubDate>
        <link>https://jtemporal.com/fixing-the-branch-source-with-git-rebase/</link>
        <guid isPermaLink="true">https://jtemporal.com/fixing-the-branch-source-with-git-rebase/</guid>
        
        <category>git</category>
        
        <category>english</category>
        
        <category>protip</category>
        
        
      </item>
    
      <item>
        <title>Corrigindo a origem de um branch com git rebase</title>
        <description>&lt;p&gt;O comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt; pode ser usado para fazer vários ajustes de histórico, desde reescrever a árvore de commits, reescrevendo assim o histórico, até mesmo empurrar commits para um ponto mais a frente como se o branch fosse criado no futuro.&lt;/p&gt;

&lt;p&gt;Nessa colinha vou te mostrar como usar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt; pra corrigir a origem de um determinado branch.&lt;/p&gt;

&lt;h2 id=&quot;criando-uma-branch-a-partir-de-um-branch-incorreto&quot;&gt;Criando uma branch a partir de um branch incorreto&lt;/h2&gt;

&lt;p&gt;Suponha que você tem duas tarefas para fazer nas próximas semanas e que você quer trabalhar em cada tarefa em uma branch diferente.&lt;/p&gt;

&lt;p&gt;Então para trabalhar na tarefa 1 você cria uma branch com esse nome a partir do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-origem-fig-1.webp&quot; alt=&quot;imagem mostrando o resultado de criar o ramo tarefa-1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Digamos, que durante a sua implementação você cansou de mexer com aquele problema e decidiu que seria uma boa ideia mudar um pouco de contexto e iniciar a tarefa 2.&lt;/p&gt;

&lt;p&gt;Para isso você precisa criar um novo branch também a partir do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;, no entanto, sem se dar conta você acabou criando o seu branch a partir do branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa-1&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-origem-fig-2.webp&quot; alt=&quot;imagem mostrando o resultado de criar o ramo tarefa-2 a partir do ramo tarefa-1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E aí, começou a trabalhar e só se deu conta do erro mais tarde. Depois de fazer um commit no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa-2&lt;/code&gt; o seu histórico parece algo assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-origem-fig-3.webp&quot; alt=&quot;desenho mostrando o ramo tarefa-2 com dependente do ramo tarefa-1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Se você analisar o grafo do seu histórico pode ver que ele mostra que o commit mais recente (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;99247c&lt;/code&gt;) no branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa-2&lt;/code&gt; depende do commit feito no branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa-1&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5873c2&lt;/code&gt;):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-origem-fig-4.webp&quot; alt=&quot;imagem mostrando o resultado do comando git log --graph em tarefa-2 mostrando o histórico dependente do ramo tarefa-1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Então precisamos corrigir isso.&lt;/p&gt;

&lt;h2 id=&quot;corrigindo-a-origem-do-branch&quot;&gt;Corrigindo a origem do branch&lt;/h2&gt;

&lt;p&gt;Com esse erro nas mãos e como as implementações de cada tarefa é independente uma da outra você quer fazer essa correção.&lt;/p&gt;

&lt;p&gt;Para isso você deve usar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt; seguido da &lt;em&gt;flag&lt;/em&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--onto&lt;/code&gt; e o nome &lt;strong&gt;dos três&lt;/strong&gt; branches, o comando por completo fica assim:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git rebase --onto main tarefa-1 tarefa-2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O resultado deverá ser semelhante a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-origem-fig-5.webp&quot; alt=&quot;resultado do comando git rebase --onto main tarefa-1 tarefa-2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora, tendo executado o comando acima, o seu histórico passa a ser o que deveria ser desde o princípio:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-origem-fig-6.webp&quot; alt=&quot;desenho mostrando o ramo tarefa-2 com dependente do ramo main&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E se você conferir novamente o grafo do histórico, verá que apenas vemos os commits referentes a tarefa 2 no branch correspondente:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-rebase-ajustar-origem/git-rebase-origem-fig-7.webp&quot; alt=&quot;imagem com o resultado do comando git log --graph mostrando o ramo tarefa-2 com histórico corrigido&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Três coisas são importantes de notar:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Primeiro, que é sempre necessário dar os nomes dos três branches envolvidos para evitar perder commits;&lt;/li&gt;
  &lt;li&gt;Segundo, que o agora o branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa-2&lt;/code&gt; tem sua origem no branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;;&lt;/li&gt;
  &lt;li&gt;E terceiro, que o hash do commit no branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tarefa-2&lt;/code&gt; não é mais &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;99247c&lt;/code&gt; e sim &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;952dc3&lt;/code&gt; já que o commit mudou.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Com isso agora você sabe alterar ou corrigir a origem de um branch, caso queira mais detalhes sobre o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase&lt;/code&gt;, recomendo a leitura da &lt;a href=&quot;https://git-scm.com/docs/git-rebase/pt_BR&quot;&gt;documentação do comando em português&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Abaixo você pode ver uma ficha que pode te ajudar a lembrar do comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git rebase --onto&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;row&quot; style=&quot;margin: auto; width: 75%;&quot;&gt;
  &lt;div class=&quot;card-recent&quot;&gt;
    &lt;a href=&quot;https://gitfichas.com/projects/028?utm_source=blog&quot; class=&quot;index-anchor&quot;&gt;
      &lt;div class=&quot;panel panel-default&quot;&gt;
        &lt;img width=&quot;100%&quot; src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878675/gitfichas/pt/028/full_agybxd.jpg&quot; alt=&quot;GitFicha #028: git rebase --onto&quot; /&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
</description>
        <pubDate>Wed, 29 Dec 2021 14:34:20 +0000</pubDate>
        <link>https://jtemporal.com/corrigindo-a-origem-de-um-branch-com-git-rebase/</link>
        <guid isPermaLink="true">https://jtemporal.com/corrigindo-a-origem-de-um-branch-com-git-rebase/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>Solving conflicts in Git</title>
        <description>&lt;p&gt;Resolving conflicts can be an arduous and complicated task when it comes to git projects. In this article you will learn a foolproof step-by-step guide to resolving conflicts.&lt;/p&gt;

&lt;p&gt;If you already know what conflicts are and just want to see the list of steps and commands to resolve a conflict, I &lt;a href=&quot;#wrapping-up&quot;&gt;suggest you skip to the conclusion by clicking here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;what-is-a-conflict-in-git&quot;&gt;What is a conflict in git&lt;/h2&gt;

&lt;p&gt;When a project has multiple people working at the same time, it’s possible that two people need to make changes to the same piece of a file. When more than one person changes the same piece of a file on different branches, that’s when conflicts appear.&lt;/p&gt;

&lt;p&gt;The conflict symbolizes that two or more changes happened to the same chunk of a file and git doesn’t know which of the changes to keep.&lt;/p&gt;

&lt;h2 id=&quot;how-a-conflict-is-formed&quot;&gt;How a conflict is formed&lt;/h2&gt;

&lt;p&gt;In the image below we have a diagram that I have affectionately nicknamed the “conflict anatomy”. It shows the steps until a conflict is formed. It is worth mentioning that usually, during the project development cycle, changes are more significant and sometimes in greater quantity.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-conflict-resolution/conflict-anatomy.webp&quot; alt=&quot;drawing showing the conflict anatomy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;0 -&lt;/strong&gt; In our project we have a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; that was added by the initial commit in the repository. After creating this file, two changes need to be made to add some more information to the same file and two people will make this change;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 -&lt;/strong&gt; Each person then created a branch from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; to work on their changes, these new branches were created more or less at the same time, that is, they have the same starting point;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2 -&lt;/strong&gt; For some time each person works on their branch implementing their change, in this case, each person is adding the line “Person x was here.” in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; file where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; is the person’s id;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 -&lt;/strong&gt; Person 1 makes a pull request and has this pull request approved and also merged into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 -&lt;/strong&gt; Person 2, on the other hand, makes the pull request to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;, but this pull request &lt;strong&gt;cannot&lt;/strong&gt; be merged because it has conflicts.&lt;/p&gt;

&lt;h2 id=&quot;creating-a-conflict-on-purpose&quot;&gt;Creating a conflict on purpose&lt;/h2&gt;

&lt;p&gt;To demonstrate how this looks, I created a repository with a scenario similar to the one described in the previous section that &lt;a href=&quot;https://github.com/jtemporal/example-conflict&quot;&gt;you can find here&lt;/a&gt;. The initial file and the two branches, one for each person, were created from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;, see:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-conflict-resolution/example-repository-page-fig2.webp&quot; alt=&quot;image showing the initial page from the repository previously described&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then I made the changes for each person. In the branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;person1&lt;/code&gt; I added the description &lt;em&gt;“Person 1 was here!”&lt;/em&gt; in the last line of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; and similarly I did the same process for the branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;person2&lt;/code&gt;. So I opened both pull requests:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-conflict-resolution/list-of-pull-requests-fig3.webp&quot; alt=&quot;image showing two open pull requests on github&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I reviewed and merged the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;person1&lt;/code&gt;’s PR:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-conflict-resolution/merged-pull-request-fig4.webp&quot; alt=&quot;image showing the merged pull request&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And then I went back to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;person2&lt;/code&gt;’s PR and I could see the indication that the pull request contains a conflict, see:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-conflict-resolution/pull-request-with-a-conflict-fig5.webp&quot; alt=&quot;image showing person 2 pull request with the conflict message on GitHub&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And now with a brand new conflict in our hands, it’s time to resolve it.&lt;/p&gt;

&lt;h2 id=&quot;resolving-a-conflict-in-git&quot;&gt;Resolving a conflict in Git&lt;/h2&gt;

&lt;p&gt;Before starting it is important to note that this type of conflict is also possible to resolve through the GitHub interface, but the focus here is on the commands, so let’s go!&lt;/p&gt;

&lt;p&gt;The first important thing is to decide on which branch to resolve the conflict, a rule that usually works is to resolve conflicts on the branch that presents the changes, in this case, this branch is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;person2&lt;/code&gt;, with that you must update your local repository, and this particular branch with adjustments from main, for that you can do:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git checkout person2
git pull origin main
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This will bring the conflict to your local machine giving you a warning that there are conflicts, that you should resolve the conflict and commit the result:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-conflict-resolution/git-pull-with-conflict-message-fig6.webp&quot; alt=&quot;image showing the result of the git pull command displaying the conflict message&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you open &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; in a code editor, you will notice that are markers indicated by successive greater than signs (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;&lt;/code&gt;), less than signs (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;&lt;/code&gt;) and equal signs (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;=&lt;/code&gt;), here is an example of the conflict shown in Vim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-conflict-resolution/conflict-displayed-on-vim-fig7.webp&quot; alt=&quot;image showing the conflict on VIM editor&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It is also possible that you use VS Code that shows the conflict in a more friendly way as it visually marks, with different colors, each change of different source and still gives you options on how to resolve the conflict by accepting part of the changes, or both, or none of them:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-conflict-resolution/conflict-displayed-in-vs-code-fig8.webp&quot; alt=&quot;image showing the conflict on VS Code with the friendlier markings&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To understand what each button presented by VS Code means, let’s dissect this representation format. A conflict can be divided into two parts:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Our changes:&lt;/strong&gt; those on the current branch also called current changes;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Others’ changes:&lt;/strong&gt; Those we brought to the local machine by doing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git pull&lt;/code&gt; also called incoming changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this format, each block is delimited by a greater or lesser sign up to the block of repeated equal signs, so for example in this case we have the following blocks.&lt;/p&gt;

&lt;p&gt;The one with current changes:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD
Person 2 was here!
=======
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And the one with the incoming changes:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;=======
Person 1 was here!
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; 3c20251a794ec572e2c3202017d843e2d8769843
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Since we want to leave both changes we can just delete the lines with the markers and save the file, if you are using simpler editors. In VS Code we can press &lt;em&gt;“Accept both changes”&lt;/em&gt; and continue with the following commands. After accepting all the changes, either manually or using the buttons in VS Code, you should have a file like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-conflict-resolution/the-resulting-file-after-conflict-fixing-fig9.webp&quot; alt=&quot;image showing the expected result after accepting both changes&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Remember to save the file. Then go back to the terminal, if you run the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt; you will see that the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; file shows changes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-conflict-resolution/git-status-message-after-fixing-conflicts-fig10.webp&quot; alt=&quot;image showing the result of the git status command with the readme.md file showing changes&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now you can add this staging file with the following command:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git add README.md
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And commit the changes in your preferred way. Note that when committing, if you use editors to write the commit message, it is possible that this message comes pre-populated as in the image below:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-conflict-resolution/automatic-commit-message-after-fixing-conflict-fig11.webp&quot; alt=&quot;image showing the de commit message pre-filled in vim&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can customize the message or leave it as is, and when you’re done committing, push those changes to GitHub with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git push&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-conflict-resolution/message-after-pushing-commit-with-fixed-conflict-fig12.webp&quot; alt=&quot;image showing the changes being sent to GitHub&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now if you reload the pull request page you should see that the conflict is resolved, check it out:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/git-conflict-resolution/updated-pull-request-without-conflict-after-latest-commit-fig13.webp&quot; alt=&quot;Imagem mostrando o PR que antes apresentava conflito agora com o conflito resolvido&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And we can finally merge this pull request! Victory! 🎉🎉&lt;/p&gt;

&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;a name=&quot;wrapping-up&quot;&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;You now understand how conflicts happen and you also know all the steps involved in resolving conflicts.&lt;/p&gt;

&lt;p&gt;Here is the simple list of all commands and steps to resolve conflicts, remember to replace the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;&amp;gt;&lt;/code&gt; notations accordingly:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git checkout &amp;lt;name of the branch in conflict&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git pull origin main&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;open the file in conflict and resolve it&lt;/li&gt;
  &lt;li&gt;save the file&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git add &amp;lt;name of the altered file&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git commit&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git push&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I hope this article helps you resolve any git conflicts you may encounter going forward. 😉&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;extra-reading&quot;&gt;Extra reading&lt;/h2&gt;

&lt;p&gt;Here are some more documentation and tips for you to learn about conflict resolution in git:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gitfichas.com/en?utm_source=blog&quot;&gt;The git study cards repository GitFichas&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/about-merge-conflicts&quot;&gt;GitHub’s docs about conflict resolution&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.atlassian.com/git/tutorials/using-branches/merge-conflicts&quot;&gt;Atlassian’s tutorial also about conflict resolution&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Fri, 24 Dec 2021 20:55:59 +0000</pubDate>
        <link>https://jtemporal.com/solving-conflicts/</link>
        <guid isPermaLink="true">https://jtemporal.com/solving-conflicts/</guid>
        
        <category>git</category>
        
        <category>tutorial</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Resolvendo conflitos em Git</title>
        <description>&lt;p&gt;Resolver conflitos pode ser uma tarefa árdua e complicada quando se trata de projetos git. Nesse artigo você vai aprender um passo-a-passo infalível para resolver conflitos.&lt;/p&gt;

&lt;p&gt;Caso você já saiba o que são conflitos e queira apenas ver a lista de passos e comandos para resolver um conflito sugiro que &lt;a href=&quot;#conclusao&quot;&gt;pule para a conclusão clicando aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;o-que-é-um-conflito-em-git&quot;&gt;O que é um conflito em git&lt;/h2&gt;

&lt;p&gt;Quando um projeto tem várias pessoas trabalhando ao mesmo tempo, é possível que duas pessoas precisem fazer alterações no mesmo pedaço de um arquivo. Quando mais de uma pessoa altera o mesmo pedaço de um arquivo em branches diferentes é nesse momento que os conflitos aparecem.&lt;/p&gt;

&lt;p&gt;O conflito simboliza que duas ou mais alterações aconteceram no mesmo pedaço de um arquivo e o git não sabe qual das alterações manter.&lt;/p&gt;

&lt;h2 id=&quot;como-um-conflito-se-forma&quot;&gt;Como um conflito se forma&lt;/h2&gt;

&lt;p&gt;Na imagem abaixo temos um diagrama que eu carinhosamente apelidei de “anatomia de um conflito” que mostra os passos até que um conflito se forme. Vale salientar que normalmente, durante o ciclo de desenvolvimento de projetos, as alterações são maiores a por vezes em maior quantidade.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/anatomia-de-um-conflito.webp&quot; alt=&quot;anatomia de um conflito&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;0 -&lt;/strong&gt; No nosso projeto temos um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; que foi adicionado pelo commit inicial no repositório. Depois da criação desse arquivo, duas alterações precisam ser feitas para adicionar mais algumas informações ao mesmo arquivo e duas pessoas vão fazer essa alteração;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 -&lt;/strong&gt; Cada pessoa então criou um branch a partir da &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; para trabalhar nas suas alterações, esses novos branches foram criados mais ou menos ao mesmo tempo, ou seja, eles possuem um mesmo ponto de partida;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2 -&lt;/strong&gt; Durante algum tempo cada pessoa trabalha na sua branch implementando a sua alteração, que nesse caso é adicionar a linha &lt;em&gt;“pessoa x esteve aqui!”&lt;/em&gt; no arquivo de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; sendo x o identificador da pessoa;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 -&lt;/strong&gt; A pessoa 1 faz um pull request e tem esse pull request aprovado e seu merge na &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 -&lt;/strong&gt; A pessoa 2 por sua vez, faz o seu pull request para &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;, só que esse pull request &lt;strong&gt;não&lt;/strong&gt; pode ser feito merge pois apresenta conflitos.&lt;/p&gt;

&lt;h2 id=&quot;formando-um-conflito-na-prática&quot;&gt;Formando um conflito na prática&lt;/h2&gt;

&lt;p&gt;Para demonstrar como isso se apresenta, eu criei um repositório com um cenário parecido ao descrito na seção anterior &lt;a href=&quot;https://github.com/jtemporal/exemplo-conflito/branches&quot;&gt;que você pode encontrar aqui&lt;/a&gt;. O arquivo inicial foi criado e as duas branches, uma para cada pessoa, também já foram criadas a partir da &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;, veja:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/resolucao-de-conflito-git/resolucao-de-conflito-fig-1.webp&quot; alt=&quot;imagem mostrando o estado inicial do repositório como descrito anteriormente&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Em seguida fiz as alterações para cada pessoa, no branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pessoa1&lt;/code&gt; adicionei a descrição &lt;em&gt;“Pessoa 1 esteve aqui!”&lt;/em&gt; na última linha do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; e de forma similar fiz o mesmo processo para o branch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pessoa2&lt;/code&gt;. Então, abri os dois pull requests:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/resolucao-de-conflito-git/resolucao-de-conflito-fig-2.webp&quot; alt=&quot;imagem mostrando os dois pull requests abertos no github&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Revisei e dei o merge no pull request da &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pessoa1&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/resolucao-de-conflito-git/resolucao-de-conflito-fig-3.webp&quot; alt=&quot;imagem mostrando o pull request feito merge&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E então voltei para o PR da &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pessoa2&lt;/code&gt; e pude notar a indicação de que o pull request continha um conflito, veja:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/resolucao-de-conflito-git/resolucao-de-conflito-fig-4.webp&quot; alt=&quot;imagem mostrando o pull request de pessoa 2 com a mensagem de conflito do github&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E agora com o conflito quentinho em mãos é hora de resolvê-lo.&lt;/p&gt;

&lt;h2 id=&quot;resolvendo-um-conflito-no-git&quot;&gt;Resolvendo um conflito no Git&lt;/h2&gt;

&lt;p&gt;Antes de começar é importante notar que este tipo de conflito é possível resolver também pela interface do GitHub, mas o foco aqui são os comandos, então vamos lá!&lt;/p&gt;

&lt;p&gt;A primeira coisa importante é decidir em qual branch resolver o conflito, uma regra que geralmente funciona é resolver os conflitos no branch que apresenta as alterações, neste caso, o branch em questão é o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pessoa2&lt;/code&gt;, com isso você deve atualizar o seu repositório local, e este branch em particular com os ajustes da main, para isso faça:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git checkout pessoa2
git pull origin main
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Isso irá trazer o conflito para a sua máquina te dando um aviso informando que existem conflitos, que você deve resolver o conflito e fazer um commit com o resultado:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/resolucao-de-conflito-git/resolucao-de-conflito-fig-5.webp&quot; alt=&quot;resultado do comando git pull com conflito&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Se você abrir o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; num editor de código irá notar a presença de marcadores indicado por sucessivos sinais de maior que (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;&lt;/code&gt;), sinais de menor que (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;&lt;/code&gt;) e sinais de igual (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;=&lt;/code&gt;), aqui um exemplo do conflito mostrado no Vim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/resolucao-de-conflito-git/resolucao-de-conflito-fig-6.webp&quot; alt=&quot;imagem mostrando o conflito no editor vim com as marcações mais simples&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Também é possível que você use o VS Code que mostra o conflito de uma forma mais amigável já que ele marca visualmente, com cores diferentes, cada mudança de origem diferente e ainda te d’a’ opções de como resolver o conflito aceitando parte das mudanças, ou as duas, ou nenhuma delas:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/resolucao-de-conflito-git/resolucao-de-conflito-fig-7.webp&quot; alt=&quot;imagem mostrando o conflito no editor VS Code com as marcações mais bem definidas&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Para entender o que cada botão apresentado pelo VS Code quer dizer, vamos dissecar um pouco esse formato de representação. Um conflito pode ser dividido em duas partes:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;As nossas alterações:&lt;/strong&gt; aquelas que estão no branch corrente também chamadas de alterações atuais (&lt;em&gt;current change&lt;/em&gt;);&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;As alterações dos outros:&lt;/strong&gt; aquelas que trouxemos para a máquina local ao fazer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git pull&lt;/code&gt; também chamadas de alterações que estão chegando ou de entrada (&lt;em&gt;incoming changes&lt;/em&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nesse formato, cada bloco é delimitado por um sinal de maior ou menor até o bloco de sinais de igual repetidos, então por exemplo nesse caso temos os seguintes blocos.&lt;/p&gt;

&lt;p&gt;Aquele com as alterações atuais:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD
Pessoa 2 esteve aqui!
=======
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E aquele com as alterações que estão chegando:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;=======
Pessoa 1 esteve aqui!
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; 3c20251a794ec572e2c3202017d843e2d8769843
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Como queremos deixar ambas alterações, podemos apenas apagar as linhas com os marcadores salvar o arquivo, se você estiver usando editores mais simples. No VS Code podemos apertar em &lt;em&gt;“Accept both changes”&lt;/em&gt; e continuar com os comandos a seguir. Após aceitar todas as mudanças, manualmente ou usando os botões no VS Code, você deve ter um arquivo assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/resolucao-de-conflito-git/resolucao-de-conflito-fig-8.webp&quot; alt=&quot;imagem mostrando o resultado esperado de aceitar ambos blocos de alterações&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Lembre-se de salvar o arquivo. Em seguida volte para o terminal, se você rodar o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt; vai ver que o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; se mostra com alterações.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/resolucao-de-conflito-git/resolucao-de-conflito-fig-9.webp&quot; alt=&quot;imagem mostrando resultado do comando git status com o arquivo readme.md apresentando alterações&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora você pode adicionar esse arquivo em staging com o seguinte comando:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git add README.md
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E fazer o commit das alterações da forma que preferir. Note que ao fazer o commit, se você usar editores para escrever a mensagem de commit, é possível que essa mensagem já venha pré-preenchida como na imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/resolucao-de-conflito-git/resolucao-de-conflito-fig-10.webp&quot; alt=&quot;imagem mostrando a mensagem de commit pré-preenchida pelo editor vim&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Você pode personalizar a mensagem ou deixá-la como está e, ao terminar de fazer o commit, enviar essas alterações para o GitHub com um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git push&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/resolucao-de-conflito-git/resolucao-de-conflito-fig-11.webp&quot; alt=&quot;imagem mostrando o envio das alterações para o github&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora se você recarregar a página do pull request deverá ver que o conflito foi resolvido, observe:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/resolucao-de-conflito-git/resolucao-de-conflito-fig-12.webp&quot; alt=&quot;Imagem mostrando o PR que antes apresentava conflito agora com o conflito resolvido&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E podemos finalmente dar merge neste pull request! Vitória! 🎉🎉&lt;/p&gt;

&lt;h2 id=&quot;conclusão&quot;&gt;Conclusão&lt;a name=&quot;conclusao&quot;&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Você agora entende como os conflitos se formam e também sabe todos os passos envolvidos em resolver conflitos.&lt;/p&gt;

&lt;p&gt;Aqui está a lista simples de todos os comandos e passos para resolver conflitos, lembre de substituir as notações &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;&amp;gt;&lt;/code&gt; de acordo:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git checkout &amp;lt;nome do branch com conflito&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git pull origin main&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;abra o arquivo com conflito e os resolva&lt;/li&gt;
  &lt;li&gt;salve o arquivo&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git add &amp;lt;nome do arquivo alterado&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git commit&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git push&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Espero que esse artigo te ajude a resolver os conflitos de git que você encontrar daqui pra frente. 😉&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;leitura-extra&quot;&gt;Leitura extra&lt;/h2&gt;

&lt;p&gt;Seguem mais umas dicas de documentações em português para você aprender sobre resolução de conflitos no git&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gitfichas.com&quot;&gt;O diretório de fichas de estudo sobre git GitFichas&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.github.com/pt/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/about-merge-conflicts&quot;&gt;A documentação do GitHub sobre resolução de conflitos&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.atlassian.com/br/git/tutorials/using-branches/merge-conflicts&quot;&gt;O tutorial da Atlassian também sobre resolução de conflitos&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Fri, 24 Dec 2021 20:55:59 +0000</pubDate>
        <link>https://jtemporal.com/resolvendo-conflitos/</link>
        <guid isPermaLink="true">https://jtemporal.com/resolvendo-conflitos/</guid>
        
        <category>git</category>
        
        <category>tutorial</category>
        
        <category>português</category>
        
        <category>portugues</category>
        
        
      </item>
    
      <item>
        <title>Criando pastas vazias no git com o .gitkeep</title>
        <description>&lt;p&gt;Às vezes você precisa colocar uma pasta vazia no seu projeto no GitHub, mas tradicionalmente o git não faz acompanhamento de pastas vazias, e aí cai a dúvida: &lt;em&gt;“como fazer uma pasta vazia aparecer no GitHub se o git não deixa?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Não se preocupe, nessa colinha você vai ver como fazer isso usando um arquivo especial chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitkeep&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Isso aconteceu comigo há alguns anos no projeto que eu trabalhava: uma das ferramentas &lt;em&gt;open-source&lt;/em&gt; dependia da existência de uma pasta para fazer o download de dados de exemplo e o time decidiu que colocar uma conferência da existência da pasta ou criação dela no nosso código seria um exagero. Uma forma que vimos para garantir a existência da pasta foi usando o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitkeep&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ao colocar este arquivo numa pasta vazia, ele garante que o git vá adicionar essa pasta no seu sistema de versionamento e por ser um arquivo oculto, ele facilita a manutenção da estrutura de pastas sem atrapalhar o uso da pasta para outros fins.&lt;/p&gt;

&lt;p&gt;Na imagem abaixo você vê um projeto chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exemplo-pastas&lt;/code&gt; que já possui um arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; que já foi commitado e sem alterações acompanhadas pelo git, em seguida eu crio uma nova pasta chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;diretorio1&lt;/code&gt; e ao fazer novamente o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt; o git segue informando que não há mudanças no projeto.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/gitkeep-exemplo-fig-1.webp&quot; alt=&quot;exemplo 1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora se criarmos o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitkeep&lt;/code&gt; dentro do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;diretorio1&lt;/code&gt; o git mostra que há a existência de um diretório a ser adicionado, veja:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/gitkeep-exemplo-fig-2.webp&quot; alt=&quot;exemplo 2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Com isso você consegue ver o funcionamento do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitkeep&lt;/code&gt; e caso queira ver na prática esse exemplo está disponível &lt;a href=&quot;https://github.com/jtemporal/exemplo-pastas&quot;&gt;nesse repositório do GitHub&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Fri, 24 Dec 2021 14:34:20 +0000</pubDate>
        <link>https://jtemporal.com/criando-pastas-vazias-no-github-com-o-gitkeep/</link>
        <guid isPermaLink="true">https://jtemporal.com/criando-pastas-vazias-no-github-com-o-gitkeep/</guid>
        
        <category>git</category>
        
        <category>português</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>Creating empty folders in git with .gitkeep</title>
        <description>&lt;p&gt;Sometimes you need to put an empty folder in your project on GitHub, but traditionally git doesn’t track empty folders, and then the question pops up: &lt;em&gt;“how to make an empty folder appear on GitHub if git doesn’t allow it?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Don’t worry about it, you’ll see on this pro tip how to do it using a special file called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitkeep&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This happened to me a few years ago on the project I was working on: one of the open-source tools depended on the existence of a folder to download sample data and the team decided that putting a check on the folder’s existence or its creation in our code would be an overkill. One way we found to ensure the folder’s existence was using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitkeep&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;By placing this file in an empty folder, it ensures that git will add this folder to your versioning system and because it is a hidden file, it makes it easier to maintain the folder structure without getting in the way of using the folder for other purposes.&lt;/p&gt;

&lt;p&gt;In the image below you have a project called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exemplo-pastas&lt;/code&gt; that already has a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; file that has already been committed and there are no changes tracked by git, then I create a new folder called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;diretorio1&lt;/code&gt; and when running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git status&lt;/code&gt; again git continues to inform that there are no changes to the project.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/gitkeep-exemplo-fig-1.webp&quot; alt=&quot;exemplo 1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now if we create the file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitkeep&lt;/code&gt; inside &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;diretorio1&lt;/code&gt;, git shows that there is a directory to be added, see:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/gitkeep-exemplo-fig-2.webp&quot; alt=&quot;exemplo 2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;With this you can see how &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitkeep&lt;/code&gt; works and if you want to see it in practice, &lt;a href=&quot;https://github.com/jtemporal/exemplo-pastas&quot;&gt;this example is available in this GitHub repository&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Fri, 24 Dec 2021 14:34:20 +0000</pubDate>
        <link>https://jtemporal.com/creating-empty-folders-on-github-with-gitkeep/</link>
        <guid isPermaLink="true">https://jtemporal.com/creating-empty-folders-on-github-with-gitkeep/</guid>
        
        <category>git</category>
        
        <category>english</category>
        
        <category>pro tip</category>
        
        
      </item>
    
      <item>
        <title>Viajando Por o Uma API Segura com Flask</title>
        <description>&lt;p&gt;Palestra na Python Brasil 2021.&lt;/p&gt;

&lt;p&gt;Venha ver como usar Python para construir um mapa para mostrar por onde você andou, colocar esse mapa no ar e, de quebra, aprender a proteger sua API escrita em Flask.&lt;/p&gt;

&lt;p&gt;Os slides &lt;a href=&quot;https://slides.com/jtemporal/api-segura-pybr2021&quot;&gt;estão disponíveis aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Assista o replay aqui em baixo 👇&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;415&quot; src=&quot;https://www.youtube.com/embed/YmyZaQQVpec&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Tue, 12 Oct 2021 19:40:00 +0000</pubDate>
        <link>https://jtemporal.com/viajando-por-o-uma-api-segura-com-flask/</link>
        <guid isPermaLink="true">https://jtemporal.com/viajando-por-o-uma-api-segura-com-flask/</guid>
        
        <category>português</category>
        
        <category>portugues</category>
        
        <category>ptbr</category>
        
        
      </item>
    
      <item>
        <title>5 Tips to Make Your Pull Request Shine ✨</title>
        <description>&lt;p&gt;October is hacktoberfest month and this should be the month where we put the most effort into contributing to open-source and helping more people contribute. So in this article you will learn five 5 golden tips to make your pull request ✨shine ✨. Let’s go!&lt;/p&gt;

&lt;h2 id=&quot;follow-the-projects-contribution-guide&quot;&gt;Follow the project’s contribution guide&lt;/h2&gt;

&lt;p&gt;A maioria dos projetos &lt;em&gt;open-source&lt;/em&gt; tem um conjunto de regras ou padrões que você deve seguir para contribuir, coisas como manter cobertura de testes, criar &lt;em&gt;branches&lt;/em&gt; seguindo um certo padrão de nomeação, qual a língua oficial do projeto e de seus &lt;em&gt;commits&lt;/em&gt; e até mesmo regras sobre intervalo de tempo com inatividade no qual passado esse períodos o &lt;em&gt;pull requests&lt;/em&gt; sem atividade será fechado.&lt;/p&gt;

&lt;p&gt;Following the project’s contribution guide will ensure a good path to having a successful pull request right from the start. Such guide is usually found in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONTRIBUTING.md&lt;/code&gt; file on GitHub projects but sometimes the rules can also be described in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Now you might be asking yourself &lt;em&gt;“What do I do if the project doesn’t have a contribution guide?”&lt;/em&gt; and this situation is quite common. So if there is no contribution guide what I usually do is look at some commits from the commit history to see how they are made and other pull requests that were made before mine to try to follow the same format.&lt;/p&gt;

&lt;h2 id=&quot;use-branches-in-your-fork&quot;&gt;Use branches in your fork&lt;/h2&gt;

&lt;p&gt;When forking a project to make a contribution, it is very common to make the mistake of making changes to the main branch and submitting the pull request.&lt;/p&gt;

&lt;p&gt;Avoid doing that.&lt;/p&gt;

&lt;p&gt;As much as you only plan on making just one pull request, you may be struck by inspiration and you may want to make a second pull request and then you’ve already compromised your main branch with changes from the first pull request, and any contribution from that point forward will contain the changes from the first pull request.&lt;/p&gt;

&lt;p&gt;It is ideal to keep the main branch clean of changes this way you can keep it up to date with the main branch of the source repository. So make a good habit of separating your contributions into new branches.&lt;/p&gt;

&lt;h2 id=&quot;link-the-pull-request-to-an-issue&quot;&gt;Link the pull request to an issue&lt;/h2&gt;

&lt;p&gt;There are now, 9 keywords to link your pull request to an issue (if one exists). That’s right, nine! Using these words when making the pull request will make the life of those who maintain the project easier, since these words close the corresponding issue when the pull request is merged, and will also help people who are interested in contributing as they can see the pull request in progress, preventing two people from doing duplicate work.&lt;/p&gt;

&lt;p&gt;This is the list of words:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;close&lt;/li&gt;
  &lt;li&gt;closes&lt;/li&gt;
  &lt;li&gt;closed&lt;/li&gt;
  &lt;li&gt;fix&lt;/li&gt;
  &lt;li&gt;fixes&lt;/li&gt;
  &lt;li&gt;fixed&lt;/li&gt;
  &lt;li&gt;resolver&lt;/li&gt;
  &lt;li&gt;resolve&lt;/li&gt;
  &lt;li&gt;resolved&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Any of these words can be used in two places:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;In the pull request’s &lt;strong&gt;title&lt;/strong&gt;;&lt;/li&gt;
  &lt;li&gt;In the pull request’s &lt;strong&gt;description&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You should use them as follows to resolve an issue:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;fixes #42
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or as follows to resolve more than one issue:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;fixes #42, fixes #44
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If your pull request does not &lt;em&gt;fully&lt;/em&gt; resolve an issue, you should still &lt;em&gt;mention&lt;/em&gt; the issue number (by using the hashtag symbol) that is related to your pull request as this will make your pull request appear in the issue as a mention, but in this case you should not use the words above.&lt;/p&gt;

&lt;p&gt;As a person who maintains some projects, it makes me very happy to see these words being used in pull requests. You can read more about all of this &lt;a href=&quot;https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue&quot;&gt;in GitHub’s documentation on the subject&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;give-context-to-reviewers&quot;&gt;Give context to reviewers&lt;/h2&gt;

&lt;p&gt;Often people who maintain projects, as well as people who contribute to projects, do so in their spare time, that’s not their job. So it’s our duty to facilitate the contribution, both by writing well-described issues if you’re reporting a bug for example, and by well-describing the pull request you’re making. Let’s focus on the pull request that is the main topic of this article.&lt;/p&gt;

&lt;p&gt;Nowadays it is very common to find projects that have a &lt;a href=&quot;https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository&quot;&gt;pull request template/model&lt;/a&gt;, this template seeks to standardize the questions needed to review that pull request and generate changelogs. So focus on what you need to fill in and remember that you can use markdown to style the content of the description and make it easier for people reviewing contributions to read.&lt;/p&gt;

&lt;p&gt;Although nowadays many repositories have pull request templates, it could be the case that you are contributing to a project that doesn’t have one of these, so here is a list of topics for you to include in your pull request description:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;What is the goal of this pull request?&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Here you put that information of which issue (if it exists) is related to this pull request.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;What changes were made to achieve this goal?&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Code changes, documentation, data flow changes, and alike should come here. Use your commits to remember what you changed.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;How to test if these changes really work?&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Here you can use prints if it’s something visual, for example, or examples of using the new piece of code.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Possible improvements and other notes&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;A list of things that could be improved, but that are not the focus of the pull request, or that you don’t know how to solve and need help.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These four points will ensure that the person reviewing will have most if not all the information they need to review the pull request at the time the review takes place.&lt;/p&gt;

&lt;h2 id=&quot;wait-for-suggestions&quot;&gt;Wait for suggestions&lt;/h2&gt;

&lt;p&gt;After making your contribution, the reviewer may have suggestions for improvement or necessary adjustments to ensure the standardization of the code base. These suggestions might ask you to change part of the code, implement tests, or adjust the documentation.&lt;/p&gt;

&lt;p&gt;Generally speaking, they come to help your pull request improve and to get your contribution accepted. The review process is always a learning moment, so it is important to have an open mind to receive suggestions and, if necessary, accept them.&lt;/p&gt;

&lt;h2 id=&quot;recap&quot;&gt;Recap&lt;/h2&gt;

&lt;p&gt;Contributing to open-source is great because it can help all the people who use that project. And during hacktoberfest, for example, is a great time to exercise this skill, so be sure to follow the tips you’ve seen here to be even more successful with your pull requests.&lt;/p&gt;
</description>
        <pubDate>Wed, 06 Oct 2021 01:15:06 +0000</pubDate>
        <link>https://jtemporal.com/5-tips-to-make-your-pull-request-shine/</link>
        <guid isPermaLink="true">https://jtemporal.com/5-tips-to-make-your-pull-request-shine/</guid>
        
        <category>english</category>
        
        <category>pull request</category>
        
        <category>git</category>
        
        <category>open source</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        
      </item>
    
      <item>
        <title>5 Dicas Para Fazer o Seu Pull Request Brilhar ✨</title>
        <description>&lt;p&gt;Outubro é mês de hacktoberfest e esse deve ser o mês em que nós nos esforçamos mais para contribuir com &lt;em&gt;open-source&lt;/em&gt; e ajudar a mais pessoas contribuírem. Então nesse artigo você vai aprender cinco 5 dicas de ouro para fazer o seu &lt;em&gt;pull request&lt;/em&gt; ✨ brilhar ✨. Vamos lá!&lt;/p&gt;

&lt;h2 id=&quot;siga-o-guia-de-contribuição-do-projeto&quot;&gt;Siga o guia de contribuição do projeto&lt;/h2&gt;

&lt;p&gt;A maioria dos projetos &lt;em&gt;open-source&lt;/em&gt; tem um conjunto de regras ou padrões que você deve seguir para contribuir, coisas como manter cobertura de testes, criar &lt;em&gt;branches&lt;/em&gt; seguindo um certo padrão de nomeação, qual a língua oficial do projeto e de seus &lt;em&gt;commits&lt;/em&gt; e até mesmo regras sobre intervalo de tempo com inatividade no qual passado esse períodos o &lt;em&gt;pull requests&lt;/em&gt; sem atividade será fechado.&lt;/p&gt;

&lt;p&gt;Seguir o guia do projeto vai garantir um bom caminho para ter um &lt;em&gt;pull request&lt;/em&gt; bem sucedido logo do começo, esse guia é geralmente encontrado no arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONTRIBUTING.md&lt;/code&gt; nos projetos do GitHub mas por vezes as regras também podem estar descritas no arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora você pode estar se perguntando &lt;em&gt;“O que eu faço se o projeto não tiver um guia de contribuição?”&lt;/em&gt; e essa situação é bem comum. Então caso não exista um guia de contribuição o que eu faço geralmente é olhar alguns commits do histórico de commits para ver como eles são feitos e outros pull requests que foram feitos antes do meu para tentar seguir o mesmo formato.&lt;/p&gt;

&lt;h2 id=&quot;use-branches-no-seu-fork&quot;&gt;Use branches no seu fork&lt;/h2&gt;

&lt;p&gt;Ao fazer um &lt;em&gt;fork&lt;/em&gt; de um projeto para contribuir, é muito comum cairmos no erro de fazer alterações no &lt;em&gt;branch&lt;/em&gt; principal e submeter o &lt;em&gt;pull request&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Evite.&lt;/p&gt;

&lt;p&gt;Por mais que você só planeje fazer apenas um &lt;em&gt;pull request&lt;/em&gt;, pode ser que a inspiração role e você queira fazer um segundo &lt;em&gt;pull request&lt;/em&gt; e aí você já comprometeu o seu branch principal com alterações do primeiro &lt;em&gt;pull request&lt;/em&gt; e, qualquer contribuição a partir desse ponto vai conter as alterações do primeiro &lt;em&gt;pull request&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Então o ideal é manter o branch principal limpo de alterações até para que você possa mantê-lo atualizado com o &lt;em&gt;branch&lt;/em&gt; principal do repositório de origem. Então crie o bom hábito de separar suas contribuições em branches novas.&lt;/p&gt;

&lt;h2 id=&quot;relacione-o-pull-request-com-uma-issue&quot;&gt;Relacione o pull request com uma issue&lt;/h2&gt;

&lt;p&gt;Existem hoje 9 palavras-chave para relacionar o seu &lt;em&gt;pull request&lt;/em&gt; com uma &lt;em&gt;issue&lt;/em&gt; (se ela existir). Isso mesmo, nove! Usar essas palavras ao fazer o &lt;em&gt;pull request&lt;/em&gt; vai facilitar a vida de quem mantém o projeto, pois essas palavras fecham a issue correspondente ao rolar o merge do &lt;em&gt;pull request&lt;/em&gt;, e também vai ajudar pessoas que estejam interessadas em contribuir pois elas podem ver o &lt;em&gt;pull request&lt;/em&gt; em andamento evitando que duas pessoas façam trabalho duplicado.&lt;/p&gt;

&lt;p&gt;Então essa é a lista de palavras:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;close&lt;/li&gt;
  &lt;li&gt;closes&lt;/li&gt;
  &lt;li&gt;closed&lt;/li&gt;
  &lt;li&gt;fix&lt;/li&gt;
  &lt;li&gt;fixes&lt;/li&gt;
  &lt;li&gt;fixed&lt;/li&gt;
  &lt;li&gt;resolver&lt;/li&gt;
  &lt;li&gt;resolve&lt;/li&gt;
  &lt;li&gt;resolved&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Essas palavras podem ser usadas em dois lugares:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;No &lt;strong&gt;título&lt;/strong&gt; do &lt;em&gt;pull request&lt;/em&gt;;&lt;/li&gt;
  &lt;li&gt;Ou na &lt;strong&gt;descrição&lt;/strong&gt; do &lt;em&gt;pull request&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Você deve usá-las da seguinte forma para resolver uma &lt;em&gt;issue&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;fixes #42
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ou da forma a seguir para resolver mais de um &lt;em&gt;issue&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;fixes #42, fixes #44
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Caso o seu &lt;em&gt;pull request&lt;/em&gt;, não resolva uma issue por completo, você ainda deve mencionar o número da issue que tem relação com o seu &lt;em&gt;pull request&lt;/em&gt; pois isso vai fazer que o seu &lt;em&gt;pull request&lt;/em&gt; apareça na issue como uma menção, mas nesse caso não deve usar as palavras acima.&lt;/p&gt;

&lt;p&gt;Como uma pessoa que mantem alguns projetos, me faz muito feliz ver essas palavras sendo usadas nos &lt;em&gt;pull requests&lt;/em&gt;. Você pode ler mais sobre isso &lt;a href=&quot;https://docs.github.com/pt/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#about-linked-issues-and-pull-requests0&quot;&gt;nessa documentação do próprio GitHub sobre o assunto&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;dê-contexto-para-quem-vai-revisar&quot;&gt;Dê contexto para quem vai revisar&lt;/h2&gt;

&lt;p&gt;Muitas vezes as pessoas que mantêm projetos, assim como as pessoas que contribuem com projetos, fazem isso no seu tempo livre, ou seja, esse não é o trabalho delas. Então é nosso dever facilitar a contribuição, tanto ao escrever issues bem descritas se você estiver relatando um &lt;em&gt;bug&lt;/em&gt; por exemplo, como descrever bem o &lt;em&gt;pull request&lt;/em&gt; que você está fazendo. Vamos focar no &lt;em&gt;pull request&lt;/em&gt; que é o foco deste artigo.&lt;/p&gt;

&lt;p&gt;Hoje em dia é muito comum encontrar projetos que tenham um &lt;a href=&quot;https://docs.github.com/pt/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository&quot;&gt;template/modelo de &lt;em&gt;pull request&lt;/em&gt;&lt;/a&gt;, esse template busca padronizar as perguntas necessárias para a revisão daquele &lt;em&gt;pull request&lt;/em&gt; e a geração de &lt;em&gt;changelogs&lt;/em&gt;. Então foque no que você precisa preencher e lembre-se que é possível usar o &lt;em&gt;markdown&lt;/em&gt; para estilizar o conteúdo da descrição e facilitar a leitura das pessoas que revisam as contribuições.&lt;/p&gt;

&lt;p&gt;Embora hoje em dia vários repositórios tenham templates de &lt;em&gt;pull request&lt;/em&gt;, pode ser que você está contribuindo para um projeto que não tem um desses, então aqui vai um lista de tópicos para você incluir na descrição do seu &lt;em&gt;pull request:&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Qual o objetivo desse pull request?&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Aqui coloque aquela informação de qual &lt;em&gt;issue&lt;/em&gt; (se ela existir) se relaciona com esse &lt;em&gt;pull request&lt;/em&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Quais alterações foram feitas para atingir esse objetivo?&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Alterações de código, documentação, mudanças de fluxo de dados e afins devem vir aqui. Use os seus &lt;em&gt;commits&lt;/em&gt; para relembrar o que você mudou.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Como testar se essas mudanças realmente funcionam?&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Aqui pode usar prints se for algo visual, por exemplo, ou exemplos de uso do pedaço de código novo.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Possíveis melhorias e outras anotações&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Uma lista de coisas que poderiam ser melhoradas, mas que não são o foco do &lt;em&gt;pull request&lt;/em&gt;, ou que você não sabe como resolver e precisa de ajuda.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esses quatro pontos, vão garantir que a pessoa revisando vai ter todas informações que ela precisa para revisar o &lt;em&gt;pull request&lt;/em&gt; no momento que a revisão for acontecer.&lt;/p&gt;

&lt;h2 id=&quot;aguarde-as-sugestões&quot;&gt;Aguarde as sugestões&lt;/h2&gt;

&lt;p&gt;Depois de fazer a sua contribuição a pessoa revisora pode ter sugestões de melhoria ou ajustes necessários para garantir a padronização da base de código. Essas sugestões podem pedir que você mude parte de código, implemente testes ou ajuste a documentação.&lt;/p&gt;

&lt;p&gt;De um modo geral elas vêm para ajudar o seu &lt;em&gt;pull request&lt;/em&gt; melhorar e para que a sua contribuição seja aceita. O processo de revisão é sempre um momento de aprendizado então é importante ter a mente aberta para receber sugestões e caso necessário acatá-las.&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Contribuir com &lt;em&gt;open-source&lt;/em&gt; é ótimo pois pode ajudar todas as pessoas que usam aquele projeto. E durante o hacktoberfest, por exemplo, é um ótimo momento para exercitar essa habilidade, então não deixe de seguir as dicas que você viu aqui para ter ainda mais sucesso no seus &lt;em&gt;pull requests.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ah e último recadinho, se você estiver procurando por &lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2021/&quot;&gt;projetos brasileiros para contribuir aqui está a lista de 2021&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Wed, 06 Oct 2021 01:15:06 +0000</pubDate>
        <link>https://jtemporal.com/5-dicas-para-fazer-o-seu-pull-request-brilhar/</link>
        <guid isPermaLink="true">https://jtemporal.com/5-dicas-para-fazer-o-seu-pull-request-brilhar/</guid>
        
        <category>pull request</category>
        
        <category>git</category>
        
        <category>open source</category>
        
        <category>open-source</category>
        
        <category>contribuição</category>
        
        <category>hacktoberfest2021</category>
        
        <category>hacktoberfest</category>
        
        <category>portugues</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Projetos Brasileiros para fazer pull requests nesse #Hacktoberfest 2021</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/projetos-br-hacktoberfest-2025/&quot;&gt;Edição atual da lista disponível aqui&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Outubro chegou e com ele chegou o #Hacktoberfest, todo ano tenho feito (às vezes com ajuda das amizades valeu demais &lt;a href=&quot;https://twitter.com/anaschwendler&quot;&gt;@anaschwendler&lt;/a&gt;) a lista para que você possa contribuir durante o #Hacktoberfest.&lt;/p&gt;

&lt;p&gt;E é chegado o momento da lista para esse ano! Então aqui vai! Uma lista toda repleta de projetos pra você contribuir nesse mês de Outubro!&lt;/p&gt;

&lt;h2 id=&quot;edições-anteriores&quot;&gt;Edições anteriores&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/nossa-coletividad/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-4dc9b9b576c0&quot;&gt;2017&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/@jessicatemporal/projetos-brasileiros-para-contribuir-nesse-hacktoberfest-vers%C3%A3o-2018-4925959b9411&quot;&gt;2018&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-o-retorno/&quot;&gt;2019&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2020/&quot;&gt;2020&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;regras-para-entrar-nessa-lista&quot;&gt;Regras para entrar nessa lista&lt;/h2&gt;

&lt;p&gt;As regrinhas do ano passado se repetem:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ser um projeto criado/desenvolvido/mantido por brasileiras(os);&lt;/li&gt;
  &lt;li&gt;Precisa ser um &lt;strong&gt;projeto&lt;/strong&gt;, não pode ser uma organização, caso tenha mais de um projeto da organização precisa ser um PR por projeto com uma entrada por projeto&lt;/li&gt;
  &lt;li&gt;Ter pelo menos uma &lt;em&gt;issue&lt;/em&gt; aberta.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;avisos-para-2021&quot;&gt;Avisos para 2021&lt;/h2&gt;

&lt;p&gt;Assim como 2020 não foi fácil, 2021 também trouxe seus desafios, então é sempre bom lembrar que para apenas contribuir com o que pode! 😉&lt;/p&gt;

&lt;p&gt;Esse ano vamos manter a mesma forma de aumentar essa lista com mais projetos, como sempre, apenas abrindo um PR com o projeto. &lt;a href=&quot;https://jtemporal.com/adicionando-um-novo-projeto-na-lista-da-hacktoberfest-2019/&quot;&gt;As instruções de como adicionar projetos tão aqui&lt;/a&gt;. Todo mundo segue apenas ganhando &amp;lt;3.&lt;/p&gt;

&lt;p&gt;Os projetos continuam separados pela linguagem principal pra facilitar as buscas pra quem lê e também em ordem alfabética pela linguagem. 😉&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ATUALIZAÇÃO IMPORTANTE:&lt;/em&gt;&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://media.giphy.com/media/26CaM3Ei5kTjWLg9a/giphy.gif&quot; alt=&quot;Gif com a Dua Lipa no vídeo de sua música New Rules&apos;&quot; /&gt;
&lt;br /&gt;
&lt;small&gt;&lt;i&gt;&quot;Acorda menina! Olha as novas regras! New Rules!&quot; - Ana Maria Braga&lt;/i&gt;&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;O mais importante desse ano é que se você submeter dois PRs inválidos você sofrerá uma &lt;strong&gt;desqualificação por período indeterminado&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Para um PR ser considerado inválido, ele deve ser marcado com as &lt;em&gt;tags&lt;/em&gt; &lt;strong&gt;spam&lt;/strong&gt; ou &lt;strong&gt;invalid&lt;/strong&gt;. Então é bom tentar fazer PRs de qualidade!&lt;/p&gt;

&lt;p&gt;Relembrando que para tornar seu PR válido para a hacktoberfest você precisa ter algumas coisas. PRs apenas contarão se:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;O repositório onde o PR foi aberto tem um tópico chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hacktoberfest&lt;/code&gt; (esse site aqui tem esse tópico então qualquer PR não invalido já vai contar para o evento 😉)&lt;/li&gt;
&lt;/ol&gt;

&lt;center&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/4131432/94991921-abbd5280-0586-11eb-98a7-5e0c976aeebf.png&quot; alt=&quot;Imagem de repositório com o tópico hacktoberfest&quot; /&gt;
&lt;br /&gt;
&lt;/center&gt;

&lt;ol&gt;
  &lt;li&gt;O PR foi aberto em Outubro&lt;/li&gt;
  &lt;li&gt;OU o PR é adicionado (merged) ao projeto OU está com o rótulo (label) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hacktoberfest-accepted&lt;/code&gt; por um mantenedor OU o PR foi aprovado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mais informações no &lt;a href=&quot;https://hacktoberfest.digitalocean.com&quot;&gt;site oficial (em inglês)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por último, nesse outro artigo tem &lt;a href=&quot;https://jtemporal.com/5-dicas-para-fazer-o-seu-pull-request-brilhar/&quot;&gt;5 Dicas Para Fazer o Seu Pull Request Brilhar ✨&lt;/a&gt; e pode ser útil.&lt;/p&gt;

&lt;p&gt;Happy Hacking! 🎉&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt; C# &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/afucher/Inquirer&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3756185?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;afucher/Inquirer&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A collection of common interactive command line user interfaces in C#.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alexsandro-xpt/ErysDownloader&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/845657?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alexsandro-xpt/ErysDownloader&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ErysDownloader, a frenetic and optimizate downloader library. Pure C# lightweight HTTP GET verb library for text/html content-type. No dependece.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/code-cracker/code-cracker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/9695920?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;code-cracker/code-cracker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An analyzer library for C# and VB that uses Roslyn to produce refactorings, code analysis, and other niceties.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; C &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cmatsuoka/libxmp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/317355?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cmatsuoka/libxmp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Libxmp is a library that renders module files to PCM data.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/hardinfo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/hardinfo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;System profiler and benchmark tool for Linux systems&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/lwan&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/lwan&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Experimental, scalable, high performance HTTP server&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; CSS &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/milligram/milligram&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16243913?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;milligram/milligram&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A minimalist CSS framework.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Clojure &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mauricioszabo/atom-chlorine&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/138037?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mauricioszabo/atom-chlorine&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; An Atom plugin to integrate with Socket-REPL over Clojure and ClojureScript&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; C++ &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/OtacilioN/Brasilino&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10578275?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;OtacilioN/Brasilino&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Uma biblioteca que permite programar em linguagem Arduino utilizando comandos facilitados em PT-BR.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/vinipsmaker/tufao&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/865914?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;vinipsmaker/tufao&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An asynchronous web framework for C++ built on top of Qt&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Elixir &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/philss/floki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/381213?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;philss/floki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Floki is a simple HTML parser that enables search for nodes using CSS selectors.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Go &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/OsProgramadores/op-website-hugo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/25752535?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;OsProgramadores/op-website-hugo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto do Site&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/avelino/awesome-go&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/31996?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;avelino/awesome-go&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A curated list of awesome Go frameworks, libraries and software &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gofn/gofn&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/25033801?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gofn/gofn&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Function process via docker provider (serverless minimalist)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/goreleaser/goreleaser&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24697112?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;goreleaser/goreleaser&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Deliver Go binaries as fast and easily as possible&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jonatasbaldin/ignore&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/8570364?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jonatasbaldin/ignore&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Download .gitignore files from the GitHub gitignore repository!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/larien/learn-go-with-tests&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/29347337?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;larien/learn-go-with-tests&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tradução do livro de @quii sobre aprender Go com desenvolvimento orientado a testes&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/robertoduessmann/weather-api&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/9089383?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;robertoduessmann/weather-api&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A RESTful API to check the weather&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rodrigo-brito/gocity&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/44341229?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rodrigo-brito/gocity&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Code City metaphor for visualizing Go source code in 3D&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rumlang/rum&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/33993589?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rumlang/rum&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Functional language, easily extensible and possible (Lua features with LISP syntax and functional) to be embarked on software Go!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; JavaScript &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/Coderockr/vitrine-social&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/846756?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Coderockr/vitrine-social&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O classificado de doações&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/MinisterioPublicoRJ/inloco&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/27096918?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;MinisterioPublicoRJ/inloco&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A Geographic Information System (GIS) used by Ministério Público do Estado do Rio de Janeiro to show social, institutional and administrative data , based on React and Leaflet, interacting with a GeoServer back-end. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/RocketChat/Rocket.Chat&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12508788?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;RocketChat/Rocket.Chat&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The ultimate Free Open Source Solution for team communications.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/UFERSA-Vai-de-Bike/ufersavdbAPI&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/37310309?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;UFERSA-Vai-de-Bike/ufersavdbAPI&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API em ExpressJS que servirá de backend para o sistema UFERSA Vai de Bike&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alexanmtz/material-sense&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/88840?s=60&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alexanmtz/material-sense&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A full simple application for react material ui&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/eguatech/egua&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/54448514?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;eguatech/egua&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem de Programação Egua&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/doom-fire-algorithm&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/4248081?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/doom-fire-algorithm&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Playground for the fire effect from DOOM. Really simple algorithm and all experiments are welcome!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/video-maker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://camo.githubusercontent.com/af375984c24ab9d077a76429b3bde8035aadfcc7/68747470733a2f2f692e696d67736166652e6f72672f63622f636230646161363564662e676966&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/video-maker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto open source para fazer vídeos automatizados.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/monumentum/astronode&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/32710755?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;monumentum/astronode&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Exporting mongoose model as rest endpoints&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mvfsillva/dialetus-service&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/4579340?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mvfsillva/dialetus-service&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API to Informal dictionary for the idiomatic expressions that each Brazilian region It has&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/perfil-politico-frontend&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/perfil-politico-frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Front-end that consumes Perfil Político&apos;s API&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-FilaDaCreche&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-FilaDaCreche&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rafaelcastrocouto/foda&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/422159?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rafaelcastrocouto/foda&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;You are at FODA source code. Play now for free https://foda.app&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/origami.js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/origami.js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Powerful and Lightweight Library to create using HTML5 Canvas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/react-ape&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/react-ape&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;• [Work in Progress] React Renderer to build UI interfaces using canvas/WebGL&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/react-tv&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/react-tv&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;[Looking for maintainers] React development for TVs (Renderer for low memory applications and Packager for TVs) &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/klefki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/klefki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple substitution cipher module. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/redis-session-storage&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/redis-session-storage&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Node App Storage sessions with redis.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/simonardejr/matador-de-monstros&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3685303?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;simonardejr/matador-de-monstros&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Minigame feito em Vue&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/thamara/time-to-leave&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/846063?s=120&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;thamara/time-to-leave&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Log work hours and get notified when it&apos;s time to leave the office and start to live.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/withmoney/withmoney-mobile&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/44231290?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;withmoney/withmoney-mobile&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;This is a mobile project for financial management, with vue.js.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/yanmagale/narigajs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/5148042?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;yanmagale/narigajs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; WIP. A node module that reports about air quality in a region&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zenorocha/clipboard.js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/398893?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zenorocha/clipboard.js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Modern copy to clipboard. No Flash. Just 3kb gzipped.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zeucxb/dymock&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/11702749?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zeucxb/dymock&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A CLI to simplify the way you create dynamics mocks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Julia &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JSONWebTokens.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JSONWebTokens.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Secure your Julia APIs with JWT. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JuliaPackageWithRustDep.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JuliaPackageWithRustDep.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Example of a Julia Package with Rust dependency.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/Mongoc.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/Mongoc.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;MongoDB driver for the Julia Language &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Kotlin &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/ftwfy&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/ftwfy&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The real life Command/Ctrl + F - Android App that uses the Mobile Vision API to allow you to search for any occurrence of a text using your camera&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/lmgtfyGen&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/lmgtfyGen&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Lmgtfy Generator Open Source Android App - built to learn Kotlin, MVP architecture, Dagger and Rx&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; PHP &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PHPJasper/phpjasper&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/27956258?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PHPJasper/phpjasper&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A PHP report generator &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/RamonSilva20/mapos&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12385697?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;RamonSilva20/mapos&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Sistema de Controle de Ordens de Serviço&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/comuREDE/core&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/14811323?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;comuREDE/core&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Back e frontend com sensor autônomo / Back and frontend with standalone sensor &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/corcel/corcel&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://camo.githubusercontent.com/6cfc6b23889643f4438a4da4ab4de7398da9337f/68747470733a2f2f692e696d6775722e636f6d2f66484d717754462e706e67&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;corcel/corcel&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A collection of Model classes that allows you to get data directly from a WordPress database.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/e-cidade/e-cidade&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/7452853?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;e-cidade/e-cidade&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O e-cidade é um projeto baseado em um fork de 2014, atualizado para a última versão disponível no portal Software Público.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/laraerp/laraerp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10065592?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;laraerp/laraerp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ERP brasileiro de código fonte aberto escrito em PHP utilizando o Laravel Framework&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/openboleto/openboleto&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/33834590?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;openboleto/openboleto&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Biblioteca para geração de boletos bancários em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/paulohenriquenj/crudificator&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1184825?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;paulohenriquenj/crudificator&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Gerador de Cruds em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/portabilis/i-educar&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/721282?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;portabilis/i-educar&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Lançando o maior software livre de educação do Brasil!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Pearl &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GouveaHeitor/nipe&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/10741284?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GouveaHeitor/nipe&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Nipe is a script to make Tor Network your default gateway.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Python &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DadosAbertosDeFeira/analises&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/57175538?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DadosAbertosDeFeira/analises&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para abrigar as análises dos Dados Abertos de Feira. A coleta é feita pela Maria Quitéria.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DadosAbertosDeFeira/maria-quiteria&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/57175538?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DadosAbertosDeFeira/maria-quiteria&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um projeto para libertar dados do município de Feira de Santana.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GabrielRF/RastreioBot&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/7331540?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GabrielRF/RastreioBot&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Telegram Bot @RastreioBot &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/JVictorDias/Dinossauro-Google&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/JVictorDias/Dinossauro-Google/blob/master/preview.gif&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;JVictorDias/Dinossauro-Google&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto onde várias Redes Neurais competem para aprender a jogar o jogo do dinossauro no navegador Google Chrome.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/Liebelts/Gordura_Simulator&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/42952107?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Liebelts/Gordura_Simulator&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um jogo de gordura sendo feito no Python 3. Envie bugs e ideias.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/allisson/python-simple-rest-client&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/5202?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;allisson/python-simple-rest-client&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple REST client for python 3.5+ &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/mre&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10817238?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/maker-regular-expressions&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório de um pacote simples para fazer expressões regulares em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/python-adt-extension&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10817238?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/python-adt-extension&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python abstract data structure (ADT) extension.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/validate-docbr&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/10817238?s=60&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/validate-docbr&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Pacote Python para validação de documentos brasileiros.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anapaulagomes/pytest-picked&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1899950?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anapaulagomes/pytest-picked&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Run the tests related to the changed files (according to Git)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ayr-ton/kamu&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1090517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ayr-ton/kamu&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;You favorite book library&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/berinhard/pyp5js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/238223?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;berinhard/pyp5js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python to P5.js Transcriptor&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cobrateam/splinter&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/403905?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cobrateam/splinter&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;splinter - python test framework for web applications&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cuducos/calculadora-do-cidadao&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/4732915?s=120&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cuducos/calculadora-do-cidadao&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tool for Brazilian Reais monetary adjustment/correction&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/sentry-patrol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/sentry-patrol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Command line interface for Sentry API &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/tapioca-jarbas&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/tapioca-jarbas&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tapioca wrapper for jarbas api &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/georgeyk/loafer&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/247603?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;georgeyk/loafer&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Asynchronous message dispatcher - Currently using asyncio and amazon SQS&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gilsondev/django-rest-localflavor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/265653?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gilsondev/django-rest-localflavor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Country-specific Django helpers, to use in Django Rest Framework &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/grupyrn/jararaca&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6994159?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;grupyrn/jararaca&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;GruPy-RN Event and Check-in System&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/internetlab-br/Twitter-Bots&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/40776372?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;internetlab-br/Twitter-Bots&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos utilizados para pesquisar sobre bots em perfis do Twitter &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/italomaia/flask-empty&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/14670?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;italo-maia/flask-empty&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An empty project skeleton / boilerplate for flask projects. Powered by CookieCutter. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/autogenfiles&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6595551?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jtemporal/autogenfiles&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Automatically generate files from templates&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/caipyra&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6595551?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jtemporal/caipyra&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;import caipyra module code&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/juditecypreste/PyRoles&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/36239583?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;juditecypreste/PyRoles&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Este é um bot no Telegram que faz upload automático de todas as fotos dos rolês que rolaram durante a PyBR!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lamenezes/simple-model&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3208493?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lamenezes/simple-model&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;data handling made easy &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luanfonceca/speakerfight&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1490875?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luanfonceca/speakerfight&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The Easier way to choose the best talks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/manipuladordedados/pdiary&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1189862?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;manipuladordedados/pdiary&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A simple terminal-based diary journal application written in Python. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mari-linhares/tensorflow-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/8157164?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mari-linhares/tensorflow-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos e materiais sobre TensorFlow em Português &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/odufrn/odufrn-api-py&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/52975911?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;odufrn/odufrn-api-py&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Wrapper da API da UFRN em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/perfil-politico&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/perfil-politico&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A platform for profiling public figures in Brazilian politics&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario-toolbox&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario-toolbox&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;This project empowers people who want to process the data in the context of Querido Diário to run their own analyses&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Brazilian government gazettes, accessible to everyone&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/serenata-de-amor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/serenata-de-amor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🕵 Artificial Intelligence for social control of public administration&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/serenata-toolbox/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/serenata-toolbox&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;pip module containing code shared across Serenata de Amor&apos;s projects&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/osantana/dicteval&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/160418?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;osantana/dicteval&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Evaluate expressions in dict/json objects&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/plenario/plenario&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/30255828?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;plenario/plenario&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-API&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-API&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Editor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Editor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; Plataforma de edição de cardápios da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pyladies-brazil/br-pyladies-pelican&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/8205116?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pyladies-brazil/br-pyladies-pelican&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site PyLadies Brasil usando Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/associados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/associados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Controle de associados a Associação PythonBrasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/planet&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/planet&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repo público para atualização da lista de sites do Planet PythonBrasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/wiki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/wiki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site python.org.br estático com Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rochacbruno/dynaconf&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/rochacbruno/dynaconf/raw/master/docs/img/logo_400.svg&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rochacbruno/dynaconf&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Configuration Management for Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rougeth/bottery&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/431892?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rougeth/bottery&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A bot framework with batteries included &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/thaisviana/AlgPedia&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1753143?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;thaisviana/AlgPedia&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto Final da Thata e do Tchotcho &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Ruby &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anonydog/anonydog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24738062?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anonydog/anonydog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;On the internet, nobody knows you&apos;re a dog &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/campuscode/rails-guides-pt-BR&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/10028214?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;campuscode/guia-rails-pt-br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tradução do guia oficial de Ruby on Rails para pt-BR&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/juuh42dias/transervicos&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1828204?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;juuh42dias/transervicos&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Plataforma de empregos para pessoas Trans.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/railsgirls/guides-ptbr&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1641104?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;railsgirls/guides-ptbr&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Rails Girls Guides - Brazilian Portuguese / Tutoriais Rails Girls - Português Brasileiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Scala &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/potigol/potigol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1438144?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;potigol/potigol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem Potigol - Linguagem de programação funcional moderna para iniciantes - A Functional Programming Language for Beginners &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Shell &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/hemilioaraujo/Linux-Commands&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/28680369?s=400&amp;amp;u=547852267ebf487736da8ded44c916c53d1d37f4&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;hemilioaraujo/Linux-Commands&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um conjunto de comandos para terminal Linux.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-plataforma-curriculo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-plataforma-curriculo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Swift &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/caronae/caronae-ios&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/23268466?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;caronae/caronae-ios&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Aplicativo do Caronaê para iOS &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; TypeScript &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/Rocketseat/unform&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/Rocketseat/unform/master/.github/assets/logo.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Rocketseat/unform&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ReactJS form library to create uncontrolled form structures with nested fields, validations and much more!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brazilian-utils/brazilian-utils&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40146460?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brazilian-utils/brazilian-utils&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Utils library for specific Brazilian businesses&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/doczjs/docz&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/39714731?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;doczjs/docz&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;✍🏻It has never been so easy to document your things!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/middy-idempotent&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/middy-idempotent&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🛵 📬 ‎‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎Idempotence Middy middleware for your AWS Lambdas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/middy-recaptcha&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/middy-recaptcha&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🛵 🔐 ‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎reCAPTCHA validation Middy middleware for yours AWS Lambdas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/react-lite-youtube-embed/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/react-lite-youtube-embed&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;📺 ‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎&amp;lt; A private by default, faster and cleaner YouTube embed component for React applications /&amp;gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/querido-diario-frontend/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/querido-diario-frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório com a implementação do frontend da Plataforma de Busca do Querido Diário&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Frontend&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Website que permite à população acompanhar o cardápio das escolas públicas de São Paulo.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Variados &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/CollabCodeTech/backend-challenges&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/28174963?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;CollabCodeTech/backend-challenges&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A public list of open-source challenges from jobs around the world&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pizzadedados/pizzadedados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/40184305?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/PizzaDeDados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório do podcast Pizza de Dados - O podcast Brasileiro sobre ciência de dados&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PizzaDeDados/datascience-pizza&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40184305?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/datascience-pizza&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para juntar informações sobre materiais de estudo em análise de dados e áreas afins, empresas que trabalham com dados e dicionário de conceitos&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/VacaRoxa/gamedev4noobs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/36037965?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Vacaroxa/GameDev4Noobs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O propósito desse repositório, além de contribuir para o projeto 4noobs, é ensinar o básico do desenvolvimento de jogos para iniciantes e democratizar o conhecimento nesta área. Apresentando boas práticas e insumos para criar games incríveis.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/basedosdados/mais&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/71097635?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;basedosdados/mais&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Desenvolvimento de pacotes de acesso ao nosso datalake público em diversas linguagens (Python, R, Scala, Julia). O projeto faz parte da Base dos Dados, uma organização sem fins lucrativos com a missão e universalizar o acesso a dados de qualidade para todes.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/bellesamways/studynotes&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/38008212?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;bellesamways/studynotes&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para armazenar todas as anotações de cursos feitos para minha própria consulta ou de outros.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brasil-php/blog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/17454678?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brasil-php/blog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para agregar posts do grupo do Telegram&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/codamos/codamos.github.io/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/16601405?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;codamos/codamos.github.io&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para o site Codamos, que reune eventos, palestras, workshops etc pelo Brasil inteiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ibrahimcesar/estrutura-e-interpretacao-de-programas-de-computador-javascript&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://github.com/ibrahimcesar.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ibrahimcesar/estrutura-e-interpretacao-de-programas-de-computador-javascript&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;λ — Tradução em pt-br de &quot;Structure and Interpretation of Computer Programs — JavaScript Adaptation&quot;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jonatasbaldin/python-community-map&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/8570364?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jonatasbaldin/python-community-map&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A map full of lovely Python communities&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ocarneiro/para-entender-a-internet&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/2953926?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ocarneiro/para-entender-a-internet&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Videos e memes obrigatórios para conversas do dia-a-dia &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/react-brasil/empresas-que-usam-react-no-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16929016?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;react-brasil/empresas-que-usam-react-no-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório que mostra empresas e projetos que utilizam React no Brasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/walterfcarvalho/advpl-xlsxtocsv&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/11591494?s=460&amp;amp;u=41649eaf2caa648c59d2fcb157f573c3f210ad79&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;walterfcarvalho/advpl-xlsxtocsv&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Once the language ADVPL doen&apos;t have a tool to read xlsx files directly, I did this source to unable the user read and convert one xlsx file to an array&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/yaiks/vite-docs-pt-br&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/34862686?s=96&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;yaiks/vite-docs-pt-br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para tradução da documentação oficial do vite&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

</description>
        <pubDate>Fri, 01 Oct 2021 09:00:00 +0000</pubDate>
        <link>https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2021/</link>
        <guid isPermaLink="true">https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2021/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contribuitions</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Tips for Writing Great Technical Content</title>
        <description>&lt;p&gt;Hackmamba Content Hackathon happened in September 2021 and it started by having two days of workshops. One of them was about tips for writing technical content&lt;/p&gt;

&lt;p&gt;The slides &lt;a href=&quot;https://speakerdeck.com/jtemporal/tips-for-writing-great-technical-content&quot;&gt;are available here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And you watch it below 👇&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;415&quot; src=&quot;https://www.youtube.com/embed/wqdeJhzIYI8&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Fri, 17 Sep 2021 18:30:00 +0000</pubDate>
        <link>https://jtemporal.com/tips-for-writing-great-technical-content/</link>
        <guid isPermaLink="true">https://jtemporal.com/tips-for-writing-great-technical-content/</guid>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Braincast 423</title>
        <description>&lt;p&gt;No Braincast 423, &lt;a href=&quot;https://twitter.com/cmerigo&quot;&gt;&lt;strong&gt;Carlos Merigo&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/crisdias&quot;&gt;&lt;strong&gt;Cris Dias&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/jesstemporal&quot;&gt;&lt;strong&gt;Jessica Temporal&lt;/strong&gt;&lt;/a&gt; e &lt;a href=&quot;https://twitter.com/rla4&quot;&gt;&lt;strong&gt;Roberta Arcoverde&lt;/strong&gt;&lt;/a&gt; discutem as mudanças trazidas no mundo do trabalho com as linguagens de programação e se perguntam: aprender a programar é tão importante assim?&lt;/p&gt;

&lt;p&gt;Confira os &lt;a href=&quot;https://www.b9.com.br/shows/braincast/braincast-423-programacao-e-a-nova-alfabetizacao/&quot;&gt;detalhes no site do Braincast&lt;/a&gt; ou aperte o play ali em baixo 👇&lt;/p&gt;

&lt;iframe src=&quot;https://omny.fm/shows/braincast/programa-o-a-nova-alfabetiza-o/embed&quot; width=&quot;100%&quot; height=&quot;180px&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Wed, 08 Sep 2021 13:00:00 +0000</pubDate>
        <link>https://jtemporal.com/braincast-423/</link>
        <guid isPermaLink="true">https://jtemporal.com/braincast-423/</guid>
        
        <category>português</category>
        
        <category>portugues</category>
        
        <category>pt_br</category>
        
        <category>pt_BR</category>
        
        
      </item>
    
      <item>
        <title>Fechatag #40</title>
        <description>&lt;p&gt;Um papo com o &lt;a href=&quot;https://twitter.com/femontanha&quot;&gt;Montanha&lt;/a&gt;, onde conversamos sobre a minha carreira, como foram estudos de faculdade, minhaa migração para ciência de dados com Python, meu relacionamento com a comunidade, diversos projetos paralelos e claro um pouco também dos meus hobbies como tricô!&lt;/p&gt;

&lt;p&gt;Você confere tudo lá no canal do FechaTag ou apertando o play ali em baixo 👇&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;415&quot; src=&quot;https://www.youtube-nocookie.com/embed/M6guSKTP92U&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Mon, 30 Aug 2021 13:00:00 +0000</pubDate>
        <link>https://jtemporal.com/fechatag-40/</link>
        <guid isPermaLink="true">https://jtemporal.com/fechatag-40/</guid>
        
        <category>português</category>
        
        <category>portugues</category>
        
        <category>pt_br</category>
        
        <category>pt_BR</category>
        
        
      </item>
    
      <item>
        <title>Traveling Through a Secure API with Python and Auth0</title>
        <description>&lt;p&gt;A talk given at the first joint even from Okta and Auth0 in 2021.&lt;/p&gt;

&lt;p&gt;The slides &lt;a href=&quot;https://speakerdeck.com/jtemporal/traveling-through-a-secure-api-with-python-and-auth0&quot;&gt;are available here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Watch it below 👇&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;415&quot; src=&quot;https://www.youtube.com/embed/X1BrOOHFwGc&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

</description>
        <pubDate>Tue, 24 Aug 2021 18:30:00 +0000</pubDate>
        <link>https://jtemporal.com/traveling-through-a-secure-api-with-python-and-auth0/</link>
        <guid isPermaLink="true">https://jtemporal.com/traveling-through-a-secure-api-with-python-and-auth0/</guid>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Conheça o GitFichas!</title>
        <description>&lt;p&gt;Eu comecei um novo projeto, e decidi vir aqui te contar tudo sobre ele! 👀&lt;/p&gt;

&lt;p&gt;Há algum tempo eu tenho ajudado qualquer pessoa que precise de ajuda com Git. Pelo que tenho visto, a maioria das pessoas usa os comandos git diariamente sem necessariamente entendê-los…&lt;/p&gt;

&lt;p&gt;Isso não é um problema, principalmente se você está começando a sua jornada com versionamento, no entanto, não entender os comandos pode te levar a enrascadas com o Git (conflitos eu estou olhando pra vocês). E por mais que o Git nos ajude no processo de desenvolvimento a rastrear alterações, conflitos e &lt;em&gt;detached heads&lt;/em&gt; são coisas chatas de resolver, principalmente se você não entende o que precisa fazer não é mesmo?&lt;/p&gt;

&lt;p&gt;Com o objetivo de melhorar a vida de quem usa Git, eu comecei o &lt;a href=&quot;https://gitfichas.com/?utm_source=blog&quot;&gt;GitFichas&lt;/a&gt;. O GitFichas nada mais é do que um site que agrega fichas de estudo sobre Git, tudo em bom português e da forma mais simples possível para que qualquer pessoa possa entender melhor cada comando ou conceito.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://gitfichas.com/projects/008?utm_source=blog&quot;&gt;&lt;img src=&quot;https://res.cloudinary.com/jesstemporal/image/upload/v1642878671/gitfichas/pt/008/full_dtc6zn.jpg&quot; alt=&quot;GitFicha explicando como adicionar interativamente partes de alterações em commits com o comando git add -p&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;
&lt;i&gt;GitFicha número 008 falando sobre o git add -p&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;As fichas são imagens que explicam comandos ou conceitos que eu uso diariamente no Git e ainda trazem dicas pouco conhecidas ou utilizadas, mas que quando bem aplicadas são uma mão na roda.&lt;/p&gt;

&lt;p&gt;Toda semana sai uma ficha nova na quarta-feira.&lt;/p&gt;

&lt;p&gt;Eu publico as fichas no meu perfil no &lt;a href=&quot;http://twitter.com/jesstemporal&quot;&gt;Twitter&lt;/a&gt; e no &lt;a href=&quot;https://www.linkedin.com/in/jessicatemporal/&quot;&gt;LinkedIn&lt;/a&gt;, mas você pode aproveitar e seguir o &lt;a href=&quot;https://instagram.com/gitfichas&quot;&gt;GitFichas no Instagram&lt;/a&gt; ou se inscrever no canal do &lt;a href=&quot;https://t.me/gitfichas&quot;&gt;GitFichas no Telegram&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;E se você quiser sugerir um comando ou conceito para ver no formato de ficha, deixa o seu comentário ali em baixo ou responde esse tweet aqui 👇&lt;/p&gt;

&lt;center&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pt&quot; dir=&quot;ltr&quot;&gt;Perguntando pro meu TCC: Que comando &lt;a href=&quot;https://twitter.com/hashtag/git?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#git&lt;/a&gt; você tem dificuldade mesmo rodando ele com frequência?&lt;/p&gt;— Jessica Temporal (@jesstemporal) &lt;a href=&quot;https://twitter.com/jesstemporal/status/1419992266828091408?ref_src=twsrc%5Etfw&quot;&gt;July 27, 2021&lt;/a&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Eu to colocando os comandos que me mandam na fila para fazer fichas 😉&lt;/p&gt;
</description>
        <pubDate>Sat, 21 Aug 2021 15:44:33 +0000</pubDate>
        <link>https://jtemporal.com/conheca-o-gitfichas/</link>
        <guid isPermaLink="true">https://jtemporal.com/conheca-o-gitfichas/</guid>
        
        <category>portugues</category>
        
        <category>português</category>
        
        <category>git</category>
        
        
      </item>
    
      <item>
        <title>[Live Stream] Como Montar tua Palestra para Python Brasil</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://pbs.twimg.com/media/E7-BFLfXoAQwM_Y?format=jpg&amp;amp;name=medium&quot; alt=&quot;eu, lele portella e ceci vieira&quot; title=&quot;E7-BFLfXoAQwM_Y?format=jpg&amp;amp;name=medium&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Live no canal do PyLadies Brasil sobre como montar uma palestra para a Python Brasil.&lt;/p&gt;

&lt;p&gt;Nesse espaço eu e a &lt;a href=&quot;http://leportella.com/&quot;&gt;Leticia Portella&lt;/a&gt; demos várias dicas sobre como preparar e submeter palestras para a Python Brasil, mas as dicas podem ser usadas para qualquer evento. 😉&lt;/p&gt;

&lt;p&gt;Assista na íntegra abaixo. 👇&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;420&quot; src=&quot;https://www.youtube.com/embed/0O9hLeUJPtA&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Wed, 04 Aug 2021 18:00:00 +0000</pubDate>
        <link>https://jtemporal.com/live-stream-como-montar-tua-palestra-para-python-brasil/</link>
        <guid isPermaLink="true">https://jtemporal.com/live-stream-como-montar-tua-palestra-para-python-brasil/</guid>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>RaphaCast: Second Season</title>
        <description>&lt;p&gt;I spoke about my trajectory in technology, how I started, how the Python community is fundamental part in everything I do, and finally how I joined &lt;a href=&quot;https://auth0.com/blog/jessica-temporal-sr-developer-advocate-auth0/&quot;&gt;Auth0 to be a developer advocate&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Listen in to get to know more about me 👇&lt;/p&gt;

&lt;iframe src=&quot;https://open.spotify.com/embed/episode/3BcGfSv05EjQCGhwBc5k4G?theme=0&quot; width=&quot;100%&quot; height=&quot;232&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allow=&quot;encrypted-media&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Wed, 04 Aug 2021 13:00:00 +0000</pubDate>
        <link>https://jtemporal.com/podcast-raphacast-second-season/</link>
        <guid isPermaLink="true">https://jtemporal.com/podcast-raphacast-second-season/</guid>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Traveling through a secure API in Python</title>
        <description>&lt;p&gt;A talk given at the 2021 EuroPython.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://pbs.twimg.com/media/E7jJ1fyWYAcmeEG?format=jpg&amp;amp;name=medium&quot; alt=&quot;me speaking at europython&quot; title=&quot;E7jJ1fyWYAcmeEG?format=jpg&amp;amp;name=medium&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The slides &lt;a href=&quot;https://ep2021.europython.eu/media/conference/slides/traveling-through-a-secure-api-in-python.pdf&quot;&gt;are available here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And you can see more details &lt;a href=&quot;https://ep2021.europython.eu/talks/traveling-through-a-secure-api-in-python/&quot; title=&quot;https://ep2021.europython.eu/talks/traveling-through-a-secure-api-in-python/&quot;&gt;in the talk page&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Fri, 30 Jul 2021 13:00:00 +0000</pubDate>
        <link>https://jtemporal.com/traveling-trough-a-secure-api-in-python/</link>
        <guid isPermaLink="true">https://jtemporal.com/traveling-trough-a-secure-api-in-python/</guid>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Introdução aos Módulos de Análise de Dados</title>
        <description>&lt;p&gt;O material do tutorial &lt;a href=&quot;https://github.com/jtemporal/tutorial-modulos-data-science&quot;&gt;pode ser encontrado aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mais detalhes &lt;a href=&quot;https://2020.pythonnordeste.org/index.html#evento&quot;&gt;sobre o evento aqui&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Sat, 17 Jul 2021 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/tutorial-introducao-aos-modulos-de-analise-de-dados/</link>
        <guid isPermaLink="true">https://jtemporal.com/tutorial-introducao-aos-modulos-de-analise-de-dados/</guid>
        
        <category>portugues</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Como Lidar com JWTs em Python</title>
        <description>&lt;p&gt;Os JSON Web Tokens, ou JWTs, estão em toda a Internet. Eles podem ser usados ​​para rastrear bits de informação sobre um usuário de uma forma muito compacta ou ​​em APIs para fins de autorização. Este artigo vai mostrar o que são os JSON Web Tokens e como criar JWTs no Python usando a biblioteca JWT mais popular: &lt;a href=&quot;http://pyjwt.readthedocs.io/&quot;&gt;PyJWT&lt;/a&gt;. Você também vai descobrir como você pode assinar e verificar JWTs no Python usando algoritmos simétricos e algoritmos assimétricos.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Para continuar lendo esse artigo, clique no botão abaixo 👇&lt;/p&gt;

&lt;p&gt;&lt;br /&gt; &lt;center&gt; &lt;a href=&quot;https://auth0.com/blog/pt-how-to-handle-jwt-in-python/&quot;&gt; &lt;img src=&quot;/images/clique-aqui-para-ler.png&quot; /&gt; &lt;/a&gt; &lt;/center&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 02 Jul 2021 12:20:03 +0000</pubDate>
        <link>https://jtemporal.com/como-lidar-com-jwts-em-python/</link>
        <guid isPermaLink="true">https://jtemporal.com/como-lidar-com-jwts-em-python/</guid>
        
        <category>portugues</category>
        
        <category>jwts em python</category>
        
        <category>jwt</category>
        
        <category>json web token</category>
        
        
      </item>
    
      <item>
        <title>How to Handle JWTs in Python</title>
        <description>&lt;p&gt;JSON Web Tokens, or JWTs for short, are all over the web. They can be used to track bits of information about a user in a very compact way and can be used in APIs for authorization purposes. This post will cover what JSON Web Tokens are and how to create JWTs in Python using the most popular JWT library: &lt;a href=&quot;http://pyjwt.readthedocs.io/&quot;&gt;PyJWT&lt;/a&gt;. We are also going to see how you can sign and verify JWTs in Python using asymmetric algorithms.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;To keep reading this article, click on the button below 👇&lt;/p&gt;

&lt;p&gt;&lt;br /&gt; &lt;center&gt; &lt;a href=&quot;https://auth0.com/blog/how-to-handle-jwt-in-python/&quot;&gt; &lt;img src=&quot;/images/keep_reading.png&quot; /&gt; &lt;/a&gt; &lt;/center&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 02 Jul 2021 12:20:03 +0000</pubDate>
        <link>https://jtemporal.com/how-to-handle-jwts-in-python/</link>
        <guid isPermaLink="true">https://jtemporal.com/how-to-handle-jwts-in-python/</guid>
        
        <category>english</category>
        
        <category>jwts in python</category>
        
        
      </item>
    
      <item>
        <title>Configuring and accessing your droplet via SSH</title>
        <description>&lt;p&gt;If you read my post on &lt;a href=&quot;https://jtemporal.com/creating-vm-droplet-digital-ocean/&quot;&gt;how to create your machine on the cloud with Digital Ocean&lt;/a&gt;, now you have a brand new cloud machine, yay you! But you still need to configure the access so you can SSH into it.&lt;/p&gt;

&lt;p&gt;To configure the SSH access, you’ll have to log in to your machine using the root access for the first time. This may be a little tricky, and to do the first access, you’ll need to set up a new password because every system comes with one predefined root user and password.&lt;/p&gt;

&lt;p&gt;The first thing you need to do is access the specific droplet page by clicking on your droplet in the droplets list, and you’ll see something like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/ncXphkX.jpg&quot; alt=&quot;Droplet-Specific page&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After that, you’ll need to access the console for that droplet. The console is a terminal inside a browser window, and to access it click the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Console&lt;/code&gt; button in the header:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/myKV9Jy.jpg&quot; alt=&quot;Console circled image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then you’ll see something like the image below in a new tab of your browser:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/t9gNOKU.jpg&quot; alt=&quot;Console black image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Since I couldn’t find the default password for my droplet, here’s what I did: I clicked the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Access&lt;/code&gt; option on the left-side menu:&lt;/p&gt;

&lt;center&gt;
&lt;img style=&quot;max-width:30%;&quot; alt=&quot;access circled in red photo&quot; src=&quot;https://i.imgur.com/WU01T2H.jpg&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Once the page loads, you’ll see an option to &lt;strong&gt;Reset the root password&lt;/strong&gt; and that’s exactly what we want:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/xjFOm86.jpg&quot; alt=&quot;Reset password page&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then you must click the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Reset Root Password&lt;/code&gt;. You may be wondering, “What will happen if you click on this scary button?” and the first thing that will happen is that the droplet will restart. Second, a new root password will be created for you, and finally, the new password will be sent to you by e-mail so you can access your droplet via console. Here’s an example of said e-mail:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/WJEvlXV.jpg&quot; alt=&quot;New password received by mail&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, with that password, you can go back to the droplet page and open up the console again, and you should input the information you have. The user for root in Ubuntu is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;root&lt;/code&gt;, and the password is the one you received by e-mail. After that, you can set up the new password for the root user:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/U6Tuuj0.jpg&quot; alt=&quot;New password on the console page&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; you’ll need to find the default root user for the OS of your choosing.&lt;/p&gt;

&lt;p&gt;Now you are good to go!&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;
    &lt;img src=&quot;https://media.giphy.com/media/JykvbWfXtAHSM/source.mp4&quot; /&gt;
&lt;/center&gt;

&lt;h2 id=&quot;creating-your-own-user&quot;&gt;Creating your own user&lt;/h2&gt;

&lt;p&gt;Okay, maybe you are doing just fine using the root user, but I like my terminal a cool colorful theme. So it’s time to create a user for myself. To do this, there are a few commands.&lt;/p&gt;

&lt;p&gt;First, we need to choose your user name. For the lack of creativity, I chose &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jess&lt;/code&gt; to be my username, and you can use the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;adduser&lt;/code&gt; to create a new user:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;adduser jess
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And once you run the command, you’ll be prompted to create a password. You may optionally add some extra information for the user:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/xtBv9p7.jpg&quot; alt=&quot;Adding new user&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Once you confirm all the information is correct, you can give your user sudo powers. Sudo powers will let you install things without having to access the root user. So to do this, you need to run the following:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;usermod -aG sudo jess
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Remember to adjust the command for your username. And now you are done setting up your user account. Congratz!&lt;/p&gt;

&lt;h2 id=&quot;configuring-the-droplet-for-access-via-ssh&quot;&gt;Configuring the droplet for access via SSH&lt;/h2&gt;

&lt;p&gt;Another thing that we might want to do is to access our user profile via SSH. Now let’s see what we need to do to be able to access your user.&lt;/p&gt;

&lt;p&gt;My main goal with setting up this instance was so that I can code from my iPad. I bought an app called &lt;a href=&quot;https://www.textasticapp.com&quot;&gt;TexTastic&lt;/a&gt;, and it is a very complete app. Textastic has built-in the possibility to access via SSH, and it creates a terminal for you. I’ve been using it for quite some time, and it hasn’t failed me so far.&lt;/p&gt;

&lt;p&gt;Okay, I’m blabbing a little bit. Let’s go back to the point at hand, accessing. Since I didn’t want to generate a new SSH-key pair, I copied the SSH I used for accessing the machine as root. When you add the SSH key as an authentication method while creating the droplet, it adds the public key to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;authorized_keys&lt;/code&gt; file for the root user. To use the same key to access your user as the root user, you must copy this file to your user &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.ssh&lt;/code&gt; directory and adjust the ownership.&lt;/p&gt;

&lt;p&gt;For the next couple of commands, I will move back and forth between my user &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jess&lt;/code&gt; and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;root&lt;/code&gt; user. I’ll denote which user you should use to run the command by using parenthesis and the user name inside like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(jess)&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(root)&lt;/code&gt; before the command itself.&lt;/p&gt;

&lt;p&gt;The first thing you must do is log in as your user:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;(root) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;su jess
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And you’ll probably be prompted to input the user password, then you can create the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.ssh&lt;/code&gt; directory:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;(jess) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; ~/.ssh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After that, you should go back to the root user and copy the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;authorized_keys&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;(jess) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;su root
&lt;span class=&quot;gp&quot;&gt;(root) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cp&lt;/span&gt; ~/.ssh/authorized_keys /home/jess/.ssh/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then the final step, you must change the ownership of the file you just copied. If you don’t do this, you won’t be able to access your machine as your user.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;(root) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;chown &lt;/span&gt;jess /home/jess/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;center&gt;
    &lt;img src=&quot;https://media.giphy.com/media/5hxtIvk6VBzwkVCGN5/giphy.gif&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Go on! Have a little break 😉 You deserve it 👏&lt;/p&gt;

&lt;h2 id=&quot;configuring-your-machine-to-access-the-droplet-via-ssh&quot;&gt;Configuring your machine to access the droplet via SSH&lt;/h2&gt;

&lt;p&gt;We are close, I promise! At this point, you have everything set up access your cloud machine. So let me teach you to find the information required to run your SSH command.&lt;/p&gt;

&lt;p&gt;Once again, you need to go to the droplet-specific page. Right below the name of the droplet, you’ll see an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ipv4&lt;/code&gt; tag that contains an IP, that’s your domain:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/MKBAZlT.jpg&quot; alt=&quot;Finding the ipv4 address&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And that’s it, all you need to do is open your terminal of choice and run the command like so:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ssh jess@159.203.72.53
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And that would allow you to log right in because you set up the SSH keys and everything else.&lt;/p&gt;

&lt;h2 id=&quot;next-steps&quot;&gt;Next steps&lt;/h2&gt;

&lt;p&gt;After all that is configured, I’ll probably do some tweaks to my setup to improve the way my terminal looks. Here are some things that you might like to do as well:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Install zshell&lt;/li&gt;
  &lt;li&gt;Adjust the VIM/emacs/nano configuration&lt;/li&gt;
  &lt;li&gt;Create a new pair of SSH keys to use with GitHub from the cloud instance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it for today 😉&lt;/p&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;p&gt;And here are a link that helped me if you want to check it out.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/&quot;&gt;Post I followed to create a sudo user&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 31 May 2021 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/configuring-and-accessing-your-droplet-via-ssh/</link>
        <guid isPermaLink="true">https://jtemporal.com/configuring-and-accessing-your-droplet-via-ssh/</guid>
        
        <category>droplet</category>
        
        <category>digital ocean</category>
        
        <category>ssh</category>
        
        <category>cloud computing</category>
        
        <category>cloud</category>
        
        <category>tutorial</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Configurar e acessar sua droplet via SSH</title>
        <description>&lt;p&gt;Se você leu meu tutorial sobre &lt;a href=&quot;https://jtemporal.com/criando-a-sua-maquina-na-nuvem-com-digital-ocean/&quot;&gt;como criar sua máquina na nuvem com o Digital Ocean&lt;/a&gt;, agora você tem uma nova máquina na nuvem, yay você! Mas você ainda precisa configurar a máquina para poder acessaá-la via SSH.&lt;/p&gt;

&lt;p&gt;Para configurar o acesso SSH, você precisará fazer o login na sua máquina usando o acesso root pela primeira vez. Isso pode ser um pouco complicado, e para fazer o primeiro acesso, você precisará definir uma nova senha, pois todo sistema vem com um usuário root e senha predefinidos.&lt;/p&gt;

&lt;p&gt;A primeira coisa que você precisa fazer é acessar a página da droplet específica clicando na sua droplet na lista de droplets, e você verá algo assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/ncXphkX.jpg&quot; alt=&quot;Página específica da Droplet&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Depois disso, você precisará acessar o console para essa droplet. O console é um terminal dentro de uma janela do navegador e para acessá-lo, clique no botão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Console&lt;/code&gt; no cabeçalho:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/myKV9Jy.jpg&quot; alt=&quot;Opção console mostrado no dashboard&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then you’ll see something like the image below in a new tab of your browser:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/t9gNOKU.jpg&quot; alt=&quot;Imagem mostrando o console, terminal no navegador&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Como eu não consegui encontrar a senha padrão para o meu droplet, aqui está o que eu fiz: cliquei na opção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Acesso&lt;/code&gt; no menu da esquerda:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/WU01T2H.jpg&quot; alt=&quot;Opção de Access no menu a esquerda&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Uma vez que a página carregar, você verá uma opção “&lt;em&gt;Reset the root password”&lt;/em&gt; para redefinir a senha root e é exatamente o que queremos:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/xjFOm86.jpg&quot; alt=&quot;Página com a seção para resetar a senha root&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Então você deve clicar no botão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Reset Root Password&lt;/code&gt;. Você pode estar se perguntando, “O que acontecerá se você clicar neste botão assustador?” e a primeira coisa que acontecerá é que a droplet será reiniciada. Em segundo lugar, uma nova senha root será criada para você e, por fim, a nova senha será enviada para você por e-mail para que você possa acessar seu droplet via console. Aqui está um exemplo de tal e-mail:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/WJEvlXV.jpg&quot; alt=&quot;Nova senha recebida por e-mail&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora, com essa senha, você pode voltar à página da droplet e abrir o console novamente e você deve inserir as informações que você tem. O usuário para root no Ubuntu é &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;root&lt;/code&gt; e a senha é a que você recebeu por e-mail. Depois disso, você pode configurar a nova senha para o usuário root:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/U6Tuuj0.jpg&quot; alt=&quot;Nova senha na página com o console.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nota:&lt;/em&gt; você precisará encontrar o usuário root padrão para o sistema operacional de sua escolha.&lt;/p&gt;

&lt;p&gt;Agora você tem para começar!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/JykvbWfXtAHSM/source.mp4&quot; alt=&quot;https://media.giphy.com/media/JykvbWfXtAHSM/source.mp4&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;criar-o-seu-próprio-usuário&quot;&gt;Criar o seu próprio usuário&lt;/h2&gt;

&lt;p&gt;Tudo bem, talvez você esteja indo bem usando o usuário root, mas eu gosto do meu tema de terminal colorido. Então é hora de criar um usuário que me permita ter minhas customizações. Para fazer isso, existem alguns comandos.&lt;/p&gt;

&lt;p&gt;Primeiro, precisamos escolher o seu nome de usuário. Por falta de criatividade, eu escolhi &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jess&lt;/code&gt; para ser meu nome de usuário, e você pode usar o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;adduser&lt;/code&gt; para criar um novo usuário:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;adduser jess
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E depois que você executar o comando, você será solicitado a criar uma senha. Você pode opcionalmente adicionar algumas informações extras para o usuário:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/xtBv9p7.jpg&quot; alt=&quot;Adicionando novo usuário&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Uma vez que você confirme que todas as informações estão corretas, você pode dar ao seu usuário poderes sudo. Os poderes sudo permitirão que você instale coisas sem ter que acessar o usuário root. Então, para fazer isso, você precisa executar o comando seguinte:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;usermod -aG sudo jess
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Lembre-se de ajustar o comando para o seu nome de usuário. E agora você terminou de configurar sua conta de usuário. Parabéns!&lt;/p&gt;

&lt;h2 id=&quot;configurando-a-droplet-para-acesso-via-ssh&quot;&gt;Configurando a droplet para acesso via SSH&lt;/h2&gt;

&lt;p&gt;Outra coisa que podemos querer fazer é acessar o nosso perfil de usuário via SSH. Agora vamos ver o que precisamos configurar para poder acessar o seu usuário.&lt;/p&gt;

&lt;p&gt;Meu principal objetivo ao configurar essa instância era para que eu pudesse codificar usando o meu iPad. Comprei um aplicativo chamado &lt;a href=&quot;https://www.textasticapp.com/&quot;&gt;TexTastic&lt;/a&gt;, e é um aplicativo muito completo. O Textastic tem a possibilidade de acessar uma máquina via SSH, e ele cria um terminal para você. Eu estou usando esse app há bastante tempo, e até agora não me decepcionou.&lt;/p&gt;

&lt;p&gt;Okay, estou divagando um pouco. Vamos voltar ao ponto em questão, acessar a máquina com SSH. Como eu não queria gerar um novo par de chaves SSH, copiei o SSH que usei para acessar a máquina como root. Quando você adiciona a chave SSH como um método de autenticação ao criar a droplet, ele adiciona a chave pública para o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;authorized_keys&lt;/code&gt; do usuário root. Para usar a mesma chave para acessar seu usuário como usuário root, você deve copiar este arquivo para o diretório &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.ssh&lt;/code&gt; do seu usuário e ajustar a propriedade do arquivo (ownership).&lt;/p&gt;

&lt;p&gt;Para os próximos comandos, vou alternar entre o meu usuário &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jess&lt;/code&gt; e o usuário &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;root&lt;/code&gt;. Eu indicarei qual usuário deve usar para executar o comando usando parênteses e o nome do usuário dentro, como &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(jess)&lt;/code&gt; ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(root)&lt;/code&gt; antes do próprio comando.&lt;/p&gt;

&lt;p&gt;A primeira coisa que você deve fazer é fazer login como seu usuário:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;(root) $ su jess
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E você provavelmente precisará a inserir a senha do usuário. Depois disso você pode criar o diretório &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.ssh&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;(jess) $ mkdir ~/.ssh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Depois disso, você deve voltar para o usuário root e copiar o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;authorized_keys&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;(jess) $ su root
(root) $ cp ~/.ssh/authorized_keys /home/jess/.ssh/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Então, o último passo, você deve alterar a propriedade do arquivo que acabou de copiar. Se você não fizer isso, não será capaz de acessar sua máquina como seu usuário.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;(root) $ chown jess /home/jess/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/5hxtIvk6VBzwkVCGN5/giphy.gif&quot; alt=&quot;https://media.giphy.com/media/5hxtIvk6VBzwkVCGN5/giphy.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Bora! Pode dar uma descansadinha 😉 Você merece 👏&lt;/p&gt;

&lt;h2 id=&quot;configurando-sua-máquina-para-acessar-a-droplet-via-ssh&quot;&gt;Configurando sua máquina para acessar a droplet via SSH&lt;/h2&gt;

&lt;p&gt;Estamos perto, prometo! Neste ponto, você tem tudo configurado para acessar sua máquina na nuvem. Então, deixe-me ensinar a você a encontrar as informações necessárias para executar seu comando SSH.&lt;/p&gt;

&lt;p&gt;Mais uma vez, você precisa ir para a página específica da droplet. Logo abaixo do nome da droplet, você verá uma etiqueta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ipv4&lt;/code&gt; que contém um IP, esse é o seu domínio:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/MKBAZlT.jpg&quot; alt=&quot;Encontrando o endereço ipv4&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E é isso, tudo o que você precisa fazer é abrir o seu terminal preferido e executar o comando assim:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ssh jess@159.203.72.53
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E isso vai te permitir acessar diretamente a droplet  porque você configurou as chaves SSH e tudo o mais.&lt;/p&gt;

&lt;h2 id=&quot;próximos-passos&quot;&gt;Próximos passos&lt;/h2&gt;

&lt;p&gt;Depois que tudo estiver configurado, provavelmente farei alguns ajustes na minha configuração para melhorar a aparência do meu terminal. Aqui estão algumas coisas que você também pode querer de fazer:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Instalar o zshell&lt;/li&gt;
  &lt;li&gt;Ajustar a configuração do VIM/emacs/nano&lt;/li&gt;
  &lt;li&gt;Criar um novo par de chaves SSH para usar com o GitHub a partir da instância na nuvem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É isso por hoje 😉&lt;/p&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;p&gt;Aqui está um link que me ajudou, se você quiser conferir:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/&quot;&gt;Post que eu segui para criar um usuário sudo (em inglês)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Mon, 31 May 2021 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/configurar-e-acessar-sua-droplet-via-ssh/</link>
        <guid isPermaLink="true">https://jtemporal.com/configurar-e-acessar-sua-droplet-via-ssh/</guid>
        
        <category>droplet</category>
        
        <category>digital ocean</category>
        
        <category>ssh</category>
        
        <category>cloud computing</category>
        
        <category>cloud</category>
        
        <category>tutorial</category>
        
        <category>portugues</category>
        
        
      </item>
    
      <item>
        <title>What&apos;s new in Flask 2.0</title>
        <description>&lt;p&gt;Flask is the most used framework for web development according to the Jetbrains Python Developers Survey from 2020, and in May of 2021, version 2.0.0 of Flask came out with 31 new changes. In this post, you’ll learn about some of those changes and the refactoring you might want to do to your code to take the most advantage of this new version.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;To keep reading this article, click on the button below 👇&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt; &lt;a href=&quot;https://auth0.com/blog/whats-new-in-flask-2/&quot;&gt; &lt;img src=&quot;/images/keep_reading.png&quot; /&gt; &lt;/a&gt; &lt;/center&gt;
</description>
        <pubDate>Fri, 21 May 2021 21:44:37 +0000</pubDate>
        <link>https://jtemporal.com/what-s-new-in-flask-2.0/</link>
        <guid isPermaLink="true">https://jtemporal.com/what-s-new-in-flask-2.0/</guid>
        
        <category>english</category>
        
        <category>python</category>
        
        <category>what&apos;s new in flask 2</category>
        
        <category>flask 2</category>
        
        <category>flask 2.0</category>
        
        
      </item>
    
      <item>
        <title>Getting to know Jessica Temporal, Sr. Developer Advocate @ Auth0</title>
        <description>&lt;p&gt;I believe everybody has had an “aha moment” in their lifetime. I want to tell you about 2 of those moments for me.&lt;/p&gt;

&lt;p&gt;I also believe people mistake aha moments as something that happens out of nowhere, but when in reality, at least for me, those happen after much work.&lt;/p&gt;

&lt;p&gt;Something just clicks, and things start falling into place. Before I can tell you about my aha moments, you need to know me a little bit.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;To keep reading this article, click on the button below 👇&lt;/p&gt;

&lt;p&gt;&lt;br /&gt; &lt;center&gt; &lt;a href=&quot;https://auth0.com/blog/jessica-temporal-sr-developer-advocate-auth0/ &quot;&gt; &lt;img src=&quot;/images/keep_reading.png&quot; /&gt; &lt;/a&gt; &lt;/center&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 29 Apr 2021 12:20:03 +0000</pubDate>
        <link>https://jtemporal.com/getting-to-know-jessica-temporal-sr.developer-advocate-auth0/</link>
        <guid isPermaLink="true">https://jtemporal.com/getting-to-know-jessica-temporal-sr.developer-advocate-auth0/</guid>
        
        <category>english</category>
        
        <category>new job</category>
        
        <category>Auth0</category>
        
        
      </item>
    
      <item>
        <title>Criando a sua máquina na nuvem com Digital Ocean</title>
        <description>&lt;p&gt;Este post é um passo-a-passo sobre como criar uma instância de nuvem na Digital Ocean.&lt;/p&gt;

&lt;center&gt; &lt;img alt=&quot;video da Michelle Obama dizendo &apos;Vamos Fazer isso!&apos;&quot; src=&quot;https://media.giphy.com/media/lRXMa7BOWsdcF3NxTA/giphy.gif&quot; /&gt; &lt;br /&gt;

&lt;i&gt;video da Michelle Obama dizendo &apos;Vamos Fazer isso!&apos;&lt;/i&gt;

&lt;/center&gt;

&lt;h2 id=&quot;conheça-a-digital-ocean&quot;&gt;Conheça a Digital Ocean&lt;/h2&gt;

&lt;p&gt;A Digital Ocean (DO) oferece uma gama de soluções em computação em nuvem e a minha favorita é chamado de &lt;em&gt;&lt;a href=&quot;https://www.digitalocean.com/products/droplets/&quot;&gt;Droplet&lt;/a&gt;&lt;/em&gt; (ou gota em Português). Droplet é uma máquina virtual que você pode usar para praticamente qualquer coisa, e adoro usá-las como um computador poderoso quando tenho poder computacional limitado, coisa que falei sobre &lt;a href=&quot;https://jtemporal.com/como-ser-cientista-de-dados-usando-um-computador-da-xuxa/&quot;&gt;nesse outro artigo&lt;/a&gt;. Ainda assim, também é uma escolha muito legal para quem deseja codificar de qualquer lugar, até mesmo de dispositivos móveis como celulares e tablets.&lt;/p&gt;

&lt;p&gt;Há uma grande variedade de sistemas operacionais para escolher e é bem simples para começar (apesar dos vários passos), então sempre que preciso de alguma computação em nuvem, penso na DO primeiro.&lt;/p&gt;

&lt;h2 id=&quot;crie-uma-droplet&quot;&gt;Crie uma droplet&lt;/h2&gt;

&lt;p&gt;A primeira coisa que você precisa fazer é criar sua conta na DO. Para fazer isso, você deve &lt;a href=&quot;https://digitalocean.com/&quot;&gt;acessar o site deles&lt;/a&gt; e se inscrever por meio do formulário já disponível na página inicial:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/fMY3yXz.jpg&quot; alt=&quot;Página de boas-vindas da Digital Ocean&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Depois disso, a página recarregará e aparecerá o painel de controle onde você pode ver todas as soluções disponíveis. Clique na opção “&lt;em&gt;Droplets&lt;/em&gt;” no menu à esquerda, e você deve ver na página uma lista de suas droplets atuais:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/fKpV2pK.jpg&quot; alt=&quot;Lista de droplets no painel de controle&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Como você pode ver na imagem acima, eu já tenho uma droplet lá chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jtemporal&lt;/code&gt; e também posso criar uma nova clicando no botão “&lt;em&gt;Create droplet&lt;/em&gt;” (Criar Droplet em tradução livre) que aparece em verde no canto superior esquerdo, e isso vai te levar pra uma página onde você pode escolher a configuração que você deseja para a sua droplet.&lt;/p&gt;

&lt;p&gt;A primeira coisa que você precisa escolher é o sistema operacional:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/NsgOBze.jpg&quot; alt=&quot;Opções de sistema operacional&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Em seguida, você deve escolher um plano de pagamento:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/rgDRnA3.jpg&quot; alt=&quot;opções de planos de pagamento &quot; /&gt;&lt;/p&gt;

&lt;p&gt;Escolher a configuração correta é essencial. Atualmente, eu uso uma droplet principalmente para coisas como escrever e criar exemplos para postagens no blog. O plano básico com uma CPU compartilhada se encaixa perfeitamente para esse tipo de uso, mas talvez você precise de uma CPU dedicada se você precisar rodar algo mais pesado. Portanto, escolha com cuidado. Minha instância atual é do plano básico com uma CPU de 2 GB e disco de 50 GB, o que vai me custar dez dólares por mês.&lt;/p&gt;

&lt;p&gt;O dólar tá caro eu sei, mas eu não vivo com uma droplet o tempo todo, eu sempre apago ela depois que termino a tarefa que tinha para fazer e crio uma nova quando eu precisar, com isso o custo fica em questão de centavos de dólares.&lt;/p&gt;

&lt;p&gt;Depois de escolher a melhor configuração para o seu uso, você deve escolher se deseja “adicionar armazenamento em bloco” na seção &lt;em&gt;Add block storage&lt;/em&gt;, imagine que este é o HD externo que você pode levar com você sempre que quiser. O armazenamento em bloco salva dados e é compartilhado entre as instâncias, mas observe que o armazenamento em bloco tem um custo extra, então você está com um orçamento apertado, tenha isso em mente. 😉&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/T9ajYfH.jpg&quot; alt=&quot;seção de escolha de block storage&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Depois de decidir qual plano usar e se deseja ou não ter armazenamento em bloco, você deve escolher uma região para sua instância. Isso significa que você deve decidir em qual lugar do mundo o data center que hospedará a sua máquina virtual está fisicamente localizado. Quanto mais próximos estiverem de você geograficamente, menor será o atraso na comunicação com a máquina. Escolhi a região de Nova York por ser a mais próxima de mim.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/FMYxQYU.jpg&quot; alt=&quot;opções de escolha de região do datacenter&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Cada região vem com uma rede VPC configurada para que você possa transferir facilmente dados e informações de uma instância para outra na mesma região. Você também pode adicionar redes VPC personalizadas, mas por enquanto, a que vem por padrão será suficiente.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/ouc22ui.jpg&quot; alt=&quot;opções adicionais&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Você também pode adicionar alguns complementos extras aos seus droplets, como monitoramento e disponibilidade de conexões IPv6. Eu não escolhi nenhum complemento, pois não preciso deles agora, mas escolha o que melhor se adaptar às suas necessidades.&lt;/p&gt;

&lt;p&gt;Agora que você tem todas as configurações básicas para a sua instância configurada, você precisará definir uma maneira de acessá-la. É aqui que entram as chaves SSH. Já tenho minhas chaves SSH configuradas em minha conta e você pode ver na imagem abaixo que tenho algumas, então, para esta instância, escolhi a que estou usando atualmente que é a chave chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;textastic&lt;/code&gt;. Se preferir você pode também definir uma senha para o usuário &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;root&lt;/code&gt; se selecionar Password, mas lembre-se de não repetir senhas e usar sempre um gerenciador de senhas para gerar senhas longas e randômicas (eu uso o LastPass).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/n4FyN4T.jpg&quot; alt=&quot;SSH keys configuration&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Para finalizar, você precisa dar um nome à sua instância. Se você não quiser escolher um nome, a Digital Ocean gera um nome aleatório, como você pode ver abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/gsAWQ0E.jpg&quot; alt=&quot;hostname&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Para a instância que vou usar diariamente, escolhi o “jtemporal” - o nome que normalmente uso para os “arrobas” nas redes sociais 🤣.&lt;/p&gt;

&lt;p&gt;Existem mais 3 coisas que você terá de decidir: pode adicionar etiquetas (tags) à sua instância; isto pode ser uma ferramenta de organização útil se tiver muitos projetos em andamento e quiser agrupar instâncias com base em tópicos. Também pode criar projetos diferentes e selecionar o projeto que deseja aqui, e finalmente, é possível ativar backups. Eu não fiz nada disso, mas recomendo estudar cada um desses com base no seu caso de uso. Agora você está quase lá. Só precisa de clicar no grande botão verde que diz “&lt;em&gt;Create Droplet&lt;/em&gt;”:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/i3F6S0A.jpg&quot; alt=&quot;create droplet&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E sua instância será criada e começará a inicializar.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/LKMzsga.jpg&quot; alt=&quot;instance booting up&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Quando você clicar no botão “&lt;em&gt;Create Droplet&lt;/em&gt;”, verá a sua nova droplet na lista de droplets vinculadas à sua conta e pode ser necessário esperar alguns minutos enquanto ela termina de ser configurada. Quando a droplet estiver pronta, terá um ponto verde ao lado do nome, como a minha instância &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jtemporal&lt;/code&gt; tem na imagem acima, e então você pode acessá-la.&lt;/p&gt;

&lt;div style=&quot;width:100%;height:0;padding-bottom:53%;position:relative;&quot;&gt;&lt;iframe src=&quot;https://giphy.com/embed/ijGS9TME6iN7W&quot; width=&quot;100%&quot; height=&quot;100%&quot; style=&quot;position:absolute&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;

&lt;p&gt;Parabéns! Você conseguiu! Você criou sua droplet com sucesso!&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/configurar-e-acessar-sua-droplet-via-ssh/&quot;&gt;Neste próximo post, falo sobre como configurar a Droplet para que você possa realmente usá-la com SSH e tudo.&lt;/a&gt;, depois da uma conferida 😉&lt;/p&gt;
</description>
        <pubDate>Wed, 21 Apr 2021 22:48:25 +0000</pubDate>
        <link>https://jtemporal.com/criando-a-sua-maquina-na-nuvem-com-digital-ocean/</link>
        <guid isPermaLink="true">https://jtemporal.com/criando-a-sua-maquina-na-nuvem-com-digital-ocean/</guid>
        
        <category>droplet</category>
        
        <category>ssh</category>
        
        <category>digital ocean</category>
        
        <category>cloud</category>
        
        <category>portugues</category>
        
        <category>tutorial</category>
        
        
      </item>
    
      <item>
        <title>Creating your machine on the cloud with Digital Ocean</title>
        <description>&lt;p&gt;This post is a step-by-step on how to create a cloud instance on Digital Ocean.&lt;/p&gt;

&lt;center&gt; &lt;img alt=&quot;video of michelle obama saying now let&apos;s get this done&quot; src=&quot;https://media.giphy.com/media/lRXMa7BOWsdcF3NxTA/giphy.gif&quot; /&gt; &lt;br /&gt; &lt;/center&gt;

&lt;h2 id=&quot;get-acquainted-with-digital-ocean&quot;&gt;Get acquainted with Digital Ocean&lt;/h2&gt;

&lt;p&gt;So Digital Ocean (DO) provides a range of solutions in cloud computing. My favorite one is called &lt;a href=&quot;https://www.digitalocean.com/products/droplets/&quot;&gt;Droplets&lt;/a&gt;. Droplets are a virtual machine that you can use for pretty much anything, and I love to use them as a powerful computer when I have limited power available. Still, it is also a pretty neat choice for those who want to code from anywhere, even from mobile devices.&lt;/p&gt;

&lt;p&gt;There is a wide range of operating systems to chose from, and it is pretty straightforward to begin with, so whenever I need some cloud computing, I think of Digital Ocean as the first choice.&lt;/p&gt;

&lt;h2 id=&quot;create-the-droplet&quot;&gt;Create the droplet&lt;/h2&gt;

&lt;p&gt;The first thing you’ll need to do is create your account on DO. To do this, you must &lt;a href=&quot;https://digitalocean.com&quot;&gt;access their website&lt;/a&gt; and sign up using the form already available on the landing page:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/fMY3yXz.jpg&quot; alt=&quot;Welcome page from Digital Ocean&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After that, you’ll be taken to your dashboard, where you’ll see all the solutions available, and you should click on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Droplets&lt;/code&gt; option on the menu on the left-hand side, and this will take you to the page where you can see a list of your current droplets:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/fKpV2pK.jpg&quot; alt=&quot;droplets list on dashboard&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As you can see in the above image, I already have a droplet there called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jtemporal&lt;/code&gt; and I can also create a new one by clicking the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Create droplet&lt;/code&gt; button on the top left corner, and this will take you to a page where you can choose the configuration you want for your droplet.&lt;/p&gt;

&lt;p&gt;The first thing you need to choose, is the operational system:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/NsgOBze.jpg&quot; alt=&quot;OS options&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then you have to pick a payment plan:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/rgDRnA3.jpg&quot; alt=&quot;payment plans for droplets&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Choosing the right one for either of these choices is essential. Currently, I mostly use my droplet for things like writing and creating examples for blog posts. The basic plan with a shared CPU fits the bill perfectly, but maybe a dedicated CPU might be your thing if you need something more heavy-duty. So choose with care. My current instance is from the basic plan with a 2GB CPU and 50GB disk, which will cost me ten dollars a month.&lt;/p&gt;

&lt;p&gt;After picking the best configuration for your use case, you have to choose whether you want to “Add block storage”, imagine this is the external HD that you can take with you whenever you travel. Block storage saves the data and shares it across instances or maybe takes it from one instance to another. But note that block storages cost extra, so if you are on a budget. Keep that in mind. 😉&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/T9ajYfH.jpg&quot; alt=&quot;add block storage&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After deciding which plan to use and whether or not you want to have block storage, you must choose a region for your instance; This means you have to decide where your machine’s data center is physically located. The closer they are to you geographically, the less delay you’ll have to deal with. I chose the New York region since it is the closest to me.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/FMYxQYU.jpg&quot; alt=&quot;datacenter region&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Each region comes with a VPC network configured, so you can seamlessly transfer data and information from one instance to another in the same region. You can add custom VPC networks too, but for now, the default will be enough.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/ouc22ui.jpg&quot; alt=&quot;aditional options&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can also add some extra add-ons to your droplets, like monitoring and IPv6 connections availability. I didn’t choose any add-ons since I don’t need them right now but chose what best fits your needs.&lt;/p&gt;

&lt;p&gt;Now that you have all the basic configuration for your instance set up, you’ll need to define a way to access it. This is where the SSH keys come in. I have my SSH keys already set up in my account, and you can see by the picture below that I have a couple, so for this instance, I picked the one I’m currently using that is named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;textastic&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/n4FyN4T.jpg&quot; alt=&quot;SSH keys configuration&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To finalize, you need to give a name to your instance. If you don’t want to choose a name Digital Ocean generates a random name, as you can see below:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/gsAWQ0E.jpg&quot; alt=&quot;hostname&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For the instance I’m going to use daily, I gave it a shorter name - jtemporal - the name I usually use for my handles on social media 🤣.&lt;/p&gt;

&lt;p&gt;There are 3 more things you’ll need to decide on: you can add tags to your instance; this can be a helpful organizational tool if you have many projects going on and you want to group instances based on topics. You can also create different projects and select the project you want here, and finally, you can enable backups. I didn’t do any of this, but I truly recommend it. Now you are almost there. You only need to click the big green button that says &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Create Droplet&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/i3F6S0A.jpg&quot; alt=&quot;create droplet&quot; /&gt;&lt;/p&gt;

&lt;p&gt;and your instance will be created and will start to boot up:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/LKMzsga.jpg&quot; alt=&quot;instance booting up&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Once you click the “Create Droplet” button, you’ll see your new droplet on the list of droplets linked to your account, and you might need to wait a couple minutes while it finishes booting up. Once the droplet is ready, it will have a green dot by the name like my instance  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jtemporal&lt;/code&gt; has in the above image, and then you can access it.&lt;/p&gt;

&lt;div style=&quot;width:100%;height:0;padding-bottom:53%;position:relative;&quot;&gt;&lt;iframe src=&quot;https://giphy.com/embed/ijGS9TME6iN7W&quot; width=&quot;100%&quot; height=&quot;100%&quot; style=&quot;position:absolute&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;

&lt;p&gt;Congratulations! You did it! You created your droplet successfully!&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/configuring-and-accessing-your-droplet-via-ssh/&quot;&gt;In this next post I talk about how to configure the Droplet so you can actually use it with SSH and all&lt;/a&gt;, check it out 😉&lt;/p&gt;
</description>
        <pubDate>Wed, 21 Apr 2021 22:48:25 +0000</pubDate>
        <link>https://jtemporal.com/creating-vm-droplet-digital-ocean/</link>
        <guid isPermaLink="true">https://jtemporal.com/creating-vm-droplet-digital-ocean/</guid>
        
        <category>droplet</category>
        
        <category>ssh</category>
        
        <category>digital ocean</category>
        
        <category>cloud</category>
        
        <category>english</category>
        
        <category>tutorial</category>
        
        
      </item>
    
      <item>
        <title>My first AvocadoLabs live o/</title>
        <description>&lt;p&gt;Basically a meet and greet ;)&lt;/p&gt;

&lt;h3 id=&quot;details&quot;&gt;Details&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://avocadolabs.dev/recordings/auth0-developer-relations-team-just-got-bigger-meet-jessica-temporal/&quot;&gt;Avocado Labs Community Hour&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;video&quot;&gt;Video&lt;/h3&gt;

&lt;center&gt;
  &lt;br /&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/zvXtTVURun0&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Thu, 15 Apr 2021 14:00:00 +0000</pubDate>
        <link>https://jtemporal.com/my-first-avocadolabs-live-o/</link>
        <guid isPermaLink="true">https://jtemporal.com/my-first-avocadolabs-live-o/</guid>
        
        
      </item>
    
      <item>
        <title>Quais ferramentas focar para qualquer vaga em TI</title>
        <description>&lt;p&gt;A pergunta que eu mais recebo em particular nas minhas redes sociais é “&lt;em&gt;Jessica estou precisando de um norte para direcionar meus estudos na área x, consegue me ajudar?&lt;/em&gt;”. Como ela acontece com certa frequência decidi tentar ajudar a respondê-la aqui.&lt;/p&gt;

&lt;p&gt;Como todas os demais questionamentos na área de tecnologia, a resposta pra essa pergunta é: depende! E já pra começar com clichês, eu não vou te dar o peixe, eu vou te ensinar a pescar 😉&lt;/p&gt;

&lt;div style=&quot;width:100%;height:0;padding-bottom:56%;position:relative;&quot;&gt;&lt;iframe src=&quot;https://giphy.com/embed/KFSL234o2FlGE&quot; width=&quot;100%&quot; height=&quot;100%&quot; style=&quot;position:absolute&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Neste artigo, vou usar como exemplo a área em que trabalhei muitos anos e que sempre é mencionada nos pedidos de ajuda que recebo: a Ciência de Dados, mas saiba que é possível abstrair essa lógica e aplicar os mesmos passos para outros tipos de cargos e áreas,  principalmente em tecnologia.&lt;/p&gt;

&lt;p&gt;Por mais que você queira trabalhar com ciência de dados, os requisitos para cientistas variam de empresa para empresa e não existe uma receita de bolo que vá servir para todo mundo, afinal de contas, como diz mainha: &lt;em&gt;“Você não é todo mundo”&lt;/em&gt;. E por um lado isso é ótimo, pois te dá uma liberdade para trilhar um caminho diferente dos demais, mas ao mesmo tempo levanta a inevitável pergunta: &lt;em&gt;“O que eu preciso focar/ter no meu currículo para ser considerada pra uma vaga?”.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;E aí que entra o pulo do gato, se você não tem uma empresa dos sonhos em que você quer trabalhar, você vai precisar se organizar para um processo seletivo que não é unificado. Diferentemente de concurso ou vestibulares que os requisitos são conhecidos e expostos para todos, vagas de emprego e principalmente vagas para grandes empresas não são iguais só por que o cargo tem o mesmo nome. Inclusive, ouso dizer que dentro da mesma empresas, &lt;strong&gt;um mesmo cargo para times diferentes&lt;/strong&gt; podem esperar de você &lt;strong&gt;capacidades diferentes&lt;/strong&gt;, então vamos ver como descobrir um caminho no meio de um matagal.&lt;/p&gt;

&lt;p&gt;Ler esse post e colocar ele em prática não vai te garantir um emprego, mas os passos que eu mostro aqui devem te ensinar a desenhar o seu currículo de forma que ele apresente as ferramentas mais interessantes dentre as milhares tecnologias pedidas pelas empresas. Pra isso você vai precisar de 3 coisas:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Acesso à internet&lt;/li&gt;
  &lt;li&gt;Uma conta no LinkedIn&lt;/li&gt;
  &lt;li&gt;Um software para planilhas&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se você está lendo esse post provavelmente você já está usando o item 1. Com uma base de usuários crescente eu imagino que você já possua sua conta no LinkedIn, caso você ainda não tenha uma conta no LinkedIn e não queira criar uma, você vai ter mais trabalho para coletar os dados que vamos precisar e, já aviso de antemão, que eu vou me apoiar bastante no uso do LinkedIn. Por fim, vamos usar um software de planilhas e aqui eu escolhi o Google Sheets, mas sinta-se a vontade para usar o software de sua preferência.&lt;/p&gt;

&lt;h2 id=&quot;coleta-de-dados&quot;&gt;Coleta de dados&lt;/h2&gt;

&lt;p&gt;Eu gosto de encarar o primeiro passo como a &lt;strong&gt;coleta de dados&lt;/strong&gt;, esses dados tem como objetivo responder uma pergunta bem clara &lt;em&gt;“Qual conjunto de ferramentas e habilidades devo focar nos próximos meses para construir meu portfólio?”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Para começar abra o LinkedIn, abaixo você a minha página inicial. Ao centro, você vê a caixa para começar um novo post e o comecinho de um post do &lt;a href=&quot;https://databootcamp.com.br/&quot;&gt;Data Bootcamp&lt;/a&gt; que foi curtido por pessoas na minha rede. A esquerda você vê o meu perfil com algumas estatísticas, a direita sugestões de tópicos para seguir, mas o nosso foco vai ser na barra superior.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/vagas_01.JPG&quot; alt=&quot;vagas 01&quot; /&gt;&lt;/p&gt;

&lt;p&gt;É na barra de mais acima da página que você encontra o campo de busca do LinkedIn, é nessa parte onde você deve inserir os termos de busca como por exemplo empresas que você tem interesse, tópicos/hashtags sobre assuntos para você acompanhar, ofertas de vagas disponíveis e pessoas para se conectar, tente me achar por exemplo, digite “Jessica Temporal” e aperte enter para ver se eu apareço na lista de pessoas sugeridas.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/vagas_02.JPG&quot; alt=&quot;vagas 02&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Outra parte interessante é a aba de “Jobs”. Nessa aba você tem uma pesquisa específica para vagas anunciadas na plataforma. Você pode fazer uma pesquisa tão ampla ou tão específica quanto queira, vamos ver como fazer isto a seguir. Além disso, também é possível criar notificações para uma busca, assim, novas vagas que surgirem com os filtros escolhidos chegam para você por e-mail.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/vagas_03.JPG&quot; alt=&quot;vagas 03&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora que você já conhece um pouco da interface vamos fazer a primeira busca, suponha que você quer ser cientista de dados, mas quer trabalhar na cidade de São Paulo. Na primeira caixa você deve preencher o cargo ou termo de pesquisa (não clique nas opções da lista que vai aparecer ainda) e na segunda caixa digite a cidade de interesse e clique em “Search” ou “Buscar” se o seu LinkedIn estiver em Português.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/vagas_04.JPG&quot; alt=&quot;vagas 04&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ao clicar em buscar, a página irá recarregar e mostrar uma lista de vagas para aquela região, veja:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/vagas_05.JPG&quot; alt=&quot;vagas 05&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E se você notar, logo abaixo da barra de pesquisa, temos filtros. São esses filtros que vamos usar para achar dez vagas de cientista de dados para tentar responder a nossa pergunta inicial.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/vagas_06.JPG&quot; alt=&quot;vagas 06&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A primeira coisa que vou fazer vai ser escolher algumas empresas, para isso use o filtro “Company” ou “Empresa”, e vou selecionar algumas empresas, aqui selecionei apenas algumas empresas Brasileiras e depois de selecionar todas as que tenho interesse cliquei em “Show results” ou “Mostrar resultado”:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/jtemporal.github.io/main/images/vagas_07_gif.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Depois de recarregar a página você vai ver uma lista filtrada de cargos disponíveis:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/vagas_08.JPG&quot; alt=&quot;vagas 08&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Cada vaga possui pelo menos 3 elementos:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Uma descrição da empresa;&lt;/li&gt;
  &lt;li&gt;Uma lista de responsabilidades para a vaga;&lt;/li&gt;
  &lt;li&gt;Uma lista de habilidades desejadas também chamada de requisitos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;É essa lista de habilidades que você vai precisar focar, abaixo você vê os requisitos para três vagas de cientista de dados para três empresas diferentes:&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/vagas_09.JPG&quot; /&gt;
&lt;br /&gt;  &lt;br /&gt;
&lt;i&gt;Requisitos da vaga &quot;Cientista de Dados Júnior&quot; no PicPay&lt;/i&gt;
&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;img src=&quot;/images/vagas_10.JPG&quot; /&gt;
&lt;br /&gt;  &lt;br /&gt;
&lt;i&gt;Requisitos da vaga &quot;Cientista de dados&quot; no Itaú&lt;/i&gt;
&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;img src=&quot;/images/vagas_11.JPG&quot; /&gt;
&lt;br /&gt;  &lt;br /&gt;
&lt;i&gt;Requisitos da vaga &quot;Cientista de dados&quot; no iFood&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Como você pode notar, não existe um padrão de divisão ou organização das habilidades, cada empresa escreve essas informações da maneira que lhe é mais interessante.&lt;/p&gt;

&lt;p&gt;Além de buscar por um termo e uma cidade, você deve ir refinando a sua busca, às vezes você precisará trocar um termo por outro para obter resultados mais interessantes, por exemplo, experimente procurar Data Scientist ao invés de Cientista de Dados. Algumas empresas mesmo sendo Brasileiras colocam seus cargos e anúncios de vaga em Inglês, por isso, pequenos ajustes de termos, podem te trazer mais vagas interessantes.&lt;/p&gt;

&lt;h2 id=&quot;organizando-os-dados-coletados&quot;&gt;Organizando os dados coletados&lt;/h2&gt;

&lt;p&gt;Agora que você já tem uma coleção de vagas, chegou a hora de arregaçar as mangas e colocar as informações num formato fácil de identificar nossa jornada de estudo.&lt;/p&gt;

&lt;p&gt;Para isso eu criei uma planilha onde colei as descrições das seções de requisitos de cada vaga que achei interessante. Eu coloquei uma coluna para cada informação: Título da vaga, empresa de onde peguei a vaga, os requisitos, as habilidades que são consideradas um diferencial e por fim o link da vaga. E organizando assim fica mais fácil do que passear entre 10 abas no navegador 😉&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/vagas_12.JPG&quot; alt=&quot;vagas 12&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Essa é a minha base de informações, mas concorda que ainda não está fácil de visualizar as as habilidades mais importantes? Então vamos estruturar nossos dados. Para isso eu criei uma nova aba na minha planilha e fui manualmente criando uma coluna para cada empresa e transformando o texto em uma lista de habilidades, por exemplo, a vaga da Stone abaixo:&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/vagas_13.JPG&quot; /&gt;
&lt;br /&gt;  &lt;br /&gt;
&lt;i&gt;Requisitos da vaga &quot;Data Scientists (Conta Stone)&quot; na Stone&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Virou essa coluna na minha planilha:&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/vagas_14.JPG&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Note que eu também incluí as “habilidades desejáveis”, aquelas que apresentam um diferencial para a vaga, provavelmente essa ferramentas já são parte do conjunto da empresa e você vai encontrá-las no seu dia-a-dia.&lt;/p&gt;

&lt;p&gt;Depois de transformar a descrição das vagas num dado colunar eu recomendo que você padronize algumas entradas, por exemplo, eu coloquei todas as letras em minúsculo e troquei alguns termos, por exemplo “versionamento de código” e “github” viraram apenas “git”, isso vai deixar as suas informações mais fáceis de agregar.&lt;/p&gt;

&lt;h2 id=&quot;respondendo-a-pergunta&quot;&gt;Respondendo a Pergunta&lt;/h2&gt;

&lt;p&gt;Agora para contar tudo isso nós vamos fazer uma tabela dinâmica ou &lt;em&gt;pivot table&lt;/em&gt;. Para facilitar a criação dessa tabela, eu colei numa nova aba da planilha todas as habilidades de cada das empresas em uma única coluna, que chamei de “Habilidades” e fiquei com uma coluna de 99 linhas com repetições, veja as últimas linhas da minha coluna resultante:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/vagas_15.JPG&quot; alt=&quot;vagas 15&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Tendo feito isso você conseguirá criar uma tabela que vai apresentar a frequência de cada habilidade ou ferramenta no nosso conjunto de vagas. Para criar uma tabela dinâmica no Google Sheets você deve selecionar “Tabela dinâmica” no menu “Dados”:&lt;br /&gt;
&lt;img src=&quot;/images/vagas_16.JPG&quot; alt=&quot;vagas 16&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ao clicar em tabela dinâmica vai aparecer a janelinha abaixo na sua planilha, onde você pode ajustar o intervalo de dados, no meu caso, eu estou escolhendo todas as linhas da coluna A da aba “Habilidades” para criar a minha tabela. Eu também selecionei “inserir em nova página” para criar a tabela numa nova aba da planilha e evitar a sobrescrita da minha resultante.&lt;br /&gt;
&lt;img src=&quot;/images/vagas_17.JPG&quot; alt=&quot;vagas 17&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E ao clicar em “Criar”, como esperado, uma nova aba aparece:&lt;br /&gt;
&lt;img src=&quot;/images/vagas_18.JPG&quot; alt=&quot;vagas 18&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note que a nossa tabela ainda está em branco. Isso acontece porque nós precisamos configurar os dados a serem calculados. Então clique numa célula da tabela para que o menu de edição da tabela dinâmica apareça:&lt;br /&gt;
&lt;img src=&quot;/images/vagas_19.JPG&quot; alt=&quot;vagas 19&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora a primeira coisa que vamos fazer vai ser adicionar os termos disponíveis na minha aba de Habilidades como entradas da tabela dinâmica, para isso clique no adicionar da seção “Linhas” e selecione “Habilidades”:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/jtemporal.github.io/main/images/vagas_20_gif.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Com isso os termos na nossa lista aparecem na tabela já sem repetição.&lt;/p&gt;

&lt;p&gt;Agora você precisa adicionar a frequência de aparecimento de cada termo. Para adionar a frequência clique em “Adicionar” na seção de “Valores”, e escolha mais uma vez “Habilidades”, e para ficar mais interessante selecione “% do total geral” no campo “Mostrar como”:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/jtemporal.github.io/main/images/vagas_21_gif.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Para finalizar, seria bom ordenar as habilidades pela frequência em que aparecem, já que imaginamos que as habilidades e ferramentas mais utilizadas vão aparecer mais vezes, então para ordenar, volte para seção “Linhas” e no campo “Classificar por” você vai poder escolher a coluna que contém as frequências que se chama “COUNTA de Habilidades” e automaticamente a tabela se organiza:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/jtemporal.github.io/main/images/vagas_22_gif.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Pronto! Agora você tem uma lista das habilidades que precisa desenvolver e ferramentas que precisa aprender!&lt;/p&gt;

&lt;p&gt;De acordo com o nosso pequeno conjunto de dados de 10 vagas de empresas Brasileiras que contratam a cientistas de dados, essas são as 15 ferramentas que você precisa ter no no seu currículo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/vagas_23.JPG&quot; alt=&quot;vagas 23&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;recapitulando&quot;&gt;Recapitulando&lt;/h2&gt;

&lt;p&gt;Saber tudo isso é uma garantia de emprego na área? Não, mas estudar as ferramentas que você encotrar usando este passo-a-passo vai te ajudar a construir um portfólio bem prático de habilidades que as empresas estão procurando em pessoas para as suas vaga.&lt;/p&gt;

&lt;p&gt;Um outro ponto chave se você está mudando de área ou de empresa, é criar um espaço onde você demonstra as suas habilidades. A Lele Portella tem &lt;a href=&quot;https://leportella.com/pt-br/pybr2020/&quot;&gt;uma palestra incrível de como fazer isso disponível no YouTube da Python Brasil&lt;/a&gt;, e eu recomendo que você &lt;a href=&quot;https://leportella.com/pt-br/porque-ter-um-blog/&quot;&gt;leia esse artigo sobre ter um blog&lt;/a&gt; também da Lele.&lt;/p&gt;

&lt;p&gt;Vale salientar que o conjunto de vagas deste artigo é pequeno pois tem apenas o objetivo de ensinar a fazer esse levantamento de informações. Eu recomendo que você faça uma coleta maior de dados antes de tirar conclusões.&lt;/p&gt;

&lt;p&gt;Como você deve ter notado, é um trabalho bem manual e que poderíamos automatizar grande parte dele, mas isso é assunto pra outro artigo 😜&lt;/p&gt;

&lt;p&gt;Por fim, espero que este artigo possa te ajudar a escolher um norte para chegar até o seu próximo emprego. Se tiver dúvidas deixa ali na caixinha de comentários no final do artigo 😉&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;center&gt;
&lt;img width=&quot;25%&quot; height=&quot;25%&quot; src=&quot;https://jtemporal.com/thirtydaysjourney/assets/images/jess-signature.gif&quot; /&gt;
&lt;/center&gt;
</description>
        <pubDate>Fri, 26 Mar 2021 18:28:34 +0000</pubDate>
        <link>https://jtemporal.com/ferramentas-para-qualquer-vaga-em-ti/</link>
        <guid isPermaLink="true">https://jtemporal.com/ferramentas-para-qualquer-vaga-em-ti/</guid>
        
        <category>pivot table</category>
        
        <category>tabela dinâmica</category>
        
        <category>google sheets</category>
        
        <category>planilhas</category>
        
        <category>emprego</category>
        
        <category>vagas</category>
        
        <category>passo a passo</category>
        
        <category>português</category>
        
        <category>linkedin</category>
        
        
      </item>
    
      <item>
        <title>Universo Python</title>
        <description>&lt;p&gt;Um encontro com Thaíssa Candelalla, Bruno Rocha, João Gabriel e eu para falar de muito  Python!&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/rvSjCo350Xg&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Tue, 24 Nov 2020 13:00:00 +0000</pubDate>
        <link>https://jtemporal.com/universo-python/</link>
        <guid isPermaLink="true">https://jtemporal.com/universo-python/</guid>
        
        <category>português</category>
        
        <category>portugues</category>
        
        <category>pt_br</category>
        
        <category>pt_BR</category>
        
        
      </item>
    
      <item>
        <title>Projetos Brasileiros para fazer pull requests nesse #Hacktoberfest 2020</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/projetos-br-hacktoberfest-2025/&quot;&gt;Edição atual da lista disponível aqui&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Depois dos sucessos das listas &lt;a href=&quot;https://medium.com/nossa-coletividad/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-4dc9b9b576c0&quot;&gt;de 2017&lt;/a&gt;, &lt;a href=&quot;https://medium.com/@jessicatemporal/projetos-brasileiros-para-contribuir-nesse-hacktoberfest-vers%C3%A3o-2018-4925959b9411&quot;&gt;de 2018&lt;/a&gt; e &lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-o-retorno/&quot;&gt;de 2019&lt;/a&gt;, esse é o QUARTO ano que estou fazendo a lista/curadoria de projetos brasileiros para contribuir no #Hacktoberfest (esse ano invadido pela &lt;a href=&quot;https://twitter.com/anaschwendler&quot;&gt;@anaschwendler&lt;/a&gt;!!!!)&lt;/p&gt;

&lt;p&gt;Então aqui vai! Uma lista toda repleta de projetos pra você contribuir nesse mês de Outubro!&lt;/p&gt;

&lt;p&gt;Novamente temos regrinhas:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ser um projeto criado/desenvolvido/mantido por brasileiras(os);&lt;/li&gt;
  &lt;li&gt;Ter pelo menos uma &lt;em&gt;issue&lt;/em&gt; aberta.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;avisos-para-2020&quot;&gt;Avisos para 2020&lt;/h2&gt;

&lt;p&gt;2020 não está sendo um ano fácil pra ninguém, apenas contribua com o que pode! S2&lt;/p&gt;

&lt;p&gt;Esse ano vamos manter a mesma forma de aumentar essa lista com mais projetos, como sempre, apenas abrindo um PR com o projeto. &lt;a href=&quot;https://jtemporal.com/adicionando-um-novo-projeto-na-lista-da-hacktoberfest-2019/&quot;&gt;As instruções de como adicionar projetos tá aqui&lt;/a&gt;. Todo mundo segue apenas ganhando &amp;lt;3.&lt;/p&gt;

&lt;p&gt;Os projetos continuam separados pela linguagem principal pra facilitar as buscas pra quem lê e também em ordem alfabética pela linguagem. 😉&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ATUALIZAÇÃO IMPORTANTE:&lt;/em&gt;&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://media.giphy.com/media/26CaM3Ei5kTjWLg9a/giphy.gif&quot; alt=&quot;Gif com a Dua Lipa no vídeo de sua música New Rules&apos;&quot; /&gt;
&lt;br /&gt;
&lt;small&gt;&lt;i&gt;&quot;Acorda menina! Olha as novas regras! New Rules!&quot; - Ana Maria Braga&lt;/i&gt;&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;Aqui as regras seguem as mesmas, porém a regra para tornar seu PR válido para a hacktoberfest mudou!!!11&lt;/p&gt;

&lt;p&gt;PRs apenas contarão se:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;O repositório onde o PR foi aberto tem um tópico chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hacktoberfest&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;center&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/4131432/94991921-abbd5280-0586-11eb-98a7-5e0c976aeebf.png&quot; alt=&quot;Imagem de repositório com o tópico hacktoberfest&quot; /&gt;
&lt;br /&gt;
&lt;/center&gt;

&lt;ol&gt;
  &lt;li&gt;O PR foi aberto em Outubro&lt;/li&gt;
  &lt;li&gt;OU o PR é adicionado(merged) ao projeto OU está com o rótulo(label) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hacktoberfest-accepted&lt;/code&gt; por um mantenedor OU o PR foi aprovado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mais informações no &lt;a href=&quot;https://hacktoberfest.digitalocean.com/hacktoberfest-update&quot;&gt;site oficial (em inglês)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy Hacking!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt; C# &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/afucher/Inquirer&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3756185?v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;afucher/Inquirer&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A collection of common interactive command line user interfaces in C#.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alexsandro-xpt/ErysDownloader&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/845657?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alexsandro-xpt/ErysDownloader&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ErysDownloader, a frenetic and optimizate downloader library. Pure C# lightweight HTTP GET verb library for text/html content-type. No dependece.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/code-cracker/code-cracker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/9695920?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;code-cracker/code-cracker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An analyzer library for C# and VB that uses Roslyn to produce refactorings, code analysis, and other niceties.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; C &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cmatsuoka/libxmp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/317355?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cmatsuoka/libxmp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Libxmp is a library that renders module files to PCM data.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/hardinfo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/hardinfo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;System profiler and benchmark tool for Linux systems&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/lwan&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/lwan&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Experimental, scalable, high performance HTTP server&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; CSS &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/milligram/milligram&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16243913?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;milligram/milligram&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A minimalist CSS framework.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Clojure &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mauricioszabo/atom-chlorine&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/138037?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mauricioszabo/atom-chlorine&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; An Atom plugin to integrate with Socket-REPL over Clojure and ClojureScript&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; C++ &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/OtacilioN/Brasilino&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10578275?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;OtacilioN/Brasilino&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Uma biblioteca que permite programar em linguagem Arduino utilizando comandos facilitados em PT-BR.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/vinipsmaker/tufao&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/865914?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;vinipsmaker/tufao&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An asynchronous web framework for C++ built on top of Qt&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Elixir &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/philss/floki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/381213?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;philss/floki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Floki is a simple HTML parser that enables search for nodes using CSS selectors.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Go &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/OsProgramadores/op-website-hugo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/25752535?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;OsProgramadores/op-website-hugo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto do Site&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/avelino/awesome-go&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/31996?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;avelino/awesome-go&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A curated list of awesome Go frameworks, libraries and software &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gofn/gofn&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/25033801?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gofn/gofn&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Function process via docker provider (serverless minimalist)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/goreleaser/goreleaser&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24697112?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;goreleaser/goreleaser&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Deliver Go binaries as fast and easily as possible&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jonatasbaldin/ignore&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/8570364?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jonatasbaldin/ignore&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Download .gitignore files from the GitHub gitignore repository!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/larien/learn-go-with-tests&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/29347337?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;larien/learn-go-with-tests&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tradução do livro de @quii sobre aprender Go com desenvolvimento orientado a testes&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prest&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/30427128?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prest&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;pREST is a way to serve a RESTful API from any databases written in Go&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/robertoduessmann/weather-api&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/9089383?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;robertoduessmann/weather-api&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A RESTful API to check the weather&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rodrigo-brito/gocity&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/44341229?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rodrigo-brito/gocity&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Code City metaphor for visualizing Go source code in 3D&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rumlang/rum&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/33993589?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rumlang/rum&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Functional language, easily extensible and possible (Lua features with LISP syntax and functional) to be embarked on software Go!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; JavaScript &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/Coderockr/vitrine-social&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/846756?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Coderockr/vitrine-social&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O classificado de doações&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/MinisterioPublicoRJ/inloco&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/27096918?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;MinisterioPublicoRJ/inloco&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A Geographic Information System (GIS) used by Ministério Público do Estado do Rio de Janeiro to show social, institutional and administrative data , based on React and Leaflet, interacting with a GeoServer back-end. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/RocketChat/Rocket.Chat&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12508788?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;RocketChat/Rocket.Chat&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The ultimate Free Open Source Solution for team communications.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/UFERSA-Vai-de-Bike/ufersavdbAPI&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/37310309?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;UFERSA-Vai-de-Bike/ufersavdbAPI&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API em ExpressJS que servirá de backend para o sistema UFERSA Vai de Bike&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alexanmtz/material-sense&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/88840?s=60&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alexanmtz/material-sense&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A full simple application for react material ui&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/eguatech/egua&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/54448514?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;eguatech/egua&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem de Programação Egua&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/doom-fire-algorithm&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/4248081?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/doom-fire-algorithm&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Playground for the fire effect from DOOM. Really simple algorithm and all experiments are welcome!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/video-maker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/4248081?v=4&amp;amp;size=200&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/video-maker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto open source para fazer vídeos automatizados.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/monumentum/astronode&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/32710755?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;monumentum/astronode&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Exporting mongoose model as rest endpoints&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mvfsillva/dialetus-service&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/4579340?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mvfsillva/dialetus-service&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API to Informal dictionary for the idiomatic expressions that each Brazilian region It has&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-FilaDaCreche&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-FilaDaCreche&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rafaelcastrocouto/foda&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/422159?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rafaelcastrocouto/foda&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;You are at FODA source code. Play now for free https://foda.app&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/origami.js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/origami.js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Powerful and Lightweight Library to create using HTML5 Canvas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/react-ape&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/react-ape&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;• [Work in Progress] React Renderer to build UI interfaces using canvas/WebGL&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/react-tv&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/react-tv&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;[Looking for maintainers] React development for TVs (Renderer for low memory applications and Packager for TVs) &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/klefki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/klefki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple substitution cipher module. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/redis-session-storage&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/redis-session-storage&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Node App Storage sessions with redis.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/simonardejr/matador-de-monstros&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3685303?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;simonardejr/matador-de-monstros&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Minigame feito em Vue&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/thamara/time-to-leave&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/846063?s=120&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;thamara/time-to-leave&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Log work hours and get notified when it&apos;s time to leave the office and start to live.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/withmoney/withmoney-api&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/44231290?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;withmoney/withmoney-api&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A Server Restfull in express to financial control.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/withmoney/withmoney-mobile&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/44231290?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;withmoney/withmoney-mobile&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;This is a mobile project for financial management, with vue.js.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/yanmagale/narigajs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/5148042?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;yanmagale/narigajs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; WIP. A node module that reports about air quality in a region&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zenorocha/clipboard.js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/398893?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zenorocha/clipboard.js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Modern copy to clipboard. No Flash. Just 3kb gzipped.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zeucxb/dymock&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/11702749?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zeucxb/dymock&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A CLI to simplify the way you create dynamics mocks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/fga-eps-mds/2020-1-Ziguen&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/45334248?s=400&amp;amp;u=59b7a1d202d38bd1c07a946fb08b5bf10f780e83&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ziguen/back_end/nodejs/postgres&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The ZIGUEN tool aims to facilitate integration between users of river transport.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Julia &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JSONWebTokens.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JSONWebTokens.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Secure your Julia APIs with JWT. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JuliaPackageWithRustDep.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JuliaPackageWithRustDep.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Example of a Julia Package with Rust dependency.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/Mongoc.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/Mongoc.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;MongoDB driver for the Julia Language &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Kotlin &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/ftwfy&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/ftwfy&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The real life Command/Ctrl + F - Android App that uses the Mobile Vision API to allow you to search for any occurrence of a text using your camera&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/lmgtfyGen&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/lmgtfyGen&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Lmgtfy Generator Open Source Android App - built to learn Kotlin, MVP architecture, Dagger and Rx&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; PHP &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PHPJasper/phpjasper&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/27956258?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PHPJasper/phpjasper&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A PHP report generator &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/RamonSilva20/mapos&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12385697?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;RamonSilva20/mapos&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Sistema de Controle de Ordens de Serviço&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/hmac&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10817238?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/hmac&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;HMAC (Hash-based Message Authentication Code) in PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/caronae/caronae-backend&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/23268466?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;caronae/caronae-backend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Backend do Caronaê, app open-source de caronas usado por mais de 15 mil alunos da UFRJ&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/comuREDE/core&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/14811323?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;comuREDE/core&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Back e frontend com sensor autônomo / Back and frontend with standalone sensor &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/corcel/corcel&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://camo.githubusercontent.com/6cfc6b23889643f4438a4da4ab4de7398da9337f/68747470733a2f2f692e696d6775722e636f6d2f66484d717754462e706e67&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;corcel/corcel&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A collection of Model classes that allows you to get data directly from a WordPress database.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/laraerp/laraerp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10065592?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;laraerp/laraerp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ERP brasileiro de código fonte aberto escrito em PHP utilizando o Laravel Framework&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/openboleto/openboleto&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/33834590?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;openboleto/openboleto&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Biblioteca para geração de boletos bancários em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/paulohenriquenj/crudificator&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1184825?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;paulohenriquenj/crudificator&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Gerador de Cruds em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/portabilis/i-educar&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/721282?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;portabilis/i-educar&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Lançando o maior software livre de educação do Brasil!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Pearl &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GouveaHeitor/nipe&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/10741284?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GouveaHeitor/nipe&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Nipe is a script to make Tor Network your default gateway.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Python &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DadosAbertosDeFeira/analises&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/57175538?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DadosAbertosDeFeira/analises&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para abrigar as análises dos Dados Abertos de Feira. A coleta é feita pela Maria Quitéria.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/DadosAbertosDeFeira/maria-quiteria&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/57175538?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;DadosAbertosDeFeira/maria-quiteria&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um projeto para libertar dados do município de Feira de Santana.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GabrielRF/RastreioBot&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/7331540?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GabrielRF/RastreioBot&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Telegram Bot @RastreioBot &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/JVictorDias/Dinossauro-Google&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars.githubusercontent.com/u/32246598?v=4&amp;amp;size=200&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;JVictorDias/Dinossauro-Google&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto onde várias Redes Neurais competem para aprender a jogar o jogo do dinossauro no navegador Google Chrome.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/Liebelts/Gordura_Simulator&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/42952107?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Liebelts/Gordura_Simulator&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um jogo de gordura sendo feito no Python 3. Envie bugs e ideias.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/allisson/python-simple-rest-client&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/5202?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;allisson/python-simple-rest-client&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple REST client for python 3.5+ &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/mre&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10817238?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/maker-regular-expressions&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório de um pacote simples para fazer expressões regulares em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/python-adt-extension&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10817238?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/python-adt-extension&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python abstract data structure (ADT) extension.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/validate-docbr&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/10817238?s=60&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/validate-docbr&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Pacote Python para validação de documentos brasileiros.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anapaulagomes/looong&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1899950?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anapaulagomes/looong&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Discovery of Long Parameter List &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anapaulagomes/pytest-picked&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1899950?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anapaulagomes/pytest-picked&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Run the tests related to the changed files (according to Git)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ayr-ton/kamu&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1090517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ayr-ton/kamu&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;You favorite book library&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/berinhard/pyp5js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/238223?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;berinhard/pyp5js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python to P5.js Transcriptor&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cobrateam/splinter&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/403905?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cobrateam/splinter&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;splinter - python test framework for web applications&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/sentry-patrol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/sentry-patrol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Command line interface for Sentry API &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/tapioca-jarbas&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/tapioca-jarbas&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tapioca wrapper for jarbas api &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/georgeyk/loafer&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/247603?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;georgeyk/loafer&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Asynchronous message dispatcher - Currently using asyncio and amazon SQS&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gilsondev/django-rest-localflavor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/265653?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gilsondev/django-rest-localflavor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Country-specific Django helpers, to use in Django Rest Framework &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/grupyrn/jararaca&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6994159?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;grupyrn/jararaca&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;GruPy-RN Event and Check-in System&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/internetlab-br/Twitter-Bots&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/40776372?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;internetlab-br/Twitter-Bots&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos utilizados para pesquisar sobre bots em perfis do Twitter &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/italomaia/flask-empty&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/14670?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;italo-maia/flask-empty&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An empty project skeleton / boilerplate for flask projects. Powered by CookieCutter. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/caipyra&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6595551?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jtemporal/caipyra&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;import caipyra module code&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/juditecypreste/PyRoles&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/36239583?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;juditecypreste/PyRoles&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Este é um bot no Telegram que faz upload automático de todas as fotos dos rolês que rolaram durante a PyBR!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lamenezes/simple-model&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3208493?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lamenezes/simple-model&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;data handling made easy &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luanfonceca/speakerfight&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1490875?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luanfonceca/speakerfight&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The Easier way to choose the best talks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/manipuladordedados/pdiary&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1189862?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;manipuladordedados/pdiary&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A simple terminal-based diary journal application written in Python. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mari-linhares/tensorflow-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/8157164?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mari-linhares/tensorflow-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos e materiais sobre TensorFlow em Português &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/odufrn/odufrn-api-py&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/52975911?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;odufrn/odufrn-api-py&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Wrapper da API da UFRN em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/serenata-de-amor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/serenata-de-amor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🕵 Artificial Intelligence for social control of public administration&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/osantana/dicteval&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/160418?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;osantana/dicteval&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Evaluate expressions in dict/json objects&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/plenario/plenario&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/30255828?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;plenario/plenario&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-API&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-API&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Editor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Editor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; Plataforma de edição de cardápios da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pyladies-brazil/br-pyladies-pelican&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/8205116?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pyladies-brazil/br-pyladies-pelican&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site PyLadies Brasil usando Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/associados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/associados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Controle de associados a Associação PythonBrasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/planet&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/planet&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repo público para atualização da lista de sites do Planet PythonBrasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/wiki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/wiki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site python.org.br estático com Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rougeth/bottery&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/431892?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rougeth/bottery&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A bot framework with batteries included &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/thaisviana/AlgPedia&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1753143?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;thaisviana/AlgPedia&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto Final da Thata e do Tchotcho &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Ruby &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anonydog/anonydog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24738062?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anonydog/anonydog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;On the internet, nobody knows you&apos;re a dog &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/campuscode/rails-guides-pt-BR&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/10028214?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;campuscode/guia-rails-pt-br&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tradução do guia oficial de Ruby on Rails para pt-BR&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/juuh42dias/transervicos&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1828204?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;juuh42dias/transervicos&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Plataforma de empregos para pessoas Trans.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/magnetis/spok&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1625659?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;magnetis/spok&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Gem for dealing with workdays and restdays in an easy way. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/railsgirls/guides-ptbr&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1641104?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;railsgirls/guides-ptbr&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Rails Girls Guides - Brazilian Portuguese / Tutoriais Rails Girls - Português Brasileiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Scala &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/potigol/potigol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1438144?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;potigol/potigol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem Potigol - Linguagem de programação funcional moderna para iniciantes - A Functional Programming Language for Beginners &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Shell &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/hemilioaraujo/Linux-Commands&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/28680369?s=400&amp;amp;u=547852267ebf487736da8ded44c916c53d1d37f4&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;hemilioaraujo/Linux-Commands&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Um conjunto de comandos para terminal Linux.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-plataforma-curriculo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-plataforma-curriculo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Swift &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/caronae/caronae-ios&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/23268466?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;caronae/caronae-ios&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Aplicativo do Caronaê para iOS &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; TypeScript &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/Rocketseat/unform&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/Rocketseat/unform/master/.github/assets/logo.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Rocketseat/unform&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ReactJS form library to create uncontrolled form structures with nested fields, validations and much more!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brazilian-utils/brazilian-utils&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40146460?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brazilian-utils/brazilian-utils&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Utils library for specific Brazilian businesses&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/doczjs/docz&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/39714731?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;doczjs/docz&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;✍🏻It has never been so easy to document your things!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Frontend&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Website que permite à população acompanhar o cardápio das escolas públicas de São Paulo.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Variados &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/CollabCodeTech/backend-challenges&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/28174963?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;CollabCodeTech/backend-challenges&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A public list of open-source challenges from jobs around the world&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pizzadedados/pizzadedados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/40184305?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/PizzaDeDados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório do podcast Pizza de Dados - O podcast Brasileiro sobre ciência de dados&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PizzaDeDados/datascience-pizza&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40184305?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/datascience-pizza&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para juntar informações sobre materiais de estudo em análise de dados e áreas afins, empresas que trabalham com dados e dicionário de conceitos&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/VacaRoxa/gamedev4noobs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/36037965?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Vacaroxa/GameDev4Noobs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O propósito desse repositório, além de contribuir para o projeto 4noobs, é ensinar o básico do desenvolvimento de jogos para iniciantes e democratizar o conhecimento nesta área. Apresentando boas práticas e insumos para criar games incríveis.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/bellesamways/studynotes&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/38008212?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;bellesamways/studynotes&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para armazenar todas as anotações de cursos feitos para minha própria consulta ou de outros.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brasil-php/blog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/17454678?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brasil-php/blog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para agregar posts do grupo do Telegram&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/codamos/codamos.github.io/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/16601405?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;codamos/codamos.github.io&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para o site Codamos, que reune eventos, palestras, workshops etc pelo Brasil inteiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipefialho/frontend-challenges&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/3603793?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipefialho/frontend-challenges&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Listing some playful open-source&apos;s challenges of jobs to test your knowledge&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jonatasbaldin/python-community-map&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/8570364?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jonatasbaldin/python-community-map&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A map full of lovely Python communities&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ocarneiro/para-entender-a-internet&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/2953926?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ocarneiro/para-entender-a-internet&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Videos e memes obrigatórios para conversas do dia-a-dia &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/react-brasil/empresas-que-usam-react-no-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16929016?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;react-brasil/empresas-que-usam-react-no-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório que mostra empresas e projetos que utilizam React no Brasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; ADVPL &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/walterfcarvalho/advpl-xlsxtocsv&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/11591494?s=460&amp;amp;u=41649eaf2caa648c59d2fcb157f573c3f210ad79&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;walterfcarvalho/advpl-xlsxtocsv&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Once the language ADVPL doen&apos;t have a tool to read xlsx files directly, I did this source to unable the user read and convert one xlsx file to an array&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

</description>
        <pubDate>Thu, 01 Oct 2020 09:00:00 +0000</pubDate>
        <link>https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2020/</link>
        <guid isPermaLink="true">https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-2020/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contribuitions</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Trabalhando remoto</title>
        <description>&lt;p&gt;Eu já trabalhei remotamente e presencialmente durante anos e posso dizer que criar novos hábitos e deixar para trás os antigos é a parte mais difícil de qualquer processo de adaptação. Infelizmente períodos de crise, como a pandemia que estamos vivendo agora, pedem que façamos mais esforços para continuarmos sendo pessoas producentes na medida do possível.&lt;/p&gt;

&lt;center&gt;
&lt;iframe src=&quot;https://giphy.com/embed/ZdU3bTTc1WWStZM5lm&quot; width=&quot;50%&quot; height=&quot;340&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;Não vou te dizer que existe uma receita mágica para montar o seu home office e trabalhar no modo de fúria de todos os dias, mas existem processos que podem te ajudar a cada dia que passa se encontrar mais confortável numa rotina nova. Então vou compartilhar aqui as dicas que sigo e me ajudam a trabalhar remotamente.&lt;/p&gt;

&lt;h3 id=&quot;rotina&quot;&gt;Rotina&lt;/h3&gt;

&lt;p&gt;Essa palavra é a chave para um home office bem aproveitado. Principalmente para pessoas que trabalham fora de casa, é comum quando estão em casa quererem curtir o sofá ou cama &lt;em&gt;largadonas&lt;/em&gt; de pijama. Esse hábito é o que te faz mais lenta e tira sua mente do foco, seja ele trabalhar ou estudar ou até praticar um instrumento.&lt;/p&gt;

&lt;p&gt;Eu não sou uma dessas pessoas que acorda pulando de alegria pelas manhãs, mas tento seguir a regra de acordar, tomar café e sair do pijama. Esse formato de início de dia me ajuda a colocar o meu corpo e cérebro na mentalidade correta para o trabalho. Talvez pra você o ritual matutino seja um pouco diferente e tudo bem, faça o que você preferir desde que você consiga estabelecer uma rotina e lembrando sempre que novos hábitos não se criam da noite pro dia.&lt;/p&gt;

&lt;h3 id=&quot;divisão-de-espaços&quot;&gt;Divisão de espaços&lt;/h3&gt;

&lt;p&gt;Antigamente, quanto eu trabalhava e dormia no mesmo quarto, eu tinha uma mesa onde eu trabalhava e cama onde dormia, e essa divisão, somada a rotina de sair do pijama, era a minha divisão espacial entre trabalho e lazer.&lt;/p&gt;

&lt;p&gt;Hoje eu tenho a sorte de morar num apartamento com dois quartos onde um deles é o escritório e o outro o quarto em que durmo. Essa mudança de espaço também ajuda a colocar o cérebro no lugar, por mais incrível que pareça, ter uma divisão de ambientes entre trabalho e lazer dentro de casa ajuda imensamente o seu corpo a se comportar como se estivesse no trabalho. Mesmo que você não tenha dois cômodos como é o meu caso, faça a divisão da melhor forma possível. E dica de ergonomia: evite trabalhar do sofá, isso vai prejudicar a sua coluna e o seu pescoço.&lt;/p&gt;

&lt;p&gt;Ter essa separação também vai te ajudar a parar de trabalhar no fim do seu dia. Quando se vai ao escritório, é fácil encerrar o trabalho, basta sair do escritório e ir pra casa, mas quando se trabalha de casa essa separação é mais difícil então é importante definir os limites tanto de horários para começar a trabalhar quanto para terminar o seu dia.&lt;/p&gt;

&lt;h3 id=&quot;faça-pausas&quot;&gt;Faça pausas&lt;/h3&gt;

&lt;p&gt;Para mim é bem comum esquecer do tempo e ficar horas grudada no computador ajustando ETL e disparando treinos de modelos, principalmente se eu estiver bem focada. No fim do dia, quando faço isso por muitas horas seguidas, eu me sinto exausta e sem energias para curtir o mozão ou a minha série do momento. Uma coisa que aprendi para ajudar nesse ponto e evitar a exaustão é me forçar a fazer pausas algumas vezes no dia.&lt;/p&gt;

&lt;center&gt;
&lt;iframe src=&quot;https://giphy.com/embed/cvmugq5cuJ4nC&quot; width=&quot;50%&quot; height=&quot;204&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;

&lt;p&gt;Levantar para um xixi, tomar um café, comer um biscoito ou até mesmo tomar água. Se você estivesse no escritório já faria tudo isso e ainda conversaria com colegas, então lembre-se de praticar pausas no seu dia. Quem sabe até aproveite para tomar um banho rápido depois daquela longa e tensa reunião. Lembre-se, você está trabalhando e o objetivo é fazer o dia render, fazer pausas ajuda o cérebro a descansar e ainda a trabalhar no plano de fundo naquele bug que você está tentando resolver há horas.&lt;/p&gt;

&lt;h3 id=&quot;use-e-abuse-de-videoconferências&quot;&gt;Use e abuse de videoconferências&lt;/h3&gt;

&lt;p&gt;Sabemos que ter uma comunicação efetiva entre pessoas e times já é uma tarefa difícil normalmente mesmo estando todas as pessoas trabalhando ao mesmo tempo uma do ladinho das outras, agora imagina mover essa conversa para ferramentas de texto?&lt;/p&gt;

&lt;p&gt;Uma coisa nesses anos notei é que temos, em geral, uma comunicação por texto muito mais falha do que quando conversamos pessoalmente. Não damos contexto do que estamos falando, escrevemos sem pensar, enviamos mensagens sem revisar o que escrevemos antes de enviar, lemos o que nos foi enviado com pouca atenção e assumimos um tom geralmente errado no que a pessoa escreveu.&lt;/p&gt;

&lt;p&gt;Por isso, e especialmente nesse momento, é uma ótima oportunidade para usar as ferramentas de videoconferência que existem por aí. A maioria das empresas já possuem ferramentas padrão para isso, mas vou deixar aqui algumas dicas caso esse seja um mundo totalmente novo para você:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://zoom.us&quot;&gt;Zoom.us&lt;/a&gt;: Aplicativo de videoconferência, na versão gratuita suporta chamadas com mais de duas pessoas durante 40 minutos, na versão paga a duração das chamadas é ilimitada;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://hangouts.google.com&quot;&gt;hangouts.google.com&lt;/a&gt;: aplicativo web de videoconferência do Google, basta ter uma conta do Google para gerar as salas de videoconferência e enviar o link de convite para qualquer pessoa com limitação de 10 participantes por chamada;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://Whereby.com&quot;&gt;Whereby.com&lt;/a&gt; (antigo appear.in): aplicativo web de videoconferência você pode criar a sua própria sala e bloquear ou permitir a entrada de novas pessoas, limitado a 4 pessoas por chamada na versão gratuita;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://Discordapp.com&quot;&gt;Discordapp.com&lt;/a&gt;: aplicativo de conferência por voz, você pode criar o seu canal e permitir a entrada de quantas pessoas quiser, muito usado para jogos, consome pouca banda e não possui limitações de pessoas nos canais de voz.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas lembre-se de registrar o que foi conversado por texto para as demais pessoas interessadas. Nesses momentos de formalização de conversas eu tento seguir três passos:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Contexto:&lt;/strong&gt; o que foi discutido e qual a necessidade dessa conversa;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;O que foi decidido:&lt;/strong&gt; vamos agir de forma A, B ou C;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Responsabilidades:&lt;/strong&gt; o que eu vou fazer e o que outras pessoas vão fazer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Assim fica claro o que foi conversado, e os papeis de todas as pessoas na conversa.&lt;/p&gt;

&lt;h3 id=&quot;elimine-distrações&quot;&gt;Elimine distrações&lt;/h3&gt;

&lt;p&gt;Sabemos que não está fácil esquecer tudo que está acontecendo a nossa volta e focar no trabalho. Muitos de nós estão trabalhando de casa, em lugares com cadeiras ruins, mesas pequenas, em ambientes não silenciosos, com nossos filhos e filhas confinados em espaços pequenos e tendo que cuidar de nossos familiares, essas condições são bem menos do que ideais para trabalhar. E apenas falar “elimine distrações” não é o suficiente para magicamente fazer todas essas coisas desaparecerem.&lt;/p&gt;

&lt;center&gt;
&lt;iframe src=&quot;https://giphy.com/embed/VHl0ajQWjOF2NYHB02&quot; width=&quot;50%&quot; height=&quot;234&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;Nesse momento, é importante lembrar que você não precisa estar focada e rendendo durante todas as horas do dia, talvez você consiga terminar a sua tarefa em menos tempo do que imagina. Nesses dias, onde o foco está ruim, eu me apego no &lt;a href=&quot;https://pt.wikipedia.org/wiki/T%C3%A9cnica_pomodoro&quot;&gt;método Pomodoro&lt;/a&gt;, para tentar ter alguns momentos de foco. Esse método consiste em períodos curtos de trabalho focado com intervalos curtos pré-definidos e quando eu não consigo concentrar em nada, geralmente o Pomodoro me salva e eu consigo terminar o dia com a sensação de fiz algo mesmo que esse algo seja um Pomodoro.&lt;/p&gt;

&lt;h3 id=&quot;tempo-livre&quot;&gt;Tempo “livre”&lt;/h3&gt;

&lt;p&gt;Agora você não tem mais que ir para o escritório e isso vai ter dar um tempinho “de sobra” no seu dia e para mim essa é uma das maiores vantagens de trabalhar remotamente. Então, se puder, aproveite esse tempo disponível para fazer coisas novas, esse é um período muito bom para tirar a poeira daquele violão que você comprou e nunca aprendeu a tocar, de terminar aquele projeto de tricô, brincar mais com seus filhos e filhas, de praticar yoga na sala, ou até mesmo de fazer nada e curtir um seriado. O importante é lembrar de ter tempo de lazer mesmo que seja limitado às paredes de casa.&lt;/p&gt;

&lt;center&gt;
&lt;iframe src=&quot;https://giphy.com/embed/DGfhSy8xKKbHq&quot; width=&quot;480&quot; height=&quot;271&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;

&lt;p&gt;Por fim lembre-se de manter a segurança, evitar aglomerações e lavar bem as mãos com frequência. Vamos tentar manter o mínimo de sanidade nessa época difícil… E se você estiver precisando de companhia pra um cafézinho virtual manda um alô pra mim ou pra aquela amiga ou amigo e tenta fazer uma &lt;em&gt;videoconf&lt;/em&gt;. Seres humanos gostam de viver em sociedade, então vamos nos apoiar mesmo que à distância 😉&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;dicas-e-leituras-extras&quot;&gt;Dicas e leituras extras&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://danielmurta.jusbrasil.com.br/artigos/824228394/voce-nao-precisa-ter-medo-de-trabalhar-de-casa-ou-a-distancia&quot;&gt;O post feito pelo Coxa do JusBrasil, uma empresa que tem trabalho remoto e escritório silencioso com várias dicas e ideias&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://toggl.com/&quot;&gt;Toggl: Ferramenta gratuita de contagem de tempo com cronometro para Pomodoro incluído&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.officeless.cc/materiais&quot;&gt;Materiais da Officeless sobre trabalho remoto&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PS.: se souber algum material legal em Português manda que eu adiciono aqui 🙂&lt;/p&gt;
</description>
        <pubDate>Thu, 26 Mar 2020 14:55:46 +0000</pubDate>
        <link>https://jtemporal.com/trabalhando-remoto/</link>
        <guid isPermaLink="true">https://jtemporal.com/trabalhando-remoto/</guid>
        
        <category>dicas de trabalho</category>
        
        <category>trabalho remoto</category>
        
        <category>remoto</category>
        
        <category>covid</category>
        
        <category>Corona Virus</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Working remotely</title>
        <description>&lt;p&gt;I have worked remotely and allocated for years now, and I can say that creating new habits and leaving old ones behind is the most challenging part of any adaptation process. Unfortunately, in periods of crisis, such as the pandemic we are experiencing right now, it is essential to make more efforts to remain as productive as possible.&lt;/p&gt;

&lt;center&gt;
&lt;iframe src=&quot;https://giphy.com/embed/ZdU3bTTc1WWStZM5lm&quot; width=&quot;50%&quot; height=&quot;340&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;I am not going to tell you that there is a magic recipe for setting up your home office and working in your everyday-beast-mode, but there are processes that can help you find yourself more comfortable in a new routine with each passing day. So I’m going to share here the tips I follow and help me work remotely.&lt;/p&gt;

&lt;h3 id=&quot;routine&quot;&gt;Routine&lt;/h3&gt;

&lt;p&gt;Routine is the key to a well-executed home office. Especially for people who work outside their homes, it is common when they are at home to want to enjoy the couch or bed in pajamas. This habit is what slows you down and takes your mind off focus, whether it’s working or studying or even practicing an instrument.&lt;/p&gt;

&lt;p&gt;I am not one of those people who wake up joy-jumping in the mornings, but I try to follow the rule of waking up, drinking coffee, and getting out of my pajamas. This early-day format helps me put my body and brain in the right mindset for the job. Maybe for you, the morning ritual is a little different, and that’s okay. Do what you prefer as long as you can establish a routine and always remembering that new habits are not created overnight.&lt;/p&gt;

&lt;h3 id=&quot;separation-of-spaces&quot;&gt;Separation of spaces&lt;/h3&gt;

&lt;p&gt;In the past, when I worked and slept in the same room, I had a table where I worked and a bed where I slept, and this distinction, added to the routine of getting out of my pajamas, was my spatial division between work and leisure.&lt;/p&gt;

&lt;p&gt;Today I am fortunate to live in an apartment with two rooms where one is the office and the other in which I sleep. This change in physical space also helps to put the brain in the correct mindset, as incredible as it may seem, having a division of environments between work and leisure at home helps your body to behave as if you were at work. Even if you don’t have two rooms like me, make the distinction as best as possible. And ergonomics tip: avoid working from the couch, this will damage your spine and your neck.&lt;/p&gt;

&lt;p&gt;Having this separation will also help you to stop working at the end of your day. When you go to the office, it is easy to finish work, just leave the office and go home, but when working from home, this separation is even more difficult, so it is vital to define the limits of both hours to start work and to finish your day.&lt;/p&gt;

&lt;h3 id=&quot;take-breaks&quot;&gt;Take breaks&lt;/h3&gt;

&lt;p&gt;For me, it is quite common to forget about the clock and stay glued to the computer for hours adjusting ETLs and triggering model training, especially if I am “in the zone”.  When I work for many hours in a row, I feel exhausted and without the energy to anything else afterward. One thing I learned that helps avoid exhaustion is to force myself to take breaks a few times a day.&lt;/p&gt;

&lt;center&gt;
&lt;iframe src=&quot;https://giphy.com/embed/cvmugq5cuJ4nC&quot; width=&quot;50%&quot; height=&quot;204&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;

&lt;p&gt;Get up to have a coffee, do a bathroom break, eat a cookie, or even drink water. If you were in the office, you would do all this and probably talk to colleagues, so remember to practice breaks in your day at home too. Maybe even take a quick shower after that long and tense meeting.  Remember, you are working, and the goal is to make the day pay off, taking breaks helps your brain to rest and still work in the background on that bug that you have been trying to solve for hours.&lt;/p&gt;

&lt;h3 id=&quot;videoconferencing-for-the-win&quot;&gt;Videoconferencing for the win&lt;/h3&gt;

&lt;p&gt;We know that having effective communication between different people and teams is already a difficult task when we are all working at the same time side by side, now imagine moving this conversation to text tools?&lt;/p&gt;

&lt;p&gt;One thing I noticed is that in all of these working years, is that in general, text communication is much more flawed than when we talk in person. We do not give context regarding what we are talking about. We write without thinking, we send messages without reviewing what we write before sending, we read what was sent to us with little attention, and we usually assume a wrong tone in what the person wrote.&lt;/p&gt;

&lt;p&gt;So, and especially at this moment, it is an excellent opportunity to use the videoconferencing tools out there. Most companies already have standard tools for this, but here are some tips if videoconferencing is a whole new world for you:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://zoom.us&quot;&gt;Zoom.us&lt;/a&gt;: Videoconferencing application, in the free version, supports calls with more than two people for 40 minutes, in the paid version the duration of calls is unlimited;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://hangouts.google.com&quot;&gt;hangouts.google.com&lt;/a&gt;: Google’s video conferencing web application, all you need is a Google account to generate the video conference rooms and send the invitation link to anyone with a limit of 10 participants per call;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://whereby.com&quot;&gt;Whereby.com&lt;/a&gt; (formerly appear.in): videoconferencing web application, you can create your own room and block or allow the entry of new people, limited to 4 people per call in the free version;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://discordapp.com&quot;&gt;Discordapp.com&lt;/a&gt;: voice conferencing application, you can create your channel and allow as many people as you want to join, widely used for games, consumes little bandwidth, and has no amount of people limitation on voice channels.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Afterward, remember to record what was spoken by text to other interested parties. In these moments of formalizing conversations, I try to follow three steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Context:&lt;/strong&gt; what was discussed and the need for this conversation;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;What was decided:&lt;/strong&gt; we will act in A, B or C way;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Responsibilities:&lt;/strong&gt; what I’m going to do and what other people are going to do.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This makes it clear what was talked about, and the roles of everyone in the conversation are.&lt;/p&gt;

&lt;h3 id=&quot;eliminate-distractions&quot;&gt;Eliminate distractions&lt;/h3&gt;

&lt;p&gt;We know that it is not easy to forget everything that is happening around us and focus on work. Many of us are working from home, in places with bad chairs, small tables, in noisy environments, with our children confined in small spaces and having to take care of our family, these conditions are far less than ideal for work. And just saying &lt;em&gt;“eliminate distractions”&lt;/em&gt; is not enough to magically make all those things disappear.&lt;/p&gt;

&lt;center&gt;
&lt;iframe src=&quot;https://giphy.com/embed/VHl0ajQWjOF2NYHB02&quot; width=&quot;50%&quot; height=&quot;234&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;At this point, it is necessary to remember that you do not need to be focused and performing during all hours of the day, you may be able to finish your task in less time than you think. In those days, when focusing is not happening, I stick to &lt;a href=&quot;https://en.wikipedia.org/wiki/Pomodoro_Technique&quot;&gt;the Pomodoro method&lt;/a&gt;, to try to have some moments of focus. This method consists of short periods of focused work with short predefined intervals. When I can’t concentrate on anything, generally, the Pomodoro saves me, and I manage to end the day with the feeling that I did something even if that something is &lt;em&gt;one&lt;/em&gt; Pomodoro.&lt;/p&gt;

&lt;h3 id=&quot;free-time&quot;&gt;“Free time”&lt;/h3&gt;

&lt;p&gt;Now you don’t have to go to the office anymore. There’s no commute time anymore, and this will give you a little time to spare in your day, and for me, this is one of the most significant advantages of working remotely. So, if you can, take the time available to do new things. This is a perfect time to dust off that guitar that you bought and never learned to play, to finish that knitting project, to play more with your kids, to practice yoga in the living room, or maybe to do nothing and enjoy that recently launched series. The important thing here is to have relaxation time, even if it is limited to the walls of the house.&lt;/p&gt;

&lt;center&gt;
&lt;iframe src=&quot;https://giphy.com/embed/DGfhSy8xKKbHq&quot; width=&quot;480&quot; height=&quot;271&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;

&lt;p&gt;Finally, remember to keep safe, avoid crowds, and wash your hands frequently. Let’s try to maintain the minimum sanity in this challenging time, shall we? And if you need a company for a virtual coffee, send me a hello or that friend or friend and try to make a &lt;em&gt;videoconference&lt;/em&gt;. Human beings like to live in society, so we let’s support each other even at a distance 😉&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;extra-tips-and-readings&quot;&gt;Extra tips and readings&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://zapier.com/learn/remote-work/&quot;&gt;Zapier’s Guide to working remotely&lt;/a&gt;, there’s a lot of material on this page;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://translate.googleusercontent.com/translate_c?depth=1&amp;amp;rurl=translate.google.com&amp;amp;sl=pt&amp;amp;sp=nmt4&amp;amp;tl=en&amp;amp;u=https://jtemporal.com/trabalhando-remoto/toggl.com/&amp;amp;usg=ALkJrhi3zzzYVvFSkHylEP5V5Vqj8nNbxw&quot;&gt;Toggl: Free timekeeping tool with timer for Pomodoro included&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PS .: if you know some material about remote work not listed here, put it in the comments below. 🙂&lt;/p&gt;
</description>
        <pubDate>Thu, 26 Mar 2020 14:50:00 +0000</pubDate>
        <link>https://jtemporal.com/working-remotely/</link>
        <guid isPermaLink="true">https://jtemporal.com/working-remotely/</guid>
        
        <category>english</category>
        
        <category>work tips</category>
        
        <category>remote work</category>
        
        <category>remote</category>
        
        <category>covid</category>
        
        <category>Corona Virus</category>
        
        
      </item>
    
      <item>
        <title>Fixing date error while running jekyll on macOS Catalina </title>
        <description>&lt;p&gt;If you were following the “&lt;a href=&quot;https://jtemporal.com/publishing-a-website-with-jekyll/&quot;&gt;Publishing your own website with Jekyll&lt;/a&gt;” on macOS Catalina, after running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle exec jekyll serve&lt;/code&gt; you may have run into this error:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/invalid_date_macos_catalina.png&quot; alt=&quot;image showing the invalid date error on the terminal&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The solution is quite simple although it may not be trivial if it is your first time doing this. In this pro-tip, I’ll show you how to fix this error so you can continue blogging 😉&lt;/p&gt;

&lt;p&gt;If you run into this error it probably means that the Jekyll version you are using on your project may be incompatible with the ruby version in your machine, to fix that we will need to upgrade your project’s jekyll version.&lt;/p&gt;

&lt;p&gt;First things first, remove the vendor generated in the previous bundle install, remember to adjust your vendor path accordingly:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ rm -rf vendor/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After that, you’ll need to remove your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gemfile.lock&lt;/code&gt;, this file locks the version of your gems, and it is automatically generated by bundle when you install your gems. Since we want to update Jekyll’s version, this file will get in the way forbidding us from installing a higher version. So just go ahead and remove it:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ rm Gemfile.lock
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now go to your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt; and upgrade the version to the new one. Fresh was running on Jekyll version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.4.3&lt;/code&gt; as &lt;a href=&quot;https://github.com/artemsheludko/fresh/blob/3395a9f3c5988d43fe4143510ec49d405a8d0928/Gemfile#L4&quot;&gt;you can see here&lt;/a&gt;, the most recent Jekyll version available is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4.0.0&lt;/code&gt;. To update the version open the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt; on your favorite editor, find the line where Jekyll version is set and update the version value, it should look like this afterward:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem &quot;jekyll&quot;, &quot;4.0.0&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now all you have to do is reinstall everything and run the Jekyll server:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ bundle install
$ bundle exec jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And you should see something like this on your terminal:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/Screen Shot 2020-02-25 at 13.21.24.png&quot; alt=&quot;terminal message after fix&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And now you are good to go! Happy blogging 🎉&lt;/p&gt;
</description>
        <pubDate>Tue, 25 Feb 2020 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/fixing-date-error-while-running-jekyll-on-macos-catalina/</link>
        <guid isPermaLink="true">https://jtemporal.com/fixing-date-error-while-running-jekyll-on-macos-catalina/</guid>
        
        <category>error</category>
        
        <category>Catalina</category>
        
        <category>macOS Catalina</category>
        
        <category>jekyll</category>
        
        <category>bundle</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Quem tem medo de virar cientista de dados (3/3)</title>
        <description>&lt;p&gt;Esse texto é a parte final da trilogia “Quem tem medo de virar cientista de dados?”&lt;/p&gt;

&lt;hr /&gt;

&lt;center&gt;
&lt;img src=&quot;https://jtemporal.com/images/xp-job.png&quot; /&gt;
&lt;br /&gt;
&lt;small&gt;&lt;i&gt;&quot;Preciso de experiência para conseguir um trabalho, preciso de trabalho para conseguir experiência. — Uma história sem fim&quot; — tradução livre.&lt;/i&gt;&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;Depois de ler sobre a fase do &lt;a href=&quot;https://medium.com/databootcamp/quem-tem-medo-de-virar-cientista-de-dados-1-3-148ae98a01dd&quot;&gt;&lt;em&gt;“Será que eu vou conseguir?”&lt;/em&gt;&lt;/a&gt; e a fase do &lt;a href=&quot;https://medium.com/pizzadedados/quem-tem-medo-de-virar-cientista-de-dados-e0a32f45af1a&quot;&gt;&lt;em&gt;“Vale a pena mesmo começar a trabalhar numa área totalmente nova para mim?”&lt;/em&gt;&lt;/a&gt;, começa a cair a ficha de que não é apenas o currículo matador com formação exemplar que vai te ajudar a achar aquela vaga de Cientista de Dados que parece ter sido feita sob medida para você. Mas, ainda assim você precisa mostrar que tem competência para estar naquele cargo e confiança para encarar os desafios de cabeça erguida! A dúvida que abala até o mais confiante dos especialistas, é ainda pior para quem está mudando de área: o famoso caso de &lt;em&gt;“Com tanta gente brilhante aplicando para vaga, com anos de experiência, por que diabos vão querer me contratar?”&lt;/em&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Para continuar lendo, clica nesse botão aqui em baixo 👇&lt;/p&gt;

&lt;center&gt;
&lt;a href=&quot;https://medium.com/pizzadedados/quem-tem-medo-de-virar-cientista-de-dados-3-3-f46b118ae12a#1926&quot;&gt;
&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; /&gt;
&lt;/a&gt;
&lt;/center&gt;
</description>
        <pubDate>Wed, 29 Jan 2020 12:00:37 +0000</pubDate>
        <link>https://jtemporal.com/quem-tem-medo-de-virar-cientista-de-dados-3-3/</link>
        <guid isPermaLink="true">https://jtemporal.com/quem-tem-medo-de-virar-cientista-de-dados-3-3/</guid>
        
        <category>carreira de sucesso</category>
        
        <category>conselho de carreira</category>
        
        <category>carreira</category>
        
        <category>medium</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Who do you think of when asked for a referral?</title>
        <description>&lt;h4 id=&quot;you-know-qualified-women-why-not-appoint-them&quot;&gt;You know qualified women. Why not appoint them?&lt;/h4&gt;

&lt;hr /&gt;

&lt;p&gt;Author note: &lt;a href=&quot;https://code.likeagirl.io/em-quem-voc%C3%AA-pensa-quando-te-pedem-uma-indica%C3%A7%C3%A3o-b15e047b7759&quot;&gt;Leia este artigo em Português clicando aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article was originally posted in Portuguese at the Code Like a Girl blog linked above.&lt;/p&gt;

&lt;hr /&gt;

&lt;center&gt;
&lt;img src=&quot;https://miro.medium.com/max/3000/1*hPWHuOBEBoxpvAfqqo0bLw.jpeg&quot; alt=&quot;PyLadies at PythonBrasil 12&quot; /&gt;
&lt;br /&gt;
&lt;small&gt;&lt;i&gt;PyLadies at PythonBrasil \[12\]&lt;/i&gt;&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;I’ve given several lectures during 2017, and it has become common for people to call me to and invite me to lecture on other events, to be a hackathon mentor, to organize events, and other things in the like. Sometimes my schedule doesn’t allow me to accept the invitations as I would like, and then these people ask me the crucial question: &lt;em&gt;Could you appoint someone we could invite?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And then, I find myself scrolling through my contact list to find people who can fit the event proposal. Most of the time, the people I indicate are close to me. And that’s fine. The problem comes when ALL the indications I want to make &lt;em&gt;are men&lt;/em&gt;. And look, there are plenty of extremely qualified women on my contact list (and Telegram groups).&lt;/p&gt;

&lt;p&gt;I hadn’t given a second thought about this matter for a long time, and maybe you too may not have thought about it. After reading a lot, watching videos, and talking to people about inclusiveness, sexism, and diversity, the penny finally dropped: It’s not enough to indicate a woman, it’s also necessary to show that she is the one that has to be there.&lt;/p&gt;

&lt;center&gt;&lt;iframe src=&quot;https://www.facebook.com/plugins/video.php?href=https%3A%2F%2Fwww.facebook.com%2FMicMedia%2Fvideos%2F1651080888248028%2F&amp;amp;show_text=0&amp;amp;width=476&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;true&quot; width=&quot;476&quot; height=&quot;476&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href=&quot;https://www.facebook.com/MicMedia/videos/1651080888248028&quot;&gt;Source&lt;/a&gt;&lt;i&gt;&lt;/i&gt;&lt;/small&gt;&lt;/center&gt;

&lt;p&gt;In this video posted by Mic on their Facebook page, &lt;a href=&quot;https://twitter.com/o0karen0o&quot;&gt;Karen Sandler&lt;/a&gt; talks about sexism in the tech industry. In addition to mentioning the situations women that are attending IT events often encounter, she reports how women find it hard to consider themselves experts in their fields of work. Including herself. She was named for being a patent expert for an interview for the documentary &lt;a href=&quot;http://patentabsurdity.com/watch.html&quot;&gt;Patent Absurdity&lt;/a&gt;. Instead of accepting to being interviewed, she wanted to pass the opportunity to “people who were, in fact, experts.”&lt;/p&gt;

&lt;p&gt;Realizing this problem we women face, because yes I also go through this, I started doing two things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;I only recommend men if I spend two days non-stop looking for a qualified woman to indicate and not finding one (rare but happens &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;¯\_(ツ)_/¯&lt;/code&gt;);&lt;/li&gt;
  &lt;li&gt;Talk to the women I mentioned and prepare them: I appointed you because &lt;em&gt;you are&lt;/em&gt; the best choice for this.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I used to tell the nominee I had appointed her, and just like Karen Sandler did when she was supposed to be interviewed for the first time, my nominees always wanted to pass along the opportunity along. Saying they “weren’t an expert” or “still having a lot to learn” or “having people more qualified for the job.”&lt;/p&gt;

&lt;p&gt;Helping women who want to play a prominent role goes beyond appointing them. It involves helping them realize that they must be on that stage or in front of that camera to show what they have to offer. &lt;em&gt;Refer a woman and help her see how capable she is.&lt;/em&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 18 Dec 2019 07:00:00 +0000</pubDate>
        <link>https://jtemporal.com/who-do-you-think-of-when-asked-for-a-referral/</link>
        <guid isPermaLink="true">https://jtemporal.com/who-do-you-think-of-when-asked-for-a-referral/</guid>
        
        <category>pyladies</category>
        
        <category>women in stem</category>
        
        <category>women in tech</category>
        
        <category>Python</category>
        
        <category>career</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>A ciência de dados pode salvar um país</title>
        <description>&lt;p&gt;Mas só se você levantar o bumbum do sofá e começar a fazer sua parte&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Usualmente cientistas de dados querem resolver problemas ou responder perguntas. Seja para encontrar a cura do câncer ou para combater a corrupção, dados passam por uma sequência parecida de passos antes de se tornarem parte da solução.&lt;/p&gt;

&lt;p&gt;A ideia desse texto é explicar mostrando um caso prático (e famosinho) do uso da ciência de dados. Então, se você já manja de ciência de dados e tá precisando de inspiração pra projetos de estimação, se prepare para aprender coisas novas que você pode não saber sobre leis e dados. Esse texto também é pra você que ainda tá aprendendo e quer conhecer a dinâmica de um projeto de ciência de dados.&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://66.media.tumblr.com/tumblr_marfocdntZ1qcnyloo2_r2_500.gif&quot; /&gt;&lt;br /&gt;
&lt;small&gt;&lt;a href=&quot;https://66.media.tumblr.com/tumblr_marfocdntZ1qcnyloo2_r2_500.gif&quot;&gt;Fonte&lt;/a&gt;
&lt;/small&gt;
&lt;/center&gt;

&lt;h4 id=&quot;o-domínio&quot;&gt;O domínio&lt;/h4&gt;

&lt;p&gt;O começo de toda investigação de dados é sempre entender o domínio. Conhecer as “regras” que regem os dados. Conhecer também o dado e como ele se apresenta, ajuda os cientistas a saber que perguntas podem ser respondidas e as melhores formas de obter respostas.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Art. 5o É dever do Estado garantir o direito de acesso à informação, que será franqueada, mediante procedimentos objetivos e ágeis, de forma transparente, clara e em linguagem de fácil compreensão.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Existe uma lei que define que todos órgãos públicos brasileiros devem disponibilizar seus dados desde que isso não interfira na segurança nacional (e outras regrinhas mais). Mas de um modo geral, a &lt;a href=&quot;http://www.planalto.gov.br/ccivil_03/_ato2011-2014/2012/Decreto/D7724.htm&quot;&gt;&lt;em&gt;Lei de Acesso à Informação&lt;/em&gt;&lt;/a&gt; ou LAI como é conhecida, foi um marco para a disponibilização de dados da administração pública e aumento do controle social.&lt;/p&gt;

&lt;p&gt;Foi essa lei que ajudou por exemplo, os dados da &lt;a href=&quot;http://www2.camara.leg.br/transparencia/acesso-a-informacao/copy_of_perguntas-frequentes/cota-para-o-exercicio-da-atividade-parlamentar&quot;&gt;&lt;em&gt;Cota para exercício da atividade parlamentar&lt;/em&gt;&lt;/a&gt; (CEAP) a serem disponibilizados. A CEAP, por sua vez, consiste em valor mensal que os nossos deputados dispõem para serem reembolsados com gastos com um conjunto de coisas como alimentação, hotel, combustível, locação de carro, passagem aérea e outras coisas.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www2.camara.leg.br/legin/int/atomes/2009/atodamesa-43-21-maio-2009-588364-norma-cd-mesa.html&quot;&gt;O ato de mesa que define a que se destina a CEAP&lt;/a&gt; é o conjunto das regras do jogo, então como parte do processo de compreender bem o seu domínio de trabalho, o time da &lt;a href=&quot;https://serenata.ai/&quot;&gt;Operação Serenata de Amor&lt;/a&gt; (OSA), projeto de ciência de dados feito por brasileiros para encontrar gastos irregulares nos reembolsos dos deputados, leu todo o ato de mesa em busca de maiores informações sobre como a CEAP funciona. Saber todas essas informações ajudou a construir o que seria o domínio de trabalho da Serenata.&lt;/p&gt;

&lt;p&gt;Hoje os dados da CEAP estão sendo disponibilizados em quatro formatos CSV, XML, XLSX e JSON, separados em subconjuntos de anos (&lt;a href=&quot;http://www2.camara.leg.br/transparencia/cota-para-exercicio-da-atividade-parlamentar/dados-abertos-cota-parlamentar&quot;&gt;você pode encontrá-los aqui&lt;/a&gt;). Cada reembolso homologado pela câmara dos deputados é disponibilizado nesse conjunto de dados. Unir esses dados com o conhecimento das regras foi o que permitiu ao time da OSA conseguir encontrar gastos considerados irregulares que foram reembolsados.&lt;/p&gt;

&lt;h4 id=&quot;ferramentas&quot;&gt;Ferramentas&lt;/h4&gt;

&lt;p&gt;Mas para ser efetivo na nossa busca por irregularidades, precisamos de ferramentas. Uma das premissas da ciência é a reprodutibilidade e no caso da Serenata não é diferente, mas além disso, por se tratar de um projeto sobre &lt;a href=&quot;https://www.politize.com.br/accountability-o-que-significa/&quot;&gt;&lt;em&gt;accountability&lt;/em&gt;&lt;/a&gt; e também de auditoria das contas públicas, disponibilizar de forma amigável e transparente nossos achados foi um ponto importantíssimo.&lt;/p&gt;

&lt;p&gt;Dessa forma, apenas colocar código no GitHub não era o suficiente e aí que entra nossa primeira ferramenta: Jupyter Notebooks. Com a possibilidade de misturar código e texto, os &lt;em&gt;notebooks&lt;/em&gt; se tornam o perfeito caderno de laboratório. O GitHub, por sua vez, renderiza nossos queridos &lt;em&gt;notebooks&lt;/em&gt; facilitando ainda mais o nosso trabalho de mostrar pro mundo todos testes de hipótese, todas análises exploratórias e todos treinamentos iniciais de modelos de &lt;em&gt;machine learning&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Mas ainda precisamos de mais uma ferramenta para ajudar a preencher as páginas dos nossos &lt;em&gt;notebooks&lt;/em&gt;, uma linguagem de programação e, nesse caso, a escolhida foi Python. Com uma comunidade cada dia maior, o Python científico vem sendo amplamente utilizado pelo mundo para ciência de dados, ela é também uma linguagem com uma baixa curva de aprendizado o que ajuda ainda mais na ideia de expor os achados.&lt;/p&gt;

&lt;p&gt;Então, foi assim que o nosso time multidisciplinar escolheu as duas ferramentas principais de trabalho. Com o Jupyter nosso jornalista &lt;a href=&quot;http://pedrovilanova.com/&quot;&gt;Pedro&lt;/a&gt; conseguia acompanhar o que time técnico estava fazendo e onde queríamos chegar. E não só ele, outras tantas pessoas interessadas em entender o que estávamos construindo, mas não possuíam o conhecimento técnico, também podiam ficar de olho no nosso trabalho.&lt;/p&gt;

&lt;h4 id=&quot;investigações-preliminares&quot;&gt;Investigações preliminares&lt;/h4&gt;

&lt;p&gt;No dia 8 de setembro, um dia após o lançamento oficial do projeto, o &lt;a href=&quot;https://medium.com/u/e74ca8a4c2f4&quot;&gt;Irio Musskopf&lt;/a&gt; escreveu &lt;a href=&quot;https://medium.com/serenata/o-rob%C3%B4-capaz-de-combater-a-corrup%C3%A7%C3%A3o-8f1e70d2c1c1&quot;&gt;num blog post&lt;/a&gt; para explicar a que se destinava a Operação:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Em pouco tempo, trabalhando em horas vagas … descobrimos mais de 20 casos no mínimo interessantes … tudo é aberto, tanto código quanto dados.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Todos esses achados começaram com &lt;strong&gt;análises exploratórias&lt;/strong&gt; dos dados liberados pela CEAP e alguns cruzamentos iniciais feitos no início do projeto. É aqui que começa de fato a primeira parte de manipulação de dados.&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.giphy.com/media/DHqth0hVQoIzS/giphy.webp&quot; /&gt;
&lt;br /&gt;
&lt;small&gt;
&lt;a href=&quot;https://i.giphy.com/media/DHqth0hVQoIzS/giphy.webp&quot;&gt;Fonte&lt;/a&gt;
&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;Lembra que eu falei que era importante entender os dados? Pois bem, essas análises iniciais ajudam a sedimentar o conhecimento do domínio, mas além disso, essas análises ajudam a mostrar caminhos possíveis de análise. Por exemplo, foi a partir dessas análises que hipóteses como &lt;em&gt;“Velocidade viajada suspeita”&lt;/em&gt; e &lt;em&gt;“Gasto com bebidas alcoólicas”&lt;/em&gt; surgiram.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Por exemplo, vocês sabiam que em 2015 um deputado pagou com dinheiro público algumas contas da sua própria campanha? Ou que em 2014 um deputado tomou uma cervejinha em Las Vegas, no restaurante do Gordon Ramsey, e colocou a cerveja na nossa conta? Ou ainda que em 2013 um deputado foi ressarcido depois de alugar um carro em uma empresa que, na verdade, era uma padaria? Isso sem falar que em 2011 um deputado almoçou 13 vezes no mesmo dia, pagando cada uma dessas refeições com dinheiro daquele mesmo bolso… o nosso.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Contou &lt;a href=&quot;https://medium.com/u/f3796d9a42a9&quot;&gt;Eduardo Cuducos&lt;/a&gt; em um &lt;a href=&quot;https://medium.com/data-science-brigade/tecnologia-transpar%C3%AAncia-e-pol%C3%ADtica-bb1096206af8&quot;&gt;outro post&lt;/a&gt; sobre o projeto.&lt;/p&gt;

&lt;h4 id=&quot;limpeza&quot;&gt;Limpeza&lt;/h4&gt;

&lt;p&gt;Além de ajudar a levantar hipóteses e conhecer os seus dados, as análises iniciais também vão servir para mostrar limpezas necessárias. Na maioria das vezes os dados não vem prontinhos, esse papel de preparação de dados, cai na aba do chapéu de engenharia de dados, e com um nome recente essa engenharia ainda está sendo descoberta pelas empresas. Então, cabe ao cientista muitas vezes trocar de chapéu para também preparar o dado para análise.&lt;/p&gt;

&lt;p&gt;A limpeza &lt;strong&gt;não&lt;/strong&gt; busca remover dados do &lt;em&gt;dataset&lt;/em&gt; inicial, mas sim organizar os dados para melhorar o acesso aos mesmos, &lt;a href=&quot;https://cran.r-project.org/web/packages/tidyr/vignettes/tidy-data.html&quot;&gt;já ouviu falar em “&lt;em&gt;tidy data”&lt;/em&gt;&lt;/a&gt;? O conceito se baseia no fato que um dado organizado facilita imensamente as análises a serem feitas e implementações de modelos.&lt;/p&gt;

&lt;p&gt;No caso da Serenata, nosso &lt;em&gt;dataset&lt;/em&gt; já era bem organizado, no entanto algumas melhorias estavam no pedido do dia. Para começar, apesar da CEAP ser idealizada para reembolsos, algumas vezes gastos como compra de passagens podem ser feitos diretamente pela Câmara dos Deputados ao invés do(a) deputado(a) fazer o gasto e pedir o reembolso. Esses gastos precisam ser identificados para que possa ocorrer a contabilidade correta deles.&lt;/p&gt;

&lt;p&gt;Além disso, um gasto não precisa ser reembolsado numa parcela única, o que gera mais de um registro para o mesmo recibo, essas parcelas então precisam ser agregadas.&lt;/p&gt;

&lt;p&gt;Por fim, com o objetivo de participar do &lt;a href=&quot;https://www.opengovpartnership.org/about/about-ogp&quot;&gt;movimento global que promove o aumento da &lt;em&gt;accountability&lt;/em&gt; governamental,&lt;/a&gt; ficou decidido que todo o código do projeto, assim como análises e demais documentos técnicos iriam ser feitos em inglês. Isso fez com que ainda precisássemos incluir um passo de tradução dos dados para o inglês para que eles pudessem fazer sentindo para quem não fala português também.&lt;/p&gt;

&lt;h4 id=&quot;enriquecimento&quot;&gt;Enriquecimento&lt;/h4&gt;

&lt;p&gt;Depois de limpar e organizar os dados, chegou a hora de torna-los ricos. A limpeza muitas vezes não é o suficiente para que possamos extrair informações interessantes dos dados.&lt;/p&gt;

&lt;p&gt;Os dados da CEAP só trazem as informações dos reembolsos. Qualquer coisa além disso que você encontra hoje no serenata, foi fruto de um processo de enriquecimento.&lt;/p&gt;

&lt;p&gt;A fase de enriquecimento funciona como injetar esteroides no seus dados. O objetivo é trazer informações extras para nosso conjunto de dados de trabalho e assim, agregar mais valor as análises e melhorar as decisões a serem tomadas.&lt;/p&gt;

&lt;p&gt;Cada reembolso traz o CNPJ da empresa que emitiu a nota que foi reembolsada no escopo da CEAP. Sabendo disso, um dos primeiros enriquecimentos que pensamos em Serenata foi trazer os dados das empresas para o nosso conjunto de trabalho.&lt;/p&gt;

&lt;p&gt;Dados sobre as empresas incluem informações como endereço e o quadro societário delas, ter à mão esses dados permite que façamos investigações sobre possíveis casos de nepotismo e investigar se pessoas estavam “em dois lugares ao mesmo tempo”.&lt;/p&gt;

&lt;p&gt;Embora seja possível encontrar o endereço principal das empresas no conjunto dos &lt;a href=&quot;https://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao2.asp&quot;&gt;dados liberados pela receita&lt;/a&gt;, lidar com endereços dentro do código leva a mais um passo de enriquecimento, já que é mais fácil calcular distâncias com latitude e longitude do que endereços como “Rua dos Bobos, n 0”. Foi aí, que com ajuda da &lt;a href=&quot;https://developers.google.com/maps/documentation/geocoding/intro&quot;&gt;API de Geocodificação do Google&lt;/a&gt;, conseguimos trazer a informação de latitude e longitude que alimenta nossos classificadores.&lt;/p&gt;

&lt;h4 id=&quot;teste-de-hipótese&quot;&gt;Teste de hipótese&lt;/h4&gt;

&lt;p&gt;Não basta ter dados, eles serem limpos e ricos, é preciso levantar hipóteses e validá-las. E é como dizem, uma hipótese validada vale mais que mil palavras… tá, o ditado não é bem esse, mas o processo de validar (ou não) as hipóteses pinta a imagem.&lt;/p&gt;

&lt;p&gt;É importante lembrar que um dos muitos diferenciais da Serenata é que este foi um projeto feito num período de tempo bem curto se comparado com o tempo gasto em projetos mais “tradicionais”:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Nenhum projeto de data science é feito para durar apenas três meses. Existe um longo processo de análise de dados e estudo de métodos até ser desenvolvido algo concreto. Entretanto, como queríamos fazer o projeto acontecer, usamos nossos conhecimentos em &lt;a href=&quot;http://www.devmedia.com.br/conceitos-basicos-sobre-metodologias-ageis-para-desenvolvimento-de-software-metodologias-classicas-x-extreme-programming/10596&quot;&gt;métodos agéis&lt;/a&gt; (adquiridos com nossa experiência de desenvolvimento) e descobrimos que a melhor forma de adaptar o tempo que tínhamos era utilizando HDD (&lt;a href=&quot;https://hackerchick.com/hypothesis-driven-development/&quot;&gt;hyphothesis-driven development&lt;/a&gt;) junto a técnica &lt;a href=&quot;https://www.mindtools.com/pages/article/timeboxing.htm&quot;&gt;timeboxing&lt;/a&gt;. Ou seja, eram levantadas hipóteses para serem desenvolvidas em um espaço de tempo pré-determinado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Explicou &lt;a href=&quot;https://medium.com/u/a84fab589b6c&quot;&gt;Ana Schwendler &lt;/a&gt;num &lt;a href=&quot;https://medium.com/serenata/validando-hip%C3%B3teses-d51ae1f46052&quot;&gt;post sobre a validação de hipóteses da Serenata&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Depois das análises iniciais surgiram as hipóteses a serem estudadas e validadas, importante lembrar aqui, embora cientistas tenham uma forte indicação de hipóteses válidas com base em suas análises inicias, isso não quer dizer que as hipóteses sempre serão válidas, certo? Ter isso em mente sempre ao trabalhar com dados é importante pois os dados podem provar que estamos errados. É importante ser humilde e reconhecer isso ao invés de manipular os dados para que eles mostrem o que queremos.&lt;/p&gt;

&lt;hr /&gt;

&lt;h4 id=&quot;eu-robô&quot;&gt;Eu, robô&lt;/h4&gt;

&lt;p&gt;Finalmente depois de todo esse processo, depois de passar pela limpeza e enriquecimento dos dados, depois de encontrar as hipóteses válidas finalmente chegamos na parte que era o objetivo principal do projeto: uma inteligência artificial, a Rosie.&lt;/p&gt;

&lt;p&gt;Ela basicamente condensa e automatiza todo esse processo de pegar os reembolsos e ver se eles se enquadram na definição de um gasto suspeito ou não.&lt;/p&gt;

&lt;p&gt;Mas para isso acontecer a gente precisa estruturar todas as análises que foram feitas nos notebooks num formato mais estruturado e é aí que entra o &lt;em&gt;scikit-learn&lt;/em&gt;, ou pelo menos o padrão que eles seguem 😄&lt;/p&gt;

&lt;p&gt;No caso da Rosie, o que fazemos é transformar todo o passo a passo feito no notebook para a mesma estrutura que o scikit segue: implementando os métodos &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fit&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;predict&lt;/code&gt;e &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;transform&lt;/code&gt; e, quando necessário, métodos auxiliares de acordo com a necessidade. A &lt;a href=&quot;https://medium.com/u/a84fab589b6c&quot;&gt;Ana Schwendler&lt;/a&gt; falou dessa parte mais técnica de &lt;a href=&quot;https://medium.com/data-science-brigade/como-a-rosie-usa-machine-learning-na-serenata-de-amor-9168e0f1909d&quot;&gt;como a Rosie usa aprendizado de máquina aqui nesse post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mas não é só isso, a Rosie também tem uma conta no Twitter, veja o que a Jout Jout fala sobre ela:&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/NmbSnopvDNY&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;small&gt;&lt;i&gt;Video da JoutJout sobre política onde ela apresenta um montão de ferramentas para acompanhar o trabalho dos nossos políticos&lt;/i&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Até a Rosie existir (e tuitar) muito dos nossos achados ficavam “presos” à pessoas que já estavam interessadas no assunto como jornalistas e pessoas que trabalham com dados abertos. Mas ao chegar no Twitter, a Rosie popularizou os achados que antes estavam nas mãos de poucos.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;E aí? Bora salvar o mundo? Eu já coloquei minhas braçadeiras!&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://media.giphy.com/media/d3YIyzi534G5GRNe/giphy.gif&quot; /&gt;
&lt;br /&gt;&lt;small&gt;&lt;a href=&quot;https://giphy.com/gifs/hbo-wonder-woman-d3YIyzi534G5GRNe&quot;&gt;Fonte&lt;/a&gt;&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;Um xêro!&lt;/p&gt;
</description>
        <pubDate>Sat, 23 Nov 2019 13:11:42 +0000</pubDate>
        <link>https://jtemporal.com/a-ciencia-de-dados-pode-salvar-um-pais/</link>
        <guid isPermaLink="true">https://jtemporal.com/a-ciencia-de-dados-pode-salvar-um-pais/</guid>
        
        <category>português</category>
        
        <category>serenata</category>
        
        <category>data science</category>
        
        <category>ciencia de dados</category>
        
        
      </item>
    
      <item>
        <title>Estou usando um CMS e você deveria usar um também!</title>
        <description>&lt;p&gt;Essa colinha é mais um dica pra você que tem um site estático ou que está querendo migrar seu blog de ferramentas como medium.&lt;/p&gt;

&lt;p&gt;Há alguns meses eu descobri um negócio chamado CMS, a sigla para &lt;em&gt;Content Management System&lt;/em&gt; (&lt;em&gt;sistema de gerenciamento de conteúdo&lt;/em&gt; em português), era algo que eu estava procurando a muito tempo e não sabia.&lt;/p&gt;

&lt;p&gt;Vamos lá, se você já me conhece sabe que eu passei um tempo postando coisas no medium.com e hoje só faço isso quando estou escrevendo para publicações como a do &lt;a href=&quot;https://code.likeagirl.io/&quot;&gt;Code Like a Girl&lt;/a&gt;, &lt;a href=&quot;https://medium.com/databootcamp&quot;&gt;Data Bootcamp&lt;/a&gt; ou para a &lt;a href=&quot;https://medium.com/pizzadedados&quot;&gt;revista do Pizza de Dados&lt;/a&gt;. Fora esses casos que envolvem publicações, meus artigos, tutoriais e colinhas sempre estão em blogs estáticos como esse aqui que você está acessando.&lt;/p&gt;

&lt;p&gt;Eu até ensinei como colocar sites &lt;a href=&quot;jtemporal.com/do-tema-ao-ar/&quot;&gt;no ar usando o GitHub Pages e o Jekyll nesse tutorial&lt;/a&gt;. Mas confesso que, se como eu, você não está perto do seu computador 100% das vezes que começa a escrever um novo artigo, visualizar seu site pode ser complicado. Quando não estou no computador, acabo editando muitos dos meus textos no &lt;em&gt;tablet&lt;/em&gt; ou no celular e, por mais que eu adore editores de texto simples, ainda não dá pra fazer &lt;em&gt;build&lt;/em&gt; de site estático pelo Android ou iOS.&lt;/p&gt;

&lt;p&gt;E aí que entra &lt;a href=&quot;https://forestry.io/&quot;&gt;o Forestry&lt;/a&gt;. É uma ferramenta para te ajudar a transpor essas barreiras mais técnicas. Então vamos ver isso com calma.&lt;/p&gt;

&lt;h2 id=&quot;problemas-de-hoje&quot;&gt;Problemas de hoje&lt;/h2&gt;

&lt;p&gt;Como falei existem uma série de fatores que atrapalham a publicação de novos artigos quando se tem um blog como o meu: um site estático, baseado em Markdown e que está hospedado no GitHub.&lt;/p&gt;

&lt;h3 id=&quot;escrever-textos-em-markdown&quot;&gt;Escrever textos em Markdown&lt;/h3&gt;

&lt;p&gt;Eu passei muito tempo procurando um aplicativo que tivesse o mínimo de funcionalidades para escrever textos em markdown que tivesse duas &lt;em&gt;features&lt;/em&gt; principais:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;visualização desses textos num formato bonitinho como o pré-visualizar do GitHub por exemplo;&lt;/li&gt;
  &lt;li&gt;e, sincronização desses textos com algum serviço de nuvem para que eu pudesse acessar eles de qualquer lugar independentemente se estivesse com o aplicativo perto de mim ou não.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Até agora eu não encontrei um aplicativo gratuito para isso. E considerando que eu gosto de rascunhar meus textos no celular e &lt;em&gt;tablet&lt;/em&gt;, a falta de uma ferramenta com essas características é bem limitante.&lt;/p&gt;

&lt;h3 id=&quot;pré-visualização-do-site&quot;&gt;Pré-visualização do site&lt;/h3&gt;

&lt;p&gt;Quando estou escrevendo no meu computador eu já tenho os processos prontos, eu consigo escrever os artigos num editor de texto como o &lt;a href=&quot;https://remarkableapp.github.io/&quot;&gt;Remarkable&lt;/a&gt; direto na pasta do meu site e fazer um &lt;em&gt;build&lt;/em&gt; do site na minha máquina para ver como ficará o artigo quando for publicado. No entanto, qualquer outro dispositivo que eu esteja usando como meu celular, torna impossível a tarefa de pré-visualização do site já que não tenho um ambiente de desenvolvimento nesse dispositivo.&lt;/p&gt;

&lt;p&gt;Com as configurações que eu tinha até então, eu também não tinha um ambiente de &lt;em&gt;staging&lt;/em&gt;, se você não sabe o que é isso, imagine que você tenha uma cópia do seu site no ar, essa cópia é separada do site real e serve para você fazer testes de alterações no seu site, desde alterações estruturais como mudanças de tema, até mesmo como um ambiente onde você pode ter uma pré-visualização online do seus artigos.&lt;/p&gt;

&lt;p&gt;A falta do ambiente de &lt;em&gt;staging&lt;/em&gt; me causa um trabalho a mais frequentemente. Depois de prontos, eu geralmente mando meus textos para amigos e amigas revisarem, para fazer isso eu acabo usando ferramentas de compartilhamento de documentos como o Google Drive ou até mesmo o medium com o texto em formato de rascunho o que não é ruim, mas é um passo a mais que inclui colocar o texto em mais uma plataforma para que possa ser visto.&lt;/p&gt;

&lt;h3 id=&quot;colocar-novos-textos-no-github&quot;&gt;Colocar novos textos no GitHub&lt;/h3&gt;

&lt;p&gt;Além de uma dificuldade em pré-visualizar e também de compartilhar rascunhos. Por fim, chega a pior de todas: fazer &lt;em&gt;commits&lt;/em&gt; pelo celular. Embora eu já tenha feito isso, é uma experiência bem desagradável, o que por sua vez me impede de publicar novos textos se eu só tiver acesso ao meu celular. Entende o dilema?&lt;/p&gt;

&lt;h2 id=&quot;como-o-forestry--resolve-tudo-isso&quot;&gt;Como o Forestry  resolve tudo isso&lt;/h2&gt;

&lt;p&gt;Longe de ser uma bala de prata, a plataforma oferece um editor de textos amigável que mostra as formatações básicas elementares como títulos, hyperlinks, itálico e afins. Ainda te permite criar listas, inserir blocos de códigos e imagens no seu texto. É amigável para pequenas telas e aceita colar textos com formatação então, eu consigo escrever meus textos offline em um aplicativo de notas e depois criar o arquivo pelo navegador do próprio celular, da mesma forma ainda é possível publicar o texto depois de pronto.&lt;/p&gt;

&lt;p&gt;O Forestry também te dá um ambiente de &lt;em&gt;staging&lt;/em&gt; tornando possível fazer a pré-visualização dos textos em tempo real. Você consegue configurar a ferramenta para fazer o &lt;em&gt;build&lt;/em&gt; do site com os textos em rascunho e também fazer a pré-visualização de cada texto individualmente.&lt;/p&gt;

&lt;p&gt;Uma funcionalidade que eu uso bastante é a criação de &lt;em&gt;templates&lt;/em&gt; para os tipos de artigo, onde você pode definir os campos do front-matter de cada tipo de texto que você normalmente escreve e assim evitar retrabalho. Essa funcionalidade me ajuda definindo campos obrigatórios como Título e subtítulo, dessa forma, eu não esqueço de nada importante e também definindo valores padrão para cada campo, como por exemplo a capa do artigo.&lt;/p&gt;

&lt;p&gt;A funcionalidade de templates foi particularmente útil para criar os arquivos dos projetos da lista de hacktoberfest. Eu criei um &lt;em&gt;template&lt;/em&gt; com os campos que precisava preencher de cada projeto e era só uma questão de copiar e colar cada informação no campo correspondente e salvar o arquivo.&lt;/p&gt;

&lt;p&gt;Por fim, a propaganda do Forestry é que nem você nem sua equipe precisam saber fazer &lt;em&gt;commits&lt;/em&gt; ou saber como funciona o git para gerenciar o conteúdo de um blog ou site. Isso mesmo, os &lt;em&gt;commits&lt;/em&gt; acontecem atrás da ferramenta então, você pode desapegar das questões de desenvolvimento de focar em escrever. E sim, é possível ter equipes de até 4 pessoas para cada site, permitindo que pequenos times trabalhem colaborativamente num seu site.&lt;/p&gt;

&lt;h2 id=&quot;nem-tudo-são-flores&quot;&gt;Nem tudo são flores&lt;/h2&gt;

&lt;p&gt;Apesar de resolver meus problemas e me dar um lugar legal para trabalhar nos meus artigos, o Forestry ainda é uma ferramenta nova e em constante desenvolvimento. Por isso, algumas funcionalidades ainda possuem espaços para melhorias. Por exemplo, se você usa &lt;a href=&quot;https://jekyllrb.com/docs/collections/&quot;&gt;&lt;em&gt;collections&lt;/em&gt;&lt;/a&gt; no Jekyll pode ter dificuldades de visualizar novas adições às suas coleções sem antes reiniciar o servidor de pré-visualizações.&lt;/p&gt;

&lt;p&gt;Fazer a integração com um site já existente pode ser um pouco assustador principalmente se você nunca se aventurou com algo similar antes. Todas as documentações são em inglês e o editor de texto não possui suporte a alguns tipos de arquivos como por exemplo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.scss&lt;/code&gt;. Eu descobri isso pedindo ajuda ao suporte já que a plataforma não importava esses arquivos e não aparecia um notificação clara do motivo.&lt;/p&gt;

&lt;h2 id=&quot;concluindo&quot;&gt;Concluindo&lt;/h2&gt;

&lt;p&gt;Se você gosta de escrever em sites como o medium.com ou tem costume de usar algo como o wordpress e quer sair dessas plataformas, unir um gerador de sites estáticos como o &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; ou &lt;a href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt; (as opções vão muito além dessas), com uma plataforma como Forestry pode ser o caminho mais suave para fazer essa transição.&lt;/p&gt;

&lt;p&gt;Espero que esse relato te ajude a melhorar sua experiência de escrever.&lt;/p&gt;
</description>
        <pubDate>Sun, 06 Oct 2019 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/usando-um-cms/</link>
        <guid isPermaLink="true">https://jtemporal.com/usando-um-cms/</guid>
        
        <category>português</category>
        
        <category>content management</category>
        
        <category>blog</category>
        
        <category>blogging</category>
        
        <category>cms</category>
        
        <category>colinha</category>
        
        
      </item>
    
      <item>
        <title>Adicionando um novo projeto na lista da #Hacktoberfest</title>
        <description>&lt;hr /&gt;

&lt;p&gt;Nota da autora: As instruções a seguir foram criadas em 2019, mas a forma de atualizar a lista de projetos se manteve desde então. Então mesmo que você queira atualizar a lista desse ano os passos são os mesmos 😉&lt;/p&gt;

&lt;p&gt;Vale salientar que esse ano a lista agora tem uma pasta dedicada chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_hacktoberfest_projects_2025/&lt;/code&gt;. O blog post foi atualizado para usar a nova pasta.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;A lista de projetos brasileiros para contribuir nesse Hacktoberfest de 2025 é gerada automaticamente usando algumas mágicas do Liquid &lt;!--como eu explico nesse outro artigo--&gt;. Então, vamos ver como podemos adicionar um novo projeto nessa lista por meio de um &lt;em&gt;pull request&lt;/em&gt;?&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;/images/showtime.gif&quot; alt=&quot;Gif com o genio do alladin live action falando &apos;É hora do show!&apos;&quot; /&gt;
&lt;br /&gt;
&lt;small&gt;&lt;i&gt;É hora do show!&lt;/i&gt;&lt;/small&gt;
&lt;/center&gt;

&lt;h2 id=&quot;materiais&quot;&gt;Materiais&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Um navegador (eu vou usar o Firefox, mas você pode usar o que preferir);&lt;/li&gt;
  &lt;li&gt;Uma conta no GitHub;&lt;/li&gt;
  &lt;li&gt;Disposição.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Nota da autora&lt;/em&gt;: existem inúmeras formas de fazer esse &lt;em&gt;pull request&lt;/em&gt; (PR), aqui eu vou ensinar um formato usando o navegador para que você possa fazer sua contribuição mesmo que você não tenha conhecimentos profundos de git. Se você já tem prática em contribuir com projetos no GitHub, pula direto para &lt;a href=&quot;#revisao&quot;&gt;essa seção&lt;/a&gt; que tem uma lista de passos menos detalhada do PR que deve ser o suficiente pra você fazer a sua contribuição.&lt;/p&gt;

&lt;h2 id=&quot;abrindo-o-repositório-do-pr&quot;&gt;Abrindo o repositório do PR&lt;/h2&gt;

&lt;p&gt;Pra começar abra &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io&quot;&gt;o repositório desse site aqui&lt;/a&gt; numa página do seu navegador.&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;/images/repo-jtemporal.png&quot; alt=&quot;Imagem mostrando o repositório deste site&quot; /&gt;
&lt;br /&gt;
&lt;small&gt;&lt;i&gt;Imagem mostrando o repositório deste site&lt;/i&gt;&lt;/small&gt;
&lt;/center&gt;

&lt;h2 id=&quot;copiando-o-template&quot;&gt;Copiando o template&lt;/h2&gt;

&lt;p&gt;No repositório desse site, que você acabou de abrir, navegue até a pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/&lt;/code&gt; e copie o conteúdo do arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;repo-owner+repo-name.md&lt;/code&gt; (eu recomendo que você use o modo Raw do arquivo para fazer essa cópia). Veja o gif a seguir com esse processo:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/jtemporal.github.io/main/images/hacktober_2019/hacktober_2019_passo_2.gif&quot; alt=&quot;Gif mostrando o passo a passo descrito acima&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Esse arquivo é o template de informações necessárias para mostrar corretamente um projeto na lista.&lt;/p&gt;

&lt;h2 id=&quot;onde-moram-os-projetos&quot;&gt;Onde moram os projetos&lt;/h2&gt;

&lt;p&gt;Ainda no repositório desse site, vá até a pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_hacktoberfest_projects_2025/&lt;/code&gt;, lá é onde moram os dados de todos os projetos que estão sendo mostrados na lista de 2025.&lt;/p&gt;

&lt;p&gt;Na pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_hacktoberfest_projects_2025/&lt;/code&gt; temos muitas pastas, elas existem apenas por questões organizacionais, cada pasta tem o nome de uma linguagem, e o projeto que você quer adicionar deve ser acrescentado na pasta correspondente à linguagem principal do projeto.&lt;/p&gt;

&lt;h2 id=&quot;escolhendo-um-projeto-para-adicionar&quot;&gt;Escolhendo um projeto para adicionar&lt;/h2&gt;

&lt;p&gt;Agora, numa nova página, abra o repositório que você quer adicionar na lista. Aqui vamos usar de exemplo o &lt;a href=&quot;https://github.com/PizzaDeDados/datascience-pizza&quot;&gt;Guia do Cientista de Dados das Galáxias&lt;/a&gt; (Guia).&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;/images/repo-guia-github.png&quot; alt=&quot;Imagem mostrando o repositório Guia do Cientista de Dados das Galáxias&quot; /&gt;
&lt;br /&gt;
&lt;small&gt;&lt;i&gt;Imagem mostrando o repositório Guia do Cientista de Dados das Galáxias&lt;/i&gt;&lt;/small&gt;
&lt;/center&gt;

&lt;h2 id=&quot;criando-um-arquivo-para-o-projeto&quot;&gt;Criando um arquivo para o projeto&lt;/h2&gt;

&lt;p&gt;O Guia é um projeto agnóstico de linguagem, afinal é apenas um grande conjunto de arquivos em markdown, sendo assim, vamos criar o arquivo do Guia na pasta  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Variados&lt;/code&gt;. Novamente na página do site, navegue até pasta  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_hacktoberfest_projects_2025/&lt;/code&gt; e em seguida entre na pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Variados&lt;/code&gt;. Para criar o arquivo clique em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Create new file&lt;/code&gt;, em seguida cole o conteúdo que copiamos do arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;repo-owner+repo-name.md&lt;/code&gt; no espaço de conteúdo, dê o nome do arquivo seguindo o padrão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;nome-do-dono-do-repo&amp;gt;+&amp;lt;nome-nome-do-repo&amp;gt;.md&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;preenchendo-as-informações&quot;&gt;Preenchendo as informações&lt;/h2&gt;

&lt;p&gt;Agora você pode preencher os dados do projeto no nosso arquivo, só precisamos de quatro informções:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;O link do repositório (campo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;repo&lt;/code&gt;);&lt;/li&gt;
  &lt;li&gt;O link pra imagem de perfil da pessoa dona do repositório (campo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;image&lt;/code&gt;);&lt;/li&gt;
  &lt;li&gt;A descrição do repositório (campo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt;);&lt;/li&gt;
  &lt;li&gt;E a linguagem principal do repositório (campo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;principal_language&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para tudo isso basta copiar essas informações na página do repositório e colar na linha de campo correspondente no nosso arquivo.&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/jtemporal.github.io/main/images/hacktober_2019/hacktober_2019_passo_6.gif&quot; alt=&quot;Gif mostrando o passo a passo descrito acima. Na parte superior o repositório do Guia de onde copiei as informações e na parte inferior o repositório deste site onde colei as informações&quot; /&gt;
&lt;/center&gt;

&lt;h2 id=&quot;abrindo-o-pr&quot;&gt;Abrindo o PR&lt;/h2&gt;

&lt;p&gt;Depois de preencher todos os campos necessários presentes no nosso arquivo, basta abrir o PR. Então apenas desça até a área de detalhes do &lt;em&gt;commit&lt;/em&gt;, escreva uma mensagem descrevendo qual projeto você está adicionando, clique em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Propose new file&lt;/code&gt; e siga para propor o PR clicando em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Create Pull Request&lt;/code&gt;.&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/jtemporal.github.io/main/images/hacktober_2019/hacktober_2019_passo_7.gif&quot; alt=&quot;Gif mostrando o passo a passo descrito acima&quot; /&gt;
&lt;/center&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;possíveis-problemas&quot;&gt;Possíveis problemas&lt;/h2&gt;

&lt;p&gt;Existem principalmente dois casos em que esse fluxo que eu descrevi até agora vai precisar de ajustes, mas não precisa se desesperar, eu explico eles abaixo.&lt;/p&gt;

&lt;h3 id=&quot;caso-1-quero-adicionar-uma-linguagem-nova&quot;&gt;Caso 1: quero adicionar uma linguagem nova&lt;/h3&gt;

&lt;p&gt;Caso o projeto que você queira adicionar na lista tenha uma linguagem principal diferente daquelas já disponíveis, você deverá criar uma nova pasta. Para fazer isso pela interface do GitHub no navegador, basta você escrever o nome da pasta no campo onde escrevemos o nome do arquivo seguido de uma barra (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/&lt;/code&gt;), ao digitar a barra, o GitHub se encarregará de criar a pasta, veja:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/jtemporal.github.io/main/images/hacktober_2019/hacktober_2019_criando_pasta.gif&quot; alt=&quot;Gif mostrando o passo a passo descrito acima num repositorio de teste&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;No gif, eu crio a pasta chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pasta2&lt;/code&gt; e dentro dela crio o arquivo chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meu-arquivo.md&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;caso-2-o-projeto-que-eu-quero-adicionar-não-tem-descrição&quot;&gt;Caso 2: o projeto que eu quero adicionar não tem descrição&lt;/h3&gt;

&lt;p&gt;Nesse caso é mais fácil de resolver, basta colocar no campo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt; o conteudo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;No description&lt;/code&gt; assim como coloquei nesse projeto aqui:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/jtemporal.github.io/main/images/hacktober_2019/hacktober_2019_no_description.gif&quot; alt=&quot;Gif mostrando o passo a passo descrito acima num repositorio de teste&quot; /&gt;
&lt;/center&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;revisao&quot;&gt;Revisão dos passos&lt;/h2&gt;

&lt;p&gt;Então pra aquela galera que só precisa de uma explicação mais concisa aqui vai! São só três passos!&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Crie um arquivo na pasta correspondente à linguagem principal do projeto que você quer adicionar, use o &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/blob/main/.github/repo-owner%2Brepo-name.md&quot;&gt;template disponível aqui&lt;/a&gt; e não se esqueça de nomear o arquivo seguindo a convenção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;nome-perfil&amp;gt;+&amp;lt;nome-nome-do-repo&amp;gt;.md&lt;/code&gt;;&lt;/li&gt;
  &lt;li&gt;Preencha os campos com as informações do projeto que você quer adicionar;&lt;/li&gt;
  &lt;li&gt;Abra o PR.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aguarde a revisão e aprovação!&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Se você quiser fazer um PR e não tem projeto em mente, &lt;a href=&quot;https://github.com/jtemporal/jtemporal.github.io/labels/hacktoberfest&quot;&gt;dá uma olhada nessa lista aqui&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Sun, 29 Sep 2019 11:00:00 +0000</pubDate>
        <link>https://jtemporal.com/adicionando-um-novo-projeto-na-lista-da-hacktoberfest-2019/</link>
        <guid isPermaLink="true">https://jtemporal.com/adicionando-um-novo-projeto-na-lista-da-hacktoberfest-2019/</guid>
        
        <category>pull request</category>
        
        <category>open source</category>
        
        <category>contribuition</category>
        
        <category>contribuição</category>
        
        <category>hacktoberfest</category>
        
        <category>git</category>
        
        <category>github</category>
        
        <category>tutorial</category>
        
        
      </item>
    
      <item>
        <title>From 0 to 17 thousand pageviews</title>
        <description>&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Author note:&lt;/em&gt; Você pode ler &lt;a href=&quot;https://jtemporal.com/de-0-a-17-mil-pageviews/&quot;&gt;este artigo em Português&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;The first website I got online was a Django based one. It was on a workshop of the academic week of my undergraduate course Biomedical Informatics taught by Ribeirão Preto’s Python community. It was the first time I saw how to use Python, and it was my first deploy ever, with Heroku and all, but this is a story for another time.&lt;/p&gt;

&lt;p&gt;Since then, my development skills have evolved. I’ve learned about new technologies, learned to contribute avidly to open-source. I can say that, overall, I’ve improved as a developer.&lt;/p&gt;

&lt;p&gt;Between the first site I launched, and today, I learned a lot, and among the knowledge I acquired, I learned alternative ways to publish sites. Among all the methods I know how to publish sites, my favorite way to get websites up and running is using GitHub Pages. &lt;a href=&quot;https://jtemporal.com/do-tema-ao-ar/&quot;&gt;I even wrote a tutorial on this method (in Portuguese)&lt;/a&gt; to help anyone who knows GitHub and a little bit of git have a website online without fuss.&lt;/p&gt;

&lt;h2 id=&quot;my-site-my-rules&quot;&gt;My site, my rules&lt;/h2&gt;

&lt;p&gt;The first version of &lt;a href=&quot;https://jtemporal.com&quot;&gt;jtemporal.com&lt;/a&gt; was never structured to be a blog, despite having a blog session where I wrote about technical content. Think of my site as a kind of online notepad, I wrote about techniques I was studying or applying at work. This little detail had a significant impact on access to the content I posted. When I decided to put this site up, I chose a theme by following these rules:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Cannot be a single page;&lt;/li&gt;
  &lt;li&gt;It cannot be primarily a blog;&lt;/li&gt;
  &lt;li&gt;It has to be beautiful and mobile-friendly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After some hard searching, I found my first theme: &lt;a href=&quot;http://taylantatli.github.io/Moon/&quot;&gt;Moon&lt;/a&gt;. It had all the features that I wanted. Cute, with some cool animations, wasn’t primarily a blog, although, as I said earlier, it had a space for blogging. It wasn’t single page, I don’t know why, but I don’t like single page sites &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;¯\_(ツ)_/¯&lt;/code&gt;. Moon met all my needs.&lt;/p&gt;

&lt;p&gt;I liked, and still really like Moon. I find it a well-built theme, and during the first two years of having a website and a place to put my texts, I considerably increased the number of articles I wrote.&lt;/p&gt;

&lt;p&gt;I developed a skill and discovered a willingness to write about technical content that I didn’t know I had, after all, I never wanted to be a writer, writing was never my forte at school and despite being an applied student and trying hard to write decent texts when necessary, didn’t find it easy.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;https://giphygifs.s3.amazonaws.com/media/5BI679ybkAhJm/giphy.gif&quot; /&gt;&lt;br /&gt;&lt;a href=&quot;https://giphygifs.s3.amazonaws.com/media/5BI679ybkAhJm/giphy.gif&quot;&gt;Source&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;During the two years that I had Moon as my theme, I wrote a lot, studied further, and learned many new things. One of those things was how to place a tag to track hits on a site using &lt;a href=&quot;https://marketingplatform.google.com/about/analytics/&quot;&gt;Google Analytics&lt;/a&gt;. If you’ve never heard of Google Analytics, that’s fine, for now, just knowing it’s a Google toolkit to track how your customers interact with web solutions. One of the things you can do is follow the behavior of those who use your site. After starting to follow ups and downs in pageviews, I watched my site get nearly 8,000 hits in a month. And that’s ok. I didn’t expect to have 8 hits would guess the 8,000 😂&lt;/p&gt;

&lt;center&gt; &lt;img src=&quot;/images/IMG_3900.PNG&quot; style=&quot;max-width:65%;&quot; /&gt;&lt;br /&gt; &lt;i&gt;Image showing the number of website hits in October 2018&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;Writing became routine and part of my learning process. Then, during late 2018, I realized that my needs and focus for my site changed: instead of being a place I used as a notebook for the things I wrote, it became a place where I like to share content. Writing became my new usual.&lt;/p&gt;

&lt;h2 id=&quot;new-rules-a-new-site&quot;&gt;New rules, a new site&lt;/h2&gt;

&lt;p&gt;Just as writing became part of my daily life, my site finally needed to change, after all, part of the rules that made me choose the first theme was no longer what I required. I needed a theme that focused &lt;strong&gt;on content&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then I set off in search of a new theme. You may have noticed, but the tendency content-focused sites are to have card format, dev.to is like this, Medium is like that too, and so on. Naturally, when looking for a new theme, I found one with cards. The new chosen one was &lt;a href=&quot;https://webjeda.com/cards/&quot;&gt;Cards by Webjeda&lt;/a&gt;. I liked the theme, although I could see some points that needed modifications to make it the way I wanted. With the new theme at hand, at the beginning of 2019, I made the transition between Moon and Cards.&lt;/p&gt;

&lt;h2 id=&quot;cards-cards-everywhere&quot;&gt;Cards, cards everywhere&lt;/h2&gt;

&lt;p&gt;Because both themes are Jekyll, based on markdown, and both have the same pattern for creating paths for posts, the transition went smoothly. I also created the covers for each type of article to make the job easier; after all, I didn’t want to use random images, so I standardized the images to match the type of article.&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;/images/covers/miscellaneous.webp&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;/images/covers/pro_tip.webp&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;center&gt;&lt;i&gt;Some of the covers I made for the articles&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;Finally, the time has come to put the new face of the site online. This step was also straightforward since my configuration is simple, changing the name of the repository on GitHub, and configuring the domain did the trick. New site on the air!&lt;/p&gt;

&lt;p&gt;After changing the theme, as a data addict, I continued to watch my analytics closely, a month passed by, and I finally realized I forgot to put the tracking tag on the new site hehe.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;https://giphygifs.s3.amazonaws.com/media/GDnomdqpSHlIs/giphy.gif&quot; /&gt;&lt;br /&gt;&lt;a href=&quot;https://giphygifs.s3.amazonaws.com/media/GDnomdqpSHlIs/giphy.gif&quot;&gt;Source&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;After realizing that I was missing the tag and correcting this small mistake, we returned to the usual programmation of analytics watching. And in August 2019, I broke a record! I reached more than 17,000 hits!&lt;/p&gt;

&lt;center&gt; &lt;img src=&quot;/images/IMG_3901.PNG&quot; style=&quot;max-width:65%;&quot; /&gt;&lt;br /&gt; &lt;i&gt;Image showing amount of site hits in August 2019&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;Of course, it wasn’t just the change of theme that led to the growth in site hits. The increase in articles on various subjects, the growth of the &lt;a href=&quot;https://pizzadedados.com/en/&quot;&gt;Pizza de Dados&lt;/a&gt;, the podcast I founded with my friends, and the improved SEO tags on the theme itself, may have contributed to the increase in hits.&lt;/p&gt;

&lt;p&gt;However, this is the first time my site is a blog, where the first thing you see upon opening the page is my posts, they also have cover images, a missing detail in the previous theme. SEO is currently doing better on the theme itself, but Moon had a much more complete SEO (more tags implemented), which leads me to believe that the site format is, in fact, the most significant factor here. To be statistically sure of this feeling, I should have done some &lt;a href=&quot;https://en.wikipedia.org/wiki/A/B_testing&quot;&gt;A/B testing&lt;/a&gt; for every change. But, I didn’t, so there is learning for the next change.&lt;/p&gt;

&lt;h2 id=&quot;a-reflection-on-this-process&quot;&gt;A reflection on this process&lt;/h2&gt;

&lt;p&gt;Going through this process of changing focus is normal. As needs change, so do the technology. And it is delicious to identify changes and have room for change to occur. In my case, this transformation happened gradually. I went from someone who had no interest in writing anything to someone who continually posts. I wrote on paid platforms and switched to free platforms looking to spread content without prohibitions caused by paywalls. My site has gone from being an online notepad to officially becoming a blog.&lt;/p&gt;

&lt;p&gt;And it was good to see the growth over these 3 years:&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/IMG_3911.PNG&quot; style=&quot;max-width:65%;&quot; /&gt;&lt;br /&gt; &lt;i&gt;Image showing the number of hits to the site between December 2016 and September 2019. You can see the valley caused by forgetting the analytics _tag_ there between January and June of 2019.&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;I do not believe that these numbers can be used to measure people, yet I consider this evolution to be a visible picture of the same changes I have experienced over the years, an evolution composed of ups and downs. And then finally arriving at a reward. Gosh, 17 thousand pageviews! Who would’ve guessed it?&lt;/p&gt;

&lt;h2 id=&quot;take-away-points&quot;&gt;Take away points&lt;/h2&gt;

&lt;p&gt;So let’s recap the learning points:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Choosing a theme that focuses on what you want to present makes all the difference in the interaction between users and your content;&lt;/li&gt;
  &lt;li&gt;If you like to keep track of what happens on your site don’t forget the analytics tag ;&lt;/li&gt;
  &lt;li&gt;If you have a website, learn a little SEO and if you use a plugin to assemble the SEO tags, learn how it works;&lt;/li&gt;
  &lt;li&gt;If you want to be statistically sure of the impact a change has on your site, do A/B testing.&lt;/li&gt;
&lt;/ol&gt;
</description>
        <pubDate>Fri, 27 Sep 2019 13:00:00 +0000</pubDate>
        <link>https://jtemporal.com/from-0-to-17-thousand-pageviews/</link>
        <guid isPermaLink="true">https://jtemporal.com/from-0-to-17-thousand-pageviews/</guid>
        
        <category>static site</category>
        
        <category>google analytics</category>
        
        <category>pageviews</category>
        
        <category>seo</category>
        
        <category>analytics</category>
        
        <category>blog</category>
        
        <category>site</category>
        
        <category>git</category>
        
        <category>github</category>
        
        <category>jekyll</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>De 0 a 17 mil pageviews</title>
        <description>&lt;p&gt;O primeiro website que eu coloquei no ar, era um site Django. Foi num tutorial da semana acadêmica do meu curso de graduação (Informática Biomédica) e foi ministrado pela comunidade Python de Ribeirão Preto. Foi a primeira vez que vi Python sendo usado de verdade e foi o meu primeiro &lt;em&gt;deploy&lt;/em&gt; com direito a Heroku e tudo, mas esse causo fica pra outro momento.&lt;/p&gt;

&lt;p&gt;Desde então, minhas habilidades de desenvolvimento evoluíram, eu conheci novas tecnologias, aprendi a contribuir avidamente com &lt;em&gt;open-source&lt;/em&gt; dá pra dizer que, de um modo geral, melhorei como desenvolvedora.&lt;/p&gt;

&lt;p&gt;Entre o primeiro site que coloquei no ar e hoje, aprendi muitas coisas,  e, entre elas, conheci formas alternativas de publicar sites. Sendo que de todas formas que aprendi até hoje, a minha forma favorita de colocar sites no ar é usando o GitHub Pages. Inclusive, eu &lt;a href=&quot;https://jtemporal.com/do-tema-ao-ar/&quot;&gt;até escrevi um tutorial sobre essa forma de colocar sites no ar&lt;/a&gt; com intuito de ajudar qualquer pessoa conheça GitHub e um tiquinho de git a ter um site.&lt;/p&gt;

&lt;h3 id=&quot;meu-site-minhas-regras&quot;&gt;Meu site, minhas regras&lt;/h3&gt;

&lt;p&gt;A primeira versão do &lt;a href=&quot;https://jtemporal.com&quot;&gt;jtemporal.com&lt;/a&gt; nunca foi estruturada para ser um blog, apesar de ter uma sessão para artigos e ser lá onde escrevia sobre conteúdos técnicos. Pense que meu site era uma espécie de bloco de notas público, eu escrevia sobre coisas que estudava ou estava aplicando no trabalho. Esse pequeno detalhe teve um impacto gigante no acesso aos conteúdos que publiquei. Quando eu decidi colocar o esse site no ar, escolhi um tema seguindo as seguintes regras:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Não pode ser &lt;em&gt;single page&lt;/em&gt; (página única);&lt;/li&gt;
  &lt;li&gt;Não pode ser primariamente um blog;&lt;/li&gt;
  &lt;li&gt;Tem que ser bonito e amigável para plataformas mobile.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depois de procurar bastante achei o meu primeiro tema: &lt;a href=&quot;http://taylantatli.github.io/Moon/&quot;&gt;o Moon&lt;/a&gt;. Era exatamente o que eu queria. Bonitinho, com umas animações legais, não era primariamente um blog, apesar de como disse anteriormente, ter um espaço para isso. Não era &lt;em&gt;single page&lt;/em&gt;, não sei o motivo, mas não gosto de sites single page &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;¯\_(ツ)_/¯&lt;/code&gt;. O Moon supria todas minhas necessidades.&lt;/p&gt;

&lt;p&gt;Eu gostei, e ainda gosto muito do Moon. Acho ele um tema bem feito e, durante os dois primeiros anos tendo um site e um lugar para colocar meus textos, eu aumentei consideravelmente a quantidade de artigos que escrevia.&lt;/p&gt;

&lt;p&gt;Eu desenvolvi uma habilidade e descobri uma vontade de escrever sobre conteúdos técnicos que eu não sabia que tinha, afinal de contas eu nunca quis ser escritora, redação nunca foi meu forte na escola e, apesar de ser uma aluna aplicada e me esforçar bastante para escrever textos descentes quando necessário, não achava aquilo ali fácil.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;https://giphygifs.s3.amazonaws.com/media/5BI679ybkAhJm/giphy.gif&quot; /&gt;&lt;br /&gt;&lt;a href=&quot;https://giphygifs.s3.amazonaws.com/media/5BI679ybkAhJm/giphy.gif&quot;&gt;Fonte&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;Bem, durante esses dois anos escrevi bastante, estudei mais ainda e aprendi inúmeras coisas. Uma dessas coisas foi como colocar uma &lt;em&gt;tag&lt;/em&gt; para acompanhar os acessos ao meu site usando o &lt;a href=&quot;https://marketingplatform.google.com/about/analytics/&quot;&gt;Google Analytics&lt;/a&gt;. Se você nunca ouviu falar de Google Analytics, tudo bem, por agora basta saber que é um conjunto de ferramentas do Google para acompanhar como seus clientes fazem nas soluções web. E uma das coisas que dá pra fazer justamente é acompanhar o comportamento de quem usa o seu site. Depois de começar a seguir altos e baixos em acessos, assisti meu site ter cerca de 8 mil acessos no mês. E tudo bem… eu não esperava ter nem 8 acessos que dirá 8 mil 😂&lt;/p&gt;

&lt;center&gt; &lt;img src=&quot;/images/IMG_3900.PNG&quot; style=&quot;max-width:65%;&quot; /&gt;&lt;br /&gt; &lt;i&gt;Imagem mostrando a quantidade de acessos ao site em Outubro de 2018&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;Escrever se tornou algo normal e parte do meu processo de aprendizado. Então, durante o fim de 2018, percebi que minhas necessidades e foco para o meu site mudaram: ao invés de ser um lugar que eu usava como bloco de notas para as coisas que eu escrevia, se tornou um lugar onde eu gosto de compartilhar conteúdo. Escrever se tornou meu novo normal.&lt;/p&gt;

&lt;h3 id=&quot;novas-regras-novo-site&quot;&gt;Novas regras, novo site&lt;/h3&gt;

&lt;p&gt;Assim como escrever passou fazer parte do meu dia a dia, meu site precisava finalmente passar por uma mudança, afinal de contas, parte das regras que me fizeram escolher o primeiro tema já não valiam mais. Eu precisava de um tema que o &lt;strong&gt;foco fosse o conteúdo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Então parti em busca de um novo tema. Não sei se você já reparou, mas existe uma tendência de sites onde o foco é conteúdo terem formato de cartão, o dev.to é assim, o Medium é assim também e por aí vai… Nada mais natural que, ao procurar um tema, eu encontrasse um em formato de cartões. O escolhido da vez foi o &lt;a href=&quot;%22https://webjeda.com/cards/%22&quot;&gt;Cards por Webjeda&lt;/a&gt; . Eu gostei do tema apesar de enxergar alguns pontos que precisavam de alteração pra deixar ele do jeito que eu queria. Com o novo tema escolhido, no começo desse 2019 fiz a transição entre o Moon e o Cards.&lt;/p&gt;

&lt;h3 id=&quot;cartões-pra-lá-cartões-pra-cá&quot;&gt;Cartões pra lá, cartões pra cá&lt;/h3&gt;

&lt;p&gt;Como ambos temas são Jekyll, baseados em markdown e como o mesmo padrão de criação de caminho para as postagens, a transição foi suave. Praticamente uma questão de copiar e colar os artigos de uma pasta para a outra. Também criei as artes para cada tipo de artigo para facilitar o trabalho, afinal não queria usar imagens aleatórias, por isso padronizei as imagens para corresponder ao tipo de artigo.&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;/images/covers/tutorial.webp&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;/images/covers/variados.webp&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;/images/covers/colinha.webp&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;/images/covers/palestra.webp&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;center&gt;&lt;i&gt;Algumas das capas que fiz para os artigos&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;Por fim, chegou a hora de colocar o site no ar. Esse passo também foi bem tranquilo já que a minha configuração é simples, bastava trocar no nome do repositório no GitHub, configurar o domínio e &lt;em&gt;pow&lt;/em&gt;! Site novo no ar!&lt;/p&gt;

&lt;p&gt;Depois de trocar de tema, como uma pessoa viciada em dados, eu continuei a assistir meu &lt;em&gt;analytics&lt;/em&gt; de perto, isso é… menos no mês que esqueci de colocar a &lt;em&gt;tag&lt;/em&gt; de rastreamento no site novo hehe&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;https://giphygifs.s3.amazonaws.com/media/GDnomdqpSHlIs/giphy.gif&quot; /&gt;&lt;br /&gt;&lt;a href=&quot;https://giphygifs.s3.amazonaws.com/media/GDnomdqpSHlIs/giphy.gif&quot;&gt;Fonte&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;Depois de perceber que estava sem a &lt;em&gt;tag&lt;/em&gt; e corrigir esse pequeno erro, voltamos à programação normal de assistir o &lt;em&gt;analytics&lt;/em&gt;. E no mês de Agosto bati um recorde! Cheguei a mais de 17mil acessos!&lt;/p&gt;

&lt;center&gt; &lt;img src=&quot;/images/IMG_3901.PNG&quot; style=&quot;max-width:65%;&quot; /&gt;&lt;br /&gt; &lt;i&gt;Imagem mostrando a quantidade de acessos ao site em Agosto de 2019&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;Claro que não foi só a alteração do tema que contribuiu para o crescimento nos acessos do site. O aumento de artigos de assuntos variados, o crescimento do &lt;a href=&quot;http://pizzadedados.com/&quot;&gt;Pizza de Dados&lt;/a&gt; podcast que fundei com meus amigos, e a melhoria nas &lt;em&gt;tags&lt;/em&gt; de SEO do tema, foram pontos que podem ter contribuído para o aumento de acessos.&lt;/p&gt;

&lt;p&gt;No entanto, essa é a primeira vez que o meu site é de fato um blog, onde a primeira coisa que você vê ao entrar são os meus textos, eles também tem imagens de capa, um detalhe faltante no tema anterior. O SEO atualmente está melhor em relação ao próprio tema, mas o Moon tinha um SEO muito mais completo (mais &lt;em&gt;tags&lt;/em&gt; implementadas). O que me leva a crer que o formato do site de fato é o fator mais importante aqui. Para ter certeza estatística desse sentimento, eu deveria ter feito um &lt;a href=&quot;https://pt.wikipedia.org/wiki/Teste_A/B&quot;&gt;teste A/B&lt;/a&gt; para cada alteração… Mas bem, não fiz então fica aí o aprendizado para a próxima.&lt;/p&gt;

&lt;h3 id=&quot;uma-reflexão-sobre-esse-processo&quot;&gt;Uma reflexão sobre esse processo&lt;/h3&gt;

&lt;p&gt;Passar por esse processo de mudança de foco é normal. Assim como a tecnologia se transforma, as necessidades também vão mudando. E é muito gostoso perceber e permitir que o ajuste necessário perante às mudanças ocorra. No meu caso elas aconteceram gradativamente. Passei de uma pessoa que não tinha interesse em escrever nada pra alguém que publica artigos constantemente. Escrevi em plataformas pagas e troquei para plataformas gratuitas procurando espalhar conteúdo sem proibições causadas por &lt;em&gt;paywalls&lt;/em&gt;. Meu site deixou de ser um bloco de notas público para se tornar oficialmente um blog.&lt;/p&gt;

&lt;p&gt;E foi bom ver o crescimento ao longo desses 3 anos:&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/IMG_3911.PNG&quot; style=&quot;max-width:65%;&quot; /&gt;&lt;br /&gt; &lt;i&gt;Imagem mostrando a quantidade de acessos ao site entre Dezembro de 2016 e Setembro de 2019. Dá para notar o vale causado pelo esquecimento da _tag_ ali entre Janeiro e Junho de 2019.&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;Eu não acredito que esses tipos de número são uma régua de pessoas, mesmo assim considero que essa evolução é um retrato bem claro das mesmas mudanças que passei ao longo desses anos, uma evolução composta de altos e baixos. E finalmente chegando a uma recompensa. Puxa vida. 17 mil &lt;em&gt;pageviews&lt;/em&gt;! Quem diria não é mesmo?&lt;/p&gt;

&lt;h3 id=&quot;principais-pontos&quot;&gt;Principais pontos&lt;/h3&gt;

&lt;p&gt;Então vamos recapitular bem os pontos de aprendizado:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Escolher um tema que seja focado no que você quer apresentar, isso vai fazer toda diferença na interação entre os usuários e o seu conteúdo;&lt;/li&gt;
  &lt;li&gt;Se você gosta de acompanhar o que acontece nos seu site não se esqueça da &lt;em&gt;tag&lt;/em&gt; de rastreio;&lt;/li&gt;
  &lt;li&gt;Se você tem um site, aprenda um pouco de SEO e se você usar um &lt;em&gt;plugin&lt;/em&gt; para montar as &lt;em&gt;tags&lt;/em&gt; de SEO, aprenda como ele funciona;&lt;/li&gt;
  &lt;li&gt;Se quiser ter certeza estatística do impacto que uma alteração tem no seu site faça testes A/B.&lt;/li&gt;
&lt;/ol&gt;
</description>
        <pubDate>Fri, 27 Sep 2019 13:00:00 +0000</pubDate>
        <link>https://jtemporal.com/de-0-a-17-mil-pageviews/</link>
        <guid isPermaLink="true">https://jtemporal.com/de-0-a-17-mil-pageviews/</guid>
        
        <category>português</category>
        
        <category>static site</category>
        
        <category>google analytics</category>
        
        <category>pageviews</category>
        
        <category>seo</category>
        
        <category>site estático</category>
        
        <category>analytics</category>
        
        <category>blog</category>
        
        <category>site</category>
        
        <category>git</category>
        
        <category>github</category>
        
        <category>jekyll</category>
        
        
      </item>
    
      <item>
        <title>Projetos Brasileiros para fazer pull requests nesse #Hacktoberfest o retorno</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/projetos-br-hacktoberfest-2025/&quot;&gt;Edição atual da lista disponível aqui&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Depois dos sucessos das listas &lt;a href=&quot;https://medium.com/nossa-coletividad/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-4dc9b9b576c0&quot;&gt;de 2017&lt;/a&gt; e &lt;a href=&quot;https://medium.com/@jessicatemporal/projetos-brasileiros-para-contribuir-nesse-hacktoberfest-vers%C3%A3o-2018-4925959b9411&quot;&gt;de 2018&lt;/a&gt;, esse é o terceiro ano que estou fazendo a lista/curadoria de projetos brasileiros para contribuir no #Hacktoberfest.&lt;/p&gt;

&lt;p&gt;Então a pedidos aqui vai! Uma lista toda repleta de projetos pra você contribuir nesse mês de Outubro!&lt;/p&gt;

&lt;p&gt;Novamente temos regrinhas:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ser um projeto criado/desenvolvido/mantido por brasileiras(os);&lt;/li&gt;
  &lt;li&gt;Ter pelo menos uma &lt;em&gt;issue&lt;/em&gt; aberta.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;avisos-para-2019&quot;&gt;Avisos para 2019&lt;/h2&gt;

&lt;p&gt;Pra começar, diferentemente do ano passado, Essa lista agora não está mais no Medium! Isso quer dizer que para ajudar ela a crescer você pode mandar o link do repositório ali nos comentários que eu coloco o projeto na lista oooouuu você pode aproveitar o espírito de contribuição e mandar um PR para essa página! O artigo &lt;a href=&quot;https://jtemporal.com/adicionando-um-novo-projeto-na-lista-da-hacktoberfest-2019/&quot;&gt;com as instruções de como adicionar projetos tá aqui&lt;/a&gt;. Todo mundo ganha &amp;lt;3.&lt;/p&gt;

&lt;p&gt;Os projetos continuam separados pela linguagem principal pra facilitar as buscas pra quem lê e também em ordem alfabética pela linguagem. 😉&lt;/p&gt;

&lt;p&gt;Happy Hacking!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt; C# &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alexsandro-xpt/ErysDownloader&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/845657?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alexsandro-xpt/ErysDownloader&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ErysDownloader, a frenetic and optimizate downloader library. Pure C# lightweight HTTP GET verb library for text/html content-type. No dependece.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/code-cracker/code-cracker&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/9695920?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;code-cracker/code-cracker&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An analyzer library for C# and VB that uses Roslyn to produce refactorings, code analysis, and other niceties.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; C &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cmatsuoka/libxmp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/317355?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cmatsuoka/libxmp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Libxmp is a library that renders module files to PCM data.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/hishamhm/htop&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/245621?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;hishamhm/htop&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;htop is an interactive text-mode process viewer for Unix systems. It aims to be a better &apos;top&apos;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/hardinfo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/hardinfo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;System profiler and benchmark tool for Linux systems&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lpereira/lwan&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/15001?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lpereira/lwan&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Experimental, scalable, high performance HTTP server&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; CSS &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/milligram/milligram&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16243913?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;milligram/milligram&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A minimalist CSS framework.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Clojure &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mauricioszabo/atom-chlorine&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/138037?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mauricioszabo/atom-chlorine&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; An Atom plugin to integrate with Socket-REPL over Clojure and ClojureScript&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; C++ &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/OtacilioN/Brasilino&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10578275?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;OtacilioN/Brasilino&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Uma biblioteca que permite programar em linguagem Arduino utilizando comandos facilitados em PT-BR.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/vinipsmaker/tufao&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/865914?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;vinipsmaker/tufao&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An asynchronous web framework for C++ built on top of Qt&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Elixir &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/philss/floki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/381213?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;philss/floki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Floki is a simple HTML parser that enables search for nodes using CSS selectors.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Go &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/OsProgramadores/op-website-hugo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/25752535?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;OsProgramadores/op-website-hugo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto do Site&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/avelino/awesome-go&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/31996?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;avelino/awesome-go&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A curated list of awesome Go frameworks, libraries and software &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gofn/gofn&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/25033801?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gofn/gofn&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Function process via docker provider (serverless minimalist)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/goreleaser/goreleaser&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24697112?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;goreleaser/goreleaser&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Deliver Go binaries as fast and easily as possible&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jonatasbaldin/ignore&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/8570364?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jonatasbaldin/ignore&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Download .gitignore files from the GitHub gitignore repository!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;hhttps://github.com/larien/learn-go-with-tests&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/29347337?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;larien/learn-go-with-tests&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tradução do livro de @quii sobre aprender Go com desenvolvimento orientado a testes&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prest&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/30427128?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prest&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;pREST is a way to serve a RESTful API from any databases written in Go&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/robertoduessmann/weather-api&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/9089383?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;robertoduessmann/weather-api&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A RESTful API to check the weather&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rodrigo-brito/gocity&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/44341229?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rodrigo-brito/gocity&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Code City metaphor for visualizing Go source code in 3D&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rumlang/rum&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/33993589?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rumlang/rum&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Functional language, easily extensible and possible (Lua features with LISP syntax and functional) to be embarked on software Go!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; JavaScript &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/Coderockr/vitrine-social&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/846756?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Coderockr/vitrine-social&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;O classificado de doações&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/MinisterioPublicoRJ/inloco&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/27096918?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;MinisterioPublicoRJ/inloco&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A Geographic Information System (GIS) used by Ministério Público do Estado do Rio de Janeiro to show social, institutional and administrative data , based on React and Leaflet, interacting with a GeoServer back-end. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/RocketChat/Rocket.Chat&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12508788?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;RocketChat/Rocket.Chat&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The ultimate Free Open Source Solution for team communications.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/UFERSA-Vai-de-Bike/ufersavdbAPI&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/37310309?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;UFERSA-Vai-de-Bike/ufersavdbAPI&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API em ExpressJS que servirá de backend para o sistema UFERSA Vai de Bike&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/eguatech/egua&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/54448514?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;eguatech/egua&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem de Programação Egua&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/filipedeschamps/doom-fire-algorithm&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/4248081?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;filipedeschamps/doom-fire-algorithm&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Playground for the fire effect from DOOM. Really simple algorithm and all experiments are welcome!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/monumentum/astronode&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/32710755?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;monumentum/astronode&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Exporting mongoose model as rest endpoints&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-FilaDaCreche&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-FilaDaCreche&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rafaelcastrocouto/foda&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/422159?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rafaelcastrocouto/foda&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;You are at FODA source code. Play now for free https://foda.app&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/origami.js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/origami.js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Powerful and Lightweight Library to create using HTML5 Canvas&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/react-ape&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/react-ape&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;• [Work in Progress] React Renderer to build UI interfaces using canvas/WebGL&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/raphamorim/react-tv&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3630346?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;raphamorim/react-tv&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;[Looking for maintainers] React development for TVs (Renderer for low memory applications and Packager for TVs) &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/klefki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/klefki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple substitution cipher module. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rdiego26/redis-session-storage&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1463578?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rdiego26/redis-session-storage&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Node App Storage sessions with redis.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/simonardejr/matador-de-monstros&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3685303?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;simonardejr/matador-de-monstros&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Minigame feito em Vue&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/withmoney/withmoney-api&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/44231290?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;withmoney/withmoney-api&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A Server Restfull in express to financial control.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/withmoney/withmoney-mobile&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/44231290?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;withmoney/withmoney-mobile&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;This is a mobile project for financial management, with vue.js.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/yanmagale/narigajs&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/5148042?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;yanmagale/narigajs&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; WIP. A node module that reports about air quality in a region&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zenorocha/clipboard.js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/398893?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zenorocha/clipboard.js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Modern copy to clipboard. No Flash. Just 3kb gzipped.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/zeucxb/dymock&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/11702749?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;zeucxb/dymock&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A CLI to simplify the way you create dynamics mocks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Julia &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JSONWebTokens.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JSONWebTokens.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Secure your Julia APIs with JWT. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/JuliaPackageWithRustDep.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/JuliaPackageWithRustDep.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Example of a Julia Package with Rust dependency.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipenoris/Mongoc.jl&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12482900?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipenoris/Mongoc.jl&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;MongoDB driver for the Julia Language &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Kotlin &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/ftwfy&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/ftwfy&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The real life Command/Ctrl + F - Android App that uses the Mobile Vision API to allow you to search for any occurrence of a text using your camera&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/wilder/lmgtfyGen&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12280517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;wilder/lmgtfyGen&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Lmgtfy Generator Open Source Android App - built to learn Kotlin, MVP architecture, Dagger and Rx&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; PHP &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PHPJasper/phpjasper&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/27956258?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PHPJasper/phpjasper&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A PHP report generator &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/RamonSilva20/mapos&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/12385697?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;RamonSilva20/mapos&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Sistema de Controle de Ordens de Serviço&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/hmac&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10817238?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/hmac&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;HMAC (Hash-based Message Authentication Code) in PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/caronae/caronae-backend&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/23268466?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;caronae/caronae-backend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Backend do Caronaê, app open-source de caronas usado por mais de 15 mil alunos da UFRJ&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/comuREDE/core&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/14811323?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;comuREDE/core&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Back e frontend com sensor autônomo / Back and frontend with standalone sensor &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/corcel/corcel&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://camo.githubusercontent.com/6cfc6b23889643f4438a4da4ab4de7398da9337f/68747470733a2f2f692e696d6775722e636f6d2f66484d717754462e706e67&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;corcel/corcel&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A collection of Model classes that allows you to get data directly from a WordPress database.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/laraerp/laraerp&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/10065592?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;laraerp/laraerp&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ERP brasileiro de código fonte aberto escrito em PHP utilizando o Laravel Framework&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/openboleto/openboleto&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/33834590?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;openboleto/openboleto&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Biblioteca para geração de boletos bancários em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/paulohenriquenj/crudificator&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1184825?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;paulohenriquenj/crudificator&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Gerador de Cruds em PHP&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/portabilis/i-educar&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/721282?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;portabilis/i-educar&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Lançando o maior software livre de educação do Brasil!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Pearl &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GouveaHeitor/nipe&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/10741284?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GouveaHeitor/nipe&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Nipe is a script to make Tor Network your default gateway.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Python &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/GabrielRF/RastreioBot&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/7331540?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;GabrielRF/RastreioBot&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Telegram Bot @RastreioBot &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/AfroPython/afropython-site&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/31807821?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;afropython/afropython-site&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Oficina gratuita de Programação utilizando a linguagem Python, com o objetivo de incluir mais pessoas negras na área de tecnologia da informação.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/allisson/python-simple-rest-client&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/5202?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;allisson/python-simple-rest-client&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Simple REST client for python 3.5+ &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/mre&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10817238?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/maker-regular-expressions&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório de um pacote simples para fazer expressões regulares em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/alvarofpp/python-adt-extension&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10817238?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;alvarofpp/python-adt-extension&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python abstract data structure (ADT) extension.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anapaulagomes/looong&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1899950?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anapaulagomes/looong&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Discovery of Long Parameter List &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anapaulagomes/pytest-picked&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1899950?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anapaulagomes/pytest-picked&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Run the tests related to the changed files (according to Git)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ayr-ton/kamu&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1090517?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ayr-ton/kamu&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;You favorite book library&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/berinhard/pyp5js&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/238223?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;berinhard/pyp5js&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Python to P5.js Transcriptor&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/cobrateam/splinter&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/403905?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;cobrateam/splinter&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;splinter - python test framework for web applications&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/sentry-patrol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/sentry-patrol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Command line interface for Sentry API &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/daneoshiga/tapioca-jarbas&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/917634?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;daneoshiga/tapioca-jarbas&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Tapioca wrapper for jarbas api &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/georgeyk/loafer&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/247603?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;georgeyk/loafer&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Asynchronous message dispatcher - Currently using asyncio and amazon SQS&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/gilsondev/django-rest-localflavor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/265653?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;gilsondev/django-rest-localflavor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Country-specific Django helpers, to use in Django Rest Framework &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/grupyrn/jararaca&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6994159?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;grupyrn/jararaca&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;GruPy-RN Event and Check-in System&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/internetlab-br/Twitter-Bots&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/40776372?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;internetlab-br/Twitter-Bots&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos utilizados para pesquisar sobre bots em perfis do Twitter &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/italomaia/flask-empty&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/14670?s=400&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;italo-maia/flask-empty&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;An empty project skeleton / boilerplate for flask projects. Powered by CookieCutter. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jtemporal/caipyra&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6595551?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jtemporal/caipyra&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;import caipyra module code&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/juditecypreste/PyRoles&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/36239583?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;juditecypreste/PyRoles&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Este é um bot no Telegram que faz upload automático de todas as fotos dos rolês que rolaram durante a PyBR!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/lamenezes/simple-model&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3208493?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;lamenezes/simple-model&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;data handling made easy &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/luanfonceca/speakerfight&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1490875?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;luanfonceca/speakerfight&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;The Easier way to choose the best talks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/manipuladordedados/pdiary&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1189862?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;manipuladordedados/pdiary&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A simple terminal-based diary journal application written in Python. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/mari-linhares/tensorflow-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/8157164?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;mari-linhares/tensorflow-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Códigos e materiais sobre TensorFlow em Português &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/odufrn/odufrn-api-py&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/52975911?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;odufrn/odufrn-api-py&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Wrapper da API da UFRN em Python&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/okfn-brasil/serenata-de-amor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1666382?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;okfn-brasil/serenata-de-amor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;🕵 Artificial Intelligence for social control of public administration&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/osantana/dicteval&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/160418?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;osantana/dicteval&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Evaluate expressions in dict/json objects&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/plenario/plenario&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/30255828?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;plenario/plenario&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-API&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-API&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;API da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Editor&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Editor&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt; Plataforma de edição de cardápios da aplicação PratoAberto&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pyladies-brazil/br-pyladies-pelican&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/8205116?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pyladies-brazil/br-pyladies-pelican&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site PyLadies Brasil usando Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/associados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/associados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Controle de associados a Associação PythonBrasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/planet&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/planet&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repo público para atualização da lista de sites do Planet PythonBrasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pythonbrasil/wiki&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/916137?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;pythonbrasil/wiki&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Site python.org.br estático com Pelican&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rochacbruno-archive/quokka&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/17439532?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rochacbruno-archive/quokka&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;LOOKING FOR NEW MAINTAINER - Quokka is a Content Management System - `docker run --rm -it -p 5000:5000 quokka/quokka`&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/rougeth/bottery&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/431892?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;rougeth/bottery&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A bot framework with batteries included &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/thaisviana/AlgPedia&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1753143?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;thaisviana/AlgPedia&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Projeto Final da Thata e do Tchotcho &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Ruby &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/anonydog/anonydog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/24738062?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;anonydog/anonydog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;On the internet, nobody knows you&apos;re a dog &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/magnetis/spok&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1625659?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;magnetis/spok&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Gem for dealing with workdays and restdays in an easy way. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/railsgirls/guides-ptbr&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1641104?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;railsgirls/guides-ptbr&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Rails Girls Guides - Brazilian Portuguese / Tutoriais Rails Girls - Português Brasileiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Scala &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/potigol/potigol&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1438144?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;potigol/potigol&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Linguagem Potigol - Linguagem de programação funcional moderna para iniciantes - A Functional Programming Language for Beginners &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Shell &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-plataforma-curriculo&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-plataforma-curriculo&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;No description&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Swift &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/caronae/caronae-ios&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/23268466?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;caronae/caronae-ios&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Aplicativo do Caronaê para iOS &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; TypeScript &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/Rocketseat/unform&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/Rocketseat/unform/master/.github/assets/logo.png&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;Rocketseat/unform&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;ReactJS form library to create uncontrolled form structures with nested fields, validations and much more!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brazilian-utils/brazilian-utils&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40146460?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brazilian-utils/brazilian-utils&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Utils library for specific Brazilian businesses&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/doczjs/docz&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/39714731?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;doczjs/docz&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;✍🏻It has never been so easy to document your things!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/prefeiturasp/SME-PratoAberto-Frontend&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7144299?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;prefeiturasp/SME-PratoAberto-Frontend&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Website que permite à população acompanhar o cardápio das escolas públicas de São Paulo.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2&gt; Variados &lt;/h2&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/CollabCodeTech/backend-challenges&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/28174963?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;CollabCodeTech/backend-challenges&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A public list of open-source challenges from jobs around the world&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/pizzadedados/pizzadedados&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/40184305?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/PizzaDeDados&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório do podcast Pizza de Dados - O podcast Brasileiro sobre ciência de dados&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/PizzaDeDados/datascience-pizza&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/40184305?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;PizzaDeDados/datascience-pizza&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para juntar informações sobre materiais de estudo em análise de dados e áreas afins, empresas que trabalham com dados e dicionário de conceitos&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/bellesamways/studynotes&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars0.githubusercontent.com/u/38008212?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;bellesamways/studynotes&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para armazenar todas as anotações de cursos feitos para minha própria consulta ou de outros.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/brasil-php/blog&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/17454678?s=88&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;brasil-php/blog&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para agregar posts do grupo do Telegram&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/codamos/codamos.github.io/&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/16601405?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;codamos/codamos.github.io&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório para o site Codamos, que reune eventos, palestras, workshops etc pelo Brasil inteiro&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/felipefialho/frontend-challenges&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars3.githubusercontent.com/u/3603793?s=460&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;felipefialho/frontend-challenges&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Listing some playful open-source&apos;s challenges of jobs to test your knowledge&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/jonatasbaldin/python-community-map&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars1.githubusercontent.com/u/8570364?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;jonatasbaldin/python-community-map&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;A map full of lovely Python communities&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/ocarneiro/para-entender-a-internet&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/2953926?s=180&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;ocarneiro/para-entender-a-internet&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Videos e memes obrigatórios para conversas do dia-a-dia &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;github-project-share&quot;&gt;
&lt;a style=&quot;text-decoration: none;&quot; href=&quot;https://github.com/react-brasil/empresas-que-usam-react-no-brasil&quot;&gt;


&lt;div class=&quot;github-project-share-card &quot;&gt;
&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16929016?s=200&amp;amp;v=4&quot; alt=&quot;&quot; /&gt;
&lt;h4&gt;react-brasil/empresas-que-usam-react-no-brasil&lt;/h4&gt;
&lt;br /&gt;
&lt;p&gt;Repositório que mostra empresas e projetos que utilizam React no Brasil&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;small&gt;github.com&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;

</description>
        <pubDate>Wed, 25 Sep 2019 09:00:00 +0000</pubDate>
        <link>https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-o-retorno/</link>
        <guid isPermaLink="true">https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-o-retorno/</guid>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contribuitions</category>
        
        <category>open-source</category>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Outubro de contribuição open-source com o #Hacktoberfest</title>
        <description>&lt;p&gt;Já está quase acabando o mês de Setembro e com isso se inicia os preparativos pra festa do mundo &lt;em&gt;open-source&lt;/em&gt;: o Hacktoberfest. A Digital Ocean liberou hoje (25/09/2019) &lt;a href=&quot;https://hacktoberfest.digitalocean.com&quot;&gt;o início do cadastramento para o Hacktoberfest na página oficial do evento&lt;/a&gt;. Ano passado, cerca de 46 mil camisetas foram enviadas para pessoas que contribuíram no mundo todo. Esse ano, as recompensas estão limitadas à 50 mil.&lt;/p&gt;

&lt;h2 id=&quot;o-hacktoberfest&quot;&gt;O Hacktoberfest&lt;/h2&gt;

&lt;p&gt;Esse ano, o evento é patrocinado pelo &lt;a href=&quot;https://dev.to/&quot;&gt;Dev.to&lt;/a&gt; e pela &lt;a href=&quot;https://www.digitalocean.com&quot;&gt;Digital Ocean&lt;/a&gt;, e é um evento que dura o mês inteiro e busca incentivar a participação em projetos &lt;em&gt;open-source&lt;/em&gt;.  Saber um pouquinho de código para participar é interessante, mas não se deixe intimidar, tem espaço para todos os níveis de conhecimento. E a melhor parte: qualquer pessoa que queira pode participar da sua própria casa!&lt;/p&gt;

&lt;h2 id=&quot;objetivos&quot;&gt;Objetivos&lt;/h2&gt;

&lt;p&gt;Abrir &lt;strong&gt;quatro&lt;/strong&gt; &lt;em&gt;pull requests&lt;/em&gt; em &lt;strong&gt;qualquer repositório público no GitHub&lt;/strong&gt; independente se esse projeto tem ou não &lt;em&gt;issues&lt;/em&gt; marcadas com a &lt;em&gt;label&lt;/em&gt; do evento. E não precisa ter seu &lt;em&gt;pull request&lt;/em&gt; aceito para ele ser contabilizado — alguns &lt;em&gt;pull requests&lt;/em&gt; demoram mesmo para serem revisados e aceitos — , mas imagina que legal ter contribuições aceitas? Todo mundo ganha!&lt;/p&gt;

&lt;h2 id=&quot;regras&quot;&gt;Regras&lt;/h2&gt;

&lt;p&gt;Mais uma vez, cada um dos quatro &lt;em&gt;pull requests&lt;/em&gt; precisam ser feitos entre os dias 1 e 31 de Outubro em qualquer fuso horário. E não vale fazer spam, &lt;em&gt;pull requests&lt;/em&gt; marcados como spam vão te tirar da brincadeira.&lt;/p&gt;

&lt;h2 id=&quot;como-participar&quot;&gt;Como participar&lt;/h2&gt;

&lt;p&gt;Você vai precisar ter uma conta no GitHub (&lt;a href=&quot;https://github.com/join?source=header-home&quot;&gt;vai lá! Faz a sua!&lt;/a&gt; É rapidinho 😉 ). Depois de ter a conta no GitHub, é necessário se &lt;a href=&quot;https://hacktoberfest.digitalocean.com/sign_up/register&quot;&gt;cadastrar no evento&lt;/a&gt; para contabilizar cada uma das cinco contribuições. Você vai precisar também saber um mínimo de como funciona Git (vou deixar alguns links sobre isso lá no fim no artigo).&lt;/p&gt;

&lt;h2 id=&quot;premiação&quot;&gt;Premiação&lt;/h2&gt;

&lt;p&gt;Além de dar os primeiros passos nessa onda de contribuições, aprender com o feedback que receber no seu &lt;em&gt;pull request&lt;/em&gt; e ajudar algum projeto legal, você pode ganhar uma camiseta linda! Como eu mencionei antes, esse ano as camisetas estão limitadas à 50 mil participantes então, não deixe suas contribuições pra última hora!&lt;/p&gt;

&lt;h2 id=&quot;projetos-para-mandar-o-seu-pr&quot;&gt;Projetos para mandar o seu PR&lt;/h2&gt;

&lt;p&gt;Então, pra te ajudar nessa linda missão de fazer seus quatro &lt;em&gt;pull requests&lt;/em&gt;, &lt;a href=&quot;https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-o-retorno/&quot;&gt;aqui tem uma lista linda de projetos que são mantidos ou foram criados por pessoas desse Brasilzão&lt;/a&gt;. Essa lista é pra ser colaborativa! Passa lá pra ver mais detalhes de como isso vai funcionar.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links-úteis&quot;&gt;Links úteis&lt;/h2&gt;

&lt;p&gt;Vou deixar aqui alguns links que podem ser úteis e te ajudar a iniciar no mundo de contribuições.&lt;/p&gt;

&lt;h3 id=&quot;contribuições&quot;&gt;Contribuições&lt;/h3&gt;

&lt;p&gt;Leia o texto da &lt;a href=&quot;https://medium.com/u/fbec442246b5?source=post_page-----c5672e97193f----------------------&quot;&gt;Leticia Portella&lt;/a&gt; sobre &lt;a href=&quot;https://medium.com/@leportella/como-contribuir-para-um-projeto-open-source-pela-primeira-vez-sem-escrever-c%C3%B3digo-21e55a896fb0&quot;&gt;como contribuir para um projeto sem escrever código&lt;/a&gt;. E, se inglês não for um problema, leia também o &lt;a href=&quot;https://opensource.guide/how-to-contribute/&quot;&gt;Open Source Guide sobre como contribuir&lt;/a&gt;, não importa se você é um veterano ou iniciante em contribuições.&lt;/p&gt;

&lt;h3 id=&quot;git&quot;&gt;Git&lt;/h3&gt;

&lt;p&gt;Para aprender Git, você pode seguir o &lt;a href=&quot;https://www.codecademy.com/pt/learn/learn-git&quot;&gt;curso de Git da codecademy&lt;/a&gt; ou o &lt;a href=&quot;https://www.codeschool.com/courses/try-git&quot;&gt;curso da CodeSchool&lt;/a&gt;, ambos muito bons. Git não é fácil, mas todo mundo pode aprender.&lt;/p&gt;

&lt;h3 id=&quot;hacktoberfest&quot;&gt;Hacktoberfest&lt;/h3&gt;

&lt;p&gt;Dá para conferir o que rolou na &lt;a href=&quot;https://blog.digitalocean.com/open-source-at-its-hacktoberbest/&quot;&gt;Hacktoberfest 2016&lt;/a&gt; e na &lt;a href=&quot;https://blog.digitalocean.com/hacktoberfest-2017-recap/&quot;&gt;Hacktoberfest de 2017&lt;/a&gt;. Muito importante também, o &lt;a href=&quot;https://hacktoberfest.digitalocean.com/&quot;&gt;site oficial do evento&lt;/a&gt; para mais informações.&lt;/p&gt;

&lt;p&gt;Também &lt;a href=&quot;https://hacktoberfest.digitalocean.com/stats/&quot;&gt;dá para conferir quantos &lt;em&gt;pull requests&lt;/em&gt; foram feitos&lt;/a&gt; depois de ter se cadastrado ;)&lt;/p&gt;
</description>
        <pubDate>Wed, 25 Sep 2019 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/outubro-de-contribuicao-open-source-com-o-hacktoberfest/</link>
        <guid isPermaLink="true">https://jtemporal.com/outubro-de-contribuicao-open-source-com-o-hacktoberfest/</guid>
        
        <category>português</category>
        
        <category>git</category>
        
        <category>github</category>
        
        <category>pull request</category>
        
        <category>pull requests</category>
        
        <category>contribuições</category>
        
        <category>Dev.to</category>
        
        <category>Digital Ocean</category>
        
        <category>hacktoberfest 2019</category>
        
        <category>hacktoberfest</category>
        
        
      </item>
    
      <item>
        <title>Como ser Cientista de Dados usando um computador da Xuxa?</title>
        <description>&lt;h4 id=&quot;a-resposta-simples-nuvem-vamos-ver-na-prática-como-é-viver-com-seus-jupyter-notebooks-na-nuvem-vaaamoooss&quot;&gt;A resposta simples: Nuvem! Vamos ver na prática como é viver com seus Jupyter Notebooks na nuvem? Vaaamoooss!!!&lt;/h4&gt;

&lt;p&gt;Uns dois anos atrás, enquanto eu estava trabalhando na &lt;a href=&quot;https://serenata.ai/&quot;&gt;Operação Serenata de Amor&lt;/a&gt;, meus colegas de trabalho costumavam dizer que eu tinha um computador da Xuxa ou algo tipo assim: &lt;center&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*iu4Fht5QlGZcO-V30SjzxQ.jpeg&quot; /&gt;&lt;a href=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Pense_bem.jpg/1200px-Pense_bem.jpg&quot;&gt;Fonte&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;Nada contra os computadores da Xuxa ou o Pense Bem, mas se você considerar que no trabalho com ciência de dados, &lt;em&gt;machine learning&lt;/em&gt;, inteligência artificial e afins, nem o computador da Xuxa, nem o Pense Bem e, nem tão pouco 4GB de RAM, vão ser o suficiente para rodar tarefas que requerem grandes quantidades de dados em memória ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;Enquanto cientista de dados, a maior parte do trabalho envolve tarefas “pesadas”. Uma solução para resolver rapidamente a falta de capacidade de processamento do computador é o uso de uma &lt;strong&gt;máquina na nuvem&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;vantagens&quot;&gt;Vantagens&lt;/h3&gt;

&lt;p&gt;Mas o que faz a nuvem tão diferente assim? E o que faz dela um lugar tão mágico?&lt;/p&gt;

&lt;p&gt;Hoje, um dos maiores desafios de ciência de dados e mais especificamente da área &lt;a href=&quot;https://podcast.pizzadedados.com/e/episodio-012-big-data/&quot;&gt;de &lt;em&gt;big data&lt;/em&gt; é conseguir processar uma quantidade enorme de dados em pouco tempo e sem gastar muito&lt;/a&gt; para isso. E, nessas horas, a nuvem é seu maior aliado.&lt;/p&gt;

&lt;p&gt;Hoje, no Brasil, você &lt;strong&gt;não&lt;/strong&gt; encontra um Notebook leve com uma configuração robusta, com mais do que 16GB de RAM e um SSD com mais do que 128GB, por menos de 7 mil reais. Desembolsar essa quantidade de dinheiro está além da realidade financeira da maioria das pessoas.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Data centers&lt;/em&gt; de gigantes da tecnologia, como&lt;a href=&quot;https://www.digitalocean.com&quot;&gt; Digital Ocean&lt;/a&gt; (DO), &lt;a href=&quot;https://aws.amazon.com/free/?sc_channel=PS&amp;amp;sc_campaign=acquisition_BR&amp;amp;sc_publisher=google&amp;amp;sc_medium=english_cloud_computing_hv_b&amp;amp;sc_content=aws_core_e&amp;amp;sc_detail=amazon%20web%20services&amp;amp;sc_category=cloud_computing&amp;amp;sc_segment=188845125590&amp;amp;sc_matchtype=e&amp;amp;sc_country=BR&amp;amp;s_kwcid=AL!4422!3!188845125590!e!!g!!amazon%20web%20services&amp;amp;ef_id=WOL2gwAAAOiSCw9m:20170404012731:s&quot;&gt;Amazon Web Services&lt;/a&gt; (AWS), &lt;a href=&quot;https://cloud.google.com/compute/docs/instances/?hl=pt-br&quot;&gt;Google Cloud&lt;/a&gt; e &lt;a href=&quot;https://azure.microsoft.com/pt-br/&quot;&gt;Azure&lt;/a&gt;, têm disponibilizado acesso de baixo custo a máquinas com capacidade de processamento maior que os tais notebooks de 7 mil reais. Além disso, uma conexão com pouca largura de banda é o suficiente para acessar sua máquina na nuvem e colocar os &lt;em&gt;scripts&lt;/em&gt; para rodarem.&lt;/p&gt;

&lt;p&gt;Essas máquinas disponíveis conseguem, em questão de poucas horas, executar processamentos que levariam dias ou mesmo não iriam rodar em computadores convencionais.&lt;/p&gt;

&lt;h3 id=&quot;desvantagens&quot;&gt;Desvantagens&lt;/h3&gt;

&lt;p&gt;Mas a nuvem não é só feita de vantagens, existem alguns pontos que ainda &lt;strong&gt;me&lt;/strong&gt; incomodam ao usá-la. Por exemplo, todos as empresas que oferecem esse tipo de serviço com qualidade irrefutável são &lt;em&gt;gringas&lt;/em&gt; e cobram em dólares. Ainda falta um serviço brasileiro que seja barato e confiável o suficiente para nos fazer trocar os serviços oferecidos pela DO e pela AWS por exemplo.&lt;/p&gt;

&lt;p&gt;Ainda ouso dizer que, por mais que as máquinas sejam &lt;em&gt;plug-and-play&lt;/em&gt;, é necessário que algumas pequenas configurações sejam realizadas para de fato garantir a usabilidade mínima, obrigando assim ao cientista de dados a ter mais de um chapéu e, nesse caso, assumir o chapéu &lt;a href=&quot;https://pt.m.wikipedia.org/wiki/Administrador_de_sistemas&quot;&gt;&lt;em&gt;SysAdmin&lt;/em&gt;&lt;/a&gt; da coisa.&lt;/p&gt;

&lt;h3 id=&quot;jupyter-in-the-cloud-with-diamonds&quot;&gt;Jupyter in the cloud with diamonds&lt;/h3&gt;

&lt;p&gt;Okay, mas vamos supor que você já tem sua máquina maravilha bonitinha lá no &lt;em&gt;insira-aqui-seu-serviço-de-nuvem-favorito​&lt;/em&gt;. E aí? Como fica o &lt;a href=&quot;https://jupyter.org/&quot;&gt;Jupyter Notebook&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;A &lt;a href=&quot;https://medium.com/u/a84fab589b6c&quot;&gt;Ana Schwendler&lt;/a&gt; &lt;a href=&quot;https://medium.com/data-science-brigade/validando-hip%C3%B3teses-d51ae1f46052&quot;&gt;já falou aqui sobre como&lt;/a&gt; os cientistas do Serenata usam Jupyter Notebooks para explorar os dados e validar ou negar hipóteses. Normalmente, o notebook é rodado localmente na máquina de quem esteja programando, mas quando a pessoa começa a usar uma máquina na nuvem como rola esse processo?&lt;/p&gt;

&lt;h3 id=&quot;vivendo-nas-nuvens&quot;&gt;Vivendo nas nuvens&lt;/h3&gt;

&lt;center&gt;
  &lt;br /&gt;
  &lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*YK0o59-niSDgu_eCBTsECg.gif&quot; /&gt;
  &lt;br /&gt;
  &lt;a href=&quot;https://media.giphy.com/media/13bGgH9VnEDsuA/giphy.gif&quot;&gt;Fonte&lt;/a&gt;
&lt;/center&gt;

&lt;p&gt;O jeito mais prático de acessar uma máquina na nuvem é via conexão SSH. O SSH é um protocolo que&lt;a href=&quot;https://pt.wikipedia.org/wiki/Secure_Shell&quot;&gt; permite acessar máquinas remotamente de forma segura&lt;/a&gt;. Existem formas de estabelecer uma conexão SSH usando programas como o &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; e o &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;, mas se você tiver acesso a um terminal, você também pode fazer isso usando um comando, passando seu usuário na máquina remota e o endereço (host) dessa máquina, algo assim:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ssh user@host
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Mas o que é esse SSH finalmente e como ele funciona?&lt;/em&gt; Na prática, o SSH nada mais é que um jeito seguro de fazer &lt;em&gt;login&lt;/em&gt; num computador que &lt;strong&gt;não&lt;/strong&gt; está pertinho de você e ele funciona como uma chave e um cadeado. Quando você vai entrar em casa, normalmente você tem que destrancar o cadeado, e o SSH funciona exatamente da mesma forma, você tem um par de arquivos que são chamados de chave e cumprem o papel da chave e o cadeado de casa.&lt;/p&gt;

&lt;p&gt;Aí, ao invés de fazer um &lt;em&gt;login&lt;/em&gt; tradicional com usuário e senha, você pode usar o SSH para se conectar a sua máquina na nuvem. Basta que no servidor tenha o seu cadeado (chave pública) e que você tenha a chave (chave privada) na sua máquina local. Pra quem usa programas como os que falei anteriormente, esses programas se encarregam de gerenciar essas chaves para você.&lt;/p&gt;

&lt;p&gt;Num servidor Linux, o lugar padrão para encontrar os cadeados é o arquivo &lt;em&gt;authorized_keys&lt;/em&gt; dentro da pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.ssh&lt;/code&gt;. O mais legal é que uma mesma máquina pode ter várias chaves públicas dentro desse arquivo assim, todo o time que precisar acessar aquela máquina consegue. Isso permite por exemplo, o compartilhamento de recursos entre os integrantes do time, barateando ainda mais os custos para rodar tarefas pesadas.&lt;/p&gt;

&lt;p&gt;Hoje em dia, por trabalhar de um computador com o Windows, mas tendo familiaridade com o Linux — eu uso o Git Bash, um &lt;a href=&quot;https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29&quot;&gt;terminal Bash&lt;/a&gt; distribuído com a instalação do Git e muito útil ❤. Acessar a máquina na nuvem via linha de comando funciona pra mim, mas se você preferir usar programas, fique à vontade, o gosto é do freguês e você deve escolher aquilo que for mais confortável para você 😉. Daqui pra frente eu vou mostrar como usar o terminal para fazer o que a gente precisa. Então, para acessar uma máquina usando o terminal basta fazer o seguinte:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ssh jessicatemporal@34.66.48.61
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;e você tá lá nas nuvens 😉&lt;/p&gt;

&lt;p&gt;Vamos entender o comando:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssh&lt;/code&gt;: é o programa para estabelecer uma conexão SSH;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jessicatemporal&lt;/code&gt;: é o meu usuário de acesso na máquina lá na nuvem;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;34.66.48.61&lt;/code&gt;: é o endereço de IP da máquina que estou querendo acessar (aqui estou mostrando pra você um IP fictício apenas para exemplificar, tá?).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora que você acessou a sua máquina você pode rodar o Jupyter Notebook:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ jupyter notebook --no-browser
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note que eu passei um parâmetro a mais ali o&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--no-browser&lt;/code&gt; que serve para o Jupyter Notebook rodar sem abrir um navegador.&lt;/p&gt;

&lt;h3 id=&quot;vivendo-de-portais&quot;&gt;Vivendo de portais&lt;/h3&gt;

&lt;p&gt;Quando rodamos o Jupyter Notebook no nosso computador, um canal de comunicação é escolhido para que a gente possa visualizar nossos notebooks, esse canal é conhecido como &lt;em&gt;porta&lt;/em&gt; e, na configuração padrão do Jupyter, é a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8888&lt;/code&gt;. Assim a gente consegue acessar no nosso navegador o caminho &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[https://localhost:8888](http://localost:8888)&lt;/code&gt; e rodar nossos notebooks certo?&lt;/p&gt;

&lt;p&gt;Mas, agora o Jupyter não está rodando no seu computador local então, vamos usar a nossa conexão SSH para ligar uma das portas do nosso computador com a porta do servidor em que o Jupyter está rodando. Para isso, você usa o argumento &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-L&lt;/code&gt; que gera o que é conhecido como &lt;em&gt;port forwarding&lt;/em&gt;. Seu acesso SSH ficaria mais ou menos assim:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ssh -L 8888:localhost:8080 jessicatemporal@34.66.48.61
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Em termos não técnicos, o &lt;em&gt;port forwarding&lt;/em&gt; funciona como um portal.&lt;/p&gt;

&lt;center&gt;
  &lt;br /&gt;
  &lt;img src=&quot;https://media.giphy.com/media/12VWf9OaUMlUyc/giphy.gif&quot; /&gt;
  &lt;br /&gt;&lt;a href=&quot;https://media.giphy.com/media/12VWf9OaUMlUyc/giphy.gif&quot;&gt;Fonte&lt;/a&gt;
&lt;/center&gt;

&lt;p&gt;Se você cria um portal para algum lugar consegue ver o que está acontecendo nesse lugar. Também é assim que a gente consegue estabelecer um canal de comunicação e saber o que está rolando no servidor, criando um túnel (portal) que liga a porta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8080&lt;/code&gt; da minha máquina local a porta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8888&lt;/code&gt; do servidor:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1200/1*J-HKcdqv-XcnH8eit8M7PQ.png&quot; alt=&quot;imagem mostrando o tunel no terminal&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Com isso você consegue abrir no navegador do seu computador e acessar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://localhost:8080&lt;/code&gt; para ver seus notebooks:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1200/1*zCgW_BhKtuxDiMNSNPix7A.png&quot; alt=&quot;imagem do navegador em local host&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;finalmente&quot;&gt;Finalmente&lt;/h3&gt;

&lt;p&gt;Depois de colocar seu Jupyter para rodar na nuvem, e acessá-lo usando o túnel, a construção do notebook em si não muda muita coisa. Você irá continuar a fazer suas análises como normalmente faz, com a pequena diferença que agora você tem o poder da nuvem ao seu alcance.&lt;/p&gt;

&lt;center&gt;
  &lt;br /&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*5pXyE0DGdhS9GcefQgiBoQ.gif&quot; /&gt;
  &lt;br /&gt;&lt;a href=&quot;https://media.giphy.com/media/2xFZQFpPwIcs7Rx3ZF/giphy.gif&quot;&gt;Fonte&lt;/a&gt;
&lt;/center&gt;

&lt;p&gt;Agora vai lá e conquiste a nuvem você também! Xêro.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;dicas&quot;&gt;Dicas&lt;/h3&gt;

&lt;p&gt;Se quiser aprender mais sobre o SSH recomendo:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.openssh.com/manual.html&quot;&gt;Ler o manual dele&lt;/a&gt; a medida que precisar;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.alexonlinux.com/ssh-crash-course&quot;&gt;Esse post&lt;/a&gt; que faz um curso rápido de SSH;&lt;/li&gt;
  &lt;li&gt;Esse &lt;a href=&quot;http://www.cheat-sheets.org/saved-copy/OpenSSH_quickref.pdf&quot;&gt;infográfico de referência&lt;/a&gt; sobre o SSH;&lt;/li&gt;
  &lt;li&gt;Se você quiser rodar o Jupyter numa instância do Google Cloud &lt;a href=&quot;https://medium.com/@kn.maragatham09/installing-jupyter-notebook-on-google-cloud-11979e40cd10&quot;&gt;esse post aqui tá guardado no coração&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 03 Jun 2019 12:00:00 +0000</pubDate>
        <link>https://jtemporal.com/como-ser-cientista-de-dados-usando-um-computador-da-xuxa/</link>
        <guid isPermaLink="true">https://jtemporal.com/como-ser-cientista-de-dados-usando-um-computador-da-xuxa/</guid>
        
        <category>tutorial</category>
        
        <category>jupyter</category>
        
        <category>jupyter notebooks</category>
        
        <category>ssh</category>
        
        <category>cloud</category>
        
        <category>cloud computing</category>
        
        <category>data science</category>
        
        <category>ciencia de dados</category>
        
        <category>tunel</category>
        
        <category>portal</category>
        
        <category>serenata de amor</category>
        
        <category>open source</category>
        
        <category>computer power</category>
        
        <category>vantagens</category>
        
        <category>desvantagens</category>
        
        
      </item>
    
      <item>
        <title>Raspagem de dados sem escrever código</title>
        <description>&lt;p&gt;Isso mesmo: existem alguns tipos de dados que conseguimos raspar sem precisar da ajuda de uma linguagem de programação. E eu vou te mostrar como fazer isso! Para esse tutorial você vai precisar dos seguintes materiais:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Conhecimento básico de HTML (reconhecer a tag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;table&amp;gt;&lt;/code&gt;);&lt;/li&gt;
  &lt;li&gt;Acesso a internet;&lt;/li&gt;
  &lt;li&gt;Seu navegador favorito;&lt;/li&gt;
  &lt;li&gt;Um site para coletar informação.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo esse tutorial, vai lá para a revista do Pizza 👇&lt;/p&gt;

&lt;center&gt;
&lt;a href=&quot;https://medium.com/pizzadedados/raspando-sem-codigo-37caa24395ee&quot;&gt;
&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; /&gt;
&lt;/a&gt;
&lt;/center&gt;
</description>
        <pubDate>Wed, 08 May 2019 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/raspagem-de-dados-sem-escrever-codigo/</link>
        <guid isPermaLink="true">https://jtemporal.com/raspagem-de-dados-sem-escrever-codigo/</guid>
        
        <category>medium</category>
        
        <category>web scrapping</category>
        
        <category>raspagem de dados</category>
        
        <category>raspar dados</category>
        
        <category>coletar dados</category>
        
        <category>scrap data</category>
        
        <category>data scraping</category>
        
        <category>html</category>
        
        <category>table</category>
        
        <category>tables</category>
        
        
      </item>
    
      <item>
        <title>Transformando um site feito em Jekyll em uma página de um site feito em Pelican</title>
        <description>&lt;p&gt;No post &lt;a href=&quot;https://jtemporal.com/movendo-um-site-construido-com-jekyll-para-dentro-de-um-site-construido-com-pelican/&quot;&gt;&lt;em&gt;“Movendo um site construído com Jekyll para dentro de um site construído com Pelican”&lt;/em&gt;&lt;/a&gt; eu contei a jornada que foi mover o site do PyLadies BR Conf para dentro do site do PyLadies Brasil. Aqui vai o passo a passo final com comandos que usei tudo isso.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Nota da autora:&lt;/strong&gt; Aqui ensino o passo a passo para novas edições do PyLadies BR Conf, mas os comandos podem ser ajustados para fazer a mesma coisa com outros sites.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;ingredientes&quot;&gt;Ingredientes&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Um repositório do site conferência clonado e configurado&lt;/li&gt;
  &lt;li&gt;Um repositório do site oficial PyLadies Brasil clonado e configurado&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;preparativos&quot;&gt;Preparativos&lt;/h2&gt;

&lt;p&gt;No repositório da conferência, ajuste o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;a variável &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;base_url&lt;/code&gt; deve conter um valor seguindo o padrão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/conf-X&lt;/code&gt; onde &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X&lt;/code&gt; indica a edição da conferência&lt;/li&gt;
  &lt;li&gt;a variável &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url&lt;/code&gt; deve conter o domínio &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://brasil.pyladies.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você pode encontrar um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; &lt;a href=&quot;https://github.com/pyladies-brazil/conf/blob/1eeb8e7ed0decbec5644677b7099fce9228b950b/_config.yml#L4-L5&quot;&gt;ajustado para a primeira edição da conferência aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;No repositório do site do PyLadies Brasil, ajuste o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pelicanconf.py&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;acrescente o nome da pasta nova na variável &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATIC_PATHS&lt;/code&gt; seguindo o padrão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/conf-X&lt;/code&gt; onde &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X&lt;/code&gt; indica a edição da conferência;&lt;/li&gt;
  &lt;li&gt;acrescente a cofiguração de metadata da pasta nova na variável &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTRA_PATH_METADATA&lt;/code&gt; seguindo o padrão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;conf-X&apos;: {&apos;path&apos;: &apos;conf-X&apos;}&lt;/code&gt; onde &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X&lt;/code&gt; indica a edição da conferência&lt;/li&gt;
  &lt;li&gt;Crie uma pasta vazia dentro da pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;content/&lt;/code&gt; seguindo o padrão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/conf-X&lt;/code&gt; onde &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X&lt;/code&gt; indica a edição da conferência&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você pode encontrar um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pelicanconf.py&lt;/code&gt; &lt;a href=&quot;https://github.com/pyladies-brazil/br-pyladies-pelican/blob/3feaa42eb7096b3653d490494b3ef33f22887145/pelicanconf.py#L58-L72&quot;&gt;ajustado para a primeira edição da conferência aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;misturando-ingredientes&quot;&gt;Misturando ingredientes&lt;/h2&gt;

&lt;p&gt;A partir de agora todos os comandos vão ser referentes a pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conf-1/&lt;/code&gt; então, lembre-se de ajustar os comandos para a edição da conferência que estiver criando. No repositório da conferência, rode o comando para fazer &lt;em&gt;build&lt;/em&gt; do site:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ jekyll build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Isso deve gerar a pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site/&lt;/code&gt;. Agora copie o conteúdo da pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site/&lt;/code&gt; para dentro da pasta da conferência que criamos:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cp -r conf/_site/* br-pyladies-pelican/content/conf-1/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;levando-ao-forno&quot;&gt;Levando ao forno&lt;/h2&gt;

&lt;p&gt;Se tudo funcionou corretamente até aqui faça o &lt;em&gt;build&lt;/em&gt; do site do PyLadies Brasil:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ html serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;e confira se consegue acessar o site da conferência em: &lt;a href=&quot;https://localhost:8000/conf-1&quot;&gt;https://localhost:8000/conf-1&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;servindo&quot;&gt;Servindo&lt;/h2&gt;

&lt;p&gt;Faça os &lt;em&gt;commits&lt;/em&gt; das alterações e abra o &lt;em&gt;pull request&lt;/em&gt; 😉&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Você pode ver o &lt;a href=&quot;https://github.com/pyladies-brazil/br-pyladies-pelican/pull/237&quot;&gt;&lt;em&gt;pull request&lt;/em&gt; que eu fiz para a primeira edição aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Xêro.&lt;/p&gt;
</description>
        <pubDate>Sun, 28 Apr 2019 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/transformando-um-site-jekyll-em-uma-pagina-de-um-site-pelican/</link>
        <guid isPermaLink="true">https://jtemporal.com/transformando-um-site-jekyll-em-uma-pagina-de-um-site-pelican/</guid>
        
        <category>tutorial</category>
        
        <category>jekyll</category>
        
        <category>pelican</category>
        
        <category>python</category>
        
        <category>ruby</category>
        
        <category>gerador de site estático</category>
        
        <category>static site generator</category>
        
        <category>github pages</category>
        
        <category>pyladies</category>
        
        <category>pyladies br conf</category>
        
        
      </item>
    
      <item>
        <title>Movendo um site construído com Jekyll para dentro de um site construído com Pelican</title>
        <description>&lt;p&gt;Ano passado aconteceu a primeira edição do PyLadies BR Conf lá em Natal no Rio Grande do Norte. A edição desse ano vai acontecer na cidade de São Paulo e, com o início dos preparativos para a segunda edição, precisamos mover o site da edição passada para um novo lugar. Aqui vou contar a história de como isso aconteceu.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Nota da autora:&lt;/strong&gt; Se você não tiver interesse na jornada que culminou em ter o site no ar, &lt;a href=&quot;https://jtemporal.com/transformando-um-site-jekyll-em-uma-pagina-de-um-site-pelican/&quot;&gt;a receita de bolo com os comandos para chegar nesse resultado pode ser encontrada aqui&lt;/a&gt;. 😉&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;contexto&quot;&gt;Contexto&lt;/h2&gt;

&lt;p&gt;Para começar os trabalhos você precisa saber que &lt;a href=&quot;http://brasil.pyladies.com/&quot;&gt;o site oficial do PyLadies&lt;/a&gt; Brasil é construído com um gerador de sites estáticos escrito em Python chamado &lt;a href=&quot;https://docs.getpelican.com/en/stable/&quot;&gt;Pelican&lt;/a&gt;. Eu particularmente não sou fã do Pelican, mas escolhas pessoais à parte, ele tem funcionado muito bem como o site da PyLadies até o momento.&lt;/p&gt;

&lt;p&gt;Já &lt;a href=&quot;https://pyladies-brazil.github.io/conf/&quot;&gt;o site do PyLadies BR Conf&lt;/a&gt;, foi feito usando um gerador de sites estáticos diferente: &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;o Jekyll,&lt;/a&gt; que é feito em Ruby. Embora não seja feito em Python ele foi escolhido por vários motivos, um deles sendo a ampla &lt;a href=&quot;http://jekyllthemes.org/&quot;&gt;biblioteca de templates prontos&lt;/a&gt;, o que facilitou o site da conferência de ser customizado e colocado no ar.&lt;/p&gt;

&lt;p&gt;No entanto, agora que estamos organizando a segunda edição do evento, nos deparamos com a seguinte situação:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Queremos colocar o site da edição nova no ar aproveitando a versão antiga e ao mesmo tempo mantendo também a versão anterior no ar por motivos históricos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Existia várias formas de tornar isso possível, cada uma delas com seus lados positivo e negativo, por exemplo, poderíamos criar um novo repositório para o site desse ano. Mas daqui alguns anos com várias edições do evento tendo acontecido teríamos uma quantidade infindável de repositórios sem atualizações. Com isso uma solução interessante seria colocar o site da primeira edição com uma página do site oficial do PyLadies, assim manteríamos o histórico do evento vivo.&lt;/p&gt;

&lt;h2 id=&quot;preparando-o-pelican&quot;&gt;Preparando o Pelican&lt;/h2&gt;

&lt;p&gt;No Pelican é costumeiro encontrar todos os arquivos de conteúdo dentro da pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;content/&lt;/code&gt;, é nela que encontramos um diretório chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;extra/&lt;/code&gt; que contém arquivos estáticos como o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;robots.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esses arquivos estáticos e essa pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;extra/&lt;/code&gt;, assim como a pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;images/&lt;/code&gt;, precisam ser mapeados dentro de duas variáveis no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pelicanconf.py&lt;/code&gt;. Essa variáveis fazem o controle de arquivos estáticos para que o Pelican, ao fazer o &lt;em&gt;build&lt;/em&gt; do site, possa copiar esses arquivos para pasta de &lt;em&gt;build&lt;/em&gt;. Inicialmente elas estavam assim:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/33c16fbd43e7d4c1ed6e7b1fc2b8a4aa.js&quot;&gt;&lt;/script&gt;

&lt;center&gt;&lt;a href=&quot;https://github.com/pyladies-brazil/br-pyladies-pelican/pull/237/files#diff-bee76e83181b4a5548a4ffecd1bea88d&quot;&gt;Fonte&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;Então ao olhar para isso inferi que se eu colocasse um arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;teste.html&lt;/code&gt; dentro da pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;content/extra/&lt;/code&gt; e mapeasse ele dentro dessas variáveis, eu encontraria o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;teste.html&lt;/code&gt; ele estaria no site buildado. Então alterei as variáveis de controle acrescentando as configurações no mesmo padrão para o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;teste.html&lt;/code&gt;:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/3099644801ed70e7717fe6cb9e7a318b.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Normalmente, o Pelican tenta interpretar todos os arquivos dentro da pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;content/&lt;/code&gt; e gerar um arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTML&lt;/code&gt; de resultado. Por isso, tentei fazer o &lt;em&gt;build&lt;/em&gt; do site com essas alterações encontrei o &lt;strong&gt;primeiro erro&lt;/strong&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ERROR: Skipping teste.html: could not find information about &apos;NameError: title&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Algumas horas depois de muitas tentativas falhas e de vasculhar a internet para achar o que poderia resolver esse erro, eu encontrei &lt;a href=&quot;https://github.com/getpelican/pelican/issues/1157&quot;&gt;essa issue no GitHub do Pelican&lt;/a&gt; onde a pessoa tinha tido o mesmo problema e encontrado a solução. O que me faltava para resolver o problema era adicionar a seguinte linha ao &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pelicanconf.py&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;READERS = {&apos;html&apos;: None}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A variável &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;READERS&lt;/code&gt; serve para indicar &lt;em&gt;parseadores&lt;/em&gt; de arquivos, ao criá-la com o valor acima, estamos dizendo para o Pelican não fazer o &lt;em&gt;parse&lt;/em&gt; de arquivos &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTML&lt;/code&gt;. Ufa, problema resolvido, tudo funcionando, o Pelican serviu o arquivo perfeitamente: consegui acessar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localhost:8000/teste&lt;/code&gt; e ver o arquivo de &lt;em&gt;teste&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;gerando-o-site-da-conferência-localmente&quot;&gt;Gerando o site da conferência localmente&lt;/h2&gt;

&lt;p&gt;Primeiro teste feito, chegou a hora de gerar o site localmente. Como eu falei ali em cima, o site da conferência foi feito em Jekyll, um dos motivos para isso era que o próprio GitHub se encarrega de fazer o &lt;em&gt;build&lt;/em&gt; do site para colocar ele no ar. Isso é ótimo porém nos impede de ter acesso ao site &lt;em&gt;buildado&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Então para termos os site &lt;em&gt;buildado&lt;/em&gt; e colocar ele como uma página no site oficial eu rodei o &lt;em&gt;build&lt;/em&gt; localmente. Eu fiz um &lt;a href=&quot;https://jtemporal.com/do-tema-ao-ar/&quot;&gt;tutorial bem detalhado&lt;/a&gt; de como rodar e colocar um site no ar com Jekyll, então não vou entrar detalhes da explicação de cada comando aqui, mas recomendo você passar lá pra ler depois caso queira entender melhor.&lt;/p&gt;

&lt;p&gt;Pra começar eu já tinha o repositório do site da conferência clonado no meu computador e também já tinha instalado todas as bibliotecas que precisava pra construir o site, então eu alterei o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; trocando os valores das chaves &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;base_url&lt;/code&gt; e &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url&lt;/code&gt; assim:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;baseurl: &quot;/conf-1&quot;
url: &quot;https://brasil.pyladies.com&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Com essa alteração o site &lt;em&gt;buildado&lt;/em&gt; vai estar configurado para ser servido a partir de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://brasil.pyladies.com/conf-1&lt;/code&gt;. Então, para fazer o build é só seguir o tradicional:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ jekyll build 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;build&lt;/code&gt; gera o site da conferência dentro da pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site&lt;/code&gt; e ficamos com uma estrutura assim:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/71e23ca723a11d2a611de95d4f1df0ee.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Uma subpasta chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;assets/&lt;/code&gt; com vários arquivos de &lt;em&gt;script&lt;/em&gt; do site CSS, JavaScript, imagens e um arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.html&lt;/code&gt;. É todo esse conteúdo que vamos copiar lá para o site oficial.&lt;/p&gt;

&lt;h2 id=&quot;movendo-o-site-da-conferência-para-dentro-do-site-oficial&quot;&gt;Movendo o site da conferência para dentro do site oficial&lt;/h2&gt;

&lt;p&gt;Agora que já temos o site da conferência eu voltei para a pasta do site oficial e criei dentro da pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;content/extra/&lt;/code&gt; uma pasta chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conf-1/&lt;/code&gt; e copiei o conteúdo da pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site/&lt;/code&gt; para &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conf-1/&lt;/code&gt; assim:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/7d1115148a3fd27000e9891a523b6f92.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Depois disso, atualizei o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pelicanconf.py&lt;/code&gt;:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/05bfd1208412c7641ed0c56d61572c32.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Ao tentar rodar o build do site oficial me deparei com o &lt;strong&gt;segundo erro&lt;/strong&gt;: olhando para essas configurações assumi que se eu colocasse a pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conf-1/&lt;/code&gt; dentro de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;extra/&lt;/code&gt; e adicionasse as configurações no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATIC_PATHS&lt;/code&gt; e no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTRA_PATH_METADATA&lt;/code&gt; seguindo o mesmo padrão que já tinha visto, seria o suficiente apara acessar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localhost:8000/conf-1&lt;/code&gt; e ver o site da conferência, mas ledo engano meu.&lt;/p&gt;

&lt;p&gt;Foi preciso mais algumas horas e outras tantas tentativas frustradas para descobrir, na base da tentativa e erro, que o Pelican não consegue lidar com subpastas da forma que eu esperava. Eu esperava que, com as configurações a estrutura de pastas acima, o Pelican criasse uma pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conf-1/&lt;/code&gt; no site oficial o que me mostraria o site da coferência em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localhost:8000/conf-1&lt;/code&gt;, mas o que aconteceu foi que o site da conferência foi mostrado em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localhost:8000/extra/conf-1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Lendo esse post você pode até achar que é óbvio o caminho para resolver esse segundo erro, inclusive eu mesma achei que poderia ter resolvido mais rápido agora que estou escrevendo aqui, mas, para mim, o momento eureka aconteceu ao olhar com mais calma para o conteúdo da pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;output/&lt;/code&gt; — pasta em que o Pelican normalmente faz o build de sites.&lt;/p&gt;

&lt;p&gt;Com as configurações que eu fiz, dentro da pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;output/&lt;/code&gt; eu encontrei uma pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;extra/&lt;/code&gt; e essa pasta que continha a pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conf-1/&lt;/code&gt;. Antes das minhas alterações essa pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;extra/&lt;/code&gt; não era gerada no site &lt;em&gt;buildado&lt;/em&gt;. Então, decidi colocar a pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conf-1/&lt;/code&gt; dentro de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;content/&lt;/code&gt; e no mesmo nível que a pasta &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;extra/&lt;/code&gt; assim:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/a5ea16db0249961cd231ecc343d5a2f7.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;E também alterando o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pelicanconf.py&lt;/code&gt; da seguinte forma:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/6cd27e0682ca98f8a3b197450d8c49b0.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Agora ao fazer o &lt;em&gt;build&lt;/em&gt; do site oficial do &lt;a href=&quot;http://brasil.pyladies.com/conf-1/&quot;&gt;PyLadies Brasil conseguimos ver a página da conferência&lt;/a&gt; como esperado. 🎉 🎉 EBAAA!!&lt;/p&gt;

&lt;h2 id=&quot;moral-da-história&quot;&gt;Moral da história&lt;/h2&gt;

&lt;p&gt;Persista nas suas tentativas e mantenha a calma. Mas, ainda mais importante que isso, converse com amigos e amigas sobre o seu problema, isso pode te ajudar a enxergar novas possibilidades. Foi o que eu fiz e me ajudou a exergar a saída para o segundo erro. 😉&lt;/p&gt;

&lt;p&gt;Agora que você já leu tudo recomendo ler também o post &lt;a href=&quot;https://jtemporal.com/transformando-um-site-jekyll-em-uma-pagina-de-um-site-pelican/&quot;&gt;&lt;em&gt;“Transformando um site feito em Jekyll em uma página de um site feito em Pelican”&lt;/em&gt;&lt;/a&gt; para ver o passo a passo sem erros para reproduzir o que contei aqui.&lt;/p&gt;

&lt;p&gt;Xêro.&lt;/p&gt;
</description>
        <pubDate>Sun, 28 Apr 2019 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/movendo-um-site-construido-com-jekyll-para-dentro-de-um-site-construido-com-pelican/</link>
        <guid isPermaLink="true">https://jtemporal.com/movendo-um-site-construido-com-jekyll-para-dentro-de-um-site-construido-com-pelican/</guid>
        
        <category>jekyll</category>
        
        <category>pelican</category>
        
        <category>python</category>
        
        <category>ruby</category>
        
        <category>gerador de site estático</category>
        
        <category>static site generator</category>
        
        <category>github pages</category>
        
        <category>pyladies</category>
        
        <category>pyladies br conf</category>
        
        
      </item>
    
      <item>
        <title>How to define the optimal number of clusters for KMeans</title>
        <description>&lt;hr /&gt;

&lt;p&gt;Leia &lt;a href=&quot;https://medium.com/pizzadedados/kmeans-e-metodo-do-cotovelo-94ded9fdf3a9&quot;&gt;esse texto em Português&lt;/a&gt; na Revista do Pizza.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;One of the most famous methods to find clusters in data in an unsupervised way is using KMeans. But what do we do when we have absolutely no idea how many clusters the data is going to form? We can’t just guess.&lt;/p&gt;

&lt;p&gt;Discovering the number of clusters is a challenge especially when we are dealing with unsupervised machine learning and clustering algorithms. To solve the issue of “how many clusters should I choose” there’s a method known as the Elbow Method.&lt;/p&gt;

&lt;p&gt;The idea is pretty basic: define the optimal amount of clusters that can be found even though we don’t know the answer in advance. Seems like magic, doesn’t it? But I promise you it isn’t.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;The code that I’m going to use from now on &lt;a href=&quot;https://github.com/jtemporal/kmeans_e_cotovelo&quot;&gt;can be found in this GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;So to begin, we need data! We will use &lt;a href=&quot;https://en.wikipedia.org/wiki/Iris_flower_data_set&quot;&gt;the Iris dataset&lt;/a&gt;. There’s a genre of flowers called Iris, it is a group of around 300 flower species with different petal and sepal sizes. Biological curiosity aside, the dataset is used to demonstrate how machine learning  and clustering algorithms work a lot. I mean A LOT!&lt;/p&gt;

&lt;p&gt;This dataset holds 150 samples of three Iris species (&lt;a href=&quot;https://en.wikipedia.org/wiki/Iris_setosa&quot; title=&quot;Iris setosa&quot;&gt;&lt;em&gt;Iris setosa&lt;/em&gt;&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Iris_virginica&quot; title=&quot;Iris virginica&quot;&gt;&lt;em&gt;Iris virginica&lt;/em&gt;&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Iris_versicolor&quot; title=&quot;Iris versicolor&quot;&gt;&lt;em&gt;Iris versicolor&lt;/em&gt;&lt;/a&gt;) that even though are very similar,  are distinguishable using a model developed by the biologist and statistician Ronald Fisher.&lt;/p&gt;

&lt;p&gt;This dataset is so widely used that data science libraries usually have it built-in so it can be used in demonstrations and examples. Let’s take a peek at the first lines of our dataset, to start we need to import it, I prefer the version that comes in &lt;a href=&quot;https://seaborn.pydata.org/&quot;&gt;the seaborn library&lt;/a&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;    &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;seaborn&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;iris&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;load_dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;iris&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Glancing at the first 5 rows of our dataset you might ask me: &lt;em&gt;“But Jess, the answers were are seeking is right there in the&lt;/em&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_species_&lt;/code&gt; &lt;em&gt;column, weren’t we going to do unsupervised clustering?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*rLqNbyrHGZs7NpE6dBl3qg.png&quot; alt=&quot;table showing the first 5 rows of the dataset&quot; title=&quot;dataset.head&quot; /&gt; &lt;center&gt;&lt;br /&gt;&lt;i&gt;First 5 rows of the Iris dataset, the result of the `iris.head()` command&lt;/i&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;Okay, yes! We have the answers in our dataset but for the purpose of this tutorial, we are going to forget that we already know the species of our samples and we are going to try to group them using KMeans.&lt;/p&gt;

&lt;h2 id=&quot;kmeans&quot;&gt;KMeans&lt;/h2&gt;

&lt;p&gt;If you aren’t familiarized with KMeans yet, you must know that to use this method you’ll need to inform an initial amount of clusters before you start. Thinking of the version implemented in scikit-learn in particular, if you don’t inform an initial number of clusters by default it will try to find 8 distinct groups.&lt;/p&gt;

&lt;p&gt;When we don’t know how many clusters our samples are going to form we need a way to validate what is being encountered instead of just guessing.&lt;/p&gt;

&lt;h2 id=&quot;the-elbow-method&quot;&gt;The elbow method&lt;/h2&gt;

&lt;p&gt;And that’s where the Elbow method comes into action. The idea is to run KMeans for many different amounts of clusters and say which one of those amounts is the &lt;strong&gt;optimal number of clusters&lt;/strong&gt;. What usually happens is that as we increase the quantities of clusters the differences between clusters gets smaller while the differences between samples inside clusters increase as well. So the goal is to find a balance point in which the samples in a group are the most homogeneous possible and the clusters are the most different from one another.&lt;/p&gt;

&lt;p&gt;Since KMeans calculates the distances between samples and the center of the cluster from which sample belongs, the ideal is that this distance is the smallest possible. Mathematically speaking we are searching for a number of groups that the within clusters sum of squares (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wcss&lt;/code&gt;) is closest to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;, being zero the optimal result.&lt;/p&gt;

&lt;h2 id=&quot;using-scikit-learn&quot;&gt;Using scikit-learn&lt;/h2&gt;

&lt;p&gt;Scikit-learn’s KMeans already calculates the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wcss&lt;/code&gt; and its named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;inertia&lt;/code&gt;. There are two negative points to be considered when we talk about inertia:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Inertia is a metric that assumes that your clusters are convex and isotropic, which means that if your clusters have alongated or irregular shapes this is a bad metric;&lt;/li&gt;
  &lt;li&gt;Also, the inertia isn’t normalized, so if you have space with many dimensions you’ll probably face the “dimensionality curse” since the distances tend to &lt;a href=&quot;https://scikit-learn.org/stable/modules/clustering.html#k-means&quot;&gt;get inflated in multidimensional spaces&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now that you are aware of all that, let’s look at our data: we have only 4 dimensions - length and width of petals and sepals, let’s use the elbow with our data, shall we? I wrote a function that receives a dataset as input and calculates the KMeans for 19 different amounts of clusters ranging from 2 to 20 possible groups and finally returns a list with our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wcss&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;calculate_wcss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;wcss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;kmeans&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;KMeans&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_clusters&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;kmeans&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;wcss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kmeans&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inertia_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wcss&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;When we use the function written above to calculate the within clusters sum-of-squares for our Iris dataset and plot the result, we find a plot like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*BeBON5cT5jXuTvXRJ8GhTw.png&quot; alt=&quot;plot showing all data points from a0 to a18&quot; /&gt;&lt;/p&gt;

&lt;center&gt;&lt;i&gt;&lt;small&gt;on the x axis: the number of clusters used in the KMeans, and on the y axis: the within clusters sum-of-squares&lt;/small&gt;&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;Each orange point is a cluster quantity, note that we start in two and go up to 20 clusters. And there where we might get the first doubt: &lt;em&gt;Which of these points is exactly the optimal cluster amount? Is it the point a2 or a3 or even the a4?&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;may-math-save-us-all&quot;&gt;May math save us all&lt;/h2&gt;

&lt;p&gt;What if I told you that there’s a mathematical formula to helps us out?&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*1qNRC20LzjzP5C6MNsfiVQ.gif&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;It turns out that the point that indicates the balance between greater homogeneity within the cluster and the greater difference between clusters is the point in the curve that is most distant of a line drawn between points &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a0&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a18&lt;/code&gt;. And guess what! There is a formula that calculates the distance between a point and a line! And it is this one below:&lt;/p&gt;

&lt;center&gt; &lt;br /&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*9J7Wnh5L0eIcHXBeWlzvNA.png&quot; /&gt; &lt;small&gt;&lt;br /&gt;&lt;i&gt;Formula that calculates the distance between a point and a line that passes through P0 and P1&lt;/i&gt;&lt;/small&gt; &lt;/center&gt;

&lt;p&gt;Don’t be scared, in this case, &lt;em&gt;P0&lt;/em&gt; is our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a0&lt;/code&gt; and &lt;em&gt;P1&lt;/em&gt; is our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a18&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*5VTBI6T5c7De-GtKTBaNNA.png&quot; alt=&quot;plot showing the &amp;quot;elbow&amp;quot; with a0 and a18&quot; /&gt;&lt;/p&gt;

&lt;center&gt;&lt;i&gt;&lt;small&gt;on the x axis: the number of clusters used in the KMeans, and on the y axis: the within clusters sum-of-squares, the green line is the base line to calculate the distance&lt;/small&gt;&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;and the pair &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(x,y)&lt;/code&gt; represents the coordinates of any point that we might want to calculate the distance to the line. Let’s look at our elbow plot one more time:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*5AILcLRFN7UzhLCKw6MaYQ.png&quot; alt=&quot;plot showing the &amp;quot;elbow&amp;quot; with a0, a1 and a18&quot; /&gt;&lt;/p&gt;

&lt;center&gt;&lt;i&gt;&lt;small&gt;on the x axis: the number of clusters used in the KMeans, and on the y axis: the within clusters sum-of-squares, the green line is the base line to calculate the distance&lt;/small&gt;&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;Suppose we want to calculate the distance between the point &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a1&lt;/code&gt; and the line that passes through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a0&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a18&lt;/code&gt;, here is the data we need:&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;https://latex.codecogs.com/png.latex?%5Cdpi%7B80%7D%20%5Chuge%20%5Cbegin%7Bcenter%7D%20%5Ctext%7Bpoints%20that%20define%20the%20line%7D%5C%5C%20a_0%20%3D%28x_0%2C%5C%20y_0%29%3D%282%2C%5C%20152.34%29%5C%5C%20a_%7B18%7D%20%3D%28x_1%2C%5C%20y_1%29%3D%2820%2C%5C%2014.73%29%5C%5C%20%5C%20%5C%5C%20%5Ctext%7Bour%20point%20of%20interest%7D%5C%5C%20a_1%20%3D%28x%2C%5C%20y%29%3D%283%2C%5C%2078.85%29%5C%5C%20%5Cend%7Bcenter%7D&quot; /&gt;&lt;/center&gt;

&lt;p&gt;Substituting the values above into the distance formula we have the following:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1200/1*DYmZL126BCy2xJNPVtoTbg.png&quot; alt=&quot;formula with values substituted&quot; /&gt;&lt;/p&gt;

&lt;center&gt;&lt;br /&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*MhxkB7f42ajRkgJfTa7TAw.png&quot; style=&quot;max-width: 75%;&quot; /&gt;&lt;/center&gt;

&lt;h2 id=&quot;math-and-python-the-power-couple-everyone-loves&quot;&gt;Math and Python, the power couple everyone loves&lt;/h2&gt;

&lt;p&gt;I imagine you agree with me when I say &lt;em&gt;“No one deserves to calculate all of this by hand”&lt;/em&gt;. So let’s use a method for that. In short, we are just going to transcribe the formula that calculates the distance between a point and a line to code, the result is something like this:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/e248bbd974c4cc24a482780fe45c6851.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;The method &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;optimal_number_of_clusters()&lt;/code&gt; takes a list containing the within clusters sum-of-squares for each number of clusters that we calculated using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;calculate_wcss()&lt;/code&gt; method, and as a result, it gives back the optimal number of clusters. Now that we know how to calculate the optimal number of clusters we can finally use KMeans:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;    &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;seaborn&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;
    
    &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sklearn.cluster&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KMeans&lt;/span&gt;
    
    
    &lt;span class=&quot;c1&quot;&gt;# preparing our data
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;iris&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;load_dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;iris&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iris&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;drop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;species&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c1&quot;&gt;# calculating the within clusters sum-of-squares for 19 cluster amounts
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;sum_of_squares&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;calculate_wcss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c1&quot;&gt;# calculating the optimal number of clusters
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;optimal_number_of_clusters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sum_of_squares&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c1&quot;&gt;# running kmeans to our optimal number of clusters
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;kmeans&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;KMeans&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_clusters&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;clusters&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kmeans&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;fit_predict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;comparing-before-and-after&quot;&gt;Comparing before and after&lt;/h2&gt;

&lt;p&gt;After clustering the data we should take a look at the statistical description of each cluster:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1200/1*6b4p4aw1EMAp00xlEsFpfA.png&quot; alt=&quot;dataset first 5 lines after clustering&quot; /&gt;&lt;/p&gt;

&lt;center&gt;&lt;small&gt;&lt;i&gt;Statistical description grouped by cluster&lt;/i&gt;&lt;/small&gt;&lt;/center&gt;

&lt;p&gt;Not bad if compared to the statistical description of the original data that I show below, right?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1200/1*6LLgj9Jgz44Z7rZegS9V_w.png&quot; alt=&quot;dataset first five lines from the orginal data&quot; /&gt;&lt;/p&gt;

&lt;center&gt;&lt;small&gt;&lt;i&gt;Statistical description grouped by species&lt;/i&gt;&lt;/small&gt;&lt;/center&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Obviously, no clustering will be 100% accurate especially when we have clusters that present very similar characteristics. I particularly like the visual version of a good clusterization. Let’s put two petal features in the plot and color the points based on the cluster each sample was given and also based on the species they belong to:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*Rnz35jPaqoARWQYZir_5iQ.png&quot; alt=&quot;clustering plot&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We can see in the plot those 12 observations that “migrated” in classification could easily be a part of any of the two clusters.&lt;/p&gt;

&lt;p&gt;Is also worth mentioning that the elbow method isn’t the only way to infer the optimal cluster amount. There’s also a method that uses, for instance, the &lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_score.html&quot;&gt;&lt;em&gt;silhouette coefficient&lt;/em&gt;&lt;/a&gt;. But today, that’s all folks.&lt;/p&gt;

&lt;p&gt;xoxo and good clusterization.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;extra-reading&quot;&gt;Extra reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;The article &lt;a href=&quot;http://www2.assis.unesp.br/ffrei/Artigos/Compara%C3%A7%C3%A3o%20entre%20o%20m%C3%A9todo%20Ward%20e%20o%20m%C3%A9todo%20K-m%C3%A9dias%20no%20agrupamento%20de%20produtores%20de%20leite.pdf&quot;&gt;comparing the Ward method and the K-mean in grouping milk producers&lt;/a&gt; (in portuguese). In the third topic, there’s a great explanation of clustering methods.&lt;/li&gt;
  &lt;li&gt;One &lt;a href=&quot;https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line&quot;&gt;article in Wikipedia that explains in great detail the method to calculate distances&lt;/a&gt; from where I copied the formula that I should earlier.&lt;/li&gt;
  &lt;li&gt;There are &lt;a href=&quot;http://www.facom.ufu.br/\~backes/pgc204/Aula09-Agrupamentos.pdf&quot;&gt;slides from Professor André Backes class on clustering&lt;/a&gt; (in Portuguese).&lt;/li&gt;
  &lt;li&gt;The code that I used in this post &lt;a href=&quot;https://github.com/jtemporal/kmeans_e_cotovelo&quot;&gt;can be found in this GitHub repository&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 13 Apr 2019 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/kmeans-and-elbow-method/</link>
        <guid isPermaLink="true">https://jtemporal.com/kmeans-and-elbow-method/</guid>
        
        <category>tutorial</category>
        
        <category>data science</category>
        
        <category>ciencia de dados</category>
        
        <category>kmeans</category>
        
        <category>cluster</category>
        
        <category>clusters</category>
        
        <category>clusterizacao</category>
        
        <category>clustering</category>
        
        <category>clusterization</category>
        
        <category>unsupervised learning</category>
        
        <category>unsupervised</category>
        
        <category>unsupervised clustering</category>
        
        <category>analysis</category>
        
        <category>nao supervisionado</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Como definir o número de clusters para o seu KMeans</title>
        <description>&lt;p&gt;Um dos métodos mais famosinhos pra achar agrupamentos em dados de forma não supervisionada é utilizando o KMeans. Mas e quando você não tem ideia de quantos clusters seus dados possam formar, como faz?&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo esse tutorial, vai lá para a revista do Pizza 👇&lt;/p&gt;

&lt;center&gt;
&lt;a href=&quot;https://medium.com/pizzadedados/kmeans-e-metodo-do-cotovelo-94ded9fdf3a9&quot;&gt;
&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; /&gt;
&lt;/a&gt;
&lt;/center&gt;
</description>
        <pubDate>Wed, 10 Apr 2019 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/kmeans-e-cotovelo/</link>
        <guid isPermaLink="true">https://jtemporal.com/kmeans-e-cotovelo/</guid>
        
        <category>medium</category>
        
        <category>kmeans</category>
        
        <category>clustering</category>
        
        <category>clusterizacao</category>
        
        <category>unsupervised learning</category>
        
        <category>unsupervised clustering</category>
        
        <category>clusterizacao nao supervisionada</category>
        
        
      </item>
    
      <item>
        <title>Ciência de dados pela democracia</title>
        <description>&lt;h3 id=&quot;vídeo&quot;&gt;Vídeo&lt;/h3&gt;

&lt;p&gt;Você pode &lt;a href=&quot;https://videoh.infoq.com/presentations-br/wids2019-JessicaTemporal-Dados.mp4&quot;&gt;assistir essa palestra aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;evento&quot;&gt;Evento&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.sympla.com.br/women-in-data-science-sao-paulo__444967#info&quot;&gt;Women in Data Science 2019&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;apresentação&quot;&gt;Apresentação&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;center&gt;

&lt;iframe src=&quot;//slides.com/jtemporal/wids2019/embed&quot; width=&quot;100%&quot; height=&quot;420&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Sat, 06 Apr 2019 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/cdd-no-mundo-real-com-serenata-wids/</link>
        <guid isPermaLink="true">https://jtemporal.com/cdd-no-mundo-real-com-serenata-wids/</guid>
        
        
      </item>
    
      <item>
        <title>Copying files into a container</title>
        <description>&lt;p&gt;Sometimes volumes do not work and you have to copy things into the container. Really! You must be wondering, &lt;em&gt;“how does a technology that everyone uses, doesn’t work?!”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Okay, okay, I know this is looking like those stories of “works on my machine” inverted. But let me explain, earlier this year I was working with a temporary computer. Unfortunately, I did not have administrator powers of that computer, which prevented me from doing certain things, including giving Docker permission to share volumes with the Windows file system.&lt;/p&gt;

&lt;p&gt;Is worth mentioning that I only discovered how to copy files to a running container because windows have these permission issues.&lt;/p&gt;

&lt;p&gt;So, let’s go!&lt;/p&gt;

&lt;h2 id=&quot;materials&quot;&gt;Materials&lt;/h2&gt;

&lt;p&gt;For this little tutorial, you’ll need:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A running Docker container&lt;/li&gt;
  &lt;li&gt;A file to copy to said Docker containerr&lt;/li&gt;
  &lt;li&gt;Basic Docker knowledge&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;finding-out-the-container&quot;&gt;Finding out the container&lt;/h2&gt;

&lt;p&gt;Depending on how you started your container you won’t know its name, so let’s first check it out. Since I work with science and data analysis, it is very common to find myself with a Jupyter container running, this is the one I will use here. To get the name of the container we need to list the containers that are up:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/6ba7e2a2ac369738bb8278ad58993161.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;In my case this command shows a result like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CONTAINER ID        IMAGE                          NAMES
11b8af1aeb43        jupyter/datascience-notebook   relaxed_hypatia
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I explained how to assemble this command that only shows the ID of the container, the image being used and the name of the container in &lt;a href=&quot;https://jtemporal.com/brincando-com-a-listagem-de-containers-docker/&quot;&gt;this other pro tip&lt;/a&gt;. With the result above we know that the container I’m interested in is called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;relaxed_hypatia&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&quot;finding-out-where-to-send-the-file&quot;&gt;Finding out where to send the file&lt;/h2&gt;

&lt;p&gt;Well if, like me, you usually map volumes to share the data with your container you probably already know where to send the data. However, if you don’t do this or it is a new image that you are using for the first time, your mission is to find out where to send the files. Usually, this information is in the documentation of the image.&lt;/p&gt;

&lt;p&gt;For Jupyter Project images, there is a traditional folder to map the volumes that this: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/home/jovyan/work&lt;/code&gt;. I’ll send the file there if you are using a different image remember to replace that path, to the path of your container.&lt;/p&gt;

&lt;h2 id=&quot;finally-copying-the-file&quot;&gt;Finally copying the file&lt;/h2&gt;

&lt;p&gt;Now that you’ve figured out where to send the data file and the name of the container, it’s time to finally copy the file to the container. If you like play copying files back and forth through the terminal, you should have the custom of using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cp&lt;/code&gt; command. But if you don’t have the habit, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cp&lt;/code&gt; (from &lt;em&gt;copy&lt;/em&gt;) is Ctrl+C Ctrl+V from the terminal, it makes a copy of a file from somewhere to another place. For example, let’s assume I have the following situation:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;folder1/                        folder2/
└── file_A.txt		
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And that I want to copy &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;file_A.txt&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folder2&lt;/code&gt; using the terminal. I could do the following:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cp folder1/file_A.txt folder2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And the result would be as follows:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;folder1/                        folder2/
└── file_A.txt                  └── file_A.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And the same can be done with containers. Docker has its own &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cp&lt;/code&gt; version called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker cp&lt;/code&gt; that works in a way analogous to the terminal &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cp&lt;/code&gt;. With the small difference that the destination path is formed like this: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;container_name:destination/path&lt;/code&gt;. So let’s copy the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dados.csv&lt;/code&gt; file into my &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;relaxed_hypatia&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker cp dados.csv relaxed_hypatia:/home/jovyan/work/dados.csv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now I can see the data inside my container. As in my case I’m running a Jupyter container I can see this file there in the Jupyter interface:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;/images/dados_docker_cp.png&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Cool huh? You can follow the same philosophy to pull data from inside the container to your local machine, just reverse the order of the paths.&lt;/p&gt;

&lt;h2 id=&quot;final-considerations&quot;&gt;Final considerations&lt;/h2&gt;

&lt;p&gt;One very important thing to remember, containers are meant to be ephemeral, so make sure you keep a backup of your data. After all, after removing a container, you no longer have the ability to retrieve the data that was inside.&lt;/p&gt;

&lt;p&gt;Another reason a friend recently taught me in favor of copying the data into the container is that keeping volumes up-to-date when your container does a lot of reading and writing is extremely costly. So if you have a large file that does not change, like a data file, or a process that does a lot of reading and writing, like a rails server, it’s worth considering whether to copy the files into the container or even make an image already with these files. Always remember to weigh the points in favor and points against volumes the next time you use containers.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;That’s all folks! xoxo&lt;/p&gt;
</description>
        <pubDate>Wed, 03 Apr 2019 14:00:00 +0000</pubDate>
        <link>https://jtemporal.com/copying-files-into-a-container/</link>
        <guid isPermaLink="true">https://jtemporal.com/copying-files-into-a-container/</guid>
        
        <category>pro tip</category>
        
        <category>docker</category>
        
        <category>container</category>
        
        <category>containers</category>
        
        <category>pro tip</category>
        
        <category>listing</category>
        
        <category>image</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Copiando arquivos para dentro do container</title>
        <description>&lt;p&gt;Às vezes volumes não funcionam e a gente precisa copiar coisas para dentro do container. É sério! Você deve estar se perguntando, “&lt;em&gt;como uma tecnologia que todo mundo usa, não funciona?!”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tá, tá… Eu sei que isso tá parecendo aquelas histórias de “funciona na minha máquina” invertido. Mas vou explicar, no começo do ano eu estava trabalhando com um computador provisório. Infelizmente, eu não tinha poderes de administrador desse computador, o que me impedia de fazer certas coisas, inclusive de dar permissão ao Docker para compartilhar volumes com o sistema de arquivos do Windows.&lt;/p&gt;

&lt;p&gt;Ah sim, talvez seja importante mencionar que eu só descobri como copiar arquivos para dentro de container que tá rodando, pois o Windows tem todas essas paradas de permissão.&lt;/p&gt;

&lt;p&gt;Então bora lá!&lt;/p&gt;

&lt;h2 id=&quot;materiais&quot;&gt;Materiais&lt;/h2&gt;

&lt;p&gt;Para essa colinha você vai precisar de:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Um container Docker rodando&lt;/li&gt;
  &lt;li&gt;Um arquivo que você quer copiar para dentro do Docker&lt;/li&gt;
  &lt;li&gt;Conhecimentos básicos de Docker&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;descobrindo-o-container&quot;&gt;Descobrindo o container&lt;/h2&gt;

&lt;p&gt;Dependendo de como você inicie o seu container você não vai saber o nome dele, então vamos primeiro conferir isso. Como trabalho com ciência e análise de dados, é muito comum me encontrar com um container do Jupyter rodando, é esse que vou usar aqui. Para pegar o nome do container precisamos listar os containers que estão de pé:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/6ba7e2a2ac369738bb8278ad58993161.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Aqui no meu caso, temos um resultado assim:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CONTAINER ID        IMAGE                          NAMES
11b8af1aeb43        jupyter/datascience-notebook   relaxed_hypatia
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Eu expliquei como montar esse comando que só mostra o ID do container, a imagem sendo usada e o nome do container &lt;a href=&quot;https://jtemporal.com/brincando-com-a-listagem-de-containers-docker/&quot;&gt;nessa colinha aqui&lt;/a&gt;. Com isso sabemos que o meu container de interesse se chama &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;relaxed_hypatia&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;descobrindo-para-onde-mandar-os-dados&quot;&gt;Descobrindo para onde mandar os dados&lt;/h2&gt;

&lt;p&gt;Bem se, como eu, você normalmente mapearia volumes para compartilhar os dados com seu container provavelmente já sabe para onde mandar os dados. No entanto, se você não faz isso ou é uma imagem nova que você está usando pela primeira vez, sua missão é descobrir para onde mandar os arquivos. Geralmente essa informação está na documentação da imagem.&lt;/p&gt;

&lt;p&gt;No caso das imagens do Projeto Jupyter, existe uma pasta tradicional para mapear os volumes que essa: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/home/jovyan/work&lt;/code&gt;. Vou mandar os dados pra lá, então quando você tiver rodando aí pro seu container, lembre-se de substituir esse caminho, para o caminho do seu container.&lt;/p&gt;

&lt;h2 id=&quot;finalmente-copiando-os-dados&quot;&gt;Finalmente copiando os dados&lt;/h2&gt;

&lt;p&gt;Agora que você já descobriu o lugar para onde quer mandar os dados e o nome do container, chegou a hora de finalmente colocar os dados lá no container. Se você brinca de copiar arquivos pra lá e pra cá pelo terminal, deve ter o costume de usar o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cp&lt;/code&gt;. Mas caso não tenha, o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cp&lt;/code&gt; (de &lt;em&gt;copy&lt;/em&gt;) é o Ctrl+C Ctrl+V do terminal, ele faz um cópia de um arquivo em um lugar para outro lugar. Por exemplo, vamos supor que tenho a seguinte situação:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pasta1/						pasta2/
└── arquivo_A.txt			
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E que eu quero copiar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arquivo_A.txt&lt;/code&gt; para a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pasta2&lt;/code&gt;, tudo isso pelo terminal. Então eu poderia fazer apenas o seguinte:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cp pasta1/arquivo_A.txt pasta2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E o resultado disso seria:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pasta1/					pasta2/
└── arquivo_A.txt			└── arquivo_A.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E dá para fazer a mesma coisa com o container. O Docker tem a versão dele chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker cp&lt;/code&gt; que funciona de forma análoga ao &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cp&lt;/code&gt; do terminal. Com a pequena diferença que o caminho de destino é formado assim: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nome_do_container:caminho/de/destino&lt;/code&gt;. Então vamos copiar o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dados.csv&lt;/code&gt; para dentro do meu &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;relaxed_hypatia&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker cp dados.csv relaxed_hypatia:/home/jovyan/work/dados.csv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E aí eu consigo ver os meus dados lá dentro do meu container. Como no meu caso eu tô rodando um container do Jupyter eu consigo ver esse arquivo lá na minha interface:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;/images/dados_docker_cp.png&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Legal né? Você pode seguir a mesma filosofia para retirar dados de dentro do container para sua máquina local, basta inverter a ordem dos caminhos.&lt;/p&gt;

&lt;h2 id=&quot;considerações-finais&quot;&gt;Considerações finais&lt;/h2&gt;

&lt;p&gt;Uma coisa muito importante de lembrar, containers foram feitos para serem efêmeros, então lembre-se de se certificar que esta mantendo um backup dos seus dados. Afinal, depois de removido um container não tem mais como recuperar os dados que estavam lá dentro.&lt;/p&gt;

&lt;p&gt;Outro motivo que um amigo me ensinou recentemente a favor de copiar os dados para dentro do container é que manter volumes atualizados quando seu container faz muitos processos de leitura e escrita é extremamente custoso. Então, se você tem um arquivo grande que não muda, como um arquivo de dados, ou um processo que faz muita leitura e escrita, como um servidor rails, vale a pena considerar entre copiar os arquivos para dentro do container ou até mesmo fazer uma imagem ja com esses arquivos. Lembre-se sempre de pesar os pontos a favor e os pontos contra volumes na próxima vez que for usar containers.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Por hoje é só pessoal. Xêro!&lt;/p&gt;
</description>
        <pubDate>Wed, 03 Apr 2019 12:00:00 +0000</pubDate>
        <link>https://jtemporal.com/copiando-arquivos-para-dentro-do-container/</link>
        <guid isPermaLink="true">https://jtemporal.com/copiando-arquivos-para-dentro-do-container/</guid>
        
        <category>colinha</category>
        
        <category>docker</category>
        
        <category>container</category>
        
        <category>containers</category>
        
        
      </item>
    
      <item>
        <title>Playing with Docker’s container listing</title>
        <description>&lt;p&gt;If you use Docker, probably the third command you learned was to list containers, but do you know that you can tailor the container listing to your needs? Well, the hint today is to show two tricks I use a lot:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;List filtering;&lt;/li&gt;
  &lt;li&gt;List formatting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s take a look at these two cases with care.&lt;/p&gt;

&lt;h2 id=&quot;filtering-the-container-list&quot;&gt;Filtering the container list&lt;/h2&gt;

&lt;p&gt;I think the first “advanced” command I had to learn was filtering a set of containers. Soon after getting started with Docker it is very common to have a “dirty” environment, that is, to have many containers with exited status &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exited&lt;/code&gt; without being removed.&lt;/p&gt;

&lt;p&gt;So I learned how to filter such containers by their status. Within the traditional container listing command (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker ps&lt;/code&gt;), there is a flag called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--filter&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-f&lt;/code&gt;. This flag allows you to indicate filters to be made, for example:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker ps -a -f status=exited
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The result of this command will be a list of containers that have stopped running, but have not been removed. As I’ve said before, it’s pretty easy to lose control and have lots of stale containers “dirtying” your environment. So listing those that aren’t running can be a helpful hand i removing them more easily. I like to use a command like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker rm -v $(docker ps -a -q -f status=exited)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Passing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-q&lt;/code&gt; flag causes the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker ps&lt;/code&gt; result to only show the container IDs, putting this complete command inside &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$()&lt;/code&gt; results in us passing the list of IDs to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker rm&lt;/code&gt; and thus removing all the containers stopped with only one command. And the flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-v&lt;/code&gt; there is just to have feedback of what is going on with the command, it will show the ID of each container being deleted.&lt;/p&gt;

&lt;h2 id=&quot;formating-the-containers-list&quot;&gt;Formating the containers list&lt;/h2&gt;

&lt;p&gt;In addition to removing the containers that are dirting up our environment, sometimes I need some information about some of the containers that are running. Normally when we use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker ps&lt;/code&gt; we see information like container ID, the command you ran to start the container, the image being used and a lot of other things… But sometimes seeing all that information on the screen all at once can be an information overload.&lt;/p&gt;

&lt;p&gt;That’s when the magic of formatting the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker ps&lt;/code&gt; result comes in handy. The flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--format&lt;/code&gt; is the show this time, it accepts a &lt;a href=&quot;https://golang.org/pkg/text/template/&quot;&gt;template Go&lt;/a&gt; . If you do not know Go templates, here’s a super quick and superficial explanation: used for creating static sites, a template go is a string that is “filled” with information that is stored in variables.&lt;/p&gt;

&lt;p&gt;For example, the template:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/13ca6f547d5ab2f86b4f3b019fb26c43.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;That template could be filled with any name that was stored in the variable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Name&lt;/code&gt;. To identify variables in templates you’ll need to find the word that is preceded by a dot and is inside double curly brackets. If you are interested in learning more about Go templates, I’d recommend &lt;a href=&quot;https://golang.org/pkg/text/template/&quot;&gt;you check out this article in the official documentation&lt;/a&gt; for more information.&lt;/p&gt;

&lt;p&gt;To start our formatting we need to know where the information that shows up on the screen is stored and you can use the table bellow for that:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Information&lt;/th&gt;
      &lt;th&gt;Variable&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONTAINER ID&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;ID&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IMAGE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Image&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COMMAND&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Command&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATED&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;RunningFor&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATUS&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Status&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PORTS&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Ports&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NAMES&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Names&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;In my case I usually look for the name, the image and the container ID’s so my command ends up being the following:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/6ba7e2a2ac369738bb8278ad58993161.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Will give me a result like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    CONTAINER ID        IMAGE                          NAMES
    11b8af1aeb43        jupyter/datascience-notebook   relaxed_hypatia
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;p&gt;Cool Huh? So have you listed your containers today?&lt;/p&gt;
</description>
        <pubDate>Sat, 16 Mar 2019 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/playing-with-dockers-container-listing/</link>
        <guid isPermaLink="true">https://jtemporal.com/playing-with-dockers-container-listing/</guid>
        
        <category>english</category>
        
        <category>docker</category>
        
        <category>container</category>
        
        <category>listing</category>
        
        <category>protip</category>
        
        <category>pro tip</category>
        
        <category>docker ps</category>
        
        <category>containers</category>
        
        
      </item>
    
      <item>
        <title>Brincando com a listagem de containers Docker</title>
        <description>&lt;p&gt;Se você usa Docker, provavelmente o terceiro comando que aprendeu foi listar eles, mas você sabe que dá pra tunar a listagem de containers?&lt;/p&gt;

&lt;p&gt;Pois bem, a colinha de hoje é para mostrar dois truques que eu uso muito:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;filtragem da lista;&lt;/li&gt;
  &lt;li&gt;formatação da lista.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vamos ver esses dois casos com carinho.&lt;/p&gt;

&lt;h2 id=&quot;filtrando-a-lista-de-containers&quot;&gt;Filtrando a lista de containers&lt;/h2&gt;

&lt;p&gt;Acho que o primeiro comando “mais avançado” que eu tive que fazer foi filtrar um conjunto de containers. Logo ao começar a mexer com Docker é muito comum ficar com o ambiente “sujo”, ou seja, ter muitos containers com &lt;em&gt;status&lt;/em&gt; de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exited&lt;/code&gt; parados sem serem removidos.&lt;/p&gt;

&lt;p&gt;Por isso, eu aprendi a filtrar tais containers pelo &lt;em&gt;status&lt;/em&gt;. Dentro do comando tradicional de listar containers (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker ps&lt;/code&gt;), existe uma &lt;em&gt;flag&lt;/em&gt; chamada de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--filter&lt;/code&gt; ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-f&lt;/code&gt;. Essa &lt;em&gt;flag&lt;/em&gt; permite que você indique filtros a serem feitos, por exemplo:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker ps -a -f status=exited
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O resultado desse comando vai ser uma lista de containers que deixaram de executar, mas não foram removidos. Como eu falei antes, é bem fácil perder o controle e ter muitos containers parados “sujando” o seu ambiente. Então listar aqueles que não estão em execução pode ser uma mão na roda para remover eles mais facilmente. Eu gosto usar esse comando assim:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker rm -v $(docker ps -a -q -f status=exited)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Passando a &lt;em&gt;flag&lt;/em&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-q&lt;/code&gt; faz com que, o resultado do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker ps&lt;/code&gt; mostre apenas os IDs dos containers, colocando esse comando completo dentro do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$()&lt;/code&gt; faz com que passemos a lista de IDs para o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker rm&lt;/code&gt; e assim removendo todos os containers parados com apenas um comando. Ah a &lt;em&gt;flag&lt;/em&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-v&lt;/code&gt; ali é só pra ter um &lt;em&gt;feedback&lt;/em&gt; do que está rolando com o comando, ele vai mostrar o ID de cada container que estiver sendo excluído.&lt;/p&gt;

&lt;h2 id=&quot;formatando-a-lista-de-containers&quot;&gt;Formatando a lista de containers&lt;/h2&gt;

&lt;p&gt;Além de remover os containers que ficam sujando nosso ambiente, às vezes eu preciso de algumas informações sobre algum dos containers que estão rodando. Normalmente quando usamos o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker ps&lt;/code&gt; vemos informações como ID do container, o comando que você rodou para iniciar ele, a imagem que está sendo usada e outras coisas mais… Mas às vezes ver todas essas informações na tela pode ser uma sobrecarga de informações.&lt;/p&gt;

&lt;p&gt;Aí que entra a mágica de formatar o resultado do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker ps&lt;/code&gt;. A flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--format&lt;/code&gt; que comanda o show dessa vez. Ela aceita um &lt;a href=&quot;https://golang.org/pkg/text/template/&quot;&gt;template Go&lt;/a&gt;. Se você não conhece templates Go, aqui vai uma explicação super rápida e superficial: muito utilizados para criação de sites estáticos, um template é uma &lt;em&gt;string&lt;/em&gt; que é “preenchida” com informações sendo guiada por variáveis.&lt;/p&gt;

&lt;p&gt;Por exemplo, o template:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/ba346fb6a05b6b5badb07a5928240d1c.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;poderia ser preenchido com qualquer nome que estivesse contido na variável &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Name&lt;/code&gt;. Para identificar variáveis em templates basta encontrar a palavra precedida por um &lt;em&gt;ponto&lt;/em&gt; e dentro de &lt;em&gt;chaves duplas&lt;/em&gt;. Se quiser saber mais sobre &lt;a href=&quot;https://gopher.pro.br/post/http-uso-de-templates/&quot;&gt;templates Go da uma olhada nesse artigo&lt;/a&gt; do grupo de estudos que fala muito bem sobre o tema.&lt;/p&gt;

&lt;p&gt;Então, pra começar cada uma das informações que aparecem na tela você pode chamar seguindo esse mapa:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Informação&lt;/th&gt;
      &lt;th&gt;Variável&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONTAINER ID&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;ID&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IMAGE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Image&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COMMAND&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Command&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATED&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;RunningFor&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Status&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Status&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PORTS&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Ports&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NAMES&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Names&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Como eu geralmente só quero ver o nome, a imagem e o ID dos containers que estão rodando, meu comando acaba sendo esse:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/6ba7e2a2ac369738bb8278ad58993161.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Que me da um resultado assim:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    CONTAINER ID        IMAGE                          NAMES
    11b8af1aeb43        jupyter/datascience-notebook   relaxed_hypatia
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;p&gt;Legal né? E aí, você já listou os seus containers hoje?&lt;/p&gt;
</description>
        <pubDate>Sat, 16 Mar 2019 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/brincando-com-a-listagem-de-containers-docker/</link>
        <guid isPermaLink="true">https://jtemporal.com/brincando-com-a-listagem-de-containers-docker/</guid>
        
        <category>colinha</category>
        
        <category>docker</category>
        
        <category>containers</category>
        
        
      </item>
    
      <item>
        <title>Diferenciando json.loads de json.load e uma pitada de BigQuery</title>
        <description>&lt;p&gt;Se você nunca entendeu a diferença entre &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;json.loads()&lt;/code&gt; e &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;json.load()&lt;/code&gt; chegou a hora de entender! Na colinha de hoje vamos aprender a diferenciar esse métodos deliciosos.&lt;/p&gt;

&lt;h2 id=&quot;json&quot;&gt;JSON&lt;/h2&gt;

&lt;p&gt;Se você chegou até aqui, provavelmente já sabe o que é o JSON. Mas caso não saiba, bora recapitular: &lt;a href=&quot;http://json.org/json-pt.html&quot;&gt;O JSON (&lt;em&gt;JavaScript Object Notation&lt;/em&gt; ou Notação de Objetos JavaScript)&lt;/a&gt; é um formato leve de troca de dados. É fácil de ler e escrever, o que ajuda a ser usado por humanos além de também ser fácil de ser criado e interpretado por máquinas.&lt;/p&gt;

&lt;p&gt;Se você já usou APIs provavelmente trocou dados com elas usando este formato. A maioria das linguagens de programação moderna oferece suporte de alguma forma a JSON. No caso do Python, existe uma estrutura que é quase a mesma coisa que um objeto JSON: o dicionário.&lt;/p&gt;

&lt;h2 id=&quot;módulo-json-no-python&quot;&gt;Módulo JSON no Python&lt;/h2&gt;

&lt;p&gt;Além de uma estrutura de dados, Python também traz de fábrica &lt;a href=&quot;https://docs.python.org/3.5/library/json.html&quot;&gt;um módulo para manipulação de JSONs&lt;/a&gt;. Para utilizar esse módulo basta fazer o seguinte:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;import json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dentre os vários métodos, existem dois que são o foco dessa colinha de hoje &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.loads()&lt;/code&gt; e &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.load()&lt;/code&gt; que apesar de muito semelhantes em resultado, são diferentes em modo de funcionamento.&lt;/p&gt;

&lt;h2 id=&quot;dados&quot;&gt;Dados&lt;/h2&gt;

&lt;p&gt;Mas antes de começar, vamos pegar alguns dados. Esses dias eu tava dando uma olhada no &lt;a href=&quot;https://cloud.google.com/bigquery/&quot;&gt;BigQuery&lt;/a&gt;, que entre muitas coisas legais que a ferramenta permite fazer, também da acesso a uma enormidade de dados públicos. Dentre eles dados do GitHub. Muitos desses dados estão disponíveis via API do próprio GitHub, mas se quiser aprender a mexer no BigQuery, eles já disponibilizam os dados lá dentro pra gente:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bq-github.png&quot; alt=&quot;imagem mostrando o dataset do github no bq&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Muito fofo né? Dá pra ver pela imagem acima que o conjunto de dados &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;github_repos&lt;/code&gt; contém 9 tabelas. Dentre elas uma tabela chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;languages&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bq-github-languages.png&quot; alt=&quot;imagem mostrando a tabela de linguagens do github no bq&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Essa tabela embora grande tem poucas colunas, apenas 4 para ser mais exata:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bq-github-languages-schema.png&quot; alt=&quot;imagem mostrando o schema da tabela de linguagens do github no bq&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Com o BigQuery é possível exportar dados para a sua conta do Google Drive. E foi isso que eu fiz, primeiro eu selecionei 100 observacoes da tabela usando a consulta SQL abaixo:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;SELECT * FROM `bigquery-public-data.github_repos.languages` LIMIT 100
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E após a &lt;em&gt;query&lt;/em&gt; ter sido executada eu cliquei na telinha do próprio BigQuery para exportar os resultados. Ao exportar esses dados o BigQuery cria uma pasta no seu Drive:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-03-15 19.16.34.png&quot; alt=&quot;imagem mostrando os dados exportados&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E dentro dessa pasta um arquivo com o mesmo nome de extensão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.json&lt;/code&gt;. Eu baixei esse arquivo e renomeei ele para &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bq-github-languages.json&lt;/code&gt; só para ser um nome mais indicativo do dado que ele contém.&lt;/p&gt;

&lt;p&gt;Se você abrir esse arquivo você vai notar uma coisa que pode ser curiosa: Ao invés de ter um único JSON, o arquivo traz na verdade vários JSONs separados - um JSON para cada observação da tabela e isso nos traz ao nosso primeiro método.&lt;/p&gt;

&lt;h2 id=&quot;load&quot;&gt;.load()&lt;/h2&gt;

&lt;p&gt;O &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;json.load()&lt;/code&gt; recebe um algo que seja &lt;em&gt;“readable”&lt;/em&gt; ou seja, qualquer estrutura Python que tenha o método &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.read()&lt;/code&gt; embutido. Podemos encontrar esse comportamento por exemplo, em arquivos.&lt;/p&gt;

&lt;p&gt;Então, se o nosso arquivo tivesse um grande JSON contendo as nossas observações, poderíamos usar esse método assim:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;with open(&apos;bq-github-languages.json&apos;) as file_data:
    data = json.load(file_data)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Se você tentar fazer isso para carregar os dados do nosso arquivo, você ira dar de cara com um erro:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;JSONDecodeError: Extra data: line 2 column 1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O que faz total sentindo já que não temos apenas um JSON no nosso arquivo e sim uma coleção deles, não é mesmo? Isso gera a obrigação de ler cada linha do arquivo assim:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;with open(&apos;bq-github-languages.json&apos;) as file_data:
    data = file_data.readlines()
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E tudo bem, mas essa ação traz o seguinte resultado: no lugar de ter uma lista com vários dicionários, você acaba com uma lista de &lt;em&gt;strings&lt;/em&gt;. E se a ideia era manipular esses dados, &lt;em&gt;strings&lt;/em&gt; não são a estrutura de dados mais indicadas. O que nos leva ao próximo método,&lt;/p&gt;

&lt;h2 id=&quot;loads&quot;&gt;.loads()&lt;/h2&gt;

&lt;p&gt;Eu costumava confundir muito o funcionamento dos dois métodos. Até que, recentemente, algo clicou. Quando você tem &lt;em&gt;strings&lt;/em&gt;, você deve usar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.loads()&lt;/code&gt;. Você pode usar a dica que vem do próprio nome: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s&lt;/code&gt; de &lt;em&gt;string&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/IWOTlIqnWzTFe/giphy.gif&quot; alt=&quot;gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Aí depois de ler o arquivo linha a linha com o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.readlines()&lt;/code&gt; você pode passar item a item da sua lista de &lt;em&gt;strings&lt;/em&gt; e transformar ela num dicionário:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;for i, item in enumerate(data):
    data[i] = json.loads(item)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;ou até mesmo usar &lt;em&gt;list comprehensions&lt;/em&gt; pra isso:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;data = [json.loads(d) for d in data]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E aí podemos ver o resultado disso, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data[0]&lt;/code&gt; vai trazer algo parecido com isso:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{&apos;repo_name&apos;: &apos;gopz4u/ready&apos;,
 &apos;language&apos;: [{&apos;name&apos;: &apos;C#&apos;, &apos;bytes&apos;: &apos;27779&apos;},
  {&apos;name&apos;: &apos;C++&apos;, &apos;bytes&apos;: &apos;28415&apos;},
  {&apos;name&apos;: &apos;CSS&apos;, &apos;bytes&apos;: &apos;6475&apos;},
  {&apos;name&apos;: &apos;HTML&apos;, &apos;bytes&apos;: &apos;34293&apos;},
  {&apos;name&apos;: &apos;Java&apos;, &apos;bytes&apos;: &apos;117831&apos;},
  {&apos;name&apos;: &apos;JavaScript&apos;, &apos;bytes&apos;: &apos;205287&apos;},
  {&apos;name&apos;: &apos;Objective-C&apos;, &apos;bytes&apos;: &apos;118096&apos;}]}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Massa né? Bem, por hoje é só!&lt;/p&gt;
</description>
        <pubDate>Fri, 15 Mar 2019 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/diferenciando-json-loads-de-json-load-e-uma-pitade-de-bigquery/</link>
        <guid isPermaLink="true">https://jtemporal.com/diferenciando-json-loads-de-json-load-e-uma-pitade-de-bigquery/</guid>
        
        <category>serialização</category>
        
        <category>python</category>
        
        <category>bigquery</category>
        
        <category>sql</category>
        
        <category>json</category>
        
        <category>api</category>
        
        <category>python3</category>
        
        <category>load</category>
        
        <category>serialization</category>
        
        <category>serialize</category>
        
        
      </item>
    
      <item>
        <title>Um passeio pelo backstage de um podcast</title>
        <description>&lt;p&gt;Em conversas, algumas pessoas já me falaram a seguinte frase:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Sempre quis fazer um podcast sobre &lt;em&gt;insira-aqui-o-assunto-de-sua-preferência&lt;/em&gt; mas não sei nem por onde começar…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E a minha resposta é sempre a mesma: &lt;em&gt;Eu te mostro como fizemos com o Pizza e se você quiser você pode tentar fazer o mesmo&lt;/em&gt; 😉&lt;/p&gt;

&lt;p&gt;É um assunto tão recorrente que eu decidi escrever sobre e te inspirar a transformar o seu podcast em realidade \o/&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo esse artigo cheião de dicas vai lá para a revista do Pizza 👇&lt;/p&gt;

&lt;center&gt;
  &lt;a href=&quot;https://medium.com/pizzadedados/backstage-de-um-podcast-465f02c2a7e5&quot;&gt;
    &lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; atl=&quot;botao de clique aqui para ler&quot; /&gt;
  &lt;/a&gt;
  &lt;/center&gt;
</description>
        <pubDate>Wed, 13 Mar 2019 12:00:00 +0000</pubDate>
        <link>https://jtemporal.com/um-passeio-pelo-backstage-de-um-podcast/</link>
        <guid isPermaLink="true">https://jtemporal.com/um-passeio-pelo-backstage-de-um-podcast/</guid>
        
        <category>medium</category>
        
        <category>podcast</category>
        
        <category>pizza de dados</category>
        
        <category>podcasting</category>
        
        <category>dicas</category>
        
        
      </item>
    
      <item>
        <title>Podcast backstage tour</title>
        <description>&lt;hr /&gt;

&lt;p&gt;Se preferir &lt;a href=&quot;https://medium.com/pizzadedados/backstage-de-um-podcast-465f02c2a7e5&quot;&gt;leia esse artigo em português&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;After a year of &lt;a href=&quot;https://pizzadedados.com/en/&quot;&gt;Pizza de Dados&lt;/a&gt;, I’ll tell you what it’s like to have a podcast.&lt;/p&gt;

&lt;p&gt;I had a few conversations where people share the following:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I’ve always wanted to create a podcast about insert-here-your-favorite-subject, but I don’t even know where to start…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To which my reply is always the same: &lt;em&gt;I’ll tell you how we started doing Pizza de Dados, and maybe the process will help you get started&lt;/em&gt;. 😉&lt;/p&gt;

&lt;p&gt;It’s such a recurring subject that I decided to write about it and inspire you to make your podcast dream a reality \o/&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;img src=&quot;https://media.giphy.com/media/es4W3DeganNXa/source.gif&quot; /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://media.giphy.com/media/es4W3DeganNXa/source.gif&quot;&gt;Source&lt;/a&gt;
&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-beginning&quot;&gt;The beginning&lt;/h2&gt;

&lt;p&gt;Assuming you already have an idea of ​​what you want to talk about, the first question I would ask you would be: &lt;em&gt;Do you have money to maintain infrastructure or, like us, want something that can be kept free of charge?&lt;/em&gt; This is one of the first questions because there are a lot of platforms for podcasters, and most of them are paid, or those with a free account are very limited.&lt;/p&gt;

&lt;p&gt;If you’re looking for something 100% free and without limitation - at least for the first few episodes, here’s the pizza recipe (from bum tsss) we use:&lt;/p&gt;

&lt;p&gt;* Archive.org: You’ll need to &lt;strong&gt;store your podcast audios&lt;/strong&gt; somewhere that generates a direct download link. In our case &lt;a href=&quot;http://archive.org/&quot;&gt;archive.org&lt;/a&gt; was chosen since there are no storage limitations;&lt;/p&gt;

&lt;p&gt;* A &lt;em&gt;feed.xml&lt;/em&gt;: You see, one thing you’ll need to learn to have a podcast is that you need to have a file in XML format. This file is what we call the feed, and it will pose as a communication channel to let platforms and aggregators know that a new episode has come out, so you will need to host this file somewhere. In the case of Pizza, we created a site using a &lt;a href=&quot;http://jekyllthemes.org/&quot;&gt;Jekyll template&lt;/a&gt; and hosted it on GitHub.&lt;/p&gt;

&lt;h2 id=&quot;a-website&quot;&gt;A website&lt;/h2&gt;

&lt;p&gt;We wanted to show the world what was being discussed and who was participating in each episode. To accomplish that, we made a site that would have a post for each episode and hosted it on GitHub. GitHub has a tool called GitHub Pages that is for anyone to put websites online (&lt;a href=&quot;https://jtemporal.com/do-tema-ao-ar/&quot;&gt;I made a post - in portuguese - on how to do it that you can check out&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Basically, the most widely used way to distribute podcasts today is by using Apple. Other than showing information from each episode, our website also had a crucial role in serving our feed.xml. Most Jekyll templates come with a standard feed, but you may need to make some adjustments.&lt;/p&gt;

&lt;p&gt;For Apple to know that your podcast exists, you need to &lt;a href=&quot;https://help.apple.com/itc/podcasts_connect/#/itc97d9d1513&quot;&gt;create an account on Podcasts Connect&lt;/a&gt; and &lt;a href=&quot;https://help.apple.com/itc/podcasts_connect/#/itc4f0f5ac7d&quot;&gt;submit the feed with the standards that Apple specifies&lt;/a&gt;. In our case, this submission process was a bit boring, as we need some interaction until the feed is 100% up to standard, but once the feed was ready and &lt;a href=&quot;https://github.com/PizzaDeDados/pizzadedadosantigo/blob/master/feed.xml&quot;&gt;validated to Apple podcast specifications&lt;/a&gt;, we were prepared to distribute Pizza through there.&lt;/p&gt;

&lt;h2 id=&quot;before-recording&quot;&gt;Before recording&lt;/h2&gt;

&lt;p&gt;Before we get to ~put the pizza in the oven~ we have to plan. Our podcast is mainly made of interviews in a friendly chat environment, but for that to happen, we prepare a lot.&lt;/p&gt;

&lt;p&gt;The first step then is to choose a guest or guests to chat with us. We have a giant spreadsheet with names of people we want to bring to Pizza on a wide range of subjects within data science. It is from this spreadsheet that we mainly chose the people who come to talk to us. Next to each person’s name, we have a list of subjects that led to her/him being on the list.&lt;/p&gt;

&lt;p&gt;Based on the person chosen and the subject in which she or he specializes in &lt;a href=&quot;http://leportella.com/&quot;&gt;Leticia Portella&lt;/a&gt;, &lt;a href=&quot;http://www.gusrabbit.com/&quot;&gt;Gustavo Coelho&lt;/a&gt;, and I share several posts and articles internally until the recording date. We use this as a way to prepare and write “the agenda” of the day. The agenda itself is a relatively simple file with topics and questions of interest to us. We send it to our guests at least a week in advance so that 1) he or she can contribute with issues to be discussed and 2) can prepare on what is coming and feel as comfortable as possible while recording.&lt;/p&gt;

&lt;p&gt;The agenda is &lt;strong&gt;not&lt;/strong&gt; a rigid set of topics, we will not talk precisely about what is written on it, but it serves to prevent us from getting caught in moments of “we have nothing to talk about”. In most cases, the conversation flows naturally, and the agenda is hardly ever used.&lt;/p&gt;

&lt;p&gt;An important point of preparation is also the alignment of schedules. Matching the busy schedule of 4 or 5 people is sometimes complicated, so we are prepared to record more than one episode a month. This ensures we have material to publish if none of the guests we had in mind can record with us on the date we had in mind.&lt;/p&gt;

&lt;h2 id=&quot;recordings&quot;&gt;Recordings&lt;/h2&gt;

&lt;p&gt;In the beginning, we tested two ways to record, the first was using a video conferencing program called Zoom, but Zoom’s free account limits conference time when you have more than 2 people in the room (one of the reasons for the first episode being one of the shortest). With time limitation being the screaming factor, we switched to YouTube. That’s right, the Pizza episodes are recorded on YouTube.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;img src=&quot;https://media.giphy.com/media/1yTcE7OlChz4qU0ehj/source.gif&quot; /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://media.giphy.com/media/1yTcE7OlChz4qU0ehj/source.gif&quot;&gt;Source&lt;/a&gt;
&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Google used to have a tool called Hangouts On Air, which is now part of YouTube. Basically, it allows you to make a Hangouts call and (amazingly!) record it! These calls are associated with your YouTube channel, so we kinda became YouTubers.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;img src=&quot;https://media.giphy.com/media/cD7PLGE1KWOhG/source.gif&quot; /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://media.giphy.com/media/cD7PLGE1KWOhG/source.gif&quot;&gt;Source&lt;/a&gt;
&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;There are several types of calls on YouTube: public calls, which everyone subscribed to your channel will receive a notification when they start and can watch live; unlisted ones that people with a link can follow live if they wish, but channel subscribers will not receive notification (imagine a secret live conference); and private ones, which can be viewed by invitation only.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/yt_call_creation.png&quot; alt=&quot;tela de criacao de evento no youtube&quot; /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;i&gt;&lt;small&gt;
YouTube call creation screen
&lt;/small&gt;&lt;/i&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Today is exactly what we do, we create the private call on YouTube and send the call link to the guests, so we can record without anyone watching. 😋&lt;/p&gt;

&lt;p&gt;After we finish recording, we use youtube-dl to download only call audio with the highest quality available. A word of caution: There are a few things that influence audio quality 1) microphones and 2) audio transmission. Audio that is transmitted via the internet, for example, as is our case, naturally loses some of its quality. That’s why we always download with the best quality possible. Microphones, on the other hand, can only be improved by buying high-quality microphones, often more expensive, so try to do your best to mitigate the lack of a good microphone by recording in a quiet place without echoes and background noise.&lt;/p&gt;

&lt;h2 id=&quot;edition&quot;&gt;Edition&lt;/h2&gt;

&lt;p&gt;If you &lt;a href=&quot;https://podcast.pizzadedados.com/e/episodio-001-hello-world&quot;&gt;follow Pizza from the beginning&lt;/a&gt;, you know that we have evolved a lot in the last year, right? Today we have our own audio magician: Johnny (we love you Johnny ❤), but at first, it wasn’t always like this…&lt;/p&gt;

&lt;p&gt;In the beginning, we did the editing ourselves. That consisted of cutting silences and language vices using a program called &lt;a href=&quot;https://www.audacityteam.org/&quot;&gt;Audacity&lt;/a&gt;. It caters to many audio things from recording to editing and supports all operating systems we use.&lt;/p&gt;

&lt;p&gt;Editing was by far the most massive task for us since we had zero knowledge of how to do it. This step took the time that we didn’t have to give, it was the task that most prevented the episode from being released at regular intervals. But we made it work. Finally, a few months into the podcast, we partnered with &lt;a href=&quot;https://www.databootcamp.com.br/&quot; title=&quot;Data Bootcamp&quot;&gt;Data Bootcamp&lt;/a&gt;, and that allowed us to pay Johnny and free up our time to focus on other activities.&lt;/p&gt;

&lt;h2 id=&quot;making-the-post&quot;&gt;Making the post&lt;/h2&gt;

&lt;p&gt;Apart from editing, we still have to write the episode post. This is the second most massive task. We listen to the audio and write down every technical term and concept we mention, then look for reference links on said subject to add to the post.&lt;/p&gt;

&lt;p&gt;After doing this task sometimes, we created a template that has the skeleton of a post, so we avoid rewriting the repeating sections like &lt;em&gt;“Listen Now”&lt;/em&gt; and &lt;em&gt;“People in this episode”&lt;/em&gt;, this template also helps us not to forget any parts that should appear on a typical post. 😉&lt;/p&gt;

&lt;h2 id=&quot;youtube-episode&quot;&gt;YouTube episode&lt;/h2&gt;

&lt;p&gt;Did you know that in addition to using YouTube for recording, we also release Pizza episodes on YouTube? Each one is also rendered as a video. To do that we use two tools:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://kdenlive.org/en/&quot;&gt;kdenlive&lt;/a&gt;: The most straightforward video editor I’ve found for Linux;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.canva.com/&quot;&gt;Canva&lt;/a&gt;: An online platform for making designs. You may have noticed that the Pizza arts have the “same face”, this happens because we use Canva to standardize our brand, there we save in our primary colors, the font we use, the Pizza icon and the images we use as templates for YouTube and other social networks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Usually, the video rendering happens alongside posts write-ups since every post comes with an embed of the video uploaded to YouTube as an alternative platform for people to listen.&lt;/p&gt;

&lt;h2 id=&quot;uploading-the-material&quot;&gt;Uploading the material&lt;/h2&gt;

&lt;p&gt;Audio: Ready. Video: ready. Post: done. It’s time to put all of this on the platforms. Then we upload the audio to archive.org and the rendered video to YouTube and schedule it to the episode’s release date.&lt;/p&gt;

&lt;h2 id=&quot;pizza-delivered&quot;&gt;Pizza delivered&lt;/h2&gt;

&lt;p&gt;After all of this process is done, finally comes new episode release day. Remember, I said we created a page on GitHub? This page is like a blog, and each episode is a blog post.&lt;/p&gt;

&lt;p&gt;So on the agreed release date, one of the 3 pizzaiolos would go to GitHub and create a pull request on the website project to finally air the new chapter. Pull request accepted, GitHub takes care of updating the site and officializing the release of the latest episode.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;final-considerations&quot;&gt;Final considerations&lt;/h2&gt;

&lt;p&gt;Of course, not every podcast is like this, and this is a dynamic that worked for us, recently we went through some changes, and you may have noticed that the new Pizza landing page no longer has the episodes posts. And that may also happen to you after the podcast takes flight, you will notice a natural evolution.&lt;/p&gt;

&lt;p&gt;Oh, and one last thing, during this natural evolution process, we also launched a recurrent funding campaign that helps us pay for Johnny’s work, so if you like what we do, &lt;a href=&quot;https://apoia.se/pizzadedados&quot;&gt;support our work&lt;/a&gt; (and Johnny’s 😜).&lt;/p&gt;

&lt;center&gt; &lt;a href=&quot;https://apoia.se/pizzadedados&quot;&gt; &lt;img src=&quot;/images/pizza-apoie-200.png&quot; atl=&quot;botao com a logo do pizza e a palavra apoie escrita logo abaixo&quot; /&gt; &lt;/a&gt; &lt;/center&gt;

&lt;p&gt;I would also like to thank all the listeners and friends who have been following and supporting Pizza. And for you who want to start your own podcast: I hope this post helps to clarify some of the ideas and how-tos.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Hugs and welcome to the podsphere.&lt;/p&gt;
</description>
        <pubDate>Wed, 13 Mar 2019 12:00:00 +0000</pubDate>
        <link>https://jtemporal.com/podcast-backstage-tour/</link>
        <guid isPermaLink="true">https://jtemporal.com/podcast-backstage-tour/</guid>
        
        <category>tools</category>
        
        <category>english</category>
        
        <category>podcast</category>
        
        <category>pizza de dados</category>
        
        <category>podcasting</category>
        
        
      </item>
    
      <item>
        <title>Indo além no Schematics: Personalizando nossos modelos e validações</title>
        <description>&lt;p&gt;Não basta definir modelos e usar as validações que vem de fábrica, às vezes precisamos expandir essas validações para casos específicos do nosso domínio. Vamos ver como fazer isso nesse tutorial.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo esse tutorial, vai lá para a revista do Pizza 👇&lt;/p&gt;

&lt;center&gt;
  &lt;a href=&quot;https://medium.com/pizzadedados/indo-alem-no-schematics-personalizando-nossos-modelos-e-validacoes-a59314320290&quot;&gt;
 &lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; /&gt;
  &lt;/a&gt;
&lt;/center&gt;
</description>
        <pubDate>Wed, 13 Feb 2019 02:00:00 +0000</pubDate>
        <link>https://jtemporal.com/indo-alem-no-schematics-personalizando-nossos-modelos-e-validacoes/</link>
        <guid isPermaLink="true">https://jtemporal.com/indo-alem-no-schematics-personalizando-nossos-modelos-e-validacoes/</guid>
        
        <category>medium</category>
        
        
      </item>
    
      <item>
        <title>Retrospectiva 2018: Você cresceu esse ano?</title>
        <description>&lt;p&gt;Eu tenho uma mania de achar que andei em círculos o ano inteiro e acabei no mesmo lugar que estava em dezembro do ano passado. Então assim como no ano passado decidi fazer uma retrospectiva rápida das coisas que aconteceram esse ano… Ano passado eu viajei bastante e esse ano eu quis ter mais equilíbrio na vida, conseguir focar em projetos mais perto de mim e em mim mesma. Então assim como no ano passado, vamos brincar de retrospectiva. A brincadeira é a seguinte:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Escolha um tema: O seu tema pode ser qualquer coisa, desde que você considere que ele tenha um peso importante no seu ano. Esse ano escolhi Projetos pessoais. Ah e se você não quiser escolher um tema só tudo bem também 😉&lt;/li&gt;
  &lt;li&gt;Cada coisa/momento que eu considero notável no meu ano entra na lista. Um momento notável é algo que ficou marcado de alguma forma quando alguém pergunta E aí como foi o ano?&lt;/li&gt;
  &lt;li&gt;Cada item da lista vai ter uma descriçãozinha com o motivo que torna aquele momento notável por exemplo: aprendi a tocar violão, e isso é notável pois eu comprei um violão fazem 3 anos e até agora tava pegando poeira;&lt;/li&gt;
  &lt;li&gt;O objetivo é perceber que, por mais difícil que o ano tenha sido pra você, você cresceu esse ano;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;então-bora-lá&quot;&gt;Então bora lá!&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Um ano de Pizza&lt;/strong&gt;: Completamos um ano do podcast mais queridinho no mundo de ciência de dados e fizemos um episódio esse mês pra falar como foi massa passar esse ano com as pessoas que escuta o Pizza.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Dei palestra num evento de marketing digital&lt;/strong&gt;: Como no ano passado, dar palestras continuou sendo algo que eu gosto muito de fazer, esse ano o desafio foi um pouco diferente ao aceitar falar sobre serenata num evento que não estava no meu roteiro tradicional de eventos. O &lt;a href=&quot;https://www.hotmart.com/fire/pt/&quot;&gt;FireFestival&lt;/a&gt; é um evento anual organizado pela HotMart em Belo Horizonte e que esse ano decidiu trazer uma trilha com conteúdos mais técnicos além da tradicional trilha de marketing, e lá fui eu falar sobre ciência de dados e Serenata pra uma galera nova… Mas além de passar conhecimento, eu aprendi várias dicas que estamos aplicando no 🍕.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Dei meu primeiro Keynote e o segundo também&lt;/strong&gt;: Bem, que eu dei algumas palestras esse ano não é novidade afinal, eu adoro fazer isso, no entanto além de falar num evento fora do tradicional pra mim, eu tive a honra de ser convidada pra ser keynote em não um, mas dois eventos da minha comunidade favorita ❤️ e lá fui eu ser keynote da Primeira &lt;a href=&quot;http://pyladies-brazil.github.io/conf/&quot;&gt;PyLadiesBrConf&lt;/a&gt; e da &lt;a href=&quot;https://2018.pythonnordeste.org/&quot;&gt;Python Nordeste&lt;/a&gt; desse ano ao lado de pessoas incríveis que admiro muito!! Amor eterno a comunidade Python e as pessoas lindas que fizeram eventos maravilhosos mesmo em condições desfavoráveis, vocês são demais! Ano que vem a PythonNordeste vai ser na minha terra natal em Recife! Nos vemos lá ein?!&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ajudei a organizar a PythonSudeste&lt;/strong&gt;: Python Sudeste evento regional e itinerante foi em São Paulo esse ano, e eu fiz parte do time maravilhoso que organizou o evento. Aos trancos e barrancos a PySE saiu e foi massa demais! Um beijo no coração de todos da org e principalmente da galera que topo estar em SP em plena páscoa pra prestigiar o evento! Ano que vem a PySE vai ser no &lt;a href=&quot;http://2019.pythonsudeste.org/&quot;&gt;Espírito Santo e já tem lugar&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Hacktoberfest&lt;/strong&gt;: todo ano eu tento incentivar pessoas a participarem do hacktoberfest, ano passado eu fiz uma lista de projetos brasileiros que estavam precisando de contribuições, esse ano fiz uma lista nova e ainda fiz duas lives ensinando como fazer PRs uma comigo fazendo PR e outra com uma amiga incrível onde começamos desde a instalação do git na máquina dela até o PR. Ano que vem pretendo fazer mais isso durante o mês de outubro pra ajudar mais gente 😉.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Escrevi posts sobre estatística ~finalmente~&lt;/strong&gt;: desde que eu e a &lt;a href=&quot;https://twitter.com/leleportella&quot;&gt;Leticia Portella&lt;/a&gt; demos um tutorial na PyBR de 2017 sobre &lt;a href=&quot;https://github.com/leportella/tutorial-modulos-data-science&quot;&gt;“&lt;em&gt;Introdução aos Módulos de Análise de Dados&lt;/em&gt;”&lt;/a&gt; eu percebi que o mais difícil para pessoas que já programam e chegam ao mundo de ciência de dados é a parte estatística da coisa, e desde então que eu tenho vontade de explicar conceitos de estatística para pessoas. Esse fim de ano eu finalmente consegui escrever 3 blogposts (&lt;a href=&quot;https://medium.com/pizzadedados/frequencia-o-que-e-e-como-calcular-f8b74e5d978a&quot;&gt;um deles já está no ar&lt;/a&gt;) com conteúdo de estatística descritiva! Então se você quiser aprender mais sobre isso ou relembrar conceitos fica de olho que mais posts estão por vir.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Consegui configurar o OBS no meu computador&lt;/strong&gt;: não que eu queira ser YouTuber, mas algumas pessoas aprendem melhor vendo vídeos do que lendo conteúdo, então pra completar os posts sobre estatística eu vou também gravar uns vídeos explicando como fazer as coisas com exemplos práticos! Vai ser legal! 😎 Mas pra isso eu precisava conseguir gravar de uma forma satisfatória a tela do computador e aí eu consegui configurar &lt;a href=&quot;https://obsproject.com/&quot;&gt;o OBS&lt;/a&gt;, um software que permite gravar e fazer stream de video, yay!&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Aprendi uma linguagem nova!&lt;/strong&gt;: Eu não tinha me dado conta disso até que um amigo viu meu CV atualizado e disse &lt;em&gt;“Eita, você aprendeu uma linguagem nova esse ano!”&lt;/em&gt; E eu fiquei &lt;em&gt;“Puxa! Verdade!”&lt;/em&gt;. Trabalhando na Nuveo eu entrei em contato com a linguagem de programação Go, uma linguagem novinha criada pelo Google parecida com C e focada em performance. Como parte do produto Nuveo é escrito em Go, era de se esperar que mais cedo ou mais tarde eu aprendesse essa linguagem, com muita paciência e muita orientação do &lt;a href=&quot;http://twitter.com/crgimenes/&quot;&gt;Cesar&lt;/a&gt;, posso dizer que terminei o ano sabendo Go. Ah e dica todas as quintas-feiras, às 22h tem encontro do grupo de estudos de Go que o Cesar organiza, então se você tá querendo aprender Go também aproveita e se junta a galera.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Escrevi uma feature do zero em Go no sistema da empresa&lt;/strong&gt;: a maior prova que aprendi é que nos últimos meses do ano, além de dar manutenção na parte Python que eu trabalhava, também desenvolvi uma feature nova do zero em Go no sistema da Nuveo! Viva!!!&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Roubei o Sudocast para a edição especial #OPodcastÉDelas&lt;/strong&gt;: Esse ano foi a segunda edição do &lt;a href=&quot;http://opodcastedelas.com.br/&quot;&gt;O Podcast é Delas&lt;/a&gt; uma iniciativa para trazer mais mulheres para a podosfera onde qualquer podcast pode participar. Aí os meninos do Sudocast toparam a ideia de que eu e umas amigas apresentassem a edição 11. Falamos de muitas coisas técnicas &lt;a href=&quot;https://www.sudocast.com.br/11-o-podcast-e-delas/&quot;&gt;passa lá depois pra ouvir&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ganhei uma bolsa de estudos da Udacity&lt;/strong&gt;: Esse ano a Udacity em parceria com algumas empresas ofereceu muitas bolsas de estudo para ciência de dados, uma dessas bolsas foi concedida em parceria com a Bertelsmann, e eu fui uma das 15mil pessoas selecionadas para primeira fase de estudos. Infelizmente não passei para segunda fase que incluía ganhar cursar um Nanodegree da Udacity, mas ainda assim foram 3 meses de aprendizado muito legais!&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Comecei um blog com um propósito e não terminei&lt;/strong&gt;: Quando comecei os estudos da bolsa da Udacity decidi que, além de fazer minhas anotações, iria postar coisas sobre o que eu estava estudando num blog apenas para isso. Com o passar dos dias e com a loucura da vida, tive que abandonar o blog pois ele estava mais atrapalhando o meu andamento do que me ajudando a fixar as informações ¯&lt;em&gt;(ツ)&lt;/em&gt;/¯. Mas tudo bem, os estudos me deram um guia de como fazer os posts sobre estatística pra revista do pizza \o/&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Fui coordenadora de trilha no TDC SP&lt;/strong&gt;: junto com o &lt;a href=&quot;https://twitter.com/perylemke&quot;&gt;Pery Lemke&lt;/a&gt; e o &lt;a href=&quot;https://twitter.com/vdemario&quot;&gt;Vitor De Mario&lt;/a&gt; coordenei a trilha de Go (linguagem que aprendi esse ano ❤️) na edição de São Paulo do TDC! Tivemos um equilíbrio muito bom entre homens e mulheres palestrando e ficamos muito orgulhos com o resultado do dia 😉&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Dividi apê durante um mês com a Thais&lt;/strong&gt;: Uma das belezas de trabalhar remotamente é que da pra fazer essas coisas, morar um mês numa cidade diferente, pra melhorar ainda mais morar um mês com uma mulher incrível foi uma daquelas experiências maravilhosas que a gente nem acredita que poderia rolar ❤️.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Notebooks de volta ao ar com ajuda de um amigo&lt;/strong&gt;: ao fazer a transição para Open Knowledge Foundation, uma coisa que aconteceu foi que os notebooks da Serenata viraram uma tag dentro do GitHub dificultando o acesso a eles (já que para vê-los era necessário baixar e descompactar um arquivo .zip), para mim uma característica fundamentais da Serenata era a possibilidade de ser fonte de conhecimento em análise de dados através da disponibilização dos notebooks, então eu e o &lt;a href=&quot;http://twitter.com/rodolfoviana/&quot;&gt;Rodolfo Viana&lt;/a&gt; que estávamos sentindo saudade dos notebooks, com a ajuda do Cuducos, colocamos os &lt;a href=&quot;http://github.com/okfn-brasil/notebooks/&quot;&gt;notebooks de volta no ar num repositório só pra eles&lt;/a&gt; 🎉🎉 e estamos mantendo esse projeto, então se quiser mandar mais contribuições estamos lá para ajudar 😉&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Mudei de emprego&lt;/strong&gt;: Ano novo vida nova de fato, fechei mais um ciclo de trabalho dessa vez, digo xau pra Nuveo, a jornada foi incrível, mas chegou ao fim. E voltando oficialmente a ser cientista de dados, digo olá para a Globo!!! Aahh e vou ser colega de trabalho do Rodolfo!!! Vai ser top!&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;p&gt;Um ano de muitas emoções e por esse ano é só! Vamos ver ano que vem como vai ser…&lt;/p&gt;

&lt;p&gt;Um abraço apertado e um cheiro 😘&lt;/p&gt;

&lt;p&gt;PS.: e você que tá lendo isso, se eu te perguntasse o que você fez esse ano, o que você me diria? Se quiser contar sou toda ouvidos 😉&lt;/p&gt;
</description>
        <pubDate>Sun, 30 Dec 2018 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/retrospectiva-2018/</link>
        <guid isPermaLink="true">https://jtemporal.com/retrospectiva-2018/</guid>
        
        <category>pessoal</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Frequência</title>
        <description>&lt;p&gt;A arte de contar observações&lt;/p&gt;

&lt;p&gt;Aprenda o que são e como calcular frequências.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo esse artigo e aprender a calcular frequências, vai lá para a revista do Pizza 👇&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/pizzadedados/frequencia-o-que-e-e-como-calcular-f8b74e5d978a&quot;&gt;&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; alt=&quot;clique aqui para ler&quot; style=&quot;display: block; margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 12 Dec 2018 02:00:00 +0000</pubDate>
        <link>https://jtemporal.com/frequencia/</link>
        <guid isPermaLink="true">https://jtemporal.com/frequencia/</guid>
        
        <category>medium</category>
        
        <category>estatistica</category>
        
        <category>estatistica descritiva</category>
        
        <category>frequencia</category>
        
        
      </item>
    
      <item>
        <title>Introdução ao Schematics: um guia para validar dados de um JSON</title>
        <description>&lt;p&gt;Garantir regras de negócio é uma questão primordial no mundo da programação. Essas regras também afloram na parte de dados quando precisamos garantir que estamos recebendo as informações necessárias e nos formatos esperados para alimentar nossas bases.&lt;/p&gt;

&lt;p&gt;Quando esses dados vem de uma API no formato textual de um JSON, nosso &lt;em&gt;software&lt;/em&gt; precisa garantir que o &lt;em&gt;casting&lt;/em&gt; desse dado vai trazer formatos consistentes. Existem várias formas/bibliotecas para fazer isso em Python, uma delas é a &lt;a href=&quot;https://schematics.readthedocs.io/en/latest/index.html&quot;&gt;Schematics&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra fazer o tutorial sobre o Schematics clica aqui nesse botão 👇&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/databootcamp/introducao-ao-schematics-a62ce5b83667&quot;&gt;&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; alt=&quot;clique aqui para ler&quot; style=&quot;display: block; margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 20 Nov 2018 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/intro-schematics/</link>
        <guid isPermaLink="true">https://jtemporal.com/intro-schematics/</guid>
        
        <category>tutorial</category>
        
        <category>python</category>
        
        <category>schematics</category>
        
        <category>data science</category>
        
        <category>data structures</category>
        
        <category>estruturas de dados</category>
        
        <category>ciencia de dados</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Subindo imagens docker pro dockerhub</title>
        <description>&lt;p&gt;Já achou mágico aquelas imagens pros containers docker que qualquer um pode usar e já pensou em fazer uma mas não sabe como? Vem que eu te ensino 😉&lt;/p&gt;

&lt;p&gt;Pra começar você vai precisar de uma conta no &lt;a href=&quot;https://hub.docker.com/&quot;&gt;Docker Hub&lt;/a&gt; é lá que todas todas as imagens para containers Docker vivem. Depois de criar sua continha lá, podemos passar para linha de comando e começar a usar a CLI do Docker.&lt;/p&gt;

&lt;p&gt;Antes de fazer qualquer coisa precisamos de um projeto certo? O projeto que vamos usar aqui &lt;a href=&quot;https://github.com/jtemporal/autom-dockerhub-example&quot;&gt;está neste repositório do GitHub&lt;/a&gt;. Ele consiste apenas em um script Python que faz a soma de dois números recebidos na linha de comando.&lt;/p&gt;

&lt;p&gt;Agora que temos um projeto vamos começar pelo &lt;em&gt;login&lt;/em&gt;, embora você não precise fazer &lt;em&gt;login&lt;/em&gt; para fazer o build das suas imagens, uma vez feito o &lt;em&gt;login&lt;/em&gt; você pode esquecer que ele existe:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/autom-dockerhub-example/master/gifs/docker-login.gif&quot; alt=&quot;login&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;docker login&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Agora vamos fazer o build da nossa imagem:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/autom-dockerhub-example/master/gifs/docker-build-sum.gif&quot; alt=&quot;build da imagem docker&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;docker build -t sum .&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Aqui usamos o parâmetro &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-t&lt;/code&gt; para dar nome à nossa imagem. Depois de fazer o build podemos conferir a imagem na nossa lista de imagens disponíveis localmente: &lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/autom-dockerhub-example/master/gifs/docker-images-before-tag.gif&quot; alt=&quot;listagem de imagens antes do tag&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;docker images | grep sum&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Agora que temos uma imagem  pronta, vamos dar uma tag para ela e conferir se ela foi taggeada corretamente:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/autom-dockerhub-example/master/gifs/docker-tag-sum.gif&quot; alt=&quot;docker tag e listagem de imagens depois da tag&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;docker tag sum $(echo DOCKER_USERNAME)/sum&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Basicamente é esse passo que nos permite divulgar nossas imagens. Então depois de dar uma tag para sua imagem. Chegou a hora de fazer o push (envio da imagem para o Docker Hub):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/autom-dockerhub-example/master/gifs/docker-push-sum.gif&quot; alt=&quot;push manual da imagem docker&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;docker push $(echo DOCKER_USERNAME)/sum&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;e pronto. Agora a &lt;a href=&quot;https://hub.docker.com/r/jtemporal/sum/&quot;&gt;imagem foi enviada para o Docker Hub&lt;/a&gt;, tornando possível qualquer pessoa usar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker pull&lt;/code&gt; para baixar a e usar a imagem:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/autom-dockerhub-example/master/gifs/docker-pull.gif&quot; alt=&quot;docker pull e uso da imagem&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;docker pull jtemporal/sum &amp;amp;&amp;amp; docker run --rm jtemporal/sum 4 2&lt;/i&gt;
&lt;/center&gt;

&lt;h2 id=&quot;algo-extra&quot;&gt;Algo extra&lt;/h2&gt;

&lt;p&gt;Ficar fazendo esses passos todos na mão pode ser cansativo se você precisar subir muitas imagens e além disso, tudo que fazemos a mão pode estar propenso a erros. Então o caminho natural seria automatizar essas tarefas.&lt;/p&gt;

&lt;p&gt;Existem várias formas de fazer isso, mas vamos aqui usar um &lt;em&gt;script shell&lt;/em&gt; que chamei de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;push.sh&lt;/code&gt; para isso:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-z&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DOCKER_USERNAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Missing DOCKER_USERNAME variable!&quot;&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;1
&lt;span class=&quot;k&quot;&gt;fi

&lt;/span&gt;error&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$?&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; 0 &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
        &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Error!&quot;&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;122
    &lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

build&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;=&amp;gt; Building &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
    docker build &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;=&amp;gt; Built &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

tag&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;=&amp;gt; Tagging &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
    docker tag &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$DOCKER_USERNAME&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;=&amp;gt; Tagged &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

push&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;=&amp;gt; Pushing &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
    docker push &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$DOCKER_USERNAME&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;=&amp;gt; Pushed &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

build &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
error
tag &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
error
push &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
error
&lt;span class=&quot;nb&quot;&gt;echo

exit &lt;/span&gt;0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nele reproduzi todos os passos que fizemos até aqui  e para usar basta fazer:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/autom-dockerhub-example/master/gifs/docker-automated-push.gif&quot; alt=&quot;gif do push automatizado&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;./push.sh sum&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Você pode ainda colocar esse script em uma ferramenta de entrega contínua e deixar a mágica acontecer.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;p&gt;Os códigos e passos demonstrados aqui &lt;a href=&quot;https://github.com/jtemporal/autom-dockerhub-example&quot;&gt;estão neste repositório do GitHub&lt;/a&gt; passa lá pra deixar uma ⭐️&lt;/p&gt;
</description>
        <pubDate>Sat, 17 Nov 2018 08:00:00 +0000</pubDate>
        <link>https://jtemporal.com/subindo-imagens-docker-pro-dockerhub/</link>
        <guid isPermaLink="true">https://jtemporal.com/subindo-imagens-docker-pro-dockerhub/</guid>
        
        <category>tutorial</category>
        
        <category>docker hub</category>
        
        <category>automação</category>
        
        <category>automatização</category>
        
        <category>docker</category>
        
        <category>português</category>
        
        <category>container</category>
        
        <category>containers</category>
        
        <category>conteiner</category>
        
        <category>conteiners</category>
        
        
      </item>
    
      <item>
        <title>Filas e mensagens pra que te quero</title>
        <description>&lt;p&gt;Um comparativo entre Kafka, RabbitMQ e NATS&lt;/p&gt;

&lt;p&gt;A filosofia do micro serviço e de partes que funcionam independemente de um todo, mas vivem em constante comunicação, não é nada novo. Essa comunicação pode se dar de várias formas, umas mais onerosas que outras. Por isso, é importante escolher bem para garantir a resiliência e escalabilidade do seu software.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo esse comparativo clica aqui nesse botão 👇&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/test-after-deploy/filas-e-mensagens-pra-que-te-quero-e78458615b14&quot;&gt;&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; alt=&quot;clique aqui para ler&quot; style=&quot;display: block; margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 05 Nov 2018 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/filas-comparativo/</link>
        <guid isPermaLink="true">https://jtemporal.com/filas-comparativo/</guid>
        
        <category>queue</category>
        
        <category>mensagens</category>
        
        <category>filas de mensagem</category>
        
        <category>rabbitmq</category>
        
        <category>kafka</category>
        
        <category>apache kafka</category>
        
        <category>nats</category>
        
        <category>nats io</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Projetos Brasileiros para fazer pull requests nesse #Hacktoberfest versão 2018</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/projetos-br-hacktoberfest-2025/&quot;&gt;Edição atual da lista disponível aqui&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Ano passado eu fiz &lt;a href=&quot;https://medium.com/nossa-coletividad/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-4dc9b9b576c0&quot;&gt;uma lista de projetos brasileiros que estavam precisando de uma mãozinha&lt;/a&gt; e que qualquer pessoa poderia fazer um pull request.&lt;/p&gt;

&lt;p&gt;Então esse ano vamos fazer isso de novo! Ebaaa!
Regras&lt;/p&gt;

&lt;p&gt;Novamente temos regrinhas:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ser um projeto criado/desenvolvido por brasileiras(os);&lt;/li&gt;
  &lt;li&gt;Ter pelo menos uma issue aberta.&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;p&gt;Pra ver projetos Brasileiros para contribuir clica aqui nesse botão 👇&lt;/p&gt;

&lt;center&gt;
&lt;a href=&quot;https://medium.com/@jessicatemporal/projetos-brasileiros-para-contribuir-nesse-hacktoberfest-vers%C3%A3o-2018-4925959b9411&quot;&gt;
  &lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; /&gt;
  &lt;/a&gt;
&lt;/center&gt;
</description>
        <pubDate>Sun, 30 Sep 2018 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-versao-2018/</link>
        <guid isPermaLink="true">https://jtemporal.com/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-versao-2018/</guid>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Ciência de dados no mundo real com Serenata de Amor</title>
        <description>&lt;h3 id=&quot;vídeo&quot;&gt;Vídeo&lt;/h3&gt;

&lt;p&gt;Você pode &lt;a href=&quot;https://videoh.infoq.com/presentations-br/devconf2018-JessicaTemporal-Dados.mp4&quot;&gt;assistir essa palestra aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;evento&quot;&gt;Evento&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.sympla.com.br/devconf-2018__233687&quot;&gt;DevConf 2018&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;apresentação&quot;&gt;Apresentação&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;center&gt;

&lt;iframe src=&quot;//slides.com/jtemporal/serenata-devconf/embed&quot; width=&quot;576&quot; height=&quot;420&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;/center&gt;
</description>
        <pubDate>Tue, 18 Sep 2018 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/ciencia-de-dados-no-mundo-real-com-serenata-de-amor/</link>
        <guid isPermaLink="true">https://jtemporal.com/ciencia-de-dados-no-mundo-real-com-serenata-de-amor/</guid>
        
        
      </item>
    
      <item>
        <title>Post Mortem Python Sudeste 2018</title>
        <description>&lt;p&gt;Finalmente saiu o &lt;em&gt;post mortem&lt;/em&gt; da Python Sudeste 2018. Lembrando que este relatório contém os fatos do meu ponto de vista e que eu tentei ser o mais fiel aos acontecimentos possível. Ele tá longo! Mas muita coisa aconteceu e todo mundo que tenha interesse merece saber ;)&lt;/p&gt;

&lt;h1 id=&quot;índice&quot;&gt;Índice&lt;/h1&gt;
&lt;!-- START doctoc generated TOC please keep comment here to allow auto update --&gt;
&lt;!-- DON&apos;T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#defini%C3%A7%C3%B5es&quot;&gt;Definições&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#iniciais&quot;&gt;Iniciais&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#finais&quot;&gt;Finais&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#antes-do-evento&quot;&gt;Antes do Evento&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#local&quot;&gt;Local&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#dificuldades&quot;&gt;Dificuldades&lt;/a&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;#guarulhos-ou-s%C3%A3o-paulo-capital&quot;&gt;Guarulhos ou São Paulo capital&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#a-busca-inicial-e-sua-falha&quot;&gt;A busca inicial e sua falha&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#surgimento-de-um-local-microsoft&quot;&gt;Surgimento de um local: Microsoft&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;#um-novo-local&quot;&gt;Um novo local&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#organiza%C3%A7%C3%A3o&quot;&gt;Organização&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#divis%C3%A3o-de-equipes&quot;&gt;Divisão de equipes&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#comunica%C3%A7%C3%A3o-interna&quot;&gt;Comunicação Interna&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#divis%C3%A3o-de-tarefas&quot;&gt;Divisão de tarefas&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#o-core&quot;&gt;O core&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#o-voluntariado&quot;&gt;O voluntariado&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#resultado-da-reorganiza%C3%A7%C3%A3o&quot;&gt;Resultado da reorganização&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#palestras-e-tutoriais&quot;&gt;Palestras e tutoriais&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#chamada-para-palestras&quot;&gt;Chamada para palestras&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#chamada-para-tutoriais&quot;&gt;Chamada para tutoriais&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#keynotes&quot;&gt;Keynotes&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#divulga%C3%A7%C3%A3o-e-artes&quot;&gt;Divulgação e artes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#ingressos&quot;&gt;Ingressos&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#patroc%C3%ADnios&quot;&gt;Patrocínios&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#caso-microsoft&quot;&gt;Caso Microsoft&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#caso-scielo&quot;&gt;Caso SciELO&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#caso-olist-e-iclinic&quot;&gt;Caso Olist e iClinic&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#caso-cota-believer&quot;&gt;Caso Cota Believer&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#c%C3%B3digo-de-conduta&quot;&gt;Código de Conduta&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#durante-o-evento&quot;&gt;Durante o evento&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#grupos-de-trabalho&quot;&gt;Grupos de trabalho&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#controle-financeiro&quot;&gt;Controle Financeiro&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#ap%C3%B3s-o-evento&quot;&gt;Após o evento&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#doa%C3%A7%C3%B5es&quot;&gt;Doações&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#certificados&quot;&gt;Certificados&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#fotos&quot;&gt;Fotos&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#fechamento-do-caixa&quot;&gt;Fechamento do caixa&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#escrita-do-post-mortem&quot;&gt;Escrita do post mortem&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#conclus%C3%B5es&quot;&gt;Conclusões&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- END doctoc generated TOC please keep comment here to allow auto update --&gt;

&lt;h1 id=&quot;definições&quot;&gt;Definições&lt;/h1&gt;

&lt;p&gt;Aqui temos o queríamos da Python Sudeste de 2018 em linhas gerais. Estão definidas em duas partes: as iniciais, aquelas que idealizamos em um primeiro momento; e as finais, aquelas que realmente se deram. Durante a leitura deste post mortem, você encontrar uma narrativa de tudo que fizemos, tanto o que deu certo quanto o que deu errado e mais do que isso, o por que eu acho que deu certo ou errado.&lt;/p&gt;

&lt;h2 id=&quot;iniciais&quot;&gt;Iniciais&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Evento para 360 pessoas em São Paulo;&lt;/li&gt;
  &lt;li&gt;4 Keynotes;&lt;/li&gt;
  &lt;li&gt;Dois dias de evento em Abril (três dias caso conseguÍssemos local para receber workshops e tutoriais);&lt;/li&gt;
  &lt;li&gt;Trilha única.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;finais&quot;&gt;Finais&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Evento para 250 pessoas em São Paulo;&lt;/li&gt;
  &lt;li&gt;3 Keynotes;&lt;/li&gt;
  &lt;li&gt;Três dias de evento 30 e 31 de Março e 1 de Abril;&lt;/li&gt;
  &lt;li&gt;5 Trilhas: 3 de palestras e 2 de tutoriais durante todos os dias.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;antes-do-evento&quot;&gt;Antes do Evento&lt;/h1&gt;

&lt;h2 id=&quot;local&quot;&gt;Local&lt;/h2&gt;

&lt;p&gt;A Python Sudeste de 2018 aconteceu na BandTec Digital School em São Paulo - SP.&lt;/p&gt;

&lt;h3 id=&quot;dificuldades&quot;&gt;Dificuldades&lt;/h3&gt;

&lt;p&gt;É a escolha do local que define o tom do evento e praticamente toda organização do evento se deu ao decidirmos um local para o mesmo mas, até conseguirmos fechar um local, tivemos algumas dificuldades e vou narrá-las a seguir. A saber, todos os locais prospectados estão disponíveis &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1ssjq9SxRN1ctMmCwn1KPWERxIhJysZJF2UxMejhPojU/edit?usp=sharing&quot;&gt;nesta planilha&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;guarulhos-ou-são-paulo-capital&quot;&gt;Guarulhos ou São Paulo capital&lt;/h4&gt;

&lt;p&gt;No começo das movimentações (mais ou menos em outubro) existia a defesa de Guarulhos como uma possibilidade por causa de prospecções iniciais do Bruno Rocha que encontrou um Hotel que atenderia bem as nossas expectativas, porém a maioria do grupo acordou que o evento deveria ocorrer na capital por diversos fatores: um ótimo sistema de transporte metroviário, grande diversidade de opções alimentares, o amplo leque de opções de fácil acesso para happy hours e a maior quantidade de possibilidade de locais para escolher.&lt;/p&gt;

&lt;h4 id=&quot;a-busca-inicial-e-sua-falha&quot;&gt;A busca inicial e sua falha&lt;/h4&gt;

&lt;p&gt;A maior parte dos locais que acomodasse as cerca de 400 pessoas que tínhamos em mente cobrava um sinal de 10% (ou mais) do valor do aluguel para confirmar a reserva e nosso valor de caixa era um total de 0 reais. Nenhum possível patrocinador tinha sido confirmado. Nenhum local que não cobrasse aluguel (coworkings e afins) apresentava a capacidade para cerca de 400 pessoas tinha sido identificado para possível acordo. Isso arrefeceu o grupo inicial de voluntários com cerca de 30 pessoas.&lt;/p&gt;

&lt;h4 id=&quot;surgimento-de-um-local-microsoft&quot;&gt;Surgimento de um local: Microsoft&lt;/h4&gt;

&lt;p&gt;Em 15 de Dezembro, por intermédio do Mário Sérgio, a Microsoft entrou em contato com eventos Python que já tinham data aproximada para ocorrer, com interesse de se aproximar da comunidade e estreitar laços nessa nova fase da empresa. Finalmente em 26 de Dezembro chega um e-mail pedindo informações sobre os encontros ou eventos da comunidade em São Paulo. Eu, Jessica me responsabilizei por organizar o primeiro encontro do GruPy-SP no espaço de eventos da Microsoft, enquanto o Renne Rocha tomou conta da frente de viabilizar o possível patrocínio para a Python Sudeste ao enviar a carta de patrocínio do evento. Ao receber a proposta de patrocínio nos foi oferecido o auditório da Microsoft (uma vez que o local ainda não estava fechado) com capacidade para 250 pessoas.&lt;/p&gt;

&lt;p&gt;Com essa possibilidade em mãos o time de voluntários voltou a se mover para viabilizar o acontecimento do evento a partir do dia 2 de Janeiro principalmente, pela pressão feita pela Microsoft para que o acontecimento do evento se desse no último final de semana de Março (31 de Março e 1º de Abril). Discutimos internamente e topamos o desafio de adiantar em aproximadamente 1 mês da data que tínhamos idealizado.&lt;/p&gt;

&lt;p&gt;No dia 5 de Janeiro, enviei à Microsoft por WhatsApp os dados da APyB para escrita do contrato, uma vez que os meus e-mails anteriores não haviam sido recebidos.&lt;/p&gt;

&lt;p&gt;No dia 18 de Janeiro, aconteceu o encontro do GruPy-SP na Microsoft. Esse encontro tinha como objetivo, levar a comunidade para dentro da Microsoft e também apresentar o espaço do evento para a organização. Neste mesmo encontro, apertamos as mãos de definimos a data oficial do evento 31 de Março e 1º de Abril e a Microsoft como patrocinadora do local.&lt;/p&gt;

&lt;p&gt;Por volta do dia 15 de Fevereiro, depois de muita insistência de nossa parte por um contrato, em ligação com o Samuel, a Microsoft “deu pra trás”, com a ciência de que dia 30 de Maio era um feriado, a Microsoft ficou em dúvida sobre o sucesso do evento. Enquanto isso nós da organização e outras pessoas da comunidade já haviam comprado passagens então mudar a data não era uma opção viável.&lt;/p&gt;

&lt;h4 id=&quot;um-novo-local&quot;&gt;Um novo local&lt;/h4&gt;

&lt;p&gt;Ainda no dia 15, Samuel e Renne, se movimentaram para ver a possibilidade do evento ocorrer inteiramente na  BandTec, local que por intermédio do Danilo Belini estávamos vendo de receber nossos tutoriais e workshops no dia 30 de Março.&lt;/p&gt;

&lt;p&gt;Nessa hora foi fundamental a participação do Danilo que conseguiu agilizar junto com o Renne e o Samuel, perante a BandTec e a IdWall o patrocínio do local.&lt;/p&gt;

&lt;p&gt;No dia 26 de fevereiro foi assinado o contrato com ambas empresas e o novo local definido.&lt;/p&gt;

&lt;p&gt;Nos 10 dias entre a troca efetiva do local passamos a reorganizar o formato do evento que agora seria em trilhas uma vez que a maior sala, passou a ter capacidade máxima de 65 pessoas.&lt;/p&gt;

&lt;h1 id=&quot;organização&quot;&gt;Organização&lt;/h1&gt;

&lt;p&gt;Do grupo inicial com 30 pessoas presentes no Telegram, nós tínhamos um nível muito variado de níveis de comprometimento. Começou a ficar claro um grupo que estava sempre presente, nas reuniões e/ou nas participações assíncronas.&lt;/p&gt;

&lt;h2 id=&quot;divisão-de-equipes&quot;&gt;Divisão de equipes&lt;/h2&gt;

&lt;p&gt;Ainda em Outubro de 2017 numa reunião via Hangouts definimos as seguintes equipes de trabalho dentre os presentes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Local: Samuka, Beatriz, Bruno, Rafael&lt;/li&gt;
  &lt;li&gt;Mídias: Jessica, João, Vinicius Mesel, Bruno, Erika&lt;/li&gt;
  &lt;li&gt;Patrocínio: Bernardo, Ciro, Carlos, Bruno&lt;/li&gt;
  &lt;li&gt;Orçamentos: Ciro, Paty, Fábio&lt;/li&gt;
  &lt;li&gt;Inscrições/Ingressos: Ciro, Renne&lt;/li&gt;
  &lt;li&gt;CDC: Jessica, Paty&lt;/li&gt;
  &lt;li&gt;Conteúdo, Trilhas, Keynotes, Call4papers: Beatriz, Carlos, Fábio, Vinicius Mesel&lt;/li&gt;
  &lt;li&gt;Brindes, Canecas, Camisetas: Erika, João&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como vou detalhar mais a frente, essas equipes sofreram algumas mudanças.&lt;/p&gt;

&lt;h3 id=&quot;comunicação-interna&quot;&gt;Comunicação Interna&lt;/h3&gt;

&lt;p&gt;Inicialmente um grupo foi criado no Telegram onde reunimos as 30 pessoas inciais. A medida que as conversas de busca de local e organização das demais frentes começaram a impedir uma conversa viável no Telegram passamos para o Slack.&lt;/p&gt;

&lt;p&gt;Apesar de uma ótima ferramenta, o Slack coincidiu com o esfriamento orgânico da organização com a chegada das festas de final de ano e a falta de um local. O grupo do Telegram por sua vez foi reavivado efetivamente em Janeiro com a soma do aparecimento do local no dia 2 de Janeiro e o envio do &lt;a href=&quot;https://docs.google.com/document/d/12FjDZ-5aDaKlzRlUL2fRlI_RLihtvpZ3CiAHYkaVS1Q/edit?usp=sharing&quot;&gt;pedido conjunto de Grant para PSF&lt;/a&gt; no dia 4 de Janeiro.&lt;/p&gt;

&lt;p&gt;No fim o Slack foi abandonado do uso diário servindo apenas para formalizar as informações e fazer anúncios e discussões nos devidos canais e todas as demais comunicações passaram a serem feitas pelo Telegram.&lt;/p&gt;

&lt;h3 id=&quot;divisão-de-tarefas&quot;&gt;Divisão de tarefas&lt;/h3&gt;

&lt;p&gt;Com a falha de comunicação mais clara, com a troca entre ferramentas de comunicação causando alguns colegas a se perderem no que estava sendo organizado e com o eventual ruído causado por um grupo muito grande onde poucos estavam de fato trabalhando. Surgiu a ideia de adotar uma nova forma de organização: Um núcleo central chamado de core e focado em desenrolar as pendências e um time satélite de voluntários com níveis mais leves de comprometimento. Todas pessoas que formaram a organização do evento concordaram em seguir o que chamamos de &lt;a href=&quot;https://docs.google.com/document/d/1M_dbBJEvmksjZl02e3rgofi0XzWtH3zu1wu5NVa18Bw/edit?usp=sharing&quot;&gt;Guia de Contribuição da Organização&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;o-core&quot;&gt;O core&lt;/h3&gt;
&lt;p&gt;Com o levantamento das pessoas que estavam mais ativas no fim de Janeiro/começo de Fevereiro por meio de um formulário, identificamos entre nós mesmos um grupo de aproximadamente 12 pessoas que deveriam ser parte do time core, dessas 8 demonstraram interesse em se comprometer de acordo com o descrito nos deveres do Core no Guia de Contribuição da Organização. Mais tarde esse time de 8 seria incrementado com a participação de mais um.&lt;/p&gt;

&lt;h3 id=&quot;o-voluntariado&quot;&gt;O voluntariado&lt;/h3&gt;

&lt;p&gt;O grupo final de voluntários contou com 25 pessoas, das quais 22 estavam entre voluntários iniciais, e 9 dessas parte do Core, enquanto 3 pessoas foram adições tardias e valiosas para o andamento do evento.&lt;/p&gt;

&lt;h3 id=&quot;resultado-da-reorganização&quot;&gt;Resultado da reorganização&lt;/h3&gt;

&lt;p&gt;Na prática, após essa divisão o Core se reorganizou para suprir as necessidades daquelas equipes iniciais, que passaram a ser organicamente as seguintes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Local: Samuca, Renne, Danilo&lt;/li&gt;
  &lt;li&gt;Mídias: Jessica, Serrones, Rafael Henrique&lt;/li&gt;
  &lt;li&gt;Patrocínio: Renne, Carlos&lt;/li&gt;
  &lt;li&gt;CdC: Jessica, João&lt;/li&gt;
  &lt;li&gt;Orçamentos: João, Juan&lt;/li&gt;
  &lt;li&gt;Inscrições/Ingressos: Renne, Jessica e Samuca&lt;/li&gt;
  &lt;li&gt;Conteúdo, Trilhas, Keynotes, Call4papers: Rafael Henrique e Danilo&lt;/li&gt;
  &lt;li&gt;Brindes, Canecas, Camisetas: João, Juan e Carlos&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;palestras-e-tutoriais&quot;&gt;Palestras e tutoriais&lt;/h1&gt;

&lt;h2 id=&quot;chamada-para-palestras&quot;&gt;Chamada para palestras&lt;/h2&gt;

&lt;p&gt;No dia 24 de Janeiro &lt;a href=&quot;https://docs.google.com/document/d/1M_dbBJEvmksjZl02e3rgofi0XzWtH3zu1wu5NVa18Bw/edit?usp=sharing&quot;&gt;abrimos a chamada para palestrantes&lt;/a&gt; que deveriam submeter suas palestras de forma anônima pela plataforma Speakerfight, onde tivemos &lt;a href=&quot;https://speakerfight.com/events/python-sudeste-2018-palestras/&quot;&gt;50 palestras submetidas&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;chamada-para-tutoriais&quot;&gt;Chamada para tutoriais&lt;/h2&gt;

&lt;p&gt;Eventualmente, abrimos também a chamada para tutoriais na mesma plataforma e tivemos &lt;a href=&quot;https://speakerfight.com/events/python-sudeste-2018-tutoriais/&quot;&gt;9 submissões&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;keynotes&quot;&gt;Keynotes&lt;/h2&gt;

&lt;p&gt;Para a escolha de keynotes, todo o grupo reuniu uma lista de 24 pessoas que gostaríamos de convidar. Essa lista foi reduzida para 12 mediante votação em uma das nossas reuniões de onde saiu o primeiro nome e os demais convidados para keynotes foram escolhidos dentre esses por votação assíncrona via google forms.&lt;/p&gt;

&lt;p&gt;Resultado final:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Paula Grangeiro&lt;/li&gt;
  &lt;li&gt;Cássio Botaro&lt;/li&gt;
  &lt;li&gt;Bernardo Fontes&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;divulgação-e-artes&quot;&gt;Divulgação e artes&lt;/h1&gt;

&lt;p&gt;Basicamente a divulgação dos acontecimentos do evento foram feitas nas redes sociais Facebook, Twitter e Instagram com a ajuda da plataforma de postagem automática &lt;a href=&quot;http://hootsuite.com/&quot;&gt;Hootsuite&lt;/a&gt; que na sua conta gratuita permite o agendamento de 30 postagens ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;Todas as artes foram feitas também numa plataforma gratuita chamada &lt;a href=&quot;https://www.canva.com/pt_br/&quot;&gt;Canva&lt;/a&gt;. Para facilitar o trabalho nessa frente foi criada uma &lt;a href=&quot;https://docs.google.com/spreadsheets/d/14Xqv2W_aJjTWOn8EXi85_IqIG1rj_1jD5-X2uYVIDFI/edit?usp=sharing&quot;&gt;agenda de postagens&lt;/a&gt; e um grupo apelidado de “XOXO media” no telegram.&lt;/p&gt;

&lt;h1 id=&quot;ingressos&quot;&gt;Ingressos&lt;/h1&gt;

&lt;p&gt;Os ingressos foram vendidos pela plataforma EventBrite e foram organizados da seguinte forma:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Lote 1 (promocional) Ada Lovelace: 58 ingressos à R$ 45,00&lt;/li&gt;
  &lt;li&gt;Lote 2 Grace Hopper: 85 ingressos à R$ 60,00&lt;/li&gt;
  &lt;li&gt;Lote 3 (último) Dorothy Vaughan: 13 ingressos à R$ 75,00&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ainda tínhamos mais dois lotes escondidos:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Lote Patrocinadores: 23 ingressos cortesia com acesso mediante código&lt;/li&gt;
  &lt;li&gt;Lote Organizadores: 31 ingressos à R$ 60,00&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O primeiro anúncio das vendas dos ingressos se deu pela manhã do dia 2 de Março nas redes sociais do evento. O primeiro lote acabou tão rápido que &lt;a href=&quot;https://drive.google.com/file/d/1dJtZhCTBJPXnfr9xDyuJWipSjzNzIcaa/view?usp=sharing&quot;&gt;arte deste lote nem conseguiu&lt;/a&gt;  ir ao ar e já na hora do almoço fui anunciada o &lt;a href=&quot;https://twitter.com/python_sudeste/status/969590730086895616&quot;&gt;início das vendas do lote Grace Hopper&lt;/a&gt;. O último lote só foi &lt;a href=&quot;https://twitter.com/python_sudeste/status/970798676045127682&quot;&gt;anunciado seu início no dia 5 de março&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ainda tivemos o seguinte problema: muito daqueles que enviaram propostas de palestras e tiveram suas palestras aprovadas, não conseguiram comprar seus ingressos, e assim completamos o que faltou com um outro lote escondido para os palestrantes.&lt;/p&gt;

&lt;p&gt;Com o contrato do evento a taxa de serviço da plataforma ficou em 8% (a taxa não foi repassada aos participantes) e as vendas de ingresso somaram o valor de R$ 11.523,00.&lt;/p&gt;

&lt;h1 id=&quot;patrocínios&quot;&gt;Patrocínios&lt;/h1&gt;

&lt;p&gt;Patrocínio é uma etapa muito importante antes do evento, é por meio deles que vamos definir que tarefas vamos vamos fazer com certeza e quais das vontades teremos que deixar de lado.&lt;/p&gt;

&lt;p&gt;Tivemos seis cotas de patrocínio:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Diamante&lt;/li&gt;
  &lt;li&gt;Platina&lt;/li&gt;
  &lt;li&gt;Ouro&lt;/li&gt;
  &lt;li&gt;Prata&lt;/li&gt;
  &lt;li&gt;Bronze&lt;/li&gt;
  &lt;li&gt;Believer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada cota está descrita na nossa &lt;a href=&quot;https://docs.google.com/document/d/e/2PACX-1vRkrOYXvf8NFmR3Kz1ThLJs761yUUYh0vKAlCyKf7mx1cKPgJ9C4q7gcprVRjle8z22v-PgDggb_tDm/pub&quot;&gt;carta de patrocínio&lt;/a&gt; e mais do que isso ainda disponibilizamos contatos de três pessoas da organização além do e-mail do evento.&lt;/p&gt;

&lt;p&gt;Nem todos os patrocinadores apoiaram o evento com valores monetários, a IdWall em conjunto com a BandTec se responsabilizaram pelo valor referente ao aluguel do local por exemplo, assim essa verba nunca entrou no nosso fluxo de caixa.&lt;/p&gt;

&lt;h2 id=&quot;caso-microsoft&quot;&gt;Caso Microsoft&lt;/h2&gt;

&lt;p&gt;Sobre o Termo de condições, que é exigido na primeira etapa de cadastro do sistema de pagamentos da Microsoft, nos deparamos com a cláusula 20.a e 20.b que faz referência a seguros:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;20. Seguro.&lt;/em&gt;
&lt;em&gt;a. O Fornecedor manterá as seguintes apólices de seguro e limites mínimos (ou limites equivalentes na moeda local aplicável): (i) limites de responsabilidade civil de US$ 1.000.000 (um milhão de dólares) por ocorrência para danos pessoais e/ou à propriedade (incluindo Seguro de Veículo), (ii) Responsabilidade do Empregador, com limites mínimos de US$ 500.000 por ocorrência e (iii) limites legais para qualquer requerimento judicial ou extrajudicial nos termos de qualquer Lei Americana sobre Doenças Ocupacionais ou Remuneração do Trabalhador aplicável ou outras leis ou regulamentos semelhantes que sejam aplicáveis a atos do Fornecedor e/ou de seus representantes, funcionários ou subcontratados segundo esta Ordem de Compra.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;b. Se a cláusula sobre Mercadorias e Serviços desta Ordem de Compra der origem a responsabilidade Profissional/responsabilidade por erros e omissões, o Fornecedor, por sua conta, manterá uma cobertura de seguro para essa responsabilidade, com limites de, no mínimo, US$ 2.000.000 para cada requerimento judicial ou extrajudicial, ou os limites equivalentes na moeda local aplicável. O seguro incluirá cobertura por violação de direitos de propriedade de terceiros (por exemplo, direito autoral e marca comercial) se essa cobertura estiver disponível de forma comercialmente razoável. O Fornecedor manterá a cobertura da apólice ativa ou um período de relatório estendido, fornecendo uma cobertura para os requerimentos judiciais ou extrajudiciais apresentados e relatados à empresa de seguro em até 12 (doze) meses após o término ou a rescisão desta Ordem de Compra.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Essas cláusulas impossibilitaram que a organização do evento se sentisse confortável para assinar o contrato de patrocínio encerrando assim as conversas com a Microsoft.&lt;/p&gt;

&lt;h2 id=&quot;caso-scielo&quot;&gt;Caso SciELO&lt;/h2&gt;

&lt;p&gt;Apesar do interesse em patrocinar o evento não foi possível finalizar esse patrocínio de forma bem sucedida, a SciELO precisava que o &lt;a href=&quot;https://drive.google.com/file/d/1EBhR0W_ENzuDt2YrCP3J6yddcTx2Qhiw/view&quot;&gt;descritivo na nota emitida&lt;/a&gt; fosse “Patrocínio do Programa SciELO ao evento Python Sudeste, realizado na cidade de sp entre os dias 30 de março de 2018 e 01 de abril de 2018” no lugar de treinamento conforme estava. Como o sistema de emissão da NF-e não permite a edição do campo do descritivo (que já vem com opções pré-definidas) tivemos que cancelar esse patrocínio.&lt;/p&gt;

&lt;h2 id=&quot;caso-olist-e-iclinic&quot;&gt;Caso Olist e iClinic&lt;/h2&gt;

&lt;p&gt;Ambas empresas já tinham fechado orçamento de patrocínio no fim do ano anterior. Para o evento acontecer em março/abril e essas empresas conseguirem incluir o evento no orçamento, seria legal já ter as cartas enviadas por volta de outubro/novembro.&lt;/p&gt;

&lt;h2 id=&quot;caso-cota-believer&quot;&gt;Caso Cota Believer&lt;/h2&gt;

&lt;p&gt;Nossa ideia com essa cota era abarcar tanto empresas menores (com um caixa mais restrito) quanto pessoas físicas que quisessem ajudar o evento pagando mais que apenas seu ingresso. Ficou claro que se misturar PF e PJ não foi uma decisão sábia. Por exemplo, o pessoal da empresa Hub9 tinha caixa para essa cota, mas ficou com medo de que ela fosse algo apenas para freelancers.&lt;/p&gt;

&lt;h1 id=&quot;código-de-conduta&quot;&gt;Código de Conduta&lt;/h1&gt;

&lt;p&gt;A equipe do CdC teve dois momentos principais:&lt;/p&gt;

&lt;p&gt;Pré-evento para a &lt;a href=&quot;https://github.com/pythonsudeste/codigo-de-conduta&quot;&gt;tradução do CdC para inglês&lt;/a&gt;;
Durante o evento para disponibilidade de atuação em casos de ferimento do Código.&lt;/p&gt;

&lt;p&gt;Na abertura do evento o código de conduta de foi lido em sua integridade e o time de resposta apresentado:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Jessica Temporal&lt;/li&gt;
  &lt;li&gt;Paty Morimoto&lt;/li&gt;
  &lt;li&gt;João Lugão&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Durante o evento o time de resposta esteve disponível o tempo todo tanto para atuar como coringas no caso da falta de alguém da organização, quanto para atender possíveis casos de quebra do CdC. Essa foi a primeira Python Sudeste com uma equipe de resposta. Não houve casos de atuação da equipe.&lt;/p&gt;

&lt;h1 id=&quot;durante-o-evento&quot;&gt;Durante o evento&lt;/h1&gt;

&lt;h2 id=&quot;grupos-de-trabalho&quot;&gt;Grupos de trabalho&lt;/h2&gt;

&lt;p&gt;Nossa equipe de voluntários foi dividida para termos sempre alguém nas salas para dar suporte a palestrantes e ministradores de tutoriais e além disso, permitir um revezamento de pessoas para que todos pudessem descansar e/ou visitar outras palestras durante o evento. Sendo assim cada sala e/ou trabalho que a equipe estava responsável ficou conhecida como Missão. Como descrito na tabela a seguir:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Nome&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Missão&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Bruna Balthazar&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;ADA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Ciro&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;ADA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Eduardo Mendes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;ADA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Jessica Temporal&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;CDC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;João Lugão&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;CDC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Patricia&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;CDC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Juan Funez&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Coringa&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Samuka&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Coringa&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Beatriz&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Credenciamento&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Danilo Bellini&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Credenciamento&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Renne Rocha&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Credenciamento&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Gutem&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Credenciamento&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Erika Campos&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;DOROTHY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Fábio Serrão&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;DOROTHY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Yros Aguiar&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;DOROTHY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Alini&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;GRACE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Bruno Rocha&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;GRACE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Andre Pastore&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;GRACE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Carlos&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;GRACE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Marcio Mendonça&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Tutoriais - KATHERINE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Rafael Henrique&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Tutoriais - KATHERINE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Guto Maia&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Tutoriais - MARY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Juliano Atanazio&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Tutoriais - MARY&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;E mais detalhadamente essas eram as descrições das missões repassadas ao corpo de voluntários:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ADA, DOROTHY e GRACE:&lt;/strong&gt; são as salas/trilhas de palestra, cada grupo de três pessoas deve se organizar para revezar para banheiros, assistir outras palestras, apresentar os palestrantes, encerrar as palestras e abrir para perguntas;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CDC:&lt;/strong&gt; São as pessoas que vão cuidar das quebras de conduta e afins, devem estar livre para perambular pelas salas;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coringas:&lt;/strong&gt; Vão ser responsáveis por resolver as tretas se fazer os corres de última hora, além de ajudar a distribuir os lanches nos coffees;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credenciamento:&lt;/strong&gt; Devemos ter credenciamento todos os dias a partir das 8 am, e ajudar durante a distribuição dos lanches nos coffees;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tutoriais:&lt;/strong&gt; Como os tutoriais muitas vezes fluem sozinhos, é só garantir que os tutores estão bem assistidos com as tecnologias (tomadas, adaptadores e afins) e se revezar.&lt;/p&gt;

&lt;h1 id=&quot;controle-financeiro&quot;&gt;Controle Financeiro&lt;/h1&gt;

&lt;p&gt;Depois da entrada do primeiro patrocínio, sentimos a necessidade de usar algo mais prático para fazer o controle financeiro, então assinamos uma conta no Mobills que se mostrou muito vantajoso. Foi a partir dessa conta que exportamos to nosso fluxo de caixa. Uma versão mais amigável do fluxo está &lt;a href=&quot;https://docs.google.com/spreadsheets/d/12dP-joTUpik9_SXLFn8pTHww5WFsi3UJr00YLWDOlo8/edit?usp=sharing&quot;&gt;disponível neste link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mas em linhas gerais:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;O evento se moveu principalmente com o pagamento de fornecedores do bolso dos organizadores, o que não é saudável para nenhum evento;&lt;/li&gt;
  &lt;li&gt;O primeiro influxo de caixa veio da Python Software Foundation, no valor exato de R$ 10899,46;&lt;/li&gt;
  &lt;li&gt;A última receita foi proveniente do Patrocinador Diamante Dielbold Nixdorf no valor de R$ 13.000,00;&lt;/li&gt;
  &lt;li&gt;O evento terminou com um saldo positivo de mais de 12 mil reais;&lt;/li&gt;
  &lt;li&gt;Deste saldo, a seguinte divisão será feita:
    &lt;ul&gt;
      &lt;li&gt;40% para PySE2018 no ES;&lt;/li&gt;
      &lt;li&gt;30% para PyLadiesConf;&lt;/li&gt;
      &lt;li&gt;30% para FlaskConf.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O saldo positivo foi retirado da conta da APyB e está em minha posse e eu ficarei responsável de fazer os repasses para as organizações dos eventos acima.&lt;/p&gt;

&lt;h1 id=&quot;após-o-evento&quot;&gt;Após o evento&lt;/h1&gt;

&lt;h2 id=&quot;doações&quot;&gt;Doações&lt;/h2&gt;

&lt;p&gt;Parte da compra de kits e lanches sobraram e foram doadas para a Instituição Casa das Mães por intermédio do Samuca. Você que tá lendo pode ver os vídeos desse dia &lt;a href=&quot;https://drive.google.com/drive/folders/1jeWvKwGpmhjXqwmei14uyp8frXwEyls2?usp=sharing&quot;&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;certificados&quot;&gt;Certificados&lt;/h2&gt;

&lt;p&gt;Os certificados foram emitidos e um validador foi construído e está disponibilizado no site deste ano graças ao Danilo Belini (&lt;a href=&quot;https://github.com/pythonsudeste/pythonsudeste2018-site/pull/83&quot;&gt;PR #83&lt;/a&gt;).&lt;/p&gt;

&lt;h2 id=&quot;fotos&quot;&gt;Fotos&lt;/h2&gt;

&lt;p&gt;Nós pedimos ao querido Julio Melanda para fazer os cliques do evento e todas as fotos estão disponíveis aqui &lt;a href=&quot;https://drive.google.com/drive/folders/1m3tJY0JKspvS4vK30216kr9vHfge3kfE?usp=sharing&quot;&gt;nesse link&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;fechamento-do-caixa&quot;&gt;Fechamento do caixa&lt;/h2&gt;

&lt;p&gt;Foi feito por mim e o pessoal da APyB nesta semana com o objetivo de fazer o repasse da verba para os eventos Flask Conf BR, Python Sudeste 2018 e PyLadies Conf BR.&lt;/p&gt;

&lt;h2 id=&quot;escrita-do-post-mortem&quot;&gt;Escrita do post mortem&lt;/h2&gt;

&lt;p&gt;Comecei a escrever esse post mortem logo no fim do evento. Porém como a vida tem dessas ele foi deixado de lado por algum tempo até que agora consegui finalmente terminá-lo. Ele contém basicamente uma narrativa dos fatos de acordo com a minha memória e vivência dos mesmos.&lt;/p&gt;

&lt;h1 id=&quot;conclusões&quot;&gt;Conclusões&lt;/h1&gt;

&lt;p&gt;A conclusão final do evento é a de que: &lt;strong&gt;Pessoas &amp;gt; Tecnologia&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Python Sudeste só aconteceu pois todos envolvidos estavam dispostos a doar seu tempo, paciência e vontade para o evento. A estrada até a conclusão foi cheia de obstáculos mas foi vencida em equipe. Então a dica para quem lê são as seguintes:&lt;/p&gt;

&lt;p&gt;O mais importante feito é fechar um local para o evento e enquanto não houver um combinado por escrito assinado por ambas partes, o local não está garantido. Ainda assim, com contrato fechado pode acontecer de o local dar errado, mas é mais difícil.&lt;/p&gt;

&lt;p&gt;É de suma importância ler com calma os contratos e questionar os pontos de dúvida, as letras miúdas podem trazer prejuízo aqueles organizando os eventos.&lt;/p&gt;

&lt;p&gt;É importante ter uma rede de apoio: o time menor para execução é mais bem sucedido pois é mais fácil controlar quem faz o que e o andamento das coisas, no entanto um evento no porte da Python Sudeste e semelhantes deve contar com pessoas que vão participar em pontos chaves como voluntários, seja no dia do evento ajudando a montar o local ou fazendo a ponte entre mais um patrocinador e a organização.&lt;/p&gt;

&lt;p&gt;Durante os meses de organização é comum as pessoas envolvidas terem suas prioridades alteradas, mas com transparência tudo pode desenrolar bem.&lt;/p&gt;

&lt;p&gt;Gostaria de deixar um agradecimento especial aqui aos nossos patrocinadores, que acreditaram na gente para fazer o evento acontecer. Aos nossos colegas da APyB pelo apoio com burocracias. A todos palestrantes que aceitaram compartilhar conhecimento. A todos participantes que toparam se divertir e aprender. E principalmente a todos os voluntários que dormiram pouco todos os dias de evento e se desdobraram para fazer acontecer com um sorriso no rosto.&lt;/p&gt;

&lt;p&gt;E no fim, mesmo com muita coisa errada no começo, provamos que tudo pode dar muito certo.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Abraços,&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jessica Temporal&lt;/strong&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 24 Aug 2018 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/post-mortem-pyse-2018/</link>
        <guid isPermaLink="true">https://jtemporal.com/post-mortem-pyse-2018/</guid>
        
        <category>python</category>
        
        <category>comunidade</category>
        
        <category>post mortem</category>
        
        <category>python sudeste</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Pegando o começo de uma string com Go ou Python</title>
        <description>&lt;p&gt;A colinha de hoje mostra como pegar o começo de uma string tanto em Go como em Python sem usar expressões regulares 🎉&lt;/p&gt;

&lt;p&gt;Vamos supor que você tem a seguinte string: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;Gopher&quot;&lt;/code&gt; e você quer saber se ela começa com &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;Go&quot;&lt;/code&gt; e também se começa com &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;C&quot;&lt;/code&gt;. Em Go:&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;strings&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HasPrefix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Gopher&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Go&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HasPrefix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Gopher&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;C&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;e em Python:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Gopher&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;startswith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Go&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Gopher&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;startswith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Os dois exemplos vão printar “true” para a primeira e “false” para segunda em ambas linguagens.&lt;/p&gt;

&lt;p&gt;Curiosamente, se você quiser saber se a sua string começa com &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;&quot;&lt;/code&gt; (string vazia) ambas linguagens vão retornar “true” também.&lt;/p&gt;

&lt;p&gt;Em go:&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;strings&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HasPrefix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Gopher&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Em Python:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Gopher&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;startswith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Importante saber disso para evitar ou cair propositalmente em casos de borda.&lt;/p&gt;

&lt;p&gt;Massa né? Partiu aprender outras linguagens  😜&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#str.startswith&quot;&gt;Python str.startswith&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://golang.org/pkg/strings/#HasPrefix&quot;&gt;Go strings.HasPrefix&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/golang/go/blob/4102e6ff56eee8fd6a1689f4bcf9d5a92cc44a6c/src/strings/strings.go#L450&quot;&gt;Implementação do strings.HasPrefix&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gopher.pro.br/post/hangout-hasprefix/&quot;&gt;Se quiser ver o Cesar explicando tudo isso em vídeo dá uma olhada nesse post do grupo de estudos de Go&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;agradecimentos&quot;&gt;Agradecimentos&lt;/h2&gt;

&lt;p&gt;Principalmente ao Cesar que pacientemente tem me ensinado Go.&lt;/p&gt;
</description>
        <pubDate>Wed, 16 May 2018 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/strings-go-py/</link>
        <guid isPermaLink="true">https://jtemporal.com/strings-go-py/</guid>
        
        <category>colinha</category>
        
        <category>go</category>
        
        <category>gophers</category>
        
        <category>golang</category>
        
        <category>strings</category>
        
        <category>string</category>
        
        <category>python</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Instalando VPN no Windows</title>
        <description>&lt;p&gt;Além de mascarar IPs, a VPN tem me servido para resolver um bloqueio causado pela minha provedora de internet nova. No caso a porta 22 (porta utilizada pelo protocolo SSH para comunicação) está bloqueada, então ao rotear meu tráfego por um servidor diferente, esse impedimento some.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo sobre isso e aprender a configurar a VPN no Windows clica aqui nesse botão 👇&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/test-after-deploy/instalando-vpn-no-windows-f219016d7886&quot;&gt;&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; alt=&quot;clique aqui para ler&quot; style=&quot;display: block; margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 11 May 2018 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/vpn-no-windows/</link>
        <guid isPermaLink="true">https://jtemporal.com/vpn-no-windows/</guid>
        
        <category>tutorial</category>
        
        <category>web</category>
        
        <category>vpn</category>
        
        <category>ssh</category>
        
        <category>windows</category>
        
        <category>windows 10</category>
        
        <category>proton vpn</category>
        
        <category>protonvpn</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Ubuntu no Windows</title>
        <description>&lt;p&gt;Ultimamente eu tenho precisado testar alguns softwares que desenvolvemos na &lt;a href=&quot;https://nuveo.ai&quot;&gt;Nuveo&lt;/a&gt; no Windows e pra agilizar o desenvolvimento (pelo menos em partes) decidi que ter um bash à mão seria útil. No Windows 10 fazer isso é relativamente fácil e vou ensinar como aqui nesse post. Bora lá.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo sobre isso e aprender a usar o Ubuntu (e outras distribuições Linux) no Windows clica aqui nesse botão 👇&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/test-after-deploy/ubuntu-no-windows-d71c53ebe402&quot;&gt;&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; alt=&quot;clique aqui para ler&quot; style=&quot;display: block; margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Fri, 11 May 2018 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/ubuntu-no-windows/</link>
        <guid isPermaLink="true">https://jtemporal.com/ubuntu-no-windows/</guid>
        
        <category>tutorial</category>
        
        <category>windows</category>
        
        <category>windows 10</category>
        
        <category>ubuntu</category>
        
        <category>linux</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Usando o chaves SSH no Windows</title>
        <description>&lt;p&gt;Depois de ativar o Ubuntu no Windows qual o próximo passo? Definitivamente configurar o Git!&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo sobre isso e aprender a configurar as chaves SSH no Windows clica aqui nesse botão 👇&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/test-after-deploy/usando-o-chaves-ssh-no-windows-fa459ee42079&quot;&gt;&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; alt=&quot;clique aqui para ler&quot; style=&quot;display: block; margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 11 May 2018 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/ssh-no-windows/</link>
        <guid isPermaLink="true">https://jtemporal.com/ssh-no-windows/</guid>
        
        <category>tutorial</category>
        
        <category>web</category>
        
        <category>ssh</category>
        
        <category>windows</category>
        
        <category>windows 10</category>
        
        <category>git</category>
        
        <category>github</category>
        
        <category>chaves</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Instalando Go no Windows</title>
        <description>&lt;p&gt;Pra galera que assim como eu precisa escrever e testar código Go no Windows, vou mostrar o passo-a-passo de como instalar o Go na sua máquina. Prometo que não vai nem doer!&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo sobre isso e aprender a instalar e configurar o Go no Windows clica aqui nesse botão 👇&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/test-after-deploy/instalando-go-no-windows-7abed1db7546&quot;&gt;&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; alt=&quot;clique aqui para ler&quot; style=&quot;display: block; margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 11 May 2018 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/instalando-go-windows/</link>
        <guid isPermaLink="true">https://jtemporal.com/instalando-go-windows/</guid>
        
        <category>tutorial</category>
        
        <category>windows</category>
        
        <category>windows 10</category>
        
        <category>go</category>
        
        <category>golang</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Deploying an API to Heroku</title>
        <description>&lt;p&gt;Deploys, where do they live? What do they eat? If you want to learn how to deploy something to Heroku you came to the right place!&lt;/p&gt;

&lt;h2 id=&quot;what-you-will-learn-in-this-tutorial&quot;&gt;What you will learn in this tutorial&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;How to create a Flask application to run on Heroku&lt;/li&gt;
  &lt;li&gt;How to deploy said app&lt;/li&gt;
  &lt;li&gt;A little bit of Git&lt;/li&gt;
  &lt;li&gt;A little bit of API consumption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Warnings:&lt;/strong&gt; Of the two posts I used as a base to write this one, one of them was very outdated and the other, although recent, did not have instructions that correspond to the most recent version of Heroku, they are in the links section in case you want to read them.&lt;/p&gt;

&lt;h2 id=&quot;heroku-who&quot;&gt;Heroku who?&lt;/h2&gt;

&lt;p&gt;If you’ve made it this far, you probably already know what Heroku is, but for those who don’t know it, &lt;a href=&quot;https://www.heroku.com&quot;&gt;Heroku&lt;/a&gt; is a cloud platform that gives people “the fastest way to go from idea to URL” and without having headaches with the infrastructure part.&lt;/p&gt;

&lt;p&gt;This platform provides a service that, based on a predefined structure of an application, manages to package that application and put it to run on a server in one of their data centers. Heroku accepts applications written in several languages, but today we are going to use Python.&lt;/p&gt;

&lt;div style=&quot;width:100%;height:0;padding-bottom:80%;position:relative;&quot;&gt;&lt;iframe src=&quot;https://giphy.com/embed/UZQQ0yZtq5Ihq&quot; width=&quot;100%&quot; height=&quot;100%&quot; style=&quot;position:absolute&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;

&lt;h2 id=&quot;lets-code&quot;&gt;Let’s code!&lt;/h2&gt;

&lt;p&gt;For this tutorial I made an API with the Python microframework called &lt;a href=&quot;https://flask.palletsprojects.com/en/1.1.x/&quot;&gt;Flask&lt;/a&gt;. I won’t get into the details on how Flask works, but you can refer to the oficial documentation or look for one of the many tutorials available out there.&lt;/p&gt;

&lt;h3 id=&quot;our-api&quot;&gt;Our API&lt;/h3&gt;

&lt;p&gt;The API will only have one endpoint defined by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/&lt;/code&gt; route. This endpoint can give two responses depending on the request you make. They are as follows:&lt;/p&gt;

&lt;hr /&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Request&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Response&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;GET without extra headers&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Don’t panic!&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;GET with Authorization 42&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;the answer to life, the universe and everything&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;p&gt;The code to do this is short and straight forward, take a look:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Flask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;jsonify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;


&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Flask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;nd&quot;&gt;@app.route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;dont_panic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;jsonify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;The answer to life the universe and everything&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;jsonify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Don&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;t panic!&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;__main__&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;port&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;environ&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;PORT&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0.0.0.0&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This code lives inside a file called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dont_panic.py&lt;/code&gt; in my project codebase, but you can name it as you see fit. In addition, this code has a peculiarity: &lt;em&gt;the last three lines&lt;/em&gt;, they are the configuration used when the Flask server is running on Heroku.&lt;/p&gt;

&lt;h3 id=&quot;pipfile&quot;&gt;Pipfile&lt;/h3&gt;

&lt;p&gt;I mentioned at the beginning of this post that the base posts I used were somewhat outdated? Well, nowadays Heroku requires a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pipfile&lt;/code&gt; to prepare the environment in which our application will run. Pipfile will serve to install the Python libraries needed to run our application. And if like me, you don’t like using &lt;a href=&quot;https://docs.pipenv.org/&quot;&gt;Pipenv&lt;/a&gt; you can create the file by hand, as I created mine below:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;pi&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]]&lt;/span&gt;

&lt;span class=&quot;s&quot;&gt;url = &quot;https://pypi.python.org/simple&quot;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;verify_ssl = &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;


&lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;packages&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;s&quot;&gt;Flask = &quot;*&quot;&lt;/span&gt;

&lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;requires&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;s&quot;&gt;python_version = &quot;3.6&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For the development enviroment, I like to use the &lt;a href=&quot;https://jtemporal.com/requirements-txt-en/&quot;&gt;good old &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirements.txt&lt;/code&gt;&lt;/a&gt; which looks like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;click == 6.7
Flask == 0.12.2
itsdangerous == 0.24
Jinja2 == 2.10
MarkupSafe == 1.0
Werkzeug == 0.14.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;procfile&quot;&gt;Procfile&lt;/h3&gt;

&lt;p&gt;To run the API locally the command is as follows:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;FLASK_APP=dont_panic.py flask run
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you won’t be inside the Heroku environment to input the command yourself to get your API up and running, you’ll need some sort of configuration to tell Heroku how to run your application. The file that holds the command that runs your app is called Procfile.&lt;/p&gt;

&lt;p&gt;One important detail is that this file does &lt;strong&gt;not&lt;/strong&gt; have an extension, depending on your operational system and your text editor, you need to be careful when saving this file to avoid some extention like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.txt&lt;/code&gt; from appearing. Saving this file with an extention &lt;strong&gt;will cause a failure in your deployment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For this application, Procfile will have only one line, which is the following:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;web: python dont_panic.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Okay, now what else?&lt;/p&gt;

&lt;h2 id=&quot;versioning&quot;&gt;Versioning&lt;/h2&gt;

&lt;p&gt;Since Heroku works with the Git versioning system, regardless of whether you host the code on GitHub or not, you’ll need to define a code versioning history.&lt;/p&gt;

&lt;p&gt;So, after creating all these files, you need to add all of that to your Git tree. If you’re not a big fan of Git, you can do the following:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git init
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git add &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;creating the application&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This commands above will gather all files in the same commit, this is not a good practice and if you are interested in good practices and learning more about Git, there will extra links for that in the links session at the end of the post.&lt;/p&gt;

&lt;h2 id=&quot;3-2-1-deploy-o&quot;&gt;3, 2, 1… Deploy \o/&lt;/h2&gt;

&lt;p&gt;Now you have a choice: there are a few ways to send your code to Heroku. You can connect with GitHub or Dropbox or use the Heroku CLI. In this post I’ll will show you how to do it using the Heroku command line.&lt;/p&gt;

&lt;p&gt;First of all you need to &lt;a href=&quot;https://devcenter.heroku.com/articles/heroku-cli#download-and-install&quot;&gt;install Heroku CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;logging-in&quot;&gt;Logging in&lt;/h3&gt;

&lt;p&gt;After installing the CLI, you’ll need to login to your account&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;heroku login
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This command will ask you to enter your Heroku account email and password:&lt;/p&gt;

&lt;center&gt;
&lt;img alt=&quot;login heroku&quot; src=&quot;https://i.imgur.com/QEooPqg.jpg&quot; /&gt;
&lt;br /&gt;
&lt;i&gt;Heroku CLI login screen&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; I used the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-i&lt;/code&gt; here because I’m running on a remote server, this will request user and password on the terminal instead of openning up a browser for the login&lt;/p&gt;

&lt;p&gt;Next you need to create an app within Heroku to upload your code to.&lt;/p&gt;

&lt;h3 id=&quot;creating-an-application&quot;&gt;Creating an application&lt;/h3&gt;

&lt;h4 id=&quot;using-the-interface&quot;&gt;Using the interface&lt;/h4&gt;

&lt;p&gt;It is possible to create an application through the &lt;a href=&quot;https://dashboard.heroku.com/new-app&quot;&gt;website interface&lt;/a&gt;, where you will see the following screen:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/AyJqSmC.png&quot; alt=&quot;app creation screen on heroku website&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You just need to input an unique name and then click the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Create app&lt;/code&gt; button, that will take you directly to the deploy tab of the app especific page. I created the app called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dontpanicapi&lt;/code&gt;, and if you scroll down you’ll see steps to upload and deploy your app:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/8PCzkHX.jpg&quot; alt=&quot;deploy using heroku git section image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As you can see the last command displays the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remote&lt;/code&gt; we need to add to our repo, and basically you just have to run it, and you’ll be able to publish the code:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;heroku git:remote -a dontpanicapi
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The output for the command above show be something like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/UApLTDr.jpg&quot; alt=&quot;adding Heroku remote&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;using-the-terminal&quot;&gt;Using the terminal&lt;/h4&gt;

&lt;p&gt;But we can also create the application using the Heroku CLI. The good thing about using the CLI is that when creating the application, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remote&lt;/code&gt; is created automatically:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;heroku apps:create dontpanicapi
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And that should output something like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/FLlhj90.jpg&quot; alt=&quot;creating an app named using heroku cli&quot; /&gt;&lt;/p&gt;

&lt;p&gt;One important thing here is that the name you choose for your application must be unique in Heroku, using the interface you’ll get imiate feedback whether the name you chose is available or not. This is important because the name of your application is used to create the Heroku subdomain. If you try to create an application with a name that is  already being used, you see an output to the command above like this this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/w2bKUn0.jpg&quot; alt=&quot;failed to create app using heroku cli&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you don’t care about the name of your application, you can run the following command:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;heroku create
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And it will create an app with a random name:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/lSdiAD0.jpg&quot; alt=&quot;creating an app using heroku cli&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After creating the application, you can take a peek &lt;a href=&quot;https://dashboard.heroku.com/apps&quot;&gt;at the Heroku dashboard in the applications area&lt;/a&gt; to see the list of your applications:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/TG03C9A.jpg&quot; alt=&quot;list of apps on heroku dashboard&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;and-finally-deploy-time&quot;&gt;And finally deploy time!&lt;/h3&gt;

&lt;p&gt;After committing everything, logging in and creating your application on Heroku it’s &lt;em&gt;deploy&lt;/em&gt; time!! 🎉🎉🎉&lt;/p&gt;

&lt;p&gt;Deploying here means sending the application code to the server and running the process to get our API up on the Heroku instance.&lt;/p&gt;

&lt;p&gt;Other contexts may bring variations and intermediate steps of the one I am presenting here, since as our application is simple and Heroku is made to help us get our applications up and running, the biggest job becomes the creation of the configuration files (which you know how to do now) 😉&lt;/p&gt;

&lt;p&gt;Then, the command that will actually send the code to the server is:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git push heroku master
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If command is successful you should see something like this outputed to the terminal:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/KLXcAhj.jpg&quot; alt=&quot;Terminal showing the successfull deployment&quot; /&gt;&lt;/p&gt;

&lt;p&gt;One last though, you may need to ensure that your application has at least one &lt;em&gt;dyno&lt;/em&gt; running with the following command:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;heroku ps: scale web = 1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;dynos&quot;&gt;Dynos&lt;/h3&gt;

&lt;div style=&quot;width:100%;height:0;padding-bottom:80%;position:relative;&quot;&gt;&lt;iframe src=&quot;https://giphy.com/embed/xTk9ZY0C9ZWM2NgmCA&quot; width=&quot;100%&quot; height=&quot;100%&quot; style=&quot;position:absolute&quot; frameborder=&quot;0&quot; class=&quot;giphy-embed&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Now you maybe asking yourself, what is a &lt;em&gt;dyno&lt;/em&gt;? A &lt;em&gt;dyno&lt;/em&gt; is a Linux Container, Heroku uses a container model that isolates your application and allows for easy scalability of the system. In other, less technical words: Take all the code and configuration files we’ve written so far and put them in a box and put them to run, that is a &lt;em&gt;dyno&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Now to see if your API is actually working we can (in this case) open a browser and access &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://dontpanicapi.herokuapp.com/&lt;/code&gt; or use the command line to open app URL in the browser:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;heroku open
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If everything went well you will see something like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/YhkblPE.jpg&quot; alt=&quot;Get without authorization header in browser&quot; /&gt;&lt;/p&gt;

&lt;p&gt;What happened was the following: when accessing the URL of the application in Heroku, the browser does a GET request for API with the standard header, that is, without an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Authorization&lt;/code&gt; field.&lt;/p&gt;

&lt;p&gt;We could achieve the same result by running the following command on the terminal:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;curl -X GET -k -i &apos;https://dontpanicapi.herokuapp.com/&apos;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That gives me this result:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/fK6LERi.jpg&quot; alt=&quot;Get without authorization header on the terminal with cURL&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now as we know, this API of ours will have a different response if you pass the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Authorization&lt;/code&gt; header with the value of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;42&lt;/code&gt;, so let’s make the request:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;curl -X GET -k -H &apos;Authorization: 42&apos; \
    -i &apos;https://dontpanicapi.herokuapp.com/&apos;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And checking out the result:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/54vBZJy.jpg&quot; alt=&quot;Get with authorization header on the terminal with cURL&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Can you pass the authorization header on the browser? You totally can! But I’ll explain how to do this that in another post/tutorial that I promise to link here when finish writing.&lt;/p&gt;

&lt;h2 id=&quot;pro-tip-log-files&quot;&gt;Pro tip: Log files&lt;/h2&gt;

&lt;p&gt;Let’s say that you have made a mistake in the process of configuring your application and, when deploying, Heroku warns you that it was unsuccessful attempt. In this case the first place to look for information about what went wrong is the logs.&lt;/p&gt;

&lt;p&gt;A good system logs all actions performed. In this case, Heroku takes care of logging all the details for us, so let’s ask for the logs using the CLI. Here I still write the logs in a file to facilitate inspection, see:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;heroku logs &amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;out.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Examples of lines you will find in one of these logs:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;2021-02-15T00:56:46.708128+00:00 heroku[web.1]: Starting process with command `python dont_panic.py`
2021-02-15T00:56:50.825880+00:00 app[web.1]: * Serving Flask app &quot;dont_panic&quot; (lazy loading)
2021-02-15T00:56:50.825954+00:00 app[web.1]: * Environment: production
2021-02-15T00:56:50.826115+00:00 app[web.1]: WARNING: This is a development server. Do not use it in a production deployment.
2021-02-15T00:56:50.826237+00:00 app[web.1]: Use a production WSGI server instead.
2021-02-15T00:56:50.826326+00:00 app[web.1]: * Debug mode: off
2021-02-15T00:56:50.831184+00:00 app[web.1]: * Running on http://0.0.0.0:13487/ (Press CTRL+C to quit)
2021-02-15T00:56:51.000000+00:00 app[api]: Build succeeded
2021-02-15T00:56:51.851660+00:00 heroku[web.1]: State changed from starting to up
2021-02-15T00:58:45.102206+00:00 app[web.1]: 10.47.180.171 - - [15/Feb/2021 00:58:45] &quot;GET / HTTP/1.1&quot; 200 -
2021-02-15T00:58:45.103509+00:00 heroku[router]: at=info method=GET path=&quot;/&quot; host=dontpanicapi.herokuapp.com request_id=9df2f453-77e4-4b63-94
30-c88e0a27206b fwd=&quot;186.209.20.97&quot; dyno=web.1 connect=0ms service=7ms status=200 bytes=173 protocol=https
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now if someone says &lt;em&gt;“Deploy the API!”&lt;/em&gt; you already know how to do it 😉&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PS.: If you have questions or comments, leave them below or send me a message I promise to try to answer, the DMs that are always open&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/api-example-flask-heroku-en&quot;&gt;Code I used in this post is available here&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Post by Diego Garcia: &lt;a href=&quot;http://pythonclub.com.br/publicando-seu-hello-world-no-heroku.html&quot;&gt;Publishing your Hello World on Heroku&lt;/a&gt; in Portuguese&lt;/li&gt;
  &lt;li&gt;Text by John Kagga: &lt;a href=&quot;https://medium.com/@johnkagga/deploying-a-python-flask-app-to-heroku-41250bda27d0&quot;&gt;Deploying a Python Flask app on Heroku&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://pythonclub.com.br/what-the-flask-pt-1-introducao-ao-desenvolvimento-web-com-python.html&quot;&gt;What the Flask&lt;/a&gt; by Bruno Rocha in Portuguese&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://product.hubspot.com/blog/git-and-github-tutorial-for-beginners&quot;&gt;Git for beginners&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.stackoverflow.com/questions/60729/quais-seriam-as-pr%C3%A1ticas-recomendadas-para-commits-no-git&quot;&gt;Discussion on good Git practices on Stackoverflow&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;The site &lt;a href=&quot;http://ohshitgit.com/&quot;&gt;Oh shit, git!&lt;/a&gt; with a few more top tips in Git&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 15 Apr 2018 01:00:00 +0000</pubDate>
        <link>https://jtemporal.com/deploy-flask-heroku-en/</link>
        <guid isPermaLink="true">https://jtemporal.com/deploy-flask-heroku-en/</guid>
        
        <category>tutorial</category>
        
        <category>python</category>
        
        <category>flask</category>
        
        <category>deploy</category>
        
        <category>heroku</category>
        
        <category>api</category>
        
        <category>web</category>
        
        <category>server</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Fazendo deploy de uma API para o Heroku</title>
        <description>&lt;p&gt;Quer aprender a fazer deploy @? Vem que eu te ensino!&lt;/p&gt;

&lt;h2 id=&quot;o-que-você-vai-encontrar-nesse-tutorial&quot;&gt;O que você vai encontrar nesse tutorial&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Como criar uma aplicação Flask nos moldes do Heroku&lt;/li&gt;
  &lt;li&gt;Como fazer deploy&lt;/li&gt;
  &lt;li&gt;Um pouquinho de Git&lt;/li&gt;
  &lt;li&gt;Um pouquinho de consumo de API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Avisos&lt;/strong&gt;: Dos dois posts que eu usei de base para escrever esse aqui, um deles era muiiiito antigo e o outro, apesar de recente, não tinha instruções que correspondem a versão mais atual do Heroku, eles estão na sessão de links para quem quiser lê-los.&lt;/p&gt;

&lt;h2 id=&quot;heroku-quem&quot;&gt;Heroku quem?&lt;/h2&gt;

&lt;p&gt;Se você chegou até aqui, é provável que você já saiba o que o Heroku é, mas pra quem ainda não sabe, Heroku é uma plataforma na nuvem que permite que pessoas “transformem suas ideias o mais rápido possível em uma URL” e &lt;a href=&quot;https://www.heroku.com/what&quot;&gt;sem ter dores de cabeça com a parte de infraestrutura&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Essa plataforma provê um serviço que, a partir de uma estrutura pré-definida de uma aplicação, consegue empacotar essa aplicação e colocar ela pra rodar num servidor em um dos data centers deles. O Heroku aceita aplicações escritas em &lt;a href=&quot;https://www.heroku.com/languages&quot;&gt;várias linguagens&lt;/a&gt;, mas hoje vamos usar &lt;a href=&quot;&quot;&gt;Python&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resumo:&lt;/p&gt;

&lt;center&gt;
&lt;img alt=&quot;tudo computador essa porra&quot; src=&quot;https://media1.tenor.com/images/2c7b2d01405349faca72550fc1b954f0/tenor.gif&quot; /&gt;
&lt;/center&gt;

&lt;h2 id=&quot;partiu-código&quot;&gt;Partiu código!&lt;/h2&gt;

&lt;p&gt;Pra esse tutorial eu fiz uma API em um microframework Python chamado &lt;a href=&quot;http://flask.pocoo.org/&quot;&gt;Flask&lt;/a&gt;. Não irei explicar em detalhes como o Flask funciona, mas se você quiser aprender sobre isso, o Bruno Rocha tem um conjunto de posts chamado “What the Flask” que explicam super bem e estão todos lá nos links.&lt;/p&gt;

&lt;h3 id=&quot;nossa-api&quot;&gt;Nossa API&lt;/h3&gt;

&lt;p&gt;Ela terá apenas um &lt;em&gt;endpoint&lt;/em&gt; definido pelo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/&lt;/code&gt;. Esse &lt;em&gt;endpoint&lt;/em&gt; poderá dar duas respostas dependendo da requisição que você faça. São eles:&lt;/p&gt;

&lt;hr /&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Requisição&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Resultado&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;GET sem cabeçalhos (headers) extras&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Não entre em pânico!&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;GET com Authorization 42&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;a resposta para a vida, o universo e tudo mais&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;p&gt;O código pra fazer isso fica pequeninho, dá uma olhada:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Flask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;jsonify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;


&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Flask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nd&quot;&gt;@app.route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;nao_entre_em_panico&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;jsonify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;a resposta para a vida, o universo e tudo mais&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;jsonify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Não entre em pânico!&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;__main__&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;port&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;environ&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;PORT&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0.0.0.0&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Esse código fica dentro de um arquivo chamado aqui de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nao_entre_em_panico.py&lt;/code&gt; mas você pode nomear da forma que você achar melhor. Além disso, esse código tem uma peculiaride: as três linhas finais, elas servem para configurar o servidor Flask quando ele estiver rodando no Heroku.&lt;/p&gt;

&lt;h3 id=&quot;pipfile&quot;&gt;Pipfile&lt;/h3&gt;

&lt;p&gt;Lembra que eu falei lá no começo que os posts base eram antigos? Pois bem, hoje o Heroku exige um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pipfile&lt;/code&gt; para preparar o ambiente em que a nossa aplicação vai rodar. O Pipfile vai servir para instalar as bibliotecas Python necessárias para rodar a nossa aplicação. Se você, assim como eu, não gosta de usar o &lt;a href=&quot;https://docs.pipenv.org/&quot;&gt;Pipenv&lt;/a&gt; - &lt;em&gt;desculpa Cássio&lt;/em&gt; - dá pra criar o arquivo na mão, como criei o meu abaixo:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;pi&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]]&lt;/span&gt;

&lt;span class=&quot;s&quot;&gt;url = &quot;https://pypi.python.org/simple&quot;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;verify_ssl = &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;


&lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;packages&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;s&quot;&gt;Flask = &quot;*&quot;&lt;/span&gt;

&lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;requires&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;s&quot;&gt;python_version = &quot;3.6&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Para desenvolver (preparar o ambiente local) eu gosto do &lt;a href=&quot;http://jtemporal.com/requirements-txt/&quot;&gt;bom e velho &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirements.txt&lt;/code&gt;&lt;/a&gt; que fica assim:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;click==6.7
Flask==0.12.2
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
Werkzeug==0.14.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;procfile&quot;&gt;Procfile&lt;/h3&gt;

&lt;p&gt;No nosso computador, para rodar (colocar de pé) a nossa API o comando é o seguinte:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;FLASK_APP=nao_entre_em_panico.py flask run
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Como não será você quem irá executar um comando pra colocar a API de pé, você vai precisar de um arquivo que vai dizer &lt;em&gt;“Coloca a API de pé aí”&lt;/em&gt; para o Heroku, esse arquivo é o Procfile.&lt;/p&gt;

&lt;p&gt;Uma atençãozinha especial para um detalhe: esse arquivo não possui extensão, dependendo do seu sistema operacional e seu editor de texto, na hora de salvaer esse arquivo pode aparecer uma extensão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.txt&lt;/code&gt; nesse arquivo e isso vai causar uma falha no nosso deploy então, lembre-se de remover a extensão do arquivo caso ela apareça ;)&lt;/p&gt;

&lt;p&gt;Para esta aplicação, o Procfile vai ter uma linha só que é a seguinte:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;web: python nao_entre_em_panico.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Tá beleza, e o que mais?&lt;/p&gt;

&lt;h2 id=&quot;versionamento&quot;&gt;Versionamento&lt;/h2&gt;

&lt;p&gt;Como o Heroku funciona com o sistema de versionamento Git, independentemente de você hospedar ou não o código no GitHub, nós precisamos criar nosso histórico de versão para a aplicação.&lt;/p&gt;

&lt;p&gt;Então, depois de criar todos esses arquivos aqui de cima, você precisa adicionar tudo isso na sua árvore Git. Se você não é lá muito fã de Git pode fazer o seguinte:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git init
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git add &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;criando a aplicação&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Essa sequência de comandos acima vai colocar todos os arquivos num mesmo commit, isso não é uma boa prática e caso esteja interessada(o) em boas práticas lá no fim do desse tutorial vai ter links sobre isso.&lt;/p&gt;

&lt;h2 id=&quot;3-2-1-deploy-o&quot;&gt;3, 2, 1… Deploy \o/&lt;/h2&gt;

&lt;p&gt;Agora você tem uma escolha: existem algumas formas de enviar o seu código para o Heroku. Você pode connectar com o GitHub ou com Dropbox ou ainda usar o Heroku CLI. Nesse post nós vamos fazer da última forma.&lt;/p&gt;

&lt;p&gt;Então, pra começar você precisa &lt;a href=&quot;https://devcenter.heroku.com/articles/heroku-cli#download-and-install&quot;&gt;instalar o Heroku CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;fazendo-login&quot;&gt;Fazendo login&lt;/h3&gt;

&lt;p&gt;Começando pelo login:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;heroku login
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Esse comando vai te pedir para digitar e-mail e senha de acesso da sua conta no Heroku:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/y0zYuNw.png&quot; alt=&quot;login heroku&quot; /&gt;&lt;/p&gt;

&lt;center&gt;
&lt;small&gt;
&lt;i&gt;Tela de login da CLI do Heroku&lt;/i&gt;
&lt;/small&gt;
&lt;/center&gt;

&lt;h3 id=&quot;criando-uma-aplicação&quot;&gt;Criando uma aplicação&lt;/h3&gt;

&lt;h4 id=&quot;usando-a-interface&quot;&gt;Usando a interface&lt;/h4&gt;

&lt;p&gt;É possível criar uma aplicação pela &lt;a href=&quot;https://dashboard.heroku.com/new-app&quot;&gt;interface do site&lt;/a&gt;, onde você vai ver a seguinte tela:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/AyJqSmC.png&quot; alt=&quot;tela de criação de app no site da heroku&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Depois disso você ainda precisa adicionar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remote&lt;/code&gt; do Heroku no nosso repositório:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;heroku git:remote -a guiaapi
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E olha como é a resposta desse comando:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/0e6zymV.png&quot; alt=&quot;adicionando o remote do Heroku&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;usando-o-terminal&quot;&gt;Usando o terminal&lt;/h4&gt;

&lt;p&gt;Mas também podemos criar a aplicação usando a CLI do Heroku. O lado bom de usar a CLI é que ao criar a aplicação o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remote&lt;/code&gt; é criado automaticamente:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;heroku apps:create guiaapi
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O que deve mostrar algo assim ó:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/YXDIpwH.png&quot; alt=&quot;criação de um app nomeado usando a heroku cli&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Pausa para mais um momento de atenção: desse jeito que eu mostrei aí em cima, a gente consegue nomear nossa aplicação dentro do Heroku, aí que entra uma “pegadinha”, o nome da minha aplicação tem que ser única dentro do Heroku, pois é o nome da aplicação que é usado para criar a URL dela, se você por acaso tentar criar uma aplicação com um nome já utilizado, a resposta para o comando acima vai ser esta:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/0J1r1SN.png&quot; alt=&quot;falha na criação de app usando a heroku cli&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Se o nome da sua aplicação não for algo importante, você pode executar o seguinte comando no lugar do comando anterior:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;heroku create
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Esse comando vai criar uma aplicação com um nome randomizado, por exemplo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/aWt7Cja.png&quot; alt=&quot;criação de um app usando a heroku cli&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Depois de criada a aplicação, você pode dar uma espiada &lt;a href=&quot;https://dashboard.heroku.com/apps&quot;&gt;lá na dashboard do Heroku na área de aplicações&lt;/a&gt; para ver a lista das suas aplicações:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/VFw9LmW.png&quot; alt=&quot;lista de apps na dashboard da heroku&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;finalmente-fazendo-o-bendito-deploy&quot;&gt;Finalmente fazendo o bendito deploy&lt;/h3&gt;

&lt;p&gt;Depois de commitar tudo, fazer login e criar a sua aplicação no Heroku chegou a hora do &lt;em&gt;deploy&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A ação de fazer o deploy, aqui nesse contexto, significa enviar o código da aplicação para o servidor e rodar o processo para colocar nossa API de pé no servidor.&lt;/p&gt;

&lt;p&gt;Outros contextos podem trazer variações e passos intermediários desse que estou apresentando, mas aqui como nossa aplicação é simples e o Heroku é feito para nos ajudar a colocar aplicações de pé, o maior trabalho se torna a criação dos arquivos de configuração (que já criamos) ;)&lt;/p&gt;

&lt;p&gt;Então, o comando que vai executar o envio do código para o servidor é:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;git push heroku master
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Em caso de sucesso você deve ver algo parecido com isso:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/YLMrSrM.png&quot; alt=&quot;Terminal mostrando o deploy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Uma última configuração que pode ser necessária fazer é garantir que a nossa aplicação tem pelo menos um &lt;em&gt;dyno&lt;/em&gt; rodando com o seguinte comando:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;heroku ps:scale web=1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;dynos&quot;&gt;Dynos&lt;/h3&gt;

&lt;p&gt;E o que é um &lt;em&gt;dyno&lt;/em&gt;? Em resumo um &lt;em&gt;dyno&lt;/em&gt; é um Linux Container, o Heroku utiliza um modelo de container que isola a sua aplicação e possibilita a fácil escalabilidade do sistema. Em outras palavras menos técnicas: Pega todos os arquivos de código e configuração que escrevemos até agora e enfia num caixa e bota pra rodar, isso é um &lt;em&gt;dyno&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Agora pra ver o resultado da sua API podemos (nesse caso) abrir um navegador e acessar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://guiaapi.herokuapp.com/&lt;/code&gt; ou usar a linha de comando pra abrir a URL direto:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;heroku open
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Se deu tudo certo (e você usar o Firefox como navegador) você verá algo assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/nLDgMvc.png&quot; alt=&quot;Get sem cabeçalho de autorização no navegador&quot; /&gt;&lt;/p&gt;

&lt;p&gt;O que aconteceu foi o seguinte: ao acessar a URL da nossa aplicação no Heroku nós fizemos uma requisição GET pra API com o cabeçalho (header) padrão, ou seja, sem o campo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Authorization&lt;/code&gt;. Que seria a mesma coisa que rodar no terminal, isso aqui em baixo:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;curl -X GET -k -i &apos;https://guiaapi.herokuapp.com/&apos;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Que me dá este resultado:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/QmlCniF.png&quot; alt=&quot;Get sem cabeçalho de autorização no terminal com cURL&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Como sabemos, essa nossa API vai ter uma resposta diferente se você passar o cabeçalho &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Authorization&lt;/code&gt; com o valor de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;42&lt;/code&gt;, veja:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;curl -X GET -k -H &apos;Authorization: 42&apos; \
    -i &apos;https://guiaapi.herokuapp.com/&apos;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Temos o seguinte resultado:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/zMXtUtK.png&quot; alt=&quot;Get com cabeçalho de autorização no terminal com cURL&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Dá pra passar o cabeçalho de autorização no navegador? Dá! mas vou deixar isso pra outro post/tutorial que eu prometo que linko aqui quando escrever.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/khys820.png&quot; alt=&quot;Overview de um app&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;pro-tip-arquivos-de-log&quot;&gt;Pro tip: Arquivos de log&lt;/h2&gt;

&lt;p&gt;Pode ser que você tenha cometido alguma falha no processo de configuração da sua aplicação e, na hora do deploy, o Heroku avise que ele foi mal-sucedido. Nesse caso o primeiro lugar para procurar informações do que deu errado são os logs.&lt;/p&gt;

&lt;p&gt;Um bom sistema faz logs de todas as ações executadas. Nesse nosso caso, o Heroku se encarrega de logar todos os detalhes pra gente, então basta pedir esse log usando a CLI. Aqui eu ainda escrevo os logs num arquivo para facilitar a inspeção, veja:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;heroku logs &amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;out.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Exemplos de linhas que você irá encontrar num desses logs:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;...
2018-04-15T02:24:39.000000+00:00 app[api]: Build succeeded
2018-04-15T02:25:11.165813+00:00 heroku[web.1]: Starting process with command `python nao_entre_em_panico.py`
...
2018-04-15T02:52:20.075995+00:00 app[web.1]: 10.5.207.142 - - [15/Apr/2018 02:52:20] &quot;GET / HTTP/1.1&quot; 200 -
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Agora se alguém falar &lt;em&gt;“Faz um deploy ae!”&lt;/em&gt; você já sabe como ;)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ps.: Se tiver dúvidas ou comenta ali em baixo ou me manda mensagem que eu tento responder, sem crise as DMs tão sempre abertas ;)&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/api-example-flask-heroku&quot;&gt;Código mostrado nesse post&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Texto do Diego Garcia: &lt;a href=&quot;http://pythonclub.com.br/publicando-seu-hello-world-no-heroku.html&quot;&gt;Publicando seu Hello World no Heroku&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Texto do John Kagga em inglês: &lt;a href=&quot;https://medium.com/@johnkagga/deploying-a-python-flask-app-to-heroku-41250bda27d0&quot;&gt;Deploying a Python Flask app on Heroku&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/rochacbruno&quot;&gt;What the Flask&lt;/a&gt; do Bruno Rocha&lt;/li&gt;
  &lt;li&gt;Curso de &lt;a href=&quot;https://www.udemy.com/git-e-github-para-iniciantes/&quot;&gt;Git para inciantes do Willian Justen no Udemy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://pt.stackoverflow.com/questions/60729/quais-seriam-as-pr%C3%A1ticas-recomendadas-para-commits-no-git&quot;&gt;Discussão sobre boas práticas de Git no Stackoverflow&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;O site &lt;a href=&quot;http://ohshitgit.com/&quot;&gt;Oh shit, git!&lt;/a&gt; em Inglês com uns poucos tópicos mais acançados em Git&lt;/li&gt;
  &lt;li&gt;Vídeo do &lt;a href=&quot;https://twitter.com/rochacbruno&quot;&gt;Bruno Rocha&lt;/a&gt; com uma &lt;a href=&quot;https://www.youtube.com/watch?v=GVTEyLNyGWE&quot;&gt;Introdução ao HTTP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 15 Apr 2018 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/deploy-flask-heroku/</link>
        <guid isPermaLink="true">https://jtemporal.com/deploy-flask-heroku/</guid>
        
        <category>tutorial</category>
        
        <category>python</category>
        
        <category>flask</category>
        
        <category>deploy</category>
        
        <category>heroku</category>
        
        <category>api</category>
        
        <category>web</category>
        
        <category>servidor</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Brincando com o PostgreSQL</title>
        <description>&lt;h2 id=&quot;o-que-você-vai-encontrar-nesse-post&quot;&gt;O que você vai encontrar nesse post&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Como rodar um banco usando docker e docker-compose&lt;/li&gt;
  &lt;li&gt;Como rodar migrações nesse banco&lt;/li&gt;
  &lt;li&gt;Como interagir com esse banco por uma interface&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;aviso-inicial&quot;&gt;Aviso inicial&lt;/h2&gt;

&lt;p&gt;Todo o código e estrutura que vou mostrar aqui está &lt;a href=&quot;https://github.com/jtemporal/tadpgweb/&quot;&gt;nesse repositório do GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;rodando-o-postgresql-no-docker&quot;&gt;Rodando o PostgreSQL no Docker&lt;/h2&gt;

&lt;p&gt;Pra começar você pode &lt;a href=&quot;&quot;&gt;instalar o PostgreSQL&lt;/a&gt; na sua máquina seguindo as instruções do site oficial porém aqui vou mostrar como usar o Postgres dentro de um container Docker usando o Docker-Compose.
Pra começar (se ainda não o fez) instale o Docker e o Docker-Compose TK na sua máquina.
Depois disso, vamos precisar de um arquivo chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker-compose.yml&lt;/code&gt; contendo as seguintes linhas:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;3&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;tad&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;postgres:9.6&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;container_name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;postgres&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;POSTGRES_DB=tadpgweb&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;POSTGRES_USER=postgres&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;TZ=GMT&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;./data/postgres:/var/lib/postgresql/data&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;5432:5432&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Vamos ver as configurações que esse arquivo traz:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Diretório de dados&lt;/strong&gt;: quando esse container rodar vai existir um diretório &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data/&lt;/code&gt; na sua pasta que irá ser mapeada para dentro do container e conterá todos os dados do PostgreSQL;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;O nome do serviço&lt;/strong&gt;: aqui chamado de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tad&lt;/code&gt;;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;A porta aberta&lt;/strong&gt;: para que a gente acesse o banco precisamos mapear uma porta do container para a nossa máquina &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;host&lt;/code&gt;. Por padrão vamos escolher a mesma porta que o PostgreSQL usaria se não estivesse rodando dentro do container;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;O nome do banco&lt;/strong&gt;: Aqui eu chamei o banco de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tadpgweb&lt;/code&gt;;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Usuário do banco&lt;/strong&gt;: no arquivo definimos o usuário do banco como sendo o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;postgres&lt;/code&gt; mesmo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;E agora para colocar nosso banco “de pé”, o seguinte comando num terminal bastará:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;docker-compose up tad
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Na primeira vez que rodamos esse comando, algumas coisas vão acontecer a começar pelo download da imagem do PostgreSQL na versão 9.6, a criação do diretório &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data/&lt;/code&gt; para conter os dados do postgres e depois disso, a criação de um banco com as configurações do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker-compose.yml&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;migrações-de-comer-ou-de-passar-no-cabelo&quot;&gt;Migrações: de comer ou de passar no cabelo&lt;/h2&gt;

&lt;p&gt;Criar e apagar tabelas e colunas, entre outras alterações podem ser feitas por meio de migrações. Migrações não passam de arquivos que executam comandos no banco. Esses comandos podem ser de alteração nas estruturas do banco como criação e deleção de tabelas e colunas ou comandos de preenchimento de dados conhecidos como migrações de dados ou &lt;em&gt;data migrations&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Aqui eu escrevi 4 migrações que vamos rodar e vou explicar uma a uma, então preparem-se para o curso curto e intensivo do básico de SQL ;P&lt;/p&gt;

&lt;p&gt;A primeira migração, chamada de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;001_create_table_up.sql&lt;/code&gt; e vai criar uma tabela &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clientes&lt;/code&gt;, com 3 colunas, a coluna &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;id&lt;/code&gt; que é um sequencial que começa em um, a coluna &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nome&lt;/code&gt; que pode ter tamanho máximo de 250 caracteres e por último a coluna &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;idade&lt;/code&gt; que aceita números, além disso essa migração também define que as colunas &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;id&lt;/code&gt; e &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nome&lt;/code&gt; não podem ser nulas e a coluna &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;id&lt;/code&gt; é chave primária da tabela &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clientes&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clientes&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;serial&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nome&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;VARCHAR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;250&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;idade&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;INTEGER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Agora vamos supor que a tabela que criamos não precise de uma coluna idade, então criamos a migração &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;002_alter_table_up.sql&lt;/code&gt; para nos livrarmos dela:&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clientes&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;DROP&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;COLUMN&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;idade&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Além de não precisar da coluna nós vamos querer uma outra coluna chamada de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;endereco&lt;/code&gt; também com tamanho máximo de 250 caracteres, e foi o que fizemos na migração &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;003_alter_table_up.sql&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clientes&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;ADD&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;COLUMN&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endereco&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;VARCHAR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;250&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E agora que temos uma estrutura pronta para armazenar dados vamos fazer umas inserções nessa linda tabela com a migração &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;004_data_migration_up.sql&lt;/code&gt;, essa migração cria três registros na tabela &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clientes&lt;/code&gt; fazendo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INSERTS&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clientes&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nome&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endereco&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Umbrella Corporation&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;545 S Birdneck RD STE 202B Virginia Beach, VA 23451&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clientes&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nome&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endereco&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;OCP Omni Consumer Products&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Delta City (formerly Detroit)&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clientes&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nome&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endereco&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Weyland-Yutani Corporation&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Weyland-Yutani Corporation HQ, Tokyo&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note que os nomes de todas as migrações terminam em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;up&lt;/code&gt;, isso por que, cada uma das migrações que você viu aqui, tem uma migração irmã que &lt;em&gt;desfaz&lt;/em&gt; o que essa migração fez. Isso é uma boa prática de software ;)&lt;/p&gt;

&lt;p&gt;Mas agora que nós temos essas migrações como aplicá-las ao nosso banco?&lt;/p&gt;

&lt;p&gt;Primeiro vamos copiar as migrações pro lugar certo e depois “rodá-las” dentro do container:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;sudo cp migrations/*up.sql data/postgres/
docker-compose exec tad psql -U postgres -d tadpgweb -1 -f /var/lib/postgresql/data/001_create_table_up.sql
docker-compose exec tad psql -U postgres -d tadpgweb -1 -f /var/lib/postgresql/data/002_alter_table_up.sql
docker-compose exec tad psql -U postgres -d tadpgweb -1 -f /var/lib/postgresql/data/003_alter_table_up.sql
docker-compose exec tad psql -U postgres -d tadpgweb -1 -f /var/lib/postgresql/data/004_data_migration_up.sql
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A sintaxe SQL não é muito misteriosa, mas se você estiver um pouco enferrujada(o) existem vários materiais disponíveis por aí, dentre eles o material em português do &lt;a href=&quot;http://www.criarweb.com/sql/&quot;&gt;Criar Web&lt;/a&gt;, o &lt;a href=&quot;https://www.codecademy.com/learn/learn-sql&quot;&gt;curso de SQL do codecademy&lt;/a&gt; e o tutorial de &lt;a href=&quot;https://www.geeksforgeeks.org/sql-tutorial/&quot;&gt;SQL do GeekForGeeks&lt;/a&gt; ambos em inglês.&lt;/p&gt;

&lt;h2 id=&quot;um-cliente-para-interação-com-o-banco&quot;&gt;Um cliente para interação com o banco&lt;/h2&gt;

&lt;p&gt;Existem muitos clientes/aplicações que podemos usar para interagir com um banco como o &lt;a href=&quot;https://www.pgadmin.org/&quot;&gt;pgAdmin&lt;/a&gt; e a CLI &lt;a href=&quot;https://www.postgresql.org/docs/current/static/app-psql.html&quot;&gt;psql&lt;/a&gt;. Quando rodamos nossas migrações usamos a PSQL para aplicar Além dessas, hoje vamos aprender a usar um cliente web chamado &lt;a href=&quot;http://sosedoff.github.io/pgweb/&quot;&gt;pgWeb&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Escrito em &lt;a href=&quot;http://golang.org/&quot;&gt;Go&lt;/a&gt; o pgweb é mais leve que as demais opções e permite fazer as operações mais básicas como aquelas das nossas 4 migrações. Primeiro &lt;a href=&quot;https://github.com/sosedoff/pgweb#installation&quot;&gt;instale da forma que preferir&lt;/a&gt;. Como eu tenho Go configurado no meu computador fui de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go get&lt;/code&gt; mesmo:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;go get github.com/sosedoff/pgweb
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Agora para rodar basta pegar um terminal e rodar o seguinte comando:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;pgweb
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E o resultado será o seguinte:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/hxIsA4W.png&quot; alt=&quot;foto do terminal rodando o pgweb&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora é só ir no seu navegador favorito e acessar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:8081/&lt;/code&gt; e ver a telinha para conectar no banco:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/CMjOnVS.png&quot; alt=&quot;página de conexão com o banco do pgweb&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Então é só preencher as lacunas:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/Wifauax.png&quot; alt=&quot;página de conexão com o banco do pgweb com os dados preenchidos&quot; /&gt;&lt;/p&gt;

&lt;p&gt;e clicar em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Connect&lt;/code&gt; para ser levado para a página:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/k4DvoLB.png&quot; alt=&quot;página inicial do pgweb após conexão&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;minhas-coisas-favoritas-do-pgweb&quot;&gt;Minhas coisas favoritas do pgweb&lt;/h2&gt;

&lt;p&gt;Apesar de não ser tão completo como um pgAdmin da vida, o pgweb traz todas as funções para um uso diário e rápido.&lt;/p&gt;

&lt;h3 id=&quot;execução-de-queries-query&quot;&gt;Execução de queries: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Query&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Com o pgweb dá até pra criar tabelas, mas dá também para fazer consultas mais simples como um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELECT&lt;/code&gt; e ver o resultado das consultas logo abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/8ifppem.png&quot; alt=&quot;execução de uma query&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Além disso, a parte mais legal é inspecionar os detalhes de uma query clicando no botão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Explain Query&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/xLUxGMk.png&quot; alt=&quot;detalhes sobre uma query&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;inspeção-de-registros-rows&quot;&gt;Inspeção de registros: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Rows&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Quer ver as linhas contidas em cada tabela? Clique na tabela no menu lateral esquerdo e clique na aba de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Rows&lt;/code&gt; para mostrar os registros daquela tabela:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/IASRc0X.png&quot; alt=&quot;linhas da tabela clientes&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;uso-de-filtros-rows&quot;&gt;Uso de filtros: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Rows&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Ainda na aba &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Rows&lt;/code&gt; conseguimos ver e executar filtros simples como selecionar todas linhas que possuam &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;id&lt;/code&gt; maior que &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; por exemplo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/lkkcKD7.png&quot; alt=&quot;filtro de id maior que dois&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;inspeção-da-estrutura-da-tabela-structure&quot;&gt;Inspeção da estrutura da tabela: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Structure&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Para ver uma listagem completa da estrutura de cada tabela, novamente clique na tabela escolhida no menu à esquerda da tela e clique na aba &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Structure&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/ltQrIi8.png&quot; alt=&quot;aba “structure” da tabela clientes&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;histórico-history&quot;&gt;Histórico: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;History&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Além disso, todas as ações que fizemos ficam registradas na aba de histórico &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;History&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/jSFTc7m.png&quot; alt=&quot;histórico de consultas&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Legal né? Seja você iniciante em banco de dados procurando uma forma de colocar em prática os estudos ou alguém mais experiente fazendo testes pequenos e rápidos, taí uma forma alternativa de interagir com o banco ;)&lt;/p&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.docker.com/compose/&quot;&gt;Docker-Compose&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 08 Apr 2018 01:00:00 +0000</pubDate>
        <link>https://jtemporal.com/brincando-com-postgresql/</link>
        <guid isPermaLink="true">https://jtemporal.com/brincando-com-postgresql/</guid>
        
        <category>tutorial</category>
        
        <category>banco de dados</category>
        
        <category>ferramenta</category>
        
        <category>docker</category>
        
        <category>docker-compose</category>
        
        <category>pgweb</category>
        
        <category>sql</category>
        
        <category>dados</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Formatando código Go usando o próprio Go pra isso</title>
        <description>&lt;p&gt;Coisa linda de se ver é usar um formatador de código, principalmente quando você tem preguiça de ficar formatando coisas ou quando você está preocupada em aprender a sintaxe de uma nova linguagem e ainda não pegou o jeito com o estilo de código.&lt;/p&gt;

&lt;p&gt;A colinha de hoje mostra como a linguagem de programação &lt;a href=&quot;https://golang.org/&quot;&gt;Go&lt;/a&gt; ajuda a formatar o código sem sofrimento.&lt;/p&gt;

&lt;p&gt;Pra começar, é preciso entender que código bem formatado está na cultura da linguagem Go desde que ela nasceu, para os mais experientes isso nao passa de uma boa prática muito comum. Mas como fica isso na prática? Então vamos lá, vamos supor que você escreveu o seguinte código num arquivo chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;helloworld.go&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(){&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello world!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Até aí tudo bem, esse código compila e se você fizer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go run helloworld.go&lt;/code&gt; ele ainda escreve na tela o seu &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Hello World!&lt;/code&gt; porém, se você tivesse que mandar esse código para um projeto aberto, provavelmente pessoas revisando seu código iriam pedir para você formatá-lo melhor.&lt;/p&gt;

&lt;p&gt;Existe um monte de ferramentas própria da linguagem para ajudar a pessoa que desenvolve, sendo uma delas o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gofmt&lt;/code&gt;. Ele pode mostrar na tela a formatação indicada para um código fonte ou até mesmo formatar para você o código que você escreve. Para usar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gofmt&lt;/code&gt; basta passar o nome do arquivo para ele:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;gofmt helloworld.go
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Isso irá escrever na tela a versão formatada do seu código fonte. Existem algumas flags que você pode usar para mudar esse resultado. Por exemplo, a flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-d&lt;/code&gt; irá mostrar um diff do seu arquivo num formato idêntico ao &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git diff&lt;/code&gt;ótimo para envio de patches.&lt;/p&gt;

&lt;p&gt;Mas a flag/opção mais interessante é a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-w&lt;/code&gt; que converte a impressão na tela para escrita em arquivo. Nesse caso, se você utilizar essa flag assim:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;gofmt -w helloworld.go
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nada será printado na tela e o código formatado será escrito no seu arquivo fonte, então aquele código que eu mostrei no início, após a execucção com a flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-w&lt;/code&gt; fica assim:&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Massa né? Agora não tem mais desculpa pra não formatar os códigos bonitinhos  😜&lt;/p&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Parte do livro &lt;a href=&quot;https://www.programming-books.io/essential/go/323-go-fmt&quot;&gt;Essencial Go que fala sobre &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go fmt&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Documentação sobre a &lt;a href=&quot;https://golang.org/doc/effective_go.html#formatting&quot;&gt;formatação de código Go no Effective Go&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;agradecimentos&quot;&gt;Agradecimentos&lt;/h2&gt;
&lt;p&gt;Principalmente ao Cesar que pacientemente tem me ensinado Go.&lt;/p&gt;
</description>
        <pubDate>Mon, 19 Mar 2018 05:00:00 +0000</pubDate>
        <link>https://jtemporal.com/formatando-codigo-go/</link>
        <guid isPermaLink="true">https://jtemporal.com/formatando-codigo-go/</guid>
        
        <category>colinha</category>
        
        <category>go</category>
        
        <category>gophers</category>
        
        <category>golang</category>
        
        <category>formatação</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Gerando chaves das APIs do Google</title>
        <description>&lt;p&gt;Hoje em dia é sempre API isso ou API aquilo. APIs nada mais são do que uma forma de acessar dados e/ou serviços por meio de um programa. Mas pra acessar APIs como as do Google você vai precisar de uma chave. Esse tutorial de hoje vai ensinar você a criar uma chave do Google e ativar uma das APIs do Google para usá-la. Lembrando que os passo a seguir são para criação de chaves para uso próprio, chaves para aplicações web e outras aplicações pode ter passos diferentes ;)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/zaezT79s3Ng7C/giphy.gif&quot; alt=&quot;let&apos;s do this&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Vamos lá!&lt;/i&gt;
&lt;/center&gt;

&lt;h2 id=&quot;começando&quot;&gt;Começando&lt;/h2&gt;
&lt;p&gt;Pra começar acesse o &lt;a href=&quot;https://console.developers.google.com/apis/dashboard&quot;&gt;painel de desenvolvimento do Google&lt;/a&gt;. Ele deve ter uma carinha parecida com essa aqui:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/52hRqLe.png&quot; alt=&quot;painel de desenvolvimento do google&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;criando-um-projeto&quot;&gt;Criando um projeto&lt;/h2&gt;
&lt;p&gt;Para criar uma ou mais chaves, você precisa ter um projeto. Toda e qualquer chave de API do Google precisa de um projeto para existis. Então vamos começar criando um desses. Clique em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Criar projeto&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/3cTDEam.png&quot; alt=&quot;criar projetos&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Depois em criar:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/nEtPSFp.png&quot; alt=&quot;criar&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E então escolha um nome para o seu projeto e clique em criar:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/E2QJ67X.png&quot; alt=&quot;selecionar nome e criar&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ao clicar em criar você voltará para o painel:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/f4oXDLm.png&quot; alt=&quot;painel depois da criação de um projeto&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Notou como não tem mais o aviso de “está faltando projetos”?&lt;/p&gt;

&lt;h2 id=&quot;criando-uma-chave&quot;&gt;Criando uma chave&lt;/h2&gt;

&lt;p&gt;Agora no menu a esquerda da tela clique em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Credenciais&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/OD6mafF.png&quot; alt=&quot;menu a esquerda: Credenciais&quot; /&gt;&lt;/p&gt;

&lt;p&gt;para acessar o painel de chaves.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/SYlKCwK.png&quot; alt=&quot;painel de credenciais&quot; /&gt;&lt;/p&gt;

&lt;p&gt;É nessa parte que no futuro vão ser listadas todas as chaves que você gerou para aquele projeto. Agora clique no botão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Criar credenciais&lt;/code&gt; bem no centro da tela:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/hf30xl2.png&quot; alt=&quot;botao criar credenciais&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Esse botão vai mostrar algumas opções, dentre elas a que nós queremos se chama “Chave de API”:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/EVNdvzv.png&quot; alt=&quot;opções de criar credenciais&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ao clicar nela irá abrir uma janelinha com a sua chave (aqui editada por motivos de segurança):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/vkQOqpR.png&quot; alt=&quot;sua chave de API&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Uma coisa que você vai querer fazer aqui é clicar no botão de copiar que aparece no final da chave de API (afinal você provavelmente ta criando a chave para usá-la). Depois é clicar em fechar para voltar para o painel de credenciais que agora tem uma lista de um item yaaayy \o/ e deve ser algo mais ou menos assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/09LaYVn.png&quot; alt=&quot;painel com uma chave&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;ativando-uma-api&quot;&gt;Ativando uma API&lt;/h2&gt;
&lt;p&gt;Agora o próximo passo é escolher uma API na biblioteca das APIs disponíveis. Comece escolhendo a opção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bibliotecas&lt;/code&gt; naquele menu lateral esquerdo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/WxgwfN8.png&quot; alt=&quot;menu a esquerda: bibliotecas&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Você pode passear pelas bibliotecas disponíveis nesse painel que irá aparecer:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/NotZpSU.png&quot; alt=&quot;painel de bibliotecas&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ou procurar por uma API específica, nesse caso a do YouTube:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/KAoj2Wf.png&quot; alt=&quot;procurando a API do YouTube&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Eu escolhi aqui a API de dados do youtube (a primeira da lista acima), e cliquei nela, o que me levou para a seguinte página:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/Ej1gxu7.png&quot; alt=&quot;YouTube data API&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Nessa página encontramos algumas informações sobre essa API, incluindo links para tutoriais de como utilizá-la. Mas o que nos interessa de verdade nessa página é clicar no botão de ativar:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/P9LMurv.png&quot; alt=&quot;clicar em ativar&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ao clicar em ativar, somos levados para o painel da API, é nesse painel que você acompanha várias métricas do uso dessa API.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/7fboIJQ.png&quot; alt=&quot;painel de uso da API&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-end&quot;&gt;The end&lt;/h2&gt;

&lt;p&gt;Sim, cabou já da pra usar :P&lt;/p&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;perguntas&quot;&gt;Perguntas&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Posso usar uma chave só para várias APIs?&lt;/strong&gt;
Pode! Não vai dar problema nenhum. Afinal quem decide qual API usar é a sua aplicação/ seu programa ;)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Se eu posso usar a mesma chave pra várias APIs pra que eu vou criar outras?&lt;/strong&gt;
Vamos supor que você tem vários scripts/projetos/apps que fazem requisições para APIs do google, facilita um pouco a vida se você conseguir apagar uma chave de um app que você não quer que tenha acesso a API do google não é mesmo?&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Posso mandar minha chave de API pra um coleguinha?&lt;/strong&gt;
Poder você pode, mas não deve né? Importante cuidar da segurança, já imaginou se esse coleguinha começa a fazer requisições sem controle pra API do google? A conta do cartão vai chegar alta no fim do mês.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Eu não preciso me cadastrar em nada?&lt;/strong&gt;
Não, acessando o console estando logado na sua conta do Gmail você já tem acesso a parte free das APIs.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;agradecimentos&quot;&gt;Agradecimentos&lt;/h2&gt;
&lt;p&gt;Ao querido Cássio Botaro que deu essa ideia de tutorial &amp;lt;3&lt;/p&gt;
</description>
        <pubDate>Mon, 15 Jan 2018 01:00:00 +0000</pubDate>
        <link>https://jtemporal.com/gerando-chaves-api-google/</link>
        <guid isPermaLink="true">https://jtemporal.com/gerando-chaves-api-google/</guid>
        
        <category>tutorial</category>
        
        <category>google api</category>
        
        <category>apis</category>
        
        <category>api</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Comandos Docker</title>
        <description>&lt;p&gt;Se você lida com Docker diariamente é necessário saber alguns comandos. Se você for feito eu que esquece essas coisas, aqui vai uma colinha pra ajudar ;)&lt;/p&gt;

&lt;h2 id=&quot;sumário&quot;&gt;Sumário&lt;/h2&gt;
&lt;!--toc--&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;#listando&quot;&gt;Listando&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#removendo&quot;&gt;Removendo&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#matando&quot;&gt;Matando&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#opcoes&quot;&gt;Alguns opções válidas de conhecer&lt;/a&gt;
&lt;!--end toc--&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;listando&quot;&gt;Listando&lt;/h2&gt;

&lt;h3 id=&quot;imagens-na-sua-máquina&quot;&gt;Imagens na sua máquina&lt;/h3&gt;
&lt;p&gt;Lista todas as imagens da sua máquina inclusive as penduradas (dangling)&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;docker images &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;containers-em-execução&quot;&gt;Containers em execução&lt;/h3&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;todos-containers&quot;&gt;Todos containers&lt;/h3&gt;
&lt;p&gt;E suas informações&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;docker ps &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;apenas-os-ids-de-todos-os-containers&quot;&gt;Apenas os IDs de todos os containers&lt;/h3&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;docker ps &lt;span class=&quot;nt&quot;&gt;-qa&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;removendo&quot;&gt;Removendo&lt;/h2&gt;

&lt;h3 id=&quot;um-container-que-foi-parado&quot;&gt;Um container que foi parado&lt;/h3&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;docker &lt;span class=&quot;nb&quot;&gt;rm &lt;/span&gt;ID
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;todos--containers-que-foram-parados&quot;&gt;Todos  containers que foram parados&lt;/h3&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;docker &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;docker ps &lt;span class=&quot;nt&quot;&gt;-qa&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;uma-imagem-do-sistema&quot;&gt;Uma imagem do sistema&lt;/h3&gt;
&lt;p&gt;Se a imagem nao estiver em uso, você pode removê-la usando o comando abaixo e a ID da imagem&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;docker rmi ID
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;todas-imagens-do-sistema&quot;&gt;Todas imagens do sistema&lt;/h3&gt;
&lt;p&gt;Remove &lt;strong&gt;TODAS&lt;/strong&gt; as imagens Docker que não estiverem em uso da sua máquina. Use com cuidado!&lt;/p&gt;

&lt;p&gt;Irá mostrar um erro caso alguma imagem esteja em uso.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;docker rmi &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;docker images &lt;span class=&quot;nt&quot;&gt;-qa&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;todas-imagens-do-sistema-1&quot;&gt;Todas imagens do sistema&lt;/h3&gt;
&lt;p&gt;Remove &lt;strong&gt;TODAS&lt;/strong&gt; as imagens Docker que não estiverem em uso da sua máquina. Use com cuidado!&lt;/p&gt;

&lt;p&gt;Irá ignorar imagens em uso uso.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;docker system prune &lt;span class=&quot;nt&quot;&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/BCPzKXW.png&quot; alt=&quot;resultado da remoção&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;matando&quot;&gt;Matando&lt;/h2&gt;

&lt;h3 id=&quot;um-ou-mais-containers&quot;&gt;Um ou mais containers&lt;/h3&gt;
&lt;p&gt;Basta passar uma lista de IDs para matar mais do que um container&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;docker &lt;span class=&quot;nb&quot;&gt;kill &lt;/span&gt;ID
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;opcoes&quot;&gt;Alguns opções válidas de conhecer&lt;/h2&gt;

&lt;h3 id=&quot;-a&quot;&gt;-a&lt;/h3&gt;
&lt;p&gt;Maioria, se não todos, os comandos e subcomandos do Docker possuem uma opção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-a&lt;/code&gt; que vem de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;all&lt;/code&gt; todos.&lt;/p&gt;

&lt;h3 id=&quot;rm&quot;&gt;–rm&lt;/h3&gt;
&lt;p&gt;Mesma coisa coisa acontece com a opção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--rm&lt;/code&gt;. Quando usada ela indica que o container deverá ser removido após sua execução&lt;/p&gt;

&lt;h3 id=&quot;-q&quot;&gt;-q&lt;/h3&gt;
&lt;p&gt;Maioria, se não todos, os comandos e subcomandos do Docker possuem uma opção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-q&lt;/code&gt; que lista apenas os IDs&lt;/p&gt;
</description>
        <pubDate>Sun, 14 Jan 2018 08:00:00 +0000</pubDate>
        <link>https://jtemporal.com/comandos-docker/</link>
        <guid isPermaLink="true">https://jtemporal.com/comandos-docker/</guid>
        
        <category>colinha</category>
        
        <category>cheatsheet</category>
        
        <category>docker</category>
        
        <category>português</category>
        
        <category>container</category>
        
        <category>containers</category>
        
        <category>conteiner</category>
        
        <category>conteiners</category>
        
        
      </item>
    
      <item>
        <title>Dependências de projetos Ruby: Gemfile</title>
        <description>&lt;p&gt;Depois de &lt;a href=&quot;http://jtemporal.com/do-tema-ao-ar/&quot;&gt;ensinar a colocar um site no ar&lt;/a&gt; usando o &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;. Vou responder uma pergunta que me fizeram: &lt;em&gt;“Meu tema não tem uma Gemfile, e agora?”&lt;/em&gt; A colinha de hoje ensina o que fazer.&lt;/p&gt;

&lt;h2 id=&quot;o-que-é-uma-gemfile&quot;&gt;O que é uma Gemfile?&lt;/h2&gt;

&lt;p&gt;Bem antes de explicar o que é esse arquivo você precisa entender um pouquinho sobre projetos Ruby. Cada projeto, idependente da linguagem que você está usando, geralmente tem uma lista de dependências que são necessárias para esse projeto rodar. No caso de projetos Ruby, essa lista o gerenciamento de dependências é feito usando um sistema conhecido como Gemfile.&lt;/p&gt;

&lt;p&gt;Cada pacote/biblioteca que você instala para ser usado pelo seu projeto é uma &lt;em&gt;gem&lt;/em&gt;. Assim como o próprio Jekyll é uma gem, você pode precisar por exemplo de plugins Jekyll para fazer coisas coisas no seu site como paginar as postagens, incluir SEO e até construir automaticamente um feed XML. Para instalar e gerenciar tais plugins usa-se o Gemfile.&lt;/p&gt;

&lt;h2 id=&quot;meu-tema-não-tem-uma-gemfile&quot;&gt;Meu tema não tem uma Gemfile&lt;/h2&gt;

&lt;p&gt;No tutorial eu usei o tema &lt;a href=&quot;http://jekyllthemes.org/themes/fresh/&quot;&gt;Fresh&lt;/a&gt; que já vem com uma Gemfile pronta. Mas e se eu escolher um tema sem uma Gemfile? Como que funciona?&lt;/p&gt;

&lt;p&gt;Para começar, o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; não irá funcionar. Esse comando busca a Gemfile para instalar as gems do projeto. Da mesma forma também não funcionará o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle exec jekyll serve&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Hoje eu vou ensinar como criar uma Gemfile, ou viver sem ela, para exemplificar os passos de hoje vou usar o tema &lt;a href=&quot;https://github.com/jtemporal/Wall-E&quot;&gt;Wall-E&lt;/a&gt; (linkei o meu fork do tema pois o original acabou de ganhar um PR com uma Gemfile hihi).&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git clone git@github.com:jtemporal/Wall-E.git
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;Wall-E/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;center&gt;
&lt;br /&gt;
&lt;img src=&quot;https://i.imgur.com/Efo1e1C.png&quot; alt=&quot;bundle install falhando&quot; /&gt;
&lt;br /&gt;
&lt;small&gt;&lt;i&gt;bundle install falhando&lt;/i&gt;&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;Se não da pra iniciar o servidor usando o bundle, a alternativa é fazê-lo usando o Jekyll purão mesmo:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;center&gt;
&lt;br /&gt;
&lt;img src=&quot;https://i.imgur.com/RGYPVQu.png&quot; alt=&quot;jekyll serve falhando&quot; /&gt;
&lt;br /&gt;
&lt;small&gt;&lt;i&gt;jekyll serve falhando&lt;/i&gt;&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;É nessa hora que você começa a perceber como seria legal ter uma Gemfile. Se você tem ela fica muito mais fácil começar a rodar o projeto. Pra resolver esse erro basta fazer os seguintes passos:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;gem &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;jekyll-gist
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E acessar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localhost:4000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Uma forma de saber quais gems instalar antes de rodar o servidor é checar as gem necessárias para o tema no arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; na tag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;plugins&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;plugins: [jekyll-gist]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A tag plugins traz a lista de gems necessárias para aquele projeto Jekyll.&lt;/p&gt;

&lt;h2 id=&quot;criando-a-sua-gemfile&quot;&gt;Criando a sua Gemfile&lt;/h2&gt;

&lt;p&gt;Tá eu já sei rodar um projeto sem Gemfile e sei instalar as gems na mão, mas não quero ficar fazendo isso, então como que eu crio uma Gemfile?&lt;/p&gt;

&lt;p&gt;Comece criando um arquivo chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt; no root do projeto:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;touch &lt;/span&gt;Gemfile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nesse arquivo você vai listar todas as dependências, inclusive o próprio Jekyll:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;source &quot;https://rubygems.org&quot;

gem &quot;jekyll&quot;
gem &quot;jekyll-gist&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Assim é só executar:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bundle &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E seguir fazendo os posts ;)&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Tutorial sobre &lt;a href=&quot;https://learn.cloudcannon.com/jekyll/gemfiles-and-the-bundler/&quot;&gt;Gems, Gemfiles and Bundler em inglês e com vídeos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 13 Jan 2018 08:00:00 +0000</pubDate>
        <link>https://jtemporal.com/gemfile/</link>
        <guid isPermaLink="true">https://jtemporal.com/gemfile/</guid>
        
        <category>colinha</category>
        
        <category>jekyll</category>
        
        <category>ruby</category>
        
        <category>gemfile</category>
        
        <category>dependências</category>
        
        <category>terminal</category>
        
        <category>versões</category>
        
        <category>versoes</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Ruby Project Dependencies: Gemfile</title>
        <description>&lt;hr /&gt;

&lt;p&gt;Author note: &lt;a href=&quot;https://jtemporal.com/gemfile/&quot;&gt;Leia este artigo em Português&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;After &lt;a href=&quot;https://jtemporal.com/do-tema-ao-ar/&quot;&gt;teaching how to get your website online&lt;/a&gt; (in Portuguese) using &lt;a href=&quot;https://jekyllrb.com&quot;&gt;Jekyll&lt;/a&gt;. I’m going to use today’s pro-tip to answer a question somebody asked me: &lt;em&gt;“My theme doesn’t have a Gemfile, now what?”&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-is-a-gemfile&quot;&gt;What is a Gemfile?&lt;/h2&gt;

&lt;p&gt;Before explaining what this file is, you need to understand a little bit about Ruby projects. Usually, each project, independent of the language you are using, has a list of dependencies that are required for the said project to run. For Ruby projects, this dependency management list is made using a system known as Gemfile.&lt;/p&gt;

&lt;p&gt;Each package/library you need install to run your project is called a &lt;em&gt;gem&lt;/em&gt;. Just as Jekyll itself is a gem, you may need, for example, some plugins to add some features on your site such as paginating post lists, including SEO, and even automatically building an XML feed. To install and manage such plugins, we use a Gemfile.&lt;/p&gt;

&lt;h2 id=&quot;my-theme-does-not-have-a-gemfile&quot;&gt;My theme does not have a Gemfile&lt;/h2&gt;

&lt;p&gt;For the tutorial linked at the beginning of this post, I used &lt;a href=&quot;http://jekyllthemes.org/themes/fresh/&quot;&gt;the Fresh&lt;/a&gt; theme. It already comes with a Gemfile. But what if I had chosen a theme without a Gemfile?&lt;/p&gt;

&lt;p&gt;For starters, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; command would not work. This command uses the Gemfile to install the project required gems. Similarly, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle exec jekyll serve&lt;/code&gt; command won’t work either.&lt;/p&gt;

&lt;p&gt;Let’s see how to create a Gemfile, or live without it, to exemplify today’s steps I will use the &lt;a href=&quot;https://github.com/jtemporal/Wall-E&quot;&gt;Wall-E&lt;/a&gt; theme (I linked the fork I made because after this post I made a pull request adding a Gemfile to the theme &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;¯\_(ツ)_/¯&lt;/code&gt;).&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ git clone git@github.com:jtemporal/Wall-E.git
$ cd Wall-E/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;center&gt;
&lt;br /&gt;
&lt;img src=&quot;https://i.imgur.com/Efo1e1C.png&quot; alt=&quot;bundle install failing&quot; /&gt;
&lt;br /&gt;
&lt;small&gt;&lt;i&gt;bundle install failing&lt;/i&gt;&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;If you can’t start the server using bundle, the alternative is to do it using pure Jekyll:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;center&gt;
&lt;br /&gt;
&lt;img src=&quot;https://i.imgur.com/RGYPVQu.png&quot; alt=&quot;jekyll serve failing&quot; /&gt;
&lt;br /&gt;
&lt;small&gt;&lt;i&gt;jekyll serve failing&lt;/i&gt;&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;This is when you begin to realize how cool it would be to have a Gemfile.  It is much easier to run the project when you have a dependency file.  To fix this error, do the following steps:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ gem install jekyll-gist
$ jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now you can access  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localhost:4000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One way to know which gems are needed before running the server is to check the necessary gems for the theme in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; file in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;plugins&lt;/code&gt; tag:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;plugins: [jekyll-gist]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The plugins tag lists the gems needed for that Jekyll project.&lt;/p&gt;

&lt;h2 id=&quot;creating-your-gemfile&quot;&gt;Creating Your Gemfile&lt;/h2&gt;

&lt;p&gt;Now you know how to run a project without Gemfile, and you know how to install gems by hand, but doing this every time is annoying, so let’s create a Gemfile. Start by creating a file called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt; in the project root:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ touch Gemfile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this file you will list all dependencies, including Jekyll himself:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;source &quot;https://rubygems.org&quot;

gem &quot;jekyll&quot;
gem &quot;jekyll-gist&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then you can do the following:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ bundle install
$ bundle exec jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;All is set, and you enjoy your project 😉&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Tutorial about &lt;a href=&quot;https://learn.cloudcannon.com/jekyll/gemfiles-and-the-bundler/&quot;&gt;Gems, Gemfiles and Bundler&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 13 Jan 2018 07:59:00 +0000</pubDate>
        <link>https://jtemporal.com/rb-project-dep-gemfile/</link>
        <guid isPermaLink="true">https://jtemporal.com/rb-project-dep-gemfile/</guid>
        
        <category>english</category>
        
        <category>protip</category>
        
        <category>pro tip</category>
        
        <category>jekyll</category>
        
        <category>ruby</category>
        
        <category>gemfile</category>
        
        <category>terminal</category>
        
        
      </item>
    
      <item>
        <title>Publishing your own website with Jekyll</title>
        <description>&lt;p&gt;In a &lt;a href=&quot;https://jtemporal.com/choosing-a-jekyll-theme/&quot;&gt;pro tip, I talked about how using Jekyll&lt;/a&gt; is an excellent idea to get your site online. In this tutorial, we will deploy a website using GitHub, Jekyll, and the terminal.&lt;/p&gt;

&lt;h2 id=&quot;choosing-a-theme&quot;&gt;Choosing a theme&lt;/h2&gt;

&lt;p&gt;The first step is to go to &lt;a href=&quot;http://jekyllthemes.org/&quot;&gt;Jekyll Themes&lt;/a&gt; and choose a theme you like. For this tutorial, I choose &lt;a href=&quot;http://jekyllthemes.org/themes/fresh/&quot;&gt;Fresh&lt;/a&gt;, a blog theme, with not only the posts listing but also some extra pages like “About” and “Contact”. It’s responsive, which is a significant feature if you take into account that much content today is consumed via mobile devices. Take a look at Fresh’s Demo:
&lt;img src=&quot;https://github.com/artemsheludko/fresh/blob/master/assets/img/fresh.gif?raw=true&quot; alt=&quot;fresh demo&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;preparing-the-environment&quot;&gt;Preparing the environment&lt;/h2&gt;

&lt;p&gt;You’ll need to install (if you haven’t already) the following list of requirements:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ruby&lt;/li&gt;
  &lt;li&gt;Jekyll&lt;/li&gt;
  &lt;li&gt;Git&lt;/li&gt;
  &lt;li&gt;Gem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep in mind that the next steps are tailored for my operating system (Elementary OS), so you may need to adapt those steps for your OS.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edit:&lt;/em&gt; If you are following this tutorial on macOS Catalina, feel free to skip the installation steps below.&lt;/p&gt;

&lt;p&gt;Installing our requirements:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;git
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;ruby-full
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;rubygems       &lt;span class=&quot;c&quot;&gt;# ou rubygems-integration&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;gem &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;jekyll bundler
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Why do we need all this?&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;git&lt;/strong&gt;: We’ll use &lt;a href=&quot;http://github.com/&quot;&gt;GitHub&lt;/a&gt; to host our site, and we need git to do that;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;ruby-full&lt;/strong&gt;: A more stable old version of Ruby. Since Jekyll is a Ruby-built tool, we need it installed on your computer for Jekyll to work;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;rubygems&lt;/strong&gt;: Just like Python’s pip and Node’s npm, there is gem for Ruby dependencies. It’s a package manager, and a necessary requirement it to install Jekyll and the other packages for Fresh to run;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;jekyll&lt;/strong&gt;: The static site generator;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;bundler&lt;/strong&gt;: Is the “inception” of packages, it is a package that controls other packages, it controls versions of packages and their dependencies on projects.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;downloading-the-theme&quot;&gt;Downloading the theme&lt;/h2&gt;

&lt;p&gt;For those who are already used to Git, I think this part will be quite straightforward. The &lt;a href=&quot;https://github.com/artemsheludko/fresh&quot;&gt;link to the repository is this one&lt;/a&gt;. For those who are not used the steps are these:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git clone https://github.com/artemsheludko/fresh.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: Here, I prefer to clone on purpose, but for those who are more intimate with Git and its processes, you can go ahead and fork it. In this tutorial, I’m cloning it because sometimes, when opening a pull request, you might end up opening one to the original repository instead of your own copy. To avoid that, and make things easier for git beginners, let’s go with cloning.&lt;/p&gt;

&lt;h2 id=&quot;running-the-project&quot;&gt;Running the project&lt;/h2&gt;

&lt;p&gt;After cloning is time to run this, right?! The steps below will serve your site locally:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;fresh
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bundle &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/Cxh1nNO.png&quot; alt=&quot;Terminal running fresh locally&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; if by any chance you don’t have a Gemfile in the theme you picked, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; step won’t work, I recommend you read &lt;a href=&quot;https://jtemporal.com/rb-project-dep-gemfile/&quot;&gt;this Gemfile pro-tip&lt;/a&gt; to understand a little bit more about Gemfiles and how to create your own.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note 2:&lt;/em&gt; If you following this tutorial on macOS Catalina you may run into a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Invalid date&lt;/code&gt; error, &lt;a href=&quot;https://jtemporal.com/fixing-date-error-while-running-jekyll-on-macos-catalina/&quot;&gt;this pro-tip explains how to fix it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now go to your favorite browser and go to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:4000/fresh/&lt;/code&gt;. Cool, huh?! 🎉&lt;/p&gt;

&lt;p&gt;All right, let’s understand what we just did:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;bundle install&lt;/strong&gt;: This command will look in your Gemfile and Gemfile.lock for package names and versions to install the necessary dependencies to run the project, that’s why if you don’t have a Gemfile this step doesn’t work;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;bundle exec jekyll serve&lt;/strong&gt;: This is the command runs the Jekyll server allowing you to see your site on your browser. Every time you run this command, the site is built.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To stop the server just hit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl + c&lt;/code&gt;, you will need the server offline for the configuration steps.&lt;/p&gt;

&lt;h2 id=&quot;configuration-file&quot;&gt;Configuration file&lt;/h2&gt;

&lt;p&gt;Let’s start with the configuration. Most themes rely on the configuration file to “fill the blanks” on the site. This makes the templates easily adaptable; you just have to change the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; to change things such as the site title, author, and so on.&lt;/p&gt;

&lt;p&gt;Open the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; file in your favorite editor, and let’s update it. To see changes to the site, whenever you change &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;, you’ll need to stop and restart the Jekyll server. Since the server relies on the configuration file to build everything, this is the only file that you need to restart the server every time you want to see the changes you made take place.&lt;/p&gt;

&lt;h3 id=&quot;profile-info&quot;&gt;Profile Info&lt;/h3&gt;

&lt;p&gt;In this part goes the initial information:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The title (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;title&lt;/code&gt;): The name that appears when you open a tab in the browser;&lt;/li&gt;
  &lt;li&gt;Name (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;name&lt;/code&gt;): usually something descriptive of what your blog is about;&lt;/li&gt;
  &lt;li&gt;The description (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt;): which goes inside the HTML and when someone shares your blog is this description that appears, it also helps to put your site in search results like Google and DuckDuckGo;&lt;/li&gt;
  &lt;li&gt;The page (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;baseurl&lt;/code&gt;): From which link your site is served, the path to your home&lt;/li&gt;
  &lt;li&gt;The URL (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url&lt;/code&gt;): This is where the domain goes, may it be the one that GitHub Pages makes available (username.github.io) or one that you will buy (as is my case here).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Edit this first block for something like this:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Profile information&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Contos&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Tales&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Um blog com Jekyll&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# a jekyll blog&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;Uma coleção de contos&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;# A collection of tales&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;:title/&apos;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;baseurl&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/blogfresh&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# the subpath of your site, e.g. /blog&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;http://jtemporal.com&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# the base hostname &amp;amp; protocol for your site, e.g. http://example.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Rerun the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle exec jekyll serve&lt;/code&gt; command. This time the site you need to access changed because we changed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;baseurl&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/blogfresh&lt;/code&gt;. Now go to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:4000/blogfresh/&lt;/code&gt; to see the changes. With these changes in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;, the site should look something like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/kut6tWL.png&quot; alt=&quot;blog alterado profile info&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;social&quot;&gt;Social&lt;/h3&gt;

&lt;p&gt;This is where the links to your social networks come from. The ones you don’t want to make available just don’t fill out. Let’s fill the values for the ones I want:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Social&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;facebook&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#Add your Facebook&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;twitter&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#Add your Twitter&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;google-plus&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#Add your Google+&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;github&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;jtemporal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Unfortunately, this theme does not “hide” the buttons for social networks that do not have a valid username/link. I’ll write a post on how to do that soon.&lt;/p&gt;

&lt;h3 id=&quot;contact-form&quot;&gt;Contact Form&lt;/h3&gt;

&lt;p&gt;If you want people to contact you through the site contact form, just uncomment them and put your email address in place of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;your-email@domain.com&lt;/code&gt;. Since I do not like receiving emails, I left it commented &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;¯\_(ツ)_/¯&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Contact form&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#your-email@domain.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;comments&quot;&gt;Comments&lt;/h3&gt;

&lt;p&gt;That’s a fun part, comments on your posts! If you don’t know &lt;a href=&quot;http://disqus.com/&quot;&gt;Disqus&lt;/a&gt; yet, it’s a platform that helps increase engagement on your site. It allows people to comment on your blog in a relatively easy way. Create an account and place your identifier here:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Comments&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;discus-identifier&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jtemporal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After restarting the server for the configuration file changes to take effect, you should have an area that looks like the image below at the end of each post:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/3Lc0O9q.png&quot; alt=&quot;area de comentarios disqus&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;pagination&quot;&gt;Pagination&lt;/h3&gt;

&lt;p&gt;This is where you define how many posts appear per page on your site:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Posts per page (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;paginate&lt;/code&gt;): how many blog posts appear on each page;&lt;/li&gt;
  &lt;li&gt;Page URL (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;paginate_path&lt;/code&gt;): This variable defines how the URLs of a specific page will be generated, for example, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blog/page2/index.html&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Paginate&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;paginate&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;paginate_path&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/page:num/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;build-settings&quot;&gt;Build settings&lt;/h3&gt;

&lt;p&gt;Here you will not need to change anything, but it is good to understand what each of these things means, right?!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Markdown Renderer (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;markdown&lt;/code&gt;): Here, you can choose which Markdown renderer to use. The default is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kramdown&lt;/code&gt;;&lt;/li&gt;
  &lt;li&gt;Gems needed for this theme (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gems&lt;/code&gt;): here is a list of gems that need to be installed;&lt;/li&gt;
  &lt;li&gt;Exclude directories and files (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exclude&lt;/code&gt;): These are files and directories to be disregarded when generating site pages;&lt;/li&gt;
  &lt;li&gt;Include files and directories (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;include&lt;/code&gt;): These are files and directories to consider when building site pages; if you want to serve a file, let’s say a PDF file, you must include it in this list.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Build settings&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;markdown&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kramdown&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;gems&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jekyll-feed&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jekyll-paginate&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;exclude&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Gemfile&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Gemfile.lock&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;_pages&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When you finish fixing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;, remember to commit the changes! Committing everything is a necessary step to guarantee that what you see on your computer is what everyone accessing your site on the internet is seeing. I will assume you’ll commit every step from now on 😉&lt;/p&gt;

&lt;h2 id=&quot;posts&quot;&gt;Posts&lt;/h2&gt;

&lt;p&gt;Fresh, as well as all other themes available, provide examples of posts. The first thing you’ll notice when opening one of them in the text editor is that it has a kind of header known as &lt;a href=&quot;https://jekyllrb.com/docs/frontmatter/&quot;&gt;Front Matter&lt;/a&gt;. We use the Front Matter to set values to things like the post title, date of publication, and so on.&lt;/p&gt;

&lt;h3 id=&quot;understanding-the-front-matter&quot;&gt;Understanding the Front Matter&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;layout&lt;/code&gt;: Jekyll sees all blog pages as a blog post that it needs to render, including About, Contact and Home pages, so the layout tag is used to differentiate rendering, the options for fresh are: post or default;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;title&lt;/code&gt;:  The title of the post;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;date&lt;/code&gt;: The date and time of publication following &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YYYY-MM-DD HH:MM:SS&lt;/code&gt; format. You can still set the time zone of the article using this field;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt;: Each blog post can have a synopsis paragraph in the post listing. This is where this synopsis goes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;first-post&quot;&gt;First post&lt;/h4&gt;

&lt;p&gt;Let’s create a new post from scratch and put it on the site. Create a file inside the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_posts&lt;/code&gt; directory:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;touch &lt;/span&gt;_posts/2018-01-07-hello-world.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It is customary to use the pattern &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YYYY-MM-DD-post-name.md&lt;/code&gt; in file names. Remember that it is from the filename that the URLs will be generated for each post, so choose your file names carefully.&lt;/p&gt;

&lt;p&gt;Open the file we just created, paste the following Front Matter and content:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;---
layout: post
title:  &quot;Olá mundo&quot;
date:   2018-01-07 00:00:00
description: Primeiro blogpost
---

Olá mundo!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If the Jekyll server is not running, start it. If you already got the server running after you create and save the file, Jekyll will automatically generate the HTML of this new post. Go to the browser and reload the page. Et voilà!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/z528dqZ.png&quot; alt=&quot;Primeiro blogpost&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Remember to commit this file.&lt;/p&gt;

&lt;h2 id=&quot;publishing-the-site&quot;&gt;Publishing the site&lt;/h2&gt;

&lt;p&gt;Well, since at the beginning of this tutorial, we did a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git clone&lt;/code&gt;, all links from this repository are with the parent repository. What does that mean? Git repositories communicate with GitHub (or any other provider) through what we call a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remote&lt;/code&gt;. I will not go into details of how remotes work in this post, but you can read more about it &lt;a href=&quot;https://git-scm.com/docs/git-remote&quot;&gt;in the official Git documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here we will do some steps through the GitHub site, others in the terminal to make sure you can publish your code to the correct repository.&lt;/p&gt;

&lt;h3 id=&quot;terminal-first-stage&quot;&gt;Terminal: First stage&lt;/h3&gt;

&lt;p&gt;The terminal commands happen in two phases, the first one here is to rename the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remote&lt;/code&gt; from the original repository to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;upstream&lt;/code&gt; this is useful as you can use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;upstream&lt;/code&gt; to update your theme code.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git remote rename origin upstream
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After that, we should open the GitHub interface on the browser.&lt;/p&gt;

&lt;h3 id=&quot;github&quot;&gt;GitHub&lt;/h3&gt;

&lt;p&gt;I’m considering you already have a GitHub account, &lt;a href=&quot;https://github.com/join%3Fsource%3Dheader-home&quot;&gt;if you don’t have an account, create one, it’s quick&lt;/a&gt;. For the following steps, I will show you two versions, one for those who &lt;strong&gt;already have a website&lt;/strong&gt; published (like me) and one for those who are publishing a website &lt;strong&gt;for the first time&lt;/strong&gt;. Follow the steps which best describe your setup.&lt;/p&gt;

&lt;h4 id=&quot;my-first-website&quot;&gt;My first website&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/new&quot;&gt;Creating a new repository&lt;/a&gt; because this is your first site on GitHub, this repository needs to have a unique name following the pattern &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;my-username.github.io&lt;/code&gt;:
&lt;img src=&quot;https://i.imgur.com/2vOk9OJ.png&quot; alt=&quot;foto do repo username.github.io&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;Copy the instructions that come in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;...or push an existing repository from the command line&lt;/code&gt;:
&lt;img src=&quot;https://i.imgur.com/me5fQgM.png&quot; alt=&quot;instruçoes de remote primeiro site&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;i-already-have-a-website&quot;&gt;I already have a website&lt;/h4&gt;

&lt;p&gt;For those who already have a website on GitHub, this new repository will be one page of your current site. For example, I have this site here &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://jtemporal.com&lt;/code&gt;, and this new blog will become this page &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://jtemporal.com/blogfresh&lt;/code&gt;. The same pattern repeats if you don’t have a custom domain, your site will look something like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://jtemporal/github.io/blogfresh&lt;/code&gt;. The steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/new&quot;&gt;Create a new repository&lt;/a&gt;: follow the image below, you do not need to configure anything else, and remember that here I gave the same name that is in my &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;baseurl&lt;/code&gt; there in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;:
&lt;img src=&quot;https://i.imgur.com/EX0HGFq.png&quot; alt=&quot;criando novo repo no gihub&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;Copy the instructions that come in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;...or push an existing repository from the command line&lt;/code&gt; area:
&lt;img src=&quot;https://i.imgur.com/kcFTVrk.png&quot; alt=&quot;instruçoes de remote&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;terminal-second-stage&quot;&gt;Terminal: Second stage&lt;/h3&gt;

&lt;p&gt;Now that we have a place to send the code, we go back to the terminal to complete the second stage of the terminal commands and send our code to GitHub to actually get the site online. Paste the commands you copied from the GitHub interface:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git remote add origin git@github.com:jtemporal/blogfresh.git
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ou: git remote add origin git@github.com:jtemporal/jtemporal.github.io.git
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git push &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; origin master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;github-the-return&quot;&gt;GitHub: The Return&lt;/h3&gt;

&lt;p&gt;After sending the code to GitHub, we need to configure the site through the GitHub interface! Let’s start by going to the repository &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Settings&lt;/code&gt; tab:
&lt;img src=&quot;https://i.imgur.com/f3rxngC.png&quot; alt=&quot;aba de configurações&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Scrolling down on the settings page, you’ll see the GitHub Pages section. It is this section that we use to publish the site:
&lt;img src=&quot;https://i.imgur.com/7brruPu.png&quot; alt=&quot;seção GitHub Pages&quot; /&gt;&lt;/p&gt;

&lt;p&gt;When &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;None&lt;/code&gt; is selected in the Source area, GitHub Pages is disabled. So let’s choose a branch to publish our website from, in this case, the branch will be the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;master&lt;/code&gt; itself:
&lt;img src=&quot;https://i.imgur.com/fFh4CN0.png&quot; alt=&quot;selecionando o ramo de publicacao&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And now click on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Save&lt;/code&gt;:
&lt;img src=&quot;https://i.imgur.com/60Li2Ww.png&quot; alt=&quot;clique em save&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And the result will look something like this:&lt;img src=&quot;https://i.imgur.com/BRM01sH.png&quot; alt=&quot;site publicado&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Just access the site link in the blue notification, and that should take you to your site 😉&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And now what?&lt;/em&gt; Well, now you can start writing other posts and committing them. Every commit/pull request to master will &lt;em&gt;automagically&lt;/em&gt; execute the site build and deploy steps. Happy blogging! 🎉&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links-and-considerations&quot;&gt;Links and Considerations&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;There are other ways to install Ruby on your machine, find them listed in &lt;a href=&quot;https://www.ruby-lang.org/en/documentation/installation/&quot;&gt;the Ruby documentation&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bundler.io/&quot;&gt;Bundler&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;I used Git commands for SSH keys if you prefer you can use the same commands using HTTPS access, adjust accordingly. If you want to use SSH just like me you will need keys, &lt;a href=&quot;https://help.github.com/articles/connecting-to-github-with-ssh/&quot;&gt;these GitHub tutorials teach you how to generate and use them&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 07 Jan 2018 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/publishing-a-website-with-jekyll/</link>
        <guid isPermaLink="true">https://jtemporal.com/publishing-a-website-with-jekyll/</guid>
        
        <category>tutorial</category>
        
        <category>jekyll</category>
        
        <category>ruby</category>
        
        <category>terminal</category>
        
        <category>site</category>
        
        <category>github pages</category>
        
        <category>github</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Colocando um site no ar com Jekyll</title>
        <description>&lt;p&gt;Numa &lt;a href=&quot;http://jtemporal.com/temas-jekyll/&quot;&gt;colinha eu falei sobre como usar Jekyll&lt;/a&gt; é uma boa ideia para ter o seu site no ar vamos ao exemplo prático usando o terminal. O objetivo aqui é ter um site no ar, então vamos lá.&lt;/p&gt;

&lt;h2 id=&quot;escolhendo-um-tema&quot;&gt;Escolhendo um tema&lt;/h2&gt;

&lt;p&gt;Vá até o &lt;a href=&quot;http://jekyllthemes.org/&quot;&gt;Jekyll Themes&lt;/a&gt; e escolha um tema. Eu escolhi pra hoje o &lt;a href=&quot;http://jekyllthemes.org/themes/fresh/&quot;&gt;Fresh&lt;/a&gt;. Fresh é tema de um blog, com algumas páginas extras como “Sobre” e “Contato”. Além disso ele é responsivo, considerando que muito conteudo hoje é consumido pelos smartphones e tablets por aí essa é uma capacidade que queremos. Dá uma olhada na Demo do Fresh:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/artemsheludko/fresh/blob/master/assets/img/fresh.gif?raw=true&quot; alt=&quot;fresh demo&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;preparando-o-ambiente&quot;&gt;Preparando o ambiente&lt;/h2&gt;

&lt;p&gt;Precisaremos instalar (caso ainda não tenha) a seguinte listinha:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ruby&lt;/li&gt;
  &lt;li&gt;Jekyll&lt;/li&gt;
  &lt;li&gt;Git&lt;/li&gt;
  &lt;li&gt;Gem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os passos a seguir são para o meu sistema operacional (Elementary OS), tenha isso em mente quando for reproduzir os passos aqui, pois pode ser que tenha variações para o seu OS.&lt;/p&gt;

&lt;p&gt;Vamos as intalações.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;git
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;ruby-full
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;rubygems       &lt;span class=&quot;c&quot;&gt;# ou rubygems-integration&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;gem &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;jekyll bundler
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pra que tudo isso?&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;git&lt;/strong&gt;: vamos precisar colocar o site no &lt;a href=&quot;http://github.com/&quot;&gt;GitHub&lt;/a&gt; para servi-lo;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;ruby-full&lt;/strong&gt;: uma versão antiga mais estável do Ruby. Como Jekyll foi feita nessa lingaguem precisamos dela instalada no seu computador;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;rubygems&lt;/strong&gt;: Assim como o pip para Python e o npm para o mundo Node, existe o gem para ruby. Ele é um gerenciador de pacotes e ele que precisaremos para instalar jekyll e os demais pacotes para o Fresh;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;jekyll&lt;/strong&gt;: O pacote do momento;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;bundler&lt;/strong&gt;: No melhor esquema Inception o bundler é um pacote que controla outros pacotes, ele controla versões dos pacotes e suas dependências nos projetos.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;baixando-o-tema&quot;&gt;Baixando o tema&lt;/h2&gt;

&lt;p&gt;Pra quem já tá acostumado com Git acho que essa parte vai ser tranquila. O &lt;a href=&quot;https://github.com/artemsheludko/fresh&quot;&gt;link para o repositório é esse aqui&lt;/a&gt;. Pra quem não está acostumado os passos são esses:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git clone https://github.com/artemsheludko/fresh.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nota: Aqui eu preferi fazer um &lt;em&gt;clone&lt;/em&gt; propositalmente, porém para aqueles mais íntimos do Git e de seus processos pode fazer um &lt;em&gt;fork&lt;/em&gt; mesmo. Nesse caso escolhi o clone pois já vi (e já aconteceu comigo também) que ao tentar usar os bons hábitos de abrir &lt;em&gt;pull requests&lt;/em&gt; na sua própria rotina de publicação, mandar o PR para o repositório original ao invés de fazer no seu mesmo.&lt;/p&gt;

&lt;h2 id=&quot;rodando-o-projeto&quot;&gt;Rodando o projeto&lt;/h2&gt;

&lt;p&gt;Depois de clonar é hora de colocar isso pra rodar né mesmo?! Então vamos lá, os passos abaixo vão deixar o seu site sendo servido localmente. Vamos a eles:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;fresh
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bundle &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/Cxh1nNO.png&quot; alt=&quot;Foto do terminal servindo o fresh&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Observação&lt;/em&gt;: se por acaso você não possui uma Gemfile no seu tema, os passos acima não vão funcionar, &lt;a href=&quot;http://jtemporal.com/gemfile/&quot;&gt;da uma lida aqui nessa colinha sobre a Gemfile&lt;/a&gt; pra entender um pouquinho mais sobre isso ;)&lt;/p&gt;

&lt;p&gt;Agora vá até o seu navegador favorito e acesse &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:4000/fresh/&lt;/code&gt;. Massa né?!&lt;/p&gt;

&lt;p&gt;Muito bem, vamos entender o que acabamos de fazer:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;bundle install&lt;/strong&gt;: O bundle é um comando que vai procurar na sua Gemfile e a Gemfile.lock os nomes e versões dos pacotes para instalar as dependências necessárias para rodar projeto;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;bundle exec jekyll serve&lt;/strong&gt;: Esse aqui é o que faz o trabalho de ajustar o ambiente para rodar o servidor Jekyll. Além disso, toda vez que você roda esse comando é feito o build do site.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para parar o servidor basta apertar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl + c&lt;/code&gt;, você vai precisar disso para os próximos passos.&lt;/p&gt;

&lt;h2 id=&quot;arquivo-de-configuração&quot;&gt;Arquivo de configuração&lt;/h2&gt;

&lt;p&gt;Vamos começar pela configuração pois, é no arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; que moram as informações como título do site, autor e por aí vai.&lt;/p&gt;

&lt;p&gt;Abra o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; no seu editor favorito e vamos alterar e entender ele aos pouquinhos. Para ver as alterações no site, sempre que você mudar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; você precisará parar e reiniciar o servidor do Jekyll.&lt;/p&gt;

&lt;h3 id=&quot;informações-de-perfil&quot;&gt;Informações de perfil&lt;/h3&gt;

&lt;p&gt;Nessa parte vão as informações iniciais:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;O título (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;title&lt;/code&gt;): que o nome que aparece quando você abre uma aba no navegador;&lt;/li&gt;
  &lt;li&gt;O nome (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;name&lt;/code&gt;): geralmente algo descritivo do que o seu blog vai abordar;&lt;/li&gt;
  &lt;li&gt;A descrição (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt;): que vai dentro do HTML e quando alguém compartilhar o seu blog é essa descrição que aparece, isso também ajuda a colocar o seu site nos resultados de buscas como Google e o DuckDuckGo;&lt;/li&gt;
  &lt;li&gt;A URL de base (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;baseurl&lt;/code&gt;): a partir de que link o seu site é servido, o caminho para a sua “home”&lt;/li&gt;
  &lt;li&gt;A URL (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url&lt;/code&gt;): aqui é onde vai o domínio seja ele aquele que o GitHub Pages disponibiliza (username.github.io) ou um que você venha a comprar (como é o meu caso aqui).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Edite esse primeiro bloco para algo parecido com isso:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Profile information&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Contos&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Um blog com Jekyll&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;Uma coleção de contos&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;:title/&apos;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;baseurl&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/blogfresh&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# the subpath of your site, e.g. /blog&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;http://jtemporal.com&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# the base hostname &amp;amp; protocol for your site, e.g. http://example.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Execute novamente o comando do servidor &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle exec jekyll serve&lt;/code&gt;. Dessa vez o site que você precisa acessar mudou pois mudamos o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;baseurl&lt;/code&gt; para &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/blogfresh&lt;/code&gt;. Agora acesse &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:4000/blogfresh/&lt;/code&gt; para ver as mudanças. Com essas alterações no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; o site deve estar parecido com isso:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/kut6tWL.png&quot; alt=&quot;blog alterado profile info&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;social&quot;&gt;Social&lt;/h3&gt;

&lt;p&gt;É aqui que vem os links para suas redes sociais. As que você não quiser deixar disponível basta não preencher. Eu vou ensinar como esconder os botões para as redes sociais que não tiverem um valor aqui em outro blog post, por enquanto vamos colocar apenas uma delas:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Social&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;facebook&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#Add your Facebook&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;twitter&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#Add your Twitter&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;google-plus&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#Add your Google+&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;github&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;jtemporal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Infelizmente esse tema não “esconde” os botões para as redes sociais que não possuem um usuário/link válido.&lt;/p&gt;

&lt;h3 id=&quot;formulário-de-contato&quot;&gt;Formulário de contato&lt;/h3&gt;

&lt;p&gt;Se você quiser que as pessoas entrem em contato com você pelo formulário de contato do site é só remover o comentário e colocar o seu e-mail no lugar de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;your-email@domain.com&lt;/code&gt;. Como eu não curto receber e-mail deixei comentado mesmo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;¯\_(ツ)_/¯&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Contact form&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#your-email@domain.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;comentários&quot;&gt;Comentários&lt;/h3&gt;

&lt;p&gt;Essa uma parte legal, comentários nos seus posts! Se você não conhece o &lt;a href=&quot;http://disqus.com/&quot;&gt;Disqus&lt;/a&gt; ainda, ele nada mais é do que uma plataforma que ajuda a aumentar o envolvimento nos seus sites. Ele permite de forma relativamente fácil que pessoas comentem no seu blog. Crie uma conta e coloque o seu identficador aqui:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Comments&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;discus-identifier&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jtemporal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Após reiniciar o servidor para que as mudanças do arquivo de configuração façam efeito, você deve ter uma área paracida com a da imagem abaixo no fim de um post:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/3Lc0O9q.png&quot; alt=&quot;area de comentarios disqus&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;paginação&quot;&gt;Paginação&lt;/h3&gt;

&lt;p&gt;É nessa seção que você define quantos posts aparecem por página no seu site:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Posts por página (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;paginate&lt;/code&gt;): quantos blog posts aparecem em cada página;&lt;/li&gt;
  &lt;li&gt;URL de uma página (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;paginate_path&lt;/code&gt;): essa variável define como vão ser geradas as URLs de uma página específica, por exemplo, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blog/page2/index.html&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Paginate&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;paginate&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;paginate_path&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/page:num/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;configurações-de-build&quot;&gt;Configurações de build&lt;/h3&gt;

&lt;p&gt;Aqui você não vai precisar mudar nada, mas é bom entender o que tá rolando né?!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Renderizador de markdown (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;markdown&lt;/code&gt;): aqui você pode escolher que renderizador de Markdown usar. O padrão é o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kramdown&lt;/code&gt;;&lt;/li&gt;
  &lt;li&gt;Gems necessárias para esse tema (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gems&lt;/code&gt;): aqui vai uma lista de gems que precisam ser instaladas;&lt;/li&gt;
  &lt;li&gt;Diretórios e arquivos para exclusão (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exclude&lt;/code&gt;): esses são arquivos e diretórios para serem desconsiderados na hora de gerar as páginas do site;&lt;/li&gt;
  &lt;li&gt;Diretórios e arquivos para inclusão (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;include&lt;/code&gt;): esses são arquivos e diretórios para serem considerados na hora de gerar as páginas do site, se você quiser servir algum arquivo a partir do seu site você deve incluir ele nessa lista.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Build settings&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;markdown&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kramdown&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;gems&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jekyll-feed&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jekyll-paginate&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;exclude&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Gemfile&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Gemfile.lock&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;_pages&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ao terminar de arrumar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; lembre-se de commitar as mudanças! Vou assumir que você fez isso a cada passo daqui pra frente ;)&lt;/p&gt;

&lt;h2 id=&quot;posts&quot;&gt;Posts&lt;/h2&gt;

&lt;p&gt;O Fresh, assim como todos os outros temas disponíveis trazem exemplos de posts. A primeira coisa eu você vai notar ao abrir um deles no editor de texto é que ele tem uma espécie de cabeçalho conhecido como &lt;a href=&quot;https://jekyllrb.com/docs/frontmatter/&quot;&gt;Front Matter&lt;/a&gt;. Lá são definidos coisas como o layout do post, o título, a data de publicação e por aí vai…&lt;/p&gt;

&lt;h3 id=&quot;entendendo-o-front-matter&quot;&gt;Entendendo o Front Matter&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;layout&lt;/code&gt;: O Jekyll enxerga todas as páginas do blog como um blog post que ele precisa renderizar, inclusive as páginas &lt;em&gt;About&lt;/em&gt;, &lt;em&gt;Contact&lt;/em&gt; e &lt;em&gt;Home&lt;/em&gt; então a tag layout é utilizada para diferenciar a renderização, as opções são: post ou default;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;title&lt;/code&gt;: O título da postagem;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;date&lt;/code&gt;: A data e hora da publicação no formato &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AAAA-MM-DD HH:MM:SS&lt;/code&gt; ainda é possível passar o fuso horário da publicação caso queira usando esse campo;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt;: Cada blogpost pode ter um paragrafo de sinopse na listagem de posts. É aqui que essa sinopse vai.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;primeiro-post&quot;&gt;Primeiro post&lt;/h4&gt;

&lt;p&gt;Vamos criar um post novo do zero e colocar no site. Crie um arquivo dentro do diretório &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_posts&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;touch &lt;/span&gt;_posts/2018-01-07-ola-mundo.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;É costumeiro usar o padrão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AAAA-MM-DD-nome-do-post.md&lt;/code&gt; nos nomes dos arquivos. Lembre-se que é apartir do nome do arquivo que vão ser geradas as URLs para cada post.&lt;/p&gt;

&lt;p&gt;Abra o arquivo que acabamos de criar, cole o seguinte Front Matter e conteudo:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;---
layout: post
title:  &quot;Olá mundo&quot;
date:   2018-01-07 00:00:00
description: Primeiro blogpost
---

Olá mundo!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Se o servidor Jekyll não estiver rodando, inicie ele. Se já estiver rodando ao criar e salvar o arquivo dê um tempinho para que ele possa gerar o HTML desse novo post. Vá até o navegador e recarregue a página. Et voilà!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/z528dqZ.png&quot; alt=&quot;Primeiro blogpost&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Commite esse arquivo.&lt;/p&gt;

&lt;h2 id=&quot;publicando-o-site&quot;&gt;Publicando o site&lt;/h2&gt;

&lt;p&gt;Bom, como lá no começo fizemos um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git clone&lt;/code&gt; todas as ligações desse repositório estão com o repositório inicial. Como assim? Os repositórios Git fazem comunicação com o GitHub (ou qualquer outra rede) por meio do que chamamos de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remote&lt;/code&gt;. Não vou entrar em detalhes do funcionamento disso nesse post mas você pode ler mais sobre isso &lt;a href=&quot;https://git-scm.com/docs/git-remote&quot;&gt;na documentação oficial do Git&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Aqui nós vamos fazer alguns passos, alguns deles pelo site do GitHub, outros no terminal mesmo.&lt;/p&gt;

&lt;h3 id=&quot;terminal-primeira-fase&quot;&gt;Terminal: primeira fase&lt;/h3&gt;

&lt;p&gt;Os comandos do terminal acontecem em duas fases, a primeira é essa aqui que consiste em renomear o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remote&lt;/code&gt; do repositório original para &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;upstream&lt;/code&gt; isso é útil pois você pode utilizar o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;upstream&lt;/code&gt; para atualizar o código do seu tema.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git remote rename origin upstream
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Depois disso vamos ao GitHub.&lt;/p&gt;

&lt;h3 id=&quot;github&quot;&gt;GitHub&lt;/h3&gt;

&lt;p&gt;Aqui, assumindo que você já possui uma conta no GitHub, &lt;a href=&quot;https://github.com/join?source=header-home&quot;&gt;caso não tenha é só criar, é rapidinho&lt;/a&gt;. Para os passos a seguir eu vou mostrar duas versões, uma para quem &lt;strong&gt;já tem um site&lt;/strong&gt; publicado (como eu) e uma para quem está publicando um site pela &lt;strong&gt;primeira vez&lt;/strong&gt;.&lt;/p&gt;

&lt;h4 id=&quot;meu-primeiro-site&quot;&gt;Meu primeiro site&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/new&quot;&gt;Criar um repositório novo&lt;/a&gt; como esse é o seu primeiro site, esse repositório precisa ter um nome especial seguindo o padrão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meu-nome-de-usuario.github.io&lt;/code&gt;:
&lt;img src=&quot;https://i.imgur.com/2vOk9OJ.png&quot; alt=&quot;foto do repo username.github.io&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;Copiar as instruções que vem na área &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;...or push an existing repository from the command line&lt;/code&gt;:
&lt;img src=&quot;https://i.imgur.com/me5fQgM.png&quot; alt=&quot;instruçoes de remote primeiro site&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;já-tenho-um-site&quot;&gt;Já tenho um site&lt;/h4&gt;

&lt;p&gt;Pra quem já tem um site no GitHub, esse novo site vai ser uma página do seu site atual. Por exemplo, eu tenho esse site aqui &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://jtemporal.com&lt;/code&gt; e esse blog novo vai virar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://jtemporal.com/blog&lt;/code&gt;. O mesmo padrão se repete se você não tiver um domínio personalizado, seu site ficará algo tipo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://jtemporal/github.io/blogfresh&lt;/code&gt;. Vamos lá:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/new&quot;&gt;Criar um repositório novo&lt;/a&gt;: só seguir a imagem abaixo, você não precisa configurar mais nada, e lembrete que aqui eu dei o mesmo nome que está no meu &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url&lt;/code&gt; lá no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;:
&lt;img src=&quot;https://i.imgur.com/EX0HGFq.png&quot; alt=&quot;criando novo repo no gihub&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;Copiar as instruções que vem na área &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;...or push an existing repository from the command line&lt;/code&gt;:
&lt;img src=&quot;https://i.imgur.com/kcFTVrk.png&quot; alt=&quot;instruçoes de remote&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;terminal-segunda-fase&quot;&gt;Terminal: segunda fase&lt;/h3&gt;

&lt;p&gt;A segunda fase do terminal consiste em mandar o nosso código para o GitHub e colocar o site no ar de fato. Vamos lá que tá quase:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git remote add origin git@github.com:jtemporal/blogfresh.git
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ou: git remote add origin git@github.com:jtemporal/jtemporal.github.io.git
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git push &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; origin master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;github-o-retorno&quot;&gt;GitHub: o retorno&lt;/h3&gt;

&lt;p&gt;Depois de mandar o código para o GitHub agora precisamos configurar o site, simbora!
Vamos começar indo para aba de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Settings&lt;/code&gt; do repositório:
&lt;img src=&quot;https://i.imgur.com/f3rxngC.png&quot; alt=&quot;aba de configurações&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Descendo nessa página de configurações encontramos a seção referente ao GitHub Pages. É essa seção que acaba publicando o site:
&lt;img src=&quot;https://i.imgur.com/7brruPu.png&quot; alt=&quot;seção GitHub Pages&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Quando selecionado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;None&lt;/code&gt; na área de Source, o GitHub Pages está desativado. Então vamos selecionar um ramo para publicar nosso site a partir dele, nesse caso o ramo será o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;master&lt;/code&gt; mesmo:
&lt;img src=&quot;https://i.imgur.com/fFh4CN0.png&quot; alt=&quot;selecionando o ramo de publicacao&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E agora clicar em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Save&lt;/code&gt;:
&lt;img src=&quot;https://i.imgur.com/60Li2Ww.png&quot; alt=&quot;clique em save&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E o resultado será algo parecido com:
&lt;img src=&quot;https://i.imgur.com/BRM01sH.png&quot; alt=&quot;site publicado&quot; /&gt;&lt;/p&gt;

&lt;p&gt;É só acessar o link do site agora que deve estar lá bonitão ;)&lt;/p&gt;

&lt;p&gt;E agora? Bem agora você pode começar a escrever outros posts e ir commitando eles. Todo commit/pull request para a master vai automagicamente executar os passos de build do site e deploy. Happy blogging!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links-e-considerações&quot;&gt;Links e considerações&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Existem outras formas de instalar o Ruby na sua máquina, encontre elas estão listadas na &lt;a href=&quot;https://www.ruby-lang.org/pt/documentation/installation/&quot;&gt;documentação do Ruby em português&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bundler.io/&quot;&gt;Bundler&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Eu usei os comandos do Git para chaves SSH, escolha pessoal minha, se preferir use os mesmos comandos utilizando o acesso via HTTPS. Caso queira utilizar o SSH assim como eu você vai precisar de chaves, &lt;a href=&quot;https://help.github.com/articles/connecting-to-github-with-ssh/&quot;&gt;esses tutoriais do GitHub em inglês ensina como gerá-las e utilizá-las&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Prometo fazer um post explicando como alterar o layout e outras coisas no tema em breve.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 07 Jan 2018 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/do-tema-ao-ar/</link>
        <guid isPermaLink="true">https://jtemporal.com/do-tema-ao-ar/</guid>
        
        <category>tutorial</category>
        
        <category>jekyll</category>
        
        <category>ruby</category>
        
        <category>terminal</category>
        
        <category>site</category>
        
        <category>github pages</category>
        
        <category>github</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Escolhendo um tema Jekyll</title>
        <description>&lt;p&gt;Acho que a maioria dos desenvolvedores que decidem começar um blog encontra-se no dilema: &lt;em&gt;Agora eu sei HTML e CSS e vou fazer o meu blog, ele vai ser super leve e acessível…&lt;/em&gt; e por aí começa a descida pela toca do coelho. Passados três meses o blog pode até estar pronto mas nada ainda foi publicado. Então a colinha de hoje vai pra você que quer colocar conteúdo na nuvem e não se apegar num primeiro momento nas decisões de código.&lt;/p&gt;

&lt;p&gt;Eu devo ter dado essa dica e defendido essa escolha para muitas pessoas que querem começar um blog e não querem se prender as grandes plataformas. Então aqui vai pra você também: Use &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Isso mesmo, uma ferramenta open source escrita em &lt;a href=&quot;http://ruby-lang.org/&quot;&gt;Ruby&lt;/a&gt;, Jekyll é capaz de transformar um monte de arquivos em um website estático pronto para publicação. Okay, okay a essa hora você já deve estar pensando que vai cair naquele dilema de novo de construir do zero mas não, vou te contar um dos motivos que gosto tanto do Jekyll: existe uma plataforma com uma coleção gigantesca de temas já prontos chamada &lt;a href=&quot;http://jekyllthemes.org/&quot;&gt;Jekyll Themes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Esse site aqui, saiu de um tema feito pelo Taylan Tatlı, o &lt;a href=&quot;http://jekyllthemes.org/themes/moon/&quot;&gt;Moon&lt;/a&gt;. Existem temas para todos os gostos, a maioria deles com instruções passo-a-passo de como alterá-lo. Junte isso com o &lt;a href=&quot;https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt; e seu site estará no ar rapidinho.&lt;/p&gt;

&lt;p&gt;Depois de ter colocado no ar você pode começar a fazer melhorias e/ou alterar o seu tema aos pouquinhos. Isso me ajudou no começo pode ser que seja o que você precisa também ;)&lt;/p&gt;

&lt;p&gt;E aí, já escolheu o seu tema?&lt;/p&gt;

&lt;hr /&gt;
</description>
        <pubDate>Sun, 07 Jan 2018 08:00:00 +0000</pubDate>
        <link>https://jtemporal.com/temas-jekyll/</link>
        <guid isPermaLink="true">https://jtemporal.com/temas-jekyll/</guid>
        
        <category>colinha</category>
        
        <category>jekyll</category>
        
        <category>temas</category>
        
        <category>ruby</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Choosing a Jekyll theme</title>
        <description>&lt;p&gt;I think most developers who decide to start a blog find themselves in a dilemma: I know HTML and CSS, and I can make my blog, it is going to be super light and fast… And so begins the descent into the rabbit hole. Three months later, the blog may be ready, but nothing was published. So today’s pro-tip goes to you who wants to put content out there and doesn’t want to get caught up in code decisions at first.&lt;/p&gt;

&lt;p&gt;I must have given this tip and defended this choice to many people who want to start a blog and don’t want to stick to the big platforms. So here it goes for you too: Use &lt;a href=&quot;https://translate.google.com/translate?hl=pt-BR&amp;amp;prev=_t&amp;amp;sl=auto&amp;amp;tl=en&amp;amp;u=https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That’s right, an open-source tool written in &lt;a href=&quot;https://translate.google.com/translate?hl=pt-BR&amp;amp;prev=_t&amp;amp;sl=auto&amp;amp;tl=en&amp;amp;u=http://ruby-lang.org/&quot;&gt;Ruby&lt;/a&gt;, Jekyll can turn many text files into a static website ready for publication. Okay, okay by now, you might be thinking you’re going to fall into that dilemma of building from scratch again, but that’s not the case, one of the reasons I like Jekyll so much is that there’s a platform with a vast collection of ready-made themes called &lt;a href=&quot;https://translate.google.com/translate?hl=pt-BR&amp;amp;prev=_t&amp;amp;sl=auto&amp;amp;tl=en&amp;amp;u=http://jekyllthemes.org/&quot;&gt;Jekyll themes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The first version of this site here came out of a theme made by Taylan Tatlı called &lt;a href=&quot;https://translate.google.com/translate?hl=pt-BR&amp;amp;prev=_t&amp;amp;sl=auto&amp;amp;tl=en&amp;amp;u=http://jekyllthemes.org/themes/moon/&quot;&gt;Moon&lt;/a&gt;. There are so many themes to choose from, that I bet you can find one that suits your needs; most of them with step-by-step instructions on how to customize the theme itself. Put this together with &lt;a href=&quot;https://translate.google.com/translate?hl=pt-BR&amp;amp;prev=_t&amp;amp;sl=auto&amp;amp;tl=en&amp;amp;u=https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt;, and your site will be up and running fast.&lt;/p&gt;

&lt;p&gt;Once you have released your site, you can start making improvements and modifying your theme little by little. Using Jekyll and GitHub Pages helped me, in the beginning, and it may be what you need too ;)&lt;/p&gt;

&lt;p&gt;So, have you chosen your theme?&lt;/p&gt;

&lt;hr /&gt;
</description>
        <pubDate>Sun, 07 Jan 2018 08:00:00 +0000</pubDate>
        <link>https://jtemporal.com/choosing-a-jekyll-theme/</link>
        <guid isPermaLink="true">https://jtemporal.com/choosing-a-jekyll-theme/</guid>
        
        <category>english</category>
        
        <category>theme</category>
        
        <category>pro-tip</category>
        
        <category>protip</category>
        
        <category>jekyll</category>
        
        <category>ruby</category>
        
        
      </item>
    
      <item>
        <title>Dependências de projetos Python: requirements.txt</title>
        <description>&lt;hr /&gt;

&lt;p&gt;Author note: You can &lt;a href=&quot;https://jtemporal.com/requirements-txt-en/&quot;&gt;read this post in English here&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Depois de uma conversa longa outro dia sobre dependências e reprodutibilidade de ambientes, decidi fazer essa colinha pra falar de um arquivo muito frequente nos projetos &lt;a href=&quot;http://python.org/&quot;&gt;Python&lt;/a&gt; que vejo por aí: o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirements.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Um passo comum da configuração de ambientes de desenvolvimento Python é fazer a instalação de dependências. Muitas vezes esse passo é executado da seguinte forma:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Mas o que é de fato esse arquivo? Segundo a &lt;a href=&quot;https://pip.pypa.io/en/stable/user_guide/#requirements-files&quot;&gt;documentação do pip sobre arquivos requirement&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Requirements files” are files containing a list of items to be installed using pip install&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ou seja, esse arquivo nada mais é do que um arquivo de texto, contendo uma lista de itens/pacotes para serem instalados durante o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip install&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;vamos-a-um-exemplo&quot;&gt;Vamos a um exemplo&lt;/h2&gt;

&lt;p&gt;Considerando esse &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirements.txt&lt;/code&gt; aqui:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;1    -e git+https://github.com/jtemporal/caipyra.git@master#egg=caipyra
3    seaborn==0.8.1
2    pandas&amp;gt;=0.18.1
4    serenata-toolbox
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Temos várias informações importantes, vamos repassá-las linha a linha:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;-e git+https://github.com/jtemporal/caipyra.git@master#egg=caipyra&lt;/strong&gt;: Dessa forma conseguimos instalar pacotes Python que estejam disponíveis no GitHub mas não no PyPI. Essa é uma dica muito legal quando por exemplo, você precisa da versão em desenvolvimento de um biblioteca ou quando você prefere usar um fork no lugar da versão tradicional do pacote.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;seaborn==0.8.1&lt;/strong&gt;: No caso do seaborn, estamos instalando a versão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0.8.1&lt;/code&gt;. Fixar a versão dessa forma é interessante pois garante que o seu projeto vai sempre estar funcionando já que mudanças nos pacotes são indicadas pela alteração no número da versão.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;pandas&amp;gt;=0.18.1&lt;/strong&gt;: Da mesma forma que o sinal de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;==&lt;/code&gt; define uma versão específica a ser instalada, quando usamos o sinal de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;=&lt;/code&gt; nessa lista estamos dizendo que queremos instalar qualquer versão da biblioteca, nesse caso o pandas, seja ela a versão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0.18.1&lt;/code&gt; ou uma mais recente. Interessante nesse caso é notar que você pode definir um intervalo de versões, por exemplo, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pandas&amp;gt;=0.15.0,&amp;lt;=0.18.1&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;serenata-toolbox&lt;/strong&gt;: Quando não específicamos uma versão, o pip sempre tentará instalar a versão mais recente do pacote especificado.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;criando-seu-requirementstxt&quot;&gt;Criando seu requirements.txt&lt;/h2&gt;

&lt;p&gt;Um jeito simples de criar o seu próprio arquivo de depências é usando o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip freeze&lt;/code&gt; da seguinte forma:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip freeze &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip freeze&lt;/code&gt; lista no terminal os pacotes Python instalados no seu ambiente já no formato que o pip install consegue entender, ao associá-lo com o operardor de redireção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;&lt;/code&gt; você consegue escrever a mesma lista que aparece no terminal dentro do arquivo de texto.&lt;/p&gt;

&lt;p&gt;Massa né? Agora é só criar arquivos de dependências para todos projetos 😜&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/caipyra&quot;&gt;Caipyra&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://pandas.pydata.org/&quot;&gt;pandas&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://seaborn.pydata.org/&quot;&gt;seaborn&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/datasciencebr/serenata-toolbox&quot;&gt;serenata-toolbox&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Artigo em inglês sobre &lt;a href=&quot;https://unix.stackexchange.com/questions/159513/what-are-the-shells-control-and-redirection-operators&quot;&gt;operadores de controle e redireção&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;agradecimentos&quot;&gt;Agradecimentos&lt;/h2&gt;

&lt;p&gt;Obrigada aos amigos que participaram da conversa sobre dependências e reproducibilidade de ambientes &amp;lt;3&lt;/p&gt;
</description>
        <pubDate>Sat, 06 Jan 2018 08:00:00 +0000</pubDate>
        <link>https://jtemporal.com/requirements-txt/</link>
        <guid isPermaLink="true">https://jtemporal.com/requirements-txt/</guid>
        
        <category>colinha</category>
        
        <category>python</category>
        
        <category>requirements</category>
        
        <category>dependências</category>
        
        <category>versões</category>
        
        <category>versoes</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Python project dependencies: requirements.txt</title>
        <description>&lt;p&gt;After a long conversation the other day about dependencies and environments reproducibility, I decided to make this post to talk about a very common file in &lt;a href=&quot;http://python.org/&quot;&gt;Python&lt;/a&gt; projects that I see all around: the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirements.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A common step in setting up Python development environments is to install dependencies. This step is often performed as follows:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But what is this file really? According to &lt;a href=&quot;https://pip.pypa.io/en/stable/user_guide/#requirements-files&quot;&gt;pip documentation on requirement files&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Requirements files” are files containing a list of items to be installed using pip install&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is, this file is nothing more than a text file, containing a list of packages to be installed during &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip install&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;lets-go-to-an-example&quot;&gt;Let’s go to an example&lt;/h2&gt;

&lt;p&gt;Considering this requirements.txt here:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;1 -e git+https://github.com/jtemporal/caipyra.git@master#egg=caipyra
3 seaborn==0.8.1
2 pandas&amp;gt;=0.18.1
4 serenata-toolbox
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We have several important information, let’s go over it line by line:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;-e git+https://github.com/jtemporal/caipyra.git@master#egg=caipyra&lt;/strong&gt;: This way we were able to install Python packages that are available on GitHub but not on PyPI. This is a really cool tip when, for example, you need the development version of a library or when you prefer to use a fork instead of the traditional version of the package.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;seaborn==0.8.1&lt;/strong&gt;: We are installing version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0.8.1&lt;/code&gt; of seaborn package. Fixing the version in this way is interesting because it ensures that your project will always be working since changes in the packages are indicated by the change in the version number.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;pandas&amp;gt;=0.18.1&lt;/strong&gt;: In the same way that the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;==&lt;/code&gt; sign defines a specific version to be installed, when we use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;=&lt;/code&gt; sign in this list, we are saying that we want to install a version of the library higher that is equals to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0.18.1&lt;/code&gt; or higher than that. Interesting in this case is to note that you can define a range of versions, for example, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pandas&amp;gt;=0.15.0, &amp;lt;=0.18.1&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;serenata-toolbox&lt;/strong&gt;: When we don’t specify a version, pip will always try to install the latest version available of the specified package.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;creating-your-requirementstxt&quot;&gt;Creating your requirements.txt&lt;/h2&gt;

&lt;p&gt;A simple way to create your own requirements file is to use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip freeze&lt;/code&gt; command as follows:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip freeze &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip freeze&lt;/code&gt; lists the Python packages installed in your environment in the terminal already in the format that the pip install can understand, by associating it with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;&lt;/code&gt; redirection operator you can write the same list that appears in the terminal inside the text file.&lt;/p&gt;

&lt;p&gt;Awesome right? Now just create dependency files for all projects 😜&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jtemporal/caipyra&quot;&gt;Caipyra&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://pandas.pydata.org/&quot;&gt;pandas&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://seaborn.pydata.org/&quot;&gt;seaborn&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/datasciencebr/serenata-toolbox&quot;&gt;serenata-toolbox&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;A post on &lt;a href=&quot;https://unix.stackexchange.com/questions/159513/what-are-the-shells-control-and-redirection-operators&quot;&gt;control and redirection operators&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;thanks&quot;&gt;Thanks&lt;/h2&gt;

&lt;p&gt;Thanks to friends who participated in the conversation about dependencies and environments reproducibility &amp;lt;3&lt;/p&gt;
</description>
        <pubDate>Sat, 06 Jan 2018 08:00:00 +0000</pubDate>
        <link>https://jtemporal.com/requirements-txt-en/</link>
        <guid isPermaLink="true">https://jtemporal.com/requirements-txt-en/</guid>
        
        <category>protip</category>
        
        <category>python</category>
        
        <category>requirements</category>
        
        <category>dependencies</category>
        
        <category>versioning</category>
        
        <category>versions</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Forçando o rebuild de sites Jekyll hospedados no GitHub</title>
        <description>&lt;p&gt;Seja por um CSS quebrado ou por uma mudança que parece não ter tido efeito, às vezes é necessário forçar o rebuild de um site &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; hospedado no GitHub. A colinha de hoje explica uma forma de fazer isso.&lt;/p&gt;

&lt;p&gt;O GitHub possui um “serviço” para servir páginas a partir de repositórios chamado de &lt;a href=&quot;https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt;. Esse serviço permite que você crie páginas quase que instantaneamente a partir do seu repositório e tudo que você precisa é de um arquivo markdown como o README de um projeto e um arquivo de configuração básica.&lt;/p&gt;

&lt;p&gt;Isso é possível pois o GitHub Pages usa o Jekyll, um gerador de site estático open source, para fazer o build de sites. Entre outras facilidades que não vou falar hoje, um ponto extremamente positivo de usar essas duas ferramentas para colocar o seu site no ar é que você não precisa “subir” para o GitHub um build do seu site toda vez que quiser publicar uma mudança, o próprio GitHub se encarrega do build para você.&lt;/p&gt;

&lt;p&gt;Porém algumas vezes é necessário rodar o processo de build novamente e como esse processo acontece nos servidores do GitHub que nós não temos acesso, precisamos de outras formas de forçar o build.&lt;/p&gt;

&lt;p&gt;Uma delas e a que eu uso hoje em dia é fazer um commit “vazio”, ou seja, um commit que não carrega mudanças em arquivo algum do seu diretório.&lt;/p&gt;

&lt;p&gt;Basta ir para o diretório do site (aqui vou usar o do meu site como exemplo):&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;jtemporal.github.io
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;e escrever um commit usando a opção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--allow-empty&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;~/jtemporal.github.io $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git commit &lt;span class=&quot;nt&quot;&gt;--allow-empty&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Forçando o rebuild&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;ou se preferir editar a mensagem do commit no editor de texto:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;~/jtemporal.github.io $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git commit &lt;span class=&quot;nt&quot;&gt;--allow-empty&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E é isso. Isso é o suficiente para forçar o processo do build novamente. Massa né? 😜&lt;/p&gt;

&lt;hr /&gt;
</description>
        <pubDate>Wed, 03 Jan 2018 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/force-rebuild-jekyll/</link>
        <guid isPermaLink="true">https://jtemporal.com/force-rebuild-jekyll/</guid>
        
        <category>colinha</category>
        
        <category>jekyll</category>
        
        <category>build</category>
        
        <category>rebuild</category>
        
        <category>github pages</category>
        
        <category>github</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Python e suas versões: pyenv parte 2</title>
        <description>&lt;p&gt;A colinha de hoje é inspirada nesse tweet aqui:&lt;/p&gt;

&lt;center&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;pt&quot;&gt;&lt;p lang=&quot;pt&quot; dir=&quot;ltr&quot;&gt;como ele funciona a respeito dos pacotes instalados via pip? tem um pip pra cada versão? os pacotes ficam disponíveis pra múltiplas versões?&lt;/p&gt;— luciano ratamero (@lucianoratamero) &lt;a href=&quot;https://twitter.com/lucianoratamero/status/947291620109639680?ref_src=twsrc%5Etfw&quot;&gt;31 de dezembro de 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/center&gt;

&lt;p&gt;Então se você já instalou o &lt;a href=&quot;https://github.com/pyenv/pyenv&quot;&gt;pyenv&lt;/a&gt; e agora quer saber um pouqinho mais sobre como ele funciona assim como o Luciano, aqui vai…&lt;/p&gt;

&lt;h2 id=&quot;o-pip&quot;&gt;O pip&lt;/h2&gt;

&lt;p&gt;Pra quem não sabe o que é o &lt;a href=&quot;https://pip.pypa.io/en/stable/&quot;&gt;pip&lt;/a&gt; ele é a ferramenta recomendada para fazer a instalação de pacotes Python.&lt;/p&gt;

&lt;h2 id=&quot;onde-vão-as-versões-do-pyenv&quot;&gt;Onde vão as versões do pyenv&lt;/h2&gt;

&lt;p&gt;Dentro do diretório/pasta do pyenv temos um diretório chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;versions&lt;/code&gt; e é lá que moram as versões que você instala usando o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyenv install&lt;/code&gt;, na minha máquina eu tenho três versões do Python instaladas:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;versions
├── 2.7.12
├── 3.3.0
└── 3.6.4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;o-pyenv-e-o-pip&quot;&gt;O pyenv e o pip&lt;/h2&gt;

&lt;p&gt;Cada nova versão do Python que você instala usando o pyenv vem com o seu próprio pip. Veja:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/HoWFDf8.png&quot; /&gt;
&lt;br /&gt;
&lt;i&gt;Listagem de pacotes instalados em cada versão&lt;/i&gt;
&lt;/center&gt;
&lt;p&gt;Agora, se você setar uma versão do Python usando pyenv e instalar um pacote usando o pip o que acontece? Esse pacote fica disponível para as demais versões?&lt;/p&gt;

&lt;p&gt;Resposta rápida: Não, um pacote instalado numa versão não fica disponível noutra versão.&lt;/p&gt;

&lt;p&gt;Vejamos, vamos usar de exemplo o pacote do &lt;a href=&quot;https://github.com/jtemporal/caipyra&quot;&gt;Caipyra&lt;/a&gt;. Antes de instalá-lo temos:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/VxQK3Hn.png&quot; /&gt;
&lt;br /&gt;
&lt;i&gt;Listagem de pacotes instalados em cada versão&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Instalando o caipyra na versão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.3.0&lt;/code&gt;:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/YV5bJD6.png&quot; /&gt;
&lt;br /&gt;
&lt;i&gt;Instalação do pacote Caipyra na versão 3.3.0&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Listando novamente os pacotes instalados em cada versão:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/xBOnYD1.png&quot; /&gt;
&lt;br /&gt;
&lt;i&gt;Listagem de pacotes instalados em cada versão&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;E finalmente o teste para ver se o pacote fica disponível ou não para outras versões:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/SmUqbsm.png&quot; /&gt;
&lt;br /&gt;
&lt;i&gt;Rodando o import caipyra em todas as versões&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Tanto na versão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2.7.12&lt;/code&gt; quando na versão &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.6.4&lt;/code&gt; Python grita &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ModuleNotFoundErrror&lt;/code&gt;, esse erro é característico quando o pacote não está instalado.&lt;/p&gt;

&lt;p&gt;Massa né? Preparar, apontar, instalar pacotes diferentes em cada versão do Python 😜&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;A &lt;a href=&quot;https://jtemporal.com/pyenv-inicio/&quot;&gt;primeira parte dessa colinha pode ser encontrada aqui&lt;/a&gt; e mostra como instalar o pyenv.&lt;/li&gt;
  &lt;li&gt;Para entender como pyenv funciona por debaixo dos panos da uma lidinha na seção &lt;a href=&quot;https://github.com/pyenv/pyenv#how-it-works&quot;&gt;How it Works no README do projeto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;agradecimentos&quot;&gt;Agradecimentos&lt;/h2&gt;

&lt;p&gt;Obrigada Luciano Ratamero pelas dúvidas que me deram a ideia desse outro post 😉&lt;/p&gt;
</description>
        <pubDate>Tue, 02 Jan 2018 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/pyenv-parte2/</link>
        <guid isPermaLink="true">https://jtemporal.com/pyenv-parte2/</guid>
        
        <category>colinha</category>
        
        <category>python</category>
        
        <category>pyenv</category>
        
        <category>versoes</category>
        
        <category>versões</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Pegando o último elemento de uma lista em Python</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt; é conhecida por facilitar a escrita de códigos bonitos e pequenos. A colinha de hoje é sobre como pegar o último elemento de uma lista usando essa linguagem \o/&lt;/p&gt;

&lt;p&gt;Vindo de outras linguagens como Java ou C para o Python é normal trazer um pouco de sotaque para os seus códigos e querer fazer algo mais ou menos assim para pegar o último elemento de uma lista:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;lista&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;indice&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lista&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;indice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# 4
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ultimo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lista&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;indice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ultimo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# 5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Usar a função de tamanho &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;len()&lt;/code&gt; para pegar o comprimento da lista e subtrair &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; para obter o índice do último elemento daquela lista. E tudo bem! Isso funciona. Porém Python apresenta um jeito mais elegante de fazer isso, veja:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;ultimo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lista&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ultimo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# 5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/12NUbkX6p4xOO4/giphy.gif&quot; alt=&quot;magic gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Apesar de parecer isso não é mágica não! Da &lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#common-sequence-operations&quot;&gt;documentação do Python&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If i or j is negative, the index is relative to the end of sequence &lt;em&gt;s&lt;/em&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;len(s) + i&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;len(s) + j&lt;/code&gt; is substituted. But note that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-0&lt;/code&gt; is still &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;De uma forma mais simples o &lt;a href=&quot;https://twitter.com/raymondh&quot;&gt;Raymond Hettinger&lt;/a&gt; explica nesse tweet com código:&lt;/p&gt;
&lt;center&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;pt&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://twitter.com/hashtag/python?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#python&lt;/a&gt; tip:  How to support negative indexing:&lt;br /&gt;&lt;br /&gt;def __getitem__(self, i):&lt;br /&gt;    if i &amp;lt; 0:&lt;br /&gt;        i += len(self)&lt;br /&gt;    if i &amp;lt; 0 or i &amp;gt;= len(self):&lt;br /&gt;        raise IndexError&lt;br /&gt;    ...&lt;/p&gt;&amp;mdash; Raymond Hettinger (@raymondh) &lt;a href=&quot;https://twitter.com/raymondh/status/943615980650971136?ref_src=twsrc%5Etfw&quot;&gt;20 de dezembro de 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/center&gt;

&lt;p&gt;A implementação de fato é mais complexa que essa, mas o que acontece em linhas gerais: o método &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__getitem__&lt;/code&gt; é invocado quando fazemos a chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lista[-1]&lt;/code&gt; recebendo a própria lista (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;self&lt;/code&gt;) e o índice negativo (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i&lt;/code&gt;) então soma esse índice com o tamanho da lista e retornando o valor do índice atualizado. Curiosamente é o mesmo que fiz no primeiro exemplo porém já vem implementado de fábrica.&lt;/p&gt;

&lt;p&gt;E detalhe, o mesmo pode ser feito para strings!&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;palavra&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;opaopa&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;palavra&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# a
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Massa né? Agora é só usar índice negativo nos seus códigos também  😉&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Para mais detalhes do slice de strings olhe essa &lt;a href=&quot;https://docs.python.org/3.6/tutorial/introduction.html&quot;&gt;Introdução informal de Python em inglês&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Referência ao caso especial de índices negativos &lt;a href=&quot;https://docs.python.org/3/reference/datamodel.html#object.__getitem__&quot;&gt;no método &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__getitem__&lt;/code&gt; na documentação do Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;agradecimentos&quot;&gt;Agradecimentos&lt;/h2&gt;
&lt;p&gt;Mário Sérgio, Diego Ponciano e Paulo Haddad por alguns dos links nesse post!&lt;/p&gt;
</description>
        <pubDate>Mon, 01 Jan 2018 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/ultimo-da-lista/</link>
        <guid isPermaLink="true">https://jtemporal.com/ultimo-da-lista/</guid>
        
        <category>colinha</category>
        
        <category>python</category>
        
        <category>lista</category>
        
        <category>listas</category>
        
        <category>manipulação de listas</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Ambientes virtuais Python: venv</title>
        <description>&lt;p&gt;Depois de aprender que &lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt; possui várias versões e &lt;a href=&quot;http://jtemporal.com/pyenv-inicio/&quot;&gt;aprender a instalar mais de uma delas com o pyenv&lt;/a&gt;, a colinha de hoje mostra um próximo passo: utilizar o &lt;a href=&quot;https://docs.python.org/3/library/venv.html&quot;&gt;venv&lt;/a&gt; para criar ambientes virtuais com o Python 3.&lt;/p&gt;

&lt;p&gt;No lançamento da versão 3.3 foi anunciado o venv como novo módulo da linguagem. E na versão 3.6 o venv se torna a escolha oficial para criação de ambientes virtuais Python com o script do &lt;a href=&quot;https://docs.python.org/dev/whatsnew/3.6.html#id8&quot;&gt;pyvenv se tornando &lt;em&gt;deprecated&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;História do surgimento do venv a parte, vamos aos finalmentes. Basta ter qualquer versão do Python apartir da 3.3 que os códigos abaixo devem funcionar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;¯\_(ツ)_/¯&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para criar um ambiente virtual:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;python &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; venv meuenv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E para ativar o ambiente:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;meuenv/bin/activate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Agora atenção para uma coisa: essa forma de criar ambientes virtuais não permite que você crie ambientes para outras versões que não aquela que você esteja usando.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;python &lt;span class=&quot;nt&quot;&gt;--version&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;Python 3.3.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Aqui eu estava usando o Python 3.3.0 então o &lt;em&gt;myenv&lt;/em&gt; vai ter essa versão. Daí é que fica legal ter o &lt;em&gt;pyenv&lt;/em&gt; instalado! Você só precisa trocar a versão para a que você quer e criar o ambiente. Veja:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;python &lt;span class=&quot;nt&quot;&gt;--version&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;Python 3.3.0
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pyenv &lt;span class=&quot;nb&quot;&gt;local &lt;/span&gt;3.6.4
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;python &lt;span class=&quot;nt&quot;&gt;--version&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;Python 3.6.4
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;python &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; venv meuoutroenv
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;meuoutroenv/bin/activate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Uma das vantagens de ter um módulo desses embutido na linguagem é não precisar instalar nada mais para conseguir criar ambientes virtuais. Pra galera evita instalar coisas extras no computador como eu isso é fantástico.&lt;/p&gt;

&lt;p&gt;E agora só fazer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip install&lt;/code&gt; e começar com os códigos ☺️&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.python.org/dev/whatsnew/3.3.html#summary-release-highlights&quot;&gt;Pontos altos do lançamento da versão 3.3 do Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 30 Dec 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/venv-inicio/</link>
        <guid isPermaLink="true">https://jtemporal.com/venv-inicio/</guid>
        
        <category>colinha</category>
        
        <category>python</category>
        
        <category>python 3</category>
        
        <category>python3</category>
        
        <category>venv</category>
        
        <category>versoes</category>
        
        <category>ambiente virtual</category>
        
        <category>ambientes virtuais</category>
        
        <category>virtualenv</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Python virtual environments: venv</title>
        <description>&lt;p&gt;After learning that &lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt; has several versions, and after learning &lt;a href=&quot;https://jtemporal.com/python-and-its-versions/&quot;&gt;how to install any of them using pyenv&lt;/a&gt;, today’s tip teaches you the next step: how to use &lt;a href=&quot;https://docs.python.org/3/library/venv.html&quot;&gt;venv&lt;/a&gt; to create virtual environments with Python 3.&lt;/p&gt;

&lt;p&gt;At the launch of Python 3.3 venv was announced as a new language module, and in version 3.6, venv became the official choice for creating Python virtual environments with the &lt;a href=&quot;https://docs.python.org/dev/whatsnew/3.6.html#id8&quot;&gt;deprecation of the pyenv script&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;History of how venv came to life aside, let’s go to what matters. You can use any version equal to or higher than Python’s 3.3 that the commands below should work  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;¯\_(ツ)_/¯&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To create a virtual environment:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;python &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; venv myenv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To activate the environment:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;myenv/bin/activate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now pay attention to one thing: this way of creating virtual environments doesn’t allow you to create environments to other Python versions than the one you are already using.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;python &lt;span class=&quot;nt&quot;&gt;--version&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;Python 3.3.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here I was using Python 3.3.0, so my virtual env has that version. That’s when having &lt;em&gt;pyenv&lt;/em&gt; installed is a good thing! You only have to use pyenv and switch to the version you want then create the environment. Take a look:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;python &lt;span class=&quot;nt&quot;&gt;--version&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;Python 3.3.0
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pyenv &lt;span class=&quot;nb&quot;&gt;local &lt;/span&gt;3.6.4
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;python &lt;span class=&quot;nt&quot;&gt;--version&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;Python 3.6.4
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;python &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; venv meuoutroenv
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;meuoutroenv/bin/activate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;One of the advantages of having one module of this kind built-in the language is that you don’t need to install anything else to create your virtual environments. To the people that avoid installing things on the computer like myself, this is fantastic!&lt;/p&gt;

&lt;p&gt;Now that you have your virtual environment created you can go ahead, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip install&lt;/code&gt; all things and start coding. ☺️&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.python.org/dev/whatsnew/3.3.html#summary-release-highlights&quot; title=&quot;Highlights of Python 3.3 version release&quot;&gt;Highlights of Python 3.3 version release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 30 Dec 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/python-virtual-environments-venv/</link>
        <guid isPermaLink="true">https://jtemporal.com/python-virtual-environments-venv/</guid>
        
        <category>english</category>
        
        <category>virtual environment</category>
        
        <category>virtual environments</category>
        
        <category>versions</category>
        
        <category>protip</category>
        
        <category>pro tip</category>
        
        <category>python</category>
        
        <category>python 3</category>
        
        <category>python3</category>
        
        <category>venv</category>
        
        <category>virtualenv</category>
        
        
      </item>
    
      <item>
        <title>Python and its versions: pyenv</title>
        <description>&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Author note:&lt;/em&gt; Você pode &lt;a href=&quot;https://jtemporal.com/pyenv-inicio/&quot;&gt;ler este artigo em Português&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;One of the first things we learn in &lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt; is that there is more than one version of the same language working side by side. That can bring a few problems and the inevitable question: &lt;em&gt;“Which version should I choose?”&lt;/em&gt;. Today’s tip teaches you a way to install and manage many Python versions on your machine using &lt;a href=&quot;https://github.com/pyenv/pyenv&quot;&gt;pyenv&lt;/a&gt; 😉.&lt;/p&gt;

&lt;p&gt;Amongst other things, the two best features of pyenv in my humble opinion are:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;install new Python versions easily;&lt;/li&gt;
  &lt;li&gt;choose the global Python version.&lt;/li&gt;
&lt;/ol&gt;

&lt;center&gt;

&lt;br /&gt;

&lt;img src=&quot;https://media.giphy.com/media/10lqVdCCc9812M/giphy.gif&quot; /&gt; &lt;/center&gt;

&lt;p&gt;To start you’ll need to install pyenv, here I’ll demonstrate one of several installation methods, but in the project’s &lt;em&gt;readme&lt;/em&gt; file &lt;a href=&quot;https://github.com/pyenv/pyenv#installation&quot;&gt;you can find other possibilities&lt;/a&gt; (and also operational system related details):&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git clone https://github.com/pyenv/pyenv.git ~/.pyenv
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;export PYENV_ROOT=&quot;$HOME/.pyenv&quot;&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SHELL&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After these easy steps, other versions of Python are an install away:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pyenv &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;3.6.4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When in doubt of which version you can install, just use the install flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-l&lt;/code&gt; that it lists all versions available:Se estiver em dúvida quais versões você pode instalar só usar a flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-l&lt;/code&gt; do &lt;em&gt;install&lt;/em&gt; que ele vai listar todas as disponíveis:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pyenv &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Cool huh? Now you can install Python versions like crazy 😂&lt;/p&gt;

&lt;p&gt;And now, for the moment of truth, to configure the global version of Python, that is, to define which version of Python you will use when running Python, run the following command:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; $ pyenv global 3.6.4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So regardless of where you navigate on your terminal, the Python version running will be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.6.4&lt;/code&gt;. This command is handy if all of your projects are in the same version. Another nice feature of pyenv is to define a local Python, let’s say for instance that a given project only runs on Python &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.5.3&lt;/code&gt;, so you need to install that version (as you learned previously) and then go to that project’s folder and use this command:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; $ pyenv local 3.5.3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So whenever you enter the said project folder, pyenv will “activate” the correct Python for your project.&lt;/p&gt;

&lt;p&gt;No more pain when dealing with Python versions! 🎉&lt;/p&gt;

&lt;hr /&gt;
</description>
        <pubDate>Fri, 29 Dec 2017 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/python-and-its-versions/</link>
        <guid isPermaLink="true">https://jtemporal.com/python-and-its-versions/</guid>
        
        <category>english</category>
        
        <category>versions</category>
        
        <category>protip</category>
        
        <category>python</category>
        
        <category>pyenv</category>
        
        
      </item>
    
      <item>
        <title>Python e suas versões: pyenv</title>
        <description>&lt;hr /&gt;

&lt;p&gt;Author note: You can &lt;a href=&quot;https://jtemporal.com/python-and-its-versions/&quot;&gt;read this post in English here&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Uma das primeiras coisas que aprendemos sobre &lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt; é que existem mais de uma versão da mesma linguagem funcionando a todo vapor. Isso traz alguns problemas e a inevitável pergunta &lt;em&gt;“Qual versão eu devo usar?”&lt;/em&gt;. A colinha de hoje mostra uma forma de instalar e manter o controle de várias versões do Python na sua máquina usando o &lt;a href=&quot;https://github.com/pyenv/pyenv&quot;&gt;pyenv&lt;/a&gt; 😉.&lt;/p&gt;

&lt;p&gt;Entre outras coisas, as duas melhores features &lt;em&gt;pyenv&lt;/em&gt; na minha humilde opinião são:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;instalar novas versões do Python facilmente;&lt;/li&gt;
  &lt;li&gt;escolher a versão global do Python.&lt;/li&gt;
&lt;/ol&gt;

&lt;center&gt; &lt;img src=&quot;https://media.giphy.com/media/10lqVdCCc9812M/giphy.gif&quot; /&gt;&lt;/center&gt;

&lt;p&gt;Pra começar você precisa instalar o pyenv, aqui eu vou mostrar um dos métodos de instalação, mas &lt;a href=&quot;https://github.com/pyenv/pyenv#installation&quot;&gt;lá no &lt;em&gt;readme&lt;/em&gt; do projeto tem outras&lt;/a&gt; (e também detalhes específicos de cada sistema operacional):&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git clone https://github.com/pyenv/pyenv.git ~/.pyenv
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;export PYENV_ROOT=&quot;$HOME/.pyenv&quot;&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SHELL&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Depois desse passo é bem facinho, as outras versões do Python estão a um &lt;em&gt;install&lt;/em&gt; de distância:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pyenv &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;3.6.4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Se estiver em dúvida quais versões você pode instalar só usar a flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-l&lt;/code&gt; do &lt;em&gt;install&lt;/em&gt; que ele vai listar todas as disponíveis:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pyenv &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Massa né? Agora é só sair instalando versão adoidado 😂&lt;/p&gt;

&lt;p&gt;E agora o momento da verdade, para configurar a versão global do Python, isto é, definir que versão do Python você vai usar quando colocar o Python pra rodar, use o seguinte comando:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pyenv global 3.6.4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Assim independente de qual lugar você navegar no seu terminal o Python que estará rodando será o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.6.4&lt;/code&gt;. Isso é muito útil se todos os seus projetos estiverem na mesma versão. Outra funcionalidade legal do &lt;em&gt;pyenv&lt;/em&gt; é definir um Python local, vamos supor que um determinado projeto só rode no Python &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.5.3&lt;/code&gt; então basta você instalar essa versão (como você aprendeu ali em cima) e em seguida ir até a pasta desse projeto e usar este comando:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pyenv local 3.5.3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Assim sempre que você entrar nessa pasta o pyenv vai “ativar” o Python correto para o seu projeto.&lt;/p&gt;

&lt;p&gt;Chega de sofrer com versões do Python! 🎉&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Links&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://jtemporal.com/pyenv-parte2/&quot;&gt;Você pode continuar a ler sobre o pyenv na Parte 2 desse texto&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Fri, 29 Dec 2017 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/pyenv-inicio/</link>
        <guid isPermaLink="true">https://jtemporal.com/pyenv-inicio/</guid>
        
        <category>colinha</category>
        
        <category>python</category>
        
        <category>pyenv</category>
        
        <category>versoes</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Adicione cores ao compartilhar seu site</title>
        <description>&lt;p&gt;Você já notou que ao compartilhar um link na sua rede social favorita esses links carregam imagens para mostrar? Uma espécie de thumbnail do site?&lt;/p&gt;

&lt;p&gt;Pois bem, hoje é amplamente utilizada em várias redes sociais, mas quem começou essa brincadeira foi o Facebook que implementou um negócio chamado The &lt;a href=&quot;http://ogp.me/&quot;&gt;Open Graph protocol&lt;/a&gt;. Os objetos dentro do face, são colocados num grafo social (social graph) e são conhecidos como “objetos ricos” (rich objects). Isso que dizer, em poucas palavras, que cada objeto tem uma coleção de características que acrescentam informções a esses objetos.&lt;/p&gt;

&lt;p&gt;E o Facebook queria que as páginas compartilhadas dentro dele pudessem carregar a mesma quantidade de informação e aí que entram meta tags. A ideia é usar meta tags para representar ricamente cada página da internet dentro de um grafo social.&lt;/p&gt;

&lt;p&gt;Existem várias meta tags que podem ser utilizadas, mas na colinha de hoje vamos falar da &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;og:image&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;o-site-do-pizza-de-dados&quot;&gt;O site do Pizza De Dados&lt;/h2&gt;

&lt;p&gt;Essa semana passada, eu procurei deixar o site do &lt;a href=&quot;https://pizzadedados/&quot;&gt;Pizza de Dados&lt;/a&gt; mais amigável aos olhos e uma das coisas que eu quis mudar foi acrescentar a meta tag com a nossa logo 🍕&lt;/p&gt;

&lt;p&gt;Antes ao compartilhar o site do Pizza tinhamos algo assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/og-image/antes-tag.png&quot; alt=&quot;foto do compartilhamento do pizza no facebook antes da adição da meta tag&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Nota como fica muito sem graça? Às vezes na tentativa de preencher as informações sobre a págica a rede social ainda pode acabar escolhendo uma imagem qualquer que exista na página e usá-la como “thumbnail”.&lt;/p&gt;

&lt;p&gt;Então para alterar esse comportamento e adicionar um pouco de cor às nossas postagens seguindo o site oficial da OGP acrescentamos uma linha parecida com essa:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;property=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;og:image&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://ia.media-imdb.com/images/rock.jpg&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;no head do site. E 🌈automagicamene🌈 ao compartilhar o site do Pizza temos:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/og-image/depois-tag.png&quot; alt=&quot;foto do compartilhamento do pizza no facebook antes da adição da meta tag&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Tranquilo né? Agora é só usar no seu site tbm 😉&lt;/p&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;O site oficial da &lt;a href=&quot;http://ogp.me/&quot;&gt;Open Graph protocol&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 27 Dec 2017 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/site-thumbnail/</link>
        <guid isPermaLink="true">https://jtemporal.com/site-thumbnail/</guid>
        
        <category>colinha</category>
        
        <category>web</category>
        
        <category>web dev</category>
        
        <category>desenvolvimento web</category>
        
        <category>html</category>
        
        <category>meta tags</category>
        
        <category>share</category>
        
        <category>compartilhamentos</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Add colors when sharing your website</title>
        <description>&lt;p&gt;Have you ever noticed that when you share a link on your favorite social network, these links load images to show? A kind of website thumbnail?&lt;/p&gt;

&lt;p&gt;Well, today it is widely used on several social networks, but it was Facebook who started this game by implementing something called The &lt;a href=&quot;http://ogp.me/&quot;&gt;Open Graph protocol&lt;/a&gt;. Objects within Facebook are placed in a social graph and are known as “rich objects.” This means, in short, that each object has a collection of characteristics that add information to these objects.&lt;/p&gt;

&lt;p&gt;And Facebook wanted the pages shared within it to be able to load the same amount of information, and that’s where meta tags come in. The idea is to use meta tags to richly represent each internet page within a social graph.&lt;/p&gt;

&lt;p&gt;There are several meta tags that can be used, but in today’s pro tip, we will talk about the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;og:image&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;pizza-de-dados-website&quot;&gt;Pizza De Dados website&lt;/h2&gt;

&lt;p&gt;Last week, I tried to make the &lt;a href=&quot;https://pizzadedados/en&quot;&gt;Pizza de Dados&lt;/a&gt; website more visually appealing, and one of the things I wanted to change was to add the meta tag with our 🍕 logo.&lt;/p&gt;

&lt;p&gt;Before, when sharing the Pizza website, we had something like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/og-image/antes-tag.png&quot; alt=&quot;Photo of Pizza’s sharing on Facebook before adding the meta tag&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Do you notice how it looks very dull? Sometimes, in an attempt to fill in the information about the page, the social network may still end up choosing any image that exists on the page and using it as a “thumbnail”.&lt;/p&gt;

&lt;p&gt;So to change this behavior and add some color to our posts following the official OGP site, we need to add a line similar to this:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;property=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;og:image&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://ia.media-imdb.com/images/rock.jpg&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;in the website head. And 🌈automagically🌈 when sharing the Pizza website, we have:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/og-image/depois-tag.png&quot; alt=&quot;Photo of Pizza’s sharing on Facebook after adding the meta tag&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Awesome, right? Now you can use it on your website too 😉.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://ogp.me/&quot;&gt;Open Graph protocol&lt;/a&gt; official website.&lt;/p&gt;
</description>
        <pubDate>Wed, 27 Dec 2017 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/site-thumbnail-en/</link>
        <guid isPermaLink="true">https://jtemporal.com/site-thumbnail-en/</guid>
        
        <category>pro tip</category>
        
        <category>web</category>
        
        <category>web dev</category>
        
        <category>html</category>
        
        <category>meta tags</category>
        
        <category>share</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Retrospectiva 2017: Um momento de reflexão</title>
        <description>&lt;p&gt;Eu decidi fazer uma coisa nova esse fim de ano: analisar o meu crescimento e escrever isso em algum lugar. Uma visão geral dum ano tão carregado das coisas que fiz/deixei de fazer.&lt;/p&gt;

&lt;p&gt;O principal motivo de anotar tudo isso por aqui é: Esse ano foi díficil.&lt;/p&gt;

&lt;p&gt;A economia do país tava no ralo, a política é uma montanha sem fim de corrupção, o mundo parece que desandou um pouquinho esse ano. E durante o ano tive vários momentos em que me perguntei &lt;em&gt;Pra que fazer isso que estou fazendo? Pode ser que nada dê certo. E mesmo que algo dê certo não vai durar tanto assim…&lt;/em&gt; Pois bem, a pior parte de passar por todo o sufuco que pode ter sido o seu 2017 foi justamente essa &lt;em&gt;passar por todo o sufoco que foi 2017&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Agora é hora de refletir. Sim eu sei que soa igual clichê. Mas é hora de sentar e pensar &lt;em&gt;Ufa, já passou&lt;/em&gt; então pega o histórico do GitHub, pega a agenda (virtual ou não), pega as DMs do Twitter e a lista dos e-mails e bora brincar de fazer uma retropesctiva.&lt;/p&gt;

&lt;p&gt;A brincadeira é a seguinte:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Escolha um tema: O seu tema pode ser qualquer coisa, desde que você considere que ele tenha um peso importante no seu ano. O meu é &lt;em&gt;Trabalho&lt;/em&gt;, seja ele voluntário não, que eu tenha me divertido fazendo ou não. Ah e se você não quiser escolher um tema só tudo bem também ;)&lt;/li&gt;
  &lt;li&gt;Cada coisa/momento que eu considero notável no meu ano entra na lista. Um momento notável é algo que ficou marcado de alguma forma quando algm pergunta &lt;em&gt;E aí como foi o ano?&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Cada item da lista vai ter uma descriçãozinha com o motivo que torna aquele momento notável por exemplo: aprendi a tocar violão, e isso é notável pois eu comprei um violão fazem 3 anos e até agora tava pegando poeira&lt;/li&gt;
  &lt;li&gt;O objetivo é perceber que, por mais díficil que o ano tenha sido pra você, você cresceu esse ano&lt;/li&gt;
  &lt;li&gt;No final de tudo isso, se você conseguir/quiser agradeça quem passou com você os momentos memoráveis e tire as suas conclusões talvez você queira melhorar algo, sei lá quando chegar na meta a gente dobra ela =P&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui vai a minha lista (e no fim minhas conclusões):&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Montei um currículo que nunca enviei para ninguém:&lt;/strong&gt;
 Sim, inicialmente o plano era enviar ele para empresas, mas a vida a contece e meia hora depois que ele estava oficialmente terminado eu recebi uma oferta de trabalho. O que me leva ao próximo ponto…&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Disse sim para um desafio:&lt;/strong&gt;
 Tendo acabado recentemente a faculdade e ainda sem diploma (ele chegaria um mês depois), no dia que terminei a primeira versão do meu CV, eu aceitei a oferta que o pessoal da Serenata me fez o que desencadearia uma série de eventos mucho loka que ainda me pergunto se foi real&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Colei grau:&lt;/strong&gt;
 E a maior parte da cerimônia eu chorei e pensei “Não posso cair, não posso cair, não posso cair”. Eu estava de salto.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Contribui com open source ativamente:&lt;/strong&gt;
 Embora a maior parte das minhas contribuições fossem para a Serenata, isso me possibilitou abrir os horizontes e no hacktoberfest eu consegui contribuir com projetos novos. Tanto de amigos quanto internacionais.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Viajei pra Taiwan:&lt;/strong&gt;
 Uma ilhazinha do outro lado do mundo que fala um dialeto de chinês diferente da China continental e eu fui pra lá. Sim minha gente jet-lag é muitíssimo real e assim que eu puder viajo pra lá de novo! O que eu fui fazer lá? Bem continua lendo…&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Dei minha primeira palestra em inglês:&lt;/strong&gt;
 Como muitas outras nesse ano o tema foi o mesmo: Sereanta. Mas como mudar é sempre bom, essa foi em Inglês lá em Taiwan para um evento de tecnologia cívica. Eu e a Ana submetemos a atividade e advinha?! Queríam ouvir o que a gente tinha pra dizer hpns&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Aceitei um projeto novo:&lt;/strong&gt;
 Serenata rola um revezamento do time, em Setembro eu me afastei para trabalhar num novo projeto na Data Science Brigade.
Mais para o fim do projeto uma realização pessoal: dois anos depois de ter desistido de uma nova iniciação científica para fazer coisas diferentes das que já estava acostumada, finalmente fiz algo que me fez ter desistido da IC em primeiro lugar: juntar Python e R num mesmo projeto de análise de dados&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Dei a primeira palestra na PythonBrasil:&lt;/strong&gt;
 Bem massa cruzar meio mundo pra palestrar, mas o coraçãozinho bate mais forte quando é um evento querido. Então um ano depois da primeira Python Brasil (e dessa vez com os dois pés funcionais) fui lá pra Beagá falar sobre Serenata pela última vez no ano. Ainda não tem video mas quando tiver coloco o link aqui ;)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Me tornei parte da APyB:&lt;/strong&gt;
 Nessa mesma PythonBrasil entre mil fitas e mil tretas, me candidatei para um cargo no Conselho Deliberativo da Associação Python Brasil. 9 pessoas votaram em mim (ainda não acredito nisso e muito obrigada a vocês).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Ministrei um workshop junto com uma amiga:&lt;/strong&gt;
 Fato curioso: nunca quis ser professora, mas adoro ensinar as coisas que eu aprendi. Aí junto com a Letícia Portella que adora ensinar também já viu né? Saiu um workshop de ciência de dados… E tá no GitHub viu?!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Organizei um Django Girls a distância:&lt;/strong&gt;
Um dia eu tava de boa na lagoa e do nada no fim do dia eu já tava ajudando a organizar o Django Girls BH 2017. Claro que eu não tava nessa sozinha né?! Sem a Thaís Viana, a Paola Pacheco e a Marcilene nada disso seria possível. E ainda ouso dizer que o Igor Santos e o Cássio Botaro também foram super importantes em fazer o DG rolar.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Fundei um podcast com amigos:&lt;/strong&gt;
 Eu que não sou de escutar podcast, topei a missão de fazer um com a Letícia Portella e com o Gustavo Coelho. O primeiro episódio foi super bem recebido com vários feedbacks positivos. Já liberamos o episódio 2 e já marcamos gravações de mais dois.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Disse xau para DSB e olá para a Nuveo:&lt;/strong&gt;
 Engraçado que às vezes a gente acha que a nossa história vai durar bastante num certo caminho e aí, a vida chega e te da uma bofetada e te troca de rumo. E foi meio que assim que rolou essa mudança. E o que dizer desse rumo novo que mal começou mas já considero pacas?! Mal posso esperar pelo que vem pela frente.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Antes de anotar tudo isso aí em cima, eu não tinha percebido o tanto de coisa q eu fiz. E por mais legal que seja tudo isso, a coisa mais notável que me vem a cabeça quando eu penso em todos esses momentos memoráveis é que eu não estava sozinha.&lt;/p&gt;

&lt;p&gt;A todos que compartilharam esses e outros momentos comigo (sim, eu sei que não citei todo mundo), foi um ano incrível e &lt;strong&gt;vocês&lt;/strong&gt; que contribuiram pra que ele fosse assim!&lt;/p&gt;

&lt;p&gt;Um abraço apertado e cheiro 😘&lt;/p&gt;

&lt;p&gt;PS.: e você que tá lendo isso, se eu te perguntasse o que você fez esse ano, o que você me diria? Se quiser contar sou toda ouvidos 😉&lt;/p&gt;
</description>
        <pubDate>Wed, 20 Dec 2017 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/retrospectiva-2017/</link>
        <guid isPermaLink="true">https://jtemporal.com/retrospectiva-2017/</guid>
        
        <category>pessoal</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Colocando pontos num mapa com Folium</title>
        <description>&lt;p&gt;Vamos supor que você está trabalhando com dados do mundo real. E nesses dados você tem as latitudes e longitudes de algumas entidades. E ainda mais, você quer colocar essas entidades num mapa e mostrar isso para as suas coleguinhas. Como fazer?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.giphy.com/media/3ov9kbxzfzV6HtnnwI/giphy.gif&quot;&gt;&lt;img src=&quot;https://media.giphy.com/media/3ov9kbxzfzV6HtnnwI/giphy.gif&quot; alt=&quot;gif de um mapa com cordoes&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bem, você tem algumas opções…&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Colocar manualmente pontos no mapa usando o Google Maps, o que é até okay quando você tem 2 ou 3 entidades mas quando isso passa de 10 já fica meio chato né?!&lt;/li&gt;
  &lt;li&gt;Usar uma biblioteca/pacote de alguma linguagem de programação que faça isso. Particularmente minha opção favorita 💃🏻&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Existem algumas bibliotecas disponíveis para isso, mas hoje vamos falar da &lt;a href=&quot;https://github.com/python-visualization/folium&quot;&gt;Folium&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;folium&quot;&gt;Folium&lt;/h2&gt;
&lt;p&gt;O propósito dessa biblioteca é unir o poder de manipulação de dados que Python possui com a força de visualização de mapas da biblioteca JavaScript &lt;a href=&quot;https://github.com/Leaflet/Leaflet&quot;&gt;Leaflet&lt;/a&gt;. A ideia aqui é tornar ainda mais fácil a missão de colocar pontos em um mapa.&lt;/p&gt;

&lt;h2 id=&quot;cadê-o-código&quot;&gt;Cadê o código?&lt;/h2&gt;
&lt;p&gt;Todo código que eu vou mostrar abaixo ta organizadinho &lt;a href=&quot;https://github.com/jtemporal/intro-folium&quot;&gt;neste diretório no GitHub&lt;/a&gt;, nele tem as instruções de preparação do ambiente tanto &lt;a href=&quot;https://github.com/jtemporal/intro-folium#docker-&quot;&gt;com docker&lt;/a&gt; quanto &lt;a href=&quot;https://github.com/jtemporal/intro-folium#sem-docker&quot;&gt;sem docker&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;instalação&quot;&gt;Instalação&lt;/h3&gt;
&lt;p&gt;Comece preparando o ambiente:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;git clone https://github.com/jtemporal/intro-folium.git
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;intro-folium/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;com-docker&quot;&gt;Com docker&lt;/h4&gt;
&lt;p&gt;Se você gosta da 🐳 :&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;docker-compose build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;sem-docker&quot;&gt;Sem docker&lt;/h4&gt;
&lt;p&gt;Se  não é fã da 🐳:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; requirements.txt
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;jupyter
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;inciando&quot;&gt;Inciando&lt;/h3&gt;
&lt;p&gt;Depois disso, ainda no terminal:&lt;/p&gt;

&lt;p&gt;Na versão 🐳:&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;docker-compose up jupy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;ou sem docker:&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;jupyter notebook
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Depois de rodar um dos comandos acima, você verá uma mensagem parecida com a seguinte no seu terminal:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/folium/terminal_print.png&quot; alt=&quot;foto do terminal rodando docker&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Foto do terminal rodando o projeto com docker&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;A última linha indica o token de acesso, é só copiá-la e colocar no navegador para abrir o jupyter. Deve aparecer algo assim para você:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/folium/jupyter_print.png&quot; alt=&quot;foto do navegador rodando jupyter&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Foto do navegador rodando o jupyter&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Se você rodar o notebook &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium_intro.ipynb&lt;/code&gt; inteiro você vai obter os mesmos resultados que vou mostrar aqui. Além disso, se você clicar na imagem do mapas que vão vir a seguir, você vai ser levado para a página desses mesmos mapas o que vai de te deixar intergarir com eles 😉&lt;/p&gt;

&lt;h3 id=&quot;colocando-a-mão-na-massa&quot;&gt;Colocando a mão na massa&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/FjGEQSybauJqM/giphy.gif&quot; alt=&quot;anime de garota no codigo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Começamos importando as bibliotecas necessárias e criando um mapa:&lt;/p&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;brasil&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;16.1237611&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;59.9219642&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# Coordenadas retiradas do Google Maps
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;zoom_start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium.Map()&lt;/code&gt; precisa apenas do parâmetro &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;location&lt;/code&gt; para criar o seu mapa. Esse parâmetro recebe um par &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;latitude&lt;/code&gt;-&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;longitude&lt;/code&gt; que pode ser uma lista ou uma tupla. Aqui eu passei também um valor (4) para o parâmetro &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zoom_start&lt;/code&gt;, o padrão desse parâmentro é 10, mas um zoom de 10 não deixa o país inteiro na região do mapa por isso, o novo valor de 4. Ao chamar o mapa, temos:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;brasil&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;/folium/brasil_clean&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/intro-folium/master/mapas_imagens/brasil_clean.png&quot; alt=&quot;mapa do brasil&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Mapa clicável&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Mas agora eu quero colocar pontos no mapa. Aqui vou usar de exemplo um conjunto de dados com geolocalização de empresas que apareceram nos reembolsos analisados pela &lt;a href=&quot;http://serenatadeamor.org/&quot;&gt;Operação Serenata de Amor&lt;/a&gt;. No repositório &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;intro-folium&lt;/code&gt; tem uma versão reduzida desse conjunto de dados. Então vamos começar lendo esses dados e colocando no mapa duas primeiras empresas:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;empresas&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;empresas.xz&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;empresa1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iloc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Marker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empresa1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;latitude&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresa1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;longitude&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;add_to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;brasil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;empresa2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iloc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Marker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empresa2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;latitude&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresa2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;longitude&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;add_to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;brasil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium.Marker()&lt;/code&gt; coloca um “pin” de localização no mapa. Para isso ocorrer precisamos passar novamente a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;location&lt;/code&gt; e ainda indicar a qual mapa adicionar esse pin usando o metodo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;add_to()&lt;/code&gt;. Chamando nomavente o mapa, temos:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;brasil&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;/folium/brasil_some_companies&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/intro-folium/master/mapas_imagens/brasil_some_companies.png&quot; alt=&quot;mapa do brasil com duas empresas&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Mapa clicável&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;&lt;strong&gt;Resista&lt;/strong&gt; a curiosidade de colocar todos as empresas num mapa. Com as mais de ciquenta mil empresas deste dataset, isso provavelmente irá travar o seu computador (travou o meu jupyter). Confie em mim, um mapa com todas as empresas do dataset fica assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/intro-folium/master/mapas_imagens/brasil_all_companies.png&quot; alt=&quot;mapa do brasil com todas empresas&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Sabendo que mostrar a belezinha acima trava o computador, vamos então selecionar um estado apenas para mostrar:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;empresas_pe&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empresas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;PE&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Para melhorar a visualização eu também iniciei um novo mapa, esse tem as coordenadas do estado de Pernambuco (meu estado de origem ❤️), veja:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;pernambuco&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;8.3833569&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;38.5757127&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;zoom_start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;pernambuco&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;/folium/pernambuco_clean&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/intro-folium/master/mapas_imagens/pernambuco_clean.png&quot; alt=&quot;mapa de Pernambuco&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Mapa clicável&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;E colocando as empresas no mapa:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresas_pe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;iterrows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Marker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;latitude&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;longitude&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;add_to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pernambuco&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;pernambuco&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;/folium/pernambuco_all_companies&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/intro-folium/master/mapas_imagens/pernambuco_all_companies.png&quot; alt=&quot;mapa de Pernambuco com todas as empresas&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Mapa clicável&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Aqui ja podemos notar uma coisa que vale análise: Apesar de no dataset, apresentarem o estado cadastrado como Pernambuco, encontramos duas empresas que sua latitude e longitude não estão dentro do limite do estado 🤔&lt;/p&gt;

&lt;p&gt;Puxa, muito legal isso, mas meio sem graça né? Então vamos dar uma olhada em como colorir um pouco as coisas?&lt;/p&gt;

&lt;p&gt;Vamos começar reduzindo ainda mais nossa quantidade de empresas. Selecionei as 110 empresas de Olinda ❤️, e coloquei elas no mapa:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;empresas_olinda_pe&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empresas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;OLINDA&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;olinda&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;7.9981267&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;34.9082027&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;zoom_start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresas_olinda_pe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;iterrows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Marker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;latitude&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;longitude&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;add_to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;olinda&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;olinda&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;/folium/olinda_all_companies&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/intro-folium/master/mapas_imagens/olinda_all_companies.png&quot; alt=&quot;mapa de Olinda com todas as empresas&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Mapa clicável&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Depois escolhi alguns bairros dos 22 bairros com empresas para colorir criando um dicionário que mapeia o nome de um bairro para uma cor:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;colors&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
 &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;AMPARO&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;pink&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
 &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;GUADALUPE&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;blue&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
 &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;CASA CAIADA&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;green&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
 &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;PEIXINHOS&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;orange&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
 &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;RIO DOCE&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;red&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
 &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;BAIRRO NOVO&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;purple&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;olinda&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;7.9981267&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;34.9082027&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;zoom_start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresas_olinda_pe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;iterrows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;neighborhood&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;colors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Marker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;latitude&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;longitude&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Icon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;colors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;neighborhood&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]])&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;add_to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;olinda&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Aqui usamos um novo parâmetro do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium.Marker()&lt;/code&gt;, o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;icon&lt;/code&gt; que recebe um objeto do tipo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium.Icon&lt;/code&gt; e assim a coloração que queremos. Note que, antes de colocar os pontos no mapa, eu limpo o mapa de Olinda recriando esse objeto e assim, ao invés de colocar os pins coloridos por cima do mapa antigo com os pins azuis. Ainda mais um detalhe, esse tipo de marker (que parece um 📌) segue as cores do bootstrap, ou seja, é limitado, mas para esse exemplo serve:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;olinda&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;/folium/olinda_some_colored&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/intro-folium/master/mapas_imagens/olinda_some_colored.png&quot; alt=&quot;mapa de Olinda com algumas empresas e pins coloridos&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Mapa clicável&lt;/i&gt;
&lt;/center&gt;

&lt;h3 id=&quot;três-coisinhas-a-mais&quot;&gt;Três coisinhas a mais&lt;/h3&gt;

&lt;h4 id=&quot;mapas-em-páginas-web&quot;&gt;Mapas em páginas web&lt;/h4&gt;
&lt;p&gt;Você pode salvar seus mapas como páginas HTML usando o comando abaixo, basta identificar o mapa que quer salvar, usar o método &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.save()&lt;/code&gt; e passar um nome do arquivo como como parâmetro. Todas as páginas de mapas desse post foram geradas assim:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;olinda&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;mapas_htmls/olinda_some_colored.html&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;informações-extras-num-mapa&quot;&gt;Informações extras num mapa&lt;/h4&gt;
&lt;p&gt;Também pode passar informações sobre a entidade que você está colocando no mapa usando o parâmetro &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;popup&lt;/code&gt;. Assim ao clicar em um dos pins, um balão mostra alguma informação:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Marker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;latitude&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;longitude&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;popup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;sou uma empresa de Olinda&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;folium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Icon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;colors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empresa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;neighborhood&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]])&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;add_to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;olinda&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/folium/detalhe_empresa.png&quot; alt=&quot;foto do popup de um pin&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Foto do balão de uma empresa após o clique&lt;/i&gt;
&lt;/center&gt;

&lt;h4 id=&quot;um-arco-iris&quot;&gt;Um arco-iris&lt;/h4&gt;
&lt;p&gt;Como falei antes, o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium.Marker()&lt;/code&gt; possui cores limitadas, então se você precisar de mais cores, ou se você precisar colocar cores diferentes daquelas disponíveis, use ou o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium.CircleMarker()&lt;/code&gt; ou o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;folium.PolygonMarker()&lt;/code&gt;. Ambos aceitam hash de cores.&lt;/p&gt;

&lt;p&gt;E aí, vai fazer uns mapas também? 😉&lt;/p&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;curiosidades-e-dicas&quot;&gt;Curiosidades e dicas&lt;/h2&gt;

&lt;h3 id=&quot;mapas-e-dados-abertos&quot;&gt;Mapas (e dados) abertos&lt;/h3&gt;
&lt;p&gt;A Leaflet, e assim por consequência também o Folium, usa o &lt;a href=&quot;http://www.openstreetmap.org/about&quot;&gt;OpenStreetMap&lt;/a&gt; para montar seus mapas. Os mapas da OpenStreetMap são abertos e construídos por uma comunidade de pessoas interessadas em manter/ajudar o projeto, por exemplo, se você encontrar algum erro em alguma parte do mapa você pode enviar correções. Recomendo dar uma olhadinha na &lt;a href=&quot;http://wiki.openstreetmap.org/&quot;&gt;Wiki do OpenStreetMap&lt;/a&gt; para mais informações.&lt;/p&gt;

&lt;h3 id=&quot;dfiloci&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df.iloc[i]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Forma de visualizar qualquer linha do dataframe como se fosse um print bonito, basta passar como &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i&lt;/code&gt; o índice da linha.&lt;/p&gt;

&lt;h3 id=&quot;dfiterrows&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df.iterrows()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;É muito útil para percorrer as linhas de um dataframe uma a uma. Esse método retorna sempre um índice e a linha correspondente.&lt;/p&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Um resumão de dicas sobre pandas: &lt;a href=&quot;http://leportella.com/cheatlist/2017/11/22/pandas-cheat-list.html&quot;&gt;Pandas cheatsheet da Lelê Portella&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;WebApp pra ajudar a escolher um conjunto de cores: &lt;a href=&quot;http://colorbrewer2.org/&quot;&gt;ColorBrewer2&lt;/a&gt; (obrigada Geremia 😉)&lt;/li&gt;
  &lt;li&gt;O que fazer quando tem muitos pontos? A dica do Filipe (obrigada 😉) foi usar &lt;a href=&quot;https://nbviewer.jupyter.org/github/python-visualization/folium/blob/master/examples/MarkerCluster.ipynb&quot;&gt;um plugin do folium chamado &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MarkerCluster&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 03 Dec 2017 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/folium/</link>
        <guid isPermaLink="true">https://jtemporal.com/folium/</guid>
        
        <category>data science</category>
        
        <category>tutorial</category>
        
        <category>ciencia de dados</category>
        
        <category>analise de dados</category>
        
        <category>python</category>
        
        <category>folium</category>
        
        <category>mapas</category>
        
        <category>openstreetmap</category>
        
        <category>português</category>
        
        <category>git</category>
        
        <category>open source</category>
        
        <category>código</category>
        
        <category>docker</category>
        
        <category>jupyter</category>
        
        
      </item>
    
      <item>
        <title>A Lei de Benford e a beleza dos números</title>
        <description>&lt;p&gt;Conte o número de habitantes de cada cidade brasileira. Coloque isso numa tabela e me diga, quantas vezes cada número (de 1 a 9) se repete como primeiro dígito da contagem. Tá, nós temos 5570 municípios no Brasil, contar a frequência de cada primeiro dígito vai cansar então pode chutar vai, eu deixo. Me diz qual a probabilidade de encontrar o 1 como primeiro dígito? E qual a probabilidade de encontrar o 2 como primeiro dígito?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.giphy.com/media/BmmfETghGOPrW/giphy.gif&quot;&gt;&lt;img src=&quot;https://media.giphy.com/media/BmmfETghGOPrW/giphy.gif&quot; alt=&quot;gif da cena de contas do filme se beber nao case&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E se eu te dissesse que, ao contrário do que imaginamos, a distribuição de “primeiros digitos” não é a mesma para os algarismos de 1 a 9  😱😱😱  Pelo menos não num conjunto “natural” ou de números aleatórios.&lt;/p&gt;

&lt;h2 id=&quot;os-primeiros-dígitos-num-conjunto-númerico&quot;&gt;Os primeiros dígitos num conjunto númerico&lt;/h2&gt;
&lt;p&gt;Okay, se o que a gente esperava não é verdade, então qual é a verdadeira distribuição?! Foi essa pergunta que Frank Benford ajudou a responder.&lt;/p&gt;

&lt;h3 id=&quot;frank-benford&quot;&gt;Frank Benford&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Frank_Benford&quot;&gt;Benford&lt;/a&gt; era um físico americano que pegou as observações iniciais de um astronomo &lt;a href=&quot;https://en.wikipedia.org/wiki/Simon_Newcomb&quot;&gt;Simon Newcomb&lt;/a&gt;, generalizou e aplicou para vários datasets provando a existência de um padrão diferente daquele que a gente pensava ali no começo do post.&lt;/p&gt;

&lt;h3 id=&quot;a-lei&quot;&gt;A Lei&lt;/h3&gt;
&lt;p&gt;Também conhecida como a Lei dos Primeiros Dígitos, a Lei de Benford define que a probabilidade do primeiro dígito de um número segue uma função logaritímica que mostro abaixo:&lt;/p&gt;

\[P (d) =  \log_{10} \left(1 + \frac{1}{d} \right)\]

&lt;p&gt;A probabilidadade do primeiro dígito de um número ser \(d\) é dada pelo \(\log\) na base \(10\) de \(1 + \frac{1}{d}\). Por exemplo se tomarmos \(d = 1\) e \(d = 9\) temos:&lt;/p&gt;

\[P (1) =  \log_{10} \left(1 + \frac{1}{1} \right) = \log_{10} \left(1+1\right) = \log_{10} 2 = 0.3010\]

\[P (9) =  \log_{10} \left(1 + \frac{1}{9} \right) = \log_{10} \left(1+0.11\right) = \log_{10} 1.11 = 0.0453\]

&lt;p&gt;Com isso sabemos que, a probabilidade de termos um \(1\) como primeiro dígito é seis vezes maior de encontrarmos um \(9\) como primeiro dígito. Louco né?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.giphy.com/media/l44QkVjrTiBgettq8/giphy.gif&quot;&gt;&lt;img src=&quot;https://media.giphy.com/media/l44QkVjrTiBgettq8/giphy.gif&quot; alt=&quot;gif da nazaré confusa&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;isso-é-muita-matemática-pra-mim-cadê-o-código&quot;&gt;Isso é muita matemática pra mim, cadê o código?&lt;/h2&gt;
&lt;p&gt;Vamos lá! Hoje vou usar R para demonstrar com código como funciona a Lei de Benford. O objetivo dos passos a seguir é crirar um script que gere automáticamente duas coisas:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;o gráfico da análise de benford;&lt;/li&gt;
  &lt;li&gt;o gráfico para a frequência de cada um dos primeiros dígitos no nosso dataset.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;instalando&quot;&gt;Instalando&lt;/h3&gt;
&lt;p&gt;Comece instalando o R seguindo as instruções disponíveis &lt;a href=&quot;https://cran.r-project.org/&quot;&gt;no site oficial do projeto&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Depois no seu diretório de trabalho, crie um arquivo para instalar as dependências, você pode chamar esse arquivo do que quiser, aqui vou chamar de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;install_packages.R&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-r highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;repos&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;subset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getCRANmirrors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Country&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Brazil&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;install.packages&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;benford.analysis&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;install_packages.R&lt;/code&gt; se encarrega de instalar o pacote &lt;a href=&quot;https://github.com/carloscinelli/benford.analysis&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;benford.analysis&lt;/code&gt;&lt;/a&gt; que traz pronto um conjunto de funções para analisar os dados contra a distribuição de Benford. Para rodar fazemos:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;Rscript install_packages.R
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;rodando-o-script&quot;&gt;Rodando o script&lt;/h3&gt;
&lt;p&gt;Depois criei um arquivo que chamei de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;benfords_law.R&lt;/code&gt; que vai conter os próximos blocos de código.&lt;/p&gt;

&lt;p&gt;Começamos importando/carregando o nosso pacote escolhido. Depois escolhi um dataset que vem com o pacote para esse exemplo (você pode carregar o seu próprio dataset se quiser). Nosso dataset contém o censo da População das Cidades dos Estados Unidos em  2009, veja:&lt;/p&gt;

&lt;div class=&quot;language-r highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;benford.analysis&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;              &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Carrega o pacote benford.analysis&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;census.2009&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;                      &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Carrega o dataset &lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A função principal desse pacote é a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;benford()&lt;/code&gt;, é ela que faz todos os cálculos em cima dos meus dados para validá-los de acordo com a Lei de Benford. Ela irá receber um array numérico e podemos dizer quantos primeiros dígitos queremos análisar usando o argumento &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;number.of.digits&lt;/code&gt;, o padrão para esse argumento é &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2&lt;/code&gt;, mas aqui vamos usar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; por questões demonstrativas:&lt;/p&gt;

&lt;div class=&quot;language-r highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;bfd&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;benford&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;census.2009&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pop.2009&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Coluna com o censo por cidade em 2009&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
               &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;number.of.digits&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Número de Primeiros Dígitos para analisar&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O resultado do método &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;benford()&lt;/code&gt; é uma lista. Essa lista possui oito dataframes contendo os resultados de várias contas e testes que vamos usar daqui pra frente. Algumas desses resultados são utilizados para plotar o gráfico principal da análise. E para plotar o gráfico temos o seguinte resultado:&lt;/p&gt;

&lt;div class=&quot;language-r highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;plot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bfd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/talks/master/benfords-law/benford-population-us.png&quot; alt=&quot;gráficos original&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Gráfico Original gerado pela função &lt;code class=&quot;highlighter-rouge&quot;&gt;benford()&lt;/code&gt;.&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Agora, vamos reproduzir o primeiro gráfico separadamente. Esse primeiro gráfico traz alguns elementos interessantes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Cada barra indica a frequência observada para cada primeiro dígito dentro do dataset;&lt;/li&gt;
  &lt;li&gt;A linha vermelha traça a frequência esperada de acordo com a distribuição de Benford;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para reproduzir esse gráfico começamos utilizando a função para plotar um gráfico de barras &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;barplot()&lt;/code&gt;. Passamos para ela as frequências calculadas pela função &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;benford()&lt;/code&gt; para cada primeiro dígito que se encontram em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bfd$bfd$data.dist.freq&lt;/code&gt;. Os demais atributos setados são para deixar o gráfico de barras mais próximo do gráfico original.&lt;/p&gt;

&lt;div class=&quot;language-r highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;barplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bfd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bfd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data.dist.freq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Valores de frequencia para cada barra&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;names.arg&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bfd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bfd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;digits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Legenda de cada barra no eixo x&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;col&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;#A1DCF0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;                 &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Coloração das barras&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Digits Distribution&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Título principal&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xlab&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Digits&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;                 &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Legenda eixo x&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylab&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Freq&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;                   &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Legenda eixo y&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylim&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;6000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Limite no eixo y&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xlim&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;              &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Limite no eixo x&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;.85&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;                     &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Largura da barra&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Como gráficos em R são feitos por camadas, podemos adicionar a linha vermelha usando uma outra função chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lines()&lt;/code&gt;. Essa função acrescenta uma nova camada em cima do gráfico plotado anteriormente criando uma linha. No gráfico original, a linha vermelha corresponde a frequência esperada de cada dígito de acordo com a distribuição de Benford e estão armazenadas em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bfd$bfd$benford.dist.freq&lt;/code&gt; , então é só passar esse objeto para a função &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lines()&lt;/code&gt;, vejamos:&lt;/p&gt;

&lt;div class=&quot;language-r highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bfd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bfd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;benford.dist.freq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Pontos para formar a linha&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;col&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;red&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;                       &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Cor da linha&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lwd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;                           &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Espessura da linha&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;c&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;                          &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Tipo da linha: tracejado&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jtemporal/talks/master/benfords-law/digits-distribution-population-us.png&quot; alt=&quot;frequência de cada dígito num gráfico de barras&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Gráfico de barras gerado utilizando &lt;code class=&quot;highlighter-rouge&quot;&gt;barplot()&lt;/code&gt;.&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Nota com a linha vermelha quase sobrepõe o topo das barras de frequência?! Então da para perceber como o pacote &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;benford.analysis&lt;/code&gt; ajuda bastante já que não é necessário fazer na mão todos esses cálculos. Esses são algumas funções básicas, você pode também realizar o teste de &lt;a href=&quot;https://pt.wikipedia.org/wiki/Qui-quadrado&quot;&gt;qui-quadrado&lt;/a&gt; em cima dos dados usando a distribuição de Benford e outras estatísticas.&lt;/p&gt;

&lt;h2 id=&quot;benford-pra-quê&quot;&gt;Benford pra quê?&lt;/h2&gt;
&lt;p&gt;Tá, mas pra quê isso tudo isso é útil?&lt;/p&gt;

&lt;p&gt;Conjuntos númericos que são “gerados naturalmente” ou que sofrem muitas transformações matemáticas como censo populacional, apuração de votações, valores de ações e estatísticas de acesso a sites, são exemplos de datasets que se aproximam da Lei de Benford.&lt;/p&gt;

&lt;p&gt;Seres humanos tentando burlar números, muitas vezes desconhecem a Lei de Benford e assumem que os dígitos tem a mesma probabilidade de aparecer ou seguem algum outro padrão diferente do evidenciado por Benford.&lt;/p&gt;

&lt;p&gt;Já se usou até a Lei de Benford para identificar diferenças entre &lt;a href=&quot;https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3356352/&quot;&gt;frames de leitura de procariotos e eucariotos&lt;/a&gt;, mas seu uso mais comum é na identificação de fraudes principalmente em dataset contábeis 💰.&lt;/p&gt;

&lt;h2 id=&quot;leitura-extra&quot;&gt;Leitura extra&lt;/h2&gt;
&lt;p&gt;Aqui tem uns links que andei lendo para ajudar na escrita desse post 💁&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Todos os códigos estão &lt;a href=&quot;https://github.com/jtemporal/talks/tree/master/benfords-law&quot;&gt;nesse repo do GitHub&lt;/a&gt; lá também tem um exemplo bem simples de como gerar “fake data” 🙊&lt;/li&gt;
  &lt;li&gt;Blog post do Giga Matemática: &lt;a href=&quot;http://gigamatematica.blogspot.com.br/2011/07/lei-de-benford.html&quot;&gt;Lei de Benford&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Um blogpost (em inglês) sobre como plotar a lei de Benford sem o uso da biblioteca que usei nesse post: &lt;a href=&quot;https://www.r-bloggers.com/benfords-law-graphed-in-r/&quot;&gt;Benford’s Law Graphed in R&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Vídeo (em inglês) sobre o uso da Lei de Benford para detecção de fraude financeira do Business Insider: &lt;a href=&quot;http://www.businessinsider.com/benfords-law-to-detect-financial-fraud-2014-12&quot;&gt;How Forensic Accountants Use Benford’s Law To Detect Fraud&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Blogpost (em inglês) do DataGenetics: &lt;a href=&quot;http://datagenetics.com/blog/march52012/index.html&quot;&gt;Benford’s Law&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.rexswain.com/benford.html&quot;&gt;Following Benford’s Law, or Looking Out for No. 1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 23 Nov 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/benford-law/</link>
        <guid isPermaLink="true">https://jtemporal.com/benford-law/</guid>
        
        <category>data science</category>
        
        <category>ciencia de dados</category>
        
        <category>analise de dados</category>
        
        <category>r</category>
        
        <category>r-lang</category>
        
        <category>benford</category>
        
        <category>lei de benford</category>
        
        <category>português</category>
        
        <category>git</category>
        
        <category>open source</category>
        
        <category>código</category>
        
        
      </item>
    
      <item>
        <title>Documenting history with Sphinx</title>
        <description>&lt;p&gt;Have you seen those beautiful library documentations around? For example, &lt;a href=&quot;https://docs.bottery.io/en/latest/&quot;&gt;Bottery&lt;/a&gt; or &lt;a href=&quot;http://flask.pocoo.org/docs/0.12/&quot;&gt;Flask&lt;/a&gt;? They are all built with a Python library called &lt;a href=&quot;http://www.sphinx-doc.org/en/stable/#&quot;&gt;Sphinx&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sphinx was created to generate Python’s own documentation and is now widely used because it facilitates automated library documentation building. One cool thing you can do is use Sphinx to build a history of events as done in the &lt;a href=&quot;http://manual-do-big-kahuna.readthedocs.io/en/latest/&quot;&gt;Python Brasil’s Big Kahuna Manual&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With the goal of creating the same type of historical record for regional events, I started a &lt;a href=&quot;https://github.com/pythonsudeste/pythonsudeste_documentacao&quot;&gt;repository for PythonSudeste&lt;/a&gt; and now also one for PyConAmazônia which, thanks to Nilo Menezes, has a complete &lt;a href=&quot;https://www.dropbox.com/s/tr83g5j5amdkyxt/Pycon%20Amaz%C3%B4nia%202017%20-%20Memorial%20da%20Organiza%C3%A7%C3%A3o%20do%20Evento.pdf?dl=0&quot;&gt;post mortem&lt;/a&gt; of the organization made available to the community.&lt;/p&gt;

&lt;p&gt;I’ll narrate here the steps I took hoping that more regional event organizers can make the same type of historical record of their events available.&lt;/p&gt;

&lt;h1 id=&quot;everything-starts-with-a-git-repository&quot;&gt;Everything starts with a git repository&lt;/h1&gt;

&lt;p&gt;I started by adding two files:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirements.txt&lt;/code&gt;: this contains the libraries we’ll use to generate the documentation&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt;: this contains information on how to run the project&lt;/li&gt;
&lt;/ul&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/7e6a99f4245407367dc07740b04f925e.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;The Sphinx project we’ll use here runs in a virtual environment with Python 3. I particularly like using &lt;a href=&quot;https://virtualenv.pypa.io/en/stable/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;virtualenv&lt;/code&gt;&lt;/a&gt; to create my environment:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;virtualenv .env
&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; .env/bin/activate &lt;span class=&quot;c&quot;&gt;# may vary depending on your system&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And to install the dependencies:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;pip install -r requirements.txt
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After installation, we start by running Sphinx’s quickstart:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sphinx-quickstart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This quickstart will ask you numerous questions about how to build your documentation. Some important points about these questions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sphinx-quickstart&lt;/code&gt; you’ll need to answer things like “What’s the project name?”, “What’s the author’s name?” and “What’s the content language?”, so it’s important to answer each question carefully ;)&lt;/li&gt;
  &lt;li&gt;At some point in this questionnaire, the decision is made about separating build and source, and here’s the tip: If you’re going to put it on &lt;a href=&quot;https://readthedocs.org/&quot;&gt;ReadTheDocs&lt;/a&gt; you do &lt;strong&gt;not&lt;/strong&gt; need to commit the build \o/&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the end of this long questionnaire we just answered, you’ll find a ready-to-use structure:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/e4ef18051ec0d627678ad658826dc362.js&quot;&gt;&lt;/script&gt;

&lt;h1 id=&quot;build&quot;&gt;build/&lt;/h1&gt;

&lt;p&gt;Initially empty, but when we run the build command it will get filled up ;P&lt;/p&gt;

&lt;h1 id=&quot;source&quot;&gt;source/&lt;/h1&gt;

&lt;p&gt;That’s where we’ll put all our files that will become pages of our project.&lt;/p&gt;

&lt;h1 id=&quot;confpy&quot;&gt;conf.py&lt;/h1&gt;

&lt;p&gt;The answers we gave during quickstart are stored inside this configuration file and it’s what sphinx uses to generate the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.html&lt;/code&gt; files from the text files. Note here that Sphinx’s preferred extension is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.rst&lt;/code&gt; for reStructuredText and I suspect they chose &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.rst&lt;/code&gt; because it’s an indentation-based writing form. 👀&lt;/p&gt;

&lt;h1 id=&quot;indexrst&quot;&gt;index.rst&lt;/h1&gt;

&lt;p&gt;It’s from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.rst&lt;/code&gt; that Sphinx will build your documentation’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.html&lt;/code&gt;. If you open the index.rst on GitHub you’ll see that it’s relatively simple:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/39028b49f8c0b851b4bfccf2b4a149fc.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;This is the “factory version” of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.rst&lt;/code&gt; that is created when running quickstart. With it, you can already run an initial build of the site. To build the site we use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make&lt;/code&gt;, which is responsible for finding the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.rst&lt;/code&gt; files in the project directory and “translating” them to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.html&lt;/code&gt;. Let’s see:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;make html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After running the build without errors, the result on screen should look like this:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/jtemporal/123389890312d764ec16bcea64e06178.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;em&gt;But Jessica, why build if you said above that ReadTheDocs doesn’t need it?&lt;/em&gt; It’s true, but the easiest way to check the result of your work is locally and for that you need the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.html&lt;/code&gt; pages.&lt;/p&gt;

&lt;p&gt;Another thing you’ll need is a way to view these pages. Of course you can just open the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.html&lt;/code&gt; files in your favorite browser, but another option is to use a server. Servers were added as part of Python 3’s &lt;a href=&quot;https://docs.python.org/3/library/http.server.html#module-http.server&quot;&gt;built-in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http&lt;/code&gt; module&lt;/a&gt; and are very useful in cases like this. To start a server process just run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;python -m &quot;http.server&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And using the browser access the path &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localhost:8000&lt;/code&gt;. While running the process from the project root as we did, you should see a listing of all files and directories in your browser:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/cLzKN77.png&quot; style=&quot;max-width: 60%;&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Then just follow the path to the folder where the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.html&lt;/code&gt; files are:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/1XNPT8Q.png&quot; style=&quot;max-width: 60%;&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;When clicking on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;html/&lt;/code&gt;, since it contains an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.html&lt;/code&gt; file, your browser will show the result of the build which looks something like this using the factory-generated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.rst&lt;/code&gt;:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/X0VyLbU.png&quot; /&gt;
&lt;small&gt;
&lt;i&gt;Result of the first build with the factory index.rst&lt;/i&gt;
&lt;/small&gt;
&lt;/center&gt;

&lt;h1 id=&quot;content-introduction-o&quot;&gt;Content Introduction \o/&lt;/h1&gt;

&lt;p&gt;All these steps so far were to prepare our project to get to the part we really want. Let’s start by creating a content page called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyconamazonia2017.rst&lt;/code&gt; with just a title and create the connection between it and our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.rst&lt;/code&gt;.&lt;/p&gt;

&lt;center&gt;
&lt;script src=&quot;https://gist.github.com/jtemporal/8d6a0aea5efe3dd251e4787b876863df.js&quot;&gt;&lt;/script&gt;
&lt;/center&gt;

&lt;center&gt;
&lt;script src=&quot;https://gist.github.com/jtemporal/b604f5ea85b0240cf2466a91b3726e23.js&quot;&gt;&lt;/script&gt;
&lt;/center&gt;

&lt;p&gt;When running the build we’ll get the following result:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/nA3IG1u.png&quot; /&gt;
&lt;small&gt;
&lt;i&gt;build result for pyconamazonia.rst&lt;/i&gt;
&lt;/small&gt;
&lt;/center&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/7ReRbwJ.png&quot; /&gt;
&lt;small&gt;
&lt;i&gt;build result for index.rst&lt;/i&gt;
&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;Changing the content of this &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.rst&lt;/code&gt; a bit to add a cover for example we have:&lt;/p&gt;

&lt;center&gt;
&lt;script src=&quot;https://gist.github.com/jtemporal/5d026f71e9bad58e1ce064551cf49615.js&quot;&gt;&lt;/script&gt;
&lt;/center&gt;

&lt;p&gt;Note: the image didn’t render here because the link only works within the project since it has a folder containing the image. After building, the page looks like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/skq9ygN.png&quot; alt=&quot;rendering the project with cover&quot; /&gt;&lt;/p&gt;

&lt;p&gt;From there, just continue filling and connecting new pages in whatever way you find most interesting ;)&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;After all this you might think the default theme for the pages isn’t great and want to change it. Sphinx has several built-in themes but here we’ll use the ReadTheDocs theme. First, we start by adding it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirements.txt&lt;/code&gt;:&lt;/p&gt;

&lt;center&gt;
&lt;script src=&quot;https://gist.github.com/jtemporal/32648f3777c33ff2feb8961c49be9173.js&quot;&gt;&lt;/script&gt;
&lt;small&gt;
&lt;i&gt;requirements.txt with the ReadTheDocs theme&lt;/i&gt;
&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;And then installing it like this:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;(.env) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now we just need to change the theme variable value in the configuration file (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conf.py&lt;/code&gt;) to use the ReadTheDocs theme:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;html_theme = &apos;sphinx_rtd_theme&apos;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And when building again, your home page will look like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/fVXB8YJ.png&quot; alt=&quot;project rendered with Read The Docs theme&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;h1 id=&quot;considerations&quot;&gt;Considerations&lt;/h1&gt;

&lt;p&gt;The PyConAmazônia memorial project was structured to receive &lt;strong&gt;the highest number of possible contributions&lt;/strong&gt;. If you want to &lt;a href=&quot;https://github.com/pythonbrasil/pycon-amazonia-memorial&quot;&gt;check out how this is going on GitHub&lt;/a&gt; 🎉&lt;/p&gt;

&lt;p&gt;And a tip about &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.rst&lt;/code&gt; is to &lt;a href=&quot;https://github.com/ralsina/rst-cheatsheet/blob/master/rst-cheatsheet.rst&quot;&gt;use this cheatsheet&lt;/a&gt; when you don’t know how to do something in restructured text 🙃&lt;/p&gt;

&lt;p&gt;Now, the part about putting all this online is for the next post, that’s all folks ;)&lt;/p&gt;

&lt;h1 id=&quot;acknowledgments&quot;&gt;Acknowledgments&lt;/h1&gt;

&lt;p&gt;Marco Rougeth and Silvia Benza for reviews.&lt;/p&gt;
</description>
        <pubDate>Mon, 30 Oct 2017 11:00:00 +0000</pubDate>
        <link>https://jtemporal.com/documenting-history-with-sphinx/</link>
        <guid isPermaLink="true">https://jtemporal.com/documenting-history-with-sphinx/</guid>
        
        <category>tutorial</category>
        
        <category>python</category>
        
        <category>sphinx</category>
        
        <category>readthedocs</category>
        
        <category>read the docs</category>
        
        <category>documentation</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Documentando a história com Sphinx</title>
        <description>&lt;p&gt;Sabe aquelas documentações bonitas de bibliotecas que você encontra por aí? Por exemplo, a documentação do &lt;a href=&quot;https://docs.bottery.io/en/latest/&quot;&gt;Bottery&lt;/a&gt; ou a do &lt;a href=&quot;http://flask.pocoo.org/docs/0.12/&quot;&gt;Flask&lt;/a&gt;? Todas são construídas com uma biblioteca Python chamada &lt;a href=&quot;http://www.sphinx-doc.org/en/stable/#&quot;&gt;Sphinx&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sphinx foi criada para gerar a própria documentação do Python e hoje é muito utilizada por facilitar a construção automatizada de documentações de bibliotecas. Uma coisa legal que dá para fazer é utilizar Sphinx para construir um histórico de acontecimentos como é feito no &lt;a href=&quot;http://manual-do-big-kahuna.readthedocs.io/en/latest/&quot;&gt;Manual do Big Kahuna da Python Brasil&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Com o objetivo de fazer o mesmo tipo de histórico com eventos regionais comecei um &lt;a href=&quot;https://github.com/pythonsudeste/pythonsudeste_documentacao&quot;&gt;repositório para a PythonSudeste&lt;/a&gt; e agora também um para PyConAmazônia que, graças ao Nilo Menezes, &lt;a href=&quot;https://www.dropbox.com/s/tr83g5j5amdkyxt/Pycon%20Amaz%C3%B4nia%202017%20-%20Memorial%20da%20Organiza%C3%A7%C3%A3o%20do%20Evento.pdf?dl=0&quot;&gt;possui um &lt;em&gt;post mortem&lt;/em&gt; da organização completo disponibilizado para a comunidade&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Vou narrar aqui os passos que fiz na esperança que mais organizadores de eventos regionais possam disponibilizar o mesmo tipo de levantamento histórico de seus eventos.&lt;/p&gt;

&lt;h2 id=&quot;tudo-começa-com-repositório-git&quot;&gt;Tudo começa com repositório git&lt;/h2&gt;

&lt;p&gt;Comecei adicionando dois arquivos:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirements.txt&lt;/code&gt;: esse contém as bibliotecas que vamos usar para gerar a documentação&lt;/li&gt;
&lt;/ul&gt;
&lt;center&gt;
&lt;script src=&quot;https://gist.github.com/jtemporal/7e6a99f4245407367dc07740b04f925e.js&quot;&gt;&lt;/script&gt;
&lt;small&gt;
&lt;i&gt;requirements.txt&lt;/i&gt;
&lt;/small&gt;
&lt;/center&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt;: esse contém informações de como rodar o projeto
O projeto Sphinx que vamos usar aqui roda num ambiente virtual com Python 3. Eu particularmente gosto de usar &lt;a href=&quot;https://virtualenv.pypa.io/en/stable/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;virtualenv&lt;/code&gt;&lt;/a&gt; para criar meu ambiente:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;virtualenv .env
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; .env/bin/activate &lt;span class=&quot;c&quot;&gt;# pode variar depedendo do seu sistema&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;E para instalar as dependencias:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;(.env) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Depois de instaladas, começamos rodando o quickstart do Sphinx:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;(.env) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;sphinx-quickstart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Esse &lt;em&gt;quickstart&lt;/em&gt; vai te fazer inúmeras perguntas de como montar a sua documentação. Eu &lt;a href=&quot;https://gist.github.com/jtemporal/e30f156e6444ca20fe07f65e0c6215bf&quot;&gt;copiei o &lt;em&gt;output&lt;/em&gt; em um Gist&lt;/a&gt; para que você possa estudar o que responder para cada uma das perguntas e também para que veja as repostas que eu dei. Em sua maioria, eu segui com o padrão já oferecido pelo Sphinx. Alguns pontos importantes dessas perguntas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Rodando o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sphinx-quickstart&lt;/code&gt; você precisará responder coisas como “Qual o nome do projeto?”, “Qual o nome do autor?” e “Qual a língua do conteúdo?”, então é importante responder com calma cada uma das perguntas ;)&lt;/li&gt;
  &lt;li&gt;Em algum momento desse questionário é tomada a decisão sobre separar o &lt;em&gt;build&lt;/em&gt; e o &lt;em&gt;source&lt;/em&gt; e aqui a dica é: Se for colocar no &lt;a href=&quot;https://readthedocs.org/&quot;&gt;ReadTheDocs&lt;/a&gt; &lt;strong&gt;não&lt;/strong&gt; precisa &lt;em&gt;commitar&lt;/em&gt; o &lt;em&gt;build&lt;/em&gt; \o/ (mas eu vou falar disso melhor num outro post)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao final desse longo questionário que acabamos de responder, você vai encontrar uma estrutura pronta para ser usada:&lt;/p&gt;

&lt;center&gt;
&lt;script src=&quot;https://gist.github.com/jtemporal/e4ef18051ec0d627678ad658826dc362.js&quot;&gt;&lt;/script&gt;
&lt;/center&gt;

&lt;h3 id=&quot;build&quot;&gt;build/&lt;/h3&gt;

&lt;p&gt;Inicialmente vazia, mas quando rodarmos o comando de construção do site lá vai ficar cheio de coisa ;P&lt;/p&gt;

&lt;h3 id=&quot;source&quot;&gt;source/&lt;/h3&gt;
&lt;p&gt;É lá que vamos colocar todos nossos arquivos que vão virar páginas do nosso projeto.&lt;/p&gt;

&lt;h3 id=&quot;confpy&quot;&gt;conf.py&lt;/h3&gt;
&lt;p&gt;As respostas que demos durante o &lt;em&gt;quickstart&lt;/em&gt; ficam armazenadas dentro desse arquivo de configurações e é ele que o sphinx usa para gerar os arquivos &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.html&lt;/code&gt; a partir dos arquivos de texto. Aqui note que a extensão preferida do Sphinx é &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.rst&lt;/code&gt; de &lt;em&gt;reStructuredText&lt;/em&gt; e desconfio que escolheram &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.rst&lt;/code&gt; por ser uma forma de escrita baseada em identação. 👀&lt;/p&gt;

&lt;h3 id=&quot;indexrst&quot;&gt;index.rst&lt;/h3&gt;
&lt;p&gt;É a partir do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.rst&lt;/code&gt; que o Sphinx vai construir o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.html&lt;/code&gt; da sua documentação. Se você abrir o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.rst&lt;/code&gt; no GitHub você vai ver que ele é relativamente simples:&lt;/p&gt;

&lt;center&gt;
&lt;script src=&quot;https://gist.github.com/jtemporal/39028b49f8c0b851b4bfccf2b4a149fc.js&quot;&gt;&lt;/script&gt;
&lt;/center&gt;

&lt;p&gt;Essa é a “versão de fábrica” do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.rst&lt;/code&gt; que é criada ao rodar o &lt;em&gt;quickstart&lt;/em&gt;. Com ela já é possível rodar um &lt;em&gt;build&lt;/em&gt; inicial do site. Para fazer o &lt;em&gt;build&lt;/em&gt; usamos o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make&lt;/code&gt;, ele se encarrega de buscar no diretório do projeto os arquivos &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.rst&lt;/code&gt; e “traduzi-los” para &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.html&lt;/code&gt;. Vejamos:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;(.env) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;make html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;se rodar sem erros, o resultado na tela deve ser parecido com isso:&lt;/p&gt;
&lt;center&gt;
&lt;script src=&quot;https://gist.github.com/jtemporal/123389890312d764ec16bcea64e06178.js&quot;&gt;&lt;/script&gt;
&lt;/center&gt;
&lt;p&gt;&lt;em&gt;Mas Jessica, pra quê build se você mesma disse lá em cima que o ReadTheDocs não precisa dele?&lt;/em&gt; É verdade, mas o jeito mais fácil de verificar o resultado do seu trabalho é localmente e para isso você precisa ter as páginas &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Outra coisa que você vai precisar é uma forma de visualizar essas páginas, claro que você pode apenas abrir os arquivos &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.html&lt;/code&gt; no seu navegador favorito, mas outra opção é usar iniciar um &lt;em&gt;server&lt;/em&gt; (servidor). Servidores foram adicionados como parte &lt;a href=&quot;https://docs.python.org/3/library/http.server.html#module-http.server&quot;&gt;built-in do módulo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http&lt;/code&gt; no Python 3&lt;/a&gt; e são muito úteis em casos como esse. Para iniciar um processo servidor basta rodar:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;(.env) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;python &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;http.server&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E usando o navegador acessar o caminho &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localhost:8000&lt;/code&gt;. Rodando o processo a partir do root do projeto como fizemos você deve ver uma listagem de todos arquivos e diretórios no seu navegador:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/cLzKN77.png&quot; style=&quot;max-width: 60%;&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;E aí é só seguir pelo caminho até a pasta onde estão os &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.html&lt;/code&gt;:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/1XNPT8Q.png&quot; style=&quot;max-width: 60%;&quot; /&gt;
&lt;/center&gt;

&lt;p&gt;Ao clicar em &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;html/&lt;/code&gt;, por conter um arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.html&lt;/code&gt;, seu navegador irá mostrar o resultado do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;build&lt;/code&gt; que fica mais ou menos assim usando o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.rst&lt;/code&gt; gerado de fábrica:&lt;/p&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/X0VyLbU.png&quot; /&gt;
&lt;small&gt;
&lt;i&gt;Resultado do primeiro build com o index.rst de fábrica&lt;/i&gt;
&lt;/small&gt;
&lt;/center&gt;

&lt;h2 id=&quot;introdução-de-conteúdo-o&quot;&gt;Introdução de conteúdo \o/&lt;/h2&gt;

&lt;p&gt;Todos esses passos até agora foram para preparar nosso projeto para chegar na parte que realmente queremos. Vamos começar criando uma página de conteúdo chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyconamazonia2017.rst&lt;/code&gt; apenas com um título e criar a conexão entre ela e nosso &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.rst&lt;/code&gt;, veja:&lt;/p&gt;

&lt;center&gt;
&lt;script src=&quot;https://gist.github.com/jtemporal/8d6a0aea5efe3dd251e4787b876863df.js&quot;&gt;&lt;/script&gt;
&lt;/center&gt;

&lt;center&gt;
&lt;script src=&quot;https://gist.github.com/jtemporal/b604f5ea85b0240cf2466a91b3726e23.js&quot;&gt;&lt;/script&gt;
&lt;/center&gt;

&lt;p&gt;Ao rodar o &lt;em&gt;build&lt;/em&gt; teremos o seguinte resultado:&lt;/p&gt;
&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/nA3IG1u.png&quot; /&gt;
&lt;small&gt;
&lt;i&gt;resultado do build para pyconamazonia.rst&lt;/i&gt;
&lt;/small&gt;
&lt;/center&gt;

&lt;center&gt;
&lt;img src=&quot;https://i.imgur.com/7ReRbwJ.png&quot; /&gt;
&lt;small&gt;
&lt;i&gt;resultado do build para index.rst&lt;/i&gt;
&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;Mudando um pouco o conteudo desse &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.rst&lt;/code&gt; para colocar uma capa por exemplo temos:&lt;/p&gt;
&lt;center&gt;
&lt;script src=&quot;https://gist.github.com/jtemporal/5d026f71e9bad58e1ce064551cf49615.js&quot;&gt;&lt;/script&gt;
&lt;small&gt;
&lt;i&gt;index.rst com link para imagem de capa&lt;/i&gt;
&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;Nota: a imagem não renderizou aqui pois o link só faz sentido dentro do projeto já que este possui uma pasta que contém a imagem. Depois do &lt;em&gt;build&lt;/em&gt; a página fica assim:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/skq9ygN.png&quot; alt=&quot;renderizando o projeto com a capa&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A partir daí é só continuar preenchendo e conectando novas páginas do jeito que achar mais interessante ;)&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Depois de tudo isso você pode achar que o tema padrão para as páginas não tá legal e querer mudar. O Sphinx possui vários temas embutidos mas aqui vamos usar o tema do ReadTheDocs. Primeiro começamos adicionando ele ao &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirements.txt&lt;/code&gt;:&lt;/p&gt;

&lt;center&gt;
&lt;script src=&quot;https://gist.github.com/jtemporal/32648f3777c33ff2feb8961c49be9173.js&quot;&gt;&lt;/script&gt;
&lt;small&gt;
&lt;i&gt;requirements.txt com o tema do ReadTheDocs&lt;/i&gt;
&lt;/small&gt;
&lt;/center&gt;

&lt;p&gt;E depois instalando da seguinte forma:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;(.env) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E agora fica só faltando alterar o valor da variável que indica o tema no arquivo de configuração (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conf.py&lt;/code&gt;) para o tema do ReadTheDocs:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;html_theme = ‘sphinx_rtd_theme’
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;E ao fazer novo &lt;em&gt;build&lt;/em&gt;, a sua página inicial vai ter essa carinha:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/fVXB8YJ.png&quot; alt=&quot;projeto renderizado com o tema do Read The Docs&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;considerações&quot;&gt;Considerações&lt;/h2&gt;

&lt;p&gt;O projeto do memorial da PyCon Amazônia foi estruturado para receber &lt;strong&gt;o maior número de contribuições possíveis&lt;/strong&gt;. Se quiser &lt;a href=&quot;https://github.com/pythonbrasil/pycon-amazonia-memorial&quot;&gt;corre lá no GitHub pra ver como tá sendo isso&lt;/a&gt; 🎉&lt;/p&gt;

&lt;p&gt;E uma dica sobre &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.rst&lt;/code&gt; é &lt;a href=&quot;https://github.com/ralsina/rst-cheatsheet/blob/master/rst-cheatsheet.rst&quot;&gt;usar esse cheatsheet aqui&lt;/a&gt; quando não souber a forma de fazer algo em restructured text 🙃&lt;/p&gt;

&lt;p&gt;Agora, a parte de deixar tudo isso online fica pro próximo post, por hoje é isso pessoal ;)&lt;/p&gt;

&lt;h2 id=&quot;agradecimentos&quot;&gt;Agradecimentos&lt;/h2&gt;
&lt;p&gt;Marco Rougeth e Silvia Benza pelas revisões.&lt;/p&gt;
</description>
        <pubDate>Mon, 30 Oct 2017 10:00:00 +0000</pubDate>
        <link>https://jtemporal.com/documentando-a-historia-com-sphinx/</link>
        <guid isPermaLink="true">https://jtemporal.com/documentando-a-historia-com-sphinx/</guid>
        
        <category>tutorial</category>
        
        <category>python</category>
        
        <category>sphinx</category>
        
        <category>readthedocs</category>
        
        <category>read the docs</category>
        
        <category>documentação</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>#SerenataDeAmor nesse Hacktoberfest</title>
        <description>&lt;p&gt;A &lt;a href=&quot;https://serenata.ai/&quot;&gt;Operação Serenata de Amor&lt;/a&gt; vive de contribuições, tanto financeiras quanto de código. Pensando nisso, passamos um tempinho escolhendo algumas issues para colocar a label do Hacktoberfest. Se você desenvolve a muito tempo ou começou agora, considere doar um pouquinho do seu tempo e cérebro esse mês para a Serenata.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo sobre isso, clica aqui nesse botão 👇&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/data-science-brigade/serenatadeamor-nesse-hacktoberfest-a752b909b433&quot;&gt;&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; alt=&quot;clique aqui para ler&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 02 Oct 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/serenata-hacktoberfest/</link>
        <guid isPermaLink="true">https://jtemporal.com/serenata-hacktoberfest/</guid>
        
        <category>serenata</category>
        
        <category>hacktoberfest</category>
        
        <category>open source</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Projetos Brasileiros para fazer pull requests nesse Hacktoberfest</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://jtemporal.com/projetos-br-hacktoberfest-2025/&quot;&gt;Edição atual da lista disponível aqui&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Se não sabe ainda o que é o Hacktoberfest &lt;a href=&quot;https://jtemporal.com/hacktoberfest-2017/&quot;&gt;da uma olhadinha nesse outro post que explico o que é e como participar&lt;/a&gt;. Pra quem já sabe e não faz ideia de quais projetos contribuir, aqui tem uma lista de alguns projetos que valem a pena dar uma mão ;)&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra ver projetos Brasileiros  para contribuir clica aqui nesse botão 👇&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/nossa-coletividad/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-4dc9b9b576c0&quot;&gt;&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; alt=&quot;clique aqui para ler&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Mon, 02 Oct 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/lista-projetos-br-hacktoberfest/</link>
        <guid isPermaLink="true">https://jtemporal.com/lista-projetos-br-hacktoberfest/</guid>
        
        <category>hacktoberfest</category>
        
        <category>GitHub</category>
        
        <category>Git</category>
        
        <category>open source</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Ajude algum projeto, ganhe uma camiseta e dê o primeiro passo no mundo do código aberto</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://nyc3.digitaloceanspaces.com/hacktoberfest/Hacktoberfest17-TWFB-02.png&quot; alt=&quot;hacktoberfest banner promocional&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;esse-texto-é-especialmente-pra-você-que-nunca-contribuiu-com-algum-projeto-open-source-antes&quot;&gt;Esse texto é especialmente pra você que nunca contribuiu com algum projeto open source antes&lt;/h3&gt;

&lt;h3 id=&quot;aah-o-mês-de-outubro&quot;&gt;Aah o mês de outubro…&lt;/h3&gt;
&lt;p&gt;O mês de outubro está chegando e para mim, ele fica marcado por duas coisas: a Python Brasil e pelas contribuições em projetos de código aberto. A Python Brasil é assunto para um outro post, hoje quero falar um pouquinho (mais) de open source.&lt;/p&gt;

&lt;p&gt;Todo outubro, a Digital Ocean, empresa que provê infraestrutura para computação em nuvem, formaliza a sua parceria com o GitHub para realização do &lt;a href=&quot;https://blog.digitalocean.com/hacktoberfest-2017/&quot;&gt;Hacktoberfest&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;o-hacktoberfest&quot;&gt;O Hacktoberfest&lt;/h3&gt;
&lt;p&gt;É um evento que dura o mês inteiro e busca incentivar a participação em projetos open source, então saber um pouquinho de código para participar é interessante, mas não se deixe intimidar, tem espaço para todos os níveis de conhecimento. E a melhor parte: qualquer pessoa que queira pode participar da sua própria casa!&lt;/p&gt;

&lt;h3 id=&quot;objetivos&quot;&gt;Objetivos&lt;/h3&gt;
&lt;p&gt;Abrir quatro &lt;em&gt;pull requests&lt;/em&gt; em &lt;strong&gt;qualquer repositório público&lt;/strong&gt; no GitHub independente se esse projeto tem ou não &lt;em&gt;issues&lt;/em&gt; marcadas com a &lt;em&gt;label&lt;/em&gt; do evento. E não precisa ter seu &lt;em&gt;pull request&lt;/em&gt; aceito para ele ser contabilizado — alguns &lt;em&gt;pull requests&lt;/em&gt; demoram mesmo para serem revisados e aceitos —, mas imagina que legal ter contribuições aceitas? Todo mundo ganha!&lt;/p&gt;

&lt;h3 id=&quot;regras&quot;&gt;Regras&lt;/h3&gt;
&lt;p&gt;Cada um dos quatro &lt;em&gt;pull requests&lt;/em&gt; precisam ser feitos entre os dias 1 e 31 de outubro em qualquer fuso horário. E não vale fazer spam, &lt;em&gt;pull requests&lt;/em&gt; marcados como spam vão te tirar da brincadeira.&lt;/p&gt;

&lt;h3 id=&quot;como-participar&quot;&gt;Como participar&lt;/h3&gt;
&lt;p&gt;Você vai precisar ter uma conta no GitHub (&lt;a href=&quot;https://github.com/join?source=header-home&quot;&gt;vai lá! Faz a sua&lt;/a&gt;! É rapidinho 😉). Depois de ter a conta no GitHub, é necessário se &lt;a href=&quot;https://hacktoberfest.digitalocean.com/sign_up/register&quot;&gt;cadastrar no evento&lt;/a&gt; para contabilizar cada uma das quatro contribuições. Você vai precisar também saber um mínimo de como funciona Git (vou deixar alguns links sobre isso lá no fim no artigo).&lt;/p&gt;

&lt;h3 id=&quot;premiação&quot;&gt;Premiação&lt;/h3&gt;
&lt;p&gt;Além de dar os primeiros passos nessa onda de contribuições, aprender com o feedback que receber no seu &lt;em&gt;pull request&lt;/em&gt; e ajudar algum projeto legal, você ainda ganha uma camiseta linda! Isso mesmo, depois de um tempinho, vai chegar na sua casa uma linda camiseta para você mostrar pra todo mundo!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.giphy.com/media/zaezT79s3Ng7C/giphy.gif&quot;&gt;&lt;img src=&quot;https://media.giphy.com/media/zaezT79s3Ng7C/giphy.gif&quot; alt=&quot;gif vamos fazer isso&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
  &lt;i&gt;&lt;a href=&quot;https://media.giphy.com/media/zaezT79s3Ng7C/giphy.gif&quot;&gt;
    Fonte
  &lt;/a&gt;&lt;/i&gt;
&lt;/center&gt;

&lt;hr /&gt;

&lt;p&gt;Vou deixar aqui alguns links que podem ser úteis e te ajudar a perder o medo.&lt;/p&gt;

&lt;h3 id=&quot;contribuições&quot;&gt;Contribuições&lt;/h3&gt;
&lt;p&gt;Recomendo fortemente ler o texto da &lt;a href=&quot;http://leportella.com&quot;&gt;Leticia Portella&lt;/a&gt; sobre &lt;a href=&quot;https://medium.com/@leportella/como-contribuir-para-um-projeto-open-source-pela-primeira-vez-sem-escrever-código-21e55a896fb0&quot;&gt;como contribuir para um projeto sem escrever código&lt;/a&gt;. E, se inglês não for um problema, leia também o &lt;a href=&quot;https://opensource.guide/how-to-contribute/&quot;&gt;Open Source Guide sobre como contribuir&lt;/a&gt;, não importa se você é um veterano ou iniciante em contribuições.&lt;/p&gt;

&lt;h3 id=&quot;git&quot;&gt;Git&lt;/h3&gt;
&lt;p&gt;Para aprender Git, você pode seguir o &lt;a href=&quot;https://www.codecademy.com/pt/learn/learn-git&quot;&gt;curso de Git da codecademy&lt;/a&gt; ou o &lt;a href=&quot;https://www.codeschool.com/courses/try-git&quot;&gt;curso da CodeSchool&lt;/a&gt;, ambos muito bons. Git não é fácil, mas todo mundo pode aprender.&lt;/p&gt;

&lt;h3 id=&quot;hacktoberfest&quot;&gt;Hacktoberfest&lt;/h3&gt;
&lt;p&gt;Dá para conferir o que rolou na &lt;a href=&quot;https://blog.digitalocean.com/looking-back-at-hacktoberfest/&quot;&gt;Hacktoberfest 2015&lt;/a&gt; e na &lt;a href=&quot;https://blog.digitalocean.com/open-source-at-its-hacktoberbest/&quot;&gt;Hacktoberfest 2016&lt;/a&gt;. Muito importante também, &lt;a href=&quot;https://hacktoberfest.digitalocean.com/&quot;&gt;o site oficial do evento&lt;/a&gt; para mais informações.&lt;/p&gt;

&lt;p&gt;Também &lt;a href=&quot;https://hacktoberfestchecker.herokuapp.com/&quot;&gt;dá para conferir quantos &lt;em&gt;pull requests&lt;/em&gt; foram feitos&lt;/a&gt; depois de ter se cadastrado 😉&lt;/p&gt;

&lt;h3 id=&quot;projetos-para-contribuir&quot;&gt;Projetos para contribuir&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/nossa-coletividad/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-4dc9b9b576c0&quot;&gt;Tá aqui a lista de projetos brasileiros que estão aceitando pull requests nesse mês de outubro&lt;/a&gt;. Happy hacking! 🎉&lt;/p&gt;

&lt;h6 id=&quot;originalmente-postado-no-meu-medium&quot;&gt;Originalmente postado &lt;a href=&quot;https://medium.com/@jessicatemporal/ajude-algum-projeto-ganhe-uma-camiseta-e-dê-o-primeiro-passo-no-mundo-do-código-aberto-74b425509f9c&quot;&gt;no meu Medium&lt;/a&gt;.&lt;/h6&gt;
</description>
        <pubDate>Mon, 02 Oct 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/hacktoberfest-2017/</link>
        <guid isPermaLink="true">https://jtemporal.com/hacktoberfest-2017/</guid>
        
        <category>github</category>
        
        <category>git</category>
        
        <category>digital ocean</category>
        
        <category>hacktoberfest</category>
        
        <category>open source</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Deploy automatizado para o PyPI usando Travis-CI</title>
        <description>&lt;p&gt;Como o Travis pode te ajudar a automatizar o lançamento de novas versões de um pacote Python para o Python Package Index.&lt;/p&gt;

&lt;p&gt;Pessoas que escrevem bons códigos normalmente seguem a filosofia DRY (&lt;em&gt;“don’t repeat yourself”&lt;/em&gt; ou não se repita). Além de fazer isso em código, muitas fazem o mesmo para tarefas que vão ter que ser repetidas com certa frequência: subir uma nova máquina virtual, configurar o ambiente de trabalho ou até mesmo o &lt;em&gt;deploy&lt;/em&gt; de novas versões de código. Evitar repetições e automatizar processos se torna algo muito presente no nosso trabalho diário principalmente por ser uma das essências da computação.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo esse artigo e saber como funciona o deploy automatizado do Serenata Toolbox usando o Travis, corre lá para a revista do Serenata de Amor 👇&lt;/p&gt;

&lt;center&gt;
&lt;a href=&quot;https://medium.com/serenata/deploy-automatizado-para-o-pypi-usando-travis-ci-159e86e5d979&quot;&gt;

&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; /&gt;

&lt;/a&gt;
&lt;/center&gt;
</description>
        <pubDate>Thu, 28 Sep 2017 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/deploy-automatizado-para-o-pypi-usando-travis/</link>
        <guid isPermaLink="true">https://jtemporal.com/deploy-automatizado-para-o-pypi-usando-travis/</guid>
        
        <category>medium</category>
        
        <category>python</category>
        
        <category>pip</category>
        
        <category>python</category>
        
        <category>pip install</category>
        
        <category>pypi</category>
        
        <category>serenata toolbox</category>
        
        <category>git</category>
        
        <category>semantic versioning</category>
        
        <category>versionamento semantico</category>
        
        <category>deploy</category>
        
        <category>travis</category>
        
        <category>ci</category>
        
        <category>cd</category>
        
        <category>continuous integration</category>
        
        <category>continous delivery</category>
        
        <category>integracao continua</category>
        
        <category>travis ci</category>
        
        
      </item>
    
      <item>
        <title>Em quem você pensa quando te pedem uma indicação?</title>
        <description>&lt;p&gt;Você conhece mulheres qualificadas. Por que não indicá-las?&lt;/p&gt;

&lt;p&gt;Dei várias palestras ao longo deste ano e se tornou comum as pessoas me chamarem para combinar outras palestras, ser mentora em hackathons, organizar eventos e afins. Algumas vezes minha agenda não me permite aceitar os convites como eu gostaria e então essas pessoas me fazem a fatídica pergunta: &lt;em&gt;Me indica alguém?&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo esse artigo corre lá para a revista do Code Like a Girl 👇&lt;/p&gt;

&lt;center&gt;
&lt;a href=&quot;https://code.likeagirl.io/em-quem-voc%C3%AA-pensa-quando-te-pedem-uma-indica%C3%A7%C3%A3o-b15e047b7759&quot;&gt;

&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; /&gt;

&lt;/a&gt;
&lt;/center&gt;
</description>
        <pubDate>Thu, 21 Sep 2017 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/em-quem-voce-pensa-quando-te-pedem-uma-indicacao/</link>
        <guid isPermaLink="true">https://jtemporal.com/em-quem-voce-pensa-quando-te-pedem-uma-indicacao/</guid>
        
        <category>medium</category>
        
        <category>python</category>
        
        <category>pessoal</category>
        
        <category>carreira</category>
        
        
      </item>
    
      <item>
        <title>9º Seminário Catarinense de Transparência e Controle</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1600/1*LjwvQHIFNA1tC-LLv_BpdA.jpeg&quot; alt=&quot;Foto Tony, Jess e De Bona&quot; /&gt;&lt;/p&gt;
&lt;center&gt;&lt;i&gt;Da esquerda para direita: Pedro Vilanova, Jessica Temporal e Rodrigo De Bona&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;Palestra conjunta com o Pedro Vilanoca no 9º Seminário Catarinense de Transparência e Controle Social que rolou em Florianopólis à convite do Rodrigo De Bona.&lt;/p&gt;

&lt;h3 id=&quot;evento&quot;&gt;Evento&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://florianopolis.osbrasil.org.br/2017/08/16/9o-seminario-catarinense-de-transparencia-e-controle-social/&quot;&gt;9º Seminário Catarinense de Transparência e Controle Social&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;apresentação&quot;&gt;Apresentação&lt;/h3&gt;
&lt;center&gt;
&lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vSm625kFOyi5ITeXpNwOEQcThBO6a_xrTZgXbk6oSNdkH30qqho_GG_oSKpoF9YaR19PWVY1QcF0968/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;480&quot; height=&quot;299&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Tue, 29 Aug 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/serenata-seminario-transparencia/</link>
        <guid isPermaLink="true">https://jtemporal.com/serenata-seminario-transparencia/</guid>
        
        
      </item>
    
      <item>
        <title>II Workshop Tecnologia para Transparência</title>
        <description>&lt;p&gt;&lt;img src=&quot;/images/workshop-tech-para-transparencia/foto.jpg&quot; alt=&quot;Foto&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Palestra conjunta com o Pedro Vilanoca no II Workshop Tecnologia para Transparência que rolou em Balneário Camboriú.&lt;/p&gt;

&lt;h3 id=&quot;evento&quot;&gt;Evento&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://br.eventbu.com/balneario-camboriu/ii-workshop-de-tecnologia-para-transparencia/5326941&quot;&gt;II Workshop Tecnologia para Transparência&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;apresentação&quot;&gt;Apresentação&lt;/h3&gt;
&lt;center&gt;
&lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vSm625kFOyi5ITeXpNwOEQcThBO6a_xrTZgXbk6oSNdkH30qqho_GG_oSKpoF9YaR19PWVY1QcF0968/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;480&quot; height=&quot;299&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Tue, 29 Aug 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/2-workshop-tech-para-transparencia/</link>
        <guid isPermaLink="true">https://jtemporal.com/2-workshop-tech-para-transparencia/</guid>
        
        
      </item>
    
      <item>
        <title>Versionamento semântico: um passo além do Git</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;“No mundo de gerenciamento de software existe algo terrível conhecido como inferno das dependências (“dependency hell”). Quanto mais o sistema cresce, e mais pacotes são adicionados a ele, maior será a possibilidade de, um dia, você encontrar-se neste poço de desespero.” — &lt;a href=&quot;http://semver.org/lang/pt-BR/&quot;&gt;Versionamento Semântico 2.0&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pacotes, sejam eles escritos em Python, Ruby ou JavaScript, além de terem seu código versionado por sistema como o git, &lt;em&gt;podem&lt;/em&gt; possuir mais um nível de controle de versão: o &lt;strong&gt;versionamento semântico&lt;/strong&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo esse artigo e saber como funciona o versionamento semântico, corre lá para a revista do Serenata de Amor 👇&lt;/p&gt;

&lt;center&gt;
&lt;a href=&quot;https://medium.com/serenata/versionamento-sem%C3%A2ntico-um-passo-al%C3%A9m-do-git-53e466d0f21a&quot;&gt;

&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; /&gt;

&lt;/a&gt;
&lt;/center&gt;
</description>
        <pubDate>Mon, 14 Aug 2017 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/versionamento-semantico-um-passo-alem-do-git/</link>
        <guid isPermaLink="true">https://jtemporal.com/versionamento-semantico-um-passo-alem-do-git/</guid>
        
        <category>medium</category>
        
        <category>python</category>
        
        <category>pip</category>
        
        <category>python</category>
        
        <category>pip install</category>
        
        <category>pypi</category>
        
        <category>serenata toolbox</category>
        
        <category>git</category>
        
        <category>semantic versioning</category>
        
        <category>versionamento semantico</category>
        
        
      </item>
    
      <item>
        <title>Ciências de Dados com o Serenata de Amor: Pyladies SSA</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://pbs.twimg.com/media/DGd4ClSXcAAkCL2.jpg&quot; alt=&quot;apresentando o time no encontro das pyladies ssa&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ciências de Dados com o Serenata de Amor&lt;/p&gt;

&lt;h3 id=&quot;evento&quot;&gt;Evento&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/Pyladies-SSA/events/242148869/&quot;&gt;Encontro Pyladies SSA + GrupyBA&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;apresentação&quot;&gt;Apresentação&lt;/h3&gt;
&lt;center&gt;
&lt;iframe src=&quot;//slides.com/jtemporal/dfb-osa/embed&quot; width=&quot;576&quot; height=&quot;420&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Sat, 05 Aug 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/pyladies-ssa/</link>
        <guid isPermaLink="true">https://jtemporal.com/pyladies-ssa/</guid>
        
        
      </item>
    
      <item>
        <title>Serenata Toolbox no PyPI</title>
        <description>&lt;p&gt;Um roadmap para liberar um módulo no Python Package Index ;)&lt;/p&gt;

&lt;p&gt;Eventualmente pessoas que desenvolvem software chegam num momento que possuem um projeto que pode ser empacotado e distribuído para a comunidade. Para quem programa em Python é comum rodar um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip install&lt;/code&gt; — semelhante ao &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem install&lt;/code&gt; do Ruby e ao &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npm install&lt;/code&gt; do Node — e instalar módulos Python disponíveis no &lt;a href=&quot;https://pypi.org/&quot;&gt;PyPI&lt;/a&gt;. Pra quem não conhece, o PyPI é a casa mais famosa de pacotes Python, o index de pacotes Python.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo esse artigo e saber como foi colocar a Serenata Toolbox no PyPI corre lá para a revista do Serenata de Amor 👇&lt;/p&gt;

&lt;center&gt;
&lt;a href=&quot;https://medium.com/serenata/serenata-toolbox-no-pypi-2713e3dd4d42&quot;&gt;

&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; /&gt;

&lt;/a&gt;
&lt;/center&gt;
</description>
        <pubDate>Thu, 27 Jul 2017 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/serenata-toolbox-no-pypi/</link>
        <guid isPermaLink="true">https://jtemporal.com/serenata-toolbox-no-pypi/</guid>
        
        <category>medium</category>
        
        <category>python</category>
        
        <category>pip</category>
        
        <category>python</category>
        
        <category>pip install</category>
        
        <category>pypi</category>
        
        <category>serenata toolbox</category>
        
        
      </item>
    
      <item>
        <title>Data Science for Business Weekend Maceió</title>
        <description>&lt;p&gt;Conheça o projeto Serenata de Amor, uma iniciativa de ciência de dados com código aberto e financiamento coletivo que construiu uma plataforma de inteligência artificial capaz de minerar e buscar discrepâncias na prestação de contas dos gastos de nossos deputados federais. Entenda como o projeto começou, como ele foi feito, os promissores resultados alcançados até o momento, quais são os próximos passos e como você pode nos ajudar a fiscalizar ainda mais os nossos representantes.&lt;/p&gt;

&lt;h3 id=&quot;evento&quot;&gt;Evento&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://institutohelioteixeira.org/dsfb/&quot;&gt;Data Science for Business Weekend - Maceió&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;código&quot;&gt;Código&lt;/h3&gt;
&lt;p&gt;O &lt;a href=&quot;https://github.com/jtemporal/talks/blob/master/datascienceforbusiness/2017-06-28-dfb-osa.ipynb&quot;&gt;código que mostrei&lt;/a&gt; estão todos disponiveis e se quiserem rodar o notebook
localmente recomendo usar o &lt;a href=&quot;https://github.com/datasciencebr/serenata-toolbox&quot;&gt;Serenata Toolbox&lt;/a&gt; para fazer o fetch dos arquivos utilizados.&lt;/p&gt;

&lt;h3 id=&quot;apresentação&quot;&gt;Apresentação&lt;/h3&gt;
&lt;center&gt;
&lt;iframe src=&quot;//slides.com/jtemporal/dfb-osa/embed&quot; width=&quot;576&quot; height=&quot;420&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Fri, 30 Jun 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/dfbw/</link>
        <guid isPermaLink="true">https://jtemporal.com/dfbw/</guid>
        
        
      </item>
    
      <item>
        <title>Meetup - Mecanismos de prevenção e combate a corrupção</title>
        <description>&lt;h3 id=&quot;evento&quot;&gt;Evento&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.eventbrite.com.br/e/meetup-mecanismos-de-prevencao-e-combate-a-corrupcao-tickets-34574381907#&quot;&gt;Meetup: Mecanismos de prevenção e combate a corrupção&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;apresentação&quot;&gt;Apresentação&lt;/h3&gt;
&lt;center&gt;
&lt;iframe src=&quot;https://docs.google.com/presentation/d/1KWovGVucYy9wT_svPNCYznAJKPJEASQh7XEv_TXJyyg/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;480&quot; height=&quot;299&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Thu, 18 May 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/serenata-open-data/</link>
        <guid isPermaLink="true">https://jtemporal.com/serenata-open-data/</guid>
        
        
      </item>
    
      <item>
        <title>Comunidade Python e Rio de Janeiro</title>
        <description>&lt;h3 id=&quot;uma-história-de-amor&quot;&gt;Uma história de amor&lt;/h3&gt;

&lt;p&gt;Uma frase que eu ouvi desde o primeiro dia que conheci parte da galera de Python em Ribeirão Preto e não demorei muito tempo pra entender:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Faça parte da comunidade.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lembro como se fosse hoje o convite para a galera que deu o curso introdutório de Django e Python na semana acadêmica de Informática Biomédica que rolou em 2015.
Por algum motivo, esse convite e 15 minutos de conversa durante o almoço já me cativaram. Essas pessoas que estavam ali passaram a ser pessoas que eu admiro e que tive prazer de até trabalhar durante um tempo. E posso com certeza dizer que, não vai ser a última vez que conhecer pessoas foi algo importante pra mim.&lt;/p&gt;

&lt;p&gt;Foi a partir desse dia que descobri que programar não é ficar trancada com um computador 24h do meu dia e ser anti-social com as pessoas a minha volta. Que tão importante quanto escrever código é ouvir e dar feedback. Que aprender e ensinar muitas vezes estão de mãos dadas.&lt;/p&gt;

&lt;p&gt;Essas coisas ninguém te fala.&lt;/p&gt;

&lt;p&gt;São coisas que parece que todo mundo já sabe, mas você que tem que chegar a essa conclusão sozinha, no seu tempo e no seu jeitinho, porque isso te muda, e te muda de um jeito bom!&lt;/p&gt;

&lt;h3 id=&quot;python-sudeste-2017&quot;&gt;Python Sudeste 2017&lt;/h3&gt;
&lt;p&gt;Primeiro evento pós formar \o/&lt;/p&gt;

&lt;p&gt;Dessa vez não tinha provas pra estudar e fazer logo depois da viagem. Não tinha matéria atrasada pra estudar correndo. Não tinha reunião de TCC. Tinha PRs no projeto do trabalho para fazer. Tinha código pra revisar e tinha também e-mails de trabalho pra responder.&lt;/p&gt;

&lt;p&gt;Obrigações diferentes. Mas ainda assim, posso dizer que o clima de eventos da comunidade Python é sem igual e independe da realidade que cada um precisa voltar depois!&lt;/p&gt;

&lt;p&gt;Conheci pedacinhos novos do Rio de Janeiro.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/comunidade-python-rio/barista-curto.jpg&quot; alt=&quot;barista do curto&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Curto Café: amor na xícara ❤️ &lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Conheci novas pessoas e posso dizer que fiz novas amizades que vão durar pra sempre.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://instagram.fcgh15-1.fna.fbcdn.net/t51.2885-15/e35/18298544_1398738180213158_7723597765221023744_n.jpg&quot; alt=&quot;colina&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Colina PyLadies ❤ 4eva! Colina 4 x 1 PyBunker. &lt;a href=&quot;https://www.instagram.com/p/BTwoBTZgjXi/&quot;&gt;Créditos a Silvia pela foto.&lt;/a&gt;&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Conversei, comi e bebi bastante também. Se tem algo que essa galera faz bem além de codar são essas três coisas.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/comunidade-python-rio/conta-mais-barata.jpg&quot; alt=&quot;foto do pós com a conta mais barata&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;A conta mais barata do evento: Tinha pudim!&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Teve praia…
&lt;img src=&quot;https://instagram.fcgh15-1.fna.fbcdn.net/t51.2885-15/e35/18298931_1328846967194867_2670741832954019840_n.jpg&quot; alt=&quot;praia&quot; /&gt;&lt;/p&gt;

&lt;p&gt;… e também karaokê.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://instagram.fcgh15-1.fna.fbcdn.net/t50.2886-16/18385266_1438770409531201_8263087791227797504_n.mp4&quot;&gt;&lt;img src=&quot;https://instagram.fcgh15-1.fna.fbcdn.net/t51.2885-15/e15/18298644_1575047612513430_7166806189311787008_n.jpg&quot; alt=&quot;evidencias&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Teve Install Fest do Serenata na base do improviso.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/comunidade-python-rio/sprints-pyse.jpg&quot; alt=&quot;sprints&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Oh eu ali no fundo o/&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;E palestra relâmpago com perguntas e respostas do Serenata.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/comunidade-python-rio/jess-cuducos-q-a-pyse.png&quot; alt=&quot;eu e cuducos&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Eu e Eduardo Cuducos participando no Q&amp;amp;A de 5 minutos \o/&lt;/i&gt;
&lt;/center&gt;
&lt;p&gt;Sempre que tem Python tem também muito amor envolvido.&lt;/p&gt;

&lt;p&gt;Deixo aqui registrado que a PySe2017 foi linda e que as definições de evento f*da foram atualizadas.&lt;/p&gt;

&lt;p&gt;Mal posso esperar pra encontrar todo mundo nos próximos &lt;a href=&quot;http://caipyra.python.org.br/&quot;&gt;Caipyra&lt;/a&gt;, &lt;a href=&quot;http://2017.pythonbrasil.org.br/&quot;&gt;Python Brasil&lt;/a&gt; ou até mesmo na PySe2018 (já anota aí que vai ser em São Paulo). Estarei lá curtindo demais todo mundo em várias cidades desse Brasilzão.&lt;/p&gt;

&lt;h4 id=&quot;originalmente-postado-no-meu-medium&quot;&gt;Originalmente postado &lt;a href=&quot;https://medium.com/@jessicatemporal/comunidade-python-e-rio-de-janeiro-ae3f56f867ab&quot;&gt;no meu Medium&lt;/a&gt;.&lt;/h4&gt;
</description>
        <pubDate>Wed, 10 May 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/comunidade-python-rio/</link>
        <guid isPermaLink="true">https://jtemporal.com/comunidade-python-rio/</guid>
        
        <category>português</category>
        
        <category>python</category>
        
        <category>comunidade</category>
        
        <category>rio de janeiro</category>
        
        <category>eventos</category>
        
        <category>pessoal</category>
        
        
      </item>
    
      <item>
        <title>Sprint Operação Serenata de Amor</title>
        <description>&lt;p&gt;&lt;img src=&quot;/images/sprint-serenata-floripa/sprint-rd.jpg&quot; alt=&quot;a galera no sprint na RD&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Install Fest do projeto para o sprint do final de semna&lt;/p&gt;

&lt;h3 id=&quot;evento&quot;&gt;Evento&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/Florianopolis-Data-Science-Meetup/events/238848108/&quot;&gt;Sprint Florianópolis - Operação Serenata de Amor&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 28 Apr 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/sprint-serenata-floripa/</link>
        <guid isPermaLink="true">https://jtemporal.com/sprint-serenata-floripa/</guid>
        
        
      </item>
    
      <item>
        <title>6º Redes e-Gov</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4165/33621500983_ff31d1a8a8_b.jpg&quot; alt=&quot;eu, Tiago Marzagão e André Tamura no encontro transparente&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Apresentação do que a tecnologia da Operação Serenata de Amor faz, usando diversas base de dados, do governo ou privadas, mas todas públicas para fazer uma auditoria automatizada dos gastos da Cota para Exercício de Atividade Parlamentar. Debate com o público sobre fiscalização, respostas insatisfatórias dos órgãos públicos, e a moralidade dos gastos públicos.&lt;/p&gt;

&lt;h3 id=&quot;evento&quot;&gt;Evento&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.redes-egov.com.br&quot;&gt;6º Redes e-gov&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 28 Apr 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/6-redes-egov/</link>
        <guid isPermaLink="true">https://jtemporal.com/6-redes-egov/</guid>
        
        
      </item>
    
      <item>
        <title>4º Pyladies Floripa</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://scontent.fcgh15-1.fna.fbcdn.net/v/t1.0-9/18156926_1122086034564651_2410968029734643763_n.jpg?oh=ad14e2ae743fcdc080e9379acaed26fb&amp;amp;oe=5AA911A2&quot; alt=&quot;eu palestrando no encontro das pyladies floripa&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;vídeo&quot;&gt;Vídeo&lt;/h3&gt;
&lt;center&gt;
&lt;iframe src=&quot;https://www.facebook.com/plugins/video.php?href=https%3A%2F%2Fwww.facebook.com%2Fpyladiesfloripa%2Fvideos%2F1122086164564638%2F&amp;amp;show_text=0&amp;amp;width=267&quot; width=&quot;267&quot; height=&quot;476&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
&lt;p&gt;Utilizando dados abertos para denunciar discrepâncias nas prestações de contas dos deputados federais.&lt;/p&gt;

&lt;h3 id=&quot;evento&quot;&gt;Evento&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sympla.com.br/4--pyladies-floripa__136744&quot;&gt;4º PYLADIES FLORIPA&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;apresentação&quot;&gt;Apresentação&lt;/h3&gt;
&lt;center&gt;
&lt;iframe src=&quot;https://docs.google.com/presentation/d/1s6dDLbgg7eeT3XPIC7b4asIuK4trYGQl02xb0uO_1JA/embed?start=false&amp;amp;loop=false&amp;amp;delayms=10000&quot; frameborder=&quot;0&quot; width=&quot;480&quot; height=&quot;299&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Thu, 27 Apr 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/serenata-pyladies-floripa/</link>
        <guid isPermaLink="true">https://jtemporal.com/serenata-pyladies-floripa/</guid>
        
        
      </item>
    
      <item>
        <title>Workshop Mineração de Dados e Inteligência Artificial</title>
        <description>&lt;p&gt;&lt;img src=&quot;/images/workshop-ia-bauru/serenta-em-bauru.jpg&quot; alt=&quot;eu e cuducos&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Palestra conjunta com o Eduardo Cuducos no Workshop sobre Mineração de Dados e Inteligência Artificial da Receita Federal de Bauru.&lt;/p&gt;

&lt;h3 id=&quot;apresentação&quot;&gt;Apresentação&lt;/h3&gt;
&lt;center&gt;
&lt;iframe src=&quot;https://docs.google.com/presentation/d/1s6dDLbgg7eeT3XPIC7b4asIuK4trYGQl02xb0uO_1JA/embed?start=false&amp;amp;loop=false&amp;amp;delayms=10000&quot; frameborder=&quot;0&quot; width=&quot;480&quot; height=&quot;299&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Thu, 20 Apr 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/workshop-ia-bauru/</link>
        <guid isPermaLink="true">https://jtemporal.com/workshop-ia-bauru/</guid>
        
        
      </item>
    
      <item>
        <title>Serenata pelo Brasil a fora</title>
        <description>&lt;p&gt;Durante o mês de março, estivemos presentes em vários eventos espalhados pelo Brasil e gostaríamos de contar um pouco mais sobre como foi cada um deles.&lt;/p&gt;

&lt;p&gt;Março foi o quinto mês de trabalho da &lt;a href=&quot;https://serenata.ai&quot;&gt;Operação Serenata de Amor&lt;/a&gt;. E além de todos os nossos esforços em data science e programação com a implementação de novos classificadores, coleta de novos dados e validação novas hipóteses — tudo isso feito em conjunto com uma linda comunidade de código aberto no GitHub — também tivemos a honra de participar de vários eventos.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo esse artigo e saber mais como foi o mês de março no Serenata corre lá para a revista do Serenata de Amor 👇&lt;/p&gt;

&lt;center&gt;
&lt;a href=&quot;https://medium.com/serenata/serenata-pelo-brasil-a-fora-5823cc0d9736&quot;&gt;

&lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; /&gt;

&lt;/a&gt;
&lt;/center&gt;
</description>
        <pubDate>Mon, 10 Apr 2017 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/serenata-pelo-brasil-a-fora/</link>
        <guid isPermaLink="true">https://jtemporal.com/serenata-pelo-brasil-a-fora/</guid>
        
        <category>medium</category>
        
        <category>serenata</category>
        
        <category>serenata de amor</category>
        
        <category>data science</category>
        
        <category>ciencia de dados</category>
        
        <category>open source</category>
        
        <category>comunidade</category>
        
        <category>eventos</category>
        
        
      </item>
    
      <item>
        <title>Hackathon da Saúde</title>
        <description>&lt;p&gt;&lt;a href=&quot;http://fullstackers.com.br/2017-hackathon-saude/&quot;&gt;Hackathon da Saúde&lt;/a&gt;&lt;/p&gt;

&lt;iframe src=&quot;https://docs.google.com/presentation/d/1BIX7OPewYD3FrDNX0_NaBQNcUbXOZ1DJPoRQfc64UQg/embed?start=false&amp;amp;loop=false&amp;amp;delayms=60000&quot; frameborder=&quot;0&quot; width=&quot;480&quot; height=&quot;299&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Fri, 07 Apr 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/serenata-overview/</link>
        <guid isPermaLink="true">https://jtemporal.com/serenata-overview/</guid>
        
        
      </item>
    
      <item>
        <title>Cloud Girls Meetup</title>
        <description>&lt;p&gt;&lt;img src=&quot;/images/serenata-ds/o-time.jpg&quot; alt=&quot;o time&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Utilizando dados abertos para denunciar discrepâncias nas prestações de contas dos deputados federais.&lt;/p&gt;

&lt;h3 id=&quot;evento&quot;&gt;Evento&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/Cloud-Girls-Sao-Paulo/events/238450896/&quot;&gt;Cloud Girls Meetup&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;apresentação&quot;&gt;Apresentação&lt;/h3&gt;
&lt;center&gt;
&lt;iframe src=&quot;https://docs.google.com/presentation/d/1s6dDLbgg7eeT3XPIC7b4asIuK4trYGQl02xb0uO_1JA/embed?start=false&amp;amp;loop=false&amp;amp;delayms=10000&quot; frameborder=&quot;0&quot; width=&quot;480&quot; height=&quot;299&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Tue, 04 Apr 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/serenata-ds/</link>
        <guid isPermaLink="true">https://jtemporal.com/serenata-ds/</guid>
        
        
      </item>
    
      <item>
        <title>Big Data Meetup: Serenata de Amor</title>
        <description>&lt;p&gt;&lt;img src=&quot;/images/bigdata-meetup/big-data-sp-meetup.gif&quot; alt=&quot;gif big data meetup&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Utilizando dados abertos para denunciar discrepâncias nas prestações de contas dos deputados federais.&lt;/p&gt;

&lt;h3 id=&quot;evento&quot;&gt;Evento&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/Sao-Paulo-Big-Data-Meetup/events/238249402/&quot;&gt;São Paulo Big Data Meetup (Março 2017)&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;apresentação&quot;&gt;Apresentação&lt;/h3&gt;
&lt;center&gt;
&lt;iframe src=&quot;https://docs.google.com/presentation/d/1s6dDLbgg7eeT3XPIC7b4asIuK4trYGQl02xb0uO_1JA/embed?start=false&amp;amp;loop=false&amp;amp;delayms=10000&quot; frameborder=&quot;0&quot; width=&quot;480&quot; height=&quot;299&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Wed, 29 Mar 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/big-data-meetup/</link>
        <guid isPermaLink="true">https://jtemporal.com/big-data-meetup/</guid>
        
        
      </item>
    
      <item>
        <title>Uma história de Pair Programming a longa distância</title>
        <description>&lt;p&gt;Pair programming, parear, escrever código em dupla. Quem escreve código, alguma
vez na vida já pareou, e se não o fez ainda, provavelmente irá fazer isso em algum
momento da vida. Para os estudantes da arte da programação que escrevem código em
grupo, pair é uma técnica tão normal que muitas vezes nem percebem que estão fazendo.&lt;/p&gt;

&lt;p&gt;Escrever código em par é bom por uma série de motivos, dentre eles gosto de destacar
o aumento de produtividade e foco, oportunidade de aprendizado e também diversão.
Desenvolver um programa ou um script a quatro mãos, é uma das experiências mais
gostosas de ser programadora.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://ljdchost.com/4k7kp0I.gif&quot; alt=&quot;pair programming&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;trabalho-remoto-e-programação-a-longa-distância&quot;&gt;Trabalho remoto e programação a longa distância&lt;/h3&gt;

&lt;p&gt;Muitos podem achar que para parear é necessário estar na mesma sala que o seu par.
Quem trabalha remotamente sabe o quanto isso não é necessariamente verdade.&lt;/p&gt;

&lt;p&gt;Para um time de desenvolvedores que trabalha junto, programar a longa distância
é mais uma das coisas fantásticas que programadores fazem e isso vem muitas vezes
de mãos dadas com o trabalho remoto. No time da Serenata, podemos contabilizar horas
e horas de telaselfselfs compartilhadas, sejam entre aqueles trabalhando na mesma cidade
(&lt;a href=&quot;https://twitter.com/irio&quot;&gt;Irio Musskopf&lt;/a&gt; e &lt;a href=&quot;https://twitter.com/anaschwendler&quot;&gt;Ana Schwendler&lt;/a&gt;),
ou entre aquelas trabalhando em estados diferentes (&lt;a href=&quot;https://twitter.com/cuducos&quot;&gt;Eduardo Cuducos&lt;/a&gt;
e eu).&lt;/p&gt;

&lt;p&gt;Nós usamos os olhos dos colegas de trabalho como forma de escrever um código melhor
e também como fonte milagrosa da dádiva do &lt;em&gt;desempacamento&lt;/em&gt;. Usar a tecnologia à
nosso favor na hora de programar é uma arte.&lt;/p&gt;

&lt;p&gt;Quem pareia tem suas formas preferidas, eu vou falar uma das minhas. Programo e
m Python, e no meu dia a dia uso:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;O Ubuntu: meu sistema operacional oficial desde 2015;&lt;/li&gt;
  &lt;li&gt;O terminal do Ubuntu: meu companheiro para todas as horas;&lt;/li&gt;
  &lt;li&gt;VIM: o editor de texto dos viciados em telas pretas e atalhos de teclado;&lt;/li&gt;
  &lt;li&gt;tmux (e tmate): o multiplexador de terminais queridinho dos devs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;vim&quot;&gt;VIM&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://www.vim.org/&quot;&gt;VIM&lt;/a&gt; é um editor de texto altamente configurável e focado
em eficiência. Mas também é conhecido por não ser fácil de usar pois é uma ferr
amenta que precisa ser aprendida antes de ser utilizada. A frase “não deixo de
usar vim pois não sei como sair dele” é a piadinha mais comum de se ouvir pelas
pessoas de tech.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/B5rKp2z.png&quot; alt=&quot;VIM&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;Tela inicial do VIM&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Para usar o VIM você precisa saber algumas coisas básicas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ele possui modos diferentes de uso: como o de inserção que serve para escrever
e o modo de comando que usamos para informar ao vim comandos que queremos executar;&lt;/li&gt;
  &lt;li&gt;Os comandos do VIM são escritos, coisas como &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;set number&lt;/code&gt;, para mostrar os núme
ros da linha, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;set cc=80&lt;/code&gt; (&lt;em&gt;color column&lt;/em&gt;) mostra uma coluna no octagésimo caracter
de todas linhas e &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wq&lt;/code&gt; (&lt;em&gt;write and quit&lt;/em&gt;) para salvar o arquivo e sair do editor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O VIM foi feito para que tudo que você queira fazer no editor possa ser feito s
em remover as mãos do teclado.&lt;/p&gt;

&lt;h3 id=&quot;tmux-etmate&quot;&gt;tmux e tmate&lt;/h3&gt;
&lt;p&gt;Quem desenvolve usando o terminal às vezes se pega tendo que abrir mais de uma
janela, por exemplo, se eu estiver rodando um web-app, eu provavelmente vou ter
um terminal rodando um server, um outro com acesso ao código que estou editando
, se forem tanto o html quanto o css isso já me dá três janelas abertas.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/kzMTb12.png&quot; alt=&quot;exemplo de terminal com tmux&quot; /&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;sessão tmate com  vim, server, tree e ipython tudo rodando ao mesmo tempo&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;Para eliminar essa quantidade excessiva de janelas abertas, o &lt;a href=&quot;https://tm
ux.github.io/&quot;&gt;tmux&lt;/a&gt; foi desenvolvido, ele é um multiplexador de terminais e permite
que você tenha todos os arquivos e processos rodando e mostrando resultados na
mesma tela. Com base no tmux, surgiu o &lt;a href=&quot;https://tmate.io/&quot;&gt;tmate&lt;/a&gt;, que além de
usar todas as maravilhas que o tmux tem, ele ainda abre um canal de comunicação
seguro para que o seu &lt;em&gt;mate&lt;/em&gt; (amigo) possa se conectar por meio de uma sessão s
sh. E o melhor é que o seu mate não precisa nem estar num ambiente que provê ac
esso ssh, lhe basta um navegador.&lt;/p&gt;

&lt;p&gt;Uma vez aberto o canal iniciado com um simples tmate no seu terminal, você pode
mandar o link de acesso para quem quiser e, caso o link enviado não seja o &lt;em&gt;read
-only&lt;/em&gt;, a pessoa do outro lado da conexão poderá programar no seu computador.&lt;/p&gt;

&lt;p&gt;Assim como o VIM, tmux /tmate possui modos e atalhos de teclado para sua utiliz
ação. E eu recomendo fortemente &lt;a href=&quot;https://gist.github.com/rougeth/db185fc21c376ece8fc6&quot;&gt;essa palestra&lt;/a&gt; do &lt;a href=&quot;https://twitter.com/marcorougeth&quot;&gt;Marco Rougeth&lt;/a&gt; par
a usar de referência com esses comandos.&lt;/p&gt;

&lt;h3 id=&quot;canal-porvoz&quot;&gt;Canal por voz&lt;/h3&gt;
&lt;p&gt;Junto ao editor de texto, que para essa estrutura funcionar precisa ser um que
abra no terminal, e o terminal compartilhado, eu ainda uso algum canal por voz.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://68.media.tumblr.com/7d98d3b163734d963c7629a495868009/tumblr_inline_nuqb7jzcCU1rfr6lu_500.gif&quot; alt=&quot;mic drop&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Já usei: &lt;a href=&quot;https://zoom.us/&quot;&gt;Zoom&lt;/a&gt;, &lt;a href=&quot;https://hangouts.google.com/&quot;&gt;Hangouts&lt;/a&gt;, &lt;a href=&quot;https://appear.in/&quot;&gt;a
ppear.in&lt;/a&gt; e &lt;a href=&quot;https://www.skype.com/en/&quot;&gt;Skype&lt;/a&gt; e nesse caso
é muita questão de escolha pessoal, disponibilidade de banda e quanto cada um d
esses influencia na capacidade de processamento do seu computador.&lt;/p&gt;

&lt;p&gt;Essa é uma alternativa ao famoso screen share trazida pelos grandes programas d
e video-conferência. No meu computador que traz uma capacidade de processamento
limitada, VIM + tmate + Hangouts, tem se mostrado uma forma graciosa de trabalh
ar a distância sem os tantos travamentos que já atrapalharam por diversas vezes.&lt;/p&gt;

&lt;p&gt;Tendo à mão todas essas tecnologias e um pouquinho de treino, pair será um mome
nto legal de muito código escrito a quatro mãos.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://media4.giphy.com/media/TXJiSN8vCERuE/giphy.gif&quot; alt=&quot;OMG&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Obrigada ao grupy-rp por me apresentar e me treinar na arte do vim, tmux e pair
programming; ao Marco muito obrigada por me apresentar tmate, &lt;a href=&quot;https://t
muxp.git-pull.com/en/latest/&quot;&gt;tmuxp&lt;/a&gt; (um gerenciador de sessões do tmux) e outras mara
vilhas como essas; ao Otávio obrigada pelas dicas e feedback; e ao time do Sere
nata obrigada pelas oportunidades diárias de pair programming ❤ ❤ ❤&lt;/p&gt;
</description>
        <pubDate>Sat, 11 Mar 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/pair-programming-a-distancia/</link>
        <guid isPermaLink="true">https://jtemporal.com/pair-programming-a-distancia/</guid>
        
        <category>português</category>
        
        <category>tmux</category>
        
        <category>tmate</category>
        
        <category>vim</category>
        
        <category>pair programming</category>
        
        <category>parear</category>
        
        <category>código</category>
        
        
      </item>
    
      <item>
        <title>Serenata de Amor: Machine Learning Meetup</title>
        <description>&lt;p&gt;&lt;img src=&quot;/images/serenata-ml-meetup/conheca-rosie.jpg&quot; alt=&quot;olha eu falando no palco da nubank&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Na apresentação vamos falar o que é a Operação Serenata de Amor, como o time (e seus colaboradores) coleta e seleciona os dados para encontrar discrepâncias nos gastos dos deputados, como essas hipóteses são desenvolvidas, validadas e depois ensinadas para Rosie.&lt;/p&gt;

&lt;h3 id=&quot;evento&quot;&gt;Evento&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/machine-learning-big-data-engenharia/events/237665089/&quot;&gt;Machine Learning, Big Data e Engenharia Meetup&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;apresentação&quot;&gt;Apresentação&lt;/h3&gt;
&lt;center&gt;
&lt;iframe src=&quot;https://docs.google.com/presentation/d/1s6dDLbgg7eeT3XPIC7b4asIuK4trYGQl02xb0uO_1JA/embed?start=false&amp;amp;loop=false&amp;amp;delayms=10000&quot; frameborder=&quot;0&quot; width=&quot;480&quot; height=&quot;299&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Thu, 09 Mar 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/serenata-ml-meetup/</link>
        <guid isPermaLink="true">https://jtemporal.com/serenata-ml-meetup/</guid>
        
        
      </item>
    
      <item>
        <title>Meu medo de formulários</title>
        <description>&lt;h3 id=&quot;hoje-entre-um-build-e-outro-preenchi-mais-um&quot;&gt;Hoje, entre um build e outro, preenchi mais um.&lt;/h3&gt;

&lt;p&gt;Vou começar contando uma história pra vocês — como faço quase sempre — era uma vez…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://vignette.wikia.nocookie.net/shrek/images/1/1f/Far_Far_Away_Sign_Shrek.jpg/revision/latest?cb=20110530035520&quot; alt=&quot;far far away&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Numa terra muito, muito distante, o reino encantado onde todos eram seguros de si e não se questionavam. Mas num belo dia, o terrível Impostor atacou e lançou um feitiço que chamamos de &lt;em&gt;Síndrome do Impostor&lt;/em&gt; e fez com que todos moradores do nosso belo reino se encherem de inseguranças e começarem a se sentir incapazes de fazer aquilo que são treinados (muito bem) para fazer.&lt;/p&gt;

&lt;p&gt;Esse feitiço é traiçoeiro, ele não age sobre os habitantes do reino sempre. Ele vai agindo devagarinho e quando vemos… pá! Estamos &lt;strong&gt;duvidando das nossas habilidades&lt;/strong&gt;. Saber que estamos sofrendo da síndrome é um começo mas não é uma solução permanente, e nós que somos acometidos por essa mazela, precisamos estar sempre atentos aos sintomas.&lt;/p&gt;

&lt;p&gt;No meu caso particular, além de bugs nos meus códigos, uma coisa que faz a síndrome atacar com todas as forças, é a necessidade de preencher algum formulário.&lt;/p&gt;

&lt;p&gt;Você pode pensar que ao terminar a faculdade as inseguranças, &lt;em&gt;“Será que vou tirar nota boa nessa prova?”&lt;/em&gt;, &lt;em&gt;“Será que eu consigo terminar esse trabalho a tempo?”&lt;/em&gt;, &lt;em&gt;“Será que eu vou conseguir formar?”&lt;/em&gt; iriam se dissipar, mas na verdade, elas não dissipam. Muito pelo contrário. Elas evoluem. Agora, trabalhando, você tem que prestar contas à alguem além de você mesmo pelo código que faz.&lt;/p&gt;

&lt;p&gt;E não só no trabalho, parte das coisas que gosto de fazer envolvem eventos de tecnologia por aí, seja organizando ou frequentando, se &lt;strong&gt;ninguém&lt;/strong&gt; te exigir saber fazer as coisas, &lt;strong&gt;você&lt;/strong&gt; se cobra. Alguns dos eventos que anotei na minha agenda pra esse ano, possuem formulários de participação, como por exemplo o &lt;a href=&quot;https://djangogirls.org/saopaulo/&quot;&gt;Django Girls São Paulo&lt;/a&gt; que, para ser uma treinadora você tem que preencher um formulário.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/e8aWZKB4tKI&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;É nessa hora, na hora que eu sei que tenho que falar de mim, do que eu sei que começa a atuar a dona síndrome… &lt;em&gt;“Quem, em sã consciencia, vai me escolher pra ensinar alguma coisa pra alguem?”&lt;/em&gt;. E nessas horas que eu preciso parar e pensar feito a Camila fala nesse vídeo:&lt;/p&gt;

&lt;p&gt;É aí que eu paro de pensar e me agarro na minha vontade de fazer alguma coisa. Eu quero ensinar, então vou lá e preencho o formulário do Django Girls São Paulo. Eu quero ir em algum evento, mas tô sem verba?! Então vou e preencho o fomulário de pedido de ajuda de custo.&lt;/p&gt;

&lt;p&gt;Começar a fazer algo é díficil, mas para atingir o objetivo você precisa de fato começar em algum lugar. O querido &lt;a href=&quot;http://cuducos.me/&quot;&gt;Eduardo Cuducos&lt;/a&gt;, deu um exemplo perfeito nesse &lt;a href=&quot;http://cuducos.me/2016/05/13/autonomia-meus-ultimos-10-anos.html&quot;&gt;post aqui&lt;/a&gt; no blog dele, segundo ele, é um exemplo bobo, mas pra mim representa perfeitamente a lógica que estou seguindo:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;O que você precisa para correr uma maratona? Precisa começar a correr. Claro que você não vai correr os 42km de uma maratona logo no primeiro dia. Mas vista um tênis, saia de casa e vá correr. Corra 2km, 3km… 10km que seja. Sem começar, sem correr o primeiro quilômetro, você nunca vai chegar na maratona.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eu quero correr as minhas maratonas. Então comecei a correr. Só que pra mim as maratonas são os eventos, e o começo são os formulários.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Pessoas magníficas que vão lá e fazem…”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quero ser dessas pessoas que fazem. Posso não ser a mais indicada, posso falhar. Mas também posso dizer que fui lá e fiz.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;O Django Girls São Paulo ainda está recebendo inscrições para treinadoras, e as inscrições para participantes já estão abertas! Se inscreve vai! ❤️&lt;/p&gt;

&lt;h5 id=&quot;postado-originalmente-no-meu-medium&quot;&gt;Postado originalmente &lt;a href=&quot;https://medium.com/@jessicatemporal/meu-medo-de-formulários-812ad025bbca&quot;&gt;no meu Medium&lt;/a&gt;.&lt;/h5&gt;
</description>
        <pubDate>Thu, 09 Feb 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/meu-medo-de-formularios/</link>
        <guid isPermaLink="true">https://jtemporal.com/meu-medo-de-formularios/</guid>
        
        <category>português</category>
        
        <category>síndrome do impostor</category>
        
        <category>formulários</category>
        
        <category>django girls</category>
        
        <category>django</category>
        
        <category>pessoal</category>
        
        
      </item>
    
      <item>
        <title>Esfarelou, virou purpurina</title>
        <description>&lt;p&gt;Porque somos tão relutantes em sentir e expressar amor? Não sei vocês. Mas eu amo
todos os dias.&lt;/p&gt;

&lt;p&gt;Amo com a mesma intensidade do calor trazido pelos raios de sol que viajam por e
milhares e milhares de km até chegar na terra e esquentar a pele daquela moça que
passeia alegremente pelo parque num domingo de sol.&lt;/p&gt;

&lt;p&gt;Ainda assim, sou relutante em dizer, àqueles que amo. Por que será? Por que impomos
à nós mesmos e aos outros a prisão que é sentir e não expressar amor?&lt;/p&gt;

&lt;p&gt;Passaram-se segundos, esses tornaram-se minutos que cresceram em horas. Essas
viraram noites em claro e ainda não tenho resposta.&lt;/p&gt;

&lt;p&gt;Dei um passo para trás. Mudei a pergunta: Que horas hoje vou dizer que te amo?
Depois de me espreguiçar preguiçosamente na cama, abrir um olho e o sorriso largo?&lt;/p&gt;

&lt;p&gt;Depois que você me disser bom dia enquanto se veste? Já sei! Depois que o maravilhoso
cheiro de café invadir a sala, então o quarto e finalmente nossos pulmões. Não,
ainda não me parece boa hora…&lt;/p&gt;

&lt;p&gt;Só sei que falarei hoje.&lt;/p&gt;

&lt;p&gt;Sou um espírito livre, mas meu coração age como se trouxesse uma bola de ferro
amarrada à perna enquanto eu não expresso aquilo que ele guarda. A prisão imposta
não é feita de quatro paredes, sem janelas ou portas mas parece que impossível sair.&lt;/p&gt;

&lt;p&gt;Ao dizer que te amo, paredes se esfarelam levando junto a corrente que amarra a
bola de aço. Esfarelaram, viraram purpurina e grudaram na gente pra fazer a gente
brilhar.&lt;/p&gt;

&lt;p&gt;Te amo e vou dizer toda vez que der vontade.&lt;/p&gt;

&lt;p&gt;Você não precisa dizer de volta não. Sei o quanto foi difícil pra mim transformar
em purpurina a corrente que impedia meu coração de voar e as paredes que impediam
de sentir o sol esquentar a pele.&lt;/p&gt;

&lt;p&gt;Sei que você me ama também.&lt;/p&gt;

&lt;p&gt;Enquanto tu tá aí, nas tuas amarras, eu aproveito que as minhas se desfizeram e
falo por nós. Quem sabe assim tu aprende a dizer também e se liberta.&lt;/p&gt;

&lt;p&gt;Era só isso que queria dizer hoje.&lt;/p&gt;

&lt;p&gt;Te amo.&lt;/p&gt;
</description>
        <pubDate>Thu, 02 Feb 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/virou-purpurina/</link>
        <guid isPermaLink="true">https://jtemporal.com/virou-purpurina/</guid>
        
        <category>pessoal</category>
        
        <category>poesia</category>
        
        <category>amor</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>Even core devs have hiccups ¯\_(ツ)_/¯</title>
        <description>&lt;p&gt;After a few months working on a open-source project sometimes I still find myself having trouble with some things. And that is okay! This time was with PostgreSQL.&lt;/p&gt;

&lt;p&gt;As some of you know I work on a project called Serenata de Amor Operation. One of the tools we developed is called Jarbas. It is a web application with a Django backend using PostgreSQL for database. So the last time I configured and ran Jarbas was last year on a Linux computer it also was the first time I contributed for the project. Not much mystery there, but now I’m on a MacOS machine and things are a bit different.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;So I started by installing PostgreSQL with brew (which I highly recommend). Homebrew makes the installation process pretty straightforward. The command line for it is:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;postgresql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You may think that’s it. Easy peasy. Then just go to Jarbas cloned repository and the first thing to do would be creating a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt; file and then running the traditional Django command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python manage.py migrate&lt;/code&gt;. And that’s where I got the &lt;strong&gt;first error&lt;/strong&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ python manage.py migrate
Traceback (most recent call last):
File “/Users/temporal/anaconda3/envs/jarbas/lib/python3.5/site-packages/django/db/backends/base/base.py”, line 213, in ensure_connection
self.connect()
File “/Users/temporal/anaconda3/envs/jarbas/lib/python3.5/site-packages/django/db/backends/base/base.py”, line 189, in connect
self.connection = self.get_new_connection(conn_params)
File “/Users/temporal/anaconda3/envs/jarbas/lib/python3.5/site-packages/django/db/backends/postgresql/base.py”, line 176, in get_new_connection
connection = Database.connect(**conn_params)
File “/Users/temporal/anaconda3/envs/jarbas/lib/python3.5/site-packages/psycopg2/__init__.py”, line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: Connection refused
Is the server running on host “localhost” (::1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Connection refused
Is the server running on host “localhost” (127.0.0.1) and accepting
TCP/IP connections on port 5432?
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That’s when you ask yourself: &lt;em&gt;Wait, what? What kind of error is that&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/6uGhT1O4sxpi8/giphy.gif&quot; alt=&quot;travolta perdido gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After a few minutes searching I came across this &lt;a href=&quot;https://stackoverflow.com/a/28249245&quot;&gt;wonderful Stackoverflow thread&lt;/a&gt;. I’ll break it down for you: After you install PostgreSQL probably (like me), you’ll have to start the service &lt;strong&gt;and&lt;/strong&gt; initialize a database for you to use. I won’t copy here the steps described on the thread but there you’ll see it gives you two choices at a given moment:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Either load the launch agent;&lt;/li&gt;
  &lt;li&gt;Start the agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I chose to start it since it was my first time doing this it was logical that this was a safe choice to go on.&lt;/p&gt;

&lt;p&gt;After starting it, I needed to check whether it worked or not. &lt;em&gt;You never now util you test it right?&lt;/em&gt; And to do so, we try to connect into PostgreSQL by doing this:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;psql &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; postgres
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That only gave me a running Postgres client I still needed a database.&lt;/p&gt;

&lt;p&gt;Jarbas app expect a database called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jarbas&lt;/code&gt;. So that’s the name we give when creating the new database by doing:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;createdb jarbas
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you might expect, that wasn’t enough once more. Tried again to run the migrate command and this happened: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;django.db.utils.OperationalError: FATAL: role &quot;Jarbas&quot; does not exist.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Don’t you just love dev life?!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let’s create a Role then:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ psql -d postgres
=&amp;gt; CREATE ROLE jarbas;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And once again got an error: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;django.db.utils.OperationalError: FATAL: role &quot;jarbas&quot; is not permitted to log in&lt;/code&gt;. Now we need to give the role permissions, why that didn’t cross my mind before?&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ psql -d postgres
=&amp;gt; ALTER ROLE jarbas LOGIN;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Again with the migrate command and voilà:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/2nhYU2P.png&quot; alt=&quot;all ok&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And then you get to the point where you might think: &lt;em&gt;How the hell am I supposed to know if everything is working properly?&lt;/em&gt; Well, Jarbas has test suites so you might try to run tests and they will fail:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ python manage.py test                                         
Creating test database for alias &apos;default&apos;...
Got an error creating the test database: permission denied to create database

Type &apos;yes&apos; if you would like to try deleting the test database &apos;test_jarbas&apos;, or &apos;no&apos; to cancel: no
Tests cancelled.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You’ll need to make another modification on jarbas role to give it permissions to create a database:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ psql -d postgres
=&amp;gt; ALTER ROLE jarbas CREATEDB;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After that, tests beautifully pass:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/xUA7bjcqhnBpgOvHig/giphy.gif&quot; alt=&quot;jarbas tests passing gif&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 01 Feb 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/even-core-devs-have-hiccups/</link>
        <guid isPermaLink="true">https://jtemporal.com/even-core-devs-have-hiccups/</guid>
        
        <category>postgres</category>
        
        <category>python</category>
        
        <category>serenata</category>
        
        <category>serenata de amor</category>
        
        <category>database</category>
        
        <category>english</category>
        
        <category>inglês</category>
        
        
      </item>
    
      <item>
        <title>Até core devs tem atrapalhos ¯\_(ツ)_/¯</title>
        <description>&lt;p&gt;Depois de alguns meses trabalhando em projeto open-source eu ainda me encontro problemas com algumas coisas. E tudo bem! Dessa vez vou contar o causo do PostgreSQL.&lt;/p&gt;

&lt;p&gt;Como alguns de vocês sabem, eu trabalho na &lt;a href=&quot;https://serenata.ai&quot;&gt;Operação Serenata de Amor&lt;/a&gt;. Uma das ferramentas que nós desenvolvemos é chamada de &lt;a href=&quot;https://jarbas.serenata.ai/dashboard/chamber_of_deputies/reimbursement/&quot;&gt;Jarbas&lt;/a&gt;. Ele é uma aplicação web com &lt;em&gt;backend&lt;/em&gt; em Django usando PostgreSQL para banco de dados. A última vez que eu configurei e rodei o Jarbas foi o ano passado e eu estava usando um computador com Linux. Sem muitos mistérios, essa também foi a primeira vez que contribui para o projeto. Mas agora, eu estou usando uma máquina MacOS e as coisas são um pouquinho diferente.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Eu comecei instalando o PostgreSQL usando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brew&lt;/code&gt; (recomendo veementemente). Homebrew torna o processo de instalação relativamente simples. O comando para isso foi:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;postgresql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Você pode pensar que é apenas isso. Mamão com açúcar. Então é só ir para o repositório do Jarbas que você clonou e criar o arquivo de configuração de ambiente - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt; - e rodar o tradicional comando do Django &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python manage.py migrate&lt;/code&gt;. E foi é aí que encontramos o &lt;strong&gt;primeiro&lt;/strong&gt; erro:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ python manage.py migrate
Traceback (most recent call last):
File “/Users/temporal/anaconda3/envs/jarbas/lib/python3.5/site-packages/django/db/backends/base/base.py”, line 213, in ensure_connection
self.connect()
File “/Users/temporal/anaconda3/envs/jarbas/lib/python3.5/site-packages/django/db/backends/base/base.py”, line 189, in connect
self.connection = self.get_new_connection(conn_params)
File “/Users/temporal/anaconda3/envs/jarbas/lib/python3.5/site-packages/django/db/backends/postgresql/base.py”, line 176, in get_new_connection
connection = Database.connect(**conn_params)
File “/Users/temporal/anaconda3/envs/jarbas/lib/python3.5/site-packages/psycopg2/__init__.py”, line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: Connection refused
Is the server running on host “localhost” (::1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Connection refused
Is the server running on host “localhost” (127.0.0.1) and accepting
TCP/IP connections on port 5432?
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Esse é o momento em que você se pergunta: &lt;em&gt;Pera, o quê? Que tipo de erro é esse?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/6uGhT1O4sxpi8/giphy.gif&quot; alt=&quot;travolta perdido gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Depois de alguns minutos procurando, eu encontrei essa &lt;a href=&quot;https://stackoverflow.com/a/28249245&quot;&gt;maravilhosa conversa no Stackoverflow&lt;/a&gt;. Vou simplificar aqui: Depois de instalar o PostgreSQL você muito provavelmente (como eu) terá que iniciar o serviço e uma base de dados para você utilizar. Eu não vou repassar os passos descritos no stackoverflow aqui mas chega um ponto onde você terá duas opções:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Carregar o agente de inicialização;&lt;/li&gt;
  &lt;li&gt;Inicializar de fato o agente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como era minha primeira vez fazendo isso, eu achei que era um caminho mais lógico inicializar um novo agente.&lt;/p&gt;

&lt;p&gt;Depois da inicialização, eu preciso checar se está funcionando ou não. &lt;em&gt;Nunca se sabe até testar, num é mesmo?&lt;/em&gt; E para fazer isso, nós podemos conectar ao PostgreSQL:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;psql &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; postgres
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Isso me deu apenas o Postgres rodando, eu ainda preciso de uma base de dados.&lt;/p&gt;

&lt;p&gt;O app do Jarbas espera uma base chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jarbas&lt;/code&gt;. Então vamos dar esse nome para nossa nova base de dados fazendo o seguinte:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;createdb jarbas
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Como você pode esperar, isso não foi o suficiente. Eu tentei rodar novamente o comando de migração e aí isso aconteceu: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;django.db.utils.OperationalError: FATAL: role &quot;Jarbas&quot; does not exist.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Aah como não amar a vida de dev?!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Então vamos criar um papel:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ psql -d postgres
=&amp;gt; CREATE ROLE jarbas;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E de novo estourou um erro: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;django.db.utils.OperationalError: FATAL: role &quot;jarbas&quot; is not permitted to log in&lt;/code&gt;. O que falta agora é dar permissões para o papel , não sei como não pensei nisso antes…&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ psql -d postgres
=&amp;gt; ALTER ROLE jarbas LOGIN;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Agora rodando mais uma vez o comando de migração e voilà:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/2nhYU2P.png&quot; alt=&quot;all ok&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E aí chegamos no ponto onde podemos pensar: &lt;em&gt;Como diabos vou saber se tá tudo funcionando como deveria?&lt;/em&gt; Bem, Jarbas tem suites de teste que você pode tentar rodar, aí elas vão falhar:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ python manage.py test                                         
Creating test database for alias &apos;default&apos;...
Got an error creating the test database: permission denied to create database

Type &apos;yes&apos; if you would like to try deleting the test database &apos;test_jarbas&apos;, or &apos;no&apos; to cancel: no
Tests cancelled.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Vamos precisar fazer outra modificação no papel jarbas e dar para esse papel a permissão para criar novos bancos de dados:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ psql -d postgres
=&amp;gt; ALTER ROLE jarbas CREATEDB;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;E aí, finalmente os testes passam lindamente:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/xUA7bjcqhnBpgOvHig/giphy.gif&quot; alt=&quot;jarbas tests passing gif&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 01 Feb 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/ate-core-devs-tem-atrapalhos/</link>
        <guid isPermaLink="true">https://jtemporal.com/ate-core-devs-tem-atrapalhos/</guid>
        
        <category>postgres</category>
        
        <category>python</category>
        
        <category>serenata</category>
        
        <category>serenata de amor</category>
        
        <category>banco de dados</category>
        
        <category>inglês</category>
        
        
      </item>
    
      <item>
        <title>The moving</title>
        <description>&lt;h3 id=&quot;a-letter-to-my-friends&quot;&gt;A letter to my friends&lt;/h3&gt;

&lt;p&gt;I move a lot. At least a lot considering that most of the people I met lived in one city or maybe two. So far I moved to 7 cities. I lived in 11 houses. And I still haven’t figured out the whole “having friends that live far away” part.&lt;/p&gt;

&lt;p&gt;I recently graduated and moved again. I’m four hours and a half car ride distant from most of my beloved friends and the city that I consider home. A part of me is missing. And don’t get me wrong. I love to move, I can box up a n entire house in one day and have it organized and ready to live in the next. The process of moving is quite easy for me. I would dare to say is cleansing and matches my internal disquietude.&lt;/p&gt;

&lt;p&gt;And yet, the leaving your friends and changing the “Let’s go to the bar together” for “Call me so we can update each other on the news” is still annoying to say the least. My heart aches for the closeness. It aches for the “I’ll be over in ten, be ready!”. The tight, crush your ribs, leave you out of breath, heart warming hugs. It misses the Sunday afternoons on a city bench eating ice cream and talking about life.&lt;/p&gt;

&lt;p&gt;And even though it was with a heavy heart that I left that town and friends, weight that makes my breathing difficult as write this, I would do it all over again. Because no one can take away the love we feel for the people that make our lives seem hole. But giving up the opportunity to meet other people that would make my heart grow further is something I’m not ready to do just yet.&lt;/p&gt;

&lt;h5 id=&quot;originally-posted-on-my-medium&quot;&gt;Originally posted &lt;a href=&quot;https://medium.com/@jessicatemporal/the-moving-e4bc599f0a92&quot;&gt;on my Medium&lt;/a&gt;.&lt;/h5&gt;
</description>
        <pubDate>Thu, 26 Jan 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/the-moving/</link>
        <guid isPermaLink="true">https://jtemporal.com/the-moving/</guid>
        
        <category>personal</category>
        
        <category>love</category>
        
        <category>friends</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>O que 1024 caracteres não me deixaram falar</title>
        <description>&lt;p&gt;Enquanto eu estava preenchendo o formulário de apoio financeiro da &lt;a href=&quot;https://us.pycon.org/2017/&quot;&gt;PyCon&lt;/a&gt;,
me deparei com a seguinte pergunta: &lt;strong&gt;Your Involvement&lt;/strong&gt; (‘Seu Envolvimentor’
em tradução livre). Não era bem uma pergunta. Estava mais para um enunciado
seguido de uma caixa de texto em branco, e logo embaixo de caixa em cinza claro
a frase: “&lt;em&gt;Descreva seu envolvimento em qualquer projeto open source ou em
comunidades Python, locais ou internacionais&lt;/em&gt;”.&lt;/p&gt;

&lt;p&gt;E eu pensei ‘&lt;em&gt;Okay, eu entendi. Posso escrever isso!&lt;/em&gt;’. Consequentemente, fiz uma
lista de todos os tópicos que eu fazia questão que aparecessem em minha resposta.
E foi aí que eu notei.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/kNfs0KCgbBib6/giphy.gif&quot; alt=&quot;useless brain gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Acredito que isso se chama &lt;strong&gt;bloqueio criativo&lt;/strong&gt;. Exato, eu, supostamente,
deveria falar de mim e do que eu gosto de fazer, mas eu não conseguia. Vai entender
essas coisas, né? Então, eu dei respirei fundo. Andei um pouco pelo quarto.
Respirei fundo mais uma vez. Ainda usei esse meio tempo para beber uma água.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://4.bp.blogspot.com/-9gV5Yxlif3g/VK1iroR71dI/AAAAAAAAF9U/TZMkH8Go3Yw/s1600/hiro%2Band%2Btasdahi%2B7.gif&quot; alt=&quot;shake things up gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://3.bp.blogspot.com/-GG0l7cBjiAI/VK1lHeRZORI/AAAAAAAAF9g/3m7DRkTseyw/s1600/hiro%2Band%2Btasdahi%2B8.gif&quot; alt=&quot;new angle gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E então, como mágica, as palavras surgiram. Mal sabia eu que aquela caixa tinha
apenas 1024 caracteres, e eu acabei escrevendo 2782. Oops. Depois de colocar meu
coração e alma nessa resposta, antes de diminuir-la a 995 caracteres, decidi que iria
postar a versão inteira aqui. Então senta que lá vem história.&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;Eu faço parte de do grupo de usuários Python em Ribeirão Preto (uma cidade no Estado
de São Paulo), mais conhecido como &lt;a href=&quot;https://www.facebook.com/grupyrp&quot;&gt;grupy-rp&lt;/a&gt;,
desde o fim de 2015 quando os meninos que faziam parte desse grupo foram dar um
mini-curso na semanaa semana acadêmica do meu curso. Era uma introdução a Python
e Django com deploy de webapp simples para o Heroku.&lt;/p&gt;

&lt;p&gt;A maior parte do Grupy-RP é composta por homens e mesmo assim eu continuei indo
aos encontros e me tornei parte daquilo que eu gosto de chamar de &lt;em&gt;família tech&lt;/em&gt;.
Um dos meninos do grupo me apresentou ao &lt;a href=&quot;http://brasil.pyladies.com/&quot;&gt;PyLadies&lt;/a&gt;,
um conceito que eu não fazia ideia da existência. Foi então que eu entrei em contato
com as outras &lt;em&gt;ladies&lt;/em&gt; espalhadas pelo Brasil. E foi assim que eu conheci a segunda
coisa que eu mais amo sobre Python: um grupo de mulheres que trabalham juntas com
uma ferramenta que amo.&lt;/p&gt;

&lt;p&gt;O grupy-rp também organiza um evento local chamado &lt;a href=&quot;http://caipyra.python.org.br/&quot;&gt;Caipyra&lt;/a&gt;,
e foi nesse evento que eu conheci alguns desenvolvedores(as) maravilhosos(as).
Nessa mesma época, o mesmo amigo que me apresentou as PyLadies (que iriam trabalhar
comigo para criar um novo grupo local) falou que tinha uma vaga aberta na startup
que ele trabalhava para um estágio de desenvolvimento web com Python, e disse “Você
tem que se candidatar!”. Depois de muita conversa e fazer e refazer o Tutorial das
Django Girls, e eu comecei a gostar da ideia de me tornar uma webdev. E foi assim
que eu me candidatei.&lt;/p&gt;

&lt;p&gt;Entre outros candidatos, eu fui escolhida para trabalhar lá. Naquela época, eu
já me sentia em casa. Já estava acostumada a ir a eventos menores, conversava sobre
Python com as pessoas que eu conhecia e eu caí de cabeça em um estágio com o cara
que eu considero um dos meus mentores. Foram sete meses intensos. Muitas dúvidas
em relação a mim mesma e síndrome do impostor para lidar. Porém, hoje sei que
todos os dias eu posso me tornar uma desenvolvedora melhor.&lt;/p&gt;

&lt;p&gt;E ser uma desenvolvedora melhor também inclui ir a eventos e ensinar o que você
sabe para outros então, quando surgiu a oportunidade de me tornar uma tutora no
Django Girls, eu não pude deixar deixar escapar. Me inscrevi como instrutora do
Django Girls que rolou durante a &lt;a href=&quot;http://2016.pythonbrasil.org.br/&quot;&gt;Python Brasil&lt;/a&gt;
de 2016 e recebi uma resposta positiva alguns meses depois de fecharem as inscrições.
Eu não podia me sentir mais amada.&lt;/p&gt;

&lt;p&gt;Claro que para tudo isso acontecer eu precisei, e tive, incentivo dos meus amigos
e mentores da comunidade Python. Essa comunidade linda que me aceitou de braços
abertos e, quando a hora chegou, fez de tudo em seu poder para que eu não me
sentisse excluída.&lt;/p&gt;

&lt;p&gt;O modo que eu achei para retribuir todo esse amor que me foi dado é ajudar outros,
sempre que possível eu sempre acho um tempo para contribuir com projetos &lt;em&gt;open
source&lt;/em&gt; como o site das PyLadies Brasil, ou como o projeto Serenata de Amor, o
qual o grupy-rp organizou um fim de semana para contribuir, também postando o que
eu aprendi num blog. E as vezes até incentivando os outros do mesmo jeito que eu
fui incentivada.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Para &lt;a href=&quot;https://twitter.com/mari_mioto&quot;&gt;Pam&lt;/a&gt; que leu isto enquanto estava sendo escrito pela primeira vez e me incentivou
a publicá-lo; Para &lt;a href=&quot;https://medium.com/@pedro.marcello.q&quot;&gt;Pedro&lt;/a&gt; que sempre manda mensagens amigáveis para lembrar de terminar os
textos como solicitado; Para &lt;a href=&quot;http://leportella.com/&quot;&gt;Leticia&lt;/a&gt; que me encorajou a preencher o pedido de auxílio
financeiro da PyCon; Para &lt;a href=&quot;http://rgth.co/&quot;&gt;Marco&lt;/a&gt; meu amigo e mentor; E para &lt;a href=&quot;https://twitter.com/matemps&quot;&gt;Mari&lt;/a&gt; que é sempre muito
paciente ao me dar feedback sobre minha escrita.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edit: Agora eu oficialmente desenvolvedora e analista de dados full-time no&lt;/em&gt;
&lt;em&gt;Projeto Serenata de Amor e também me formei \o/&lt;/em&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 23 Jan 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/eu-quis-dizer/</link>
        <guid isPermaLink="true">https://jtemporal.com/eu-quis-dizer/</guid>
        
        <category>pessoal</category>
        
        <category>python</category>
        
        <category>pycon</category>
        
        <category>português</category>
        
        
      </item>
    
      <item>
        <title>What I wanted to say but 1024 characters wouldn’t let me</title>
        <description>&lt;p&gt;As I was filling out PyCon’s financial aid form, I came across the following
question: &lt;strong&gt;Your Involvement&lt;/strong&gt;. It wasn’t really a question it was more of a
statement followed by a white text box and in smaller faded letters this description
“&lt;em&gt;Describe your involvement in any open source projects or Python communities, local
or international.&lt;/em&gt;”&lt;/p&gt;

&lt;p&gt;I thought “&lt;em&gt;Okay, now I get it. I can do that!&lt;/em&gt;”. So I listed all the topics I
wanted to cover in my answer and then it hit me.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/kNfs0KCgbBib6/giphy.gif&quot; alt=&quot;useless brain gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I believe that’s called &lt;strong&gt;writer’s block&lt;/strong&gt;. Yep. I was supposed to talk about me,
and what I like to do I simply couldn’t. Go figure. So I took a deep breath.
Walked around the room a little. Took another deep breath. Drank some water.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://4.bp.blogspot.com/-9gV5Yxlif3g/VK1iroR71dI/AAAAAAAAF9U/TZMkH8Go3Yw/s1600/hiro%2Band%2Btasdahi%2B7.gif&quot; alt=&quot;shake things up gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://3.bp.blogspot.com/-GG0l7cBjiAI/VK1lHeRZORI/AAAAAAAAF9g/3m7DRkTseyw/s1600/hiro%2Band%2Btasdahi%2B8.gif&quot; alt=&quot;new angle gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And then, like magic, the words came. Little did I know that the white box had
a 1024 character limit and I ended up writing 2782 oops. Well, after putting my
heart into this answer I decided, before cutting it down to 995 characters, that
I would post the complete answer here. So brace yourselves.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;I am part of a Python users group in Ribeirao Preto (a city in Sao Paulo estate)
known as grupy-rp since the end of 2015, when the guys from grupy-rp went to my
course’s academic week to give a day long workshop. It was a introduction to Python
and deploy of a simple Django webapp to Heroku.&lt;/p&gt;

&lt;p&gt;The majority of grupy-rp is composed by men, but still I kept going to the meet
ups and became part of what I like to call my tech family. One of the guys there
introduced me to the PyLadies, concept that I was totally unaware of, so I got in
touch with other ladies in Brazil. And then, I met the second thing I love most
about Python, a group of women that work together with a tool that I loved.&lt;/p&gt;

&lt;p&gt;grupy-rp also organizes a local Python event known as Caipyra it was at this event
that I got to know some amazing developers. Around the same time, the same friend
that introduced to me to some PyLadies (which would work with me to create a new
PyLadies chapter) had an opening in the startup that he worked for a Python Web
Development Intern and said ‘You have to apply!’ after a lot of talking and doing
and re-doing Django Girls Tutorial the idea of becoming a webdev grew on me and I
applied.&lt;/p&gt;

&lt;p&gt;Among other candidates I was accepted to work there. At that time I already felt
at home, I used to go to the minor events, I talked about Python with the people
I know, and I landed an internship with a guy that I consider one of my mentors.
It was some intense seven months, a lot of self doubt and impostor syndrome to
deal with, but at the end I know today that I’m capable of being a better coder
every day.&lt;/p&gt;

&lt;p&gt;And becoming a better coder also includes going to events and teaching what you
know to others, so once the opportunity to become a Django Girls Coach came up I
couldn’t let it pass by. I applied to become a coach to the girls during PyCon Brazil
last year, and got a positive response a few months after the applications closed.
I could not feel more loved.&lt;/p&gt;

&lt;p&gt;Of course for all that to happen I had major encouragements from my mentors and
friends in the Python community. This beautiful community that accepted me with
open arms. And when time came, made everything in it’s power so that I would not
feel excluded.&lt;/p&gt;

&lt;p&gt;The way I find to give back all love that has been given to me is to help others
so whenever possible I find time to contribute with open source projects such as
PyLadies Brazil website or Projeto Serenata de Amor, which grupy-rp organized a
sprint weekend to contribute, or posting something that I learned in a blog, or
helping others study and sometimes just encouraging others as much as I was
encouraged.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;To &lt;a href=&quot;https://twitter.com/mari_mioto&quot;&gt;Pam&lt;/a&gt; that read this while I was writing it
for the first time and encouraged me to post it; To &lt;a href=&quot;https://medium.com/@pedro.marcello.q&quot;&gt;Pedro&lt;/a&gt;
that keeps sending me the friendly reminders to finish the posts as requested;
To &lt;a href=&quot;http://leportella.com/&quot;&gt;Letícia&lt;/a&gt; that encouraged me to apply to PyCon finaid;
To &lt;a href=&quot;http://rgth.co/&quot;&gt;Marco&lt;/a&gt; my friend and mentor; And to &lt;a href=&quot;https://twitter.com/matemps&quot;&gt;Mari&lt;/a&gt;
that is always very patient when giving me feedback about my writing. ❤&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edit: Right now I’m part of the Projeto Serenata de Amor as a full time developer and data analyst and I also graduated \o/&lt;/em&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 23 Jan 2017 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/I-wanted-to-say/</link>
        <guid isPermaLink="true">https://jtemporal.com/I-wanted-to-say/</guid>
        
        <category>personal</category>
        
        <category>python</category>
        
        <category>pycon</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>Uma semana de Serenata de Amor</title>
        <description>&lt;p&gt;Alguns de vocês sabem que eu comecei a fazer parte do projeto &lt;a href=&quot;https://serenata.ai&quot;&gt;Serenata de Amor&lt;/a&gt; essa semana. Projeto que tem como objetivo ajudar a combater a corrupção usando técnicas de machine learning e data science.&lt;/p&gt;

&lt;p&gt;Por causa desse projeto e dessa participação algumas pessoas vieram falar comigo. Em particular uma menina super dedicada e interessada no mundo da tecnologia que conheci na python Brasil 12. Essa minha amiga me fez a seguinte pergunta:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Je como você fez pra superar as dificuldades de começar a trabalhar como desenvolvedora?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E foi isso que me deu a ideia de escrever esse post pra contar um pouquinho sobre como que foi essa semana…&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Pra continuar lendo esse artigo e saber mais como foi isso de participar de um time maravilhoso lá para a revista do Serenata de Amor 👇&lt;/p&gt;

&lt;center&gt;
  &lt;a href=&quot;https://medium.com/serenata/uma-semana-de-serenata-de-amor-f65febeb981d&quot;&gt;
  &lt;img src=&quot;/images/clique-aqui-para-ler.webp&quot; /&gt;
  &lt;/a&gt;
&lt;/center&gt;
</description>
        <pubDate>Mon, 16 Jan 2017 02:00:00 +0000</pubDate>
        <link>https://jtemporal.com/uma-semana-de-serenata/</link>
        <guid isPermaLink="true">https://jtemporal.com/uma-semana-de-serenata/</guid>
        
        <category>medium</category>
        
        <category>serenata de amor</category>
        
        <category>python</category>
        
        <category>development</category>
        
        <category>data science</category>
        
        <category>ciencia de dados</category>
        
        <category>desenvolvimento</category>
        
        
      </item>
    
      <item>
        <title>It&apos;s Alive</title>
        <description>&lt;p&gt;Finally I managed to get this thing going! After a few days trying to get this
beautiful Jekyll template to work, and a lot of time in between theese days, I
finally got it to work! \o/&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/3oEjI6hkw6nbYNQkz6/giphy.gif&quot; alt=&quot;it&apos;s alive&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;disclaimer&quot;&gt;Disclaimer&lt;/h2&gt;
&lt;p&gt;So yeah, I’m a pythonista and I love Python, but I still decided to have a
personal page that is ruby based. First because, GitHub deploys Jekyll pages
without having to build the site somewhere before uploading it like Pelican
would have me do. And secondly, because I fell in love with this template, it
is simple, markdown based, and it gave me an opportunity to learn a little bit
more about Jekyll and Ruby.&lt;/p&gt;

&lt;p&gt;Also, I’m brazilian, so just let me warn you in advance, most of my posts will
be in portuguese, especially the ones with technical information. The main
reason for that is that I have noticed that a lot of information about
programming and software development is passed in english and this creates a
barrier for students that have little to no knowledge of english and want to
learn more about these subjects.&lt;/p&gt;

&lt;p&gt;Other than that not much to say here…&lt;/p&gt;

&lt;p&gt;See you soon ;)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/jYAGkoghdmD9S/giphy.gif&quot; alt=&quot;thats-all-folks&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 13 Oct 2016 00:00:00 +0000</pubDate>
        <link>https://jtemporal.com/its-alive/</link>
        <guid isPermaLink="true">https://jtemporal.com/its-alive/</guid>
        
        <category>personal</category>
        
        <category>ruby</category>
        
        <category>jekyll</category>
        
        <category>english</category>
        
        
      </item>
    
      <item>
        <title>We need to talk about R</title>
        <description>&lt;p&gt;Minha primeira palestra falando sobre R para o GruPy RP.&lt;/p&gt;

&lt;center&gt;
&lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vT3bE8IXgQ6nQ7RT9PQlgwPbmzlDmChaL6AI5CqKfzv-UEy24WryMX35NeOnZyWYvxIZE2ltUy-ewg9/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;100%&quot; height=&quot;569&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;center&gt;
&lt;/center&gt;&lt;/center&gt;
</description>
        <pubDate>Wed, 18 Nov 2015 03:00:00 +0000</pubDate>
        <link>https://jtemporal.com/we-need-to-talk-about-r/</link>
        <guid isPermaLink="true">https://jtemporal.com/we-need-to-talk-about-r/</guid>
        
        <category>portugues</category>
        
        <category>português</category>
        
        <category>talk</category>
        
        
      </item>
    
  </channel>
</rss>
