<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vinicius Brasil</title>
    <description>The latest articles on DEV Community by Vinicius Brasil (@vinibrsl).</description>
    <link>https://dev.to/vinibrsl</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F91354%2F7efbff0a-5d9a-4949-a034-c69ccb55a883.jpeg</url>
      <title>DEV Community: Vinicius Brasil</title>
      <link>https://dev.to/vinibrsl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vinibrsl"/>
    <language>en</language>
    <item>
      <title>Programmers Replaced With AI?</title>
      <dc:creator>Vinicius Brasil</dc:creator>
      <pubDate>Fri, 12 May 2023 14:19:29 +0000</pubDate>
      <link>https://dev.to/vinibrsl/programmers-replaced-with-ai-1nhg</link>
      <guid>https://dev.to/vinibrsl/programmers-replaced-with-ai-1nhg</guid>
      <description>&lt;p&gt;A few days ago, I came across an intriguing headline on LinkedIn that displayed a bold statement: "Tech Company Aims to Increase Programmers' Productivity by 50% with GitHub Copilot." What made the situation even more curious was that the author of the post was not a programmer. Despite the audacity of the headline, I believe this issue can lead to an interesting analysis and discussion.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rs-mBEgy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://debugando.org/images/imagem-gerada-por-ia.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rs-mBEgy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://debugando.org/images/imagem-gerada-por-ia.jpg" alt="AI generated image" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's no denying the impressive capabilities of the AI tools available to the public today. In the field of programming, they are already significantly assisting developers, optimizing their routines and increasing productivity. With the right tools, problems can be solved at a faster pace. However, for those unfamiliar with programming, these AI tools may seem almost mystical, giving the impression that they can quickly and automatically solve any problem. But we know that reality is quite different.&lt;/p&gt;

&lt;p&gt;The enthusiasm generated by these tools is fully justified, and before forming a misconception about me, know that I am also one of them. However, I believe that not everyone fully understands what these tools are capable of in reality. On one hand, you have beginners in programming who fear being replaced by machines. On the other hand, you have CEOs seeking magical solutions to reduce costs or increase productivity, perhaps without a clear understanding of the actual work performed by a programmer.&lt;/p&gt;

&lt;h1&gt;
  
  
  It's not quite like that...
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"ChatGPT (or Copilot), create a page to sell tickets for a show in Node.js. The backend should be prepared for an average of 2,000 requests per second and be resilient to failures. Set up a load balancer to distribute requests among distributed servers. Ensure caches are functional and actually reducing server load. Instrument real-time monitoring tools. And of course, the database should be clustered with a good replication strategy."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The example is overly exaggerated, I know. But it illustrates the complexity behind implementing something that may seem simple to someone who is not a programmer. Writing code is only part of a programmer's job, and I'm sure generative AIs excel at that, but it's not everything a programmer does.&lt;/p&gt;

&lt;p&gt;We, programmers, spend a significant portion of our day without writing a single line of code. It's necessary to first understand the requirements of new features, engage in conversations and adjustments with stakeholders, design the technical architecture, and finally translate all that information into code. And let's not forget that this code must be written in context, considering how it fits with the rest of the existing codebase.&lt;/p&gt;

&lt;p&gt;What I mean is that these AI tools, although very useful, don't do magic. But they can be good assistants to programmers.&lt;/p&gt;

&lt;h1&gt;
  
  
  AI as a rubber duck
&lt;/h1&gt;

&lt;p&gt;One of the readings that greatly expanded my perspective in software engineering was the classic book "The Pragmatic Programmer" by Dave Thomas and Andrew Hunt. One of the chapters talks about a curious debugging technique: the rubber duck.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J0dSSA4g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://debugando.org/images/pato-de-borracha.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J0dSSA4g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://debugando.org/images/pato-de-borracha.jpg" alt="Rubber duck" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The basic idea behind rubber duck programming is to explain the code or problem you're facing out loud, as if you were explaining it to a rubber duck. By verbalizing the problem or describing the code step by step, you often find a solution or gain a new perspective on the problem.&lt;/p&gt;

&lt;p&gt;ChatGPT is excellent at conversing, and furthermore, conversing in context. Could this artificial intelligence be the evolution of Dave Thomas and Andrew Hunt's rubber duck? There are already extensions for Visual Studio Code that integrate with ChatGPT, using it as a rubber duck. You can check them out &lt;a href="https://marketplace.visualstudio.com/items?itemName=Rubberduck.rubberduck-vscode"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I like how GitHub chose to name its product Copilot, and that aligns with the concept of the rubber duck. The tool aims to be a co-pilot rather than the actual pilot. It is the programmer's assistant, their rubber duck.&lt;/p&gt;

&lt;h1&gt;
  
  
  The harsh reality
&lt;/h1&gt;

