<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Alexandre Calaça's Blog]]></title><description><![CDATA[I'm a passionate software engineer with a deep love for turning complex problems into elegant solutions through code.]]></description><link>https://blog.alexandrecalaca.com</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 13:06:48 GMT</lastBuildDate><atom:link href="https://blog.alexandrecalaca.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Introduction to React Props]]></title><description><![CDATA[Components
Introduction
In order to truly understand props in React, we first need to be clear on what components are. A component is a reusable piece of the user interface that encapsulates structure, styling, and behavior.
Instead of repeating the ...]]></description><link>https://blog.alexandrecalaca.com/introduction-to-react-props</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/introduction-to-react-props</guid><category><![CDATA[React]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[alexandrecalaca]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Sat, 04 Oct 2025 02:13:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/UYsBCu9RP3Y/upload/83f9f58e14807face46670cb6853511c.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-components">Components</h2>
<h3 id="heading-introduction">Introduction</h3>
<p>In order to truly understand <code>props</code> in React, we first need to be clear on what components are. A <code>component</code> is a reusable piece of the user interface that encapsulates structure, styling, and behavior.</p>
<p>Instead of repeating the same code across a project, we can build small, independent components and compose them together to form complete pages or applications.</p>
<h3 id="heading-jsx">Jsx</h3>
<p>At its core, a component in React is simply a JavaScript function that returns JSX. JSX is a special syntax extension that looks like HTML but runs in JavaScript. It allows us to describe what the UI (User interface) should look like while keeping the full power of JavaScript inside our markup.</p>
<p>It looks like the following</p>
<pre><code class="lang-plaintext">function Greeting() {
  const styles = {
    color: "blue",
    fontSize: "24px",
    fontFamily: "Arial, sans-serif"
  };

  return (
    &lt;div&gt;
      &lt;h1 style={styles}&gt;Hello, World!&lt;/h1&gt;
      &lt;p className="subtitle"&gt;Welcome to React components with JSX.&lt;/p&gt;
    &lt;/div&gt;
  );
}
</code></pre>
<hr />
<h2 id="heading-props">Props</h2>
<h3 id="heading-introduction-1">Introduction</h3>
<p>In the context of React components, <code>props</code> (short for properties) are the way we pass data from a parent component down to a child component.</p>
<p>Think of them like function parameters:</p>
<ul>
<li><p>A <code>component</code> receives <code>props</code> as an argument.</p>
</li>
<li><p>The <code>props</code> define how the component behaves or what it displays.</p>
</li>
<li><p><code>Props</code> are read-only (immutable inside the child), since the child cannot change them, only use them.</p>
</li>
</ul>
<hr />
<h3 id="heading-code-snippet">Code snippet</h3>
<p>Let’s explore the following code snippet:</p>
<pre><code class="lang-plaintext">function Greeting(props) {
  return &lt;h1&gt;Hello, {props.name}!&lt;/h1&gt;;
}

// Using the component with different props
function App() {
  return (
    &lt;div&gt;
      &lt;Greeting name="Alice" /&gt;
      &lt;Greeting name="Bob" /&gt;
    &lt;/div&gt;
  );
}
</code></pre>
<p>What’s happening up here?</p>
<ul>
<li><p>The <code>App</code> component is the <strong>parent</strong>, since it’s the one that render another component inside its JSX. In our previous example, the App <code>component</code> uses <code>&lt;Greeting /&gt;</code> inside its return statement.</p>
</li>
<li><p>It renders <code>Greeting</code> twice, passing a different <code>name</code> each time.</p>
</li>
<li><p>Inside <code>Greeting</code>, we use <a target="_blank" href="http://props.name"><code>props.name</code></a> to display the correct value.</p>
</li>
<li><p>The result on screen:</p>
<pre><code class="lang-plaintext">  Hello, Alice!
  Hello, Bob!
</code></pre>
<hr />
<h3 id="heading-characteristics">Characteristics</h3>
<h4 id="heading-read-only">Read-Only</h4>
<p>  <code>Props</code> are read-only. It means they cannot be modified by the child. If you try, React will warn you.</p>
</li>
</ul>
<pre><code class="lang-plaintext">function Greeting(props) {
  // ❌ Avoid doing this!
  // props.name = "Changed"; // Error: props are read-only
  return &lt;h1&gt;Hello, {props.name}!&lt;/h1&gt;;
}
</code></pre>
<p>The read-only characteristic enforces the one-way data flow in React: data flows from parent → child, not the other way around.</p>
<p>Props are meant to be used, not changed.</p>
<hr />
<h4 id="heading-any-data-type">Any data type</h4>
<p>Props aren’t limited to strings. You can pass numbers, booleans, objects, arrays, and even functions.</p>
<p>In the following code snippet, <strong>App</strong> renders <code>&lt;Profile user={user}…</code>, React bundles everything inside an object, it does not matter how many objects or functions are inside.</p>
<p>So, inside `Profile`, we can access:</p>
<ul>
<li><p><code>props.user</code> → an <strong>object</strong> (<code>{ name: "Alice", age: 28 }</code>)</p>
</li>
<li><p><code>props.onLogout</code> → a <strong>function</strong></p>
</li>
</ul>
<pre><code class="lang-plaintext">function Profile(props) {
  return (
    &lt;div&gt;
      &lt;h2&gt;{props.user.name}&lt;/h2&gt;
      &lt;p&gt;Age: {props.user.age}&lt;/p&gt;
      &lt;button onClick={props.onLogout}&gt;Logout&lt;/button&gt;
    &lt;/div&gt;
  );
}

function App() {
  const user = { name: "Alice", age: 28 };

  function handleLogout() {
    alert("Logged out!");
  }

  return &lt;Profile user={user} onLogout={handleLogout} /&gt;;
}
</code></pre>
<hr />
<h4 id="heading-default-values">Default values</h4>
<p>If a parent component does not pass a prop, you can define a default.</p>
<pre><code class="lang-plaintext">function Button({ label = "Click Me" }) {
  return &lt;button&gt;{label}&lt;/button&gt;;
}

function App() {
  return (
    &lt;div&gt;
      &lt;Button /&gt; {/* Uses default: "Click Me" */}
      &lt;Button label="Submit" /&gt; {/* Uses passed prop */}
    &lt;/div&gt;
  );
}
</code></pre>
<hr />
<h4 id="heading-spread">Spread</h4>
<p>In React, you don’t always need to pass <code>props</code> one by one. You can use the <code>spread</code> operator, which is <code>…</code>, to pass all the properties of an object as props to a component.</p>
<p>Take a look at the following code snippet without <code>spread</code></p>
<pre><code class="lang-plaintext">function UserCard({ name, age }) {
  return (
    &lt;div&gt;
      &lt;h3&gt;{name}&lt;/h3&gt;
      &lt;p&gt;Age: {age}&lt;/p&gt;
    &lt;/div&gt;
  );
}

function App() {
  const user = { name: "Alice", age: 28 };

  return &lt;UserCard name={user.name} age={user.age} /&gt;;
}
</code></pre>
<p>Now, the following with <code>spread</code>:</p>
<pre><code class="lang-plaintext">function App() {
  const user = { name: "Alice", age: 28 };

  // Spreads `user` into { name: "Alice", age: 28 }
  return &lt;UserCard {...user} /&gt;;
}
</code></pre>
<p>Now, <strong>UserCard</strong> automatically receives <code>props.name</code> and <code>props.age</code> without you having to type them out one by one.</p>
<p>Keep in mind that spreading blindly can make it harder to know which <code>props</code> a component is using. It’s often best for cases like “pass all user data”.</p>
<hr />
<h4 id="heading-children">Children</h4>
<p>Every React component automatically has access to a special prop called <code>children</code>. It represents the content you place between the opening and closing tags of a component.</p>
<pre><code class="lang-plaintext">function Card(props) {
  return &lt;div className="card"&gt;{props.children}&lt;/div&gt;;
}

function App() {
  return (
    &lt;Card&gt;
      &lt;h1&gt;Welcome!&lt;/h1&gt;
      &lt;p&gt;This text is inside the Card component.&lt;/p&gt;
    &lt;/Card&gt;
  );
}
</code></pre>
<p>So, everything between <code>&lt;Card&gt;</code> and <code>&lt;/Card&gt;</code> is passed as props.children.</p>
<hr />
<h4 id="heading-conditional">Conditional</h4>
<p>Since props are just JavaScript values, you can pass conditional expressions.</p>
<pre><code class="lang-plaintext">function Status({ online }) {
  return &lt;p&gt;{online ? "🟢 Online" : "🔴 Offline"}&lt;/p&gt;;
}

