1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-08 17:48:01 +00:00

Compare commits

...

11 Commits

Author SHA1 Message Date
Karim Bouchez
8ebda94bc5 Merge 15337dfd71 into 497b0ff3b7 2025-03-05 15:29:50 +01:00
jbranchaud
497b0ff3b7 Add Files With Local Changes Cannot Be Removed as a Git TIL 2025-03-04 18:05:58 -06:00
jbranchaud
64df6d16d7 Add Find All Tool Version Files Containing Postgres as a Unix TIL 2025-03-04 17:41:03 -06:00
jbranchaud
7dac057246 Add List The Files Being Loaded By Mise as a Mise TIL 2025-03-04 09:24:27 -06:00
jbranchaud
8961c67026 Add Create Todo Items In Logseq as a Workflow TIL 2025-03-03 17:06:58 -06:00
jbranchaud
4ff24a7336 Add Restart Puma Server By Touching Restart File as a Rails TIL 2025-03-01 09:48:48 -06:00
jbranchaud
2916fbc3b5 Add Create And Jump Into A Directory as a Zsh TIL 2025-02-28 10:39:23 -06:00
jbranchaud
e3fc10edd8 Fix alphabetical ordering of Rails TILs 2025-02-26 16:53:08 -06:00
jbranchaud
4fe0817b2d Add Buy Me A Coffee Link to README 2025-02-26 16:52:32 -06:00
jbranchaud
fc74264040 Add Adjust The Production Log Level as a Rails TIL 2025-02-26 16:52:13 -06:00
Karim Bouchez
15337dfd71 Update the old way to capture a GitHub Actions output
See [here](https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/) for more explanations:
> We are monitoring telemetry for the usage of these commands and plan to fully disable them on 31st May 2023. Starting 1st June 2023 workflows using save-state or set-output commands via stdout will fail with an error.
2023-02-12 10:36:45 +01:00
9 changed files with 270 additions and 6 deletions

View File

