mirror of
https://github.com/jbranchaud/til
synced 2026-01-17 14:08:01 +00:00
Compare commits
3 Commits
0dee39d3c5
...
431507fd0e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
431507fd0e | ||
|
|
fb153f35bf | ||
|
|
f4ba6a9ef7 |
@@ -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).
|
||||
|
||||
_1472 TILs and counting..._
|
||||
_1475 TILs and counting..._
|
||||
|
||||
---
|
||||
|
||||
@@ -326,6 +326,7 @@ _1472 TILs and counting..._
|
||||
- [List Untracked Files](git/list-untracked-files.md)
|
||||
- [List Untracked Files For Scripting](git/list-untracked-files-for-scripting.md)
|
||||
- [Move The Latest Commit To A New Branch](git/move-the-latest-commit-to-a-new-branch.md)
|
||||
- [Override The Global Git Ignore File](git/override-the-global-git-ignore-file.md)
|
||||
- [Pick Specific Changes To Stash](git/pick-specific-changes-to-stash.md)
|
||||
- [Pulling In Changes During An Interactive Rebase](git/pulling-in-changes-during-an-interactive-rebase.md)
|
||||
- [Push To A Branch On Another Remote](git/push-to-a-branch-on-another-remote.md)
|
||||
@@ -795,6 +796,7 @@ _1472 TILs and counting..._
|
||||
- [Max Identifier Length Is 63 Bytes](postgres/max-identifier-length-is-63-bytes.md)
|
||||
- [Open Heroku Database In Postico From Terminal](postgres/open-heroku-database-in-postico-from-terminal.md)
|
||||
- [pg Prefix Is Reserved For System Schemas](postgres/pg-prefix-is-reserved-for-system-schemas.md)
|
||||
- [Postgres Does Not Support Unsigned Integers](postgres/postgres-does-not-support-unsigned-integers.md)
|
||||
- [Prepare, Execute, And Deallocate Statements](postgres/prepare-execute-and-deallocate-statements.md)
|
||||
- [Pretty Print Data Sizes](postgres/pretty-print-data-sizes.md)
|
||||
- [Pretty Printing JSONB Rows](postgres/pretty-printing-jsonb-rows.md)
|
||||
@@ -1717,6 +1719,7 @@ _1472 TILs and counting..._
|
||||
- [Prune The Excess From node_modules](workflow/prune-the-excess-from-node-modules.md)
|
||||
- [Rotate An Image To Be Oriented Upright](workflow/rotate-an-image-to-be-oriented-upright.md)
|
||||
- [See Overlaps For A Set Of Time Zones](workflow/see-overlaps-for-a-set-of-time-zones.md)
|
||||
- [Send A Message To A Discord Channel](workflow/send-a-message-to-a-discord-channel.md)
|
||||
- [Set Recurring Reminders In Slack](workflow/set-recurring-reminders-in-slack.md)
|
||||
- [Toggle Between Stories In Storybook](workflow/toggle-between-stories-in-storybook.md)
|
||||
- [Update asdf Plugins With Latest Package Versions](workflow/update-asdf-plugins-with-latest-package-versions.md)
|
||||
|
||||
33
git/override-the-global-git-ignore-file.md
Normal file
33
git/override-the-global-git-ignore-file.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# Override The Global Git Ignore File
|
||||
|
||||
One of the places that `git` looks when deciding whether to pay attention to or
|
||||
ignore a file is in your global _ignore_ file. By default, `git` will look for
|
||||
this file at `$XDG_CONFIG_HOME/git/ignore` or `$HOME/.config/git/ignore`.
|
||||
|
||||
I don't have `$XDG_CONFIG_HOME` set on my machine, so it will fall back to the
|
||||
config directory under `$HOME`.
|
||||
|
||||
I may have to create the `git` directory and `ignore` file.
|
||||
|
||||
```bash
|
||||
$ mkdir $HOME/.config/git
|
||||
$ touch $HOME/.config/git/ignore
|
||||
```
|
||||
|
||||
Then I can add file and directories to exclude to that `ignore` file just like
|
||||
I would any other `.gitignore` file.
|
||||
|
||||
If I'd prefer for the global _ignore_ file to live somewhere else, I can
|
||||
specify that location and filename in my `$HOME/.gitconfig` file.
|
||||
|
||||
```
|
||||
[core]
|
||||
excludesFile = ~/.gitignore
|
||||
```
|
||||
|
||||
Setting this will override the default, meaning the default file mentioned
|
||||
above will be ignored ("now you know how it feels, ignore file!"). In this
|
||||
case, I'll need to create the `.gitignore` file in my home directory and add
|
||||
any of my ignore rules.
|
||||
|
||||
[source](https://git-scm.com/docs/gitignore)
|
||||
30
postgres/postgres-does-not-support-unsigned-integers.md
Normal file
30
postgres/postgres-does-not-support-unsigned-integers.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# Postgres Does Not Support Unsigned Integers
|
||||
|
||||
PostgreSQL has a variety of sizes of integer types, from `smallint` (2 bytes)
|
||||
to `integer` (4 bytes) to `bigint` (8 bytes), as well as [other numeric
|
||||
types](https://www.postgresql.org/docs/current/datatype-numeric.html).
|
||||
|
||||
It does _not_ however support unsigned versions of these numeric types.
|
||||
|
||||
That means, with an `integer` for instance, we can store numbers between
|
||||
`-2147483648` and `+2147483647`. That's everything that can fit into 4 bytes.
|
||||
In a system that supported 4 byte unsigned integers we'd be able to represent
|
||||
from `0` all the way up to `4294967295`.
|
||||
|
||||
In PostgreSQL, we're limited to these _signed_ numeric types.
|
||||
|
||||
That means if we were hoping that the data type could essentially enforce a
|
||||
non-negative restriction on the data in one of our columns, we're going to have
|
||||
to be more creative. The obvious choice to me is to consider adding a [check
|
||||
constraint](https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-CHECK-CONSTRAINTS)
|
||||
(e.g. `quantity integer check (quantity > 0)`).
|
||||
|
||||
Another option, as pointed out by [this StackOverflow
|
||||
answer](https://stackoverflow.com/a/31833279/535590), is to create [a
|
||||
user-defined _domain
|
||||
type_](https://www.postgresql.org/docs/current/domains.html) that restricts
|
||||
valid values. To me, the ergonomics of using a domain type are a bit awkward
|
||||
and not worth the effort.
|
||||
|
||||
With either of these solutions, we are only approximating an unsigned integer
|
||||
and do not actually have the same range of values available.
|
||||
64
workflow/send-a-message-to-a-discord-channel.md
Normal file
64
workflow/send-a-message-to-a-discord-channel.md
Normal file
@@ -0,0 +1,64 @@
|
||||
# Send A Message To A Discord Channel
|
||||
|
||||
I recently added a form to [visualmode.dev](https://www.visualmode.dev) that
|
||||
when submitted should send the details to an internal channel in my discord
|
||||
server.
|
||||
|
||||
I didn't need to set up an _App_ or a _Bot_ to do this. It is much simpler than
|
||||
that. All I needed was a valid [_webhook_
|
||||
endpoint](https://discord.com/developers/docs/resources/webhook) for my channel
|
||||
that I can `POST` to.
|
||||
|
||||
From Discord, I can select _Edit Channel_ for a specific channel, go to the
|
||||
_Integrations_ tab, go to _Webhooks_, and then create a _New Webhook_. I can
|
||||
name it, save it, and then copy the webhook URL.
|
||||
|
||||
As a demonstration, I can `POST` to that webhook URL using `cURL` like so:
|
||||
|
||||
```bash
|
||||
curl -H "Content-Type: application/json" -X POST -d '{"content":"Hello from cURL!"}' <YOUR_WEBHOOK_URL>
|
||||
```
|
||||
|
||||
Similarly, in some non-public-facing code like a Next.js serverless function, I
|
||||
can `POST` to that webhook URL with the `content` that I want to appear in my
|
||||
channel.
|
||||
|
||||
```
|
||||
import { NextResponse } from 'next/server'
|
||||
|
||||
export async function POST(request: Request) {
|
||||
const data = await request.json()
|
||||
|
||||
const discordWebhookUrl = process.env.DISCORD_WEBHOOK_URL
|
||||
if (discordWebhookUrl) {
|
||||
try {
|
||||
const response = await fetch(discordWebhookUrl, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
content: `New contact form submission:\nName: ${data.name}\nEmail: ${data.email}\nCompany: ${data.company}\nPhone: ${data.phone}\nMessage: ${data.message}`,
|
||||
}),
|
||||
})
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error('Failed to send Discord message')
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error sending to Discord:', error)
|
||||
return NextResponse.json(
|
||||
{ error: 'Failed to process form submission' },
|
||||
{ status: 500 },
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
return NextResponse.json({ message: 'Form submitted successfully' })
|
||||
}
|
||||
```
|
||||
|
||||
This [Structure of Webhook
|
||||
guide](https://birdie0.github.io/discord-webhooks-guide/discord_webhook.html)
|
||||
has more details on how to specifically structure and format a more complex
|
||||
message.
|
||||
Reference in New Issue
Block a user