function App() {
  return (
    &lt;div&gt;
      &lt;Status online={true} /&gt;
      &lt;Status online={false} /&gt;
    &lt;/div&gt;
  );
}
</code></pre>
<hr />
<h2 id="heading-done">Done</h2>
<hr />
]]></content:encoded></item><item><title><![CDATA[From Github Codespaces to Repository: Step-by-Step Setup]]></title><description><![CDATA[Introduction
Context
By default, Codespace is using the GITHUB_TOKEN env var (the “Codespaces token”), which can’t create repos.
It’s necessary to authenticate gh with a token/account that has the right scopes, or create the repo on the web first.
Ob...]]></description><link>https://blog.alexandrecalaca.com/from-github-codespaces-to-repository-step-by-step-setup</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/from-github-codespaces-to-repository-step-by-step-setup</guid><category><![CDATA[GitHub]]></category><category><![CDATA[alexandrecalaca]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Sun, 28 Sep 2025 04:47:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/HLQDfaJUTVI/upload/4e35957731362ea8f7545c611581a9a0.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<h3 id="heading-context">Context</h3>
<p>By default, Codespace is using the <code>GITHUB_TOKEN</code> env var (the “Codespaces token”), which <strong>can’t create repos</strong>.</p>
<p>It’s necessary to authenticate <code>gh</code> with a token/account that has the right scopes, or create the repo on the web first.</p>
<h3 id="heading-objective">Objective</h3>
<p>In this article, let’s focus on authenticating, setting the right scopes and creating the repo.</p>
<hr />
<h2 id="heading-solution">Solution</h2>
<h3 id="heading-initiate-the-project">Initiate the project</h3>
<p>In short: we’ll check status → create repo → stage everything → commit it.</p>
<pre><code class="lang-plaintext">git status || git init
git add .
git commit -m "init"
</code></pre>
<p>git status → shows the current state of the repository (which files are changed, staged, or untracked).</p>
<p>git init → initializes a new Git repository in the current folder.</p>
<p>git add . → stages all changes (new, modified, deleted files) in the current folder for the next commit.</p>
<p>git commit -m "init" → creates a commit with the message "init".  </p>
<hr />
<h3 id="heading-check-the-environment">Check the environment</h3>
<p>In short: we’ll log out of the GitHub CLI, then clear the token stored in our environment.</p>
<pre><code class="lang-plaintext">gh auth logout -h github.com
unset GITHUB_TOKEN
</code></pre>
<ul>
<li><p><code>gh auth logout -h</code> <a target="_blank" href="http://github.com"><code>github.com</code></a> → logs you out from GitHub CLI (<code>gh</code>) specifically for the host <a target="_blank" href="http://github.com"><code>github.com</code></a>.</p>
</li>
<li><p><code>unset GITHUB_TOKEN</code> → removes the <code>GITHUB_TOKEN</code> environment variable from your current shell session.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759032974457/2bb5c737-bcbe-4590-b32e-afe099af6933.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-login">Login</h3>
<p>In short: you log in via browser, then check if the login worked.</p>
<pre><code class="lang-plaintext">gh auth login -h github.com -p https -w
gh auth status
</code></pre>
<ul>
<li><p><code>gh auth login -h</code> <a target="_blank" href="http://github.com"><code>github.com</code></a> <code>-p https -w</code> → logs you in to GitHub CLI (<code>gh</code>) for the host <a target="_blank" href="http://github.com"><code>github.com</code></a>, using HTTPS as the protocol (<code>-p https</code>), and opens a web browser (<code>-w</code>) to complete the authentication.</p>
</li>
<li><p><code>gh auth status</code> → shows your current GitHub CLI authentication status (which account you’re logged in with, token details, active host, etc.).</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759032974457/2bb5c737-bcbe-4590-b32e-afe099af6933.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759033155166/43ab4a71-003c-44ea-8e4c-ac5b667a0fac.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-double-check-login">Double check login</h3>
<pre><code class="lang-plaintext">
gh auth status
gh api user
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759034659039/4c31e951-f521-4e5f-9170-a7c9b5449dcf.png" alt class="image--center mx-auto" /></p>
<hr />
<hr />
<h3 id="heading-create-and-push">Create and push</h3>
<p>In short: this creates a new private repo on GitHub and immediately pushes your local project there.</p>
<pre><code class="lang-plaintext">gh repo create alexcalaca/profile-card --private --source . -
-remote origin --push
</code></pre>
<p>Output</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759033345675/5e7d6a90-7fe1-40e4-91d8-45bc91cd3977.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-done">Done</h2>
<hr />
]]></content:encoded></item><item><title><![CDATA[How to create a Git commit without a message?]]></title><description><![CDATA[Solution
Here it is:
git commit --allow-empty-message -m ""

Explanation
To create a Git commit without a message, or with an empty message, you can use the --allow-empty-message flag with the git commit command.
git commit --allow-empty-message -m "...]]></description><link>https://blog.alexandrecalaca.com/how-to-create-a-git-commit-without-a-message</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/how-to-create-a-git-commit-without-a-message</guid><category><![CDATA[GitHub]]></category><category><![CDATA[Git]]></category><category><![CDATA[alexandrecalaca]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Thu, 25 Sep 2025 03:17:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/KPAQpJYzH0Y/upload/cacf4b3b9e2597230868eb5f3db92ea9.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-solution">Solution</h3>
<p>Here it is:</p>
<pre><code class="lang-plaintext">git commit --allow-empty-message -m ""
</code></pre>
<h3 id="heading-explanation">Explanation</h3>
<p>To create a Git commit without a message, or with an empty message, you can use the <code>--allow-empty-message</code> flag with the <code>git commit</code> command.</p>
<pre><code class="lang-plaintext">git commit --allow-empty-message -m ""
</code></pre>
<p>Breaking it down:</p>
<ul>
<li><p><code>git commit</code>: This is the standard command for creating a new commit.</p>
</li>
<li><p><code>--allow-empty-message</code>: This flag explicitly tells Git to allow a commit with an empty message.</p>
</li>
<li><p><code>-m ""</code>: This specifies an empty commit message. You must still include the <code>-m</code> flag, even if the message content is an empty string.</p>
</li>
</ul>
<hr />
<h3 id="heading-done">Done</h3>
<hr />
]]></content:encoded></item><item><title><![CDATA[Step-by-Step Guide to Forcefully Remove and Recreate Docker Containers]]></title><description><![CDATA[Steps
Cleanup phase
This phase’s goal is to removes existing containers, volumes, networks and images
Stop and remove volumes
docker compose down --volumes --remove-orphans
The previous command stops and removes containers, networks, and default volu...]]></description><link>https://blog.alexandrecalaca.com/step-by-step-guide-to-forcefully-remove-and-recreate-docker-containers</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/step-by-step-guide-to-forcefully-remove-and-recreate-docker-containers</guid><category><![CDATA[Docker]]></category><category><![CDATA[alexandrecalaca]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Fri, 12 Sep 2025 18:22:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/kvxqWoJlMvs/upload/47bbfa7267e90f9cbc4d95e4879ae93a.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-steps">Steps</h1>
<h2 id="heading-cleanup-phase">Cleanup phase</h2>
<p>This phase’s goal is to removes existing containers, volumes, networks and images</p>
<h3 id="heading-stop-and-remove-volumes">Stop and remove volumes</h3>
<p><code>docker compose down --volumes --remove-orphans</code></p>
<p>The previous command stops and removes containers, networks, and default volumes created by <code>docker compose up</code>.</p>
<ul>
<li><p><code>--volumes</code>: also deletes named and anonymous volumes attached to the containers.</p>
</li>
<li><p><code>--remove-orphans</code>: removes any containers from earlier Compose runs that are not in the current <code>docker-compose.yml</code>.</p>
</li>
</ul>
<hr />
<h3 id="heading-remove-any-stopped-containers">Remove any stopped containers</h3>
<p><code>docker compose rm -fsv</code></p>
<p>The previous command explicitly removes any stopped containers from this project. This ensures no containers are left behind</p>
<ul>
<li><p><code>-f</code>: force removal (no confirmation prompt).</p>
</li>
<li><p><code>-s</code>: stop the container if it’s running.</p>
</li>
<li><p><code>-v</code>: remove any anonymous volumes attached to these containers.</p>
</li>
</ul>
<hr />
<h3 id="heading-delete-unused-volumes">Delete unused volumes</h3>
<p>The following command deletes <strong>all unused volumes</strong> across the whole Docker host (not just our project), so, use it cautiously.</p>
<pre><code class="lang-plaintext">docker volume prune -f
</code></pre>
<p><code>-f</code>: skips the confirmation prompt.  </p>
<p>Remember. Be careful: this can delete volumes from other projects if they’re not in use.</p>
<hr />
<h3 id="heading-delete-unused-networks">Delete unused networks</h3>
<p>The following command delete all unused networks across the Docker host.</p>
<pre><code class="lang-plaintext">docker network prune -f
</code></pre>
<p><code>-f</code>: skips confirmation.</p>
<p>Again, safe unless you have manually created custom networks you still need.</p>
<hr />
<h3 id="heading-delete-dangling-images">Delete dangling images</h3>
<p>The following command deletes dangling images, which are images without a tag or not referenced by any container).</p>
<pre><code class="lang-plaintext">docker image prune -f
</code></pre>
<p><code>-f</code>: skips confirmation.  </p>
<p>Only cleans dangling images, not all unused images. For a deeper clean, you’d need <code>docker image prune -af</code>.</p>
<hr />
<h2 id="heading-rebuild-phase">Rebuild phase</h2>
<p>This phase forces a clean rebuild and restart.</p>
<h3 id="heading-rebuild-images">Rebuild images</h3>
<p>The following command rebuilds all images defined in your Compose file.</p>
<pre><code class="lang-plaintext"> docker compose build --no-cache
</code></pre>
<ul>
<li><code>--no-cache</code>: ignores Docker’s layer cache, forcing every instruction in the Dockerfile(s) to run again. It guarantees you’re building fresh images without reusing cached layers.</li>
</ul>
<hr />
<h3 id="heading-start-the-containers">Start the containers</h3>
<p>The following command starts the containers in detached mode (<code>-d</code> = runs in the background). `-d` is optional.</p>
<pre><code class="lang-plaintext">docker compose up -d
</code></pre>
<p>Now, it’ll use the freshly rebuilt images. It’ll recreate networks and attaches containers as defined in the Compose file.</p>
<hr />
<h2 id="heading-done">Done</h2>
<hr />
]]></content:encoded></item><item><title><![CDATA[A Complete Guide to Uninstalling Docker completely on Pop!_OS and Ubuntu-based Systems]]></title><description><![CDATA[Steps
Stop the service
It’s not mandatory, but before uninstalling, it's a good practice to stop any running Docker services.
sudo systemctl stop docker


Remove docker packages
It’s used to completely and forcefully remove a list of specified packag...]]></description><link>https://blog.alexandrecalaca.com/a-complete-guide-to-uninstalling-docker-completely-on-popos-and-ubuntu-based-systems</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/a-complete-guide-to-uninstalling-docker-completely-on-popos-and-ubuntu-based-systems</guid><category><![CDATA[Docker]]></category><category><![CDATA[Ubuntu]]></category><category><![CDATA[Linux]]></category><category><![CDATA[alexandrecalaca]]></category><category><![CDATA[PopOS]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Fri, 12 Sep 2025 17:47:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/06y6wukkSKg/upload/10f64b1222531d9f0c2d6dadff5ca974.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-steps">Steps</h2>
<h3 id="heading-stop-the-service">Stop the service</h3>
<p>It’s not mandatory, but before uninstalling, it's a good practice to stop any running Docker services.</p>
<pre><code class="lang-plaintext">sudo systemctl stop docker
</code></pre>
<hr />
<h3 id="heading-remove-docker-packages">Remove docker packages</h3>
<p>It’s used to <strong>completely and forcefully remove</strong> a list of specified packages from a Debian-based Linux system like Pop!_OS. All the following packages are docker related.</p>
<p>In short, this command aims to leave no trace of the specified Docker packages, which is an essential step for a complete and thorough uninstallation.</p>
<pre><code class="lang-plaintext">sudo apt-get purge -y docker-engine docker docker.io docker-ce docker-ce-cli containerd runc
</code></pre>
<p>and also</p>
<pre><code class="lang-plaintext">sudo apt-get purge -y docker-compose-plugin
</code></pre>
<hr />
<h3 id="heading-clean-up-leftover-files">Clean up leftover files</h3>
<p>In summary, the command is a non-interactive, forced, and recursive deletion of all major Docker-related data and configuration directories. This is an essential step for a complete uninstallation.</p>
<pre><code class="lang-plaintext">sudo rm -rf /var/lib/docker/ /var/lib/containerd/ /etc/docker ~/.docker/
</code></pre>
<hr />
<h3 id="heading-remove-docker-group">Remove docker group</h3>
<p>When you install Docker, it creates a <code>docker</code> group. This group is created for security and convenience, allowing users to run Docker commands without needing <code>sudo</code> every time.</p>
<p>In this case, since we don’t need it anymore, we’re going to delete the <code>docker</code> group.</p>
<pre><code class="lang-plaintext"> sudo groupdel docker
</code></pre>
<hr />
<h3 id="heading-remove-docker-repository-entry">Remove docker repository entry</h3>
<p>By deleting this file, you are essentially telling your system to stop looking for Docker updates from the official Docker repository. This is an important step in a complete uninstallation, as it ensures that apt-get update no longer tries to connect to a repository for a program that you no longer want on your system.</p>
<pre><code class="lang-plaintext">sudo rm /etc/apt/sources.list.d/docker.list
</code></pre>
<hr />
<h3 id="heading-remove-dependencies">Remove dependencies</h3>
<p><strong>In summary, the goal is to remove old, useless downloaded package files</strong> to free up disk space, but it does not remove any installed software.</p>
<p>It is a maintenance command that is good to run periodically after uninstalling software or upgrading your system.</p>
<pre><code class="lang-plaintext">sudo apt-get autoremove -y --purge docker-ce docker-ce-cli
sudo apt-get autoclean
</code></pre>
<hr />
<h3 id="heading-verify-the-installation">Verify the installation</h3>
<pre><code class="lang-plaintext">docker --version
docker compose --version
docker
</code></pre>
<p>Output</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757690473776/66a9c5f4-1d96-4f3d-9701-d1006e480bb8.png" alt class="image--center mx-auto" /></p>
<hr />
]]></content:encoded></item><item><title><![CDATA[Introduction to functions in Javascript]]></title><description><![CDATA[Functions are one of the most important concepts in JavaScript. They allow us to organize code, avoid repetition, and make programs easier to maintain.

Introduction
What’s a Function?
A function is a block of code designed to perform a specific task...]]></description><link>https://blog.alexandrecalaca.com/introduction-to-functions-in-javascript</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/introduction-to-functions-in-javascript</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[alexandrecalaca]]></category><category><![CDATA[Programming Blogs]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Wed, 03 Sep 2025 01:30:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/mM9vVJ2oDeI/upload/0e985c343f60ea057d255a90943c6eaf.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>Functions are one of the most important concepts in JavaScript. They allow us to organize code, avoid repetition, and make programs easier to maintain.</p>
</blockquote>
<h2 id="heading-introduction">Introduction</h2>
<h3 id="heading-whats-a-function">What’s a Function?</h3>
<p>A function is a block of code designed to perform a specific task. Instead of writing the same instructions multiple times, you can group them into a function and call it whenever you need.</p>
<p>Let’s break it down in a very simple way: a function is a piece of code that you’d like to use many times. Instead of writing that piece of code over and over again, you create a function. Then, whenever you need it, you simply call or invoke the function.</p>
<p><strong>Key terms:</strong></p>
<ul>
<li><p><strong>Function</strong> → A block of code.</p>
</li>
<li><p><strong>Invoke/Call</strong> → Run the function.</p>
</li>
</ul>
<p><strong>Example:</strong></p>
<pre><code class="lang-plaintext">function sayHello() {
  console.log("Hello, world!");
}