&lt;p&gt;This message is for those who are anxious and concerned about the future of their programming careers: relax! But don't relax that much, because the harsh reality is that it is the fundamentals of software engineering that make a good programmer, not just the code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o0nbCpJj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://debugando.org/images/apple-ii.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o0nbCpJj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://debugando.org/images/apple-ii.jpg" alt="Apple II Ad" width="550" height="743"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the popularization of computers for the general public in the 70s and 80s, accounting and finance professionals felt threatened by spreadsheet software. A machine that could store thousands of rows and columns and never make calculation errors. Who would reject that?&lt;/p&gt;

&lt;p&gt;It is true that spreadsheets were and still are powerful, and they did pose a threat to "spreadsheet writers" jobs. However, those who interpreted the data, understood the business context, and applied accounting concepts certainly knew how to use spreadsheets instead of criticizing them.&lt;/p&gt;

&lt;p&gt;Programmers are not mere code writers. Don't fear your new rubber duck, instead, use it. And thank you, ChatGPT, for helping me putting this article together.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>A lesser-known vector for XSS attacks: SVG files</title>
      <dc:creator>Vinicius Brasil</dc:creator>
      <pubDate>Mon, 20 Feb 2023 01:58:00 +0000</pubDate>
      <link>https://dev.to/vinibrsl/a-lesser-known-vector-for-xss-attacks-svg-files-5hm5</link>
      <guid>https://dev.to/vinibrsl/a-lesser-known-vector-for-xss-attacks-svg-files-5hm5</guid>
      <description>&lt;p&gt;Cross-site scripting (XSS) is a type of security vulnerability commonly found in web applications. Attackers exploit XSS vulnerabilities to inject malicious code into a site, which can then be executed on the server or other users’ browsers. While modern web frameworks like Ruby on Rails and Phoenix offer built-in protections against basic XSS attacks, XSS is still a prevalent threat that can compromise sensitive user data.&lt;/p&gt;

&lt;p&gt;The most common type of XSS attack occurs when a web application fails to properly sanitize user input before displaying it to other users. When a site fails to escape user input, attackers can inject HTML code, which can be particularly dangerous if it is malicious JavaScript code. If an attacker successfully injects JavaScript into a site, they can hijack user sessions, steal cookies, and even send passwords to external servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  SVG files
&lt;/h2&gt;

&lt;p&gt;One lesser-known vector for XSS attacks is the SVG image format. SVGs support JavaScript using the &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag, which can be exploited by attackers. Here is an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;svg&amp;gt;
  &amp;lt;polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/&amp;gt;
  &amp;lt;script type="text/javascript"&amp;gt;alert("xss");&amp;lt;/script&amp;gt;
&amp;lt;/svg&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For instance, imagine a user uploads an SVG file with a script embedded in it that steals their session cookie when viewed by other users on the same site. If the web application fails to sanitize the uploaded SVG and renders it as-is, the script will execute and the attacker can access the victim’s session.&lt;/p&gt;

&lt;p&gt;Similarly, if the application proxies SVGs from an external source, an attacker could inject malicious scripts into the SVG file, and the web application will unwittingly serve the malicious content to its users. This can lead to various types of attacks, such as phishing, data theft, and session hijacking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting shields in place
&lt;/h2&gt;

&lt;p&gt;There are three common ways of preventing XSS attacks via SVGs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adding a stricter &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP" rel="noopener noreferrer"&gt;Content-Security-Policy header&lt;/a&gt; on the route that serves the SVG file.&lt;/li&gt;
&lt;li&gt;Sanitizing SVG files by removing scripts before rendering.&lt;/li&gt;
&lt;li&gt;Or converting SVGs to rasterized formats like PNG and JPG.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’ve recently fixed this vulnerability on Plausible, an open-source analytics tool. You can check my commit &lt;a href="https://github.com/plausible/analytics/commit/9b32dace3e27ab63299d1d73dd0c6db557bf8870" rel="noopener noreferrer"&gt;here&lt;/a&gt;. The server acted as a proxy and loaded favicons from external sources to be displayed on Plausible’s site. I opted to add the stricter CSP header, meaning that any scripts included in the SVG file will only be executed if they come from the same origin as the webpage that is serving the file. Any attempt to load content from a different origin will be blocked by the browser.&lt;/p&gt;

&lt;p&gt;By following best practices for secure coding and staying vigilant for lesser-known attack vectors like SVG, web developers can help protect their users’ data from the threat of XSS attacks.&lt;/p&gt;

</description>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Don't be protective of your code</title>
      <dc:creator>Vinicius Brasil</dc:creator>
      <pubDate>Tue, 19 Jul 2022 15:57:11 +0000</pubDate>
      <link>https://dev.to/vinibrsl/dont-be-protective-of-your-code-33mi</link>
      <guid>https://dev.to/vinibrsl/dont-be-protective-of-your-code-33mi</guid>
      <description>&lt;p&gt;You spent hours and hours writing code. You are ready to submit your changes for code review. *Notification bell rings*. Changes were requested, code suggestions, potential bugs, and clean code issues. You get pissed.&lt;/p&gt;

&lt;p&gt;Let's imagine another situation. Your feature gets merged to production. Weeks later you get a message from operations saying something is not working. You get defensive and assume they must be using it wrong.&lt;/p&gt;

