<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Joel Jucá</title>
    <description>The latest articles on DEV Community by Joel Jucá (@joeljuca).</description>
    <link>https://dev.to/joeljuca</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F327321%2F8e2a2363-7b5f-4b92-a64a-2b481f17c860.jpeg</url>
      <title>DEV Community: Joel Jucá</title>
      <link>https://dev.to/joeljuca</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joeljuca"/>
    <language>en</language>
    <item>
      <title>Meet entr, the standalone file watcher</title>
      <dc:creator>Joel Jucá</dc:creator>
      <pubDate>Thu, 02 Nov 2023 15:23:36 +0000</pubDate>
      <link>https://dev.to/joeljuca/meet-entr-the-standalone-file-watcher-42a</link>
      <guid>https://dev.to/joeljuca/meet-entr-the-standalone-file-watcher-42a</guid>
      <description>&lt;p&gt;I like to write about tools in my toolbelt I love, and entr is one of these preferred tools I enjoy using a lot.&lt;/p&gt;

&lt;p&gt;Today I'm talking about &lt;a href="https://eradman.com/entrproject/" rel="noopener noreferrer"&gt;entr&lt;/a&gt; – the Standalone File Watcher.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's &lt;code&gt;entr&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://eradman.com/entrproject/" rel="noopener noreferrer"&gt;entr&lt;/a&gt; ("Event Notify Test Runner"; &lt;a href="https://github.com/eradman/entr/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;), is a command-line tool written by &lt;a href="https://github.com/eradman" rel="noopener noreferrer"&gt;Eric Radman&lt;/a&gt; that allows running arbitrary commands whenever files change.&lt;/p&gt;

&lt;p&gt;It's not tied to any programming language, framework, platform, OS, etc. – it's a real standalone tool, pretty useful in a variety of scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;First, use &lt;code&gt;find&lt;/code&gt; to craft a command that lists the files you're working with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'*.md'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, just pipe it to &lt;code&gt;entr&lt;/code&gt; with a command to be run whenever files change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'*.md'&lt;/span&gt; | entr &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Markdown files changed!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;entr has some very interesting options, like the ability to clear the screen before running the given command (so you get a cleaner output). To get a full list of options, check its &lt;code&gt;man&lt;/code&gt; page with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;man entr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Continuously testing with entr
&lt;/h2&gt;

&lt;p&gt;As you might have guessed, one of the main use cases for entr is to rerun tests whenever files change. I'm an &lt;a href="https://elixir-lang.org" rel="noopener noreferrer"&gt;Elixir&lt;/a&gt; engineer, and I use &lt;code&gt;entr&lt;/code&gt; to run &lt;code&gt;mix test&lt;/code&gt; continuously whenever I save an Elixir file.&lt;/p&gt;

&lt;p&gt;This is the snippet I use to continuously test my Elixir library &lt;a href="https://github.com/joeljuca/swiss_schema" rel="noopener noreferrer"&gt;SwissSchema&lt;/a&gt; while I'm working on it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find &lt;span class="nt"&gt;-E&lt;/span&gt; lib &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-regex&lt;/span&gt; &lt;span class="s1"&gt;'.*exs?$'&lt;/span&gt; | entr &lt;span class="nt"&gt;-c&lt;/span&gt; mix &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A snippet I obviously can't recall from the top of my head every time I need to run it. Luckily, this project has a &lt;code&gt;Makefile&lt;/code&gt; with a task for it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;test.watch&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    find &lt;span class="nt"&gt;-E&lt;/span&gt; lib &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-regex&lt;/span&gt; .&lt;span class="k"&gt;*&lt;/span&gt;exs?&lt;span class="nv"&gt;$ &lt;/span&gt;| entr &lt;span class="nt"&gt;-c&lt;/span&gt; mix &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 I wrote two articles here on &lt;a href="https://dev.to"&gt;DEV&lt;/a&gt; about Makefiles, one covering their overall utility and usage, and another with my Makefile setup for Elixir projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/joeljuca/makefiles-a-standard-for-project-tasks-31b"&gt;Makefiles: a standard for project tasks &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/joeljuca/my-makefile-for-elixirphoenix-4ei9"&gt;My Makefile for Elixir/Phoenix &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's it. There's not much to learn, entr is really this awesome!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>My Makefile for Elixir/Phoenix</title>
      <dc:creator>Joel Jucá</dc:creator>
      <pubDate>Sat, 20 May 2023 15:01:06 +0000</pubDate>
      <link>https://dev.to/joeljuca/my-makefile-for-elixirphoenix-4ei9</link>
      <guid>https://dev.to/joeljuca/my-makefile-for-elixirphoenix-4ei9</guid>
      <description>&lt;p&gt;Following my last post about &lt;a href="https://www.gnu.org/software/make/" rel="noopener noreferrer"&gt;GNU Make&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Make_(software)#Makefiles" rel="noopener noreferrer"&gt;Makefiles&lt;/a&gt;, I thought I could share the &lt;code&gt;Makefile&lt;/code&gt; I'm using in my Elixir/Phoenix projects to have a standard CLI interface to manipulate all of them.&lt;/p&gt;