sayHello(); // Function call
</code></pre>
<hr />
<h2 id="heading-2-parameters-and-arguments">🔹 2. Parameters and Arguments</h2>
<p>Functions can receive input values.</p>
<ul>
<li><p><strong>Parameters</strong> → Placeholders in the function definition.</p>
</li>
<li><p><strong>Arguments</strong> → Real values passed when calling the function.</p>
</li>
</ul>
<p><strong>Example:</strong></p>
<pre><code class="lang-plaintext">function greet(name) { // "name" is the parameter
  console.log("Hello, " + name + "!");
}

greet("Alice");   // "Alice" is the argument
greet("Bob");     // "Bob" is the argument
</code></pre>
<hr />
<h2 id="heading-3-return-values">🔹 3. Return Values</h2>
<p>Functions can produce and return results using the keyword <code>return</code>.</p>
<ul>
<li><p>Without <code>return</code>, functions only perform actions.</p>
</li>
<li><p>With <code>return</code>, they can give back a value to be reused.</p>
</li>
</ul>
<p><strong>Example:</strong></p>
<pre><code class="lang-plaintext">function add(a, b) {
  return a + b;
}

let result = add(5, 3);
console.log(result); // 8
</code></pre>
<hr />
<h2 id="heading-4-reusability-avoiding-repetition">🔹 4. Reusability (Avoiding Repetition)</h2>
<p>One of the main reasons for using functions is to avoid repeating code.</p>
<p><strong>Without a function:</strong></p>
<pre><code class="lang-plaintext">console.log("Hello, Alice!");
console.log("Hello, Bob!");
console.log("Hello, Charlie!");
</code></pre>
<p><strong>With a function:</strong></p>
<pre><code class="lang-plaintext">function greet(name) {
  console.log("Hello, " + name + "!");
}

greet("Alice");
greet("Bob");
greet("Charlie");
</code></pre>
<p>✔️ Easier to maintain, more organized.</p>
<hr />
<h2 id="heading-5-function-expressions">🔹 5. Function Expressions</h2>
<p>Functions can also be stored inside variables. This is called a <strong>function expression</strong>.</p>
<p><strong>Example:</strong></p>
<pre><code class="lang-plaintext">const multiply = function(x, y) {
  return x * y;
};

console.log(multiply(2, 4)); // 8
</code></pre>
<hr />
<h2 id="heading-6-arrow-functions">🔹 6. Arrow Functions</h2>
<p>JavaScript provides a shorter syntax for functions, called <strong>arrow functions</strong>.</p>
<ul>
<li>Often used for simple one-line functions.</li>
</ul>
<p><strong>Example:</strong></p>
<pre><code class="lang-plaintext">const square = (n) =&gt; n * n;

console.log(square(6)); // 36
</code></pre>
<hr />
<h2 id="heading-7-functions-in-real-use">🔹 7. Functions in Real Use</h2>
<p>Functions are everywhere in JavaScript, for example, when working with arrays or handling events.</p>
<p><strong>Example with arrays:</strong></p>
<pre><code class="lang-plaintext">let numbers = [1, 2, 3, 4];
let doubled = numbers.map(num =&gt; num * 2);

