diff options
| author | netop://ウィビ <paul@webb.page> | 2026-06-22 11:35:17 -0700 |
|---|---|---|
| committer | netop://ウィビ <paul@webb.page> | 2026-06-22 11:35:17 -0700 |
| commit | e584830b1fb06fde3cdb285556c26e0fb242ea2b (patch) | |
| tree | 2c675b5ec4b5c2bf19089c41f60f7c2f59d9979a | |
| parent | 69e84f7f93f4281fb023afdbfaf259c4ddf18d47 (diff) | |
| download | blog-e584830b1fb06fde3cdb285556c26e0fb242ea2b.tar.gz blog-e584830b1fb06fde3cdb285556c26e0fb242ea2b.zip | |
new posts
| -rw-r--r-- | memos/WM-096.txt | 103 | ||||
| -rw-r--r-- | memos/WM-097.txt | 130 | ||||
| -rw-r--r-- | src/utility/markdown.ts | 8 | ||||
| -rw-r--r-- | version.txt | 2 |
4 files changed, 239 insertions, 4 deletions
diff --git a/memos/WM-096.txt b/memos/WM-096.txt new file mode 100644 index 0000000..750e23b --- /dev/null +++ b/memos/WM-096.txt @@ -0,0 +1,103 @@ + + + + + + + +Document: WM-096 P. Webb +Category: Life 2026-06-20 + + Filoli Photoshoot + +Abstract + + My favorite professional pics from the shoot (along with my own) + +Body + + Last month my wife saw an open call for models for Filoli[1]. We + frequent this flower garden a few times a year so she filled out the + form and our family was selected! Filoli's marketing material will + feature the Webbs at some point, I'll be sure to update this memo if + I see us on physical media. + + The professional photos were shot by Key Lime Photography[2], (the + rest are obviously by me). + + 📸[Lakeisha snapping a photo][IMG1] + + 📸[pink roses][IMG2] + + 📸[wispy clouds against a blue sky with greenery below][IMG3] + + 📸[Lakeisha and I watching Ian run][IMG4] + + 📸[Ian walking between Lakeisha and I with the rest of our party mingling][IMG5] + + 📸[Lakeisha posing][IMG6] + + 📸[Persian Onion flower][IMG7] + + 📸[Lakeisha being playful][IMG8] + + 📸[beautiful greenery in the garden][IMG9] + + 📸[Lakeisha smiling at me][IMG10] + + 📸[Ian and a kid looking into a pond as their mothers look on][IMG11] + + 📸[Ian and a kid laughing][IMG12] + + 📸[Ian and a kid running around][IMG13] + + 📸[angled shot of a short shrubbery maze][IMG14] + + 📸[Ian leaping down steps, being chased by a kid][IMG15] + + 📸[me looking pensive, like a model][IMG16] + + Slap a filter on this and it looks like it could be an album cover + for some sweet 80s tunes. Too bad I'm a terrible singer. + + 📸[Ian mid-speech][IMG17] + + 📸[cast shot of everyone enjoying being by the pool][IMG18] + + 📸[close-up of me looking at Ian with an amused expression][IMG19] + + I had to get a close-up of this shot. I don't remember what Ian was + talking about but I clearly found it quite amusing. + + 📸[Lakeisha glowing in the light of a setting sun][IMG20] + + And there you have it! A day was had. I'm open to more opportunities + like this, it was fun. There was a moment in 2021, I think, where my + wife and I could've be a part of some competition show but timing was + bad. I believe it was a revival of a 90s kids competition show. Not + sure if that even aired, now that I think about it. Ah well. 🕸️ + +References + + [1] <https://filoli.org> + [2] <https://keylimephoto.com> + [IMG1] <https://cdn.webb.page/blog/2026/wm-096-a.JPG> + [IMG2] <https://cdn.webb.page/blog/2026/wm-096-b.JPG> + [IMG3] <https://cdn.webb.page/blog/2026/wm-096-c.JPG> + [IMG4] <https://cdn.webb.page/blog/2026/wm-096-d.JPG> + [IMG5] <https://cdn.webb.page/blog/2026/wm-096-e.JPG> + [IMG6] <https://cdn.webb.page/blog/2026/wm-096-f.JPG> + [IMG7] <https://cdn.webb.page/blog/2026/wm-096-g.JPG> + [IMG8] <https://cdn.webb.page/blog/2026/wm-096-h.JPG> + [IMG9] <https://cdn.webb.page/blog/2026/wm-096-i.JPG> + [IMG10] <https://cdn.webb.page/blog/2026/wm-096-j.JPG> + [IMG11] <https://cdn.webb.page/blog/2026/wm-096-k.JPG> + [IMG12] <https://cdn.webb.page/blog/2026/wm-096-l.JPG> + [IMG13] <https://cdn.webb.page/blog/2026/wm-096-m.JPG> + [IMG14] <https://cdn.webb.page/blog/2026/wm-096-n.JPG> + [IMG15] <https://cdn.webb.page/blog/2026/wm-096-o.JPG> + [IMG16] <https://cdn.webb.page/blog/2026/wm-096-p.JPG> + [IMG17] <https://cdn.webb.page/blog/2026/wm-096-q.JPG> + [IMG18] <https://cdn.webb.page/blog/2026/wm-096-r.JPG> + [IMG19] <https://cdn.webb.page/blog/2026/wm-096-r1.PNG> + [IMG20] <https://cdn.webb.page/blog/2026/wm-096-s.JPG> diff --git a/memos/WM-097.txt b/memos/WM-097.txt new file mode 100644 index 0000000..53c1df6 --- /dev/null +++ b/memos/WM-097.txt @@ -0,0 +1,130 @@ + + + + + + + +Document: WM-097 P. Webb +Category: Tutorial 2026-06-22 + + How to migrate from Gel to Disc + +Abstract + + The hardest part is getting your data out of Gel in a useable format, + the rest is easy. + +Body + + Dumping your Gel database to a format other databases can read + requires arcane knowledge but don't fret, I've uncovered the + incantations to free your data! + + ```sh + gel dump --all --format=dir gel-export + ``` + + You should see something like: + + ``` + Connecting to Gel instance 'INSTANCE' at localhost:PORT... + Starting dump for database `'DATABASE'`... + Finished dump for `'DATABASE'`. Total size: 181.67 KiB + ``` + + This will create `gel-export` in your current directory. Take note of + the instance and database names and the port as you'll need these + later. Next, grab the password to your database: + + ```sh + gel instance credentials --insecure-dsn -I INSTANCE + ``` + + You should see something like: + + ``` + gel:///DATABASE?port=PORT&password=PASSWORD&tls_ca_file=%3C...%3E&tls_security=no_host_verification + ``` + + Now we can set some variables to make the last bits pseudo-legible. + + ```sh + DSN="postgresql://edgedb@localhost:PORT/DATABASE?sslmode=require" + ``` + + ```sh + export PGPASSWORD="PASSWORD" + ``` + + Perform a raw SQL dump to `gel-export/data.sql`: + + ```sh + pg_dump \ + "$DSN" --data-only --no-owner --no-privileges \ + > gel-export/data.sql + ``` + + We create a `.tsv` file first, without any escaping that could mangle + the data. + + ```sh + psql "$DSN" -At -F $'\t' -c " + SELECT table_schema, table_name + FROM information_schema.tables + WHERE table_schema NOT IN ('information_schema', 'pg_catalog') + " > gel-export/tables.tsv + ``` + + Create our final export directory: + + ```sh + mkdir gel-export/data + ``` + + Finally, we render our `.csv`s: + + ```sh + while IFS=$'\t' read -r schema table; do + out="${schema}_${table}" + psql "$DSN" --csv -c "SELECT * FROM \"$schema\".\"$table\"" > "gel-export/data/$out.csv" + done < gel-export/tables.tsv + ``` + + I'll assume you installed Disc[1] already. Great! You'll need to get + it setup with your schema. Run that migration! + + ```sh + disc migrate + ``` + + Next, we'll point Disc at your fresh collection of `.csv`s: + + ```sh + disc db import ./gel-export/data + ``` + + This SHOULD work; it didn't for me because… + + ``` + ✗ Import failed (transaction rolled back): duplicate key value violates unique constraint "log_pkey" + ``` + + …and that's irrelevant to me. Ignoring conflicts like this is okay. + + ```sh + disc db import ./gel-export/data --on-conflict skip + ``` + + You'll get an import manifest of what was processed and skipped. For + me, it was abstract types and (empty) computed links. + + Run `disc serve` and navigate to your database's `/ui` and you should + see populated objects in the Data tab. + + Voila! Now all you gotta do is update your codebase…unfortunately, + you've gotta handle that yourself. 🕸️ + +References + + [1] <https://disc.sh> diff --git a/src/utility/markdown.ts b/src/utility/markdown.ts index f78cfee..9d8e514 100644 --- a/src/utility/markdown.ts +++ b/src/utility/markdown.ts @@ -83,15 +83,17 @@ export default (input: string): string => { /*** restore inline code ***/ for (const block in inlineCode) { - processed = processed.replace(`<!--INLINE:CODE:${block}-->`, `<code>${escapeHtml(inlineCode[block])}</code>`); + processed = processed.replace( + `<!--INLINE:CODE:${block}-->`, + () => `<code>${escapeHtml(inlineCode[block])}</code>` + ); } /*** restore code blocks ***/ for (const block of codeBlocks) { const langAttr = block.language ? ` data-language="${block.language}"` : ""; const html = `<pre><code${langAttr}>\n${escapeHtml(block.content)}\n\n</code></pre>`; - - processed = processed.replace(`<!--CODE:BLOCK:${block.index}-->`, html); + processed = processed.replace(`<!--CODE:BLOCK:${block.index}-->`, () => html); } // console.log(processed); /*** for troubleshooting ***/ diff --git a/version.txt b/version.txt index 8ba12c0..368df31 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2026.06.17
\ No newline at end of file +2026.06.22
\ No newline at end of file |