&lt;p&gt;I designed this &lt;code&gt;Makefile&lt;/code&gt; to be easily adapted to be used in other projects (I've been coding with some uncommon tools – Bash, Hy, Janet, Python, SQLite, etc., so remembering the commands specific to each of these is hard. So a standard &lt;code&gt;Makefile&lt;/code&gt; helps a lot. I also copy-paste it in new projects, edit its tasks, possibly delete some (eg.: delete database-related commands if they're not needed), and I'm good to go.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If you're not familiar with Makefiles, check this &lt;a href="https://dev.to/joeljuca/makefiles-a-standard-for-project-tasks-31b"&gt;quick introduction to Makefiles&lt;/a&gt; I wrote last week. It might give you good insights about what GNU Make is and how it can be used for.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With no ceremony, here's my "standard" Elixir/Phoenix &lt;code&gt;Makefile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;.PHONY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;setup build run lint fmt test test.watch db.setup db.create db.migrate db.seed db.drop db.reset repl repl.run repl.test&lt;/span&gt;

&lt;span class="c"&gt;# Project-wide
&lt;/span&gt;
&lt;span class="nl"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    make build &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make db.setup

&lt;span class="nl"&gt;build&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    mix &lt;span class="k"&gt;do &lt;/span&gt;deps.get + compile

&lt;span class="nl"&gt;run&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    mix phx.server

&lt;span class="c"&gt;# Code quality
&lt;/span&gt;
&lt;span class="nl"&gt;lint&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    mix format &lt;span class="nt"&gt;--check-formatted&lt;/span&gt;

&lt;span class="nl"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    mix format

&lt;span class="nl"&gt;test&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    mix &lt;span class="nb"&gt;test&lt;/span&gt;

&lt;span class="nl"&gt;test.watch&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    mix test.watch

&lt;span class="c"&gt;# Database
&lt;/span&gt;
&lt;span class="nl"&gt;db.setup&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    make db.create &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make db.migrate &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make db.seed

&lt;span class="nl"&gt;db.create&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    mix ecto.create

&lt;span class="nl"&gt;db.migrate&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    mix ecto.migrate

&lt;span class="nl"&gt;db.seed&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    mix run priv/repo/seeds.exs

&lt;span class="nl"&gt;db.drop&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    mix ecto.drop

&lt;span class="nl"&gt;db.reset&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    make db.drop &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make db.setup

&lt;span class="c"&gt;# REPL
&lt;/span&gt;
&lt;span class="nl"&gt;repl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    iex &lt;span class="nt"&gt;-S&lt;/span&gt; mix

&lt;span class="nl"&gt;repl.run&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    iex &lt;span class="nt"&gt;-S&lt;/span&gt; mix phx.server

&lt;span class="nl"&gt;repl.test&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    iex &lt;span class="nt"&gt;-S&lt;/span&gt; mix test.watch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most of these Mix subcommands are provided by Phoenix, so they work for any Phoenix project you adopt it, with two exceptions: &lt;code&gt;test.watch&lt;/code&gt; and &lt;code&gt;repl.test&lt;/code&gt;. Both assume that you're using &lt;a href="https://hex.pm/packages/mix_test_watch" rel="noopener noreferrer"&gt;mix_test_watch&lt;/a&gt; to run tests every time a change in the source code is made. Everything else is pretty much bare Phoenix subcommands.&lt;/p&gt;