&lt;p&gt;That is the result of being protective of your code. Even though I love coding, I'm confident the value I deliver is not code. The end of my work is not the code itself, but the product I'm building. However, it doesn't mean my code doesn't need to be clean and easy to read, as those are to make the product extensible in the future. Software engineers that are protective of their code, don't understand that programming is a tool. It's for sure crucial, but not the final work. True problem-solvers use their technical skills as a tool.&lt;/p&gt;

&lt;p&gt;Seasoned engineers know code is merely the paintbrush for good art. Being protective of your code slows you down in the following ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You get offended when taking feedback&lt;/li&gt;
&lt;li&gt;Makes you blind to potential bugs&lt;/li&gt;
&lt;li&gt;Prevents you from learning from other developers&lt;/li&gt;
&lt;li&gt;Causes you to think code reviews are personal&lt;/li&gt;
&lt;li&gt;Closes yourself to criticism and advice&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;This is the second installment of short reads about common career problems engineers face. If that sounds interesting, I invite you to read &lt;a href="https://world.hey.com/vini/the-fear-of-merging-f86517e0"&gt;"The fear of merging"&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The fear of merging</title>
      <dc:creator>Vinicius Brasil</dc:creator>
      <pubDate>Fri, 15 Jul 2022 14:43:14 +0000</pubDate>
      <link>https://dev.to/vinibrsl/the-fear-of-merging-35dp</link>
      <guid>https://dev.to/vinibrsl/the-fear-of-merging-35dp</guid>
      <description>&lt;p&gt;You just opened a pull request. Wrote a detailed description. Asked for reviews. The notification bell is ringing. It's your colleagues commenting "LGTM". Hit the merge button and 10 minutes later you get error notifications from your code. You broke production.&lt;/p&gt;

&lt;p&gt;That starts a cycle with most of your code submissions. You're told by the impostor syndrome you're not qualified for the job. You think you're not as good as other software engineers. Other developers (mostly Twitter stars) seem error-proof.&lt;/p&gt;

&lt;p&gt;Let me tell you something you already know: everybody makes mistakes. Senior engineers, junior engineers, CTOs. The difference between a good and an average professional is how you deal with the incident. Good engineers do as follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't try to find the culprit but focus on solving the issue&lt;/li&gt;
&lt;li&gt;Know how to differentiate a critical from a minor problem&lt;/li&gt;
&lt;li&gt;Don't fear asking for help from other developers&lt;/li&gt;
&lt;li&gt;Warn the team as soon as they notice a production issue (even if they caused it)&lt;/li&gt;
&lt;li&gt;They're proactive in documenting post-mortem in written and searchable form for future reference. This includes technical details and potential business outcomes from the incident&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't need to blame yourself. Production incidents don't happen just because of someone's code. It is a chain of causes that trigger a problem. And these causes aren't technical only. Good engineering environments do as follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strong testing culture (automated and manual)&lt;/li&gt;
&lt;li&gt;CI and CD tools integrated with code submissions&lt;/li&gt;
&lt;li&gt;Error monitoring tools with real-time notifications&lt;/li&gt;
&lt;li&gt;Healthy code review culture&lt;/li&gt;
&lt;li&gt;Good communication culture and tools&lt;/li&gt;
&lt;li&gt;Expect errors to happen and people to make mistakes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Organizations and teams must be expecting incidents to happen and builds a strong and healthy culture inside the engineering environment. This does not mean that incidents should happen often, but if they're happening, it's an opportunity for the organization to learn how to prepare better when it comes.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>Pragmatic programmers ask why</title>
      <dc:creator>Vinicius Brasil</dc:creator>
      <pubDate>Tue, 08 Mar 2022 14:18:18 +0000</pubDate>
      <link>https://dev.to/vinibrsl/pragmatic-programmers-ask-why-d3b</link>
      <guid>https://dev.to/vinibrsl/pragmatic-programmers-ask-why-d3b</guid>
      <description>&lt;p&gt;There is something about progress that hides past decisions into new solutions. Throughout history, problems are solved with tools that generate other problems that are solved with other tools. This keeps looping until we forget the whys. "Why does almost every User-Agent starts with Mozilla? And what the heck is Gecko?", "why do we need Unicode?", "why do we need HTTPS?".&lt;/p&gt;

&lt;p&gt;Thanks to open-source software you can be a great programmer without ever asking these questions. I'm not suggesting you solve those problems on your own, but asking &lt;em&gt;why&lt;/em&gt; helps you develop a pragmatic critical thinking, which is different from mere curiosity. The bad side of curiosity killed the cat and can drive you unproductive. On the other hand, the pragmatic inquisitiveness results in usable knowledge.&lt;/p&gt;

