mirror of
https://github.com/jbranchaud/til
synced 2026-01-20 23:48:02 +00:00
Compare commits
1 Commits
c2dda60ca8
...
ed9c31c259
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed9c31c259 |
@@ -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).
|
For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186).
|
||||||
|
|
||||||
_1423 TILs and counting..._
|
_1418 TILs and counting..._
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -410,7 +410,6 @@ _1423 TILs and counting..._
|
|||||||
|
|
||||||
### Inngest
|
### Inngest
|
||||||
|
|
||||||
- [Ensure Lookup Can Be Retried](inngest/ensure-lookup-can-be-retried.md)
|
|
||||||
- [Exit Function Early Without Retries](inngest/exit-function-early-without-retries.md)
|
- [Exit Function Early Without Retries](inngest/exit-function-early-without-retries.md)
|
||||||
|
|
||||||
### Internet
|
### Internet
|
||||||
@@ -673,7 +672,6 @@ _1423 TILs and counting..._
|
|||||||
- [Capitalize All The Words](postgres/capitalize-all-the-words.md)
|
- [Capitalize All The Words](postgres/capitalize-all-the-words.md)
|
||||||
- [Change The Current Directory For psql](postgres/change-the-current-directory-for-psql.md)
|
- [Change The Current Directory For psql](postgres/change-the-current-directory-for-psql.md)
|
||||||
- [Change The Owner Of A Sequence](postgres/change-the-owner-of-a-sequence.md)
|
- [Change The Owner Of A Sequence](postgres/change-the-owner-of-a-sequence.md)
|
||||||
- [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 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 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 Oprhaned Records](postgres/check-table-for-any-orphaned-records.md)
|
||||||
@@ -738,7 +736,6 @@ _1423 TILs and counting..._
|
|||||||
- [Group By The Result Of A Function Call](postgres/group-by-the-result-of-a-function-call.md)
|
- [Group By The Result Of A Function Call](postgres/group-by-the-result-of-a-function-call.md)
|
||||||
- [Idempotent Inserts](postgres/idempotent-inserts.md)
|
- [Idempotent Inserts](postgres/idempotent-inserts.md)
|
||||||
- [Include All Queries In The Log File](postgres/include-all-queries-in-the-log-file.md)
|
- [Include All Queries In The Log File](postgres/include-all-queries-in-the-log-file.md)
|
||||||
- [Include Columns In A Covering Index](postgres/include-columns-in-a-covering-index.md)
|
|
||||||
- [Include Multiple Tables In A pg_dump](postgres/include-multiple-tables-in-a-pg-dump.md)
|
- [Include Multiple Tables In A pg_dump](postgres/include-multiple-tables-in-a-pg-dump.md)
|
||||||
- [Insert A Bunch Of Records With Generate Series](postgres/insert-a-bunch-of-records-with-generate-series.md)
|
- [Insert A Bunch Of Records With Generate Series](postgres/insert-a-bunch-of-records-with-generate-series.md)
|
||||||
- [Insert Just The Defaults](postgres/insert-just-the-defaults.md)
|
- [Insert Just The Defaults](postgres/insert-just-the-defaults.md)
|
||||||
@@ -908,7 +905,6 @@ _1423 TILs and counting..._
|
|||||||
- [Load A File When Starting Rails Console](rails/load-a-file-when-starting-rails-console.md)
|
- [Load A File When Starting Rails Console](rails/load-a-file-when-starting-rails-console.md)
|
||||||
- [Load Records In Batches With find_each](rails/load-records-in-batches-with-find-each.md)
|
- [Load Records In Batches With find_each](rails/load-records-in-batches-with-find-each.md)
|
||||||
- [Log SQL Queries Executed By ActiveRecord](rails/log-sql-queries-executed-by-activerecord.md)
|
- [Log SQL Queries Executed By ActiveRecord](rails/log-sql-queries-executed-by-activerecord.md)
|
||||||
- [Look Up Time Zone Info For Identifier](rails/look-up-time-zone-info-for-identifier.md)
|
|
||||||
- [Mark A Migration As Irreversible](rails/mark-a-migration-as-irreversible.md)
|
- [Mark A Migration As Irreversible](rails/mark-a-migration-as-irreversible.md)
|
||||||
- [Make A String Attribute Easy To Inquire About](rails/make-a-string-attribute-easy-to-inquire-about.md)
|
- [Make A String Attribute Easy To Inquire About](rails/make-a-string-attribute-easy-to-inquire-about.md)
|
||||||
- [Make ActionMailer Synchronous In Test](rails/make-action-mailer-synchronous-in-test.md)
|
- [Make ActionMailer Synchronous In Test](rails/make-action-mailer-synchronous-in-test.md)
|
||||||
@@ -1629,7 +1625,6 @@ _1423 TILs and counting..._
|
|||||||
- [Add The VSCode CLI To Your Path](vscode/add-the-vscode-cli-to-your-path.md)
|
- [Add The VSCode CLI To Your Path](vscode/add-the-vscode-cli-to-your-path.md)
|
||||||
- [Advance Through Search Results](vscode/advance-through-search-results.md)
|
- [Advance Through Search Results](vscode/advance-through-search-results.md)
|
||||||
- [Enable Breadcrumbs For Version 1.26 Release](vscode/enable-breadcrumbs-for-version-126-release.md)
|
- [Enable Breadcrumbs For Version 1.26 Release](vscode/enable-breadcrumbs-for-version-126-release.md)
|
||||||
- [Find The Location Of User Settings JSON File](vscode/find-the-location-of-user-settings-json-file.md)
|
|
||||||
- [Open An Integrated Terminal Window](vscode/open-an-integrated-terminal-window.md)
|
- [Open An Integrated Terminal Window](vscode/open-an-integrated-terminal-window.md)
|
||||||
- [Pop Open The Quick Fix Window](vscode/pop-open-the-quick-fix-window.md)
|
- [Pop Open The Quick Fix Window](vscode/pop-open-the-quick-fix-window.md)
|
||||||
- [Step Through Project-Wide Search Results](vscode/step-through-project-wide-search-results.md)
|
- [Step Through Project-Wide Search Results](vscode/step-through-project-wide-search-results.md)
|
||||||
|
|||||||
@@ -1,57 +0,0 @@
|
|||||||
# Ensure Lookup Can Be Retried
|
|
||||||
|
|
||||||
A common thing to do in a workflow step is to look up a record. This might be a
|
|
||||||
record that was created or updated around the time that the workflow was
|
|
||||||
triggered.
|
|
||||||
|
|
||||||
You need to be sure the record was found before proceeding. That might end up
|
|
||||||
looking like this:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
export default inngest.createFunction(
|
|
||||||
{ id: "record-user-purchase" },
|
|
||||||
{ event: "app/record.purchase" },
|
|
||||||
async ({ event, step }) => {
|
|
||||||
const checkoutSession =
|
|
||||||
await step.run("find checkout session", async () => {
|
|
||||||
const cs = provider.lookupSession(event.checkoutSessionId)
|
|
||||||
|
|
||||||
return cs;
|
|
||||||
});
|
|
||||||
|
|
||||||
if(!checkoutSession) {
|
|
||||||
throw new Error('Checkout session not found')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
This approach has a subtle problem which is that the error for a missing
|
|
||||||
checkout session is raised _outside_ the step that sets `checkoutSession`. As
|
|
||||||
inngest does a series of retries, the memorized `checkoutSession` step won't be
|
|
||||||
rerun and the error will continue to be thrown.
|
|
||||||
|
|
||||||
It is better to raise the error _within_ the lookup step:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
export default inngest.createFunction(
|
|
||||||
{ id: "record-user-purchase" },
|
|
||||||
{ event: "app/record.purchase" },
|
|
||||||
async ({ event, step }) => {
|
|
||||||
const checkoutSession =
|
|
||||||
await step.run("find checkout session", async () => {
|
|
||||||
const cs = provider.lookupSession(event.checkoutSessionId)
|
|
||||||
|
|
||||||
if(!cs) {
|
|
||||||
throw new Error('Checkout session not found')
|
|
||||||
}
|
|
||||||
|
|
||||||
return cs;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
If the checkout session is missing on the first couple tries, the step will
|
|
||||||
have a chance to retry the lookup and maybe eventually find what it is looking
|
|
||||||
for.
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
# Check If Clusters Are Upgrade Compatible
|
|
||||||
|
|
||||||
One of the ways to upgrade a PostgreSQL database from one server version to
|
|
||||||
another is to use the built-in `pg_upgrade` command. This can be faster and
|
|
||||||
require fewer manual steps than something like a `pg_dump` and `pg_restore`.
|
|
||||||
|
|
||||||
However, before you run the `pg_upgrade` command for real, you should check
|
|
||||||
that the target database is compatible with the current database. To do this,
|
|
||||||
write your `pg_update` command with all the flags you need and then tack on
|
|
||||||
`--check` at the end. This does a dry-run reporting the results of a series of
|
|
||||||
consistency checks.
|
|
||||||
|
|
||||||
Here is what a successful _check_ looks like:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ /usr/local/opt/postgresql@13/bin/pg_upgrade \
|
|
||||||
--old-bindir $HOME/.asdf/installs/postgres/12.3/bin \
|
|
||||||
--new-bindir /usr/local/opt/postgresql@13/bin \
|
|
||||||
--old-datadir $HOME/.asdf/installs/postgres/12.3/data \
|
|
||||||
--new-datadir ./postgres/data \
|
|
||||||
--check
|
|
||||||
|
|
||||||
Performing Consistency Checks
|
|
||||||
-----------------------------
|
|
||||||
Checking cluster versions ok
|
|
||||||
Checking database user is the install user ok
|
|
||||||
Checking database connection settings ok
|
|
||||||
Checking for prepared transactions ok
|
|
||||||
Checking for system-defined composite types in user tables ok
|
|
||||||
Checking for reg* data types in user tables ok
|
|
||||||
Checking for contrib/isn with bigint-passing mismatch ok
|
|
||||||
Checking for presence of required libraries ok
|
|
||||||
Checking database user is the install user ok
|
|
||||||
Checking for prepared transactions ok
|
|
||||||
Checking for new cluster tablespace directories ok
|
|
||||||
|
|
||||||
*Clusters are compatible*
|
|
||||||
```
|
|
||||||
|
|
||||||
If there is an issue, such as mismatched collation settings, the output will
|
|
||||||
report the issue. You'll have to decide how to resolve those on a case-by-case
|
|
||||||
basis.
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
# Include Columns In A Covering Index
|
|
||||||
|
|
||||||
A _covering index_ is a special type of B-Tree index that, in addition to
|
|
||||||
indexing on a certain field, also _includes_ one or more columns as extra data
|
|
||||||
in the leaves of the tree. When created correctly, this can speed up the
|
|
||||||
queries it targets by achieving an _index-only scan_.
|
|
||||||
|
|
||||||
Let's say we have a frequently run query on a large `events` table that looks
|
|
||||||
like this:
|
|
||||||
|
|
||||||
```sql
|
|
||||||
select user_id, identifier, type
|
|
||||||
from events
|
|
||||||
where user_id = $1;
|
|
||||||
```
|
|
||||||
|
|
||||||
Here is what it looks like to create an index for this query with the `include`
|
|
||||||
keyword:
|
|
||||||
|
|
||||||
```sql
|
|
||||||
create index user_id_on_events_idx
|
|
||||||
on (user_id)
|
|
||||||
include (identifier, type);
|
|
||||||
```
|
|
||||||
|
|
||||||
An index on its own can already cause a significant speed up to the queries it
|
|
||||||
targets, but may still need to retrieve some `select` attributes from the
|
|
||||||
table. For hot-path queries with a set of specific columns always included in
|
|
||||||
the select, there can be significant additional speed ups by having the index
|
|
||||||
_cover_ those columns.
|
|
||||||
|
|
||||||
For more details, check out [A Close Look At The Index Include
|
|
||||||
Clause](https://use-the-index-luke.com/blog/2019-04/include-columns-in-btree-indexes).
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
# Look Up Time Zone Info For Identifier
|
|
||||||
|
|
||||||
The `ActiveSupport::TimeZone` class overrides the `#[]` method to be a lookup
|
|
||||||
mechanism for IANA Time Zone Identifier strings. These are strings like
|
|
||||||
`America/Chicago` (or anything else listed under `TZInfo::Timezone.all`).
|
|
||||||
|
|
||||||
Let's get an instance for `America/Chicago`.
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
> chi = ActiveSupport::TimeZone['America/Chicago']
|
|
||||||
=> #<ActiveSupport::TimeZone:0x00000001099d8140
|
|
||||||
@name="America/Chicago",
|
|
||||||
@tzinfo=#<TZInfo::DataTimezone: America/Chicago>,
|
|
||||||
@utc_offset=nil>
|
|
||||||
```
|
|
||||||
|
|
||||||
Notice it has a `tzinfo` instance variable that we can access. That object
|
|
||||||
contains all kinds of useful things.
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
> chi.tzinfo.name
|
|
||||||
=> "America/Chicago"
|
|
||||||
> chi.tzinfo.friendly_identifier
|
|
||||||
=> "America - Chicago"
|
|
||||||
> chi.tzinfo.abbr
|
|
||||||
=> "CDT"
|
|
||||||
> chi.tzinfo.utc_offset
|
|
||||||
=> -18000
|
|
||||||
> chi.tzinfo.dst?
|
|
||||||
=> true
|
|
||||||
```
|
|
||||||
|
|
||||||
All of these and more. Run `ls chi.tzinfo` in a `pry` session to see what else.
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# Find The Location Of User Settings JSON File
|
|
||||||
|
|
||||||
There are a ton ways to customize and fine-tune VS Code. All of the settings
|
|
||||||
have defaults which can then be customized on a workspace and user level.
|
|
||||||
Typically you'll access these files within VS Code via the Command Palette. I
|
|
||||||
was curious though: since it is just a JSON file, surely I can view and modify
|
|
||||||
it with any editor.
|
|
||||||
|
|
||||||
On a Mac, the user-level `settings.json` file is located at
|
|
||||||
`~/Library/Application\ Support/Code/User/settings.json`.
|
|
||||||
|
|
||||||
Open it up and you might see something like this:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"editor.formatOnSave": true,
|
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
||||||
"window.zoomLevel": 1,
|
|
||||||
"workbench.editor.showTabs": "single"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
A handful of settings with specific overrides.
|
|
||||||
|
|
||||||
Feel free to edit what is in here or add other settings that you want to set.
|
|
||||||
Just make sure you know what you're doing and that you set valid values.
|
|
||||||
|
|
||||||
The VS Code docs list [the locations of these files on other operating
|
|
||||||
systems](https://code.visualstudio.com/docs/getstarted/settings#_settings-file-locations).
|
|
||||||
|
|
||||||
[source](https://stackoverflow.com/questions/53840644/location-of-vs-code-preferences)
|
|
||||||
Reference in New Issue
Block a user