&lt;p&gt;That's it. An autocompletion-powered CLI wrapper to work with Phoenix. Now you can type &lt;code&gt;make&lt;/code&gt;, hit &lt;code&gt;Tab&lt;/code&gt; (once or twice, depending on how your shell is configured), and get autocompletions for the most important tasks of your project.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>elixir</category>
      <category>phoenix</category>
      <category>makefile</category>
    </item>
    <item>
      <title>Makefiles: a standard for project tasks</title>
      <dc:creator>Joel Jucá</dc:creator>
      <pubDate>Sat, 13 May 2023 16:57:20 +0000</pubDate>
      <link>https://dev.to/joeljuca/makefiles-a-standard-for-project-tasks-31b</link>
      <guid>https://dev.to/joeljuca/makefiles-a-standard-for-project-tasks-31b</guid>
      <description>&lt;p&gt;I've been using Makefiles to create a standard CLI interface for all my projects, no matter what programming language and/or frameworks I'm using.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Make_(software)#Makefiles" rel="noopener noreferrer"&gt;Makefiles&lt;/a&gt; are configuration files for &lt;a href="https://www.gnu.org/software/make/" rel="noopener noreferrer"&gt;GNU Make&lt;/a&gt; that define &lt;code&gt;make&lt;/code&gt; tasks for a project (eg.: &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, etc.).&lt;/p&gt;

&lt;p&gt;I have projects in Bash, Elixir, Python, JavaScript, etc., and each of these requires different commands to build, test, run, etc., so I've been using Makefiles to standardize how I run these tasks.&lt;/p&gt;

&lt;p&gt;Below is a basic &lt;code&gt;Makefile&lt;/code&gt; template I've been using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.PHONY: build run test

build:    
    # here goes the command(s) to build the project

run:
    # here goes the command(s) to run the project

test:
    # here goes the command(s) to test the project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your project deals with databases, no matter which one (Postgres, MySQL, SQLite, etc.), you might want to include these tasks too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.PHONY: db.setup db.reset db.create db.migrate db.seed db.drop

db.setup:
    make db.create \
    &amp;amp;&amp;amp; make db.migrate \
    &amp;amp;&amp;amp; make db.seed

db.reset:
    make db.drop \
    &amp;amp;&amp;amp; make db.setup

db.create:
    # here goes the command(s) to create the database

db.migrate:
    # here goes the command(s) to migrate the database

db.seed:
    # here goes the command(s) to seed the database

db.drop:
    # here goes the command(s) to drop the database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way your projects can have a "standard CLI interface" for common tasks like building, testing, running, or common database operations like creating and dropping, migrating the schema, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  A bit of historical context from GNU Make
&lt;/h2&gt;

&lt;p&gt;Historically speaking, &lt;code&gt;make&lt;/code&gt; was used to build files, which often meant compiling source code. Each task was actually a group of commands needed to build a given file if it wasn't present. If the file were in place, the commands wouldn't be executed.&lt;/p&gt;