&lt;p&gt;As an example, knowing the decisions that evolved the web into HTTP/3 teaches you high-level software engineering that is not purely theoretical - which has its value - but practical. Bonus: if you're interested in learning this, I recommend you &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP#post-http2_evolution"&gt;this MDN article about the Evolution of HTTP&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;The good news is pragmatic critical thinking is a learned skill. I listed three habits to help you ask &lt;em&gt;why&lt;/em&gt; to what matters. You may already be doing things to develop this skill, but being conscious about it accelerates this process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Recognize your assumptions&lt;/strong&gt;&lt;br&gt;
The definition of assumption is "something that you accept as true without question or proof". If you mainly use object-oriented programming, you might fall into the error of assuming "one always need classes and methods to create a program". Or even &lt;a href="https://www.creativedeletion.com/2015/01/28/falsehoods-programmers-date-time-zones.html"&gt;"the time 23:59:60 is always invalid"&lt;/a&gt;. Beware of the words "always", "must" or "should", as they usually indicate an assumption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Debug your assumptions&lt;/strong&gt;&lt;br&gt;
Before asking why, ask if your assumption is really true. Use your logic to support your assumption, test it, and if it's shown to be false, go to the next step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Seek answers&lt;/strong&gt;&lt;br&gt;
This is where curiosity gets killed and your good habit of pragmatic inquisitiveness will be established. You're building reusable knowledge that will help you question more and more.&lt;/p&gt;

&lt;p&gt;All things considered, it's common to believe in falsehoods. Use it as a cue to support your habit of questioning pragmatically and enjoy the answers you find along the way.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building a Knowledge Base From Your Notes</title>
      <dc:creator>Vinicius Brasil</dc:creator>
      <pubDate>Wed, 27 Oct 2021 13:23:15 +0000</pubDate>
      <link>https://dev.to/vinibrsl/building-a-knowledge-base-from-your-notes-61n</link>
      <guid>https://dev.to/vinibrsl/building-a-knowledge-base-from-your-notes-61n</guid>
      <description>&lt;p&gt;As a software developer, grocery buyer, master procrastinator, and theology student, notetaking is important to me. I have used plenty of tools that helped me keep to-do lists, take notes from my classes, and textbooks. Apple Notes, Evernote, Notion, Bear, Agenda, Notability, OneNote, Google Keep, paper and pen. I have literally tried all these. They are great tools, but when the number of notes starts growing, some problems start to raise:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Notes become hard to find&lt;/li&gt;
&lt;li&gt;Even if the app has a #tag feature, you don't remember all of your tags to search&lt;/li&gt;
&lt;li&gt;Full-text search does not scale&lt;/li&gt;
&lt;li&gt;You can't easily link your notes&lt;/li&gt;
&lt;li&gt;Older notes become obsolete&lt;/li&gt;
&lt;li&gt;Older parts of your knowledge base go to waste&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The main problem does not lie within the app, but the way we take notes. The human brain is non-linear: we jump from idea to idea, all the time. Your notetaking tool should work the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zettelkasten
&lt;/h2&gt;

&lt;p&gt;In my journey to find a solution, I found this strange and old method of taking notes called Zettelkasten, or slip-box in English. Niklas Luhmann, the creator of the method, was a highly productive social scientist with 50 books and over 600 scientific articles published. He could only publish that amount of articles thanks to Zettelkasten.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A Zettelkasten is a personal tool for thinking and writing. It has hypertextual features to make a web of thought possible. The difference to other systems is that you create a web of thoughts instead of notes of arbitrary size and form, and emphasize connection, not a collection. &lt;a href="https://zettelkasten.de/introduction/"&gt;(zettelkasten.de)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zettelkasten proposes a way of writing connected notes, and not just a collection of notes. Take Wikipedia as an example: it is not just a collection of articles, but a web of connected knowledge.&lt;/p&gt;

&lt;p&gt;If you're at the Elixir programming language Wikipedia page, you might find a link pointing to Erlang, that points to Open Telecom Platform, that points to Ericsson, and so on. Luckily &lt;a href="https://wikipedia.luk.ke"&gt;someone built a graph view to Wikipedia&lt;/a&gt;, and Elixir's graph looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uKiFTQtj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2mj7s2wlhu4y5webt9v2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uKiFTQtj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2mj7s2wlhu4y5webt9v2.png" alt="Elixir Wikipedia Graph" width="800" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can learn more about this method in &lt;a href="http://zettelkasten.de"&gt;zettelkasten.de&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Obsidian
&lt;/h2&gt;

&lt;p&gt;After studying the method and tweaking it to my own needs, I found this amazing notetaking tool called Obsidian. It is a powerful knowledge base on top of a local folder of plain text Markdown files that you can organize in whatever way you want.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Obsidian is my current choice for writing and organizing notes on any complicated subject. Feels like the closest anyone has come yet to realizing the promise of hypertext as a tool of thought. (Graydon Hoare, creator of the Rust programming language)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I take notes on almost every content I read or listen to. Podcasts, blogs, articles, books. Links help me to build a solid knowledge base. Everything is saved in Markdown files in my iCloud Drive - but you can use whatever you want, from your local disk to a GitHub repository. This ensures these notes will be with me for a long long time.&lt;/p&gt;

