mirror of
https://github.com/jbranchaud/til
synced 2026-01-07 09:08:01 +00:00
Compare commits
10 Commits
483b4e0097
...
cf5d09aca5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf5d09aca5 | ||
|
|
5c9a3888fd | ||
|
|
22541826d6 | ||
|
|
b39ee94c90 | ||
|
|
efad7da916 | ||
|
|
ca3327bda3 | ||
|
|
595ac85f17 | ||
|
|
92d732c769 | ||
|
|
d6ebe52523 | ||
|
|
295fe153ad |
10
README.md
10
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).
|
||||
|
||||
_1617 TILs and counting..._
|
||||
_1625 TILs and counting..._
|
||||
|
||||
See some of the other learning resources I work on:
|
||||
- [Ruby Operator Lookup](https://www.visualmode.dev/ruby-operators)
|
||||
@@ -116,6 +116,7 @@ If you've learned something here, support my efforts writing daily TILs by
|
||||
- [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)
|
||||
- [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
|
||||
@@ -224,10 +225,12 @@ If you've learned something here, support my efforts writing daily TILs by
|
||||
|
||||
### Docker
|
||||
|
||||
- [Check Postgres Version Running In Docker Container](docker/check-postgres-version-running-in-docker-container.md)
|
||||
- [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)
|
||||
- [Run SQL Script Against Postgres Container](docker/run-sql-script-against-postgres-container.md)
|
||||
|
||||
### Drizzle
|
||||
|
||||
@@ -697,6 +700,7 @@ If you've learned something here, support my efforts writing daily TILs by
|
||||
- [List The Files Being Loaded By Mise](mise/list-the-files-being-loaded-by-mise.md)
|
||||
- [Preserve Color Output For Task Command](mise/preserve-color-output-for-task-command.md)
|
||||
- [Read Existing Dot Env File Into Env Vars](mise/read-existing-dot-env-file-into-env-vars.md)
|
||||
- [Run A Command With Specific Tool Version](mise/run-a-command-with-specific-tool-version.md)
|
||||
|
||||
### MongoDB
|
||||
|
||||
@@ -836,6 +840,7 @@ If you've learned something here, support my efforts writing daily TILs by
|
||||
- [Escaping String Literals With Dollar Quoting](postgres/escaping-string-literals-with-dollar-quoting.md)
|
||||
- [Export Query Results To A CSV](postgres/export-query-results-to-a-csv.md)
|
||||
- [Extracting Nested JSON Data](postgres/extracting-nested-json-data.md)
|
||||
- [Fetch Data From An Endpoint In SQL](postgres/fetch-data-from-an-endpoint-in-sql.md)
|
||||
- [Fetch Specific Number Of Results](postgres/fetch-specific-number-of-results.md)
|
||||
- [Find Duplicate Records In Table Without Unique Id](postgres/find-duplicate-records-in-table-without-unique-id.md)
|
||||
- [Find Records That Contain Duplicate Values](postgres/find-records-that-contain-duplicate-values.md)
|
||||
@@ -1379,6 +1384,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)
|
||||
@@ -1550,6 +1556,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)
|
||||
@@ -1726,6 +1733,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)
|
||||
|
||||
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)
|
||||
28
docker/check-postgres-version-running-in-docker-container.md
Normal file
28
docker/check-postgres-version-running-in-docker-container.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# Check Postgres Version Running In Docker Container
|
||||
|
||||
I have a docker container that I'm using to run a PostgreSQL development
|
||||
database on my local machine. It was a while ago when I set it up, so I can't
|
||||
remember specifically which major version of PostgreSQL I am using.
|
||||
|
||||
I use `docker ps` to list the names of each container.
|
||||
|
||||
```bash
|
||||
$ docker ps --format "{{.Names}}"
|
||||
still-postgres-1
|
||||
better_reads-postgres-1
|
||||
```
|
||||
|
||||
I grab the one I am interested in. In this case, that is `still-postgres-1`.
|
||||
|
||||
Then I can execute a `select version()` statement with `psql` against the
|
||||
container with that name like so:
|
||||
|
||||
```bash
|
||||
$ docker exec still-postgres-1 psql -U postgres -c "select version()";
|
||||
version
|
||||
---------------------------------------------------------------------------------------------------------------------
|
||||
PostgreSQL 16.2 (Debian 16.2-1.pgdg120+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
|
||||
(1 row)
|
||||
```
|
||||
|
||||
And there I have it. I'm running Postgres v16 in this container.
|
||||
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.
|
||||
@@ -5,6 +5,8 @@ an array-like object with all of the arguments to the function. Even if not
|
||||
all of the arguments are referenced in the function signature, they can
|
||||
still be accessed via the `arguments` object.
|
||||
|
||||
> For ES6+ compatibility, the `spread` operator used via [rest parameters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters) is preferred over the `arugments` object when accessing an abritrary number of function arguments.
|
||||
|
||||
```javascript
|
||||
function argTest(one) {
|
||||
console.log(one);
|
||||
|
||||
39
mise/run-a-command-with-specific-tool-version.md
Normal file
39
mise/run-a-command-with-specific-tool-version.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# Run A Command With Specific Tool Version
|
||||
|
||||
Because I'm using `mise` to manage the versions of tools like Node, I can
|
||||
execute commands in the context of specific versions. Behind the scenes `mise`
|
||||
makes sure I have the necessary tool(s) installed at the desired version(s).
|
||||
|
||||
So, [`mise exec` command](https://mise.jdx.dev/cli/exec.html) will default to
|
||||
using the latest version of a tool if I haven't been more specific. At the time
|
||||
of this writing, for Node, that is v23.
|
||||
|
||||
```bash
|
||||
$ mise exec node -- node --version
|
||||
v23.9.0
|
||||
```
|
||||
|
||||
To be specific I could specify the major version with `node@23` like so:
|
||||
|
||||
```bash
|
||||
mise exec node@23 -- npx repomix
|
||||
Need to install the following packages:
|
||||
repomix@0.2.39
|
||||
Ok to proceed? (y) y
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
Or if I wanted to use a different, older version of Node, I could specify that
|
||||
as well. We can see it will first install that and then execute the command:
|
||||
|
||||
```bash
|
||||
$ mise exec node@22 -- npx repomix
|
||||
gpg: Signature made Tue Feb 11 04:44:53 2025 CST
|
||||
gpg: using RSA key C0D6248439F1D5604AAFFB4021D900FFDB233756
|
||||
gpg: Good signature from "Antoine du Hamel <duhamelantoine1995@gmail.com>" [unknown]
|
||||
|
||||
📦 Repomix v0.2.39
|
||||
|
||||
...
|
||||
```
|
||||
49
postgres/fetch-data-from-an-endpoint-in-sql.md
Normal file
49
postgres/fetch-data-from-an-endpoint-in-sql.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# Fetch Data From An Endpoint In SQL
|
||||
|
||||
The [`pgsql-http` extension](https://github.com/pramsey/pgsql-http) provides a
|
||||
variety of functions for allowing PostgreSQL to act as an HTTP client. This is
|
||||
a bit unorthodox and may not be a good idea in production systems. That said,
|
||||
it is cool that it is possible. Let's look at an example of it.
|
||||
|
||||
First, I've installed the extension on the Docker container running my local
|
||||
Postgres server.
|
||||
|
||||
```bash
|
||||
$ docker exec -it still-postgres-1 bash
|
||||
|
||||
$ apt-get update
|
||||
|
||||
$ apt-get install postgres-16-http # I'm running Postgres v16
|
||||
|
||||
$ exit
|
||||
```
|
||||
|
||||
Then I'll connect to a `psql` session in that container for the `postgres` database.
|
||||
|
||||
```bash
|
||||
$ docker exec still-postgres-1 psql -U postgres -d postgres
|
||||
```
|
||||
|
||||
Then I enable the extension.
|
||||
|
||||
```sql
|
||||
> create extension if not exists http;
|
||||
CREATE EXTENSION
|
||||
```
|
||||
|
||||
Now I can point a PostgreSQL statement at a live endpoint like
|
||||
[https://httpbun.com/ip](https://httpbun.com/ip) which will respond with a
|
||||
chunk of JSON including the IP address for that project's server. I do this
|
||||
using `http_get` which makes a `GET` request to the given endpoint. The body is
|
||||
included in the result set.
|
||||
|
||||
```bash
|
||||
> select content from http_get('http://httpbun.com/ip');
|
||||
content
|
||||
-----------------------------
|
||||
{ +
|
||||
"origin": "73.75.236.101"+
|
||||
} +
|
||||
|
||||
(1 row)
|
||||
```
|
||||
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