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

Compare commits

...

22 Commits

Author SHA1 Message Date
sandeep singh negi
2d82d3841d Merge cea4ffc0a3 into e3fc10edd8 2025-02-28 12:57:53 +09: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
jbranchaud
2b38e1caf8 Add SSH Into An ECS Container as an AWS TIL 2025-02-25 12:12:52 -06:00
jbranchaud
db6d18f086 Add Enforce Locals Passed To A Partial as a Rails TIL 2025-02-24 19:15:52 -06:00
jbranchaud
84548b7a7f Add List The PID And Name Of Current Shell Process as a Unix TIL 2025-02-23 10:12:52 -06:00
jbranchaud
f9b966a0f1 Add Use Specific AWS Profile With CLI as an AWS TIL 2025-02-23 09:57:30 -06:00
jbranchaud
871d555e95 Add Filter Blur Requires Expensive Calculation as a CSS TIL 2025-02-21 15:29:14 -06:00
jbranchaud
cea3bc05b5 Add Fix Previous Command With fc as a Unix TIL 2025-02-20 17:42:32 -06:00
jbranchaud
ee31f5b70d Add Find And Follow Server Logs as an AWS TIL 2025-02-19 09:00:35 -06:00
jbranchaud
5b6a88b327 Remove the amplify TOC item, no longer exists 2025-02-19 09:00:11 -06:00
jbranchaud
49ebb8dd78 Add A Better Way To Reload ZSH Configuration as a ZSH TIL 2025-02-18 17:06:35 -06:00
jbranchaud
6ff8f19d08 Add OpenStruct Has Bad Performance Characteristics as a Ruby TIL 2025-02-17 15:32:15 -06:00
jbranchaud
14e6635383 Add Fix Shim Path After asdf Upgrade as a Unix TIL 2025-02-17 10:31:58 -06:00
jbranchaud
0a0a509827 Link to groff in latest TIL 2025-02-17 09:52:06 -06:00
jbranchaud
bb331577ca Collapse Amplify category into the AWS category 2025-02-17 09:46:02 -06:00
jbranchaud
0e0dcbf2b4 Add AWS CLI Requires Groff Executable as an AWS TIL 2025-02-17 09:44:27 -06:00
jbranchaud
fe9b62a631 Add Prevent Containers From Running On Startup as a Docker TIL 2025-02-13 11:44:38 -06:00
sandeep singh negi
cea4ffc0a3 Update README.md 2021-03-27 23:24:13 +05:30
sandeep singh negi
b325522d06 Update README.md 2021-03-27 23:22:35 +05:30
sandeep singh negi
f9efe3174f Update README.md 2021-03-27 23:21:48 +05:30
15 changed files with 500 additions and 10 deletions

View File

