Vinicius Brasil

Building cool stuff with Elixir, OTP and Ruby. Musician and majoring in Theology. I'm based in beautiful Curitiba, and yes, that is my real last name.

November 10, 2022

The sacred 80-column rule

Software engineering sacred texts state code should not run over 80 columns. This rule applies today in many contexts, including Git commit messages and modern code linters. This convention comes from long ago, which is why it may seem strange to wrap code at 80 characters when we have widescreen monitors and high pixel density display...
Read more
July 19, 2022

Don't be protective of your code

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. Let's imagine another situation. Your feature gets merged to production. Weeks later you get a message from operations sa...
Read more
July 15, 2022

The fear of merging

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. That starts a cycle with most of your code submissions. You're told by the...
Read more
May 27, 2022

Read raw body from Plug.Conn after parsers

If you ever tried to use Plug.Conn.read_body/2 and it returned nil, you now know that it can only be used once. If you have :json in your Plug.Parsers, you cannot read the raw body again, because it was already used by the parser. That’s a trick Plug does to save memory as request bodies can be of any size. However, if you’re dealing w...
Read more
March 8, 2022

Pragmatic programmers ask why

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 ne...
Read more
January 28, 2022

Sending books to your Kobo wirelessly

Have you lost your e-reader cable? Your laptop doesn't have a USB-A port? Or you're just a tech savvy looking for a nerdy way of transferring files to your Kobo? You will need: • a computer connected to Wi-Fi (you won't need internet access) • any Kobo that has a built-in browser (I think most models have) • Python installed in your co...
Read more
October 27, 2021

Building a knowledge base from your notes

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 ...
Read more
September 17, 2021

Stupid users or stupid design?

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? This applies not only to digital products but to...
Read more
August 26, 2021

Installing libraries inside IEx

You want to test that new Ecto.Changeset function, or that payment processing library without having to install it in your project. You open up Interactive Elixir (IEx) in your terminal, but as there is no mix.exs file to list your dependencies, you can't use external libraries. Good thing is that Elixir has a built-in build tool calle...
Read more
August 25, 2021

Pattern matching maps and structs in Elixir

Pattern matching in Elixir can be useful to not only match values, but destructuring data. This is useful in several cases against maps and structs (also maps 🤪), for example: 1. Getting the struct type iex> %struct{} = URI.parse("google.com") iex> struct URI 2. Matching the struct type dynamically iex> type = URI iex> %^type{} = %URI{...
Read more
August 16, 2021

Activating the native spell-checking on Vim

Developers write not only code but documentation, bug reports, commit messages. As a non-native English speaker, I always find myself using Hemingway App, Grammarly, and other similar tools. They help but it is quite annoying having to switch back and forth from my editor to these tools. The good news is that Vim ships with a spell-che...
Read more
June 8, 2021

The weird backtick-apostrophe `notation'

There is an old and weird convention to represent inline code that is still being used today. Instead of the regular surrounding grave accents `like this`, the weird notation is `like this'. This is an excerpt from the bash man page: For example, a{d,c,b}e expands into `ade ace abe'. Another example from the same man page, with a simil...
Read more
April 15, 2021

The perfect job description

This was written from a candidate's perspective on what the job description that makes me want to apply looks like. The perfect job description is transparent, sincere, and detailed. It is not simply a list of requirements to screen candidates out. It does not have to have a fancy form attached to it when simply the email to send the c...
Read more
April 12, 2021

The right way of running child app tests in an Elixir umbrella

When you mix test your umbrella, you end up running the entire test suite. Even though mix test apps/child_app/test/child_app_test.exs # don't 😢 technically works, it is still running from inside the umbrella app so this command runs for every app inside the umbrella. To run child app tests in an Elixir umbrella, use mix cmd using --ap...
Read more
April 12, 2021

Hiring has gone global

If you're not yet considering hiring 100% remote developers after the Covid-19 pandemic, you're going to have a hard time. It is not that the pandemic is not going to end, but as companies have adapted to this remote model, there are no geographical limits on hiring developers. European companies can and will hire great Elixir develope...
Read more
March 4, 2021

Functional programming asks for a mutable developer

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 obje...
Read more
March 4, 2021

Keep it stupid-simple

We have a natural tendency to over complicate things. That's because our brain cares too much about the future and its infinite possibilities. That is certainly important for us as humans, but that's not 100% true as programmers. When talking about software development, it's really common to see developers and even software architects ...
Read more