mirror of
https://github.com/jbranchaud/til
synced 2026-01-15 21:18:02 +00:00
Compare commits
11 Commits
d0c1ba0df0
...
65b39fa25a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
65b39fa25a | ||
|
|
db07125ba9 | ||
|
|
b6cf4ba0ad | ||
|
|
e4d695e465 | ||
|
|
5c9a3888fd | ||
|
|
22541826d6 | ||
|
|
b39ee94c90 | ||
|
|
efad7da916 | ||
|
|
ca3327bda3 | ||
|
|
5615da920f | ||
|
|
c60c63f554 |
14
README.md
14
README.md
@@ -10,7 +10,7 @@ pairing with smart people at Hashrocket.
|
||||
|
||||
For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186).
|
||||
|
||||
_1620 TILs and counting..._
|
||||
_1628 TILs and counting..._
|
||||
|
||||
See some of the other learning resources I work on:
|
||||
- [Ruby Operator Lookup](https://www.visualmode.dev/ruby-operators)
|
||||
@@ -114,8 +114,10 @@ If you've learned something here, support my efforts writing daily TILs by
|
||||
|
||||
- [AWS CLI Requires Groff Executable](aws/aws-cli-requires-groff-executable.md)
|
||||
- [Find And Follow Server Logs](aws/find-and-follow-server-logs.md)
|
||||
- [Output CLI Results In Different Formats](aws/output-cli-results-in-different-formats.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)
|
||||
- [Turn Off Output Pager For A Command](aws/turn-off-output-pager-for-a-command.md)
|
||||
- [Use Specific AWS Profile With CLI](aws/use-specific-aws-profile-with-cli.md)
|
||||
|
||||
### Brew
|
||||
@@ -136,6 +138,7 @@ If you've learned something here, support my efforts writing daily TILs by
|
||||
- [Navigate The Browser History With Vimium](chrome/navigate-the-browser-history-with-vimium.md)
|
||||
- [Pretty Print Tabular Data](chrome/pretty-print-tabular-data.md)
|
||||
- [Reference The Selected Node](chrome/reference-the-selected-node.md)
|
||||
- [Search Tabs With The Vimium Vomnibar](chrome/search-tabs-with-the-vimium-vomnibar.md)
|
||||
- [Selecting DOM Elements Faster Than Ever](chrome/selecting-dom-elements-faster-than-ever.md)
|
||||
- [Simulating Various Connection Speeds](chrome/simulating-various-connection-speeds.md)
|
||||
- [Toggle Device Mode](chrome/toggle-device-mode.md)
|
||||
@@ -205,7 +208,7 @@ If you've learned something here, support my efforts writing daily TILs by
|
||||
- [Aliasing An Ansible Host](devops/aliasing-an-ansible-host.md)
|
||||
- [Allow Cross-Origin Requests To Include Cookies](devops/allow-cross-origin-requests-to-include-cookies.md)
|
||||
- [Allow HTTPS Through Your UFW Firewall](devops/allow-https-through-your-ufw-firewall.md)
|
||||
- [Check For Cached Site Assocation File For iOS](devops/check-for-cached-site-association-file-for-ios.md)
|
||||
- [Check For Cached Site Association File For iOS](devops/check-for-cached-site-association-file-for-ios.md)
|
||||
- [Check The Status of All Services](devops/check-the-status-of-all-services.md)
|
||||
- [Check The Syntax Of nginx Files](devops/check-the-syntax-of-nginx-files.md)
|
||||
- [Connect To An RDS PostgreSQL Database](devops/connect-to-an-rds-postgresql-database.md)
|
||||
@@ -229,6 +232,7 @@ If you've learned something here, support my efforts writing daily TILs by
|
||||
- [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)
|
||||
- [Run SQL Script Against Postgres Container](docker/run-sql-script-against-postgres-container.md)
|
||||
|
||||
### Drizzle
|
||||
|
||||
@@ -793,7 +797,7 @@ If you've learned something here, support my efforts writing daily TILs by
|
||||
- [Check If Clusters Are Upgrade Compatible](postgres/check-if-clusters-are-upgrade-compatible.md)
|
||||
- [Check If The Local Server Is Running](postgres/check-if-the-local-server-is-running.md)
|
||||
- [Check If User Role Exists For Database](postgres/check-if-user-role-exists-for-database.md)
|
||||
- [Check Table For Any Oprhaned Records](postgres/check-table-for-any-orphaned-records.md)
|
||||
- [Check Table For Any Orphaned Records](postgres/check-table-for-any-orphaned-records.md)
|
||||
- [Checking Inequality](postgres/checking-inequality.md)
|
||||
- [Checking The Type Of A Value](postgres/checking-the-type-of-a-value.md)
|
||||
- [Clear The Screen In psql](postgres/clear-the-screen-in-psql.md)
|
||||
@@ -910,6 +914,7 @@ If you've learned something here, support my efforts writing daily TILs by
|
||||
- [Sets With The Values Command](postgres/sets-with-the-values-command.md)
|
||||
- [Shorthand Absolute Value Operator](postgres/shorthand-absolute-value-operator.md)
|
||||
- [Show All Versions Of An Operator](postgres/show-all-versions-of-an-operator.md)
|
||||
- [Show Reconstructed Constraints For A Table](postgres/show-reconstructed-constraints-for-a-table.md)
|
||||
- [Show The Hidden Queries Behind Backslash Commands](postgres/show-the-hidden-queries-behind-backslash-commands.md)
|
||||
- [Sleeping](postgres/sleeping.md)
|
||||
- [Special Math Operators](postgres/special-math-operators.md)
|
||||
@@ -1382,6 +1387,7 @@ If you've learned something here, support my efforts writing daily TILs by
|
||||
- [Set RVM Default Ruby](ruby/set-rvm-default-ruby.md)
|
||||
- [Shift The Month On A Date Object](ruby/shift-the-month-on-a-date-object.md)
|
||||
- [Show Public Methods With Pry](ruby/show-public-methods-with-pry.md)
|
||||
- [Show The Bundler Location Of An Installed Gem](ruby/show-the-bundler-location-of-an-installed-gem.md)
|
||||
- [Silence The Output Of A Ruby Statement In Pry](ruby/silence-the-output-of-a-ruby-statement-in-pry.md)
|
||||
- [Single And Double Quoted String Notation](ruby/single-and-double-quoted-string-notation.md)
|
||||
- [Skip Specific CVEs When Auditing Your Bundle](ruby/skip-specific-cves-when-auditing-your-bundle.md)
|
||||
@@ -1553,6 +1559,7 @@ If you've learned something here, support my efforts writing daily TILs by
|
||||
- [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 And Copy A Value From Large JSON Output](unix/find-and-copy-a-value-from-large-json-output.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)
|
||||
@@ -1729,6 +1736,7 @@ If you've learned something here, support my efforts writing daily TILs by
|
||||
- [Generate and Edit Rails Migration](vim/generate-and-edit-rails-migration.md)
|
||||
- [Get The pid Of The Session](vim/get-the-pid-of-the-session.md)
|
||||
- [Go Back To The Previous Window](vim/go-back-to-the-previous-window.md)
|
||||
- [Go To Beginning And End Of Line](vim/go-to-beginning-and-end-of-line.md)
|
||||
- [Go To File With Line Number](vim/go-to-file-with-line-number.md)
|
||||
- [Grepping Through The Vim Help Files](vim/grepping-through-the-vim-help-files.md)
|
||||
- [Head of File Name](vim/head-of-file-name.md)
|
||||
|
||||
49
aws/output-cli-results-in-different-formats.md
Normal file
49
aws/output-cli-results-in-different-formats.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# Output CLI Results In Different Formats
|
||||
|
||||
The AWS CLI can output the results of commands in three different formats.
|
||||
|
||||
- Text
|
||||
- JSON
|
||||
- Table
|
||||
|
||||
The _default_ output format for my AWS CLI is currently configured to `json`.
|
||||
|
||||
```bash
|
||||
$ aws configure get output
|
||||
json
|
||||
```
|
||||
|
||||
I can either accept the default or I can override it with the `--output` flag.
|
||||
|
||||
```bash
|
||||
$ aws rds describe-db-instances \
|
||||
--query 'DBInstances[*].Endpoint' \
|
||||
--no-cli-pager
|
||||
[
|
||||
{
|
||||
"Address": "fc-database-abcefg-ab1c23de.asdfgh4zxcvb.us-east-2.rds.amazonaws.com",
|
||||
"Port": 5432,
|
||||
"HostedZoneId": "A1BCDE2FG345H6"
|
||||
}
|
||||
]
|
||||
|
||||
$ aws rds describe-db-instances \
|
||||
--query 'DBInstances[*].Endpoint' \
|
||||
--no-cli-pager \
|
||||
--output table
|
||||
----------------------------------------------------------------------------------------------------
|
||||
| DescribeDBInstances |
|
||||
+-----------------------------------------------------------------------+-----------------+--------+
|
||||
| Address | HostedZoneId | Port |
|
||||
+-----------------------------------------------------------------------+-----------------+--------+
|
||||
| fc-database-abcefg-ab1c23de.asdfgh4zxcvb.us-east-2.rds.amazonaws.com | A1BCDE2FG345H6 | 5432 |
|
||||
+-----------------------------------------------------------------------+-----------------+--------+
|
||||
|
||||
$ aws rds describe-db-instances \
|
||||
--query 'DBInstances[*].Endpoint' \
|
||||
--no-cli-pager \
|
||||
--output text
|
||||
fc-database-abcefg-ab1c23de.asdfgh4zxcvb.us-east-2.rds.amazonaws.com A1BCDE2FG345H6 5432
|
||||
```
|
||||
|
||||
[source](https://docs.aws.amazon.com/cli/v1/userguide/cli-usage-output-format.html)
|
||||
38
aws/turn-off-output-pager-for-a-command.md
Normal file
38
aws/turn-off-output-pager-for-a-command.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# Turn Off Output Pager For A Command
|
||||
|
||||
It is not uncommon for an AWS CLI command to return a ton of output. When that
|
||||
happens, it is nice that the results end up in pager program (like `less`)
|
||||
where you can search and review them, copy a value of interest, and then exit.
|
||||
The pager prevents that wall of output from cluttering your terminal history.
|
||||
|
||||
However, sometimes I am running a command that I know is going to return a
|
||||
small result. I'd rather have the results go to stdout where I can see them in
|
||||
the terminal history rather than to an ephemeral pager.
|
||||
|
||||
For that situation I can tack on the `--no-cli-pager` flag.
|
||||
|
||||
```bash
|
||||
$ aws rds describe-db-instances \
|
||||
--query 'DBInstances[*].EngineVersion' \
|
||||
--output json \
|
||||
--no-cli-pager
|
||||
|
||||
[
|
||||
"13.15",
|
||||
"16.8"
|
||||
]
|
||||
```
|
||||
|
||||
Here I've asked the AWS CLI to tell me the engine versions of all my RDS
|
||||
Postgres databases. Because I know the results are only going to include a
|
||||
couple results for my couple of DBs, I'd like to skip the pager —
|
||||
`--no-cli-pager`.
|
||||
|
||||
Though I think it is better to do this on a case by case basis, it is also
|
||||
possible to turn off the pager via the CLI configuration file.
|
||||
|
||||
```bash
|
||||
$ aws configure set cli_pager ""
|
||||
```
|
||||
|
||||
[source](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-pagination.html#cli-usage-pagination-clientside)
|
||||
22
chrome/search-tabs-with-the-vimium-vomnibar.md
Normal file
22
chrome/search-tabs-with-the-vimium-vomnibar.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# Search Tabs With The Vimium Vomnibar
|
||||
|
||||
If you use Chrome like I do, then you eventually end up with several windows
|
||||
with dozens if not 100+ tabs open. It can start to get tedius with that many
|
||||
tabs to find and navigate to a given tab. Someone might suggest closing a few
|
||||
dozen tabs as a solution to this predicament. However, Vimium offers a solution
|
||||
that doesn't require I [_kill my
|
||||
darlings_](https://en.wiktionary.org/wiki/kill_one%27s_darlings).
|
||||
|
||||
The Vomnibar, a Vimium-powered search bar, can be summoned with `T` to only
|
||||
search through open tabs.
|
||||
|
||||
When I hit `T`, I see a text area (for refining the search) and then a bunch of
|
||||
entries populate below that which I immediately recognize as many of those tabs
|
||||
that I'm going to get back to one of these days.
|
||||
|
||||
To narrow down to the specific thing I'm looking for, I type something into the
|
||||
input. Then I arrow to the result I'm looking for and hit enter. And I'm
|
||||
transported to that tab.
|
||||
|
||||
If I don't like where I ended up, I can also go back to the tab I had been on
|
||||
with `^`.
|
||||
42
docker/run-sql-script-against-postgres-container.md
Normal file
42
docker/run-sql-script-against-postgres-container.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# Run SQL Script Against Postgres Container
|
||||
|
||||
I've been using dockerized Postgres for local development with several projects
|
||||
lately. This is typically with framework tooling (like Rails) where schema
|
||||
migrations and query execution are handled by the tooling using the specified
|
||||
connection parameters.
|
||||
|
||||
However, I was experimenting with and iterating on some Postgres functions
|
||||
outside of any framework tooling. I needed a way to run the SQL script that
|
||||
(re)creates the function via `psql` on the docker container.
|
||||
|
||||
With a local, non-containerized Postgres instance, I'd redirect the file to
|
||||
`psql` like so:
|
||||
|
||||
```bash
|
||||
$ psql -U postgres -d postgres < experimental-functions.sql
|
||||
```
|
||||
|
||||
When I tried doing this with `docker exec` though, it was silently failing /
|
||||
doing nothing. As far as I can tell, there was a mismatch with redirection
|
||||
handling across the bounds of the container.
|
||||
|
||||
To get around this, I first copy the file into the `/tmp` directory on the
|
||||
container:
|
||||
|
||||
```bash
|
||||
$ docker cp experimental-functions.sql still-postgres-1:/tmp/experimental-functions.sql
|
||||
```
|
||||
|
||||
Then the `psql` command that docker executes can be pointed directly at a
|
||||
local-to-it SQL file.
|
||||
|
||||
```bash
|
||||
$ docker exec still-postgres-1 psql \
|
||||
-U postgres \
|
||||
-d postgres \
|
||||
-f /tmp/experimental-functions.sql
|
||||
```
|
||||
|
||||
There are probably other ways to handle this, but I got into a nice rhythm with
|
||||
this file full of `create or replace function ...` definitions where I could
|
||||
modify, copy over, execute, run some SQL to verify, and repeat.
|
||||
35
postgres/show-reconstructed-constraints-for-a-table.md
Normal file
35
postgres/show-reconstructed-constraints-for-a-table.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# Show Reconstructed Constraints For A Table
|
||||
|
||||
The [`pg_get_constraintdef`
|
||||
function](https://pgpedia.info/p/pg_get_constraintdef.html) can be used to
|
||||
reconstruct the command for creating a given constraint. This isn't necessarily
|
||||
the command (or commands) that originally created the constraint, but rather a
|
||||
reconstruction.
|
||||
|
||||
We have to pass it an `oid` that corresponds to the constraint which we can get
|
||||
from the `pg_constraint` table. These results can be further narrowed down by
|
||||
the `conname` (constraint name) and `conrelid` (table name).
|
||||
|
||||
Here is an example of listing the constraints on a `reading_statuses` table.
|
||||
|
||||
```sql
|
||||
> select
|
||||
conname,
|
||||
pg_get_constraintdef(oid)
|
||||
from pg_constraint
|
||||
where conrelid = 'reading_statuses'::regclass;
|
||||
|
||||
conname | pg_get_constraintdef
|
||||
-------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
reading_statuses_pkey | PRIMARY KEY (id)
|
||||
fk_rails_17ee7cb2c4 | FOREIGN KEY (user_id) REFERENCES users(id)
|
||||
fk_rails_0d3729339f | FOREIGN KEY (book_id) REFERENCES books(id)
|
||||
reading_statuses_valid_status_check | CHECK (((status)::text = ANY ((ARRAY['started'::character varying, 'completed'::character varying, 'abandoned'::character varying, 'already_read'::character varying])::text[])))
|
||||
(4 rows)
|
||||
```
|
||||
|
||||
I came across this while experimenting with [an idea for a fail-fast Rails
|
||||
initializer
|
||||
check](https://gist.github.com/jbranchaud/12813a0558f9cd06bcc24b7d8706550c)
|
||||
that verifies the values of the `reading_statuses_valid_status_check` stay in
|
||||
sync with the Rails version of those values that live in a constant.
|
||||
24
ruby/show-the-bundler-location-of-an-installed-gem.md
Normal file
24
ruby/show-the-bundler-location-of-an-installed-gem.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# Show The Bundler Location Of An Installed Gem
|
||||
|
||||
When you run `bundle install` with a project, it is going to install all the
|
||||
gems specified by your project in a vendored location relative to the location
|
||||
of your Ruby version install.
|
||||
|
||||
If you want to find the location of a specific gem, you can ask bundler with
|
||||
`bundle show <gem-name>`.
|
||||
|
||||
Here I ask where the `rspec` gem is.
|
||||
|
||||
```bash
|
||||
$ bundle show rspec
|
||||
/Users/jbranchaud/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/rspec-3.12.0
|
||||
```
|
||||
|
||||
I could `cd` into that directory to have a look around at the source. That's a
|
||||
great way to learn more about how our dependencies work.
|
||||
|
||||
I could even inject some debugging statements (e.g. `binding.irb`) which the
|
||||
program using these gems will break on. Not often, but sometimes you need to
|
||||
dig in this deep to understand what is causing a tricky bug or why code isn't
|
||||
behaving like you'd hoped. Just remember to remove those statements when you're
|
||||
done.
|
||||
22
unix/find-and-copy-a-value-from-large-json-output.md
Normal file
22
unix/find-and-copy-a-value-from-large-json-output.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# Find And Copy A Value From Large JSON Output
|
||||
|
||||
I've been using [`fx`](https://github.com/antonmedv/fx) for years as a sidekick
|
||||
to [`jq`](https://jqlang.org/) when I want to explore a JSON document or JSON
|
||||
output that I'm not yet familiar with. A more recent version of `fx` added the
|
||||
ability to _yank_ (copy) values and keys you find in the document.
|
||||
|
||||
For instance, I may be looking for some info about my AWS RDS instances, so I
|
||||
pipe that command to `fx`.
|
||||
|
||||
```bash
|
||||
$ aws rds describe-db-instances --output json | fx
|
||||
```
|
||||
|
||||
This takes a moment to process and then the `fx` viewer is populated with a
|
||||
large blob of JSON. I can then hit `/` to start a document search, type in
|
||||
something like `Endpoint`, and then look around for the specific key-value pair
|
||||
I'm interested in.
|
||||
|
||||
I can then hit `y` to indicate that I want to copy the element under my cursor.
|
||||
If it is a key-value pair I will then be prompted to pick whether I want the
|
||||
value (`v`), the key (`k`), or the JSON path to this value (`p`).
|
||||
33
vim/go-to-beginning-and-end-of-line.md
Normal file
33
vim/go-to-beginning-and-end-of-line.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# Go To Beginning And End Of Line
|
||||
|
||||
There are two movements that I often find useful in Vim when trying to position
|
||||
my cursor relative to the current line.
|
||||
|
||||
- `0` - go to the first character of the line
|
||||
- `$` - go to the end of the line
|
||||
|
||||
For instance, I may use `0` to jump to beginning of a line so that I can then
|
||||
make a block-visual selection of several lines to insert some text in front of
|
||||
each line.
|
||||
|
||||
Or perhaps I'm already in visual mode and I want to move the cursor (and visual
|
||||
selection) to the end of the line. I hit `$` to do that. Then I might `y`
|
||||
(yank) or `c` (delete into insert mode).
|
||||
|
||||
It's also worth noting that with code indentation, `0` moves the cursor to the
|
||||
very first position of the line whereas `^` moves the cursor to the first
|
||||
non-whitespace character. The former essentially accounts for code indentation.
|
||||
For example, imagine you're in the middle of line 3 in the following example.
|
||||
Depending on what you're trying to do, you may want to jump to one or the other
|
||||
position.
|
||||
|
||||
```ruby
|
||||
class Greeting
|
||||
def hello(name)
|
||||
puts "Hello, #{name || 'world'}!" # say hi
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
See `:h 0` for Vim help files on these motions. They are all located near each
|
||||
other.
|
||||
Reference in New Issue
Block a user