@@ -10,12 +10,15 @@ pairing with smart people at Hashrocket.
For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186).
_1601 TILs and counting..._
_1608 TILs and counting..._
See some of the other learning resources I work on:
- [Ruby Operator Lookup](https://www.visualmode.dev/ruby-operators)
- [Vim Un-Alphabet](https://www.youtube.com/playlist?list=PL46-cKSxMYYCMpzXo6p0Cof8hJInYgohU)
If you've learned something here, support my efforts writing daily TILs by
[buying me a coffee](https://buymeacoffee.com/jbranchaud) 💜
---
### Categories
@@ -51,6 +54,7 @@ See some of the other learning resources I work on:
* [Linux](#linux)
* [LLM](#llm)
* [Mac](#mac)
* [Mise](#mise)
* [MongoDB](#mongodb)
* [MySQL](#mysql)
* [Neovim](#neovim)
@@ -323,6 +327,7 @@ See some of the other learning resources I work on:
- [Exclude A File From A Diff Output](git/exclude-a-file-from-a-diff-output.md)
- [Excluding Files Locally](git/excluding-files-locally.md)
- [Extend Git With Custom Commands](git/extend-git-with-custom-commands.md)
- [Files With Local Changes Cannot Be Removed](git/files-with-local-changes-cannot-be-removed.md)
- [Find And Remove Files That Match A Name](git/find-and-remove-files-that-match-a-name.md)
- [Find The Date That A File Was Added To The Repo](git/find-the-date-that-a-file-was-added-to-the-repo.md)
- [Find The Initial Commit](git/find-the-initial-commit.md)
@@ -683,6 +688,10 @@ See some of the other learning resources I work on:
- [View All Windows Of The Current App](mac/view-all-windows-of-the-current-app.md)
- [Write System Clipboard To A File](mac/write-system-clipboard-to-a-file.md)
### Mise
- [List The Files Being Loaded By Mise](mise/list-the-files-being-loaded-by-mise.md)
### MongoDB
- [Determine The Database Version](mongodb/determine-the-database-version.md)
@@ -953,6 +962,8 @@ See some of the other learning resources I work on:
### Rails
- [Access Secrets In A Rails 5.2 App](rails/access-secrets-in-a-rails-5-2-app.md)
- [ActiveRecord Query For This Or That](rails/active-record-query-for-this-or-that.md)
- [Add A Check Constraint To A Table](rails/add-a-check-constraint-to-a-table.md)
- [Add A Database Index If It Does Not Already Exist](rails/add-a-database-index-if-it-does-not-already-exist.md)
- [Add A Foreign Key Reference To A Table](rails/add-a-foreign-key-reference-to-a-table.md)
@@ -961,8 +972,7 @@ See some of the other learning resources I work on:
- [Add ActiveRecord Error Not Tied To Any Attribute](rails/add-activerecord-error-not-tied-to-any-attribute.md)
- [Add React With Webpacker To A New Rails App](rails/add-react-with-webpacker-to-a-new-rails-app.md)
- [Add timestamptz Columns With The Migration DSL](rails/add-timestamptz-columns-with-the-migration-dsl.md)
- [Access Secrets In A Rails 5.2 App](rails/access-secrets-in-a-rails-5-2-app.md)
- [ActiveRecord Query For This Or That](rails/active-record-query-for-this-or-that.md)
- [Adjust The Production Log Level](rails/adjust-the-production-log-level.md)
- [Advance The Date](rails/advance-the-date.md)
- [Allow Associations To Be Optional](rails/allow-associations-to-be-optional.md)
- [Allow List Params Anywhere With Strong Params](rails/allow-list-params-anywhere-with-strong-params.md)
@@ -1070,6 +1080,7 @@ See some of the other learning resources I work on:
- [Rescue From](rails/rescue-from.md)
- [Rescue From With A Separate Method](rails/rescue-from-with-a-separate-method.md)
- [Respond With JSON Regardless of Content Type](rails/respond-with-json-regardless-of-content-type.md)
- [Restart Puma Server By Touching Restart File](rails/restart-puma-server-by-touching-restart-file.md)
- [Retrieve An Object If It Exists](rails/retrieve-an-object-if-it-exists.md)
- [Rollback A Couple Migrations](rails/rollback-a-couple-migrations.md)
- [Rollback A Specific Migration Out Of Order](rails/rollback-a-specific-migration-out-of-order.md)
@@ -1529,6 +1540,7 @@ See some of the other learning resources I work on:
- [File Type Info With File](unix/file-type-info-with-file.md)
- [Find All Files Matching A Name With fd](unix/find-all-files-matching-a-name-with-fd.md)
- [Find All Files With A Specific Extension With fd](unix/find-all-files-with-a-specific-extension-with-fd.md)
- [Find All Tool Version Files Containing Postgres](unix/find-all-tool-version-files-containing-postgres.md)
- [Find Any Dotfiles That Modify Path Env Var](unix/find-any-dotfiles-that-modify-path-env-var.md)
- [Find A File Installed By Brew](unix/find-a-file-installed-by-brew.md)
- [Find Duplicate Lines In A File](unix/find-duplicate-lines-in-a-file.md)
@@ -1842,6 +1854,7 @@ See some of the other learning resources I work on:
- [Convert An ePub Document To PDF On Mac](workflow/convert-an-epub-document-to-pdf-on-mac.md)
- [Create A Local Sanity Dataset Backup](workflow/create-a-local-sanity-dataset-backup.md)
- [Create A Public URL For A Local Server](workflow/create-a-public-url-for-a-local-server.md)
- [Create Todo Items In Logseq](workflow/create-todo-items-in-logseq.md)
- [Enable Dev Tools For Safari](workflow/enable-dev-tools-for-safari.md)
- [Forward Stripe Events To Local Server](workflow/forward-stripe-events-to-local-server.md)
- [Get URL For GitHub User Profile Photo](workflow/get-url-for-github-user-profile-photo.md)
@@ -1892,6 +1905,7 @@ See some of the other learning resources I work on:
- [A Better Way To Reload ZSH Configuration](zsh/a-better-way-to-reload-zsh-configuration.md)
- [Add To The Path Via Path Array](zsh/add-to-the-path-via-path-array.md)
- [Create And Jump Into A Directory](zsh/create-and-jump-into-a-directory.md)
- [Link A Scalar To An Array](zsh/link-a-scalar-to-an-array.md)
- [Use A Space To Exclude Command From History](zsh/use-a-space-to-exclude-command-from-history.md)

View File

@@ -0,0 +1,26 @@
# Files With Local Changes Cannot Be Removed
This is a nice quality-of-life feature in `git` that should help you avoid
accidentally discarding changes that won't be retrievable.
```bash
git rm .tool-versions
error: the following file has local modifications:
.tool-versions
(use --cached to keep the file, or -f to force removal)
```
My `.tool-versions` file has some local changes. I don't realize that and I go
to issue a `git rm` command on that file. Instead of quietly wiping out my
changes, `git` lets me know I'm doing something destructive (these local
changes won't be in the diff or the reflog).
I can force the removal if I know what I'm doing with the `-f` flag. Or I can
take the two step approach of calling `git restore` on that file and then `git
rm`.
The `--cached` flag is also interesting because it doesn't actually delete the
file from my file system, but it does stage the file deletion with `git`. That
means the file now shows up as one of my untracked files.
See `man git-rm` for more details.

View File

@@ -23,11 +23,11 @@ version from my `.tool-versions` file with a step that uses `set-output`.
- name: Read Node.js version to install from `.tool-versions`
id: nodejs
run: >-
echo "::set-output name=NODE_VERSION::$(
echo "NODE_VERSION=$(
cat .tool-versions |
grep nodejs |
sed 's/nodejs \(.*\)$/\1/'
)"
)" >> $GITHUB_OUTPUT
```
`echo` runs the command in the string which sets `NODE_VERSION` as an output
@@ -45,4 +45,4 @@ This output value can be referenced in a later step.
`steps` has a reference to the `nodejs` step (note the `id` above) which then
has `outputs` like the `NODE_VERSION`.
[source](https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#using-workflow-commands-to-access-toolkit-functions)
[source](https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-output-parameter)

View File

@@ -0,0 +1,29 @@
# List The Files Being Loaded By Mise
While running `mise` for the first time, after adding a `mise.toml` file to a
project, I noticed something strange. Instead of invoking the command I had
specified (`mise run dev`), several parellel tool downloads were kicked off. In
addition to Ruby, it was installing an older version of Postgres, and lua. What
gives?
By running `mise cfg`, I can list all the files being loaded by `mise` and get
to the bottom of this.
```bash
mise cfg
Path Tools
~/.tool-versions node, ruby, postgres, lua
~/code/still/.ruby-version ruby
~/code/still/Gemfile (none)
~/code/still/.tool-versions ruby
~/code/still/mise.toml (none)
```
I was only thinking about the files local to my project and I forgot that I
have a system-wide `.tool-versions` file. As we can see from the output, that
file specifies `postgres` and `lua` as well. Mise wanted to ensure that it had
downloaded the specified versions of each of those tools before running my
task.
[source](https://mise.jdx.dev/configuration.html)

View File

@@ -0,0 +1,33 @@
# Adjust The Production Log Level
A Rails app by default takes on the `debug` log level. This is great for
development because it spits out a lot of information as you build and debug.
That's going to typically be a bit too noisy for a production environment
though. That is why Rails ships with the `config/environments/production.rb`
file configured to the `info` log level.
```ruby
# config/environments/production.rb
Rails.application.configure do
# ...
# "info" includes generic and useful information about system operation, but avoids logging too much
# information to avoid inadvertent exposure of personally identifiable information (PII). If you
# want to log everything, set the level to "debug".
config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info")
# ...
end
```
Sometimes, like when we're trying to track down some buggy behavior, we may
want to switch Rails from one log level to another. That's why it is configured
by the `RAILS_LOG_LEVEL` env var and otherwise falls back to `info`.
To, for example, switch production over to the `debug` log level, we'd first
change the `RAILS_LOG_LEVEL` env var to `debug`. Then we'd need to make sure
our Rails app is restarted so that the config change is picked up. Heroku's
`heroku config:set` will do that automatically. Depending on your setup, you
may need to manually restart your web server (e.g. Puma).

View File

@@ -0,0 +1,28 @@
# Restart Puma Server By Touching Restart File
Puma includes a plugin that allows us to restart the web server by touching the
`tmp/restart.txt` file.
In one terminal pane I have my Rails server running. In another terminal pane
from the Rails directory, where there exists a `tmp` folder, I run the
following command.
```bash
$ touch tmp/restart.txt
```
Then in the pane running the Rails server, I see the following after a second:
```
* Restarting...
=> Booting Puma
=> Rails 8.0.1 application starting in development
...
```
What is happening is that `touch` updates the modified time of that file, which
already exists in the `temp` directory. When the plugin notices (it checks
every 2 seconds) that the modified time is now fresher than the original
modified time when the plugin started, then it calls `launcher.restart`.
[source](https://github.com/puma/puma/blob/ca201ef69757f8830b636251b0af7a51270eb68a/lib/puma/plugin/tmp_restart.rb)

View File

@@ -0,0 +1,38 @@
# Find All Tool Version Files Containing Postgres
I've been using [`asdf`](https://asdf-vm.com/) for many years now which means I
have projects and directories all over my machine with `.tool-versions` files.
Many of them specify Ruby and Node versions. Some of them also include
PostgreSQL versions. I used to use `asdf` to manage Postgres versions, but no
longer do that for new or active projects.
I want to find all the places that a `.tool-versions` file declares `postgres`
as a tool. That way I can begin to clean up the left behind artifacts of
asdf-managed Postgres.
By combining [`fd`](https://github.com/sharkdp/fd) (a better `find`) and
[`rg`](https://github.com/BurntSushi/ripgrep) (a better `grep`), I'm able to
quickly track down the list of places.
```bash
$ fd --hidden .tool-versions ~/ | xargs rg postgres
/Users/jbranchaud/.local/state/nvim/undo/%Users%jbranchaud%.tool-versions: binary file matches (found "\0" byte around offset 9)
/Users/jbranchaud/code/fake-data/.tool-versions
2:postgres 13.1
/Users/jbranchaud/code/thirty_days/thirty_days_server/.tool-versions
1:postgres 13.1
/Users/jbranchaud/code/visualmode/.tool-versions
1:postgres 11.11
```
That first instance is a binary file as part of `nvim`'s undo history which I
can ignore. The other three are good results.
I tell the `fd` command to not exclude hidden files as it looks for all
occurrences of `.tool-versions` recursively from my home (`~/`) directory. I
then pipe that list of files to `xargs` which makes those filenames arguments
to the `rg postgres` command.

View File

@@ -0,0 +1,32 @@
# Create Todo Items In Logseq
Having used GitHub flavored markdown and tools like Roam Research and Obsidian,
I'm used to being able to add interactive todo items to a document with square
brackets, like so:
```
- [ ] Do this
- [ ] Do that
```
This exact syntax doesn't work in Logseq, but I've figured out two ways of
adding todo items.
First, you can access the todo syntax with a forward slash command. Type `/`
and then start typing `TODO`. It will show up as a top result. Hit enter and
you'll have a fresh todo item that you can add a description to.
Second, as the above hints at, we can get right to the todo syntax by typing
one of `TODO`, `NOW`, or `LATER` in all caps followed by a description. For
example:
```
TODO Send out invoices
NOW Reply to those emails
LATER Schedule that meeting
```
These will render as checkable boxes marked as either `TODO`, `NOW`, or
`LATER`, until they are checked off.
You can also search for blocks that match one of these three categories.

View File

@@ -0,0 +1,64 @@
# Create And Jump Into A Directory
[Oh My Zsh](https://github.com/ohmyzsh/ohmyzsh) defines a function `take` that
we can use to both create and `cd` into a directory. If the directory already
exists, it will simply `cd` into that directory.
```bash
~/code
take take-demo
~/code/take-demo
mkdir already-exists
~/code/take-demo
take already-exists
~/code/take-demo/already-exists
cd ..
~/code/take-demo
take one/two/three
~/code/take-demo/one/two/three
```
First `take` creates and `cd`s into `take-demo`. Then `take` only `cd`s into
`already-exists`. Then we see that `take` can create multiple levels of nested
directories.
With the help of `which` we can see how `take` is defined:
```bash
$ which take
take () {
if [[ $1 =~ ^(https?|ftp).*\.tar\.(gz|bz2|xz)$ ]]
then
takeurl "$1"
elif [[ $1 =~ ^([A-Za-z0-9]\+@|https?|git|ssh|ftps?|rsync).*\.git/?$ ]]
then
takegit "$1"
else
takedir "$@"
fi
}
```
We're not dealing with compressed files or git URLs, so we fall through to the
`else` block with invokes `takedir`.
```bash
$ which takedir
takedir () {
mkdir -p $@ && cd ${@:$#}
}
```
The `mkdir -p $@` is what allows it make new, nested directories and then we
`cd` to it. The `${@:$#}` is a way of [grabbing the last argument to the
function](https://stackoverflow.com/a/37601842/535590). This suggests that you
can pass multiple things to `take`, it will create all of them, and then `cd`
you into the last one.
[source](https://github.com/ohmyzsh/ohmyzsh/blob/master/lib/functions.zsh#L75-L85)