&lt;p&gt;This is how the graph view of my notes looks like. A mix of Portuguese and English with links that just work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ydsXmVRB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ce44gie6ydir7mvgjgag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ydsXmVRB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ce44gie6ydir7mvgjgag.png" alt="My notes graph view" width="800" height="826"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And before you ask, here is a sample note I took from an article I read:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---RL75xTY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wq14vceipvyko57isbr6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---RL75xTY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wq14vceipvyko57isbr6.png" alt="Literature note example" width="800" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ziE6UExsOrs"&gt;This guide&lt;/a&gt; helped me start with Obsidian. Hope this helped you in your notetaking journey.&lt;/p&gt;

</description>
      <category>notetaking</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stupid users or stupid design?</title>
      <dc:creator>Vinicius Brasil</dc:creator>
      <pubDate>Fri, 17 Sep 2021 15:33:04 +0000</pubDate>
      <link>https://dev.to/vinibrsl/stupid-users-or-stupid-design-14jp</link>
      <guid>https://dev.to/vinibrsl/stupid-users-or-stupid-design-14jp</guid>
      <description>&lt;p&gt;As a developer, I often have to solve "bugs caused by users". A user mistakenly clicked a button that performed an unintended action a developer had to roll back. One might think the user is stupid but forgot to question the most important thing. Why the user did that in the first place?&lt;/p&gt;

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

&lt;p&gt;This applies not only to digital products but to the real world too. That stupid door that you always push instead of pulling. Or the ketchup packet that you just can't open without tearing apart with your teeth - and sometimes leaving stains in your pants. Stupid things or stupid you?&lt;/p&gt;

&lt;p&gt;Even the everyday things are poor in usability. And in the digital world, it is our responsibility to create products people can actually use. And they shouldn't need a manual to do so. The button that shouldn't be clicked was used because the design was bad - as the ketchup, and as the stupid door.&lt;/p&gt;

&lt;p&gt;Jakob Nielsen, the guru of Web page usability by The New York Times, wrote 10 general principles for interaction design. They are called "heuristics" as they are broad rules of thumb and not specific usability guidelines. We can use this to create better, easy-to-use, and self-explanatory interfaces to our products.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visibility of System Status&lt;/li&gt;
&lt;li&gt;Match between System and the Real World&lt;/li&gt;
&lt;li&gt;User Control and Freedom&lt;/li&gt;
&lt;li&gt;Consistency and Standards&lt;/li&gt;
&lt;li&gt;Error Prevention&lt;/li&gt;
&lt;li&gt;Recognition Rather Than Recall&lt;/li&gt;
&lt;li&gt;Flexibility and Efficiency of Use&lt;/li&gt;
&lt;li&gt;Aesthetic and Minimalist Design&lt;/li&gt;
&lt;li&gt;Recognize, Diagnose, and Recover from Errors&lt;/li&gt;
&lt;li&gt;Help and Documentation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next time blame the design, not the user.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Activating the native spell-checking on Vim</title>
      <dc:creator>Vinicius Brasil</dc:creator>
      <pubDate>Thu, 12 Aug 2021 14:16:56 +0000</pubDate>
      <link>https://dev.to/vinibrsl/activating-the-native-spell-checking-on-vim-1e6o</link>
      <guid>https://dev.to/vinibrsl/activating-the-native-spell-checking-on-vim-1e6o</guid>
      <description>&lt;p&gt;Developers write not only code but documentation, bug reports, commit messages. As a non-native English speaker, I always find myself using &lt;a href="https://hemingwayapp.com"&gt;Hemingway App&lt;/a&gt;, &lt;a href="http://grammarly.com"&gt;Grammarly&lt;/a&gt;, and other similar tools. They help but it is quite annoying having to switch back and forth from my editor to these tools.&lt;/p&gt;

&lt;p&gt;The good news is that Vim ships with a spell-checker. It can check for words that do not exist, wrong capitalization, and even words that were spelled wrong for the selected region.&lt;/p&gt;

&lt;p&gt;To turn the spell-checking on, you can use this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:setlocal spell spelllang=en_us
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also hook it to a specific file type, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;" this goes into your init.vim/.vimrc file
autocmd FileType gitcommit setlocal spell
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Happy Vimming!&lt;/p&gt;

</description>
      <category>vim</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Functional Programming Asks For a Mutable Developer</title>
      <dc:creator>Vinicius Brasil</dc:creator>
      <pubDate>Wed, 20 Jan 2021 22:28:36 +0000</pubDate>
      <link>https://dev.to/vinibrsl/functional-programming-asks-for-a-mutable-developer-355l</link>
      <guid>https://dev.to/vinibrsl/functional-programming-asks-for-a-mutable-developer-355l</guid>
      <description>&lt;p&gt;The class you have been waiting for. It is your programming class in school and the professor offers you plenty of interesting and essential words: objects, classes, constructors, inheritance. You love programming! And that's programming, right? Well, that's one way of structuring your program. And a very thought-provoking way, as object-oriented programming feels quite natural to most people.&lt;/p&gt;