@@ -2,28 +2,31 @@
> Today I Learned
A collection of concise write-ups on small things I learn day to day across a
variety of languages and technologies. These are things that don't really
A collection of concise write-ups on small things I learn day to day across a
variety of languages and technologies. These are things that don't
warrant a full blog post. These are things I've picked up by [Learning In
Public™](https://dev.to/jbranchaud/how-i-built-a-learning-machine-45k9) and
pairing with smart people at Hashrocket.
For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186).
_1589 TILs and counting..._
_1602 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
* [Ack](#ack)
* [Amplify](#amplify)
* [Ansible](#ansible)
* [Astro](#astro)
* [AWS](#aws)
* [Brew](#brew)
* [Chrome](#chrome)
* [Clojure](#clojure)
@@ -97,10 +100,6 @@ See some of the other learning resources I work on:
- [Case-Insensitive Search](ack/case-insensitive-search.md)
- [List Available File Types](ack/list-available-file-types.md)
### Amplify
- [Sign Up User With Email And Password](amplify/sign-up-user-with-email-and-password.md)
### Ansible
- [Loop Over A List Of Dictionaries](ansible/loop-over-a-list-of-dictionaries.md)
@@ -110,6 +109,14 @@ See some of the other learning resources I work on:
- [Generate Types For A Content Collection](astro/generate-types-for-a-content-collection.md)
- [Markdown Files Are Of Type MarkdownInstance](astro/markdown-files-are-of-type-markdown-instance.md)
### AWS
- [AWS CLI Requires Groff Executable](aws/aws-cli-requires-groff-executable.md)
- [Find And Follow Server Logs](aws/find-and-follow-server-logs.md)
- [Sign Up User With Email And Password](aws/sign-up-user-with-email-and-password.md)
- [SSH Into An ECS Container](aws/ssh-into-an-ecs-container.md)
- [Use Specific AWS Profile With CLI](aws/use-specific-aws-profile-with-cli.md)
### Brew
- [Configure Brew Environment Variables](brew/configure-brew-environment-variables.md)
@@ -176,6 +183,7 @@ See some of the other learning resources I work on:
- [Define HSL Colors With Alpha Values](css/define-hsl-colors-with-alpha-values.md)
- [Display Responsive iframe Maintaining Aspect Ratio](css/display-responsive-iframe-maintaining-aspect-ratio.md)
- [Dry Up SCSS With Mixins](css/dry-up-scss-with-mixins.md)
- [Filter Blur Requires Expensive Calculation](css/filter-blur-requires-expensive-calculation.md)
- [Give Elements The Same Width With Flexbox](css/give-elements-the-same-width-with-flexbox.md)
- [Let Pointer Events Pass Through An Element](css/let-pointer-events-pass-through-an-element.md)
- [Lighten And Darken With CSS Brightness Filter](css/lighten-and-darken-with-css-brightness-filter.md)
@@ -216,6 +224,7 @@ See some of the other learning resources I work on:
- [Configure Different Host And Container Ports](docker/configure-different-host-and-container-ports.md)
- [List Running Docker Containers](docker/list-running-docker-containers.md)
- [Prevent Containers From Running On Startup](docker/prevent-containers-from-running-on-startup.md)
- [Run A Basic PostgreSQL Server In Docker](docker/run-a-basic-postgresql-server-in-docker.md)
### Drizzle
@@ -947,6 +956,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)
@@ -955,8 +966,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)
@@ -999,6 +1009,7 @@ See some of the other learning resources I work on:
- [Different Ways To Add A Foreign Key Reference](rails/different-ways-to-add-a-foreign-key-reference.md)
- [Disambiguate Where In A Joined Relation](rails/disambiguate-where-in-a-joined-relation.md)
- [Empty find_by Returns First Record](rails/empty-find-by-returns-first-record.md)
- [Enforce Locals Passed To A Partial](rails/enforce-locals-passed-to-a-partial.md)
- [Ensure A Rake Task Cannot Write Data](rails/ensure-a-rake-task-cannot-write-data.md)
- [Ensure Migrations Use The Latest Schema](rails/ensure-migrations-use-the-latest-schema.md)
- [Ensure Record Saved With after_commit Callback](rails/ensure-record-saved-with-after-commit-callback.md)
@@ -1316,6 +1327,7 @@ See some of the other learning resources I work on:
- [Named Regex Captures Are Assigned To Variables](ruby/named-regex-captures-are-assigned-to-variables.md)
- [Navigate Back In The Browser With Capybara](ruby/navigate-back-in-the-browser-with-capybara.md)
- [Next And Previous Floats](ruby/next-and-previous-floats.md)
- [OpenStruct Has Bad Performance Characteristics](ruby/open-struct-has-bad-performance-characteristics.md)
- [Or Operator Precedence](ruby/or-operator-precedence.md)
- [Output Bytecode For A Ruby Program](ruby/output-bytecode-for-a-ruby-program.md)
- [Override The Initial Sequence Value](ruby/override-the-initial-sequence-value.md)
@@ -1528,6 +1540,8 @@ See some of the other learning resources I work on:
- [Find Newer Files](unix/find-newer-files.md)
- [Find Occurrences Of Multiple Values With Ripgrep](unix/find-occurrences-of-multiple-values-with-ripgrep.md)
- [Find Top-Level Directories Matching A Pattern](unix/find-top-level-directories-matching-a-pattern.md)
- [Fix Previous Command With fc](unix/fix-previous-command-with-fc.md)
- [Fix Shim Path After asdf Upgrade](unix/fix-shim-path-after-asdf-upgrade.md)
- [Fix Unlinked Node Binaries With asdf](unix/fix-unlinked-node-binaries-with-asdf.md)
- [Forward Multiple Ports Over SSH](unix/forward-multiple-ports-over-ssh.md)
- [Generate A SAML Key And Certificate Pair](unix/generate-a-saml-key-and-certificate-pair.md)
@@ -1567,6 +1581,7 @@ See some of the other learning resources I work on:
- [List Parent pid With ps](unix/list-parent-pid-with-ps.md)
- [List Stats For A File](unix/list-stats-for-a-file.md)
- [List The Available JDKs](unix/list-the-available-jdks.md)
- [List The PID And Name Of Current Shell Process](unix/list-the-pid-and-name-of-current-shell-process.md)
- [List The Stack Of Remembered Directories](unix/list-the-stack-of-remembered-directories.md)
- [List TXT DNS Records For A Domain](unix/list-txt-dns-records-for-a-domain.md)
- [Load Env Vars In Bash Script](unix/load-env-vars-in-bash-script.md)
@@ -1879,6 +1894,7 @@ See some of the other learning resources I work on:
### Zsh
- [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)
- [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,30 @@
# AWS CLI Requires Groff Executable
I have the AWS CLI installed on this machine, but when I went to run certain
commands like `aws logs tail my_log_group` or even `aws logs tail help`, I'd
get the following error:
```
$ aws logs tail help
Could not find executable named 'groff'
```
This may only be an issue on MacOS Ventura for older versions of the CLI, per
[this PR](https://github.com/aws/aws-cli/pull/7413):
> The CLI's help commands are currently broken on macOS Ventura because Ventura has replaced groff with mandoc. This PR fixes the issue by falling back on mandoc if groff doesn't exist in the path.
There are two ways of dealing with this. One would be to install the missing
dependency, [`groff`](https://www.gnu.org/software/groff/):
```bash
$ brew install groff
```
The other is to update the AWS CLI to one that falls back to `mandoc`.
Depending on how you originally installed the AWS CLI, you can either [follow
their official install/upgrade
instructions](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html),
`pip install --upgrade awscli`, or upgrade view homebrew (`brew upgrade
awscli`).

View File

@@ -0,0 +1,46 @@
# Find And Follow Server Logs
Let's say you are authenticated with the AWS CLI and have the appropriate
CloudWatch permissions. You have a few services running in production with
associated logs. One of those is a Rails server.
We want to run `aws logs tail`, but first we check how that command works.
```bash
$ aws logs tail help
```
We see a bunch of options, but the only required one is `group_name` ("The name
of the CloudWatch Logs group."). We may also notice the `--follow` flag which
we'll want to use as well to keep incoming logs flowing.
We need to determine the log group name for the Rails server. We can do that
from the CLI as well (no need to dig into the web UI).
```bash
$ aws logs describe-log-groups
{
"logGroups": [
{
"logGroupName": "/aws/codebuild/fc-rails-app-abcefg-123456",
"creationTime": 1739476650823,
"metricFilterCount": 0,
"arn": "arn:aws:logs:us-east-2:123456789:log-group:/aws/codebuild/fc-rails-app-abcefg-123456:*",
"storedBytes": 65617,
"logGroupClass": "STANDARD",
"logGroupArn": "arn:aws:logs:us-east-2:123456789:log-group:/aws/codebuild/fc-rails-app-abcefg-123456"
},
...
]
}
```
Because the group name is descriptive enough, we can find the log group we are
interested in: `/aws/codebuild/fc-rails-app-abcefg-123456`.
Now we know what we want to `tail`.
```bash
$ aws logs tail /aws/codebuild/fc-rails-app-abcefg-123456 --follow
```

View File

@@ -0,0 +1,50 @@
# SSH Into An ECS Container
In [Connect To Production Rails Console on AWS /
Flightcontrol](https://www.visualmode.dev/connect-to-production-rails-console-aws-flightcontrol),
I went into full detail about how to access `rails console` for a production
Rails app running in an ECS container.
A big part of that process was establishing an SSH connection to the ECS container.
To do that, I need to know my region, container ID, and task ID. I can get the
first two by listing my clusters and finding the cluster/container that houses
the Rails app.
```bash
$ aws ecs list-clusters
{
"clusterArns": [
"arn:aws:ecs:us-east-2:123:cluster/rails-app-abc123"
]
}
```
The region then is `us-east-2` and the container ID is `rails-app-abc123`.
I can use that to find the task ID:
```bash
$ aws ecs list-tasks --region us-east-2 --cluster rails-app-abc123
{
"taskArns": [
"arn:aws:ecs:us-east-2:123:task/rails-app-abc123/8526b3191d103bb1ff90c65a655ad004"
]
}
```
The task ID is the final portion of the URL:
`8526b3191d103bb1ff90c65a655ad004`.
Putting this all together I can SSH into the ECS container with a bash profile
like so:
```bash
$ aws ecs execute-command \
--region us-east-2 \
--cluster rails-app-abc123 \
--container rails-app-abc123 \
--task 8526b3191d103bb1ff90c65a655ad004 \
--interactive \
--command "/bin/bash"
```

View File

@@ -0,0 +1,37 @@
# Use Specific AWS Profile With CLI
I have multiple AWS profiles authenticated with the AWS CLI. For some projects
I need to use the `default` one and for others I need to use the other.
First, I can list the available profiles like so:
```bash
$ aws configure list-profiles
default
dev-my-app
```
For one-off commands I can specify the profile for any AWS CLI command using
the `--profile` flag.
```bash
$ aws ecs list-clusters --profile josh-visualmode
```
However, I don't want to have to specify that flag every time when I'm working
on a specific project. Instead I can specify the profile with an environment
variable. The [`direnv`](https://direnv.net/) tool is a great way to do this on
a per-project / per-directory basis.
I can create or update the `.envrc` file (assuming I have `direnv` installed)
adding the following line (and re-allowing the changed file):
```
# .envrc
export AWS_PROFILE=dev-my-app
```
Now, any AWS command I issue from that directory or its subdirectories will use
that profile by default.
[source](https://docs.aws.amazon.com/cli/v1/userguide/cli-configure-files.html#cli-configure-files-using-profiles)

View File

@@ -0,0 +1,29 @@
# Filter Blur Requires Expensive Calculation
I had [a
page](https://www.visualmode.dev/connect-to-production-rails-console-aws-flightcontrol)
on my blog that was experiencing some odd rendering behavior. The issue was
manifesting a couple ways.
- Resizing and scrolling were janky and causing entire page layers to re-render
causing the page to flash in and out.
- Sometimes entire layer chunks would fail to paint leaving a white block
missing from the page.
The issue was occurring with and without JavaScript turned on for a
statically-built page. I suspected that some aspect of the CSS was at fault.
I was going back and forth with Dillon Hafer about what the issue could be and
he wondered, "could it be the backdrop-blur class from tailwind?". I tried
removing that class and the responsiveness of the page immediately improved.
The [`filter:
blur`](https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/blur)
and [`backdrop-filter:
blur`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter) both
use an expensive [Gaussian blur](https://en.wikipedia.org/wiki/Gaussian_blur)
calculation. One of these on a modern machine and browser probably won't have a
noticable impact. However, a bunch of them, as in the case of my page with a
recurring component, can have quite the performance hit.
[source](https://github.com/tailwindlabs/tailwindcss/issues/15256)

View File

@@ -0,0 +1,53 @@
# Prevent Containers From Running On Startup
I have a bunch of docker containers managed by Docker Desktop. Some are related
to projects I'm actively working on. Whereas many others are inactive projects.
When I restart my machine, regardless of which containers I had running or
turned off, several of them are booted into a running state on startup. This is
becaue their restart policy is set to `always`. That's fine for the project I'm
actively working on, but the others I would like to be _off_ by default.
I need to update each of their restart policies from `always` to `no`.
First, I need to figure out their container IDs:
```bash
$ docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eb7b40aeba2d postgres:latest "docker-entrypoint.s…" 3 months ago Up 11 minutes 0.0.0.0:9875->5432/tcp still-postgres-1
eb9ab2213f2b postgres:latest "docker-entrypoint.s…" 3 months ago Exited (0) 11 minutes ago next-drizzle-migration-repro-app-postgres-1
ba792e185734 postgres:latest "docker-entrypoint.s…" 4 months ago Up 11 minutes 0.0.0.0:9876->5432/tcp better_reads-postgres-1
3139f9beae76 postgres:latest "docker-entrypoint.s…" 9 months ago Exited (128) 7 months ago basic-next-prisma-postgres-1
```
Referencing the `CONTAINER ID` and `NAMES` columns, I'm able to then inspect
each container and see the current `RestartPolicy`:
```bash
$ docker inspect eb9ab2213f2b | grep -A3 RestartPolicy
"RestartPolicy": {
"Name": "always",
"MaximumRetryCount": 0
},
```
I can then update the `RestartPolicy` to be `no`:
```bash
$ docker update --restart no eb9ab2213f2b
```
Inpsecting that container again, I can see the updated policy:
```bash
$ docker inspect eb9ab2213f2b | grep -A3 RestartPolicy
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
```
Rinse and repeat for each of the offending containers.
[source](https://stackoverflow.com/questions/45423334/stopping-docker-containers-from-being-there-on-startup)

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,42 @@
# Enforce Locals Passed To A Partial
I have a big form partial (`_form.html.erb`) that is rendered by several
different _new_ and _edit_ views. It's hard to tell at a glance, but the
partial requires that `blogmark` and `cancel_path` are included as locals when
it is rendered.
As of [Rails 7.1](https://github.com/rails/rails/pull/45602), we now have a
built-in way to enforce locals passed to a partial. We can add a magic comment
at the top of the partial that specifies the locals:
```ruby
<%# locals: (blogmark:, cancel_path:) -%>
<%= form_with(model: blogmark, local: true, class: "w-full max-w-3xl mb-8") do |form| %>
<% ... %>
<% end %>
```
This particular ERB magic comment declares that
[`blogmark`](https://still.visualmode.dev/blogmarks) and `cancel_path` are
required locals.
So, what happens if I have a `new.html.erb` view that looks like this:
```ruby
<h1>New Blogmark</h1>
<%= render 'blogmarks/form', blogmark: @blogmark %>
```
When I try to view the page, an error is raised:
```
Showing /Some/path/app/views/blogmarks/_form.html.erb where line # raised:
missing local: :cancel_path for app/views/blogmarks/_form.html.erb
```
Updating the `render` statement to include a `cancel_path` local fixes the
issue.
[source](https://gorails.com/episodes/template-locals-in-rails-7-1)

View File

@@ -0,0 +1,32 @@
# OpenStruct Has Bad Performance Characteristics
The Ruby docs for `OpenStruct` have a [_Caveats_
section](https://ruby-doc.org/3.4.1/stdlibs/ostruct/OpenStruct.html#class-OpenStruct-label-Caveats)
that warns about the poor performance characteristics of `OpenStruct` relative
to `Struct` and `Hash`.
> This should be a consideration if there is a concern about the performance of
> the objects that are created, as there is much more overhead in the setting
> of these properties compared to using a Hash or a Struct. Creating an open
> struct from a small Hash and accessing a few of the entries can be 200 times
> slower than accessing the hash directly.
This doesn't mean don't use `OpenStruct`, but do be aware of if you are using
it in a hot path or if you are allocating and processing tons of them.
If you turn on _Performance Warnings_ in Ruby, you'll see a warning message
when allocating an `OpenStruct`.
```ruby
> require 'ostruct'
=> true
> os1 = OpenStruct.new
=> #<OpenStruct>
> Warning[:performance] = true
=> true
> os2 = OpenStruct.new
(irb):6: warning: OpenStruct use is discouraged for performance reasons
=> #<OpenStruct>
```
[source](https://www.reddit.com/r/ruby/comments/1d54mwl/comment/l6jgn59/)

View File

@@ -0,0 +1,26 @@
# Fix Previous Command With fc
The `fc` command is a Bash and ZSH built-in command that allows you to interact
with the history of commands issued in the shell. The most straightforward use
case I know of for using this command is to fix or edit some aspect of the
previous run command.
When `fc` is executed with no arguments or flags, it will grab the latest entry
to the command history and load it into your default editor. For me, that is
Vim.
I can make edits in that Vim session like I'd do in any other Vim session. When
I write and quit (`:wq`) the file, the updated command will be executed. This
is useful if, say, I've made a typo in the previous command and would prefer
the ergonomics of my default editor to fix it. Or let's say I have a really
long command with many flags and long file path arguments. It would be much
easier and quicker to edit those paths from my editor than from the terminal
prompt.
If I've opened my editor (Vim) with `fc` and I decide I don't want to execute
the command after all, I can _compiler quit_ Vim (exit with an error code)
using `:cq`. The command will not be executed in this case.
See `man zshbuiltins` for more details about this command and all of its flags.
[source](https://www.computerhope.com/unix/uhistory.htm)

View File

@@ -0,0 +1,34 @@
# Fix Shim Path After asdf Upgrade
While doing [`brew install groff`](aws/aws-cli-requires-groff-executable.md),
Homebrew decided to upgrade every last thing it knows about on my machine,
including `asdf`.
`asdf` has undergone some big recent changes, including [a rewrite in
Go](https://stratus3d.com/blog/2025/02/03/asdf-has-been-rewritten-in-go/).
I noticed that `asdf` wasn't picking up my specified tool versions. I tried an
`asdf reshim`, but that didn't do the trick. Someone else wrote that [asdf
seems broken after homebrew
upgrade](https://braytonium.com/2023/01/09/asdf-seems-broken-after-homebrew-upgrade/)
which gave some hints and pointed me to some interesting GitHub issues.
Additionally, I noticed when opening a fresh terminal session the following error from `zsh`:
```bash
/Users/jbranchaud/.zshrc:.:225: no such file or directory: /usr/local/opt/asdf/libexec/asdf.sh
```
That directory and file is gone. So, how does `asdf` now want you to configure
its path with `zsh`? Revisiting their updated docs, I can see that the instead
of sourcing that shell script, we should now export shims to the path:
```bash
# . /usr/local/opt/asdf/libexec/asdf.sh
export PATH="${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH"
```
Updating my `.zshrc` to the above and then reloading did the trick. My tool
versions are registering now.
[source](https://asdf-vm.com/guide/getting-started.html#_2-configure-asdf)

View File

@@ -0,0 +1,27 @@
# List PID And Name Of Current Shell Process
In Julia Evans' [How to add a directory to your
PATH](https://jvns.ca/blog/2025/02/13/how-to-add-a-directory-to-your-path/),
she shows off an odd-looking command for determining what shell (e.g. bash or
zsh) you are currently running.
```bash
$ ps -p $$ -o pid=,comm=
38105 -zsh
```
I already know I'm running `zsh`, but I thought this command was interesting
enough to dig into and break down.
- The `ps` command lists processes that "have controlling terminals"
- The `$$` is a special shell variable representing the PID of the current process (try `echo $$`)
- The `-p` flag allows you to specify a PID for `ps` to grab, in this case, the `$$` PID
- The `-o` flag allows us to specify the output format, such as the PID and command name
- The `=` after `pid` and `comm` tell `ps` to exclude headers from the output
Additionally, I noticed that it output `-zsh` (not just `zsh`). That leading
hyphen seems to indicate that [this `zsh` process is a _login
shell_](https://unix.stackexchange.com/a/46856/5916). That means it was the
process used to initiate an interactive shell session and something like the
`.zprofile` would have been sourced as part of that.

View File

@@ -0,0 +1,35 @@
# A Better Way To Reload ZSH Configuration
I have an alias in my `~/.zshrc` that I set up to make it easy to "reload" my
ZSH configuration. This is handy if I'm iterating on some changes to my
`~/.zshrc` file and need verify them as I go.
```bash
alias reload='source ~/.zshrc'
```
With this alias, I can call `reload` from the terminal and the latest version
of my configuration (according to the `~/.zshrc` file) will be loaded for that
shell instance.
This has some downsides. It doesn't account for the other kinds of files that
contribute to your shell configuration (e.g. `~/.zprofile`) and it can lead to
duplicate values in your `PATH` and init scripts being run an additional time.
A better way is to use:
```bash
$ omz reload
```
This is [a wrapper call around `exec
zsh`](https://github.com/ohmyzsh/ohmyzsh/blob/master/lib/cli.zsh#L669-L677),
which restarts the `zsh` process. It also clears the completion cache.
I've since updated my `~/.zshrc` alias for `reload`:
```bash
alias reload='omz reload'
```
[source](https://batsov.com/articles/2022/09/15/reload-zsh-configuration/)