&lt;p&gt;Imagine a JavaScript project that has the following files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;api-sdk.js&lt;/code&gt; (functions to use the back-end APIs)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;utils.js&lt;/code&gt; (general utility functions)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;app.js&lt;/code&gt; (the main web app code: routes, pages, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In webdev, it's a common practice to bundle JS files before deploying them to production, so users get to download fewer files, etc., so this project's &lt;code&gt;Makefile&lt;/code&gt; could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bundle.js:
    cat utils.js api-sdk.js app.js &amp;gt; bundle.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands would concatenate all JS source code in these files into one &lt;code&gt;bundle.js&lt;/code&gt;. So, this file could be built with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ make bundle.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the file is absent, Make will run commands to generate it. But then, if you tried to run this command a second time, you would see the following result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ make bundle.js
make: `bundle.js' is up to date.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No errors, just this message – but no commands were executed. That's because, by default, Make builds files, and if these are present there's no need to build them again.&lt;/p&gt;

&lt;p&gt;However, it's possible to remove this dependency of a file's absence by using the &lt;code&gt;.PHONY&lt;/code&gt; special target. You basically add all tasks not tied to a file presence or absence, separated by spaces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.PHONY: bundle.js

bundle.js:
    cat utils.js api-sdk.js app.js &amp;gt; bundle.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way, Make would consistently execute the following commands when &lt;code&gt;make bundle.js&lt;/code&gt; is run, no matter if &lt;code&gt;bundle.js&lt;/code&gt; already exists or not. It might be useful during development, for instance, to rebuild the file with updated content!&lt;/p&gt;

&lt;p&gt;So, the &lt;code&gt;.PHONY&lt;/code&gt; special target is generally something you want to use. Just keep it somewhere in your &lt;code&gt;Makefile&lt;/code&gt; with a list of all your Make tasks that are file-independent, and it should be good to go!&lt;/p&gt;

</description>
      <category>cli</category>
      <category>programming</category>
    </item>
    <item>
      <title>TIL: Python virtual environments and venv</title>
      <dc:creator>Joel Jucá</dc:creator>
      <pubDate>Fri, 03 Feb 2023 21:31:58 +0000</pubDate>
      <link>https://dev.to/joeljuca/til-python-virtual-environments-and-venv-c8e</link>
      <guid>https://dev.to/joeljuca/til-python-virtual-environments-and-venv-c8e</guid>
      <description>&lt;p&gt;I'm learning Python. The reason is, well, Python is the lingua franca of the Data Science world, and I intend to work with it, eventually. I'm also an old school programmer, so I'm not convinced that "just use X" is the right approach. I refuse to just rely on a Jupyter notebook like Google Collab, etc., so I got to work with Python in real world (which means CLI, Python packages/dependencies, and virtual environments).&lt;/p&gt;

&lt;p&gt;At first sight, virtual environments were super confusing! The name "virtual environment" doesn't help understanding what it is. Plus, there are so many ways to set up virtual environments that I was quite lost between all the names and projects, libraries and techniques, etc. Yeah, there was some friction to truly understand it – and I'm still on my way to learn it all.&lt;/p&gt;

&lt;p&gt;With it said, I'm sticking with Python's built-in virtual environment tool for now, &lt;a href="https://docs.python.org/3/library/venv.html" rel="noopener noreferrer"&gt;venv&lt;/a&gt;. So the rest of this post assumes venv is being used to work with virtual environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  WTF are virtual environments anyway?
&lt;/h2&gt;

&lt;p&gt;So far, a virtual environment seem to be a command-line trick to isolate a project from each other. The Python packaging doesn't seem to assume the concept of local package installation (eg.: Node.js' node_modules), it keeps packages into either a global, system-wide scope, or a local, user-wide scope (each system user ending up with its own set of Python package installs).&lt;/p&gt;

&lt;p&gt;The problem is that to work on multiple Python projects using your own OS user, you would have conflicts with package versions, just like how you would with a global package scope. :(&lt;/p&gt;

&lt;p&gt;So, virtual environments solve this issue. It tricks both Python and pip to install and load packages into a local directory (aka.: your project's directory) instead of global-wide or user-wide directories. It allows you to work on different projects with the same dependencies but different versions without conflicts.&lt;/p&gt;

&lt;p&gt;That's it. A quite common approach of pretty much any modern programming language today.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use venv
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.python.org/3/library/venv.html" rel="noopener noreferrer"&gt;venv&lt;/a&gt; is a built-in Python module that does exactly this: manage virtual environments. It is a subset of &lt;a href="https://pypi.org/project/virtualenv/" rel="noopener noreferrer"&gt;virtualenv&lt;/a&gt;, a Python module that used to be the standard way to set up virtual environments but now compete with other options, like venv.&lt;/p&gt;

&lt;p&gt;Using it is really very simple. venv is built-in, so you don't even need to install it, it's already available for you if you're using Python v3.3 or newer.&lt;/p&gt;

&lt;p&gt;To create a virtual environment, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will create a virtual environment into the &lt;code&gt;.venv&lt;/code&gt; directory. You can name it however you like – but &lt;code&gt;.venv&lt;/code&gt; seems to be a popular choice, so I'm sticking to it.&lt;/p&gt;

&lt;p&gt;Then, in order to use it, you must &lt;em&gt;activate&lt;/em&gt; it first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's the magic. When you activate the virtual environment, it will trick &lt;code&gt;python&lt;/code&gt;, &lt;code&gt;python3&lt;/code&gt;, &lt;code&gt;pip&lt;/code&gt;, and &lt;code&gt;pip3&lt;/code&gt; to install and load packages from/to &lt;code&gt;.venv&lt;/code&gt;. So, each project will have this separation of dependencies. :-)&lt;/p&gt;

&lt;p&gt;After you've activated your virtual environment, you can install your local, project-specific dependencies with pip, possibly with the help of a &lt;code&gt;requirements.txt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip3 &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And when you're done working with this project for the day, you can deactivate (exit from) the virtual environment with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deactivate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  TILs
&lt;/h2&gt;

&lt;p&gt;venv is quite easy to use and work with. It does not isolate runtime versions, though. It seem there are some other projects to do it, but I didn't get to them just yet.&lt;/p&gt;

&lt;p&gt;Also, there were a few things that really confused me along the way. For instance, Python literacy talks about virtual environments as something that "isolates Python projects with everything – including Python, pip, etc.", and from it I understood that it somehow could embed a specific Python runtime too. After reading a ton of things online, discussing with people in IRC and Telegram chats, I finally understood that venv does not embed specific Python runtime versions, just dependencies.&lt;/p&gt;

&lt;p&gt;The next thing I want to try is virtualenv, which seem more feature-rich. I'll post my findings here.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Test your SSH-based Git auth</title>
      <dc:creator>Joel Jucá</dc:creator>
      <pubDate>Mon, 31 Oct 2022 22:22:34 +0000</pubDate>
      <link>https://dev.to/joeljuca/test-your-ssh-based-git-auth-48oh</link>
      <guid>https://dev.to/joeljuca/test-your-ssh-based-git-auth-48oh</guid>
      <description>&lt;p&gt;A small trick I've always used but I realized it might not be a well-known thing.&lt;/p&gt;

&lt;p&gt;It is possible to test your authentication against a Git service over SSH with a very simple command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-T&lt;/span&gt; git@your-git-service.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Pretty simple, right!? I do it all the time, to test if my SSH key is properly configured on a given Git service (GitHub, Gitea, sourcehut, etc.)&lt;/p&gt;

&lt;p&gt;I'll put here some examples for popular Git services, so you can test it easily:&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ssh -T git@github.com
Hi joeljuca! You've successfully authenticated, but GitHub does not provide shell access.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  GitLab
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -T git@gitlab.com
Welcome to GitLab, @joeljuca!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bitbucket
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -T git@bitbucket.org
authenticated via ssh key.

You can use git to connect to Bitbucket. Shell access is disabled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Gitea
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -T git@gitea.com
Hi there, joeljuca! You've successfully authenticated with the key named [key name here], but Gitea does not provide shell access.
If this is unexpected, please log in with password and setup Gitea under another user.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  sourcehut
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -T git@git.sr.ht
Hi joeljuca! You've successfully authenticated, but I do not provide an interactive shell. Bye!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it :) just a small Git/SSH trick for today. I hope it saves you some seconds when you're about to test your SSH-based Git authentication again!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pro-tip: you can use the verbose mode to look way more hackish if you're testing the authentication in front of your girlfriend. 😂 Try running &lt;code&gt;ssh -Tv&lt;/code&gt; instead of &lt;code&gt;ssh -T&lt;/code&gt;. 😉&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>tutorial</category>
      <category>git</category>
    </item>
    <item>
      <title>Introducing .iex.local.exs</title>
      <dc:creator>Joel Jucá</dc:creator>
      <pubDate>Wed, 07 Apr 2021 05:42:02 +0000</pubDate>
      <link>https://dev.to/joeljuca/introducing-iex-local-exs-2bfk</link>
      <guid>https://dev.to/joeljuca/introducing-iex-local-exs-2bfk</guid>
      <description>&lt;p&gt;I love command-line interfaces! And, I like to customize my CLI experience as well. Either it being one-character-long aliases, utility functions, or just preloading some data into helper variables, my shell is always customized to some extend.&lt;/p&gt;

&lt;p&gt;When I'm working with Elixir, I use IEx, which in turn allows you to customize itself through &lt;code&gt;.iex.exs&lt;/code&gt; files. I truly love it! However, if I'm working on a team with other developers and they do like to do the same, we'll be in trouble. If this &lt;code&gt;.iex.exs&lt;/code&gt; file is being controlled by Git, we'll both have the exact same customizations (and it won't be customizations anymore).&lt;/p&gt;

&lt;p&gt;This week I wrote a solution that's so simple I decided to share.&lt;/p&gt;

&lt;h2&gt;
  
  
  Behold &lt;code&gt;.iex.local.exs&lt;/code&gt;!
&lt;/h2&gt;

&lt;p&gt;OK, I'm being a bit extravagant here. 😂 The idea behind this &lt;code&gt;.iex.local.exs&lt;/code&gt; file is: any team-wide IEx customization goes on &lt;code&gt;.iex.exs&lt;/code&gt; directly (e.g.: customizations that you as a team agreed to use), and anything too personal to be team-wide goes on &lt;code&gt;.iex.local.exs&lt;/code&gt;. Then, your &lt;code&gt;.iex.exs&lt;/code&gt; file will end with the command below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Local dot-iex file (user/environment-specific, Git-ignored)&lt;/span&gt;
&lt;span class="n"&gt;import_file_if_available&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;".iex.local.exs"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file &lt;code&gt;.iex.local.exs&lt;/code&gt; should be Git-ignored, so it will be entirely user/environment-specific. There you can create your own aliases, preload/prepopulate utility variables, provide utility functions, etc. You name it!&lt;/p&gt;

&lt;p&gt;How about you? What have you been doing/using to be more productive in your work?&lt;/p&gt;

</description>
      <category>elixir</category>
    </item>
    <item>
      <title>Pst! Hey, come here. I have LSD 😎</title>
      <dc:creator>Joel Jucá</dc:creator>
      <pubDate>Mon, 14 Dec 2020 15:11:55 +0000</pubDate>
      <link>https://dev.to/joeljuca/pst-hey-come-here-i-have-lsd-1jad</link>
      <guid>https://dev.to/joeljuca/pst-hey-come-here-i-have-lsd-1jad</guid>
      <description>&lt;p&gt;No, you didn't read it wrong. I'm here to tell you about LSD - how cool it is, how to use it, and how to incorporate some awesomeness in your life. Once you taste it, you'll never be the same anymore!&lt;/p&gt;

&lt;h2&gt;
  
  
  LSD? WTF?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Peltoche/lsd" rel="noopener noreferrer"&gt;LSD&lt;/a&gt; is a Rust-powered &lt;code&gt;ls&lt;/code&gt;-like command to list directories and files in your terminal. It works pretty much like &lt;code&gt;ls&lt;/code&gt; and can be used as a drop-in replacement, as most of the commonly used options are supported.&lt;/p&gt;

&lt;p&gt;The cool thing about LSD is that it improves the file/directory listing experience by cleverly coloring its output, showing some icons beside names, and also providing some interesting customization parameters.&lt;/p&gt;

&lt;p&gt;You can just use &lt;code&gt;lsd&lt;/code&gt; where you would normally use &lt;code&gt;ls&lt;/code&gt;. You could also alias &lt;code&gt;ls&lt;/code&gt; to &lt;code&gt;lsd&lt;/code&gt; and continue to use it as you normally would:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias ls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"lsd"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note: &lt;code&gt;ls&lt;/code&gt; contains far more options than LSD, and probably should be used when writing shell scripts. Otherwise, for daily work/routine commands, LSD should be safe enough.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My experience with LSD
&lt;/h2&gt;

&lt;p&gt;I've been using LSD for some days now and the experience is good. I feel the file icons and the relative dates help me a lot to find the exact file I'm looking for when I &lt;code&gt;ls&lt;/code&gt; somewhere.&lt;/p&gt;

&lt;p&gt;Here's my &lt;code&gt;~/.zshrc&lt;/code&gt; alias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias ls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"lsd --date=relative --group-dirs=first --size=short"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also wrapped this alias into a &lt;code&gt;which&lt;/code&gt; expression that checks if I have the &lt;code&gt;lsd&lt;/code&gt; binary available in my &lt;code&gt;$PATH&lt;/code&gt;, to avoid errors when using my &lt;code&gt;.zshrc&lt;/code&gt; in environments where LSD is not installed/available. So my &lt;code&gt;alias&lt;/code&gt; became like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# https://github.com/Peltoche/lsd&lt;/span&gt;
which lsd &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null 2&amp;gt;&amp;amp;1 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;alias ls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"lsd --date=relative --group-dirs=first --size=short"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using LSD
&lt;/h2&gt;

&lt;p&gt;Using LSD is literally the same as using &lt;code&gt;ls&lt;/code&gt;. I'll avoid placing installation instructions here as it might become outdated.&lt;/p&gt;

&lt;p&gt;The LSD home page is &lt;a href="https://github.com/Peltoche/lsd" rel="noopener noreferrer"&gt;https://github.com/Peltoche/lsd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As of today, the latest LSD version is 0.19.0. You can check all its optional parameters through &lt;code&gt;--help&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ lsd --help
lsd 0.19.0
An ls command with a lot of pretty colors and some other stuff.

USAGE:
    lsd [FLAGS] [OPTIONS] [--] [FILE]...

FLAGS:
    -a, --all               Do not ignore entries starting with .
    -A, --almost-all        Do not list implied . and ..
        --classic           Enable classic mode (no colors or icons)
    -L, --dereference       When showing file information for a symbolic link, show information for the file the link references rather than for the link itself
    -d, --directory-only    Display directories themselves, and not their contents (recursively when used with --tree)
    -X, --extensionsort     Sort by file extension
        --help              Prints help information
    -h, --human-readable    For ls compatibility purposes ONLY, currently set by default
        --ignore-config     Ignore the configuration file
    -F, --classify          Append indicator (one of */=&amp;gt;@|) at the end of the file names
    -i, --inode             Display the index number of each file
    -l, --long              Display extended file metadata as a table
        --no-symlink        Do not display symlink target
    -1, --oneline           Display one entry per line
    -R, --recursive         Recurse into directories
    -r, --reverse           Reverse the order of the sort
    -S, --sizesort          Sort by size
    -t, --timesort          Sort by time modified
        --total-size        Display the total size of directories
        --tree              Recurse into directories and present the result as a tree
    -V, --version           Prints version information
    -v, --versionsort       Natural sort of (version) numbers within text

OPTIONS:
        --blocks &amp;lt;blocks&amp;gt;...            Specify the blocks that will be displayed and in what order [possible values: permission, user, group, size, date, name, inode]
        --color &amp;lt;color&amp;gt;...              When to use terminal colours [default: auto]  [possible values: always, auto, never]
        --date &amp;lt;date&amp;gt;...                How to display date [possible values: date, relative, +date-time-format] [default: date]
        --depth &amp;lt;num&amp;gt;...                Stop recursing into directories after reaching specified depth
        --group-dirs &amp;lt;group-dirs&amp;gt;...    Sort the directories then the files [default: none]  [possible values: none, first, last]
        --icon &amp;lt;icon&amp;gt;...                When to print the icons [default: auto]  [possible values: always, auto, never]
        --icon-theme &amp;lt;icon-theme&amp;gt;...    Whether to use fancy or unicode icons [default: fancy]  [possible values: fancy, unicode]
    -I, --ignore-glob &amp;lt;pattern&amp;gt;...      Do not display files/directories with names matching the glob pattern(s). More than one can be specified by repeating the argument [default: ]
        --size &amp;lt;size&amp;gt;...                How to display size [default: default]  [possible values: default, short, bytes]
        --sort &amp;lt;WORD&amp;gt;...                sort by WORD instead of name [possible values: size, time, version, extension]

ARGS:
    &amp;lt;FILE&amp;gt;...     [default: .]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you use LSD and enjoy it, let me know how awesome it is for you in the comments below. 😉&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The ES6 in Depth Challenge</title>
      <dc:creator>Joel Jucá</dc:creator>
      <pubDate>Mon, 21 Sep 2020 11:04:38 +0000</pubDate>
      <link>https://dev.to/joeljuca/the-es6-in-depth-challenge-l8f</link>
      <guid>https://dev.to/joeljuca/the-es6-in-depth-challenge-l8f</guid>
      <description>&lt;p&gt;Mozilla (the creators of Firefox and MDN) has this interesting blog called Mozilla Hacks where they post interesting advanced tricks with Web technologies. In April of 2015, they started a &lt;a href="https://hacks.mozilla.org/category/es6-in-depth/" rel="noopener noreferrer"&gt;series of blog posts entitled &lt;em&gt;ES6 in Depth&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It's basically a list of articles, one for each JS feature coming on ES6: let and const, classes, for-of and iterators, modules, etc., with a decent dive into the details. It's a great way to learn post-2015 modern JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenge Time!
&lt;/h2&gt;

&lt;p&gt;The challenge is simple: &lt;strong&gt;read one ES6 in Depth article every two days.&lt;/strong&gt; You'll read the article and spend two days understanding and using it, incorporating it into your toolbelt, and making yourself familiar with it. Then, on the third day, read the next article and start over again - until you read them all.&lt;/p&gt;

&lt;p&gt;It's a series of 17 blog posts - being 15 about features, an introduction, and a final post. Spend two days on each feature article and you'll finish it in one month. After that, you'll know and have experienced much of today's JS, definitely leveling up your career as a developer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rules
&lt;/h3&gt;

&lt;p&gt;In order to make the best out of this experience, you'll follow the rules below:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#1 Don't rush&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The challenge is about absorbing knowledge and some experience. It takes time, often way more than two days. So don't rush. Becoming a better developer takes time, so give yourself time to think about how these features can help you to write better code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#2 Don't give up&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you miss a day or two for some important reason, don't give up. Reorganize your daily routine and move on. Start the cycle again the next day and keep going until you read all articles.&lt;/p&gt;

&lt;p&gt;Don't be sorry if you're falling behind, don't get distracted, don't give a chance to bad feelings.&lt;/p&gt;

&lt;p&gt;Accomplishing things is hard, so if you fall on this road, you get up and keep going. Once you finish all the articles you'll feel great for accomplishing it, and better: you'll profit from this knowledge for the rest of your career.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;# Keep a log&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Write down the things that you're learning somewhere. It can be a note-taking app, a blog, email drafts, whatever. Writing will help you digest knowledge much better than just reading, so write down what you've learned, along with examples, ideas, notes, snippets, etc.&lt;/p&gt;

&lt;p&gt;These writings might become your own blog posts in the future. :-)&lt;/p&gt;

&lt;p&gt;🙂&lt;/p&gt;

&lt;p&gt;Do you think that challenges like this one can inspire and motivate you to learn something? Let me know how useful it is for you in the discussions below!&lt;/p&gt;

&lt;p&gt;I'm always on Twitter as &lt;a href="https://twitter.com/holyshtjoe" rel="noopener noreferrer"&gt;@holyshtjoe&lt;/a&gt;. If you want to discuss programming, you know how to find me. 😉&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>git standup</title>
      <dc:creator>Joel Jucá</dc:creator>
      <pubDate>Wed, 16 Sep 2020 18:46:19 +0000</pubDate>
      <link>https://dev.to/joeljuca/git-standup-25gm</link>
      <guid>https://dev.to/joeljuca/git-standup-25gm</guid>
      <description>&lt;p&gt;It's Daily Standup time and there you are: unsure about what you did since yesterday - not because you did nothing but because you &lt;strong&gt;forget things easily.&lt;/strong&gt; 😂&lt;/p&gt;

&lt;p&gt;Yeah, the person here is me, and I often can't answer quickly when I'm asked &lt;em&gt;"What have you done today?"&lt;/em&gt;. Well, fortunately, I'm a programmer who knows Git, and I made a command that quickly reminds me of what I've done since yesterday:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git standup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cool, right? Yeah, this is a &lt;a href="https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases" rel="noopener noreferrer"&gt;Git alias&lt;/a&gt;, a shortcut for a more complex Git command. Git aliases reside on a file named &lt;code&gt;.gitconfig&lt;/code&gt; in your home folder. To set up my own &lt;code&gt;git standup&lt;/code&gt; alias, I added the following line to &lt;code&gt;~/.gitconfig&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[alias]
  standup = log --all --since yesterday --author=joel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This aliased Git command will list all commits from all branches that have been made in the last 24 hours by an author that contains &lt;code&gt;joel&lt;/code&gt; somewhere on his name or email.&lt;/p&gt;

&lt;p&gt;You might want to change the author field with something unique to your name/email.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note: if you already have a &lt;code&gt;[alias]&lt;/code&gt; line on your &lt;code&gt;.gitconfig&lt;/code&gt; there's no need to add another one. Just make sure your &lt;code&gt;standup&lt;/code&gt; alias is placed after it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is it. After saving the file, you'll be able to use your alias as a Git subcommand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git standup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; since I tend to prefer shorter outputs, I empowered my &lt;code&gt;git standup&lt;/code&gt; with some additional flags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[alias]
standup = log --all --abbrev-commit --graph --pretty=oneline --since yesterday --author=joel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now my &lt;code&gt;git standup&lt;/code&gt; outputs something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git standup
7b2280e (origin/branch-123) I did something awesome here
7b2280e (branch-123) Here goes a hidden bug packed as a feature to production
15f61fa (refs/stash) WIP
433ed2b index on branch-456: e6f9335 This is another great commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;PS: if you're curious about how my &lt;code&gt;.gitconfig&lt;/code&gt; looks like, it's public on my GitHub. You can &lt;a href="https://github.com/joeljuca/dotfiles/blob/master/.gitconfig" rel="noopener noreferrer"&gt;check it here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;How about you? Do you have any Git trick that makes your life as a developer easier? Share it in the discussions below. 🙂&lt;/p&gt;

</description>
      <category>git</category>
      <category>agile</category>
    </item>
  </channel>
</rss>