&lt;p&gt;Later on, you got a job to work with Erlang, this programming language that you certainly did not learn in your classes. Erlang is a functional programming language. It's not that is better or worse than Java or C++. It's just different as it has a different paradigm. The thing is you have no classes, no constructors, no methods, no inheritance, and all the concepts you had learned as simply "programming". You try to use the same techniques you know but it just seems off.&lt;/p&gt;

&lt;p&gt;You have to start thinking functionally. Not imperatively. Not object-oriented. This asks for a mutable mind. A mind that will have to sometimes shift between paradigms and understand fully all the differences between them. Immutability is a central concept of functional programming, but a mutable developer, that is up to change, is essential for learning a new paradigm.&lt;/p&gt;

&lt;p&gt;Here are some tips for you to consider when learning FP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Understand&lt;/strong&gt; that a different paradigm means problems are solved differently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Master the concepts&lt;/strong&gt; before jumping into libraries and frameworks. First-class functions, high-order functions, purism, recursion, immutability, type systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learn functional languages&lt;/strong&gt; such as Erlang, F#, Clojure, Haskell to help you apply the concepts into multi-paradigm languages, such as JavaScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't rush&lt;/strong&gt; to learn the most complex topics as functors, monads, currying&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply basic concepts&lt;/strong&gt; to your day-to-day code gradually. Immutability and purism are two functional-thinking concepts that you can use in Ruby or JavaScript. That can make the code more testable, deterministic, and easier to read&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The process to learn functional programming can be daunting and slow as new concepts are involved. It is not like learning Ruby from a Java background. It actually is like learning how to sail a boat knowing how to drive a car. It is completely normal to struggle at first, but mutate your mind to resiliency and always keep learning.&lt;/p&gt;

</description>
      <category>functional</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>How This Art School From 1919 Has Influenced Ruby on Rails?</title>
      <dc:creator>Vinicius Brasil</dc:creator>
      <pubDate>Fri, 04 Dec 2020 02:17:53 +0000</pubDate>
      <link>https://dev.to/vinibrsl/bauhaus-influences-on-ruby-on-rails-doctrine-a-brief-story-11mi</link>
      <guid>https://dev.to/vinibrsl/bauhaus-influences-on-ruby-on-rails-doctrine-a-brief-story-11mi</guid>
      <description>&lt;p&gt;Before Ruby on Rails, web development was a different reality. Enterprise languages and frameworks cornered the market. No automated tests, complex solutions to simple problems, and other issues. DHH, a Bauhaus-rebel for its time, has transformed this scenario by thinking design-driven, developer-first, and, simple. Form follows function, they say.&lt;/p&gt;

&lt;h1&gt;
  
  
  Back to 2004
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6ztyeepj21ytvxjzqfto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6ztyeepj21ytvxjzqfto.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The birth of Facebook, the rise of Firefox, the iPod, and blogging. The most used web technologies were &lt;a href="http://asp.net/" rel="noopener noreferrer"&gt;ASP.NET&lt;/a&gt;, JavaServer Faces, ColdFusion, and, PHP 3 with an enterprise mindset.&lt;/p&gt;

&lt;p&gt;The Ruby programming language may be significantly known these days, but this Japanese language wasn't globally famous even when Rails was first released in 2004. Not just the language was uncommon, but Ruby on Rails had everything to fail:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uncommon language&lt;/li&gt;
&lt;li&gt;No enterprise database support (MySQL by default)&lt;/li&gt;
&lt;li&gt;No Microsoft Windows support&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Back to 1920s
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuhimdp3xik1zf5mlnpxs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuhimdp3xik1zf5mlnpxs.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the end of WW2, Staatliches Bauhaus, or simply Bauhaus, the art school that was ahead of its time, was founded. It was one of the single most influential cultural movements of the 20th century.&lt;/p&gt;

&lt;p&gt;Bauhaus reached far beyond architecture, but design in general, including graphics, typography, product and, furniture. Even Steve Jobs was influenced by Bauhaus in Apple's minimalist and revolutionary design. The main principles of the movement were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Form follows function&lt;/li&gt;
&lt;li&gt;Minimalism&lt;/li&gt;
&lt;li&gt;Smart use of resources&lt;/li&gt;
&lt;li&gt;Simplicity and effectiveness&lt;/li&gt;
&lt;li&gt;Constant development&lt;/li&gt;
&lt;li&gt;Paradigm shift&lt;/li&gt;
&lt;li&gt;Uncomplicated beauty&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rails was created inside 37signals, currently Basecamp, a web software company founded in 1999. The company's design-driven philosophy relates to Bauhaus's thinking in many ways.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Simple interfaces are easier to use, easier to understand, more intuitive, faster loading, and easier to maintain than their flashy, image laden counterparts. Our work proves that simplicity doesn't have to look cheap, feel plain, or be downright ugly. (...) We believe usability should take precedence over "cool."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmsmsmcrggtgz803djez4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmsmsmcrggtgz803djez4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The Rails boom
&lt;/h1&gt;