console.log(doubled); // [2, 4, 6, 8]
</code></pre>
<p><strong>Example with events:</strong></p>
<pre><code class="lang-plaintext">document.querySelector("button").onclick = function() {
  alert("Button clicked!");
};
</code></pre>
<hr />
<h3 id="heading-recap-of-key-terms">Recap of Key Terms</h3>
<ul>
<li><p><strong>Function</strong> → Block of code.</p>
</li>
<li><p><strong>Call/Invoke</strong> → Run the function.</p>
</li>
<li><p><strong>Parameters</strong> → Inputs defined in the function.</p>
</li>
<li><p><strong>Arguments</strong> → Real values passed when calling.</p>
</li>
<li><p><strong>Return</strong> → Sends a value back.</p>
</li>
<li><p><strong>Function Expression</strong> → Function stored in a variable.</p>
</li>
<li><p><strong>Arrow Function</strong> → Short syntax for writing functions.</p>
</li>
</ul>
<hr />
<h2 id="heading-practice">Practice</h2>
<p>Practice your knowledge with the following exercises:</p>
<ul>
<li><p>Function that prints your name.</p>
</li>
<li><p>Function that doubles a number.</p>
</li>
<li><p>Function that squares a number.</p>
</li>
<li><p>Arrow function that checks if a number is even.</p>
</li>
<li><p>Mini-project: Calculate rectangle area.</p>
</li>
</ul>
<hr />
]]></content:encoded></item><item><title><![CDATA[How to install Flameshot app on Pop!_OS?]]></title><description><![CDATA[Introduction
Flameshot


Flameshop is a powerful yet simple to use screenshot software.

Features

Customizable appearance;

Easy to use.

In-app screenshot editing.

DBus interface.


More features

Pre-installation
Check your OS (optional)
This ste...]]></description><link>https://blog.alexandrecalaca.com/how-to-install-flameshot-app-on-popos</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/how-to-install-flameshot-app-on-popos</guid><category><![CDATA[alexandrecalaca]]></category><category><![CDATA[Ubuntu]]></category><category><![CDATA[PopOS]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Fri, 01 Aug 2025 01:45:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1754012681992/3679f474-b513-4372-88f5-ab7ad64d5ec2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<h3 id="heading-flameshot">Flameshot</h3>
<p><img src="https://raw.githubusercontent.com/flameshot-org/flameshot/master/data/img/preview/animatedUsage.gif" alt="https://raw.githubusercontent.com/flameshot-org/flameshot/master/data/img/preview/animatedUsage.gif" /></p>
<blockquote>
<p>Flameshop is a powerful yet simple to use screenshot software.</p>
</blockquote>
<p>Features</p>
<ul>
<li><p>Customizable appearance;</p>
</li>
<li><p>Easy to use.</p>
</li>
<li><p>In-app screenshot editing.</p>
</li>
<li><p>DBus interface.</p>
</li>
</ul>
<p><a target="_blank" href="https://github.com/flameshot-org/flameshot#features">More features</a></p>
<hr />
<h2 id="heading-pre-installation">Pre-installation</h2>
<h4 id="heading-check-your-os-optional"><strong>Check your OS (optional)</strong></h4>
<p>This step is just to make sure you have <code>Pop!_OS</code> installed.</p>
<pre><code class="lang-plaintext">uname -a
hostnamectl
lsb_release -a
cat /etc/os-release
</code></pre>
<p>Output</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1701960709361/81a5f20c-2703-45ff-83d3-440318836a26.png?auto=compress,format&amp;format=webp&amp;auto=compress,format&amp;format=webp&amp;auto=compress,format&amp;format=webp&amp;auto=compress,format&amp;format=webp&amp;auto=compress,format&amp;format=webp&amp;auto=compress,format&amp;format=webp" alt /></p>
<hr />
<h3 id="heading-update-packages-info">Update packages info</h3>
<pre><code class="lang-plaintext">sudo apt-get update
</code></pre>
<p>Running <code>sudo apt-get update</code> is an important step before installing or upgrading packages on your system because it ensures that you have the most up-to-date information about available packages.</p>
<p>Without updating the package index, you might not see the latest versions of software or be able to install new packages that have been added to the repositories since the last update.</p>
<hr />
<h2 id="heading-solution">Solution</h2>
<h3 id="heading-installation">Installation</h3>
<pre><code class="lang-plaintext">sudo apt-get install flameshot -y
</code></pre>
<p>You should be able to see something like the following  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1685373846030/03f2b3a6-d9d4-4f44-a4ae-17ab02b3f0a6.png?auto=compress,format&amp;format=webp" alt /></p>
<hr />
<h2 id="heading-double-check">Double check</h2>
<p>Let’s check if the installation was successful.</p>
<h3 id="heading-path-installation">Path installation</h3>
<pre><code class="lang-plaintext">which flameshot
</code></pre>
<h3 id="heading-package-installation">Package installation</h3>
<pre><code class="lang-plaintext">dpkg -l  grep flameshot
</code></pre>
<h3 id="heading-binary">Binary</h3>
<pre><code class="lang-plaintext"> which flameshot
</code></pre>
<h3 id="heading-softwares-help">Software’s help</h3>
<pre><code class="lang-plaintext">flameshot --help
</code></pre>
<hr />
<h2 id="heading-run">Run</h2>
<p>In the terminal</p>
<pre><code class="lang-plaintext">flameshot
</code></pre>
<p>In your tray icon area, on your right side, You should be able to see something like this:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754012569584/fd4dd312-ebe1-4248-8bf9-b28819f6e909.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-done">Done</h2>
<hr />
]]></content:encoded></item><item><title><![CDATA[Step-by-Step Guide: Installing Amazon WorkSpaces on Pop!_OS]]></title><description><![CDATA[Solution
Check your OS (optional)
This step is just to make sure you have Pop!_OS installed.
uname -a
hostnamectl
lsb_release -a
cat /etc/os-release

Output


Update packages info
sudo apt-get update

Running sudo apt-get update is an important step ...]]></description><link>https://blog.alexandrecalaca.com/step-by-step-guide-installing-amazon-workspaces-on-popos</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/step-by-step-guide-installing-amazon-workspaces-on-popos</guid><category><![CDATA[AWS]]></category><category><![CDATA[PopOS]]></category><category><![CDATA[Ubuntu]]></category><category><![CDATA[Linux]]></category><category><![CDATA[alexandrecalaca]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Thu, 17 Jul 2025 16:38:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/FtiXADBTqGY/upload/fc0c9a1e5fc4a6ac5882ba6a3fed96d2.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-solution">Solution</h2>
<h4 id="heading-check-your-os-optional"><strong>Check your OS (optional)</strong></h4>
<p>This step is just to make sure you have <code>Pop!_OS</code> installed.</p>
<pre><code class="lang-plaintext">uname -a
hostnamectl
lsb_release -a
cat /etc/os-release
</code></pre>
<p>Output</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1701960709361/81a5f20c-2703-45ff-83d3-440318836a26.png?auto=compress,format&amp;format=webp&amp;auto=compress,format&amp;format=webp&amp;auto=compress,format&amp;format=webp&amp;auto=compress,format&amp;format=webp&amp;auto=compress,format&amp;format=webp" alt /></p>
<hr />
<h3 id="heading-update-packages-info"><strong>Update packages info</strong></h3>
<pre><code class="lang-plaintext">sudo apt-get update
</code></pre>
<p>Running <code>sudo apt-get update</code> is an important step before installing or upgrading packages on your system because it ensures that you have the most up-to-date information about available packages.</p>
<p>Without updating the package index, you might not see the latest versions of software or be able to install new packages that have been added to the repositories since the last update.</p>
<hr />
<h3 id="heading-download-the-deb-file">Download the .deb file</h3>
<p>Go to the <a target="_blank" href="https://clients.amazonworkspaces.com/linux-install.html">downloads page</a> and and choose the installer <code>PCoIP &amp; DCV</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752769421317/d55b853d-0d30-4ff7-a3a6-511d4164772c.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-install-it">Install it</h3>
<pre><code class="lang-plaintext">sudo apt-get install ./Downloads/new_workspacesclient_focal_amd64.deb
</code></pre>
<p>Just make sure to locate the file.</p>
<hr />
<h2 id="heading-double-check">Double check</h2>
<h3 id="heading-path-installation">Path installation</h3>
<pre><code class="lang-plaintext">which workspacesclient
</code></pre>
<hr />
<h3 id="heading-package-installation">Package installation</h3>
<pre><code class="lang-plaintext">dpkg -l | grep workspacesclient
</code></pre>
<hr />
<h3 id="heading-binary">Binary</h3>
<pre><code class="lang-plaintext">which workspacesclient
</code></pre>
<hr />
<h3 id="heading-output">Output</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752770079218/49b9edde-3627-4441-a639-2de4cf5b7c3b.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-run">Run</h2>
<h3 id="heading-menu">Menu</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752770126208/f7ad5d80-ce3a-431c-a6f7-60099262bd5c.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-terminal">Terminal</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752770178229/9f9ece06-dfbd-44ab-ae52-4281bca37321.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-done">Done</h2>
<hr />
]]></content:encoded></item><item><title><![CDATA[FactoryBot: Factory not registered (KeyError)]]></title><description><![CDATA[Error
Factory not registered: "your_factory_name" (KeyError)
lib/active_support/hash_with_indifferent_access.rb:192:in `fetch': key not found: "your_factory_name" (KeyError)



Context
This error typically happens in the Rails console when you're usi...]]></description><link>https://blog.alexandrecalaca.com/factorybot-factory-not-registered-keyerror</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/factorybot-factory-not-registered-keyerror</guid><category><![CDATA[Ruby]]></category><category><![CDATA[Ruby on Rails]]></category><category><![CDATA[alexandrecalaca]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Mon, 31 Mar 2025 18:44:49 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1743446642377/6cf08060-1277-4851-9772-09c1220e68bc.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-error">Error</h2>
<pre><code class="lang-ruby">Factory <span class="hljs-keyword">not</span> <span class="hljs-symbol">registered:</span> <span class="hljs-string">"your_factory_name"</span> (KeyError)
lib/active_support/hash_with_indifferent_access.<span class="hljs-symbol">rb:</span><span class="hljs-number">192</span><span class="hljs-symbol">:in</span> <span class="hljs-string">`fetch': key not found: "your_factory_name" (KeyError)</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1743444850344/efe8161a-66fa-4276-be48-cccaccb2618a.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-context">Context</h3>
<p>This error typically happens in the Rails console when you're using <code>FactoryBot</code> and try to build or create a factory that hasn't been defined, loaded or registered.</p>
<hr />
<h2 id="heading-solution">Solution</h2>
<h3 id="heading-require-dependencies">Require dependencies</h3>
<p>Check if dependencies/libraries are already loaded</p>
<pre><code class="lang-ruby"><span class="hljs-keyword">defined</span>?(FactoryBot)
<span class="hljs-keyword">defined</span>?(Faker)
</code></pre>
<p>If you get `nil`, you should require them.</p>
<pre><code class="lang-ruby">irb(main)<span class="hljs-symbol">:</span><span class="hljs-number">001</span>&gt; <span class="hljs-keyword">defined</span>?(FactoryBot)

=&gt; nil
irb(main)<span class="hljs-symbol">:</span><span class="hljs-number">003</span>&gt; <span class="hljs-keyword">defined</span>?(Faker)
=&gt; nil
irb(main)<span class="hljs-symbol">:</span><span class="hljs-number">004</span>&gt; <span class="hljs-keyword">require</span> <span class="hljs-string">'factory_bot'</span>
=&gt; true
irb(main)<span class="hljs-symbol">:</span><span class="hljs-number">005</span>&gt; <span class="hljs-keyword">require</span> <span class="hljs-string">'faker'</span>
=&gt; true
irb(main)<span class="hljs-symbol">:</span><span class="hljs-number">006</span>&gt; <span class="hljs-keyword">defined</span>?(Faker)
=&gt; <span class="hljs-string">"constant"</span>
irb(main)<span class="hljs-symbol">:</span><span class="hljs-number">007</span>&gt; <span class="hljs-keyword">require</span> <span class="hljs-string">'factory_bot'</span>
=&gt; false
irb(main)<span class="hljs-symbol">:</span><span class="hljs-number">00</span>8&gt;
</code></pre>
<p>Output</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1743445315507/e9f2bdd1-93f4-4af0-bf43-8c9342d816fe.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-check-the-factories">Check the factories</h3>
<p>Let’s check if the factories really exist</p>
<pre><code class="lang-ruby">FactoryBot.factories.map(&amp;<span class="hljs-symbol">:name</span>)
FactoryBot.find_definitions
FactoryBot.factories.map(&amp;<span class="hljs-symbol">:name</span>).<span class="hljs-keyword">include</span>?(<span class="hljs-symbol">:your_factory_name</span>)
</code></pre>
<p>OUtput</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1743445549604/2df349cb-2d4d-493b-a79f-9f4350e334f2.png" alt class="image--center mx-auto" /></p>
<ul>
<li><a target="_blank" href="http://FactoryBot.factories.map"><code>FactoryBot.factories.map</code></a><code>(&amp;:name)</code></li>
</ul>
<p>This command lists all registered factory names in <code>FactoryBot</code> as symbols (e.g., :user, :order). It’s useful for checking which factories are currently available, especially when debugging missing factory errors.</p>
<p>if you get an empty array, it’s because nothing is loaded or there are no factories.  </p>
<ul>
<li><code>FactoryBot.find_definitions</code></li>
</ul>
<p>This tells <code>FactoryBot</code> to <strong>load all factory definitions</strong> from the default <code>spec/factories</code> (or <code>test/factories</code>) directory.<br />It's essential in environments like the <strong>Rails console</strong>, where factories aren’t auto-loaded like they are in test runs.</p>
<p>The output should be something like</p>
<pre><code class="lang-ruby">[<span class="hljs-string">"/srv/www/current/factories"</span>,
 <span class="hljs-string">"/srv/www/current/test/factories"</span>,
 <span class="hljs-string">"/srv/www/current/spec/factories"</span>]
</code></pre>
<ul>
<li><h3 id="heading-factorybotfactoriesmaphttpfactorybotfactoriesmapampnameincludeyourfactoryname"><a target="_blank" href="http://FactoryBot.factories.map"><code>FactoryBot.factories.map</code></a><code>(&amp;:name).include?(:your_factory_name)</code></h3>
</li>
</ul>
<p>This checks if a specific factory (like <code>:your_factory_name</code>) is <strong>already registered and available</strong> in <code>FactoryBot</code>.</p>
<p>It’s a quick way to <strong>verify the presence</strong> of a factory before trying to build or create it, avoiding <code>KeyError</code> exceptions.</p>
<p>If you get <code>true</code>, then, you should celebrate because your factory is loaded and registered.</p>
<hr />
<h3 id="heading-test-again">Test again</h3>
<pre><code class="lang-ruby">irb(main)<span class="hljs-symbol">:</span><span class="hljs-number">01</span>9&gt; FactoryBot.method(<span class="hljs-symbol">:build</span>)
=&gt; #&lt;Method: #&lt;Class:FactoryBot&gt;(FactoryBot::Syntax::Methods)<span class="hljs-comment">#build(name, *traits_and_overrides, &amp;block) /srv/www/current/vendor/bundle/ruby/3.3.0/gems/factory_bot-6.2.1/lib/factory_bot/strategy_syntax_method_registrar.rb:27&gt;</span>
irb(main)<span class="hljs-symbol">:</span><span class="hljs-number">020</span>&gt; FactoryBot.method(<span class="hljs-symbol">:create</span>)
=&gt; #&lt;Method: #&lt;Class:FactoryBot&gt;(FactoryBot::Syntax::Methods)<span class="hljs-comment">#create(name, *traits_and_overrides, &amp;block) /srv/www/current/vendor/bundle/ruby/3.3.0/gems/factory_bot-6.2.1/lib/factory_bot/strategy_syntax_method_registrar.rb:27&gt;</span>
irb(main)<span class="hljs-symbol">:</span><span class="hljs-number">021</span>&gt;
</code></pre>
<p>Output</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1743446199360/4c1f3f2a-6a04-4c08-a8c9-518ecce90b74.png" alt class="image--center mx-auto" /></p>
<p>Both <strong>method object</strong> for a given method if it's defined in the current scope:</p>
<ul>
<li><p>Useful to inspect or call the method later</p>
</li>
<li><p>Raises a <code>NameError</code> if the method is undefined.</p>
</li>
</ul>
<hr />
<h2 id="heading-done">Done</h2>
<p><img src="https://media3.giphy.com/media/1nDP1Mv2eIATu/200.gif?cid=6c09b952ppn5v297zr9wxhumzrrehqtfxa6t267xk5715j3p&amp;ep=v1_internal_gif_by_id&amp;rid=200.gif&amp;ct=g" alt="The It Crowd Coffee GIF - Find &amp; Share on GIPHY" /></p>
<hr />
<h3 id="heading-conclusion">Conclusion</h3>
<p>When facing the error <code>Factory not registered: "your_factory_name"</code>, it’s usually because the factory hasn’t been <strong>loaded</strong>, <strong>defined</strong>, or <strong>registered</strong> properly — especially in the Rails console, where automatic loading doesn't happen like it does during tests.</p>
<p>By systematically checking if FactoryBot and related dependencies are loaded (<code>defined?</code>), ensuring your factories are found (<code>FactoryBot.find_definitions</code>), and confirming your specific factory is present (<a target="_blank" href="http://FactoryBot.factories.map"><code>FactoryBot.factories.map</code></a><code>(&amp;:name).include?(:your_factory_name)</code>), you can quickly isolate and resolve the issue.</p>
<p>Finally, verifying method availability using <code>FactoryBot.method(:build)</code> or <code>method(:create)</code> gives you full confidence that FactoryBot is ready to use.</p>
<hr />
]]></content:encoded></item><item><title><![CDATA[Checking if a specific column has an index in a Ruby on Rails application]]></title><description><![CDATA[Context
In a Ruby on Rails application, ensuring optimal database performance is crucial for delivering a responsive and efficient user experience.
Checking if a specific column has an index is a fundamental step in achieving this optimization.

Inde...]]></description><link>https://blog.alexandrecalaca.com/checking-if-a-specific-column-has-an-index-in-a-ruby-on-rails-application</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/checking-if-a-specific-column-has-an-index-in-a-ruby-on-rails-application</guid><category><![CDATA[alexandrecalaca]]></category><category><![CDATA[Ruby]]></category><category><![CDATA[Ruby on Rails]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Tue, 04 Jun 2024 02:52:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/k64lqvVxpew/upload/07dbbc2d3a0d21b838b4a62254c76a36.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<h2 id="heading-context">Context</h2>
<p>In a Ruby on Rails application, ensuring optimal database performance is crucial for delivering a responsive and efficient user experience.</p>
<p>Checking if a specific column has an index is a fundamental step in achieving this optimization.</p>
<hr />
<h2 id="heading-indexes">Indexes</h2>
<p>Indexes are special database objects that improve the speed of data retrieval operations, much like an index in a book helps you quickly find the page you're looking for.</p>
<blockquote>
<p>In the context of Ruby on Rails, understanding how to list and manage these indexes is crucial for optimizing database performance.</p>
</blockquote>
<hr />
<p><img src="https://24.media.tumblr.com/7c4e7315778d8966dd31e99e4c94a461/tumblr_mjgwtdoqGz1r6o1keo1_500.gif" alt="maurice moss it crowd gif | WiffleGif" class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-solution">Solution</h2>
<h3 id="heading-process">Process</h3>
<p>Basically, the goal is to retrieve all indexes for one specific table through the <code>connection.indexes</code> method and it iterates over the list in specific column is present there.</p>
<hr />
<h3 id="heading-rails-console">Rails console</h3>
<p>Start by opening the Rails console with the following command.</p>
<pre><code class="lang-ruby">rails console
</code></pre>
<hr />
<h3 id="heading-retrieve-the-indexes">Retrieve the indexes</h3>
<p>Let's use the <code>connection.indexes</code> method from ActiveRecord to retrieve the indexes for the desired table.</p>
<pre><code class="lang-ruby">indexes = ActiveRecord::Base.connection.indexes(<span class="hljs-symbol">:your_table</span>)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717465137989/792496a2-4b1f-45b9-8c80-2fd3936f09c5.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-connection-adapters">Connection adapters</h3>
<p>This will return an array of <code>ActiveRecord::ConnectionAdapters::IndexDefinition</code> objects, each representing an index on the <code>your_table</code> table.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717465360488/83b730eb-bd6d-4fbe-8056-c8a9f647a453.png" alt class="image--center mx-auto" /></p>
<p>Besides, this will print the name, columns, and uniqueness of each index on the users table.</p>
<hr />
<h3 id="heading-check-if-a-specific-column-is-indexed"><strong>Check if a Specific Column is Indexed</strong></h3>
<p>The <code>any?</code> method is used to iterate through each index and check if the <code>columns</code> array of the index includes the specified column name.</p>
<pre><code class="lang-ruby">indexes.any? { <span class="hljs-params">|index|</span> index.columns.<span class="hljs-keyword">include</span>?(<span class="hljs-string">'my_column_name'</span>)}
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717468649934/836b54be-595e-412d-898f-7fc61ee3f6a2.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-check-all-columns">Check all columns</h3>
<pre><code class="lang-ruby">indexes = ActiveRecord::Base.connection.indexes(<span class="hljs-symbol">:your_table</span>)
indexes.map(&amp;<span class="hljs-symbol">:columns</span>).flatten
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717469485893/87e5c68a-f977-4b76-ad31-1e3b7c9bf64a.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-done"><strong>Done</strong></h2>
<hr />
<h3 id="heading-conclusion">Conclusion</h3>
<p>By following these steps, you can easily visualize how to check if a specific column has an index in a Ruby on Rails application.</p>
<hr />
<h3 id="heading-celebrate"><strong>Celebrate</strong></h3>
<p><img src="https://media.tenor.com/kDyYq4PQuIgAAAAC/clapping-it-crowd.gif" alt="The It Crowd Birthday GIFs | Tenor" /></p>
<hr />
<h3 id="heading-reach-me-out"><strong>Reach me out</strong></h3>
<ul>
<li><p><a target="_blank" href="https://github.com/alexcalaca"><strong>Github</strong></a></p>
</li>
<li><p><a target="_blank" href="https://linkedin.com/in/alexandrecalacaofficial"><strong>LinkedIn</strong></a></p>
</li>
<li><p><a target="_blank" href="https://hashnode.com/onboard?next=/@alexandrecalaca"><strong>Hashnode</strong></a></p>
</li>
<li><p><a target="_blank" href="https://www.youtube.com/@alexandrecalacaofficial"><strong>Youtube</strong></a></p>
</li>
</ul>
<hr />
<h3 id="heading-final-thoughts">Final thoughts</h3>
<p>Thank you for reading this article.</p>
<p>If you have any questions, thoughts, suggestions, or corrections, please share them with us.</p>
<p>We appreciate your feedback and look forward to hearing from you.</p>
<p>Feel free to suggest topics for future blog articles. Until next time!</p>
]]></content:encoded></item><item><title><![CDATA[How to list all indexes of a specific table in a Rails application]]></title><description><![CDATA[Introduction
In the world of web development, databases play a critical role in storing and managing the data that powers applications. Within a database, tables organize this data into rows and columns, making it easier to retrieve and manipulate. H...]]></description><link>https://blog.alexandrecalaca.com/how-to-list-all-indexes-of-a-specific-table-in-a-rails-application</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/how-to-list-all-indexes-of-a-specific-table-in-a-rails-application</guid><category><![CDATA[Ruby]]></category><category><![CDATA[Ruby on Rails]]></category><category><![CDATA[alexandrecalaca]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Tue, 04 Jun 2024 02:20:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/beuDQp9XOp0/upload/491267482848dc423c9b8618363dbdf5.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<h2 id="heading-introduction">Introduction</h2>
<p>In the world of web development, databases play a critical role in storing and managing the data that powers applications. Within a database, tables organize this data into rows and columns, making it easier to retrieve and manipulate. However, as tables grow larger, finding specific pieces of information can become slow and inefficient. This is where indexes come into play.</p>
<hr />
<h2 id="heading-indexes">Indexes</h2>
<p>Indexes are special database objects that improve the speed of data retrieval operations, much like an index in a book helps you quickly find the page you're looking for.</p>
<hr />
<p><img src="https://24.media.tumblr.com/7c4e7315778d8966dd31e99e4c94a461/tumblr_mjgwtdoqGz1r6o1keo1_500.gif" alt="maurice moss it crowd gif | WiffleGif" class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-rails-console">Rails console</h2>
<pre><code class="lang-ruby">rails console
</code></pre>
<hr />
<h2 id="heading-connection-indexes">Connection indexes</h2>
<p>Let's use the <code>connection.indexes</code> method from ActiveRecord to retrieve the indexes for the desired table.</p>
<pre><code class="lang-ruby">ActiveRecord::Base.connection.indexes(<span class="hljs-symbol">:your_table</span>)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717465137989/792496a2-4b1f-45b9-8c80-2fd3936f09c5.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-connection-adapters">Connection adapters</h3>
<p>This will return an array of <code>ActiveRecord::ConnectionAdapters::IndexDefinition</code> objects, each representing an index on the <code>your_table</code> table.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717465360488/83b730eb-bd6d-4fbe-8056-c8a9f647a453.png" alt class="image--center mx-auto" /></p>
<p>Besides, this will print the name, columns, and uniqueness of each index on the users table.</p>
<hr />
<h2 id="heading-done"><strong>Done</strong></h2>
<hr />
<h3 id="heading-conclusion">Conclusion</h3>
<p>By following these steps, you can easily visualize how to list all indexes of a specific table in a Rails application.</p>
<hr />
<h3 id="heading-celebrate"><strong>Celebrate</strong></h3>
<p><img src="https://media.tenor.com/kDyYq4PQuIgAAAAC/clapping-it-crowd.gif" alt="The It Crowd Birthday GIFs | Tenor" /></p>
<hr />
<h3 id="heading-reach-me-out"><strong>Reach me out</strong></h3>
<ul>
<li><p><a target="_blank" href="https://github.com/alexcalaca"><strong>Github</strong></a></p>
</li>
<li><p><a target="_blank" href="https://linkedin.com/in/alexandrecalacaofficial"><strong>LinkedIn</strong></a></p>
</li>
<li><p><a target="_blank" href="https://hashnode.com/onboard?next=/@alexandrecalaca"><strong>Hashnode</strong></a></p>
</li>
<li><p><a target="_blank" href="https://www.youtube.com/@alexandrecalacaofficial"><strong>Youtube</strong></a></p>
</li>
</ul>
<hr />
<h3 id="heading-final-thoughts">Final thoughts</h3>
<p>Thank you for reading this article.</p>
<p>If you have any questions, thoughts, suggestions, or corrections, please share them with us.</p>
<p>We appreciate your feedback and look forward to hearing from you.</p>
<p>Feel free to suggest topics for future blog articles. Until next time!</p>
<hr />
]]></content:encoded></item><item><title><![CDATA[10000 views]]></title><description><![CDATA[On May 28th, 2024, we reached 10000 views on my blog, with 232 published articles so far.
Other milestones include:

9000 views on May 17th, 2024;

5000 views on November 05th, 2023;

4000 views on September 06th, 2023;

3000 views on June 01st, 2023...]]></description><link>https://blog.alexandrecalaca.com/10000-views</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/10000-views</guid><category><![CDATA[alexandrecalaca]]></category><category><![CDATA[Hashnode]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Thu, 30 May 2024 01:15:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/Hli3R6LKibo/upload/440068ac2fa721bfee4530b00f8b7ecc.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<p>On <code>May 28th, 2024</code>, we reached <code>10000</code> views on my blog, with <code>232</code> published articles so far.</p>
<p>Other milestones include:</p>
<ul>
<li><p>9000 views on May 17th, 2024;</p>
</li>
<li><p>5000 views on November 05th, 2023;</p>
</li>
<li><p>4000 views on September 06th, 2023;</p>
</li>
<li><p>3000 views on June 01st, 2023;</p>
</li>
<li><p>2000 views on April 26th, 2023;</p>
</li>
<li><p>1000 views on December 06th, 2022.</p>
</li>
</ul>
<p>Thank you all for the support!</p>
<p>It might be simple, but I believe it's worth celebrating.</p>
<p>Life is worth living!</p>
<hr />
<h4 id="heading-lets-become-friends">Let's become friends</h4>
<ul>
<li><p><a target="_blank" href="https://github.com/alexcalaca"><strong>Github</strong></a></p>
</li>
<li><p><a target="_blank" href="https://linkedin.com/in/alexandrecalacaofficial"><strong>LinkedIn</strong></a></p>
</li>
<li><p><a target="_blank" href="https://hashnode.com/onboard?next=/@alexandrecalaca"><strong>Hashnode</strong></a></p>
</li>
<li><p><a target="_blank" href="https://www.youtube.com/@alexandrecalacaofficial"><strong>Youtube</strong></a></p>
</li>
</ul>
<hr />
]]></content:encoded></item><item><title><![CDATA[34ª edição do Grupo de Usuários Ruby do Ceará, Brasil]]></title><description><![CDATA[Participe da 34ª edição do GURU-CE!
📅 Data: 01/06🕣 Horário: 8:30📍 Local: Internacional Trade Center, Rua Ary Barroso, 70, Torre 2, Auditório 02, Andar 62 (G2)
Os ingressos estarão disponíveis a partir das 18h de hoje!Garanta o seu no link: https:/...]]></description><link>https://blog.alexandrecalaca.com/34-edicao-do-grupo-de-usuarios-ruby-do-ceara-brasil</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/34-edicao-do-grupo-de-usuarios-ruby-do-ceara-brasil</guid><category><![CDATA[Ruby]]></category><category><![CDATA[Ruby on Rails]]></category><category><![CDATA[alexandrecalaca]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Wed, 22 May 2024 02:15:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1716343779386/e1e2e9a8-f0e9-48d6-afcf-3f8bcebfa822.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1716343806297/91f7502d-c3c3-4bc5-a5d7-5fd2ad284258.png" alt class="image--center mx-auto" /></p>
<p>Participe da 34ª edição do GURU-CE!</p>
<p>📅 Data: 01/06<br />🕣 Horário: 8:30<br />📍 Local: Internacional Trade Center, Rua Ary Barroso, 70, Torre 2, Auditório 02, Andar 62 (G2)</p>
<p>Os ingressos estarão disponíveis a partir das 18h de hoje!<br />Garanta o seu no link: <a target="_blank" href="https://bit.ly/GURUCE34">https://bit.ly/GURUCE34</a></p>
<hr />
]]></content:encoded></item><item><title><![CDATA[Analista Programador Pleno Web – Ruby on Rails - Remota]]></title><description><![CDATA[Área de Atuação: Ruby on RailsInício imedito ou o mais próximo dissoCidade: RemotaUF: PRPaís: BrasilAplicar à vaga
Descrição da Vaga:
Buscamos um Analista de Desenvolvimento Web Pleno especializado em Ruby on Rails para integrar nossa equipe. O profi...]]></description><link>https://blog.alexandrecalaca.com/analista-programador-pleno-web-ruby-on-rails-remota</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/analista-programador-pleno-web-ruby-on-rails-remota</guid><category><![CDATA[Ruby]]></category><category><![CDATA[Ruby on Rails]]></category><category><![CDATA[alexandrecalaca]]></category><category><![CDATA[jobs]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Wed, 22 May 2024 02:02:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1716343317607/f7c87353-3484-4b6c-8deb-bb21d4cd3820.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Área de Atuação:</strong> Ruby on Rails<br />Início imedito ou o mais próximo disso<br /><strong>Cidade:</strong> Remota<br /><strong>UF:</strong> PR<br /><strong>País:</strong> Brasil<br /><a target="_blank" href="https://www.icontalent.com.br/vagas-icon/analista-programador-web-ruby-on-rails/">Aplicar à vaga</a></p>
<h3 id="heading-descricao-da-vaga"><strong>Descrição da Vaga:</strong></h3>
<p>Buscamos um Analista de Desenvolvimento Web Pleno especializado em Ruby on Rails para integrar nossa equipe. O profissional será responsável por desenvolver, manter e otimizar aplicações web de alto desempenho, colaborando com nossa equipe multifuncional para entregar soluções inovadoras.<br /><a target="_blank" href="https://www.icontalent.com.br/vagas-icon/analista-programador-web-ruby-on-rails/">Aplicar à vaga</a></p>
<h3 id="heading-habilidades-tecnicas-requeridas"><strong>Habilidades Técnicas Requeridas:</strong></h3>
<ul>
<li><p>Experiência mínima de 4 anos de experiência com desenvolvimento web.</p>
</li>
<li><p>Experiência mínima de 2 anos com desenvolvimento em Ruby on Rails.</p>
</li>
<li><p>Familiaridade com bancos de dados relacionais, como PostgreSQL ou Oracle.</p>
</li>
<li><p>Capacidade de escrever consultas SQL otimizadas e entender problemas de performance.</p>
</li>
<li><p>Experiência na escrita e manutenção de testes unitários e de integração utilizando RSpec, Capybara ou ferramentas similares.</p>
</li>
<li><p>Domínio de ferramentas de controle de versão, especialmente Git.</p>
</li>
<li><p>Habilidade em desenvolver e consumir APIs RESTful e/ou GraphQL.</p>
</li>
<li><p>Familiaridade com padrões de projeto, princípios SOLID e convenções do Ruby on Rails.</p>
</li>
<li><p>Experiência em trabalho com metodologias ágeis, como Scrum ou Kanban. <a target="_blank" href="https://www.icontalent.com.br/vagas-icon/analista-programador-web-ruby-on-rails/">Aplicar à vaga</a></p>
</li>
</ul>
<h3 id="heading-diferencial"><strong>Diferencial</strong></h3>
<ul>
<li><p>Familiaridade com sistemas de cache como Redis.</p>
</li>
<li><p>Conhecimento em WebSockets ou ActionCable.</p>
</li>
<li><p>Noções de TDD (Test Driven Development) ou BDD (Behavior Driven Development).</p>
</li>
<li><p>Conhecimento em tecnologias front-end, como HTML5, CSS3 e JavaScript.</p>
</li>
<li><p>Familiaridade com frameworks e bibliotecas como Bootstrap, jQuery, React ou Vue.js</p>
</li>
<li><p>Conhecimento em plataformas de CI/CD.<br />  <a target="_blank" href="https://www.icontalent.com.br/vagas-icon/analista-programador-web-ruby-on-rails/">Aplicar à vaga</a></p>
</li>
</ul>
<h3 id="heading-qualificacoes"><strong>Qualificações:</strong></h3>
<ul>
<li>Graduação em Ciência da Computação, Engenharia da Computação, Sistemas de Informação ou áreas correlatas.<br />  <a target="_blank" href="https://www.icontalent.com.br/vagas-icon/analista-programador-web-ruby-on-rails/">Aplicar à vaga</a></li>
</ul>
<h3 id="heading-beneficios"><strong>Benefícios:</strong></h3>
<ul>
<li><p>Equipamento: Notebook, Teclado, Mouse.</p>
</li>
<li><p>Auxílio Home Office: R$150,00 (200h/Mensal)</p>
</li>
<li><p>Plano de Saúde: Unimed (Goiânia) / Bradesco (Demais Cidades) em Acomodação Enfermaria. É possível fazer a inclusão de dependentes (cônjuge e filhos), sendo o valor da mensalidade pago integralmente pelo funcionário, com desconto em folha de pagamento, consulta de valores na ocasião da admissão.</p>
</li>
<li><p>Benefício Social Familiar (Instituído pela CCT)</p>
</li>
<li><p>Vale Cultura – R$ 50,00 (opcional, conforme Lei 12.761/2012)</p>
</li>
<li><p>Vale Alimentação/Refeição (Sodexo) – R$1.001,00 com dedução de 10% (R$ 100,10) na folha de pagamento *instituído pela CCT.</p>
</li>
<li><p>Seguro de Vida (PASI)</p>
</li>
<li><p>DAY-OFF (folga) justificada ao trabalho no dia do seu aniversário. A data é intransferível, não podendo ser compensada com outros dias.</p>
</li>
<li><p>Programa de saúde e bem-estar ↓</p>
</li>
<li><p>Gympass Core (Wellhub) – Funciona por meio do aplicativo onde é possível frequentar academias e estúdios com diversas modalidades esportivas, por um preço mais em conta do que a mensalidade comum.</p>
</li>
<li><p>Conexa Saúde – Direito a 1 consulta de telemedicina de pronto-atendimento por mês.<em>Não cumulativo. Psicologia Viva – Direito a 1 consulta de telepsicologia por mês pelo.</em>Não cumulativo.<br />  <a target="_blank" href="https://www.icontalent.com.br/vagas-icon/analista-programador-web-ruby-on-rails/">Aplicar à vaga</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[1º Encontro Trem on Rails em Minas Gerais, Brasil]]></title><description><![CDATA[Detalhes
Agenda para o 1º Encontro Trem on Rails - 08/06
Olá Pessoal do Trem on Rails!
Estamos animados para compartilhar a agenda do nosso próximo encontro, que acontecerá no dia 08 de junho. Estejam prontos para uma sessão informativa e envolvente,...]]></description><link>https://blog.alexandrecalaca.com/1-encontro-trem-on-rails-em-minas-gerais-brasil</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/1-encontro-trem-on-rails-em-minas-gerais-brasil</guid><category><![CDATA[Ruby]]></category><category><![CDATA[Ruby on Rails]]></category><category><![CDATA[alexandrecalaca]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Tue, 21 May 2024 02:04:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1716256924687/7c8f1e86-a663-4ee4-a209-c3bff6f81dce.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<h2 id="heading-detalhes"><strong>Detalhes</strong></h2>
<p>Agenda para o <a target="_blank" href="https://www.meetup.com/pt-BR/ruby-on-rails-bh/events/300930005">1º Encontro Trem on Rails - 08/06</a></p>
<p>Olá Pessoal do Trem on Rails!</p>
<p>Estamos animados para compartilhar a agenda do nosso próximo encontro, que acontecerá no dia 08 de junho. Estejam prontos para uma sessão informativa e envolvente, repleta de aprendizado e colaboração. - by ChatGPT (me recusei a não usar isso! rs</p>
<p>Detalhes do Evento:<br />Data: 08 de junho de 2024 - Sabado<br />Horário: Das 10:00 às 12:00<br />Local: Alloyal - Rua Domingos Vieira, 120, 4ºandar, Santa Efigênia</p>
<p>Agenda:</p>
<p>Introduções (10:00 - 10:15)</p>
<ul>
<li>Organização e margem para quem se atrasou mesmo.</li>
</ul>
<p>Apresentação (10:15 - 11:00)<br />Reduzindo custos de operação com rearquitetura e otimizações por Gabriel Sobrinho<br />Como ajudei um cliente a economizar milhões em infraestrutura por meio de rearquitetura, refatoração e escalabilidade, além da otimização na troca de serviços utilizados.</p>
<p>Discussão Aberta e Networking (11:00 - 11:45)</p>
<ul>
<li>Uma oportunidade para networking informal e tomar uma cerveja.</li>
</ul>
<p>Palestrante:<br />Gabriel é o CEO da Code1, com vasta experiência como desenvolvedor sênior. Seu foco está em transformar tecnologia em resultados de negócios tangíveis, destacando-se pela habilidade de liderar equipes e implementar soluções inovadoras.</p>
<p>Observações:</p>
<ul>
<li><p>Um leve lanche e bebidas serão fornecidos.</p>
</li>
<li><p>Sinta-se à vontade para convidar outros programadores Ruby interessados para se juntarem a nós!</p>
</li>
<li><p>Por favor, confirme sua presença até 07/06 para que possamos fazer os preparativos necessários.</p>
</li>
</ul>
<p><a target="_blank" href="https://www.meetup.com/pt-BR/ruby-on-rails-bh/events/300930005">Confirmar inscrição</a></p>
]]></content:encoded></item><item><title><![CDATA[The surprisingly powerful programming language loved by Stripe and Shopify]]></title><description><![CDATA[After Black Friday and Cyber Monday drove consumers to eCommerce sites in their millions, two fintechs appeared to have dealt with the surge in users rather well. eCommerce giant Shopify and Stripe, the company that processes its payments, have both ...]]></description><link>https://blog.alexandrecalaca.com/the-surprisingly-powerful-programming-language-loved-by-stripe-and-shopify</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/the-surprisingly-powerful-programming-language-loved-by-stripe-and-shopify</guid><category><![CDATA[alexandrecalaca]]></category><category><![CDATA[Ruby]]></category><category><![CDATA[Ruby on Rails]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Sun, 19 May 2024 20:03:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1716148008554/7e6c1130-d81d-4936-8488-24caa8cba2ae.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>After Black Friday and Cyber Monday drove consumers to eCommerce sites in their millions, two <a target="_blank" href="https://www.efinancialcareers.com/jobs/fintech">fintechs</a> appeared to have dealt with the surge in users rather well. eCommerce giant Shopify and Stripe, the company that processes its payments, have both flaunted their <a target="_blank" href="https://www.efinancialcareers.com/news/2023/10/stripe-engineering-culture">technological prowess</a>, and they've got something in common: their <a target="_blank" href="https://www.efinancialcareers.com/news/2023/06/what-is-stripe-fintech">programming language</a> of choice.</p>
<p><a target="_blank" href="https://www.efinancialcareers.com/news/2023/06/what-is-stripe-fintech"><mark>Stripe </mark></a> <mark>and Shopify both use Ruby</mark>. Stripe has described itself as a Ruby monolith, and Shopify CEO Tobi Lutke contributed to Ruby in open-source before founding the firm.</p>
<p>Using Ruby in their stacks, both fintechs handled a lot of volume. Stripe processed over 303m transact<a target="_blank" href="https://www.efinancialcareers.com/jobs/fintech">i</a>ons from the Friday to Monday, giving over 31k businesses their best ever day using Stripe. Shopify meanwhile processed over 5 terrabytes of data per minute on Friday. This is all the more impressive given one of the most common slights against the language is that it doesn't scale, and Lutke's response was notably sassy on that topic. </p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/tobi/status/1728524453854756883?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1728524453854756883%7Ctwgr%5E855a23f752145efe8dac01e58ddbe530cee0c997%7Ctwcon%5Es1_c10&amp;ref_url=https%3A%2F%2Fwww.efinancialcareers.com%2Fnews%2F2023%2F12%2Fruby-jobs-fintech">https://twitter.com/tobi/status/1728524453854756883?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1728524453854756883%7Ctwgr%5E855a23f752145efe8dac01e58ddbe530cee0c997%7Ctwcon%5Es1_c10&amp;ref_url=https%3A%2F%2Fwww.efinancialcareers.com%2Fnews%2F2023%2F12%2Fruby-jobs-fintech</a></div>
<p> </p>
<p>So should you learn Ruby <a target="_blank" href="https://www.efinancialcareers.com/news/finance/fintech-salaries">if you want a job</a> at either of these fintechs or just fintech in general? Not necessarily. A developer from <a target="_blank" href="https://www.efinancialcareers.com/news/2023/10/stripe-work-from-home-culture">Stripe</a> says, "knowing Ruby won't help you get a job here one bit," and that the only real benefit you'd get from learning it comes after you're hired. </p>
<p>The <a target="_blank" href="https://www.efinancialcareers.com/jobs/development">developer</a> also notes that "half of Stripe uses <a target="_blank" href="https://www.efinancialcareers.com/jobs/java-developer">Java</a> and Go." Java at least is a far better option for employment prospects, given its stalwart status in the top 4 of the TIOBE index. Go isn't quite as popular, but still ranks higher than Ruby (13th compared to 19th) and is used at major tech firms like Uber and Netflix.</p>
<p>Ruby may <a target="_blank" href="https://www.efinancialcareers.com/news/finance/fintech-worse-than-banking-hours">not be particularly fun</a> to code in, either. One engineer on Hacker News said they "got burnt out on Rails after the third app in a row that I was responsible for upgrading." One Amazon engineer said they used to code in Ruby, but were lucky to have stopped and moved on. </p>
<p>Stripe, however, doesn't use the popular Ruby on Rails framework, opting to build its own, which some employees have called "relaxing" and "delightful" to work with.</p>
<hr />
<p>Article written by Alex McMurray at <a target="_blank" href="https://www.efinancialcareers.com/news/2023/12/ruby-jobs-fintech">https://www.efinancialcareers.com/news/2023/12/ruby-jobs-fintech</a></p>
<hr />
]]></content:encoded></item><item><title><![CDATA[9000 views]]></title><description><![CDATA[Thank you for your support!
On May 17th, 2024, we reached 9000 views on my blog, with 225 published articles so far.
Other milestones include:

5000 views on November 05th, 2023;

4000 views on September 06th, 2023;

3000 views on June 01st, 2023;

2...]]></description><link>https://blog.alexandrecalaca.com/9000-views</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/9000-views</guid><category><![CDATA[alexandrecalaca]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Sat, 18 May 2024 17:18:56 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/8UcNYpynFLU/upload/9e2010ca9b344dbf611030f3a7897554.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<p>Thank you for your support!</p>
<p>On <code>May 17th, 2024</code>, we reached 9000 views on my blog, with 225 published articles so far.</p>
<p>Other milestones include:</p>
<ul>
<li><p>5000 views on November 05th, 2023;</p>
</li>
<li><p>4000 views on September 06th, 2023;</p>
</li>
<li><p>3000 views on June 01st, 2023;</p>
</li>
<li><p>2000 views on April 26th, 2023;</p>
</li>
<li><p>1000 views on December 06th, 2022.</p>
</li>
</ul>
<p>It might be simple, but I believe it's worth celebrating.</p>
<p>Life is worth living!</p>
<hr />
<h4 id="heading-lets-become-friends">Let's become friends</h4>
<ul>
<li><p><a target="_blank" href="https://github.com/alexcalaca"><strong>Github</strong></a></p>
</li>
<li><p><a target="_blank" href="https://linkedin.com/in/alexandrecalacaofficial"><strong>LinkedIn</strong></a></p>
</li>
<li><p><a target="_blank" href="https://hashnode.com/onboard?next=/@alexandrecalaca"><strong>Hashnode</strong></a></p>
</li>
<li><p><a target="_blank" href="https://www.youtube.com/@alexandrecalacaofficial"><strong>Youtube</strong></a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Desenvolvedor Backend - Ruby on Rails (Only Brasil) - Job posting]]></title><description><![CDATA[Job description
Estamos buscando um Desenvolvedor Backend com conhecimentos em Ruby on Rails para um dos nossos clientes no Brasil.
Nesta posição, você será fundamental no desenvolvimento e manutenção de sistemas robustos e escaláveis, utilizando tec...]]></description><link>https://blog.alexandrecalaca.com/desenvolvedor-backend-ruby-on-rails-only-brasil-job-posting</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/desenvolvedor-backend-ruby-on-rails-only-brasil-job-posting</guid><category><![CDATA[job posting]]></category><category><![CDATA[jobs]]></category><category><![CDATA[Ruby]]></category><category><![CDATA[Ruby on Rails]]></category><category><![CDATA[alexandrecalaca]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Sat, 18 May 2024 03:17:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1716002203388/e483b310-3a7c-4481-b681-2b1324041816.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<p>Job description</p>
<p>Estamos buscando um <strong>Desenvolvedor Backend</strong> com conhecimentos em <strong>Ruby on Rails</strong> para um dos nossos clientes no Brasil.</p>
<p>Nesta posição, você será fundamental no desenvolvimento e manutenção de sistemas robustos e escaláveis, utilizando tecnologias como Ruby on Rails, Javascript, PostgreSQL, Elasticsearch e implementando boas práticas de arquitetura de software. <a target="_blank" href="https://www.workana.com/talent/job-positions/11ef12d4-9e92-be3b-b048-42010af0001b">Clique aqui para aplicar</a>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1716002056584/5e7f8776-cde3-4aaf-a5c7-975957c114b9.png" alt class="image--center mx-auto" /></p>
<p><strong>Responsabilidades:</strong></p>
<ul>
<li><p>Desenvolver e manter aplicativos backend escaláveis e de alto desempenho</p>
</li>
<li><p>utilizando Ruby on Rails.</p>
</li>
<li><p>Projetar, implementar e otimizar APIs RESTful para suportar requisitos de frontend e integrações com outras aplicações.</p>
</li>
<li><p>Trabalhar com bancos de dados PostgreSQL, incluindo otimização de consultas e modelagem de dados.</p>
</li>
<li><p>Implementar e manter funcionalidades de busca utilizando Elasticsearch.</p>
</li>
<li><p>Colaborar com equipes de frontend e UX/UI para projetar e implementar soluções eficazes.</p>
</li>
<li><p>Contribuir ativamente para a arquitetura de software, oferecendo insights e soluções técnicas inovadoras.</p>
</li>
<li><p>Implementar práticas de deploy automatizado e integração contínua (CI/CD).</p>
</li>
<li><p>Manter a qualidade do código através de testes unitários e integração. <a target="_blank" href="https://www.workana.com/talent/job-positions/11ef12d4-9e92-be3b-b048-42010af0001b">Clique aqui para aplicar.</a></p>
</li>
</ul>
<p><strong>Requisitos:</strong></p>
<ul>
<li><p>Experiência sólida em desenvolvimento backend, preferencialmente com Ruby on Rails.</p>
</li>
<li><p>Proficiência em Javascript para desenvolvimento backend.</p>
</li>
<li><p>Experiência com bancos de dados PostgreSQL e otimização de consultas.</p>
</li>
<li><p>Conhecimento prático em Elasticsearch ou tecnologias similares.</p>
</li>
<li><p>Experiência em design e desenvolvimento de APIs RESTful.</p>
</li>
<li><p>Familiaridade com práticas de deploy automatizado e integração contínua.</p>
</li>
<li><p>Sólidos conhecimentos em arquitetura de software, incluindo design de sistemas escaláveis e eficientes.</p>
</li>
<li><p>Excelentes habilidades de comunicação e capacidade de trabalhar em equipe.</p>
</li>
<li><p>Capacidade comprovada de oferecer insights técnicos e soluções arquiteturais inovadoras.</p>
</li>
<li><p>Graduação em Ciência da Computação, Engenharia de Software ou área relacionada (desejável). <a target="_blank" href="https://www.workana.com/talent/job-positions/11ef12d4-9e92-be3b-b048-42010af0001b">Clique aqui para aplicar</a>.</p>
</li>
</ul>
<p><strong>Importante:</strong></p>
<p>Esta posição é em tempo integral, sob modalidade de contrato. Tem duração de 12 meses. O <strong>processo de seleção</strong> pode consistir em até 3 etapas: video-entrevista inicial com a Workana (Hireflix), prova tecnica (Tech assessment) e entrevista técnica e fit cultutal.</p>
<p>Se você estiver interessado(a) nesta posição e acredita que é o(a) indicado(a), aguardamos sua inscrição. Em caso de seleção para continuar, alguém da equipe de Talentos da Workana entrará em contato com você :)</p>
<p><a target="_blank" href="https://www.workana.com/talent/job-positions/11ef12d4-9e92-be3b-b048-42010af0001b">Clique aqui para aplicar.</a></p>
]]></content:encoded></item><item><title><![CDATA[How to configure the AWS CLI Command Line Interface]]></title><description><![CDATA[AWS CLI
AWS CLI (Amazon Web Services Command Line Interface) is a unified tool provided by Amazon for managing AWS services from the command line.
It allows users to interact with various AWS services and resources directly through text-based command...]]></description><link>https://blog.alexandrecalaca.com/how-to-configure-the-aws-cli-command-line-interface</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/how-to-configure-the-aws-cli-command-line-interface</guid><category><![CDATA[AWS]]></category><category><![CDATA[aws cli]]></category><category><![CDATA[PopOS]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Fri, 17 May 2024 16:39:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1715963950754/3de96d61-4c1e-43fb-a638-216564b0d174.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<h2 id="heading-aws-cli">AWS CLI</h2>
<p>AWS CLI (Amazon Web Services Command Line Interface) is a unified tool provided by Amazon for managing AWS services from the command line.</p>
<p>It allows users to interact with various AWS services and resources directly through text-based commands, making it easier to automate tasks, script actions, and integrate AWS services into workflows.</p>
<hr />
<h3 id="heading-configure-the-aws-sso">Configure the AWS SSO</h3>
<pre><code class="lang-ruby">aws configure sso
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715953674898/6e8cfc8b-7f30-4ac1-be3c-b86c9a3deecf.png" alt class="image--center mx-auto" /></p>
<p>AWS SSO is a service provided by Amazon Web Services that makes it easy to centrally manage access to multiple AWS accounts and business applications and to provide users with single sign-on access to them.</p>
<hr />
<h3 id="heading-provide-a-session-name">Provide a session name</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715953779634/a8dbe466-c964-4d35-b264-0ff6dc709131.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-set-the-sso-start-url">Set the SSO start URL</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715953914671/6e78a3d4-8113-4234-81a8-2a11699b5405.png" alt class="image--center mx-auto" /></p>
<p>The Single Sign-On (SSO) start URL is a specific URL provided by AWS Single Sign-On that directs users to the SSO login page or the SSO portal where they can sign in and access their assigned AWS accounts and applications.</p>
<p>This URL is unique to your AWS account and is generated by AWS SSO.</p>
<hr />
<h3 id="heading-choose-a-region">Choose a region</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715954012843/102a24c3-4cdf-4ea3-af4d-79977d4cd140.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-scope">Scope</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715954078895/1ae32a51-7dfb-4def-b114-2d250592c146.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-authorize-device">Authorize device</h3>
<p>A web page is going to open.</p>
<p>In the terminal</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715955744992/8eab1e2a-d8e4-4901-ab88-8a23ff85b20b.png" alt class="image--center mx-auto" /></p>
<p>In the browser</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715955789881/7040e3ae-d1c0-4e6c-8340-8ecd35e24cf0.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-allow-boto-core-client-dev">Allow boto-core-client-dev</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715955848341/7a6dd03d-c7d4-4b06-a338-334b0b622a3d.png" alt class="image--center mx-auto" /></p>
<p>Botocore is the low-level library that powers the AWS CLI (Command Line Interface) and provides the foundation for the AWS SDKs (Software Development Kits) for Python.</p>
<p>It's responsible for handling the underlying communication with AWS services, such as sending requests and receiving responses.</p>
<hr />
<h3 id="heading-set-default-client-region">Set default client region</h3>
<p>After the approval of <code>botocore-client-dev</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715956057049/d0798cee-f55c-43a0-9306-8ad3750e798f.png" alt class="image--center mx-auto" /></p>
<p>Come back to the terminal and set the default client region</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715956124343/6cb7c1b5-38a6-4a01-a422-b96d4fa1abc3.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-set-cli-default-output-format">Set CLI default output format</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715956187733/18e1ecb4-90ee-43ad-bca3-e64e446327c3.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-check">Check</h2>
<h3 id="heading-visualize-your-profile">Visualize your profile</h3>
<p>As soon as you hit enter after the last part, you'll see your profile.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715963741215/5ae71022-17a2-4831-8689-2a3cf498b4a2.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-test">Test</h3>
<pre><code class="lang-ruby">aws sts get-caller-identity --profile your_profile_name
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715963868971/45e280ed-2c96-44e8-b749-10d9040045d1.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-done"><strong>Done</strong></h2>
<hr />
<h3 id="heading-conclusion">Conclusion</h3>
<p>By following these steps, you can easily set up your AWS command line interface.</p>
<hr />
<h3 id="heading-celebrate"><strong>Celebrate</strong></h3>
<p><img src="https://media.tenor.com/kDyYq4PQuIgAAAAC/clapping-it-crowd.gif" alt="The It Crowd Birthday GIFs | Tenor" /></p>
<hr />
<h3 id="heading-reach-me-out"><strong>Reach me out</strong></h3>
<ul>
<li><p><a target="_blank" href="https://github.com/alexcalaca"><strong>Github</strong></a></p>
</li>
<li><p><a target="_blank" href="https://linkedin.com/in/alexandrecalacaofficial"><strong>LinkedIn</strong></a></p>
</li>
<li><p><a target="_blank" href="https://hashnode.com/onboard?next=/@alexandrecalaca"><strong>Hashnode</strong></a></p>
</li>
<li><p><a target="_blank" href="https://www.youtube.com/@alexandrecalacaofficial"><strong>Youtube</strong></a></p>
</li>
</ul>
<hr />
<h3 id="heading-final-thoughts">Final thoughts</h3>
<p>Thank you for reading this article.</p>
<p>If you have any questions, thoughts, suggestions, or corrections, please share them with us.</p>
<p>We appreciate your feedback and look forward to hearing from you.</p>
<p>Feel free to suggest topics for future blog articles. Until next time!</p>
<hr />
]]></content:encoded></item><item><title><![CDATA[Senior Backend Ruby on Rails Developer
at Nearsure]]></title><description><![CDATA[Only available for Latin America

What is it like to work at Nearsure?
A remote team never felt so close 🌐 Join our LATAM team and stay connected while working remotely. We value our team members and candidates interested in our vacancies. Enjoy fun...]]></description><link>https://blog.alexandrecalaca.com/senior-backend-ruby-on-rails-developer-at-nearsure</link><guid isPermaLink="true">https://blog.alexandrecalaca.com/senior-backend-ruby-on-rails-developer-at-nearsure</guid><category><![CDATA[jobs]]></category><category><![CDATA[Ruby]]></category><category><![CDATA[Ruby on Rails]]></category><category><![CDATA[alexandrecalaca]]></category><dc:creator><![CDATA[Alexandre Calaça]]></dc:creator><pubDate>Fri, 17 May 2024 16:22:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1715962805207/99279331-ef76-4c7c-a485-ced880f338a0.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<blockquote>
<p>Only available for Latin America</p>
</blockquote>
<p><strong>What is it like to work at Nearsure?</strong></p>
<p><strong>A remote team never felt so close 🌐</strong> Join our LATAM team and stay connected while working remotely. We value our team members and candidates interested in our vacancies. Enjoy fun activities like coffee breaks, tech talks, and games with our developers and management teams during your stay with us.</p>
<p><strong>Who needs micromanagement?</strong> 🍃For us, communication is key, so we focus on working autonomously, with honesty, and respecting diversity. Micromanagement is not part of our corporate values.</p>
<p><strong>Worklife Balance</strong> ⚖️Your well-being is our priority with our People Care team, available from day one to offer support and help with anything from needing someone to talk to, requesting time off or a holiday, or using any of our offered benefits.</p>
<p>Additionally, our Accounts Management team ensures a smooth and effective stay with our clients, fostering a harmonious relationship with both the client and the project. <a target="_blank" href="https://boards.greenhouse.io/nearsure/jobs/4338687007">Apply now.</a></p>
<p><strong>Here you’ll get:</strong></p>
<ul>
<li><p>USD 💲 Salary compensation.</p>
</li>
<li><p>100% remote work 🏢 but if you feel like connecting with people you can visit coworking spaces all over LATAM allowing you to expand your professional network.</p>
</li>
<li><p>Paid time off according to your country’s law without affecting your monthly salary to ensure that you have plenty of time to rest and recharge.</p>
</li>
<li><p>Your country’s national holidays 🌴 allow you to celebrate important events and traditions with your loved ones.</p>
</li>
<li><p>Sick or medical leave 😷 when needed so that you can take a day off to take care of your health, and have wellbeing without worrying about work.</p>
</li>
<li><p>Refundable annual credit 💸 for you to spend on your favorite perks.</p>
</li>
<li><p>Teambuilding activities 🤜🤛 such as coffee breaks, tech talks, and after-work gatherings with your Nearsure colleagues, to feel close to our community.</p>
</li>
<li><p>A day off during your birthday week 🥳🎂 to enjoy with your family and friends, ensuring that you have a chance to make memories on your special day. <a target="_blank" href="https://boards.greenhouse.io/nearsure/jobs/4338687007">Apply now</a></p>
</li>
</ul>
<p><strong>About the project:</strong></p>
<p>As a <strong>Senior Ruby on Rails Developer</strong>, you will work collaboratively across Engineering, Product, Operations, and Marketing to architect, build, and enhance consumer applications, APIs, internal administration tools, and more. <a target="_blank" href="https://boards.greenhouse.io/nearsure/jobs/4338687007">Apply now</a></p>
<p><strong>You will be able to:</strong></p>
<ul>
<li><p>Participate in initiatives around new libraries and technologies to improve and scale capabilities.</p>
</li>
<li><p>Architect and build out new services using technology best suited for the job.</p>
</li>
<li><p>Work collaboratively to develop and enhance the backend system, including cleaning and refactoring existing code.</p>
</li>
<li><p>Rewrite legacy code and build new services to handle increasing traffic as continues to grow.</p>
</li>
<li><p>Maintain and contribute to existing test suites to ensure that applications are reliable and work as intended.</p>
</li>
<li><p>Utilize advanced PostgreSQL to meet the high load on the database.</p>
</li>
<li><p>Contribute to compliance-related initiatives including state regulations and SOC audits. <a target="_blank" href="https://boards.greenhouse.io/nearsure/jobs/4338687007">Apply now</a></p>
</li>
</ul>
<p><strong>What will help you succeed in this role:</strong></p>
<ul>
<li><p>Bachelor's Degree in Computer Science, Engineering, or a related field.</p>
</li>
<li><p>8+ Years of experience working with software development.</p>
</li>
<li><p>5+ Years of experience working with Ruby on Rails.</p>
</li>
<li><p>1+ Years of experience working with Elixir.</p>
</li>
<li><p>1+ Years of experience working with Python.</p>
</li>
<li><p>1+ Years of experience working with Node.</p>
</li>
<li><p>1+ Years of experience working with APIs.</p>
</li>
<li><p>1+ Years of experience working with SQL.</p>
</li>
<li><p>1+ Years of experience working with JavaScript.</p>
</li>
<li><p>Advanced English Level is required for this role as you will work with US clients. Effective communication in English is essential to deliver the best solutions to our clients and expand your horizons. <a target="_blank" href="https://boards.greenhouse.io/nearsure/jobs/4338687007">Apply now</a></p>
</li>
</ul>
<p><strong>Here's what you can expect from our hiring process:</strong></p>
<ul>
<li><p>We'd love to discuss your experience in an interview with our recruiters. </p>
</li>
<li><p>If all goes well, we'll arrange a technical interview with our top developers to evaluate your skills.</p>
</li>
<li><p>If you advance to the next stage, you'll have a chance to meet our client and potentially become a part of our amazing team! <a target="_blank" href="https://boards.greenhouse.io/nearsure/jobs/4338687007">Apply now</a></p>
</li>
</ul>
<p><strong>Would you like to work alongside top Latin American talent?</strong></p>
<p>Work remotely from Latin America for US clients with Nearsure, a staff augmentation company that values people and culture. Gain cross-cultural expertise and improve your English skills with daily communication in English.</p>
<p><strong><em>We're excited to have you on board and can't wait to learn more about you.</em></strong></p>
<p><a target="_blank" href="https://boards.greenhouse.io/nearsure/jobs/4338687007">Apply now</a></p>
]]></content:encoded></item></channel></rss>