It’s been a while since our last update, so I wanted to share where things stand with Budgetwise.
Continue reading “Still Budgeting, Still Building”Zero-Sum budgeting with Double-Entry accounting
Here’s how double-entry accounting creates an effective budgeting system.
Continue reading “Zero-Sum budgeting with Double-Entry accounting”What I cannot create, I do not understand
I saw a post in Hacker News about Richard Feynman’s blackboard at the time of his death. The first comment mentions his motto: “What I cannot create, I do not understand.”
Continue reading “What I cannot create, I do not understand”Quick guide to convert a Python script into a CLI tool
Reading the Click’s documentation will bring you up to speed on what it can do, but I’m writing a quick list of steps I follow every time I need to make a quick CLI out of a Python script.
Continue reading “Quick guide to convert a Python script into a CLI tool”Python function to send a single Telegram bot message
This is my console.log equivalent when I need a quick observability implementation.
Usually, when you build a Telegram bot, you have to have a small server listening for updates.
Continue reading “Python function to send a single Telegram bot message”Deploy PostgREST to Dokku
Here is a list of steps to deploy a PostgREST instance to Dokku.
Create a new app.
dokku apps:create pgrest-myproject
Add a port mapping from 3000 (PostgREST container) to 80 (host).
dokku ports:add pgrest-myproject http:80:3000
Create a new PostgreSQL database using the dokku-postgres plugin and link it to our project.
dokku postgres:create pgrest-myproject
dokku posgres:link pgrest-myproject pgrest-myproject
A new environment variable will be created:
=====> pgrest-myproject
DATABASE_URL: postgres://postgres:alongpass@dokku-postgres-pgrest-myproject:5432/pgrest_myproject
But we need to define the same value in a variable named PGRST_DB_URI so PostgREST can access the database.
dokku config:set pgrest-myproject PGRST_DB_URI="postgres://postgres:alongpass@dokku-postgres-pgrest-myproject:5432/pgrest_myproject"
Pull and deploy the Docker image from dockerhub.
docker pull postgrest/postgrest:latest
docker tag postgrest/postgrest:latest dokku/postgrest:latest
dokku git:from-image pgrest-myproject dokku/postgrest:latest
Add a Let’s Encrypt TLS certificate with the Dokku letsencrypt plugin.
dokku letsencrypt:set pgrest-myproject email <your-email>
dokku letsencrypt:enable pgrest-myproject
Launch a simple HTTP Server in One Line of Python
I always google this snippet when I need it, so I will put it here for easier access.
python3 -m http.server 8080 -d ./public
Types of UUID
- v1: mac address + time + random
- v4: completely random
- v5: input + seed (consistent, derived from input)
- v7: time + random (distributed sortable ids)
Ubuntu Desktop personal setup
This is how I customize a clean Ubuntu install.
Essentials
First we install the essentials.
- curl
- vim
- fish shell
- tmux
- git
- xclip
sudo apt install curl vim fish tmux
SSH keys
ssh-keygen -t ed25519 -C "[email protected]"
Copy public key to paste as needed:
xclip -sel clip < ~/.ssh/id_ed25519.pub
Folder structure
Update the folder structure. Basically changing the defaults locations of folders like ~/Downloads and ~/Desktop.
Create new folders.
cd ~
mkdir work dl docs media tpl pub \
media/{music,books,pics,vids,screens,torrents}
Make Ubuntu use our new folders. Edit ~/.config/user-dirs.dir and update the file so it looks like this:
XDG_DESKTOP_DIR="$HOME/desk"
XDG_DOWNLOADS_DIR="$HOME/dl"
XDG_TEMPLATES_DIR="$HOME/tpl"
XDG_PUBLICSHARE_DIR="$HOME/pub"
XDG_DOCUMENTS_DIR="$HOME/docs"
XDG_MUSIC_DIR="$HOME/media/music"
XDG_PICTURES_DIR="$HOME/media/pics"
XDG_VIDEOS_DIR="$HOME/media/vids"
Fish configuration
Install Fisher.
Install z:
fisher install jethrokuan/z
Ubuntu configuration
Add Spanish:
- Settings
- Region & Language
- Input Sources
- Add Spanish
- Appearance
- Dark
- Dock
- Auto-hide the Dock: On
- Position on screen: Bottom
Install GNOME tweaks
sudo apt install gnome-tweaks
With GNOME Tweaks activate:
- Top Bar
- Activities Overview Hot Corner
- Battery Percentage
- Weekday
- Workspaces
- Static Workspaces
- Number of Workspaces: 5
- Workspaces span displays
- Static Workspaces
GNOME Terminal configuration
Download and install the Dracula theme for GNOME Terminal.
Restart your terminal to reflect the changes.
Tmux configuration
- Install tpm.
- Download and install the Dracula theme for Tmux.
Update ./config/tmux/tmux.conf:
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'dracula/tmux'
set -g @dracula-plugins 'git, network-ping, attached-clients, network-vpn, weather, time'
set -g @dracula-show-left-icon 'uwu'
run -b '~/.tmux/plugins/tpm/tpm'
Install Node
Install n:
curl -L https://git.io/n-install | bash
Install Python
Install pyenv using pyenv-installer.
Be sure to install the build environment dependencies:
- https://github.com/pyenv/pyenv/wiki#suggested-build-environment
Git commit messages
Each commit message consists of a header, a body, and a footer.
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
Header
The header is mandatory and the scope is optional.
Type
Must be one of the following:
feat: introduces a new feature to the codebasefix: patches a bug in your codebaserefactor: improves the code without changing functionalityBREAKING CHANGE: major version
Additional types:
build: a change that affects the build system or external dependencieschore: same asbuildbutchoreis preferred, also any change that doesn’t fit in any other typeci: changes to the CI configurationdocs: changes to the documentationstyle: white-space, formatting, semi-colons, etc.perf: performance improvementstest: adding or fixing
Scope
The scope can be empty. Scope can be any of these:
- category, part or section of the codebase we are affecting, e.g.:
api,client,tooling - a specific package, library or dependency,e.g.:
moment.js,requests - a ticket number in case the current commit doesn’t close it, e.g.:
chore(123): update dependencies
Subject
Short (50 chars or less) summary of the change:
- use the imperative, present tense: “change” not “changed”
- don’t capitalize the first letter
- no dot (.) at the end
Footer
The footer should contain a closing reference to an issue if any and breaking changes.
Closes #123, #345
BREAKING CHANGE:
IE6 not supported anymore.
Semantic versioning
Conventional commits are designed to work with Semantic versioning.
feat: minor versionfix: patch versionBREAKING CHANGE: major version
Examples
Add a new feature without breaking existing functionality. This bumps a minor version, e.g.: 1.2.0 to 1.3.0.
feat: add search for transactions
Add new React component for searching transactions with autocompletion.
Include tests.
Closes #123, #234
Fix a bug. This bumps a patch version, e.g.: 1.3.0 to 1.3.1.
bug(api): add correct status code for existing resources
We return `409` when trying to create a user with an existing email.
Closes #453
Add new feature that breaks existing functionality. This bumps a major version, e.g.: 1.3.1 to 2.0.0.
feat!: add bank sync
This replace CSV import and use Plaid to connect to people's banks.
Closes #423, #424, #425
BREAKING CHANGE:
People won't be able to import transactions using CSV. Only Bank
Sync is available.
Resources
- Angular Commit Message Guidelines
- Do new features, updates, design use feat: in semantic commit message convention? (Stack Overflow)
- Karma commit message
- A Note About Git Commit Messages (Tim Pope)
- Semantic Commit Messages (Sparkbox)
- How can I write good Conventional Commit-style commit messages for one feature over multiple commits? (Stack Exchange)
- Conventional Commits