&lt;p&gt;In 2005 DHH presented "how to build a blog engine in 15 minutes with Ruby on Rails" in a libre software conference in Porto Alegre, Brazil.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Gzj723LkRJY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Using a MacBook, the terminal, TextMate, and Ruby on Rails, the Danish programmer, David Heinemeier Hansson, creates a blog engine in 15 minutes using Rails generators. Revolutionary, seamless, minimal, simple, paradigm-shifting, uncomplicated. Ruby on Rails' philosophy was introduced to the community. Software development can be simple, minimalist, effective, and without bureaucracies.&lt;/p&gt;

&lt;p&gt;In 2006, a year after this video, Ruby was the most popular programming language, according to the TIOBE Index. The mid-1990s Japanese programming language that wasn't planned for this specific use.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I knew Python then. But I didn’t like it, because I didn’t think it was a true object-oriented language—OO features appeared to be an add-on to the language. As a language maniac and OO fan for 15 years, I really wanted a genuine object-oriented, easy-to-use scripting language. I looked for one, but couldn’t find one. (Matz, creator of Ruby)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frukbdku1g2ik5xbfe8lk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frukbdku1g2ik5xbfe8lk.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ruby's rise is highly related to the Ruby on Rails paradigm shift. The Rails Doctrine, written by DHH in 2016, explains a bit more of the framework philosophy:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ruby on Rails’ phenomenal rise to prominence owed much of its lift-off to novel technology and timing. But technological advantages erode over time, and good timing doesn’t sustain movements alone over the long term. So a broader explanation of how Rails has continued to not only stay relevant but to grow its impact and community is needed. I propose that the enduring enabler has been and remains its controversial doctrine. (DHH, creator of Ruby on Rails)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Footprints
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq3812b95d32q7qc8g0vb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq3812b95d32q7qc8g0vb.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Bauhaus was a rebel for its time as Rails. Everything from Apple to Nike has been influenced by the school. Rails' credo has also influenced other programming communities, such as PHP, which now has Laravel, "The PHP Framework For Web Artisans", which was inspired on Rails. Phoenix, a web framework for the Elixir programming language that gives you peace of mind from development to production, was motivated by Rails.&lt;/p&gt;

&lt;p&gt;All this strong influence creates a new default on web frameworks that have generators, tests by default, are simple, and adopt convention-by-configuration. Currently, it is expected for a web framework to have all these features that Rails first compiled.&lt;/p&gt;

&lt;h1&gt;
  
  
  Maturing and staying relevant
&lt;/h1&gt;

&lt;p&gt;The Ruby on Rails web framework powers lots of services out there, including GitHub, Heroku, CodeClimate, TravisCI, and Shopify. It is indeed widely used and popular technology. But what makes Ruby on Rails so special among all the other options nowadays?&lt;/p&gt;

&lt;p&gt;Nowadays every language has its Rails-like web framework. PHP with Laravel, Elixir with Pheonix, Java with Spring Framework. Ruby on Rails is not as disruptive as it was back in 2004. Every year Ruby developers have to answer the same question: &lt;code&gt;"Is Rails dead in #{Date.today.year}?"&lt;/code&gt;. The truth is Rails is still firm in its philosophy and are always improving. The last big releases included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Action Mailbox&lt;/strong&gt;, a new way to serve to &lt;a href="https://github.com/rails/actionmailbox/blob/master/lib/action_mailbox/base.rb#L6" rel="noopener noreferrer"&gt;route incoming emails&lt;/a&gt; to controller-like mailboxes for processing in Rails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action Text&lt;/strong&gt;, bringing the &lt;a href="https://trix-editor.org/" rel="noopener noreferrer"&gt;Trix editor&lt;/a&gt; to the framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel testing&lt;/strong&gt;, allows you to parallelize your test using forks or threads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webpack&lt;/strong&gt; as the default JavaScript bundler&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Active Storage&lt;/strong&gt;, a modern approach of uploading files straight to the cloud&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP/2 Early Hints&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credentials&lt;/strong&gt;, a new and secure way to store secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not to mention Ruby 3 improvements and new features, such as Ractors (Erlang-like actor-model concurrency), typing definitions, and more.&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Using Python To Visualize Internet Affordability Worldwide</title>
      <dc:creator>Vinicius Brasil</dc:creator>
      <pubDate>Wed, 25 Nov 2020 22:29:24 +0000</pubDate>
      <link>https://dev.to/vinibrsl/using-python-to-visualize-internet-affordability-worldwide-2542</link>
      <guid>https://dev.to/vinibrsl/using-python-to-visualize-internet-affordability-worldwide-2542</guid>
      <description>&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/vinibrsl" rel="noopener noreferrer"&gt;
        vinibrsl
      &lt;/a&gt; / &lt;a href="https://github.com/vinibrsl/internet-affordability" rel="noopener noreferrer"&gt;
        internet-affordability
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🌍 Did you know that internet costs &amp;gt;20% of the average income in some countries?
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Internet Affordability by Country&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Access to the Internet is a basic human right, the United Nations declared in 2016, however, there are many countries that the Internet is still not affordable. In Europe, 87% of families enjoy Internet access, while that figure is only 18% in Africa.&lt;/p&gt;
&lt;p&gt;This project shows that there are countries that Internet access costs more than 20% of the average monthly income of a household.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/vnbrs/internet-affordability/raw/main/chart.gif"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fvnbrs%2Finternet-affordability%2Fraw%2Fmain%2Fchart.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you want to see the data with more details, &lt;a href="https://datawrapper.dwcdn.net/6PZaM/1/" rel="nofollow noopener noreferrer"&gt;here's the link to the full chart&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why is the Internet so important?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The Internet is so embedded in our lives that sometimes we don't realize that it links to our human rights, such as the right to freedom of speech, the right to development, and the right to freedom of assembly.&lt;/p&gt;
&lt;p&gt;The global coronavirus pandemic has revealed how dependent we have become on Internet access. Voting, telemedicine, studying, shopping…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/vinibrsl/internet-affordability" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Using some data from Numbeo, a bit of Python and research I've made &lt;a href="https://github.com/vnbrs/internet-affordability" rel="noopener noreferrer"&gt;this project&lt;/a&gt; that shows that there are countries that Internet access costs more than 20% of the average monthly income of a household.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpwvev73eo6rz9akdp12t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpwvev73eo6rz9akdp12t.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Access to Internet is a basic human right, the United Nations declared in 2016, however there are many countries that Internet is still not affordable. In Europe, 87% of families enjoy Internet access, while that figure is only 18% in Africa.&lt;/p&gt;

&lt;p&gt;The global coronavirus pandemic has revealed how dependent we have become on Internet access. Voting, telemedicine, studying, shopping, among other things that we do without even realizing there are people that don't have Internet access.&lt;/p&gt;

&lt;p&gt;Check out the project on &lt;a href="https://github.com/vnbrs/internet-affordability" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and please star and/or contribute!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vnbrs/internet-affordability" rel="noopener noreferrer"&gt;https://github.com/vnbrs/internet-affordability&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Seeking for alternatives when working with bad software</title>
      <dc:creator>Vinicius Brasil</dc:creator>
      <pubDate>Tue, 25 Aug 2020 22:59:02 +0000</pubDate>
      <link>https://dev.to/vinibrsl/seeking-for-alternatives-when-working-with-bad-software-46la</link>
      <guid>https://dev.to/vinibrsl/seeking-for-alternatives-when-working-with-bad-software-46la</guid>
      <description>&lt;p&gt;Inevitably, we'll someday come across legacy software, inconsistent databases, or integration modules that simply don't work. It might sound wise to fix this software, especially if they're crucial to the business. The problem that refactoring costs development and validation time, and the business does not always have this time to invest, but at the same time needs the fix. How can we both deliver the business requirements in time and still not break everything?&lt;/p&gt;

&lt;p&gt;In the past weeks, I've been dealing with integration problems that led to an inconsistent database. This database is queried weekly to pay our drivers (I work for a delivery orchestration company). With the discrepant dataset, the output of the report was also inaccurate. I couldn't fix all the integration problems we had to the next weekly payout, so I tried a different approach.&lt;/p&gt;

&lt;p&gt;I had to pause my iterative way of working. That works for most of the cases and still works for my team. But we have to be questioners to our modus operandi and not just go with the flow. Some problems will need a special take. I had to break the loop of:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Finding the bug&lt;/li&gt;
&lt;li&gt;Fixing the bug&lt;/li&gt;
&lt;li&gt;Updating database retroactive data with the fixed bug&lt;/li&gt;
&lt;li&gt;Creating another bug by accident&lt;/li&gt;
&lt;li&gt;Loop&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To gain time, what I did was to create a script that connects to all databases and all external services to generate this report. Instead of fixing the database inconsistency, the script fetched the data it needed to the report from all related services and processes it all in memory. It's not that processing data in memory is a bad practice, it just depends on the problem you have. Question your modus operandi.&lt;/p&gt;

&lt;p&gt;The script, written in Elixir, is querying 3 different databases, performing joins in memory, grouping in memory, and getting missing data from 2 external services via HTTP. All of this running concurrently using Elixir streams with &lt;a href="https://hexdocs.pm/elixir/Task.html#async_stream/3"&gt;&lt;code&gt;Task.async_stream/3&lt;/code&gt;&lt;/a&gt;, outputting a CSV file. I ran it first on my MacBook, but putting it on GKE (Kubernetes) made it even faster, as most of our infrastructure is on Google Cloud Platform.&lt;/p&gt;

&lt;p&gt;The weekly report is solved, but still, we have integration and database inconsistency issues. That's planned to be solved in our iterative workflow, where it should be. Use the right tools, at the right time, in the right process. Change if needed. Loop.&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
  </channel>
</rss>
