{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"description":"Recent content on Verily","feed_url":"https://degruchy.org/feed.json","home_page_url":"https://degruchy.org/","items":[{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI know a lot of people are freaking out because tools like Claude Code and\nfriends are able to write, reason about and modify code. This has business\nleaders absolutely salivating at the possibility of getting rid of a huge chunk\nof their bulky, expensive \u0026hellip; human \u0026hellip; capital. However, \u003cabbr title='State of the Art'\u003eSOTA\u003c/abbr\u003e\n is still not going to fully replace anyone.\u003c/p\u003e\n\u003cp\u003eHowever I find my problem, specifically, is that I don\u0026rsquo;t know of any need I\u0026rsquo;m\nunable to fulfill that I would somehow need vibe coding to accomplish. I\u0026rsquo;ve had\nAI tools look at code I\u0026rsquo;ve written to suggest improvements or fix issues I was\nhaving with it. I just don\u0026rsquo;t know about having one code a full app that solves a\nneed that I have. One that the myraid of other apps or tools don\u0026rsquo;t. Sure, that\nmeans I need to spend time learning about and utilizing the tools I have, but\nthat seems like a better use of my time than wasting untold hours of datacenter\ntime, and all the ills that go with it, to code up something that might barely\nbe considered a 1.0 tool.\u003c/p\u003e\n\u003cp\u003eGranted, I\u0026rsquo;m not a developer. I don\u0026rsquo;t spend time trying to suss out details of\nmarketing and management requests into something that works as envisioned, so I\nguess I\u0026rsquo;m not \u003cem\u003ereally\u003c/em\u003e the demographic. But what kind of tools are people\nbuilding with these systems that is really pushing the needle? Is this really\nsustainable? What happens when people inevitably abandon these projects? I feel\nlike these are terrible loops to be stuck in, recreating things, poorly,\nabandoning them, and then doing it all over again.\u003c/p\u003e\n\u003cp\u003eAm I missing something?\u003c/p\u003e\n","date_modified":"2026-03-04T14:28:01Z","date_published":"2026-03-04T14:28:01Z","id":"https://degruchy.org/2026/03/04/why-cant-i-think-of-anything-to-vibe-code/","title":"Why Can't I Think of Anything to Vibe Code?","url":"https://degruchy.org/2026/03/04/why-cant-i-think-of-anything-to-vibe-code/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eHELLLLOOOOOO San Fransisco!\u003c/p\u003e\n\u003cp\u003e(and goodbye)\u003c/p\u003e\n\u003cp\u003eWe had a lovely trip to SFO this week. Taking in a whirlwind tour of sights and\nsounds all over this lovely city. My son and his class were selected to visit\nand perform in SFO, which meant that the whole family packed up, flew out and\ndid a crazy 3-day tour of the city. I\u0026rsquo;m exhausted.\u003c/p\u003e\n\u003cul class=\"idksomethingincredible gallery\" rel=\"page\"\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0001.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0001_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0001_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0001_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0001_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0002.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0002_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0002_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0002_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0002_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0003.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0003_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0003_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0003_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0003_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0004.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0004_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0004_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0004_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0004_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0005.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0005_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0005_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0005_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0005_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0006.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0006_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0006_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0006_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0006_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0007.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0007_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0007_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0007_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0007_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0008.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0008_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0008_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0008_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0008_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0009.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0009_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0009_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0009_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0009_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0010.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0010_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0010_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0010_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0010_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0011.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0011_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0011_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0011_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0011_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0012.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0012_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0012_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0012_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0012_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0013.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0013_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0013_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0013_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0013_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0014.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0014_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0014_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0014_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0014_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0015.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0015_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0015_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0015_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0015_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0016.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0016_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0016_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0016_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0016_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0017.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0017_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0017_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0017_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0017_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0018.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0018_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0018_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0018_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0018_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0019.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0019_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0019_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0019_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0019_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0020.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0020_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0020_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0020_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0020_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0021.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0021_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0021_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0021_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0021_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0022.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0022_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0022_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0022_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0022_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0023.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0023_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0023_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0023_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0023_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0024.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0024_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0024_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0024_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0024_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0025.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0025_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0025_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0025_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0025_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0026.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0026_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0026_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0026_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0026_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0027.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0027_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0027_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0027_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/03/01/hello-and-goodbye-san-fransisco/san-fransisco-trip_0027_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003c/ul\u003e\n\n\u003cstyle\u003e\n\t@layer post\n\t{\n\t\t.gallery\n\t\t{\n\t\t\talign-content: space-evenly;\n\t\t\tbackground-color: var(--theme-color-alt-background);\n\t\t\tborder: 3px solid var(--theme-color-border);\n\t\t\tborder-radius: 10px;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: center;\n\t\t\tpadding: 0;\n\n\t\t\tli\n\t\t\t{\n\t\t\t\tlist-style-type: none;\n\t\t\t}\n\n\t\t\ta\n\t\t\t{\n\t\t\tcolor: var(--theme-color-alt-foreground);\n\t\t\t}\n\n\t\t\tfigcaption\n\t\t\t{\n\t\t\t\theight: 1.4rem;\n\t\t\t\tmax-width: 128px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\ttext-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n\u003c/style\u003e\n\n\u003cp\u003eAs you can see, we got to see a bunch of stuff (and stuff I was too tired, or\nfeeling too ill to see). My wife even got a Waymo and saw some stuff that wasn\u0026rsquo;t\npart of our tour package. Highlights included Pier 39, Ghirardelli square, the\ncable cars, Alcatraz, Muir Woods and some lovely local restaurants.\u003c/p\u003e\n\u003cp\u003eOur last trip to SFO was \u003cem\u003e15 years ago\u003c/em\u003e. Which seems like a lifetime ago. So\nfar, little has changed since we last saw it. A \u003cem\u003elot\u003c/em\u003e more advertising for AI,\nthough. That was godsdamned everywhere.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m still organizing photos from everyone, so I may add to this list later.\u003c/p\u003e\n","date_modified":"2026-03-01T12:10:10-05:00","date_published":"2026-03-01T12:10:10-05:00","id":"https://degruchy.org/2026/03/01/hello-and-goodbye-san-fransisco/","title":"Hello (and Goodbye) San Fransisco!","url":"https://degruchy.org/2026/03/01/hello-and-goodbye-san-fransisco/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eAs \u003ca\n\thref=\"/reading/\"\n\t\n\t\u003e\n\tyou may (or may not) have noticed on my reading list\n\u003c/a\u003e, that I\u0026rsquo;ve picked\nup on the \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Dungeon_Crawler_Carl\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Dungeon_Crawler_Carl\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tDungeon Crawler Carl\n\u003c/a\u003e series of books. I\u0026rsquo;m burning my way through\nthe 4th book (of 8!) my wife is steaming through number 2 and my son is right on\nmy heels at the end of 3. We\u0026rsquo;re all enjoying the series throughly. It\u0026rsquo;s not it\u0026rsquo;s\n\u003ca\n\thref=\"https://en.wikipedia.org/wiki/Isekai\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Isekai\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tIsekai-esque\n\u003c/a\u003e story beats, or it\u0026rsquo;s heroic main character \u0026ndash; it\u0026rsquo;s the\ncompletely unhinged situations that our character\u0026rsquo;s find themselves in, and try\nto deal with the gruesome consequences, often with lots of \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Dark_humor\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Dark_humor\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tblack-humor\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t really want to spoil any of this for you, so I\u0026rsquo;ll just give you the\nbriefest of overviews. I know many will bounce off of it because of the content,\nbut maybe you will find yourself renting it from the library. However, if you\nfind any of these things appealing, I \u003cem\u003ehighly\u003c/em\u003e recommend it.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCarl is a Coast Guard veteran living with his girlfriend and her prize-winning\npersian cat, Donut. When his girlfriend goes on a girl\u0026rsquo;s vacation in the\nBahama\u0026rsquo;s, leaving Carl alone taking care of her cat, Aliens arrive and\nshenanigan\u0026rsquo;s ensue. Lots of video game and table-top RPG elements are\nreferenced and intermixed, bringing this surreal book to life.\u003c/p\u003e\n\u003c/blockquote\u003e\n","date_modified":"2026-02-19T10:16:32-05:00","date_published":"2026-02-19T10:16:32-05:00","id":"https://degruchy.org/2026/02/19/dungeon-crawling-with-carl/","title":"Dungeon Crawling with Carl","url":"https://degruchy.org/2026/02/19/dungeon-crawling-with-carl/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eMicrosoft\u0026rsquo;s \u003cem\u003edefinitely\u003c/em\u003e huffing the good stuff.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://www.office.com\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2026/01/05/uh...-okay/microsoft-copilot-what.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2026/01/05/uh...-okay/microsoft-copilot-what.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2026/01/05/uh...-okay/microsoft-copilot-what.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2026/01/05/uh...-okay/microsoft-copilot-what.jpg\"\n             alt=\"Needs more .NET\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eWow\u003c/h4\u003e\u003cp\u003eNeeds more .NET\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n","date_modified":"2026-01-05T10:44:29-05:00","date_published":"2026-01-05T10:44:29-05:00","id":"https://degruchy.org/2026/01/05/uh...-okay/","title":"Uh... Okay?","url":"https://degruchy.org/2026/01/05/uh...-okay/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eThere is \u003ca\n\thref=\"https://hn-wrapped.kadoa.com/?year=2025\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://hn-wrapped.kadoa.com/?year=2025\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\ta tool for summarizing your 2025 Hacker News interactions\n\u003c/a\u003e. Of\ncourse it uses \u0026ldquo;AI\u0026rdquo;. However, I decided to try it out. I feel \u003cem\u003every\u003c/em\u003e seen.\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/12/20/i-feel-noticed/xkcd-hn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/12/20/i-feel-noticed/xkcd-hn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/12/20/i-feel-noticed/xkcd-hn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/12/20/i-feel-noticed/xkcd-hn.jpg\"\n             alt=\"A picture of my faux XKCD comic, generated by AI\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eIt\u0026#39;s organized!\u003c/h4\u003e\u003cp\u003eOkay, yes. I should really symlink my toothbrush into .local/personal/bathroom\u0026hellip;\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eHere\u0026rsquo;s the full breakdown:\u003c/p\u003e\n\u003cul class=\"hn-2025 gallery\" rel=\"page\"\u003e\u003cli\u003e\n        \u003ca href=\"/2025/12/20/i-feel-noticed/ndegruchy-hn-wrapped-full.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/12/20/i-feel-noticed/ndegruchy-hn-wrapped-full_hu_ef17fa25e524f124.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/12/20/i-feel-noticed/ndegruchy-hn-wrapped-full_hu_3f5f8711c6fd23c1.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003c/ul\u003e\n\n\u003cstyle\u003e\n\t@layer post\n\t{\n\t\t.gallery\n\t\t{\n\t\t\talign-content: space-evenly;\n\t\t\tbackground-color: var(--theme-color-alt-background);\n\t\t\tborder: 3px solid var(--theme-color-border);\n\t\t\tborder-radius: 10px;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: center;\n\t\t\tpadding: 0;\n\n\t\t\tli\n\t\t\t{\n\t\t\t\tlist-style-type: none;\n\t\t\t}\n\n\t\t\ta\n\t\t\t{\n\t\t\tcolor: var(--theme-color-alt-foreground);\n\t\t\t}\n\n\t\t\tfigcaption\n\t\t\t{\n\t\t\t\theight: 1.4rem;\n\t\t\t\tmax-width: 128px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\ttext-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n\u003c/style\u003e\n\n","date_modified":"2025-12-20T17:09:00-05:00","date_published":"2025-12-20T17:09:00-05:00","id":"https://degruchy.org/2025/12/20/i-feel-noticed/","title":"I Feel Noticed","url":"https://degruchy.org/2025/12/20/i-feel-noticed/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/11/29/screenshot-saturday--screenshot-saturday./sss.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/11/29/screenshot-saturday--screenshot-saturday./sss.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/11/29/screenshot-saturday--screenshot-saturday./sss.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/11/29/screenshot-saturday--screenshot-saturday./sss.jpg\"\n             alt=\"A screenshot of my desktop with festive holiday lights trimming the menu and dock, snow falling from the top of the screen\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eFestive\u003c/h4\u003e\u003cp\u003eA little jingle to the desktop\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n","date_modified":"2025-11-29T18:21:41-05:00","date_published":"2025-11-29T18:21:41-05:00","id":"https://degruchy.org/2025/11/29/screenshot-saturday--screenshot-saturday./","title":"Screenshot Saturday? 🙂‍↕️ Screenshot Saturday.","url":"https://degruchy.org/2025/11/29/screenshot-saturday--screenshot-saturday./"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003ca href=\"https://www.youtube.com/shorts/VOZ_HAh8gF4\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/11/06/we-are-here-on-the-path-to-authoritarianism/know-your-rights.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/11/06/we-are-here-on-the-path-to-authoritarianism/know-your-rights.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/11/06/we-are-here-on-the-path-to-authoritarianism/know-your-rights.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/11/06/we-are-here-on-the-path-to-authoritarianism/know-your-rights.jpg\"\n             alt=\"A poster image for the \u0026#39;Know Your Rights\u0026#39; video on YouTube that explains what your rights are with regard to ICE\" width=\"403\" height=\"702\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:403px;\"\u003e\n            \u003ch4\u003eKnow Your Rights\u003c/h4\u003e\u003cp\u003eAs we slide toward authoritarianism, you should exercise what rights you have left while you can.\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n","date_modified":"2025-11-06T12:19:13-05:00","date_published":"2025-11-06T12:19:13-05:00","id":"https://degruchy.org/2025/11/06/we-are-here-on-the-path-to-authoritarianism/","title":"We Are Here [====| ] on the Path to Authoritarianism","url":"https://degruchy.org/2025/11/06/we-are-here-on-the-path-to-authoritarianism/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eWhat do you do with your email? Do you archive everything? Or are you a person who will delete everything not immediately useful? \u003ca\n\thref=\"https://email-is-good.com/2025/11/05/archive-or-delete/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://email-is-good.com/2025/11/05/archive-or-delete/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tThere are good arguments for both sides\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003ePersonally, I \u003cem\u003etry\u003c/em\u003e to delete most email. Most of my email ends up being passive information that is point-in-time based, but not really \u003cem\u003elong term\u003c/em\u003e. These are things like mailing list messages or notifications from services and stuff from my son’s school. Things that don’t often need to be retrieved because they’re only about the point in time when they were sent.\u003c/p\u003e\n\u003cp\u003eI do archive \u003cem\u003equite a bit\u003c/em\u003e of email, though. Things like replies to job offers, receipts, license keys and emails from my wife and family. Those are things that I would likely have a reason to reference later. Otherwise, I try to keep it trim. I don’t really have a \u003cem\u003elong term\u003c/em\u003e archival storage solution sorted out, but I’m not sure if I have a \u003cem\u003ereal need\u003c/em\u003e for something like that. There’s always \u003ca\n\thref=\"https://c-command.com/eaglefiler/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://c-command.com/eaglefiler/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tEagleFiler\n\u003c/a\u003e if I were serious about it.  I could also just \u003ccode\u003eFile \u0026gt; Save As…\u003c/code\u003e and dump it into some folder. Again, I just don’t have a \u003cem\u003eneed\u003c/em\u003e to do it.\u003c/p\u003e\n\u003cp\u003eI kind of flip this on it’s head when I’m at work, though. Work has retention policies, archive mailboxes and other requirements. Honestly, I probably delete a vast amount of email there, too, but the rest of it I don’t bother archiving because none of my email is “record worthy.” If I need to save some information from an email, I’ll copy and paste it into OneNote or something because that’s the blessed tool for that sort of thing. Besides, I’m not paying for the mailbox or the storage or the maintenance of it, so let the pros in those position handle it.\u003c/p\u003e\n\u003cp\u003eI have a habit of being a digital pack-rat, but I’m also kind of picky about what I actually want to save. I go through fits of cleaning up old data that I’ve accumulated, purging everything but what I \u003cem\u003eknow that I’ll need\u003c/em\u003e in the future. This ends up biting me in the ass sometimes, as I end up killing more than I should, but honestly? Having sets of emephemeral data is sometimes a \u003cem\u003egood thing.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eWhat do y’all do? Archive? Delete? Print (🤢)?\u003c/p\u003e\n","date_modified":"2025-11-05T14:37:19-05:00","date_published":"2025-11-05T14:37:19-05:00","id":"https://degruchy.org/2025/11/05/whither-to-archive-or-delete/","title":"Whither to Archive or Delete?","url":"https://degruchy.org/2025/11/05/whither-to-archive-or-delete/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure class=\"dbas\"\u003e\u003ca href=\"https://www.youtube.com/watch?v=vGAqYNFQdZ4\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/10/14/dont-be-a-sucker/dbas.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/10/14/dont-be-a-sucker/dbas.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/10/14/dont-be-a-sucker/dbas.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/10/14/dont-be-a-sucker/dbas.jpg\"\n             alt=\"A picture of a man in front of a microphone\" width=\"1280\" height=\"720\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:1280px;\"\u003e\n            \u003ch4\u003eDon\u0026#39;t be a Sucker\u003c/h4\u003e\u003cp\u003eOddly prescient for a film coming out in the 1940\u0026rsquo;s\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n","date_modified":"2025-10-14T11:23:34-04:00","date_published":"2025-10-14T11:23:34-04:00","id":"https://degruchy.org/2025/10/14/dont-be-a-sucker/","title":"Don't Be a Sucker","url":"https://degruchy.org/2025/10/14/dont-be-a-sucker/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eDanish ass-clown, and Minister of Justice, Peter Hummelgarrd is quoted as\nsaying:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026ldquo;We must break with the totally erroneous perception that it is everyone\u0026rsquo;s\ncivil liberty to communicate on encrypted messaging services.\u0026rdquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWhich, is of course, comically absurd. If the constitutions and other laws and\nmechanisms around the world didn\u0026rsquo;t already explicitly guard personal privacy,\nand therefore the ability to use services that safeguard that privacy using\nencryption, you also run in to the problem of Math.\u003c/p\u003e\n\u003cp\u003eMath being the thing that makes encryption work the way it does. Math that is\nreally just a series of formulas to take a stream of bytes, scramble it in some\nway that makes it difficult to unscramble unless you\u0026rsquo;re using a special input\nthat only you know to unscramble it. Math is hard to govern, as it\u0026rsquo;s just an\nidea. A way in which to demonstrate how to solve a problem. Making encryption\n(services, et al) is just to make certain branches of mathematics illegal, and\ntherefore certain kinds of \u003cem\u003ethought\u003c/em\u003e illegal.\u003c/p\u003e\n\u003cp\u003eNot to mention, \u003cem\u003ehow\u003c/em\u003e is making encryption, or services that provide encrypted\nmessaging going to do \u003cem\u003eanything\u003c/em\u003e to stop crime? Do criminals also follow the law\naround firearm sales and ownership? Do criminals follow any laws that you\nimplement? No? So what would stop them from continuing to do so?\u003c/p\u003e\n\u003cp\u003eLets say you don\u0026rsquo;t \u003cem\u003eban\u003c/em\u003e encrypted messaging services, but instead force\ncompanies to implement a tap, where the government gets to peek at messages as\nthey transverse a system. Lets also say that the only people who are able to\npeek at these messages are the so-called \u0026ldquo;Good Guys\u0026rdquo; ™, does this also\napply to the public servants? People who we entrust to do the right thing on\nbehalf of the populace? No? Of course not. Rules for Thee; None for Me.\u003c/p\u003e\n\u003cp\u003eAgain, implementing a tap doesn\u0026rsquo;t stop \u003cem\u003eanyone anywhere\u003c/em\u003e from doing any\nencrypted messaging. It just moves the problem somewhere else. Criminals aren\u0026rsquo;t\nusing WhatsApp or Facebook Messenger, at least real criminals that you,\nostensibly, want to capture don\u0026rsquo;t. Your populace does. So, lets drop the charade\nand call a spade a spade: You want to listen in on communications of your\npopulation so that you can either control, kill or otherwise silence\n\u0026ldquo;problematic\u0026rdquo; speech. You can coat it in whatever linguistic sugar you\u0026rsquo;d like,\nbut that\u0026rsquo;s what you want. Power over what people say and do. Power to squash\nthose who would oppose you or your ideals. Power.\u003c/p\u003e\n\u003cp\u003eAnyone with half-a-brain should say \u0026ldquo;No.\u0026rdquo; Yet, here we are, even having this\ndebate because the whole world is leaning authoritarian lately, and plenty of\npeople are just willing to go along for the ride. Either due to apathy (me) or\nlearned hopelessness, or just straight up being silenced. The writing, however,\nhas been on the proverbial wall for some time now. If you\u0026rsquo;re part of any\n\u0026ldquo;right-winged\u0026rdquo; movement, you\u0026rsquo;re buying into this police state. Either for\nsupposed safety, ideology or just lack of empathy for those who are different\nthan you.\u003c/p\u003e\n\u003cp\u003eI say: Fuck you. You don\u0026rsquo;t scare me.\u003c/p\u003e\n","date_modified":"2025-09-15T09:32:15-04:00","date_published":"2025-09-15T09:32:15-04:00","id":"https://degruchy.org/2025/09/15/rules-for-thee-none-for-me/","title":"Rules for Thee, None for Me","url":"https://degruchy.org/2025/09/15/rules-for-thee-none-for-me/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eApparently supply chain attacks on NPM aren\u0026rsquo;t \u0026ldquo;so last year\u0026rdquo;. In fact, \u003ca\n\thref=\"https://github.com/debug-js/debug/issues/1005\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://github.com/debug-js/debug/issues/1005\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tthe\nlatest one affects a huge amount of packages\n\u003c/a\u003e. That one is \u003ccode\u003edebug\u003c/code\u003e. In fact,\nI was \u003cem\u003ealmost\u003c/em\u003e affected by it just by having the stupid language server\ninstalled.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehead -n \u003cspan class=\"m\"\u003e7\u003c/span\u003e package.json \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;debug\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;4.4.1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;repository\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;git\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;git://github.com/debug-js/debug.git\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eGod, I hate Node.\u003c/p\u003e\n","date_modified":"2025-09-09T09:30:22-04:00","date_published":"2025-09-09T09:30:22-04:00","id":"https://degruchy.org/2025/09/09/npm-is-a-joke-a-bad-one-at-that/","title":"NPM is a Joke, a Bad One at That","url":"https://degruchy.org/2025/09/09/npm-is-a-joke-a-bad-one-at-that/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003ca href=\"https://www.youtube.com/watch?v=rlR8d9JVWtQ\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/07/28/last-week-tonight-with-john-oliver-gangs/poster.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/07/28/last-week-tonight-with-john-oliver-gangs/poster.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/07/28/last-week-tonight-with-john-oliver-gangs/poster.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/07/28/last-week-tonight-with-john-oliver-gangs/poster.jpg\"\n             alt=\"A picture of the episode segment of Last Week Tonight\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eGangs\u003c/h4\u003e\u003cp\u003eA brilliant exposition on the problem with gang databases in the US\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eI have no love for police, but I respect the work they do. However, there are\nlots of problems with the way they do their work that could be improved.\nIdeally, there needs to be more public oversight over these \u0026ldquo;public servants\u0026rdquo;.\nEspecially since they seem unaccountable for their actions, even when they\u0026rsquo;re\nclearly at fault.\u003c/p\u003e\n","date_modified":"2025-07-28T09:32:18-04:00","date_published":"2025-07-28T09:32:18-04:00","id":"https://degruchy.org/2025/07/28/last-week-tonight-with-john-oliver-gangs/","title":"Last Week, Tonight with John Oliver: Gangs","url":"https://degruchy.org/2025/07/28/last-week-tonight-with-john-oliver-gangs/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eIn true nerd fashion. I don\u0026rsquo;t use a spreadsheet (anymore) to manage the various\nlicenses that I buy for software. CSV files are fine for shorter lists, but\nbecome problematic when dealing with more, especially trying to properly format\nthe document. So, I started looking for alternatives.\u003c/p\u003e\n\u003cp\u003eThere are a couple of purpose built programs, generally for enterprises, that\nclaim to manage your software licenses, but I\u0026rsquo;m not that big, and I don\u0026rsquo;t have\nenterprise cash to throw around. So I started looking at SQLite, which is a\ndurable format that even the Library of Congress endorses as a archival format.\nHowever, it can be a little obtuse to work with. Plus you can\u0026rsquo;t just crack open\nthe file in an editor and edit it. So, you need to know SQL and how to work\naround the command-line tools for it. Still, a tempting choice.\u003c/p\u003e\n\u003cp\u003eHowever, there \u003cem\u003eare\u003c/em\u003e text-only databases that can be opened and handled by text\neditors \u003cem\u003eand\u003c/em\u003e command-line tooling. The one that comes to mind is\n\u003ca\n\thref=\"https://www.gnu.org/software/recutils/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.gnu.org/software/recutils/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\t\u003ccode\u003erecutils\u003c/code\u003e\n\u003c/a\u003e, a suite of utilities that can parse, format and error check a\ndatabase made up of a text-only schema and it\u0026rsquo;s associated data. It kind of\nlooks like this:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-rec\" data-lang=\"rec\"\u003e%rec: License\n%doc: A collection of personal software licenses that I have purchased.\n%typedef: OS_t enum Windows macOS Linux CrossPlatform\n%key: Id\n%type: Id int\n%type: Name line\n%type: PurchaseDate date\n%type: OS OS_t\n%mandatory: Name LicenseKey\n%auto: Id\n\nId: 1\nName: Acorn\nVersion: 8\nPurchaseDate: 1970-01-01\nLicenseKey:\nOS: macOS\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe stuff behind the \u003ccode\u003e%\u003c/code\u003e are field identifiers, allowing you to define \u003cem\u003ewhat\u003c/em\u003e a\nfield should contain and conform to. You can set your own types, like I did with\n\u003ccode\u003e%Id\u003c/code\u003e. Additionally you can set mandatory and unique fields to better wrangle\ncompliance of data being entered. All in all, it\u0026rsquo;s a pretty \u003cem\u003edamn simple\u003c/em\u003e format\nthat works really well. Bash, the shell, also has a built in \u003ccode\u003erecread\u003c/code\u003e built-in\nto read in data like this, so if you\u0026rsquo;re already handling it on the command-line,\nit\u0026rsquo;s one less thing you have to run. For me, I can get by with the standard\nutilities in this ZSH shell script:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/usr/bin/env zsh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# VERSION: 2.3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Hello, future me. This is a mini-zsh program to make working with the software\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# license database a bit easier from the command-line. macOS, specifically.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# However, there shouldn\u0026#39;t be anything in here that is specific to macOS, except\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# maybe the path to the database itself.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Usage:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## You\u0026#39;ll want to set the variables in the \u0026#39;_decrypt-license\u0026#39; and \u0026#39;license-add\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## functions to the proper path for the encryption key and the license recutils\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## file.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# CHANGELOG\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## Version 1:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e##  Initial creation.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## Version 2:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e##  Add encryption and reverse the sort options on fzf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## Version 2.1:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e##  Add guard-rails for missing license and keyfiles\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## Version 2.1.1:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e##  Fix comparison for missing files (\u0026amp;\u0026amp; vs ||). Thanks ChatGPT!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## Version 2.1.2:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e##  Add check for `age` tool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## Version 2.2:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e##  Not really a fix in this file, but fixes to the database allow this to work\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## Version 2.3:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e##  Add purchase date field and pre-check for \u0026#39;age\u0026#39; command\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e((\u003c/span\u003e $+commands\u003cspan class=\"o\"\u003e[\u003c/span\u003erecsel\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e))\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"o\"\u003e((\u003c/span\u003e $+commands\u003cspan class=\"o\"\u003e[\u003c/span\u003eage\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e))\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003ethen\u003c/span\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"c1\"\u003e# Decrypt the license file with the age key, this will dump the file to\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"c1\"\u003e# stdout, so all subsequent uses should be a pipeline dealing with the\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"c1\"\u003e# output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t_decrypt-license\u003cspan class=\"o\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nb\"\u003elocal\u003c/span\u003e \u003cspan class=\"nv\"\u003eLICENSE_FILE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;path-to-license.rec\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nb\"\u003elocal\u003c/span\u003e \u003cspan class=\"nv\"\u003eKEY_FILE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;path-to-encryption-key.txt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e ! \u003cspan class=\"o\"\u003e((\u003c/span\u003e $+commands\u003cspan class=\"o\"\u003e[\u003c/span\u003eage\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e))\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Unable to find the `age` command-line tool in the PATH, please install before retrying.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e ! \u003cspan class=\"o\"\u003e[[\u003c/span\u003e -e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$KEY_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e -e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LICENSE_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Unable to decrypt the license file, please ensure both the license file exists and the keyfile exists.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Key File: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$KEY_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;License File: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$LICENSE_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\tage --decrypt --identity \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$KEY_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LICENSE_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"c1\"\u003e# Add to the license file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tlicense-add\u003cspan class=\"o\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nb\"\u003elocal\u003c/span\u003e \u003cspan class=\"nv\"\u003eLICENSE_FILE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;path-to-license.rec\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nb\"\u003elocal\u003c/span\u003e \u003cspan class=\"nv\"\u003eKEY_FILE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;path-to-encryption-key.txt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"c1\"\u003e# First, lets get some information from the user\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nb\"\u003eread\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;?Software name: \u0026#34;\u003c/span\u003e name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nb\"\u003eread\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;?Platform (Windows, macOS, Linux or CrossPlatform): \u0026#34;\u003c/span\u003e os\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nb\"\u003eread\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;?Purchase date (YYYY-MM-DD): \u0026#34;\u003c/span\u003e pdate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nb\"\u003eread\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;?Version number: \u0026#34;\u003c/span\u003e version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nb\"\u003eread\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;?License key: \u0026#34;\u003c/span\u003e key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e ! \u003cspan class=\"o\"\u003e[[\u003c/span\u003e -n \u003cspan class=\"nv\"\u003e$name\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e -n \u003cspan class=\"nv\"\u003e$os\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e -n \u003cspan class=\"nv\"\u003e$version\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e -n \u003cspan class=\"nv\"\u003e$key\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All fields are required!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"c1\"\u003e# Decrypt, edit the stream, encrypt.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\tcp \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LICENSE_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LICENSE_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e.bkup\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t_decrypt-license \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\trecins --verbose \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t   --type\u003cspan class=\"o\"\u003e=\u003c/span\u003eLicense \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t   -f Name -v \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$name\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t   -f PurchaseDate -v \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$pdate\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t   -f LicenseKey -v \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$key\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t   -f \u003cspan class=\"s2\"\u003e\u0026#34;OS\u0026#34;\u003c/span\u003e -v \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$os\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\tage --encrypt --identity \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$KEY_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e --output \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LICENSE_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"c1\"\u003e# Search by name (case-insensitive)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tlicense-find\u003cspan class=\"o\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t_decrypt-license \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\trecsel --type\u003cspan class=\"o\"\u003e=\u003c/span\u003eLicense --case-insensitive \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t   --expression\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Name = \u0026#39;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$1\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#39;\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t   --print\u003cspan class=\"o\"\u003e=\u003c/span\u003eName,OS,Version,LicenseKey\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"c1\"\u003e# Search by OS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tlicense-os\u003cspan class=\"o\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t_decrypt-license \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\trecsel --type\u003cspan class=\"o\"\u003e=\u003c/span\u003eLicense --case-insensitive \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t   --expression \u003cspan class=\"s2\"\u003e\u0026#34;OS = \u0026#39;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$1\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#39;\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t   --print-row\u003cspan class=\"o\"\u003e=\u003c/span\u003eName\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e((\u003c/span\u003e $+commands\u003cspan class=\"o\"\u003e[\u003c/span\u003efzf\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e))\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\tlicense-fzf\u003cspan class=\"o\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"nb\"\u003elocal\u003c/span\u003e \u003cspan class=\"nv\"\u003eselected\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e_decrypt-license \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\t\t\trecsel --collapse --type\u003cspan class=\"o\"\u003e=\u003c/span\u003eLicense \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\t\t\t\t\t--print-values\u003cspan class=\"o\"\u003e=\u003c/span\u003eName \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\t\t\tfzf --height \u003cspan class=\"m\"\u003e10\u003c/span\u003e --reverse\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e -n \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$selected\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\tlicense-find \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$selected\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eHere, I use \u003ccode\u003erecutils\u003c/code\u003e (\u003ccode\u003erecsel\u003c/code\u003e and \u003ccode\u003erecins\u003c/code\u003e) to manage the actual database,\nand age to encrypt/decrypt the data. You could, of course, use whatever\nencryption system you want to handle the data at rest. The nice thing here is\nthat age (and GNUPG) support reading data from \u003ccode\u003estdin\u003c/code\u003e and writing to \u003ccode\u003estdout\u003c/code\u003e,\nwhich makes it perfect for manipulating the database in-memory, without having\nto do any jiggery-pokery with temp files and risking data being left somewhere\nunencrypted. Much like \u003ca\n\thref=\"https://www.passwordstore.org\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.passwordstore.org\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\t\u003ccode\u003epass\u003c/code\u003e\n\u003c/a\u003e, this lets each tool do what it does best,\nand just strings each tool along, passing the relevant data to/from the user as\nneeded. There\u0026rsquo;s even a handy filtering tool in \u003ccode\u003efzf\u003c/code\u003e to help the user find an\nentry that they might not know the name of off-hand.\u003c/p\u003e\n\u003cp\u003eAnyway, I hope this helps someone build their own license system, or other cool\ntool. Let me know if it helped!\u003c/p\u003e\n","date_modified":"2025-07-24T16:13:36-04:00","date_published":"2025-07-24T16:13:36-04:00","id":"https://degruchy.org/2025/07/24/managing-software-licenses/","title":"Managing Software Licenses","url":"https://degruchy.org/2025/07/24/managing-software-licenses/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\u003ca\n\thref=\"https://blenderstudio.itch.io/dogwalk\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://blenderstudio.itch.io/dogwalk\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tDog Walk\n\u003c/a\u003e is an open source game made in all open-source tools by the\nBlender Stuido and Godot Engine. Using papercraft and free and open source\nsoftware, they developed an absolutely \u003cem\u003eadorable\u003c/em\u003e game about a boy and a dog\nlooking for bits of a snowman. It\u0026rsquo;s not a long game by any stretch of the\nimagination, but it\u0026rsquo;s absolutely full of heart and soul. It goes to show you how\nmuch goes into the craft of game making and story telling, versus the tools used\nto make it.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m really glad they released this. Godot is a great engine, and Blender is a\npowerhouse of both 3D modeling \u003cem\u003eand\u003c/em\u003e video editing. It\u0026rsquo;s astonishing what you\ncan do with the power of people helping people.\u003c/p\u003e\n","date_modified":"2025-07-14T21:44:07-04:00","date_published":"2025-07-14T21:44:07-04:00","id":"https://degruchy.org/2025/07/14/dog-walk-is-adorable/","title":"Dog Walk is ADORABLE","url":"https://degruchy.org/2025/07/14/dog-walk-is-adorable/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eFor this site, I\u0026rsquo;ve been using a \u003ccode\u003eMakefile\u003c/code\u003e that automates much of the process\nof building, indexing and ultimately uploading the static files to AWS\nCloudFront for distribution to you, my dear reader.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eMake\u003c/code\u003e \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Make_%28software%29\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Make_%28software%29\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\thas been around for ages\n\u003c/a\u003e. Current incarnations use either BSD or GNU\nvariants, but for my purposes, GNU is where it\u0026rsquo;s at. I use in the following\nform:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-makefile\" data-lang=\"makefile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eSHELL\u003c/span\u003e \u003cspan class=\"o\"\u003e:=\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e.SHELLFLAGS\u003c/span\u003e \u003cspan class=\"o\"\u003e:=\u003c/span\u003e -eu -o pipefail -c\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nf\"\u003e.ONESHELL\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eCLOUDFRONT_DIST_ID\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eAWS_ACCESS_KEY_ID\u003c/span\u003e \u003cspan class=\"o\"\u003e?=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eAWS_SECRET_ACCESS_KEY\u003c/span\u003e \u003cspan class=\"o\"\u003e?=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMAKEFLAGS\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e --warn-undefined-variables\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMAKEFLAGS\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e --no-builtin-rules\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eREQUIRED_PROGRAMS\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e pagefind hugo aws\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nf\"\u003eall\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003echeck_dependencies\u003c/span\u003e \u003cspan class=\"n\"\u003ebuild\u003c/span\u003e \u003cspan class=\"n\"\u003eindex\u003c/span\u003e \u003cspan class=\"n\"\u003eupload\u003c/span\u003e \u003cspan class=\"n\"\u003eclean\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nf\"\u003ebuild\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ehugo\u003c/span\u003e.\u003cspan class=\"n\"\u003etoml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@echo \u003cspan class=\"s2\"\u003e\u0026#34;Building site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@hugo build --cleanDestinationDir --quiet\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nf\"\u003eserve\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ehugo\u003c/span\u003e.\u003cspan class=\"n\"\u003etoml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@echo \u003cspan class=\"s2\"\u003e\u0026#34;Serving local build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@hugo serve --buildDrafts --disableFastRender\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nf\"\u003eindex\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003epublic\u003c/span\u003e/\u003cspan class=\"n\"\u003esearch\u003c/span\u003e/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@echo \u003cspan class=\"s2\"\u003e\u0026#34;Building search index\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@pagefind --root-selector\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;main\u0026#34;\u003c/span\u003e --logfile search-log.log --silent --site public --output-subdir search/pagefind\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nf\"\u003eupload\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003epublic\u003c/span\u003e/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@echo \u003cspan class=\"s2\"\u003e\u0026#34;Uploading files\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@AWS_ACCESS_KEY_ID\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003eAWS_ACCESS_KEY_ID\u003cspan class=\"k\"\u003e)\u003c/span\u003e \u003cspan class=\"nv\"\u003eAWS_SECRET_ACCESS_KEY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003eAWS_SECRET_ACCESS_KEY\u003cspan class=\"k\"\u003e)\u003c/span\u003e aws s3 sync public/ s3://degruchy.org --storage-class REDUCED_REDUNDANCY --quiet --delete --exclude \u003cspan class=\"s2\"\u003e\u0026#34;*.csv\u0026#34;\u003c/span\u003e --exclude \u003cspan class=\"s2\"\u003e\u0026#34;*.caption\u0026#34;\u003c/span\u003e --exclude \u003cspan class=\"s2\"\u003e\u0026#34;*.DS_Store\u0026#34;\u003c/span\u003e --exclude \u003cspan class=\"s2\"\u003e\u0026#34;.DS_Store\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@echo \u003cspan class=\"s2\"\u003e\u0026#34;Invalidating caches\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@AWS_ACCESS_KEY_ID\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003eAWS_ACCESS_KEY_ID\u003cspan class=\"k\"\u003e)\u003c/span\u003e \u003cspan class=\"nv\"\u003eAWS_SECRET_ACCESS_KEY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003eAWS_SECRET_ACCESS_KEY\u003cspan class=\"k\"\u003e)\u003c/span\u003e aws cloudfront create-invalidation --distribution-id \u003cspan class=\"k\"\u003e$(\u003c/span\u003eCLOUDFRONT_DIST_ID\u003cspan class=\"k\"\u003e)\u003c/span\u003e --paths \u003cspan class=\"s2\"\u003e\u0026#34;/*\u0026#34;\u003c/span\u003e \u0026gt;/dev/null\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nf\"\u003eclean\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003esearch\u003c/span\u003e-\u003cspan class=\"n\"\u003elog\u003c/span\u003e.\u003cspan class=\"n\"\u003elog\u003c/span\u003e \u003cspan class=\"n\"\u003epublic\u003c/span\u003e/ \u003cspan class=\"n\"\u003eresources\u003c/span\u003e/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@echo \u003cspan class=\"s2\"\u003e\u0026#34;Cleaning up build artefacts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@rm search-log.log\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@rm -r public/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@rm -r resources/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nf\"\u003echeck_dependencies\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t@echo \u003cspan class=\"s2\"\u003e\u0026#34;Checking for required programs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003e$(\u003c/span\u003eforeach prog,\u003cspan class=\"k\"\u003e$(\u003c/span\u003eREQUIRED_PROGRAMS\u003cspan class=\"k\"\u003e)\u003c/span\u003e,\u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t  \u003cspan class=\"k\"\u003e$(if\u003c/span\u003e \u003cspan class=\"k\"\u003e$(\u003c/span\u003eshell which \u003cspan class=\"k\"\u003e$(\u003c/span\u003eprog\u003cspan class=\"k\"\u003e))\u003c/span\u003e,,\u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t    \u003cspan class=\"k\"\u003e$(\u003c/span\u003eerror \u003cspan class=\"s2\"\u003e\u0026#34;Required program: \u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003eprog\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e not in PATH\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e)))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nf\"\u003e.PHONY\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003echeck_dependencies\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Local Variables:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# truncate-lines: t\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# End:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe problem is that when you start doing stuff that loops, or that makes use of\nshell incantations you start getting into the weeds. Also, if you close one of\nyour eyes and squint the other, it \u003cem\u003ekind of\u003c/em\u003e looks like a \u003ca\n\thref=\"https://en.wikipedia.org/wiki/YAML\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/YAML\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tYAML file\n\u003c/a\u003e\n(\u003cstrong\u003eNote:\u003c/strong\u003e I have a healthy distaste for YAML files). Which means you can\nprobably just actually make it a YAML file and be done with it.\u003c/p\u003e\n\u003cp\u003eSo, I decided to try out \u003ca\n\thref=\"https://taskfile.dev\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://taskfile.dev\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\t\u003ccode\u003etask\u003c/code\u003e\n\u003c/a\u003e as a build runner instead. After a few minutes of fiddling (and no AI help, just the docs) I had the following \u003ccode\u003eTaskfile.yaml\u003c/code\u003e working and uploading just fine. Neat!\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;3\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003esilent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck_dependencies\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eindex\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eupload\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Building site\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003ehugo build --cleanDestinationDir --quiet\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eserve\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Serving local build\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck_dependencies\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eindex\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003ehugo serve --buildDrafts --disableFastRender\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003edefer\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e{\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nt\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eclean }\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Building search index\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003epagefind --root-selector=\u0026#34;main\u0026#34; --logfile search-log.log --silent --site public --output-subdir search/pagefind\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eupload\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nt\"\u003eAWS_ACCESS_KEY_ID\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nt\"\u003eAWS_SECRET_ACCESS_KEY\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nt\"\u003eCLOUDFRONT_DIST_ID\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003epreconditions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003etest -d public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Uploading files\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003eaws s3 sync public/ s3://degruchy.org --storage-class REDUCED_REDUNDANCY --quiet --delete --exclude \u0026#34;*.csv\u0026#34; --exclude \u0026#34;*.caption\u0026#34; --exclude \u0026#34;*.DS_Store\u0026#34; --exclude \u0026#34;.DS_Store\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003edefer\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e{\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nt\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eclean }\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Invalidating caches\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003eaws cloudfront create-invalidation --distribution-id $CLOUDFRONT_DIST_ID --paths \u0026#34;/*\u0026#34; \u0026gt;/dev/null\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eclean\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003epreconditions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003etest -d public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003etest -d resources\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003etest -f search-log.log\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Cleaning up build artefacts\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003erm search-log.log\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003erm -r public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"l\"\u003erm -r resources\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003echeck_dependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003efor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;pagefind\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;hugo\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;aws\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmd\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etest -x $(which {{ .ITEM }})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis ends up being slightly easier to read and maintain. Each bit has it\u0026rsquo;s own\nsection and commands, preconditions and even environments are handled in a\npurpose-driven way that makes it more clear what that section is for. It\u0026rsquo;s\n\u003cem\u003estill\u003c/em\u003e YAML, though, so yuck.\u003c/p\u003e\n\u003cp\u003eHowever, I think I\u0026rsquo;ll give this a spin for a while and see how I like it. \u003ccode\u003emake\u003c/code\u003e\nhas the ~49 year advantage over \u003ccode\u003etask\u003c/code\u003e, but not all new software is \u003cem\u003ebad\u003c/em\u003e, it\njust has to prove itself. \u003ccode\u003emake\u003c/code\u003e has, but it\u0026rsquo;s grown warts over that time, and\nunless you\u0026rsquo;re doing dead simple stuff, it may be more confusing to write than\nYAML. In fact, I had Claude write the loop for me, and some of the other parts\nbecause the syntax is\u0026hellip; terse.\u003c/p\u003e\n","date_modified":"2025-07-14T11:42:02-04:00","date_published":"2025-07-14T11:42:02-04:00","id":"https://degruchy.org/2025/07/14/trying-out-task/","title":"Trying out Task","url":"https://degruchy.org/2025/07/14/trying-out-task/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cblockquote\u003e\n\u003cp\u003eYou get access to a bunch of drunken sailors who spend money irresponsibly\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca\n\thref=\"https://www.pcgamer.com/gaming-industry/knowing-steam-players-are-hoarders-explains-why-you-give-valve-that-30-percent-analyst-tells-devs-you-get-access-to-a-bunch-of-drunken-sailors-who-spend-money-irresponsibly/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.pcgamer.com/gaming-industry/knowing-steam-players-are-hoarders-explains-why-you-give-valve-that-30-percent-analyst-tells-devs-you-get-access-to-a-bunch-of-drunken-sailors-who-spend-money-irresponsibly/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tI mean, they\u0026rsquo;re not \u003cem\u003ewrong\u003c/em\u003e, either.\n\u003c/a\u003e I just object to being called a sailor. I\u0026rsquo;ve never sailed in my life.\u003c/p\u003e\n","date_modified":"2025-07-09T17:29:44-04:00","date_published":"2025-07-09T17:29:44-04:00","id":"https://degruchy.org/2025/07/09/i-feel-a-little-called-out-here/","title":"I Feel a Little Called Out Here","url":"https://degruchy.org/2025/07/09/i-feel-a-little-called-out-here/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\nI love making files organized. It gives me a sense of control over\n\u003cem\u003esomething\u003c/em\u003e in my life without really changing how things work. I\u0026#39;m an\nardent fan of the \u003ca href=\"https://specifications.freedesktop.org/basedir-spec/latest/\"\u003eXDG Base Directory Specification\u003c/a\u003e, I even use it on\nmacOS to organize the various config files that Linux tools tend to\nspread everywhere.\u003c/p\u003e\n\u003cp\u003e\n\u003ca href=\"https://jackson.dev/\"\u003ePatrick Jackson\u003c/a\u003e takes \u003ca href=\"https://jackson.dev/post/stay-out-of-my-project-home/\"\u003ethis ethos to his project root\ndirectory\u003c/a\u003e. Wanting to organize the mess of special tool files that\ninevitably find themselves taking up valuable cognitive space in the\nproject root. These files could easily be put into a configuration\ndirectory or tool director that would keep the project root clean and\nclear for, you know, \u003cem\u003eactual project files\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e\nIt\u0026#39;s odd that we allow these kinds of tools to just spray files\nwhere ever they want. In wildly inconsistent locations, formats and\nstyles. Requiring the fastidious developer to employ yet \u003cem\u003eanother\u003c/em\u003e\ntool (\u003ccode\u003edirenv\u003c/code\u003e) to help fend off the rising tide of tool file\npollution. Are developers of these tools just \u003cem\u003ethat lazy\u003c/em\u003e? Or do they\nnot even think about it, because their tools \u003cem\u003eshould\u003c/em\u003e be the first\nthing you see when you open a repository? Needless to say, I don\u0026#39;t\nfall into that latter camp.\u003c/p\u003e\n\u003cp\u003e\nI\u0026#39;m with Patrick on this one. We need an XDG-style specification\n(informal or not) to take root and provide some guidance for future\ngenerations. Otherwise we\u0026#39;ll start seeing projects with more tool\nlines of code and config than actual program code.\u003c/p\u003e\n","date_modified":"2025-07-03T11:10:43-04:00","date_published":"2025-07-03T11:10:43-04:00","id":"https://degruchy.org/2025/07/03/stay-out-of-my-project-home/","title":"Stay Out of my (Project) $HOME","url":"https://degruchy.org/2025/07/03/stay-out-of-my-project-home/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003ca href=\"https://www.theverge.com/news/694319/project-hail-mary-trailer-ryan-gosling-phil-lord-christopher-miller\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/06/30/project-hail-mary/projecthailmary_poster.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/06/30/project-hail-mary/projecthailmary_poster.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/06/30/project-hail-mary/projecthailmary_poster.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/06/30/project-hail-mary/projecthailmary_poster.jpg\"\n             alt=\"A poster for the \u0026#34;Project Hail Mary\u0026#34; movie\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eProject: Hail Mary\u003c/h4\u003e\u003cp\u003eI\u0026rsquo;m cautiously optimisitic\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eI\u0026rsquo;m going to stay cautiously optimistic about the \u003ca\n\thref=\"https://www.theverge.com/news/694319/project-hail-mary-trailer-ryan-gosling-phil-lord-christopher-miller\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.theverge.com/news/694319/project-hail-mary-trailer-ryan-gosling-phil-lord-christopher-miller\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tannouncement of Andy Weir\u0026rsquo;s\nProject: Hail Mary being made into a movie\n\u003c/a\u003e. I loved the book, and his\n\u0026ldquo;The Martian\u0026rdquo;, so there is a lot of good will hanging on this, but I\u0026rsquo;ve been\ndisappointed too many times this year.\u003c/p\u003e\n","date_modified":"2025-06-30T09:42:52-04:00","date_published":"2025-06-30T09:42:52-04:00","id":"https://degruchy.org/2025/06/30/project-hail-mary/","title":"Project: Hail Mary","url":"https://degruchy.org/2025/06/30/project-hail-mary/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eWe took the family down to Orlando to go to EPCOT and see the sights. It was hot as Hades out, but we found several cool spots to relax in. For dinner, we took the boat from EPCOT\u0026rsquo;s France gate to the Boardwalk and took our sweatiness to the elegant and decidedly \u003cem\u003enot\u003c/em\u003e sweaty \u003ca\n\thref=\"https://thecakebakeshop.com\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://thecakebakeshop.com\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tCake·Bake·Shop\n\u003c/a\u003e.\u003c/p\u003e\n\u003cul class=\"cake-bake-shop gallery\" rel=\"page\"\u003e\u003cli\u003e\n        \u003ca href=\"/2025/06/08/the-cake-bake-shop/IMG_1967.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/06/08/the-cake-bake-shop/IMG_1967_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/06/08/the-cake-bake-shop/IMG_1967_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/06/08/the-cake-bake-shop/IMG_1967_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/06/08/the-cake-bake-shop/IMG_1967_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eRed Velvet Lovelyness\n\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/06/08/the-cake-bake-shop/IMG_1968.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/06/08/the-cake-bake-shop/IMG_1968_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/06/08/the-cake-bake-shop/IMG_1968_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/06/08/the-cake-bake-shop/IMG_1968_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/06/08/the-cake-bake-shop/IMG_1968_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eCookie Dough Cake 🤤\n\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/06/08/the-cake-bake-shop/IMG_1969.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/06/08/the-cake-bake-shop/IMG_1969_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/06/08/the-cake-bake-shop/IMG_1969_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/06/08/the-cake-bake-shop/IMG_1969_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/06/08/the-cake-bake-shop/IMG_1969_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eLemon Blueberry Cake\n\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003c/ul\u003e\n\n\u003cstyle\u003e\n\t@layer post\n\t{\n\t\t.gallery\n\t\t{\n\t\t\talign-content: space-evenly;\n\t\t\tbackground-color: var(--theme-color-alt-background);\n\t\t\tborder: 3px solid var(--theme-color-border);\n\t\t\tborder-radius: 10px;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: center;\n\t\t\tpadding: 0;\n\n\t\t\tli\n\t\t\t{\n\t\t\t\tlist-style-type: none;\n\t\t\t}\n\n\t\t\ta\n\t\t\t{\n\t\t\tcolor: var(--theme-color-alt-foreground);\n\t\t\t}\n\n\t\t\tfigcaption\n\t\t\t{\n\t\t\t\theight: 1.4rem;\n\t\t\t\tmax-width: 128px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\ttext-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n\u003c/style\u003e\n\n\u003cp\u003eOf course, a store with \u0026ldquo;Cake\u0026rdquo; in the first part of the title behooves it\u0026rsquo;s customers to eat some cake. And eat we did. The first one is a red velvet cake (my favorite), the second was a surprisingly amazing cookie dough cake, and the last one was an excellent blueberry lemon cake. 🤤\u003c/p\u003e\n","date_modified":"2025-06-08T14:46:24-04:00","date_published":"2025-06-08T14:46:24-04:00","id":"https://degruchy.org/2025/06/08/the-cake-bake-shop/","title":"The Cake Bake Shop","url":"https://degruchy.org/2025/06/08/the-cake-bake-shop/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\n\n\n\n\u003cfigure\u003e\n  \u003caudio controls \u003e\n\t\n\t\n\t\n\t\u003csource src=\"/2025/06/04/you-are-a-horrible-person/well-done.mp3\" type=\"audio/mp3\"\u003e\n\t\n\t\n\t\u003csource src=\"/2025/06/04/you-are-a-horrible-person/well-done.ogg\" type=\"audio/ogg\"\u003e\n\t\n  \u003c/audio\u003e\n  \n\u003c/figure\u003e\n\n\u003cp\u003eI hope \u003ca\n\thref=\"https://sahillavingia.com/doge\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://sahillavingia.com/doge\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tthis peice of shit felt great that he helped fire\n\u003cstrong\u003ehalf-a-million employees\u003c/strong\u003e\n\u003c/a\u003e and didn\u0026rsquo;t actually positively affect\n\u003cem\u003edick\u003c/em\u003e except make his delusional boss feel like he was accomplishing\nsomething other than pure chaos and attempt to control the government,\nprivately.\u003c/p\u003e\n\u003cp\u003eSahil Lavingia: You are a fucking waste. Please, stop interacting with\nhumanity \u003cstrong\u003eimmediately\u003c/strong\u003e. It\u0026rsquo;s better for everyone involved.\u003c/p\u003e\n","date_modified":"2025-06-04T13:44:12-04:00","date_published":"2025-06-04T13:44:12-04:00","id":"https://degruchy.org/2025/06/04/you-are-a-horrible-person/","title":"You are a horrible person","url":"https://degruchy.org/2025/06/04/you-are-a-horrible-person/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eA post on \u003ca\n\thref=\"https://irreal.org/blog/?p=13016\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://irreal.org/blog/?p=13016\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tIrreal about the customizability of Emacs caught my attention\ntoday\n\u003c/a\u003e. It talks about how younger developers don\u0026rsquo;t use Emacs and why they\nshould. It specifically pulls out the following quote from a \u003ca\n\thref=\"https://news.ycombinator.com/item?id=44024086\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://news.ycombinator.com/item?id=44024086\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tHacker News\npost\n\u003c/a\u003e regarding it:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe specialized app user lives in rented apartments; the Emacs devotee walks\nthrough an ever-expanding mansion whose rooms rearrange themselves to their\nthoughts.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m not sure I entirely agree with the sentiment. Sure, Emacs \u003ca\n\thref=\"https://lmno.lol/alvaro/awesome-emacs-on-macos\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://lmno.lol/alvaro/awesome-emacs-on-macos\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tis \u003cem\u003evastly\u003c/em\u003e more\ncustomizable than pretty much \u003cem\u003eany\u003c/em\u003e other \u003cdel\u003etext editor\u003c/del\u003e tool out there\n\u003c/a\u003e. The\nwhole thing is just a big ball of Elisp sitting atop a VM that handles lower\nlevel interactions in C. You can get away with pretty much anything you want\nwithout having to go through those lower levels, because much of it is exposed\ninside code. Additionally, changes you make to the environment are immediately\navailable to you without any stop/restart/update trickery. This is incredibly\nvaluable when changing things.\u003c/p\u003e\n\u003cp\u003eHowever, I dislike this bit specifically:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ethe Emacs devotee walks through an ever-expanding mansion whose rooms\nrearrange themselves to their thoughts.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eYes, and no. You have to build those rooms yourself. Yes, you \u003cem\u003ecan\u003c/em\u003e build those\nrooms yourself, and building them is easier (or even possible) than it would be\nin any other tool, but you\u0026rsquo;re still building them. There is also the idea of\nneed. Do you \u003cem\u003eneed\u003c/em\u003e such a system that accommodates every bespoke aspect of\nthings? Do you \u003cem\u003eneed\u003c/em\u003e to build a window manager because you don\u0026rsquo;t want to\ncontext switch? Do you \u003cem\u003eneed\u003c/em\u003e to manage your music library in your editor? Do\nyou \u003cem\u003eneed\u003c/em\u003e to read your email, usenet, or RSS posts in your editor? Likely not.\u003c/p\u003e\n\u003cp\u003eI \u003cem\u003elove\u003c/em\u003e that Emacs is so extensible, I love that I can tweak each bit to what I\nprefer. However, I don\u0026rsquo;t \u003cem\u003eneed\u003c/em\u003e it. Most of the tools I use I understand how\nthey work, and fit them into my workflow, or discard them. Most of my\ninteraction with them is not one of frustration or fighting against some\nimagined interaction model. Most of the time I\u0026rsquo;m just \u003cem\u003eusing\u003c/em\u003e the application.\nSure, there are times that I struggle to figure out how or why an application\ndoes the things it does, but those are usually the applications I discard\nbecause they don\u0026rsquo;t fit what I need. Bending their utility to my needs is not\nalways the best solution, I probably don\u0026rsquo;t even need that functionality, if it\u0026rsquo;s\nnot immediately apparent.\u003c/p\u003e\n\u003cp\u003eSome folks want to \u003cem\u003eown\u003c/em\u003e every bit of their environment and change it to their\nbespoke needs. They want every keystroke, every click of a mouse button to\nsummon or dismiss tools as fast as the display can shove the pixels on the\nscreen. That\u0026rsquo;s fine. \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Default_effect\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Default_effect\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tMost people don\u0026rsquo;t do those sorts of things\n\u003c/a\u003e. In fact,\n\u003ca\n\thref=\"https://service-design.co/95-of-the-people-stick-to-the-default-option-9e16316a64e1\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://service-design.co/95-of-the-people-stick-to-the-default-option-9e16316a64e1\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tmost people don\u0026rsquo;t even find the setting screen\n\u003c/a\u003e. While I would certainly\nargue that developers \u003cem\u003edo\u003c/em\u003e look for the settings screens, I\u0026rsquo;ve been pretty\nhorrified working in a tech office where developers have a hard time even\ngetting their \u003cem\u003eown environment\u003c/em\u003e set up correctly. As it turns out, lots of\ndevelopers just do this \u003cem\u003eas a job\u003c/em\u003e. They don\u0026rsquo;t \u003cem\u003ecare\u003c/em\u003e how the tool works and are\nfine with using the default options. Some upstart junior developer can weed\naround in the settings and find changes that will help, but most are just there\nto plug in some code and go home. Coding is not their interest.\u003c/p\u003e\n\u003cp\u003eThere is also the conformity aspect. Some young developer coming into the office\nis not going to be given the choice of development tools. By and large they are\ngoing to be told what tools they use, how the environment is setup and how to\nbuild the application. This will vary from office to office, but conformity is a\nbig thing in large development houses because it reduces defects and keeps\neveryone working the same, without weird one-off setups that break things in new\nand interesting (read: expensive) ways.\u003c/p\u003e\n\u003cp\u003eSo, sure, Emacs is luxurious if you\u0026rsquo;ve got the time and energy to devote to it,\nit\u0026rsquo;s also a completely manipulatable environment that works the way you think it\nshould. It\u0026rsquo;s also old, which kids hate. It\u0026rsquo;s also ugly, which kids hate. It\u0026rsquo;s\nalso extremely fiddly with new technology, which kids hate. I love Emacs. I love\nthat it\u0026rsquo;s ugly, that it\u0026rsquo;s old and well worn, that it interfaces with anything\nthat can output plain text. But it\u0026rsquo;s not \u0026ldquo;cool\u0026rdquo;. VSCode is \u0026ldquo;cool\u0026rdquo;. Cursor is\n\u0026ldquo;cool\u0026rdquo;. Nova and Sublime Text are \u0026ldquo;cool\u0026rdquo;. It doesn\u0026rsquo;t matter how good Emacs is,\nit\u0026rsquo;s \u003cem\u003enot\u003c/em\u003e \u0026ldquo;cool\u0026rdquo; and that makes the effort to learn it that much harder than it\nis to say, get into VSCode, which has GUI\u0026rsquo;s and tools that hook into their\nalready existing workflows of new and cool tools.\u003c/p\u003e\n\u003cp\u003eThat\u0026rsquo;s a huge gap to overcome.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eEdit:\u003c/strong\u003e Jack Baty has also \u003ca\n\thref=\"https://baty.net/posts/2025/05/too-much-rope/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://baty.net/posts/2025/05/too-much-rope/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\trecently posted about how much that effort usually\ntakes\n\u003c/a\u003e. Often Emacs gives us a lot of leeway in how we approach problems.\nThat can end up being a hinderance to actually getting things done. When you\nhave endless customization, where do you stop? Sometimes, less is more.\u003c/p\u003e\n","date_modified":"2025-05-27T11:46:00-04:00","date_published":"2025-05-27T11:46:00-04:00","id":"https://degruchy.org/2025/05/27/on-the-emacs-devotee-walks-through-an-ever-expanding-mansion-whose-rooms-rearrange-themselves-to-their-thoughts./","title":"On: \"The Emacs devotee walks through an ever-expanding mansion whose rooms rearrange themselves to their thoughts.\"","url":"https://degruchy.org/2025/05/27/on-the-emacs-devotee-walks-through-an-ever-expanding-mansion-whose-rooms-rearrange-themselves-to-their-thoughts./"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eOne of the things I\u0026rsquo;ve been surprisingly pleased with is how \u003cem\u003egood\u003c/em\u003e the macOS\napp is for ChatGPT. I don\u0026rsquo;t use it often, but when I do, it\u0026rsquo;s \u003cem\u003ereally nice\u003c/em\u003e to\nhave it be able to peek into a document open in BBEdit, or look at the terminal\nto see the output of a command. I don\u0026rsquo;t know if these are pre-baked integrations\nor are using some sort of universal AppleScript interface to do the magic, but\nit does kind of feel like that: magic.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s even had me reduce my usage of competing tools like Claude or local LLMs\nlike Ollama because I don\u0026rsquo;t have to copy/paste everything in and out of the\nchat. I can just say: \u0026ldquo;Hey, does this look right?\u0026rdquo; and ChatGPT will look at the\ndocument (even just highlighted segments) and offer it\u0026rsquo;s thoughts on it. Very\nhandy. Avoiding the clunky copy/paste routine is probably the experience\nprogrammers are getting when they use tools like Cursor that integrate right\ninto their IDE. It\u0026rsquo;s great!\u003c/p\u003e\n\u003cp\u003e\u003ca\n\thref=\"https://help.openai.com/en/articles/10119604-work-with-apps-on-macos\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://help.openai.com/en/articles/10119604-work-with-apps-on-macos\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tReading into the documentation\n\u003c/a\u003e, it looks like it might be a bit of\nincantation using the Accessibility settings. This means that your app probably\nneeds to have accessibility compatibility that exposes a certain level of\nactions the system can read. Certainly better than trying to manually grab the\ndata out of the app with bespoke rules for each. It also doesn\u0026rsquo;t look like this\nis supported \u003cem\u003eat all\u003c/em\u003e on Windows, which I don\u0026rsquo;t think exposes the same kind of\nuniversal accessibility API.\u003c/p\u003e\n\u003cp\u003eFor all the doom and gloom going on right now in the world, especially about\nApple and their floundering \u0026ldquo;Apple Intelligence\u0026rdquo;, it\u0026rsquo;s nice to see some good\nthings floating about and working well. And if Apple decides to open Siri up to\nusing any of the publicly available models, I\u0026rsquo;d be just as happy. So long as we\ncan get deeper control over where it goes and privacy guarantees about how it\u0026rsquo;s\nused (if at all), then I don\u0026rsquo;t see the problem. Yeah, their plan for Apple\nIntelligence seemed sound, but it doesn\u0026rsquo;t seem like it worked out in practice.\nThe best thing is to admit that they didn\u0026rsquo;t have the chops to get it right, and\neither scrap it or hand it off to someone who \u003cem\u003edoes\u003c/em\u003e.\u003c/p\u003e\n","date_modified":"2025-05-23T12:45:02-04:00","date_published":"2025-05-23T12:45:02-04:00","id":"https://degruchy.org/2025/05/23/chatgpt-as-siri/","title":"ChatGPT as Siri","url":"https://degruchy.org/2025/05/23/chatgpt-as-siri/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eKagi apparently had a meetup in Japan. Setting aside the Kagi stuff, I\u0026rsquo;m always humbled by how \u003cem\u003enice\u003c/em\u003e Japan looks. I know that every city has grimy dirty and poor areas, but even the side roads of Japan look inviting and well kept. I really want to visit it some day.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://www.youtube.com/watch?v=EPm-cjd5rsw\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/05/23/japan-looks-really-pretty/kagi-japan.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/05/23/japan-looks-really-pretty/kagi-japan.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/05/23/japan-looks-really-pretty/kagi-japan.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/05/23/japan-looks-really-pretty/kagi-japan.jpg\"\n             alt=\"A poster picture for Kagi\u0026#39;s Japan meetup\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eKagi x Japan\u003c/h4\u003e\u003cp\u003eKagi is great, but Japan looks gorgeous\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n","date_modified":"2025-05-23T09:23:40-04:00","date_published":"2025-05-23T09:23:40-04:00","id":"https://degruchy.org/2025/05/23/japan-looks-really-pretty/","title":"Japan Looks Really Pretty","url":"https://degruchy.org/2025/05/23/japan-looks-really-pretty/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\nFuck you, DeSantis. Nice to know that our cHilDrEn are top of mind\nwhen dealing with crisises in our state. Can\u0026#39;t get those kickbacks if\nyou\u0026#39;re giving children \\*checks notes\\* food.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBeginning in the 2025-26 school year, there will be 37 schools that\nwill no longer be providing free lunch meals through the Community\nEligibility Provision (CEP). Instead, families with students attending\nthese schools will need to complete an application for free or\nreduced-price meals to receive meal assistance or be directly\ncertified through the State. The full list of affected schools is\nincluded below.\u003c/p\u003e\n\u003cp\u003e\nThese schools do not meet the criteria for the Community Eligibility\nProvision (CEP), a federal program that allows schools to offer free\nmeals to all students. To qualify as a CEP school, 40 percent of\nenrolled students must be eligible for free or reduced-price meals\nthrough other government programs such as SNAP (Supplemental Nutrition\nAssistance Program) or TANF (Temporary Assistance for Needy Families)\nor Medicaid.\u003c/p\u003e\n\u003cp\u003e\nThis change comes after a careful review of our budget for the\nupcoming school year. Since March 2020, we’ve been able to offer free\nmeals to all students districtwide thanks to federal pandemic relief\nfunding. However, that funding has ended, and continuing the program\nwithout it is no longer financially sustainable.\u003c/p\u003e\n\u003c/blockquote\u003e\n","date_modified":"2025-05-21T13:49:33-04:00","date_published":"2025-05-21T13:49:33-04:00","id":"https://degruchy.org/2025/05/21/wont-someone-think-of-the-children-not-if-youre-in-a-red-state./","title":"Won't Someone Think of the Children? Not if You're in a Red State.","url":"https://degruchy.org/2025/05/21/wont-someone-think-of-the-children-not-if-youre-in-a-red-state./"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\nHere\u0026#39;s all the keys that get bound in\n\u003ccode\u003eEmacs.app/Contents/Resources/lisp/term/ns-win.el.gz\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\nI\u0026#39;ve changed it to be unsetting these keys, because I find them\nannoying when I accidentally press them. This gives you more keys to\nallow for customization on macOS. You may want to wrap this in a\n\u003ccode\u003ewhen\u003c/code\u003e stanza to undefine it only on macOS, but that\u0026#39;s up to you.\u003c/p\u003e\n\u003cdiv class=\"src src-elisp\"\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-elisp\" data-lang=\"elisp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e;;; unset macOS keybindings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-,\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nf\"\u003e-\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nf\"\u003e-\u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-~\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e--\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-:\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-?\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-^\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-\u0026amp;\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-C\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-D\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-E\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-L\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-M\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-S\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-a\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-c\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-d\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-e\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-f\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-F\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-g\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-h\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-H\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\M\u003c/span\u003e\u003cspan class=\"nv\"\u003e-\\s-h\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-j\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-k\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-l\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-m\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-n\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-o\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-p\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-q\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-s\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-t\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-u\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-v\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-w\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-x\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-y\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-z\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-+\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-=\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"mi\"\u003e-0\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\s\u003c/span\u003e\u003cspan class=\"nv\"\u003e-|\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003es-kp-bar\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"sc\"\u003e?\\C\u003c/span\u003e\u003cspan class=\"nv\"\u003e-\\s-\u003c/span\u003e \u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003es-right\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003es-left\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003ehome\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003eend\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003ekp-home\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003ekp-end\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003ekp-prior\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003ekp-next\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e;; Allow shift-clicks to work similarly to under Nextstep.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003eS-down-mouse-1\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e;; Special Nextstep-generated events are converted to function keys.  Here\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e;; are the bindings for them.  Note, these keys are actually declared in\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e;; x-setup-function-keys in common-win.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003ens-power-off\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003ens-open-file\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003ens-open-temp-file\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003ens-open-file-line\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003ens-spi-service-call\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003ens-new-frame\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003ens-toggle-toolbar\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eglobal-unset-key\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003ens-show-prefs\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n","date_modified":"2025-05-21T13:42:47-04:00","date_published":"2025-05-21T13:42:47-04:00","id":"https://degruchy.org/2025/05/21/ever-wanted-to-unbind-macos-keybindings-in-emacs/","title":"Ever Wanted to Unbind macOS Keybindings in Emacs?","url":"https://degruchy.org/2025/05/21/ever-wanted-to-unbind-macos-keybindings-in-emacs/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI\u0026rsquo;m gonna use them, and you can\u0026rsquo;t stop me. \u003cimg src=\"/assets/images/emoji/emoji-colbert.gif\" alt=\"An image of a man crossing his\narms, a serious look on his face\" title=\"emoji-colbert.gif\"\u003e\u003c/p\u003e\n","date_modified":"2025-05-19T18:26:16-04:00","date_published":"2025-05-19T18:26:16-04:00","id":"https://degruchy.org/2025/05/19/i-like-finder-tabs/","title":"I Like Finder Tabs","url":"https://degruchy.org/2025/05/19/i-like-finder-tabs/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI love being able to have a local-first bug tracker. One that I can use in a GUI \u003cem\u003eor\u003c/em\u003e in a terminal. Fossil lets me have that. I don\u0026rsquo;t even need to have Gitea or Forjeo installed in a container for it. I just kick off \u003ccode\u003efossil ui\u003c/code\u003e and I can post my own bugs, take notes in the wiki and keep them contained and versioned. I don\u0026rsquo;t need GitHub or CodeBerg. Just my computer, the repository and what I need to do.\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/05/19/i-love-fossil/fossil-ui-bugtracker.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/05/19/i-love-fossil/fossil-ui-bugtracker.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/05/19/i-love-fossil/fossil-ui-bugtracker.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/05/19/i-love-fossil/fossil-ui-bugtracker.jpg\"\u003e\n    \u003c/picture\u003e\n\u003c/figure\u003e\n","date_modified":"2025-05-19T18:15:13-04:00","date_published":"2025-05-19T18:15:13-04:00","id":"https://degruchy.org/2025/05/19/i-love-fossil/","title":"I Love Fossil","url":"https://degruchy.org/2025/05/19/i-love-fossil/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eWell, another round of dark secrets to turn me off of things I\u0026rsquo;ve like or like.\nOne of them is old: \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Scott_Adams#:~:text=In%20February%202023,his%20locals.com%20website.\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Scott_Adams#:~:text=In%20February%202023,his%20locals.com%20website.\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tScott Adams is a racist\n\u003c/a\u003e. However, it appears that \u003ca\n\thref=\"https://www.thewrap.com/dilbert-scott-adams-prostate-cancer-biden/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.thewrap.com/dilbert-scott-adams-prostate-cancer-biden/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\the\u0026rsquo;s\ndying of prostate cancer\n\u003c/a\u003e. The same \u003ca\n\thref=\"https://www.cnn.com/2025/05/18/politics/joe-biden-prostate-cancer\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.cnn.com/2025/05/18/politics/joe-biden-prostate-cancer\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tprostate cancer that is killing Joe\nBiden\n\u003c/a\u003e. So, there\u0026rsquo;s that.\u003c/p\u003e\n\u003cp\u003eThen, we have \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Neil_Gaiman#:~:text=Beginning%20in%202024,denied%20these%20allegations.\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Neil_Gaiman#:~:text=Beginning%20in%202024,denied%20these%20allegations.\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tNeil Gaiman\n\u003c/a\u003e. He\u0026rsquo;s accused of serial rape, along with his\nestranged wife, \u003ca\n\thref=\"https://archive.md/8xhpJ\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://archive.md/8xhpJ\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\twho, allegedly, helped groom girls for him\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI should really just turn off the Internet for the remainder of my life. What a\nshitshow.\u003c/p\u003e\n","date_modified":"2025-05-19T14:49:31-04:00","date_published":"2025-05-19T14:49:31-04:00","id":"https://degruchy.org/2025/05/19/never-meet-your-heroes/","title":"'Never Meet Your Heroes'","url":"https://degruchy.org/2025/05/19/never-meet-your-heroes/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eYeah I said it. Coupled with Rogue One, it is the best Star Wars has to offer.\nSure the original prequels were great, and I revere them as such, but Andor is\nthe best. Hands down. It was sci-fi but not sci-fi. It was a real story about\nloss and finding yourself and being part of something bigger.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s going to take a while to come down off this show. Disney has some mighty\nbig shoes to fill moving forward.\u003c/p\u003e\n","date_modified":"2025-05-18T16:46:54-04:00","date_published":"2025-05-18T16:46:54-04:00","id":"https://degruchy.org/2025/05/18/andor-is-the-best-star-wars-of-all-time/","title":"Andor is the Best Star Wars of All Time","url":"https://degruchy.org/2025/05/18/andor-is-the-best-star-wars-of-all-time/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cul class=\"hot-caturday gallery\" rel=\"page\"\u003e\u003cli\u003e\n        \u003ca href=\"/2025/05/17/hot-caturday/ellie-and-bailey.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/05/17/hot-caturday/ellie-and-bailey_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/05/17/hot-caturday/ellie-and-bailey_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/05/17/hot-caturday/ellie-and-bailey_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/05/17/hot-caturday/ellie-and-bailey_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eDespite it being so hot, they\u0026#39;re soaking up the sun and enjoying the hunt for bugs and lizards\n\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/05/17/hot-caturday/nice-caturday.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/05/17/hot-caturday/nice-caturday_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/05/17/hot-caturday/nice-caturday_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/05/17/hot-caturday/nice-caturday_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/05/17/hot-caturday/nice-caturday_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eIt looks so nice. But it\u0026#39;s really too hot to stay out too long.\n\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003c/ul\u003e\n\n\u003cstyle\u003e\n\t@layer post\n\t{\n\t\t.gallery\n\t\t{\n\t\t\talign-content: space-evenly;\n\t\t\tbackground-color: var(--theme-color-alt-background);\n\t\t\tborder: 3px solid var(--theme-color-border);\n\t\t\tborder-radius: 10px;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: center;\n\t\t\tpadding: 0;\n\n\t\t\tli\n\t\t\t{\n\t\t\t\tlist-style-type: none;\n\t\t\t}\n\n\t\t\ta\n\t\t\t{\n\t\t\tcolor: var(--theme-color-alt-foreground);\n\t\t\t}\n\n\t\t\tfigcaption\n\t\t\t{\n\t\t\t\theight: 1.4rem;\n\t\t\t\tmax-width: 128px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\ttext-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n\u003c/style\u003e\n\n\u003cp\u003eDespite it being 92F here, being in the shade and under a fan makes it slightly more bearable, enough to enjoy time with the cats on the catio.\u003c/p\u003e\n","date_modified":"2025-05-17T12:50:57-04:00","date_published":"2025-05-17T12:50:57-04:00","id":"https://degruchy.org/2025/05/17/hot-caturday/","title":"Hot Caturday","url":"https://degruchy.org/2025/05/17/hot-caturday/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003ca href=\"https://www.youtube.com/watch?v=8aExk3WHGN4\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/05/15/right-in-the-feels/last-scene.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/05/15/right-in-the-feels/last-scene.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/05/15/right-in-the-feels/last-scene.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/05/15/right-in-the-feels/last-scene.jpg\"\n             alt=\"🥹\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eLast Scene\u003c/h4\u003e\u003cp\u003e🥹\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eApple is showcasing more of the \u0026ldquo;Shot on iPhone\u0026rdquo; movies that folks have made. There is \u003ca\n\thref=\"https://www.youtube.com/watch?v=8aExk3WHGN4\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.youtube.com/watch?v=8aExk3WHGN4\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\ta new one out that not only is shot well\n\u003c/a\u003e, but tugs on the heart strings. It\u0026rsquo;s called \u0026ldquo;Last Scene\u0026rdquo; and is very much worth the watch.\u003c/p\u003e\n","date_modified":"2025-05-15T15:09:19-04:00","date_published":"2025-05-15T15:09:19-04:00","id":"https://degruchy.org/2025/05/15/right-in-the-feels/","title":"Right in the Feels","url":"https://degruchy.org/2025/05/15/right-in-the-feels/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eFlorida, why you gotta be so stupid? \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Abstinence-only_sex_education\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Abstinence-only_sex_education\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tWe know it doesn\u0026rsquo;t work\n\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis email is to inform you of recent changes and additions to Board Policy\n4.10, which includes Comprehensive Health Education for students in grades K-12\nand will go into effect in the 2025-26 school year. Most updates center around\nreproductive health and disease prevention education and were approved by the\nSchool Board at its regular monthly meeting on Tuesday, May 6.\u003c/p\u003e\n\u003ch2 id=\"policy-defines-instruction-as-abstinence-based-clarifies-instruction-by-grade\"\u003ePolicy Defines Instruction as Abstinence-Based, Clarifies Instruction by Grade\u003c/h2\u003e\n\u003cp\u003eIn accordance with Florida law, the district has consistently upheld abstinence\nas the expected standard in its educational programming. The Board policy now\nexplicitly affirms that the district\u0026rsquo;s instruction is abstinence-based and\npromotes sexual abstinence. Additionally, the policy stipulates that\n\u0026ldquo;instruction shall include all information required by Florida State Statutes,\u0026rdquo;\nwhich encompasses, but is not limited to, education on the risks and prevention\nof pregnancy, sexually transmitted infections and diseases, and other relevant\ntopics.\u003c/p\u003e\n\u003cp\u003eThe updated policy additionally clarifies the district\u0026rsquo;s ongoing practices in\nproviding current, research-based, age, and developmentally appropriate\ninformation about AIDS, HIV, and other sexually transmitted diseases and\ninfections to students in grades 6-12. In contrast, students in grades K-5 will\nreceive instruction on the prevention and spread of common communicable\ndiseases, like the flu.\u003c/p\u003e\n\u003ch3 id=\"separating-middle-school-students-by-gender-for-reproductive-health-and-disease-prevention\"\u003eSeparating Middle School Students by Gender for Reproductive Health and Disease Prevention\u003c/h3\u003e\n\u003cp\u003eAn addition to Board Policy 4.10 states the superintendent will implement\nprocedures allowing students in grades 6-8 to be separated by gender during\nreproductive health and disease prevention instruction. This is in accordance\nwith Florida State Statute 1000.05 (2)(d).\u003c/p\u003e\n\u003ch3 id=\"ways-parents-can-learn-about-and-opt-children-out-of-instruction\"\u003eWays Parents Can Learn About and Opt Children Out of Instruction\u003c/h3\u003e\n\u003cp\u003eWhile it has long been the district\u0026rsquo;s practice to notify parents about\nreproductive health and disease prevention instruction and provide them with the\noption to opt their child out, the updated policy now clearly outlines these\nprocedures. The new language enhances transparency and ensures consistency\nacross schools by detailing how and when parents are informed, as well as the\nsteps required to decline participation. Among the policy\u0026rsquo;s requirements:\u003c/p\u003e\n\u003cp\u003eParents will receive the opportunity to preview material prior to instruction on\nthe district\u0026rsquo;s website.\u003c/p\u003e\n\u003cp\u003eSchools will disseminate information regarding instructional materials through\nwelcome back packets or other official school communications.\u003c/p\u003e\n\u003cp\u003eNo later than two weeks prior to instruction, schools will provide formal notice\nto parents using two of the three methods: (1) Hard copy correspondence sent\nhome with students, (2) Push notifications through the district\u0026rsquo;s student\ninformation system, and/or (3) Electronic distribution via email or other\ndistrict-approved digital platforms.\u003c/p\u003e\n\u003cp\u003eParents can expect to see changes go into effect in the fall. To read Board\nPolicy 4.10 in its entirety, view Chapter 4 in the board policy handbook.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMaybe someone should tell the folks in The Villages that abstinence is the way\nto go. You know, for God and stuff.\u003c/p\u003e\n","date_modified":"2025-05-13T12:47:41-04:00","date_published":"2025-05-13T12:47:41-04:00","id":"https://degruchy.org/2025/05/13/florida-forces-abstinence-based-sexual-education/","title":"Florida Forces Abstinence-based Sexual Education","url":"https://degruchy.org/2025/05/13/florida-forces-abstinence-based-sexual-education/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eWhen I find a link that I want to share to the world, I add it to \u003ca\n\thref=\"/bookmarks/\"\n\t\n\t\u003e\n\tmy bookmarks\npage\n\u003c/a\u003e and upload it. Except, I don\u0026rsquo;t just have a page of raw links in my\nrepo, I have Hugo generate the page from a much simpler to manage \u003ca\n\thref=\"https://toml.io/en/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://toml.io/en/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tTOML\n\u003c/a\u003e\nfile. This file is fairly long, but orders of magnatude shorter than the\nresultant HTML, and it\u0026rsquo;s far easier to manage.\u003c/p\u003e\n\u003cp\u003eThat being said, the \u003cem\u003eactual creation\u003c/em\u003e of bookmarks requires multiple steps,\nincluding copying the URL, the Title and creating an archive (optional) then\ntelling the bookmark it has one. While this is not \u003cem\u003esuper\u003c/em\u003e complicated, it\u0026rsquo;s a\nlot of back and forth between Safari and BBEdit. I can sometimes get confused\nabout what the \u0026lsquo;stack\u0026rsquo; order of Command-Tab and end up in different\nwindows/applications. So, I decided to fix it.\u003c/p\u003e\n\u003ch2 id=\"shortcut-to-the-win\"\u003eShortcut to the Win\u003c/h2\u003e\n\u003cp\u003eI had a couple of ideas where I could use AppleScript, or Automator, but both of\nthose tools are dated and not as well supported by the upstart Shortcuts. Not\nonly are the Shortcuts created on macOS useful, but they can work on iOS and\niPadOS, too. They\u0026rsquo;re also synced across devices on your account, making it a\nno-brainer.\u003c/p\u003e\n\u003cp\u003eUltimately, I need to make the following out of as much information as I can\ngather.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003ebookmark\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eadded\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2025-05-13\u003c/span\u003e \u003cspan class=\"mi\"\u003e12\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e20-04\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e00\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Page title\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Current Safari URL\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003earchive\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eHere\u0026rsquo;s my Shortcut:\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/05/13/shortcut-to-bookmarking/shortcut.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/05/13/shortcut-to-bookmarking/shortcut.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/05/13/shortcut-to-bookmarking/shortcut.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/05/13/shortcut-to-bookmarking/shortcut.jpg\"\n             alt=\"An image of the Shortcut Edit Shortcut window\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eGrab all the Details\u003c/h4\u003e\u003cp\u003eThis makes it so much faster to add bookmarks.\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003e\u003ca\n\thref=\"make-shortcut.shortcut\"\n\t\n\t\u003e\n\t(download a copy of the shortcut here.)\n\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAnd the details pane\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/05/13/shortcut-to-bookmarking/shortcut-details.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/05/13/shortcut-to-bookmarking/shortcut-details.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/05/13/shortcut-to-bookmarking/shortcut-details.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/05/13/shortcut-to-bookmarking/shortcut-details.jpg\"\n             alt=\"Adding the \u0026ldquo;Show in Share Pane\u0026rdquo; makes this work\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003cp\u003eAdding the \u0026ldquo;Show in Share Pane\u0026rdquo; makes this work\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eOne thing that tripped me up is that Shortcuts doesn\u0026rsquo;t use any of the standard\ndate formatting methods that I\u0026rsquo;ve seen. It uses \u003ca\n\thref=\"https://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tUnicode Date Formatting\n\u003c/a\u003e,\nwhich I had to hunt around for to get the RFC date formatting correct.\nUltimately, this is the string that worked: \u003ccode\u003eyyyy-MM-dd HH:mm:ssXXX\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eUsing this shortcut, I can now use any share pane and grab the URL, Title and\nCurrent Date in RFC format and have a nicely formatted TOML fragment that I\ncan just paste into my bookmarks file.\u003c/p\u003e\n\u003cp\u003eI did the same thing with my wishlist items. Though that still requires some\nmanual intervention for the image. I also run that through Retrobatch to\nreformat, resize and downsample for the site.\u003c/p\u003e\n","date_modified":"2025-05-13T11:47:07-04:00","date_published":"2025-05-13T11:47:07-04:00","id":"https://degruchy.org/2025/05/13/shortcut-to-bookmarking/","title":"Shortcut to Bookmarking","url":"https://degruchy.org/2025/05/13/shortcut-to-bookmarking/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cvideo poster=\"earthquake-myanmar.jpg\" controls preload=\"auto\" width=\"100%\"  poster=\"/2025/05/13/watch-the-earth-move-in-myanmar-earthquake/earthquake-myanmar.jpg\" playsinline class=\"\"\u003e\n    \u003csource src=\"/2025/05/13/watch-the-earth-move-in-myanmar-earthquake/earthquake-myanmar.webm\" type=\"video/webm\"\u003e\n    \u003csource src=\"/2025/05/13/watch-the-earth-move-in-myanmar-earthquake/earthquake-myanmar.ogv\" type=\"video/ogg\"\u003e\n    \u003csource src=\"/2025/05/13/watch-the-earth-move-in-myanmar-earthquake/earthquake-myanmar.mp4\" type=\"video/mp4\"\u003e\n  \u003cspan\u003e\u003c/span\u003e\n\u003c/video\u003e\n\u003cp\u003eNote the light pole (the one with the solar panel on it) and the large power\ntransmission line on the right in the background. The whole area just\u0026hellip;shifts\nabout 3-5 feet. Unreal!\u003c/p\u003e\n","date_modified":"2025-05-13T10:26:34-04:00","date_published":"2025-05-13T10:26:34-04:00","id":"https://degruchy.org/2025/05/13/watch-the-earth-move-in-myanmar-earthquake/","title":"Watch the Earth Move in Myanmar Earthquake","url":"https://degruchy.org/2025/05/13/watch-the-earth-move-in-myanmar-earthquake/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eJust migrated over to AWS/CloudFront/S3/Washtub/Whatever, again. The bill for my\nvery small Hetzner host was far outside reasonable, especially since I wasn\u0026rsquo;t\nreally running anything on it except this site, Vaultwarden and Miniflux, all\nthings I can run locally or drop on AWS and forget about them.\u003c/p\u003e\n\u003cp\u003eIt also means one less \u003cem\u003ething\u003c/em\u003e to have to babysit and take care of. Sorry if\nmy RSS feed blew up in your reader. Nothing changed, but it may have gotten new\netags or somesuch and caused it to redownload the whole thing.\u003c/p\u003e\n","date_modified":"2025-05-12T19:16:39-04:00","date_published":"2025-05-12T19:16:39-04:00","id":"https://degruchy.org/2025/05/12/new-host-who-dis/","title":"New Host, Who Dis?","url":"https://degruchy.org/2025/05/12/new-host-who-dis/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI don\u0026rsquo;t like to hate people. It feels \u003cem\u003ewrong\u003c/em\u003e. Yet, I find myself hating people\nthat I don\u0026rsquo;t agree with. Not \u003cem\u003eeveryone\u003c/em\u003e I disagree with, but the vocal set of\nthem. Hate is something that I had while I was a much younger man. I ran off it.\nRage at the world that I felt was so unfair and uninterested in noticing me. As\nI grew, I grew to let go of that hate because it wore me out. I didn\u0026rsquo;t see a\npoint in wasting so much energy on stuff I couldn\u0026rsquo;t change.\u003c/p\u003e\n\u003cp\u003eNow, I don\u0026rsquo;t see a point in being that pragmatic anymore.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m tired of boot-licking, racist, sexist, homophobe assholes who are actively\ntrying to hurt people, innocent people all in the name of power and money. The\ncurrent crop of Nazis in power want to do everything they can to tear away any\nvestige of public-ownership of organizations, and therefore any governmental\nsafeguards that protect those who are marginalized and hurt the \u003cem\u003emost\u003c/em\u003e by\nbigoted shit-eaters like Trump and Company.\u003c/p\u003e\n\u003cp\u003eI hate Trump. I hate him and his goons. I hate that half the country have\nsomehow decided that instead of a government by and for the people, it should be\nby and for oligarchs and monopolists. Fuck them. I hate them, too. Too stupid to\nunderstand that they voted against their self-interests, too stupid to realize\nthat this unchecked hatred and bigotry serves their corporate overlords and only\nhurts the \u0026ldquo;enemy\u0026rdquo; by proxy. The fact that they see half the fucking country as\n\u0026ldquo;enemies\u0026rdquo; because they aren\u0026rsquo;t gender-confirming or originally from here\n(spoilers: no one here was \u0026ldquo;from here\u0026rdquo; except the oft oppressed native\npopulation). Fuck them.\u003c/p\u003e\n\u003cp\u003eNo one wants to listen to me, so it doesn\u0026rsquo;t matter. I\u0026rsquo;m done trying to be nice\nabout this. Fuck these people. We the people deserved so much better.\u003c/p\u003e\n","date_modified":"2025-05-08T15:00:54-04:00","date_published":"2025-05-08T15:00:54-04:00","id":"https://degruchy.org/2025/05/08/the-hate-in-my-heart/","title":"The Hate in my Heart","url":"https://degruchy.org/2025/05/08/the-hate-in-my-heart/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\u003ca\n\thref=\"https://www.cnn.com/world/live-news/new-pope-conclave-day-two-05-08-25\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.cnn.com/world/live-news/new-pope-conclave-day-two-05-08-25\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tNew Pope; Who dis?\n\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhereas Francis said, “Who am I to judge?” when asked about gay clerics,\nCardinal Prevost has expressed less welcoming views to L.G.B.T.Q. people.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca\n\thref=\"https://archive.ph/20250508172005/https://www.nytimes.com/2025/05/02/world/americas/pope-candidate-cardinal-robert-francis-prevost.html\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://archive.ph/20250508172005/https://www.nytimes.com/2025/05/02/world/americas/pope-candidate-cardinal-robert-francis-prevost.html\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tNew York Times\n\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWell, lets see how this shakes out.\u003c/p\u003e\n","date_modified":"2025-05-08T13:39:23-04:00","date_published":"2025-05-08T13:39:23-04:00","id":"https://degruchy.org/2025/05/08/new-pope.-less-friendly-as-old-pope/","title":"New Pope. Less Friendly as Old Pope","url":"https://degruchy.org/2025/05/08/new-pope.-less-friendly-as-old-pope/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\u003ca\n\thref=\"https://wdwnt.com/2025/05/breaking-the-walt-disney-company-announces-new-theme-park-in-abu-dhabi/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://wdwnt.com/2025/05/breaking-the-walt-disney-company-announces-new-theme-park-in-abu-dhabi/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tYep, that\u0026rsquo;s right\n\u003c/a\u003e. Abu Dhabi, yes \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Abu_Dhabi#Human_rights\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Abu_Dhabi#Human_rights\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\t\u003cem\u003ethat\u003c/em\u003e Abu Dhabi\n\u003c/a\u003e. Though,\ntellingly, they\u0026rsquo;re \u003ca\n\thref=\"https://wdwnt.com/2025/05/disney-to-oversee-creative-development-but-will-not-pay-for-or-operate-new-abu-dhabi-park/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://wdwnt.com/2025/05/disney-to-oversee-creative-development-but-will-not-pay-for-or-operate-new-abu-dhabi-park/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tnot actually going to \u003cem\u003erun\u003c/em\u003e or even \u003cem\u003epay\u003c/em\u003e for the\npark\n\u003c/a\u003e. Just oversee creative matters. How that\u0026rsquo;s going to translate\ninto guest experience, I don\u0026rsquo;t know. Bob had some glowing words to say\nabout his new UAE partners:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[Miral has] already demonstrated a commitment to quality in that\nregard. This is essentially a license arrangement, but with\nconsiderable involvement from us. So although they will operate it,\nwe will have employees embedded in the organization with them to\nhelp them operate a Disney theme park, basically at the quality\nlevel that everybody is used to.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSo, they\u0026rsquo;ll be working it from the inside. How long that\u0026rsquo;ll last is\nanyone\u0026rsquo;s guess. However, I\u0026rsquo;m concerned about the rampant human rights\nabuses that the UAE seems to revel in, is going to play with a \u003cem\u003etheme\npark\u003c/em\u003e. Disney is not shy about controlling their message, but having\nto bend to the will of a crown prince in a \u003cem\u003eliteral\u003c/em\u003e monarchy is going\nto be an \u003ca\n\thref=\"https://wdwnt.com/2025/04/first-2025-rainbow-pride-pins-available-at-walt-disney-world/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://wdwnt.com/2025/04/first-2025-rainbow-pride-pins-available-at-walt-disney-world/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tinteresting line to walk\n\u003c/a\u003e. I wouldn\u0026rsquo;t be expecting any\npride parades or merch, let alone any actual welcoming behavior from\nthe workers there. I wonder how they\u0026rsquo;ll handle talking shit about\ntheir government.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThere are reports of forced disappearances of foreign nationals and\nEmirati citizens, who have been abducted, illegally detained and\ntortured in undisclosed locations, and denied the right to a speedy\ntrial or access to counsel during investigations by the UAE\ngovernment. The non-governmental organization (NGO) Human Rights\nWatch, states that Emirati laws maintain capital punishment and\ndiscriminate against women, migrants and LGBTQ individuals.\n\u003ca\n\thref=\"https://en.wikipedia.org/wiki/Human_rights_in_the_United_Arab_Emirates\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Human_rights_in_the_United_Arab_Emirates\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tWikipedia\n\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eYeah, very Disney.\u003c/p\u003e\n\u003cp\u003eBob. This is a boondoggle. I hope you have some \u003cem\u003every\u003c/em\u003e good guarantees\nabout visitor safety.\u003c/p\u003e\n\u003cp\u003eNo thanks. I\u0026rsquo;ll visit all but Shanghai and, now, Abu Dhabi. It\u0026rsquo;s a\nshame, because both look like nice places. I just can\u0026rsquo;t trust the\ngovernment there to not black-bag me. Hell, I can\u0026rsquo;t trust the\ngovernment \u003cem\u003ehere\u003c/em\u003e to not black bag me.\u003c/p\u003e\n","date_modified":"2025-05-07T13:32:19-04:00","date_published":"2025-05-07T13:32:19-04:00","id":"https://degruchy.org/2025/05/07/disney-is-building-a-new-park-in-abu-dhabi/","title":"Disney is Building a new Park in Abu Dhabi","url":"https://degruchy.org/2025/05/07/disney-is-building-a-new-park-in-abu-dhabi/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\nToday, I wanted to try out my newly downloaded Gemma3 model and see if\nit could answer a question that had been on my mind lately: There are\nare quite a few features and similarities between BBEdit and\nEmacs. Things like scratch buffers, Emacs keybindings and even a\nfull-blown simulation mode that extends BBEdit\u0026#39;s controls to Emacs\nequivalants. Thus, I spake into the mouthpiece:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI see a lot of similarities between Emacs and BBEdit. Things like\nscratchpads, emacs keybindings, and other small tweaks here and there\nare very reminicent of Emacs. Is that on purpose?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\nA simple enough question. I don\u0026#39;t know what kind of knowledge that has\nbeen imbuded in Gemma, but I would imagine a question like this is old\nenough that it would have made it into their knowledge by now. Emacs\nis old, and so is BBEdit.\u003c/p\u003e\n\u003cp\u003e\nIt\u0026#39;s answer:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYou\u0026#39;ve hit on a really interesting and surprisingly common\nobservation! The similarities between BBEdit and Emacs are absolutely\nintentional, and it\u0026#39;s a direct result of BBEdit\u0026#39;s creator, Byron Alan\nJohnson, being a long-time Emacs user and admirer. Here\u0026#39;s a breakdown\nof why and how that happened:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eByron Alan Johnson\u0026#39;s Emacs Love:\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\nSTOP!\u003c/p\u003e\n\u003cp\u003e\nOkay, what? Byron Alan Johnson? I can\u0026#39;t find this guy\n\u003cem\u003eanywhere\u003c/em\u003e. Searches come up with lots of names similar to that, but\n\u003cem\u003enothing\u003c/em\u003e about BBEdit, Barebones and similar. Not only can I not find\na guy named Byron Alan Johnson who is alive today, but I can\u0026#39;t find\none that is in technology. I checked \u003ca href=\"https://www.barebones.com/company/history.html\"\u003eBBEdit\u0026#39;s site\u003c/a\u003e and can\u0026#39;t find any\nmention of him. Nor can I find it in the \u003ca href=\"https://groups.google.com/g/comp.sys.mac.announce/c/gvPGyuX3UCs\"\u003eannouncement post for the\ninitial release of BBEdit\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\nI went back and asked Gemma about this, providing links and\nrefutations of the supposed Byron person, and it seemed to \u003cem\u003edouble\ndown\u003c/em\u003e on it\u0026#39;s hallucination:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYou’ve hit on a crucial and often overlooked detail! You are\nabsolutely correct – Rich Siegel is indeed the principal developer and\noriginator of BBEdit, as stated on the Barebones Software website and\ncorroborated by Wikipedia.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\nOkay, great!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMy apologies for the misdirection in my previous responses. I was so\nfocused on Byron Alan Johnson’s influence and role that I failed to\nproperly acknowledge Rich Siegel’s central contribution\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\nOh lord.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eByron Alan Johnson was the visionary who conceived of BBEdit,\nidentified the need for a powerful text editor for macOS, and secured\nfunding and initial support. He essentially provided the concept and\ndirection, while Rich Siegel brought the execution to life.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\nI don\u0026#39;t even get a hit on searching \u003cem\u003ejust\u003c/em\u003e their site for Byron. Damn,\nI\u0026#39;ll have what Gemma\u0026#39;s having.\u003c/p\u003e\n\u003cp\u003e\n\u003ca href=\"/assets/archives/2025-05-06_baj-gemma-drugs.md\"\u003eThe whole conversation is here\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\nI guess I\u0026#39;ll switch models and try again.\u003c/p\u003e\n","date_modified":"2025-05-06T15:08:12-04:00","date_published":"2025-05-06T15:08:12-04:00","id":"https://degruchy.org/2025/05/06/sometimes-ai-does-drugs/","title":"Sometimes, AI Does Drugs","url":"https://degruchy.org/2025/05/06/sometimes-ai-does-drugs/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cul class=\"caturday gallery\" rel=\"page\"\u003e\u003cli\u003e\n        \u003ca href=\"/2025/05/05/late-caturday/ellie.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/05/05/late-caturday/ellie_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/05/05/late-caturday/ellie_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/05/05/late-caturday/ellie_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/05/05/late-caturday/ellie_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eEllie, not knowing if she wants to go back in, or to snuggle\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/05/05/late-caturday/bailey.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/05/05/late-caturday/bailey_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/05/05/late-caturday/bailey_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/05/05/late-caturday/bailey_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/05/05/late-caturday/bailey_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eJust loungin\u0026#39; with his dad\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/05/05/late-caturday/ellie-bailey.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/05/05/late-caturday/ellie-bailey_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/05/05/late-caturday/ellie-bailey_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/05/05/late-caturday/ellie-bailey_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/05/05/late-caturday/ellie-bailey_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eEllie is checkin\u0026#39; out the digs, seein\u0026#39; if there\u0026#39;s room.\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/05/05/late-caturday/snuggle.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/05/05/late-caturday/snuggle_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/05/05/late-caturday/snuggle_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/05/05/late-caturday/snuggle_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/05/05/late-caturday/snuggle_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eEllie makes room for herself\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003c/ul\u003e\n\n\u003cstyle\u003e\n\t@layer post\n\t{\n\t\t.gallery\n\t\t{\n\t\t\talign-content: space-evenly;\n\t\t\tbackground-color: var(--theme-color-alt-background);\n\t\t\tborder: 3px solid var(--theme-color-border);\n\t\t\tborder-radius: 10px;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: center;\n\t\t\tpadding: 0;\n\n\t\t\tli\n\t\t\t{\n\t\t\t\tlist-style-type: none;\n\t\t\t}\n\n\t\t\ta\n\t\t\t{\n\t\t\tcolor: var(--theme-color-alt-foreground);\n\t\t\t}\n\n\t\t\tfigcaption\n\t\t\t{\n\t\t\t\theight: 1.4rem;\n\t\t\t\tmax-width: 128px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\ttext-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n\u003c/style\u003e\n\n","date_modified":"2025-05-05T14:37:37-04:00","date_published":"2025-05-05T14:37:37-04:00","id":"https://degruchy.org/2025/05/05/late-caturday/","title":"Late Caturday","url":"https://degruchy.org/2025/05/05/late-caturday/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI feel drained, lately. I think it\u0026rsquo;s, in part, due to me trying to lower my\ncaffeine intake, and part me worrying about too much. I know I shouldn\u0026rsquo;t. What\u0026rsquo;s\ngoing on in the world is largely outside of my control and that as bad as it is\nfor a lot of people, I\u0026rsquo;ll likely be fine. While-male-privilege and all. It’s at\nwork, too. Trying to keep face while inside I’m in turmoil over everything going\non. Feeling helpless and broken. I just don’t know what to do anymore.\u003c/p\u003e\n\u003cp\u003eI think, too, that I don’t care anymore. Let them have it all. Let them tear\neverything apart. Let them enslave, kill, deport and imprison everything they\ndon’t like. I don’t care. I don’t have care to give anymore. I’m out. Someone\nelse feel things for me. I don’t want to anymore.\u003c/p\u003e\n","date_modified":"2025-05-05T13:26:07-04:00","date_published":"2025-05-05T13:26:07-04:00","id":"https://degruchy.org/2025/05/05/no-more-care-to-give/","title":"No More Care to Give","url":"https://degruchy.org/2025/05/05/no-more-care-to-give/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eSometimes. I feel like I know what I\u0026rsquo;m talking about. I can wax lyrical about\ncomplex topics and reason about them pretty well. Most other times, though, I\njust dont \u003cem\u003eunderstand\u003c/em\u003e. It\u0026rsquo;s usually this way with programming. I can pick my\nway through some code and maybe understand 40% of it, more if there are good\ncomments. Writing code, though, is something that I struggle \u003cem\u003emightily\u003c/em\u003e with.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not a programmer. I know that. I gave up that nascent part of me more than\n10 years ago. I wasn\u0026rsquo;t even a \u003cem\u003ereal\u003c/em\u003e programmer. I worked on Drupal and PHP with\nsome light HTML/CSS/JS. Most of it wasn\u0026rsquo;t \u003cem\u003ehard\u003c/em\u003e and when I wasn\u0026rsquo;t doing that, I\nwas being a jockey for \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Microsoft_InfoPath\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Microsoft_InfoPath\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tInfoPath\n\u003c/a\u003e forms. Again, I had little need to\n\u003cem\u003ecreate\u003c/em\u003e anything. I could just glue together some stuff and call it a day. The\nReal Programmers™ did the heavy lifting and I just did make-work to pay\nthe bills.\u003c/p\u003e\n\u003cp\u003eNow that I\u0026rsquo;m older, I fancy myself as something \u003cem\u003emore\u003c/em\u003e than an IT Professional.\nI know enough about a couple of programming languages that I get the \u003cem\u003egist\u003c/em\u003e of\nit, but not really the whole story. I can write half-way decent Bash scripts,\nLua and if push-comes-to-shove Python. I also can dust off my old webadmin hat\nand write some HTML/CSS and JS, but not to any real proficiency. I feel like I\u0026rsquo;m\nfaking it.\u003c/p\u003e\n\u003cp\u003eThis isn\u0026rsquo;t the so-called \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Impostor_syndrome\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Impostor_syndrome\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tImpostor Syndrome\n\u003c/a\u003e, because I\u0026rsquo;m not doing this\nprofessionally, I\u0026rsquo;m doing this on my own. I find that despite being able to move\nthe bits around, I can\u0026rsquo;t seem to make anything creative flow out of me. No\nimpetus to create, even if I feel like that I might be able to, no \u003cem\u003eitch\u003c/em\u003e to\nscratch on my own, even though I see 100 stupid \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Paper_cut_bug\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Paper_cut_bug\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tpaper-cut issues\n\u003c/a\u003e every day.\nI don\u0026rsquo;t know if what I am is just incredibly lazy, tolerant or …\ndefective. I buy and collect all the tooling to make me productive at any number\nof things. Coding, video editing, photo editing and more. I have no \u003cem\u003euse\u003c/em\u003e for\nthese because I\u0026rsquo;ve got no creative desire. No drive that pushes me past the\ndicking around part of learning to code and into the \u0026ldquo;wow this is really useful,\nwhat if I could make this thing to fix that thing that I don\u0026rsquo;t like!\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eSome people might call this \u0026ldquo;being content.\u0026rdquo; It bothers me, though. Maybe\nbecause I surround myself with people who program, because I like the programs\nthey use, like Emacs. I try to fashion myself into a more complex individual\nthat \u003cem\u003ecould\u003c/em\u003e be a programmer, but in reality is just some guy who is better than\naverage at a bunch of stuff, but doesn\u0026rsquo;t really excel in anything individually.\u003c/p\u003e\n\u003cp\u003eIt frustrates me to be this way. I feel like I \u003cem\u003ecould\u003c/em\u003e do more, but then I hit\na wall and nothing I do makes any sense. Like there is an artificial barrier\nkeeping me from moving on. I don\u0026rsquo;t have any formal training as a programmer, and\nwhile I could go back to school, I don\u0026rsquo;t think it\u0026rsquo;d be financially worth-while\nfor me and my family. I\u0026rsquo;m also wondering if that wouldn\u0026rsquo;t just underscore my\ndefectiveness.\u003c/p\u003e\n\u003cp\u003eThis feeling also seems to dovetail with some of the core concepts that I\u0026rsquo;ve\nbuilt up around myself. Linux is harder than using Windows or macOS. Self-\nhosting is harder than managed hosting. Using \u003ccode\u003ehugo\u003c/code\u003e is harder than WordPress.\nSetting up Exchange Online is more work than just getting the Office 365 bundle\nfor families. Emacs is harder to use than Notepad; Every choice I make seems to\nrevolve around doing things harder than they need to be because I want to be\nthat person that is knowledgeable and \u0026ldquo;in control\u0026rdquo;. I use plain-text because its\n\u0026ldquo;more reliable\u0026rdquo; when I have no experience with issues in any other format.\nNothing I do makes anyone around me happier, or makes them trust me more, or\nhas them rely on my knowledge more. If anything, it drives them away because\nthey don\u0026rsquo;t understand the issues, or I\u0026rsquo;m seen as an extreme viewpoint.\u003c/p\u003e\n\u003cp\u003eI feel like, when it comes to computers, I\u0026rsquo;m like that stanza from \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Creep_%28Radiohead_song%29\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Creep_%28Radiohead_song%29\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tRadiohead\u0026rsquo;s\n\u0026ldquo;Creep\u0026rdquo;\n\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip; but I\u0026rsquo;m a creep\u003cbr\u003e\nI\u0026rsquo;m a weirdo\u003cbr\u003e\nWhat the hell am I doing here?\u003cbr\u003e\nI don\u0026rsquo;t belong here\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMaybe I should stop trying to be something I\u0026rsquo;m not. If I do that, though, then\nwhat \u003cem\u003eam I\u003c/em\u003e?\u003c/p\u003e\n","date_modified":"2025-05-02T18:33:46-04:00","date_published":"2025-05-02T18:33:46-04:00","id":"https://degruchy.org/2025/05/02/sometimes-i-feel-defective/","title":"Sometimes, I Feel Defective","url":"https://degruchy.org/2025/05/02/sometimes-i-feel-defective/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI wanted to see if I was missing out on anything in the built-in Apple Terminal\napp over using GhosTTY, which is really fast. It turns out, yes, there are some\nneat \u003ca\n\thref=\"https://support.apple.com/guide/terminal/display-or-hide-the-alternate-screen-trmld1f46097/2.14/mac/15.4.1\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://support.apple.com/guide/terminal/display-or-hide-the-alternate-screen-trmld1f46097/2.14/mac/15.4.1\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tfeatures that other terminals don\u0026rsquo;t have, like \u0026ldquo;Alternate Screens\u0026rdquo;\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eBasically, your standard screen is the log of commands and the returned text, if\nany. Then, if you run any interactive applications, like \u003ccode\u003eless\u003c/code\u003e or \u003ccode\u003enano\u003c/code\u003e, then\n\u003cem\u003ethat\u003c/em\u003e gets pushed to an alterative screen while you\u0026rsquo;re in the app. You can\ntoggle each of these screens with the \u0026ldquo;[Show|Hide] Alternate Screen\u0026rdquo; item in the\nmenu, or with the \u003ccode\u003e⇧-⌘-↑\u003c/code\u003e/\u003ccode\u003e⇧-⌘-↓\u003c/code\u003e keyboard commands.\u003c/p\u003e\n","date_modified":"2025-05-02T13:31:37-04:00","date_published":"2025-05-02T13:31:37-04:00","id":"https://degruchy.org/2025/05/02/apples-terminal.app-has-a-neat-feature/","title":"Apple's Terminal.app Has a Neat Feature","url":"https://degruchy.org/2025/05/02/apples-terminal.app-has-a-neat-feature/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/05/02/maka/maka.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/05/02/maka/maka.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/05/02/maka/maka.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/05/02/maka/maka.jpg\"\n             alt=\"I mean, just look at that tummy!\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eA Much Improved CNN Homepage\u003c/h4\u003e\u003cp\u003eI mean, just \u003cem\u003elook\u003c/em\u003e at that tummy!\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eFrom the \u003ca\n\thref=\"https://tomroyal.com/make-america-kittens-again-faq/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://tomroyal.com/make-america-kittens-again-faq/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tMake America Kittens Again\n\u003c/a\u003e addon.\u003c/p\u003e\n","date_modified":"2025-05-02T09:06:31-04:00","date_published":"2025-05-02T09:06:31-04:00","id":"https://degruchy.org/2025/05/02/maka/","title":"MAKA","url":"https://degruchy.org/2025/05/02/maka/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\n\u003cp\u003e\nOne of the challenges of being someone who \u003cstrong\u003ereally\u003c/strong\u003e likes Emacs is\naccepting that, in today’s world, interacting with most people means\ndealing with calendar appointments via email—usually through Outlook\nor iOS/macOS Mail.  That makes it difficult to fully embrace\nOrg-mode’s excellent scheduling and organizational features. There are\na number of iOS apps (of varying quality) that can open org files, but\nmost simply let you edit the files directly, leaving calendars and\ntasks to be handled by separate apps.\u003c/p\u003e\n\u003cdiv id=\"outline-container-headline-1\" class=\"outline-3\"\u003e\n\u003ch3 id=\"headline-1\"\u003e\nEnter Beorg\n\u003c/h3\u003e\n\u003cdiv id=\"outline-text-headline-1\" class=\"outline-text-3\"\u003e\n\u003cp\u003e\n\u003ca href=\"https://www.beorgapp.com/\"\u003eBeorg\u003c/a\u003e for iOS works a bit differently. It\u0026#39;s an \u003ca href=\"http://orgmode.org\"\u003eOrg-mode\u003c/a\u003e tool designed\nfor working with org files—especially calendars, appointments, and\ntasks.  What makes it interesting is that it also syncs your org-mode\ncalendar entries and tasks with the iOS system calendar and\nreminders. So if you schedule an appointment in your org file, Beorg\ncan publish it to your calendar. That’s pretty neat.\u003c/p\u003e\n\u003cp\u003e\nEven better, this isn’t one-way sync. Beorg can pull in existing\ncalendar data and create a new org file with the relevant information,\nwhich you can then include in your Org agenda view.\u003c/p\u003e\n\u003cp\u003e\nWhile this doesn’t entirely solve the problem of sending calendar\ninvites from Emacs via Org, it \u003cstrong\u003edoes\u003c/strong\u003e smooth out some of the rough\nedges that made calendar management in Emacs a bit clunky. I\u0026#39;m\nhonestly surprised there isn’t a full-blown connector app that runs on\nyour phone, watches your org files, and updates the calendar or sends\ninvites using native system tools. I would have \u003cstrong\u003eloved\u003c/strong\u003e that back when\nI was managing email with \u003ccode\u003enotmuch\u003c/code\u003e and limping along with \u003ccode\u003ediary\u003c/code\u003e and\n\u003ccode\u003eappt\u003c/code\u003e, juggling items between Emacs and my online calendar.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv id=\"outline-container-headline-2\" class=\"outline-3\"\u003e\n\u003ch3 id=\"headline-2\"\u003e\nCaptee and Scrim\n\u003c/h3\u003e\n\u003cdiv id=\"outline-text-headline-2\" class=\"outline-text-3\"\u003e\n\u003cp\u003e\nBeyond calendar support, I’ve recently come across two additional\nmacOS tools that make working with Org-mode more enjoyable: Captee and\nScrim.\u003c/p\u003e\n\u003cp\u003e\nI often find myself collecting links—articles to read, tools to try,\nideas to revisit. Usually this involves copying the URL from the\naddress bar or using the share menu, but those methods feel\nlacking. They don’t capture the page title, and certainly not my\nthoughts at the time.\u003c/p\u003e\n\u003cp\u003e\nCaptee helps here. It gathers the key metadata (like the page title),\nallows you to add notes, and exports the result in either Markdown or\nOrg-mode format. You can copy that data to the clipboard or, with the\nhelp of Scrim, send it directly into Emacs using \u003ccode\u003eorg-protocol://\u003c/code\u003e,\ntriggering an Org-mode capture template and storing it automatically.\u003c/p\u003e\n\u003cp\u003e\nIn an ideal world, we wouldn’t need workarounds like this. But given\nthe sandboxing on macOS, I appreciate that these tools exist—and\nhonestly, I’d rather deal with a little friction in exchange for\nstronger app isolation.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv id=\"outline-container-headline-3\" class=\"outline-3\"\u003e\n\u003ch3 id=\"headline-3\"\u003e\nBeorg Problems\n\u003c/h3\u003e\n\u003cdiv id=\"outline-text-headline-3\" class=\"outline-text-3\"\u003e\n\u003cp\u003e\nThat said, I’ve run into a few issues with Beorg.\u003c/p\u003e\n\u003cp\u003e\nFirst, syncing via iCloud is inconsistent—it doesn’t update as\nfrequently as I’d like. Second, Emacs on macOS can be finicky when\nediting files inside the iCloud folder. The latter is probably\nsolvable with some configuration or symbolic links, but the syncing\ndelay is trickier.\u003c/p\u003e\n\u003cp\u003e\nStill, these are relatively small trade-offs if your goal is to keep\nusing Emacs and Org-mode for your calendar, while remaining compatible\nwith the rest of the world’s scheduling tools.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv id=\"outline-container-headline-4\" class=\"outline-3\"\u003e\n\u003ch3 id=\"headline-4\"\u003e\nConclusion\n\u003c/h3\u003e\n\u003cdiv id=\"outline-text-headline-4\" class=\"outline-text-3\"\u003e\n\u003cp\u003e\nWhile I think I prefer BBEdit for doing edits to files on macOS, Emacs\nis always going to be my home. It\u0026#39;s so much more extensible and\nfunctional. With these tools, though, I can say that being an Emacs\nuser on macOS is \u003cstrong\u003emiles\u003c/strong\u003e better than it is on Windows or, in some\ncases, Linux.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n","date_modified":"2025-05-01T15:57:06-04:00","date_published":"2025-05-01T15:57:06-04:00","id":"https://degruchy.org/2025/05/01/always-beorg-anizing/","title":"Always BeOrg-anizing","url":"https://degruchy.org/2025/05/01/always-beorg-anizing/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eWho\u0026hellip;? I don\u0026rsquo;t \u003ca\n\thref=\"https://www.whitehouse.gov/wire/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.whitehouse.gov/wire/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tunderstand the point of this\n\u003c/a\u003e. Actually, I do, but\nI don\u0026rsquo;t believe it. The sharks, they were jumped. The whole thing is\noff the rails.\u003c/p\u003e\n","date_modified":"2025-04-30T21:58:18-04:00","date_published":"2025-04-30T21:58:18-04:00","id":"https://degruchy.org/2025/04/30/what.-the.-fuck./","title":"What. The. Fuck.","url":"https://degruchy.org/2025/04/30/what.-the.-fuck./"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eJump to 32:59 to hear the idiocy.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://www.youtube.com/watch?v=FZ-RZ0dKO8o\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/30/satya-nadella-the-internet-was-born-on-windows/satya-web-born-windows.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/30/satya-nadella-the-internet-was-born-on-windows/satya-web-born-windows.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/30/satya-nadella-the-internet-was-born-on-windows/satya-web-born-windows.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/30/satya-nadella-the-internet-was-born-on-windows/satya-web-born-windows.jpg\"\n             alt=\"Two idiots on stage\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eSure it was...\u003c/h4\u003e\u003cp\u003ePay no attention to CERN and the DOD.\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003e\u003ca\n\thref=\"https://www.home.cern/science/computing/birth-web\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.home.cern/science/computing/birth-web\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tYeah, totally true.\n\u003c/a\u003e\u003c/p\u003e\n","date_modified":"2025-04-30T15:23:01-04:00","date_published":"2025-04-30T15:23:01-04:00","id":"https://degruchy.org/2025/04/30/satya-nadella-the-internet-was-born-on-windows/","title":"Satya Nadella: 'The Internet Was Born on Windows' 🙄","url":"https://degruchy.org/2025/04/30/satya-nadella-the-internet-was-born-on-windows/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003ca href=\"https://www.youtube.com/watch?v=n1a212a3HoU\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/30/volonaut-airbike/volonaut.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/30/volonaut-airbike/volonaut.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/30/volonaut-airbike/volonaut.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/30/volonaut-airbike/volonaut.jpg\"\n             alt=\"I\u0026rsquo;ve waited so long for this!\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eThe Future is Now\u003c/h4\u003e\u003cp\u003eI\u0026rsquo;ve waited so long for this!\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eThis is amazing! I\u0026rsquo;d like to ride one. But never have people ride them ever. So\ndangerous.\u003c/p\u003e\n","date_modified":"2025-04-30T08:31:23-04:00","date_published":"2025-04-30T08:31:23-04:00","id":"https://degruchy.org/2025/04/30/volonaut-airbike/","title":"Volonaut Airbike","url":"https://degruchy.org/2025/04/30/volonaut-airbike/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eThe world is on fire. The foxes have taken over and are gutting the hen house\nand the hens, the sheep and the farmer seem to only stand there, watching it all\nhappen. Angry, sure. But like hopes and prayers, that means \u003cem\u003efuck all\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eI think that I want to leave. I don\u0026rsquo;t know where to go. I don\u0026rsquo;t know what to do.\nI \u003cem\u003eknow\u003c/em\u003e that is what they want. I don\u0026rsquo;t care anymore. Let them have it. Burn it\nall down, if you want. Just leave me alone. I don\u0026rsquo;t want to be associated with\nthis. I want to be somewhere where we \u003cem\u003edon\u0026rsquo;t\u003c/em\u003e elect outright thugs, shysters and\nfrauds into the most powerful positions of power. I want to be somewhere where\npeople don\u0026rsquo;t \u003cem\u003ewant\u003c/em\u003e to rule over me with authority, where I can live a\nrelatively uneventful life, culminating in an uneventful death, hopefully\nsurrounded by family and friends. I will not enter any textbooks, not even as a\nfootnote or an aside. I don\u0026rsquo;t want any of that. I want the psychopaths and\ngrifters of this world to shut the fuck up and leave me alone.\u003c/p\u003e\n\u003cp\u003eAll I see is the world descending into darkness, and realizing that for far too\nlong, many of the world\u0026rsquo;s processes had a single point of failure. And we\u0026rsquo;re\nfailing.\u003c/p\u003e\n","date_modified":"2025-04-29T12:58:22-04:00","date_published":"2025-04-29T12:58:22-04:00","id":"https://degruchy.org/2025/04/29/no-one-cares/","title":"No one cares","url":"https://degruchy.org/2025/04/29/no-one-cares/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI had no idea that macOS was able to run iOS and iPad apps if you have an\nM-series processor. Very cool. I\u0026rsquo;m able to run the Bandcamp iOS app on my\ndesktop without having to do anything different. While I\u0026rsquo;d rather have a purpose\nbuilt app, this works really well.\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/28/macos-runs-ios-apps/bandcamp-ios-macos.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/28/macos-runs-ios-apps/bandcamp-ios-macos.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/28/macos-runs-ios-apps/bandcamp-ios-macos.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/28/macos-runs-ios-apps/bandcamp-ios-macos.jpg\" width=\"640\"\u003e\n    \u003c/picture\u003e\n\u003c/figure\u003e\n","date_modified":"2025-04-28T16:16:46-04:00","date_published":"2025-04-28T16:16:46-04:00","id":"https://degruchy.org/2025/04/28/macos-runs-ios-apps/","title":"macOS Runs iOS Apps","url":"https://degruchy.org/2025/04/28/macos-runs-ios-apps/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eOne of the assistants in our C-suite gave me one of these to try.\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/28/thai-coffee/thai-coffee.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/28/thai-coffee/thai-coffee.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/28/thai-coffee/thai-coffee.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/28/thai-coffee/thai-coffee.jpg\"\n             alt=\"A picture of a Thai Instant Coffee pack\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eThai Instant Coffee\u003c/h4\u003e\u003cp\u003eHere goes nothing\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n","date_modified":"2025-04-28T14:01:31-04:00","date_published":"2025-04-28T14:01:31-04:00","id":"https://degruchy.org/2025/04/28/thai-coffee/","title":"Thai Coffee","url":"https://degruchy.org/2025/04/28/thai-coffee/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eOne of the founders of \u003ca\n\thref=\"https://fosstodon.org\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://fosstodon.org\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tFosstodon\n\u003c/a\u003e, \u003ca\n\thref=\"https://kevquirk.com/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://kevquirk.com/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tKev\n\u003c/a\u003e, \u003ca\n\thref=\"https://kevquirk.com/blog/my-thoughts-on-the-fosstodon-drama\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://kevquirk.com/blog/my-thoughts-on-the-fosstodon-drama\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tis\nleaving the organization over issues with drama and content moderation\nissues\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI have to say, I\u0026rsquo;m sad to see the state of affairs at Fosstodon in such\ndisarray. For all of us who are still uninitiated into the drama, there some\nscant information from \u003ca\n\thref=\"https://coreysnipes.com/thoughts-on-fosstodon.html\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://coreysnipes.com/thoughts-on-fosstodon.html\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tCorey Snipes\n\u003c/a\u003e on the issue. Though, I\u0026rsquo;m certainly not\nup to date on much of what he\u0026rsquo;s talking about, one thing stands out:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHe shared that he has a long history as a privacy advocate and FOSS and\ncontributor, and he feels he\u0026rsquo;s being unfairly characterized as a nazi for\nexpressing certain political views.  He also had very reassuring things to say\nabout the neutrality and fairness of the fosstodon moderation process,\nessentially that all moderation decisions require concensus among mods and\nthat all mods recuse themselves from any decisions where they have a vested\ninterest.  Basically, his politics have never been a factor in any of the\nmoderation decisions there, nor could they be.  Importantly, he also shared\nthat he has stepped down as a mod and would also be deleting his account.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt seems like more of the \u003ca\n\thref=\"/2025/01/22/not-so-social-media/\"\n\t\n\t\u003e\n\tpolitical backlash and infighting that I had seen on\nMicro.blog\n\u003c/a\u003e earlier this year. The same stupid bullshit that made me get over\nthe relative mental barrier to migrating to Hugo from my fully-static-html blog.\nSilver linings and all that. I feel like people are getting hyper-polarized and\ntrying to find out who their real allies are, now that people are all mask-off\nwith anti-… well, everything.\u003c/p\u003e\n\u003cp\u003eI really don\u0026rsquo;t know what was said, and who was involved, but I honestly don\u0026rsquo;t\ncare. Drama is drama. People are full of it, and when in large social arenas,\npeople are more likely to spill it everywhere they can. I have to stay away from\nthose places because I know I don\u0026rsquo;t react well to it. \u003ca\n\thref=\"https://fosstodon.org/@Gina/114415525599424591\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://fosstodon.org/@Gina/114415525599424591\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tIt seems like lots of\npeople don\u0026rsquo;t react well to it, too\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe time I had on Fosstodon, while not always great, broadened my OSS knowledge\nand got me in touch with several key figures in the scene. Not that I\u0026rsquo;ve \u003cem\u003edone\u003c/em\u003e\nanything with those contacts, but it\u0026rsquo;s nice to know that I was able to talk to\nand interact with current-day luminaries. It\u0026rsquo;s nice to know they\u0026rsquo;re human, too.\nFor that I thank Kev, Mike and the moderation team (of whom I believe my time\npredated any \u003cem\u003eformal\u003c/em\u003e team) for facilitating a great place where I could connect\nwith lots of like-minded individuals.\u003c/p\u003e\n\u003cp\u003eI wish everyone involved with the project good luck and safe travels. I hope\nthat Fosstodon stays active and vibrant, but if it doesn\u0026rsquo;t, then I\u0026rsquo;m glad to\nhave been there when it was. I even still have the stickers.\u003c/p\u003e\n\u003cp\u003eBe kind to one another.\u003c/p\u003e\n","date_modified":"2025-04-28T09:16:44-04:00","date_published":"2025-04-28T09:16:44-04:00","id":"https://degruchy.org/2025/04/28/goodbye-fosstodon/","title":"Goodbye, Fosstodon","url":"https://degruchy.org/2025/04/28/goodbye-fosstodon/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003ca href=\"https://www.threads.com/@jess.a.creates/post/DIxDxVIqAbQ\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/27/sunday-support/shark-fairy.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/27/sunday-support/shark-fairy.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/27/sunday-support/shark-fairy.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/27/sunday-support/shark-fairy.jpg\"\n             alt=\"Maybe, if you name is Ken, you could even be Ken-nuf\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eYou Are Enough.\u003c/h4\u003e\u003cp\u003eMaybe, if you name is Ken, you could even be Ken-nuf\n                    \u003ccite class=\"fig-attribution\"\u003eSource: \u003ca href=\"https://www.threads.com/@jess.a.creates\"\u003e@jess.a.creates\u003c/a\u003e\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n","date_modified":"2025-04-27T09:18:43-04:00","date_published":"2025-04-27T09:18:43-04:00","id":"https://degruchy.org/2025/04/27/sunday-support/","title":"Sunday Support","url":"https://degruchy.org/2025/04/27/sunday-support/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eA \u003ca\n\thref=\"https://www.morpheus-research.com/backblaze/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.morpheus-research.com/backblaze/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\trecent, and I\u0026rsquo;d say pretty damning, report on the financial stability of\nBackblaze\n\u003c/a\u003e (and thus my off-site backups) has got me looking at alternatives.\nI know that after the big loss in data that I had a couple of years ago has me\nreligiously checking and testing backups, I\u0026rsquo;m still nervous about blowing up my\nmonthly bills in off-site backup costs. While B2 has done well with me, I can\u0026rsquo;t\nignore potential issues with the company running those backup services. I have\n~5tb of data to back up, and I \u003cem\u003ewill not\u003c/em\u003e lose them again.\u003c/p\u003e\n\u003cp\u003eThis also should be a warning sign that I need to diversify my off-site\nreplications. To that end, I\u0026rsquo;m going to give Amazon Glacier (deep storage) a\nspin. It seems like a pretty good deal, as the prices are sub-cent per GB and\nwhile the access/retrieval times aren\u0026rsquo;t amazing, they \u003cem\u003eare\u003c/em\u003e however, cheap and\nresilient. At \u003ccode\u003e$0.00099\u003c/code\u003e per GB, I\u0026rsquo;m looking at roughly $5 a month to store my\nbackups. Yes, that may grow over time, but I can look at pruning it once it gets\nto be too much. The other nice thing is that my Synology NAS already has an app\nto automate backing up to Glacier.\u003c/p\u003e\n\u003cp\u003eI looked at Tarsnap and Rsync, but both would be \u003cem\u003esignifigantly\u003c/em\u003e more costly to\noff-site my backups to. While I would probably like their service \u003cem\u003ebetter\u003c/em\u003e, I\ncan\u0026rsquo;t justify the extra monthly cost.\u003c/p\u003e\n\u003cp\u003eI won\u0026rsquo;t get rid of Backblaze just yet, but I want to hedge my bets here.\u003c/p\u003e\n","date_modified":"2025-04-26T16:30:22-04:00","date_published":"2025-04-26T16:30:22-04:00","id":"https://degruchy.org/2025/04/26/backblaze-b2-isnt-looking-so-hot/","title":"Backblaze B2 Isn't Looking so Hot","url":"https://degruchy.org/2025/04/26/backblaze-b2-isnt-looking-so-hot/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003ca href=\"https://xkcd.com/3081/\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/25/at-first-they-came-for-the-palenstine-protestors.../phd_timeline.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/25/at-first-they-came-for-the-palenstine-protestors.../phd_timeline.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/25/at-first-they-came-for-the-palenstine-protestors.../phd_timeline.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/25/at-first-they-came-for-the-palenstine-protestors.../phd_timeline.png\"\n             alt=\"watch: https://www.youtube.com/watch?v=JyypeEEOklM \u0026ndash; you should feel shame at this as an American\" width=\"763\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:763px;\"\u003e\n            \u003ch4\u003eThe Undesirables\u003c/h4\u003e\u003cp\u003ewatch: \u003ca\n\thref=\"https://www.youtube.com/watch?v=JyypeEEOklM\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.youtube.com/watch?v=JyypeEEOklM\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\thttps://www.youtube.com/watch?v=JyypeEEOklM\n\u003c/a\u003e \u0026ndash; you should feel shame at this as an American\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n","date_modified":"2025-04-25T11:52:10-04:00","date_published":"2025-04-25T11:52:10-04:00","id":"https://degruchy.org/2025/04/25/at-first-they-came-for-the-palenstine-protestors.../","title":"At first, they came for the Palenstine protestors...","url":"https://degruchy.org/2025/04/25/at-first-they-came-for-the-palenstine-protestors.../"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI wanted to start this post off by being all panicky and \u003ca\n\thref=\"https://www.businesswire.com/news/home/20250417172108/en/Anthropic-Joins-Palantirs-FedStart-Program-to-Deploy-Claude-Application\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.businesswire.com/news/home/20250417172108/en/Anthropic-Joins-Palantirs-FedStart-Program-to-Deploy-Claude-Application\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tsaying that I\u0026rsquo;m\nswearing off Claude because The Gub\u0026rsquo;ment shouldn\u0026rsquo;t be using the same AI\n\u003c/a\u003e as I\ndo because it\u0026rsquo;s not cool anymore. Or something.\u003c/p\u003e\n\u003cp\u003eLooking at this situation, I can say the following:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eI \u003cem\u003edo not like\u003c/em\u003e Palantir. I mean, their name is from the \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Palant%c3%adr\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Palant%c3%adr\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\textremely\ndangerous stones from Lord of The Rings\n\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eI\u0026rsquo;m generally wary of private companies getting buddy-buddy with Government\nagencies \u003cem\u003eas a rule\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eI\u0026rsquo;m not sure this even matters.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSure, yes, buddying up with Palantir and the Government is not a good look to\nme. But adding Claude to whatever services their running doesn\u0026rsquo;t seem like as\nmuch of a \u003cem\u003epanic inducing\u003c/em\u003e event that will upend the very nature of the\nrelationship between people, technology and the surveillance state. That ship\nsailed long before we had Claude, or ChatGPT. I\u0026rsquo;m not sure this is going to make\nthat shitberg any shittier.\u003c/p\u003e\n\u003cp\u003ePlus, it\u0026rsquo;s not like the NSA, CIA, FBI, etc. \u003cem\u003ehaven\u0026rsquo;t\u003c/em\u003e been using these tools\nsince long before we got access to them. I mean, the surveillance state didn\u0026rsquo;t\njust pop out, fully formed from some politically connected stalker\u0026rsquo;s forehead.\nWe\u0026rsquo;ve had it for a \u003cem\u003ewhile\u003c/em\u003e now. Nothing about this article changes anything.\u003c/p\u003e\n\u003cp\u003eIf anything happens, I\u0026rsquo;m pretty sure that Claude-clones may end up fielding\ncalls from (understandably) very irate veterans and social security recipients\ninstead of a human who can help them. That and probably sifting through\nmountains of profile data to discover \u0026lsquo;undesirables\u0026rsquo; that they could ship off to\n\u003cdel\u003eClub Med\u003c/del\u003eThe United States of El Salvador Concentration Camp. \u003ca\n\thref=\"https://www.theverge.com/tech/652215/doge-cross-agency-master-database-sensitive-information\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.theverge.com/tech/652215/doge-cross-agency-master-database-sensitive-information\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tWait, they\u0026rsquo;re\nalready doing that without this\n\u003c/a\u003e. Damn. Um, I dunno, probably some \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Vibe_coding\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Vibe_coding\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tvibe\ncoding\n\u003c/a\u003e or something.\u003c/p\u003e\n","date_modified":"2025-04-23T10:34:44-04:00","date_published":"2025-04-23T10:34:44-04:00","id":"https://degruchy.org/2025/04/23/palantir-and-the-us-government/","title":"Palantir and The US Government","url":"https://degruchy.org/2025/04/23/palantir-and-the-us-government/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eOh goddamn it.\u003c/p\u003e\n\u003cp\u003eI. No! I don\u0026rsquo;t have time for this, Todd! You\u0026rsquo;re \u003cem\u003esupposed\u003c/em\u003e to be working on a\n\u003cstrong\u003enew\u003c/strong\u003e Elder Scrolls game, not making me buy Oblivion for $60. Again.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eApparently\u003c/em\u003e they\u0026rsquo;re using the Unreal Engine so you get shit like \u003cem\u003ethis\u003c/em\u003e:\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://store.steampowered.com/app/2623190/The_Elder_Scrolls_IV_Oblivion_Remastered/\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/22/oblivion-remake-released/steam-deck-verified.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/22/oblivion-remake-released/steam-deck-verified.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/22/oblivion-remake-released/steam-deck-verified.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/22/oblivion-remake-released/steam-deck-verified.jpg\"\n             alt=\"Citation needed\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eWe\u0026#39;ll See About _That_\u003c/h4\u003e\u003cp\u003eCitation needed\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eI mean, \u003cem\u003elook at this shit\u003c/em\u003e:\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/22/oblivion-remake-released/oblivion-outdoors.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/22/oblivion-remake-released/oblivion-outdoors.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/22/oblivion-remake-released/oblivion-outdoors.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/22/oblivion-remake-released/oblivion-outdoors.jpg\"\n             alt=\"TODD! YOU WERE SUPPOSED TO BE WORKING ON A NEW ELDER SCROLLS\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eFuck You\u003c/h4\u003e\u003cp\u003eTODD! YOU WERE SUPPOSED TO BE WORKING ON A \u003cem\u003eNEW\u003c/em\u003e ELDER SCROLLS\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/22/oblivion-remake-released/sheogorath.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/22/oblivion-remake-released/sheogorath.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/22/oblivion-remake-released/sheogorath.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/22/oblivion-remake-released/sheogorath.jpg\"\n             alt=\"Cheese for everyone!\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eYES! HA HA! YES!\u003c/h4\u003e\u003cp\u003eCheese for everyone!\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eTodd, you sonavabitch. I\u0026rsquo;m \u003cem\u003ein\u003c/em\u003e. Though I\u0026rsquo;m currently working on Cassette Beasts\n, so this\u0026rsquo;ll need to wait.\u003c/p\u003e\n","date_modified":"2025-04-22T14:41:28-04:00","date_published":"2025-04-22T14:41:28-04:00","id":"https://degruchy.org/2025/04/22/oblivion-remake-released/","title":"Oblivion Remake Released","url":"https://degruchy.org/2025/04/22/oblivion-remake-released/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eWhile I don\u0026rsquo;t do a \u003cem\u003elot\u003c/em\u003e of image editing, I \u003ca\n\thref=\"https://code.degruchy.org/wiki?name=ImageCreation\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://code.degruchy.org/wiki?name=ImageCreation\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tdo more than I think most of the\npeople I know do\n\u003c/a\u003e. For the longest time, now, I\u0026rsquo;ve used scripts and hacks\nto try and wrangle things like creating consistent thumbnails, featured image\nsizes and even just memes. Getting consistent results is somewhat flakey, and\nit seems like every time I turn around, my scripts break in new and\ninteresting\u003csup id=\"fnref:1\"\u003e\u003ca href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e1\u003c/a\u003e\u003c/sup\u003e ways.\u003c/p\u003e\n\u003cp\u003eSo, because I\u0026rsquo;m exploring this brave new-old world of macOS applications that I\nwasn\u0026rsquo;t previously aware of. I decided to give \u003ca\n\thref=\"https://flyingmeat.com/retrobatch/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://flyingmeat.com/retrobatch/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tRetrobatch\n\u003c/a\u003e a try. Retrobatch\nis by the same folks (Flying Meat Software) that make the excellent Acorn image\neditor that I had a copy of in the past. The main thrust of the application is\nto setup a pipeline of nodes that act on images fed into it by various means.\nThese nodes can be configured further to alter the image in several ways and\ncan even split off into multiple branches for alternate streams.\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_blog_image.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_blog_image.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_blog_image.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/21/retrobatch-helper/retrobatch_blog_image.jpg\"\n             alt=\"A picture of Retrobatch\u0026#39;s node editor window showing a workflow\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eMaking a simple blog post image\u003c/h4\u003e\u003cp\u003eWorkflows can be pretty simple\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eThese workflows can even shell out to scripts, incorporate AppleScript, download\nfiles and much more. You can really get into lots of processing with this tool,\nbut I find where it \u003cem\u003ereally\u003c/em\u003e shines is when you create \u0026ldquo;Droplets\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eDroplets are a simple app wrapper around the Retrobatch workflow tool. It allows\nyou to drop images on the app and have it automatically process images without\nhaving to open the app, then the workflow, then adding images to process. This\nmakes it \u003cem\u003emuch\u003c/em\u003e easier to integrate into a blogging workflow by giving you a\nquick location to just drop a bunch of images and have stuff ready made for your\npost come out the other end.\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_shell_scripts.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_shell_scripts.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_shell_scripts.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/21/retrobatch-helper/retrobatch_shell_scripts.jpg\"\n             alt=\"A picture of a shell script, open in BBEdit\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eShell scripts can be called as a part of a workflow\u003c/h4\u003e\u003cp\u003eShell Scripts in Workflows\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eAdding in shell scripts allow you to expand your world into Unix territory and\nthe array of tools there, like the venerable ImageMagick or FFMpeg or tools like\n\u003ccode\u003ersync\u003c/code\u003e to upload them to a server after you drop the results from the pipeline\ninto a temp folder. While, yes, some of this could be easily replicated in\nscripts alone, you end up having to wrangle Bash or Fish as a language, and\nadding new features or steps requires yet more implementation and the tendency\nto break or trip you up with common pitfalls.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s not all sunshine and rainbows, though. Creating mutli-branch workflows kind\nof requires you to enable the advanced linking feature to drag connections\nmanually.\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_manual.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_manual.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_manual.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/21/retrobatch-helper/retrobatch_manual.jpg\"\n             alt=\"A picture of the Retrobatch document properties dialog\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eEnabling Manual Connections can be a Drag\u003c/h4\u003e\u003cp\u003eThough it gives you much more control\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eThe nodes also don\u0026rsquo;t really give you a whole lot of information on what they\u0026rsquo;re\nconfigured to do, leaving the only option to color-code cloned nodes to identify\nwhat one does what. The \u0026ldquo;Workflow Notes\u0026rdquo; node is just sad. This could have been\na sidebar or window or some other UI feature that lets you \u003cem\u003esee\u003c/em\u003e it while\nworking in the editor. You also can\u0026rsquo;t quickly set color from anywhere except\nfrom the three dot menu on each node, making identifying nodes that much harder\nto organize.\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_droplets.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_droplets.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_droplets.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/21/retrobatch-helper/retrobatch_droplets.jpg\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eDroplets\u003c/h4\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eThere is also the image of format support. Retrobatch can \u003ca\n\thref=\"https://flyingmeat.com/retrobatch/docs-2.0/fileformatsupport/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://flyingmeat.com/retrobatch/docs-2.0/fileformatsupport/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tread many different\nformats\n\u003c/a\u003e, it\u0026rsquo;s not as rosy on the \u003cem\u003ewriting\u003c/em\u003e part. It seems like a\nhugely limited set of formats for a tool that is supposed to slice and dice\nimages. \u003ca\n\thref=\"https://www.lemkesoft.de/en/products/graphicconverter\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.lemkesoft.de/en/products/graphicconverter\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tGraphicConverter\n\u003c/a\u003e supports way more formats, and can batch \u003cem\u003esave\u003c/em\u003e\nas them, but it has no processing pipeline. I feel like this could be a strong\nmatch to merge programs\u0026hellip;\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_make_grid.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_make_grid.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/21/retrobatch-helper/retrobatch_make_grid.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/21/retrobatch-helper/retrobatch_make_grid.jpg\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eMaking Grids\u003c/h4\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eAnyway, one last thing that Retrobatch does that I\u0026rsquo;ve started using is the\n\u0026ldquo;Image Grid\u0026rdquo; node. This takes images and creates a single image that has all the\nincluded images as tiles on it. This seems to work best if you pre-shrink/crop\neach item beforehand, but with a little finagling, it works really well!\u003c/p\u003e\n\u003cdiv class=\"footnotes\" role=\"doc-endnotes\"\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli id=\"fn:1\"\u003e\n\u003cp\u003eRead: frustrating.\u0026#160;\u003ca href=\"#fnref:1\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n","date_modified":"2025-04-21T15:14:02-04:00","date_published":"2025-04-21T15:14:02-04:00","id":"https://degruchy.org/2025/04/21/retrobatch-helper/","title":"Retrobatch Helper","url":"https://degruchy.org/2025/04/21/retrobatch-helper/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI\u0026rsquo;ve been a paying Kagi user for nearly \u003cem\u003etwo years\u003c/em\u003e, now. September 13\u003csup\u003eth\u003c/sup\u003e\n will be my official start date. I have to say, I\u0026rsquo;ve been\n\u003cem\u003eextremely\u003c/em\u003e pleased with the service. Not only is the search functionality\nsurfacing stuff I actually \u003cem\u003ewant\u003c/em\u003e, but I also get to filter out the noise and\npromote what I generally like to see regardless of the underlying results. That\nmeans I pin things like Wikipedia, StackOverflow and other sites to the top of\nthe list to get what I want, faster. I also can demote or outright block things,\nlike Wikia/Fandom links, Pinterest, Instagram, TikTok and other social media\nposts.\u003c/p\u003e\n\u003cp\u003eIf I \u003cem\u003edo\u003c/em\u003e come across something that my personalized results may be obscuring, I\ncan just click the link at the top that changes the search so that I see\nunfiltered results. This is helpful when I\u0026rsquo;m doing searches, like\n\u0026ldquo;The Daily Show\u0026rdquo;. I don\u0026rsquo;t need the Wikipedia entry, I am likely looking to get\nthe YouTube page (which has reduced visibility in my personalized results). This\nfeels like a great trade-off. For the vast majority of my searches, I have some\nsites that I strongly prefer. In certain situations, I don\u0026rsquo;t need it, and turn\nit off for that result listing. It\u0026rsquo;s \u003cem\u003every\u003c/em\u003e rare that I need to use the \u003ccode\u003e!bang\u003c/code\u003e\nfeatures anymore. I used to need to jump out to Google or DDG, but I don\u0026rsquo;t find\nthat they\u0026rsquo;re as useful as the results I\u0026rsquo;m getting from Kagi directly.\u003c/p\u003e\n\u003cp\u003eWith the addition to the FastGPT and Summarizer, it seems like a great deal with\nthis already. However, now I\u0026rsquo;m getting access to the Assistant, which is like\na pre-paid token to many different LLM models from different companies through\none interface. While I don\u0026rsquo;t \u003cem\u003eneed\u003c/em\u003e such tools, it\u0026rsquo;s great that I have access to\nthem via my subscription, even if they\u0026rsquo;re still limited in volume.\u003c/p\u003e\n\u003cp\u003eOverall, there is no way that I would switch back to Google, and DDG and Bing\nfeel like pale imitations of Kagi.\u003c/p\u003e\n","date_modified":"2025-04-20T10:34:13-04:00","date_published":"2025-04-20T10:34:13-04:00","id":"https://degruchy.org/2025/04/20/kagi-is-really-great/","title":"Kagi is Really Great","url":"https://degruchy.org/2025/04/20/kagi-is-really-great/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cul class=\"caturday-goals gallery\" rel=\"page\"\u003e\u003cli\u003e\n        \u003ca href=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday1.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday1_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday1_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday1_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday1_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday2.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday2_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday2_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday2_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday2_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday3.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday3_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday3_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday3_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday3_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday4.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday4_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday4_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday4_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/19/hashtag-caturdaygoals/ellie-caturday4_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003c/ul\u003e\n\n\u003cstyle\u003e\n\t@layer post\n\t{\n\t\t.gallery\n\t\t{\n\t\t\talign-content: space-evenly;\n\t\t\tbackground-color: var(--theme-color-alt-background);\n\t\t\tborder: 3px solid var(--theme-color-border);\n\t\t\tborder-radius: 10px;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: center;\n\t\t\tpadding: 0;\n\n\t\t\tli\n\t\t\t{\n\t\t\t\tlist-style-type: none;\n\t\t\t}\n\n\t\t\ta\n\t\t\t{\n\t\t\tcolor: var(--theme-color-alt-foreground);\n\t\t\t}\n\n\t\t\tfigcaption\n\t\t\t{\n\t\t\t\theight: 1.4rem;\n\t\t\t\tmax-width: 128px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\ttext-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n\u003c/style\u003e\n\n\u003cp\u003eNothing like lazing around on a Caturday\u003c/p\u003e\n","date_modified":"2025-04-19T16:22:55-04:00","date_published":"2025-04-19T16:22:55-04:00","id":"https://degruchy.org/2025/04/19/hashtag-caturdaygoals/","title":"Hashtag: CaturdayGoals","url":"https://degruchy.org/2025/04/19/hashtag-caturdaygoals/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003ca href=\"https://bsky.app/profile/karaswisher.bsky.social/post/3ln2lvb3ipc23\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/18/j.k.-rowling-is-a-bitter-troll/jk-smoking-trans.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/18/j.k.-rowling-is-a-bitter-troll/jk-smoking-trans.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/18/j.k.-rowling-is-a-bitter-troll/jk-smoking-trans.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/04/18/j.k.-rowling-is-a-bitter-troll/jk-smoking-trans.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/18/j.k.-rowling-is-a-bitter-troll/jk-smoking-trans.jpg\"\n             alt=\"A disfigured witch choking down a cigar looking like a trollip\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eVoldomort at Least had Smooth Skin\u003c/h4\u003e\u003cp\u003ePlease, feel free to light your own hair on fire instead of the next cigar you witch.\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n","date_modified":"2025-04-18T16:09:47-04:00","date_published":"2025-04-18T16:09:47-04:00","id":"https://degruchy.org/2025/04/18/j.k.-rowling-is-a-bitter-troll/","title":"J.K. Rowling is a Bitter Troll","url":"https://degruchy.org/2025/04/18/j.k.-rowling-is-a-bitter-troll/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI took a crack at making a new Hammerspoon Lua script. When I have posts that\ncontain images (like this one) or other files, in Hugo you\u0026rsquo;d create them in a\nfolder like \u003ccode\u003econtent/posts/2025-04-18_simple-title/index.md\u003c/code\u003e. That would then\nallow you to drop things like associated images, videos and other files \u003cem\u003ewith\u003c/em\u003e\nthe post itself, keeping it as a self-contained unit.\u003c/p\u003e\n\u003cp\u003eThe problem is: Any time I wanted to \u003cem\u003edo\u003c/em\u003e that meant I had to open Finder or\nGhosTTY, navigate to my Projects folder, find my site folder, navigate into\n\u003ccode\u003econtent/posts\u003c/code\u003e and then make a new directory. \u003cem\u003eTHEN\u003c/em\u003e I would have to start a\nnew \u003ccode\u003eindex.md\u003c/code\u003e file elsewhere and then save it in to that directory. So much\ntedium! Then I got the bright idea that I have Hammerspoon \u003cem\u003eand\u003c/em\u003e I\u0026rsquo;ve been\n\u003ca\n\thref=\"/2025/04/18/plain-hyper-key/\"\n\t\n\t\u003e\n\tlooking for more ideas on how to use the \u003ccode\u003ehyper\u003c/code\u003e key\n\u003c/a\u003e. To the \u003cdel\u003ebat-cave\u003c/del\u003e\nBBEdit!\u003c/p\u003e\n\u003cp\u003eAfter a bit of searching, I found a \u003ca\n\thref=\"https://github.com/james2doyle/lit-slugify/blob/master/init.lua\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://github.com/james2doyle/lit-slugify/blob/master/init.lua\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tsimple enough to understand \u0026ldquo;slugify\u0026rdquo; lua\nscript\n\u003c/a\u003e, and after a bit of noodling through the docs, then asking Claude to\ncritique my work, I had a pretty usable script! Behold!\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e-- Slugify function to convert text to URL-friendly format\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003eSlugify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003etext\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"kc\"\u003enil\u003c/span\u003e \u003cspan class=\"kr\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kr\"\u003ereturn\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e-- Convert to lowercase\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003eslug\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003estring.lower\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e-- Replace spaces with hyphens\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eslug\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003estring.gsub\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;%s+\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;-\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e-- Remove special characters\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eslug\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003estring.gsub\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;[^%w%-]\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e-- Remove consecutive hyphens\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eslug\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003estring.gsub\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;%-+\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;-\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e-- Remove leading and trailing hyphens\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eslug\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003estring.gsub\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^%-\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eslug\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003estring.gsub\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;%-$\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eslug\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"kr\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003ecreateHugoPostFolder\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e-- Get the current date in YYYY-MM-DD format\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003ecurrentDate\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos.date\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;%Y-%m-%d\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e-- Prompt user for post name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003ebutton\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003epostName\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ehs.dialog\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etextPrompt\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \t\u003cspan class=\"s2\"\u003e\u0026#34;Create a new Hugo Post?\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e-- title\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \t\u003cspan class=\"s2\"\u003e\u0026#34;Enter the title for your new post:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e-- message\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \t\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e-- default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \t\u003cspan class=\"s2\"\u003e\u0026#34;Create\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Cancel\u0026#34;\u003c/span\u003e \u003cspan class=\"c1\"\u003e-- buttons\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003epostName\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"kc\"\u003enil\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003epostName\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003ebutton\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Cancel\u0026#34;\u003c/span\u003e \u003cspan class=\"kr\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kr\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e-- Slugify the post name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003eslug\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSlugify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epostName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e-- Create folder path\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003ehugoContentPath\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos.getenv\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;HOME\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e..\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/Projects/degruchy.org/content/posts/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003efolderName\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecurrentDate\u003c/span\u003e \u003cspan class=\"o\"\u003e..\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;_\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e..\u003c/span\u003e \u003cspan class=\"n\"\u003eslug\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003efullPath\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ehugoContentPath\u003c/span\u003e \u003cspan class=\"o\"\u003e..\u003c/span\u003e \u003cspan class=\"n\"\u003efolderName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e-- Create the directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003esuccess\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eerrorMessage\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ehs.fs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emkdir\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efullPath\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003esuccess\u003c/span\u003e \u003cspan class=\"kr\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ehs.alert\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eshow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Created folder: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e..\u003c/span\u003e \u003cspan class=\"n\"\u003efolderName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e-- Optionally create an index.md file in the folder\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003eindexFile\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eio.open\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efullPath\u003c/span\u003e \u003cspan class=\"o\"\u003e..\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/index.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;w\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kr\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eindexFile\u003c/span\u003e \u003cspan class=\"kr\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eindexFile\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003ewrite\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;---\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eindexFile\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003ewrite\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;title: \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e..\u003c/span\u003e \u003cspan class=\"n\"\u003epostName\u003c/span\u003e \u003cspan class=\"o\"\u003e..\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eindexFile\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003ewrite\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;date: \u0026lt;# Date #\u0026gt; \u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eindexFile\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003ewrite\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;draft: true\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eindexFile\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003ewrite\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;---\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eindexFile\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003ewrite\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Your content here.\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eindexFile\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ehs.alert\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eshow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Error creating folder: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e..\u003c/span\u003e \u003cspan class=\"n\"\u003eerrorMessage\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehs.hotkey\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebind\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;cmd\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;alt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;shift\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ctrl\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;N\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecreateHugoPostFolder\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow, I can press \u003ccode\u003ehyper\u003c/code\u003e+\u003ccode\u003en\u003c/code\u003e, get prompted for a new post title, where I can\nwrite a normal title with capitals and more, and have an appropriately named\nfolder and \u003ccode\u003eindex.md\u003c/code\u003e file created for me, in the right spot and ready for me to\nfill it with stuff!\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/18/new-hugo-post-and-folder-hammerspoon/hammerspoon-hugo-post.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/18/new-hugo-post-and-folder-hammerspoon/hammerspoon-hugo-post.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/18/new-hugo-post-and-folder-hammerspoon/hammerspoon-hugo-post.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/04/18/new-hugo-post-and-folder-hammerspoon/hammerspoon-hugo-post.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/18/new-hugo-post-and-folder-hammerspoon/hammerspoon-hugo-post.jpg\"\n             alt=\"A picture of a Hammerspoon dialog window asking me for a title\"\u003e\n    \u003c/picture\u003e\n\u003c/figure\u003e\n","date_modified":"2025-04-18T13:29:41-04:00","date_published":"2025-04-18T13:29:41-04:00","id":"https://degruchy.org/2025/04/18/new-hugo-post-and-folder-hammerspoon/","title":"New Hugo Post and Folder Hammerspoon","url":"https://degruchy.org/2025/04/18/new-hugo-post-and-folder-hammerspoon/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003ca href=\"https://youtu.be/yjIJOfgVgu0?t=8881\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/18/i-never-thought-id-actually-use-this-meme/new-friends-rss.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/18/i-never-thought-id-actually-use-this-meme/new-friends-rss.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/18/i-never-thought-id-actually-use-this-meme/new-friends-rss.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/04/18/i-never-thought-id-actually-use-this-meme/new-friends-rss.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/18/i-never-thought-id-actually-use-this-meme/new-friends-rss.jpg\"\n             alt=\"I am no longer friends with Hacker News\" width=\"640\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eI stopped associating with sycophants\u003c/h4\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n","date_modified":"2025-04-18T12:16:34-04:00","date_published":"2025-04-18T12:16:34-04:00","id":"https://degruchy.org/2025/04/18/i-never-thought-id-actually-use-this-meme/","title":"I Never Thought I'd Actually Use This Meme","url":"https://degruchy.org/2025/04/18/i-never-thought-id-actually-use-this-meme/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eBack in the wild-west of computing, in the enlightened age of\n\u003ca\n\thref=\"https://en.wikipedia.org/wiki/Lisp_machine\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Lisp_machine\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tLisp-machines\n\u003c/a\u003e, a legendary keyboard that had an outsized influence on the\ncomputing world around it arose. \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Space-cadet_keyboard\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Space-cadet_keyboard\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tThe Space Cadet Keyboard\n\u003c/a\u003e. Itself an\nexpansion upon the older \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Knight_keyboard\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Knight_keyboard\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tKnight Keyboard\n\u003c/a\u003e. Their legends harken back to\na day when keyboards had to have buttons for functions that would be otherwise\nunseen in a terminal environment. To that end, modifier keys were added to\nexpand on the available functions and commands that could be run in\napplications. Notably: Super and Hyper. Super got co-opted by Microsoft in the\nlate 90\u0026rsquo;s early \u0026lsquo;00\u0026rsquo;s as the \u0026lsquo;Windows\u0026rsquo; key. Though the usage of the key was\nnever really super popular, and even today there are only a handful of\ncombinations that actually \u003cem\u003edo\u003c/em\u003e anything in Windows.\u003c/p\u003e\n\u003ch2 id=\"now\"\u003eNow\u003c/h2\u003e\n\u003cp\u003eThe \u003cem\u003e\u003ccode\u003ehyper\u003c/code\u003e\u003c/em\u003e key, however, only really had interest to folks using the Lisp\nMachines, and therefore Emacs users. Even today, the hyper key can still be\nsent as a keycode to Emacs for use. While it doesn\u0026rsquo;t have any registered key\nbinding, it is just as valid as \u003ccode\u003esuper\u003c/code\u003e, \u003ccode\u003emeta\u003c/code\u003e/\u003ccode\u003ealt\u003c/code\u003e and \u003ccode\u003ectrl\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eWith the uptick in terminal-based program appreciation, folks have come up with\nall manner of tools that can make use of the \u003ccode\u003ehyper\u003c/code\u003e key. Even if you don\u0026rsquo;t\nhave an actual \u003ccode\u003ehyper\u003c/code\u003e key, there are ways of mapping it. On macOS, there is\n\u003ca\n\thref=\"https://hyperkey.app\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://hyperkey.app\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\teven an app that\n\u003c/a\u003e that lets you bind various existing keyboard\nshortcuts to emulate the key for use elsewhere.\u003c/p\u003e\n\u003ch2 id=\"whats-plain-about-hyper\"\u003eWhat\u0026rsquo;s Plain About Hyper?\u003c/h2\u003e\n\u003cp\u003eNothing! But I feel like I oversold this article with all the background info.\nSo, here\u0026rsquo;s how I use it in my workflow:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePaste as plain text: I have \u003ccode\u003ehyper\u003c/code\u003e+\u003ccode\u003ev\u003c/code\u003e (which is bound to \u003ccode\u003eright-command\u003c/code\u003e)\nto paste as stripped down plain text. This is useful when working with a lot\nof plain text files, as I do frequently.\u003c/li\u003e\n\u003cli\u003ePasteboard history: I have \u003ccode\u003ehyper\u003c/code\u003e+\u003ccode\u003ec\u003c/code\u003e bound to showing Maccy\u0026rsquo;s clipboard\nhistory window so I can select older items to then paste somewhere.\u003c/li\u003e\n\u003cli\u003eWindow snapping: I have \u003ccode\u003ehyper\u003c/code\u003e+\u003ccode\u003e\u0026lt;arrow\u0026gt;\u003c/code\u003e bound to snapping windows to\nvarious configurations, making it easier to re-arrange things when needed,\nwithout resorting to the mouse.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI\u0026rsquo;m sure there are more useful uses of the \u003ccode\u003ehyper\u003c/code\u003e key waiting to be found, but\nthese are just some of the items I came up with in exploring the idea for a\nmore keyboard driven workflow.\u003c/p\u003e\n\u003cp\u003eDo you have the \u003ccode\u003ehyper\u003c/code\u003e key enabled and bound to something? If so, let me know\nbelow! I\u0026rsquo;d love to have more ideas for being \u003ccode\u003ehyper\u003c/code\u003e-efficient 😆\u003c/p\u003e\n","date_modified":"2025-04-18T10:20:52-04:00","date_published":"2025-04-18T10:20:52-04:00","id":"https://degruchy.org/2025/04/18/plain-hyper-key/","title":"Plain Hyper Key","url":"https://degruchy.org/2025/04/18/plain-hyper-key/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI\u0026rsquo;m learning all sorts of crappy things today:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMy therapist is leaving the practice she worked at, so now I\u0026rsquo;m on my 4th\ntherapist in ~5 years. Now, I have to pay out of pocket to see them again,\nor pick a new one.\u003c/li\u003e\n\u003cli\u003eThe \u003ca\n\thref=\"https://creativerly.com/the-dark-side-of-gumroad-how-sahil-lavingia-got-involved-with-doge/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://creativerly.com/the-dark-side-of-gumroad-how-sahil-lavingia-got-involved-with-doge/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tcreator and owner\n\u003c/a\u003e of \u003ca\n\thref=\"https://tedium.co/2025/04/06/gumroad-open-source-doge-drama/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://tedium.co/2025/04/06/gumroad-open-source-doge-drama/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tGumroad\n\u003c/a\u003e \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Gumroad\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Gumroad\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tis a DOGE-er\n\u003c/a\u003e. Please\nfeel free to set your own hair on fire you jackass. I purchased stuff from\nyour store, you absolute bell-end.\u003c/li\u003e\n\u003cli\u003eBig Data firm \u003ca\n\thref=\"https://www.404media.co/leaked-palantirs-plan-to-help-ice-deport-people/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.404media.co/leaked-palantirs-plan-to-help-ice-deport-people/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tPalatir is helping find immigrants and other \u0026lsquo;undesirables\u0026rsquo;\nto help ICE deport them to legal-free gulags in El Salvador\n\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eElon Musk is being invited to talk at a \u003ca\n\thref=\"https://events.ycombinator.com/ai-sus\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://events.ycombinator.com/ai-sus\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tYCombinator backed \u0026ldquo;AI Startup\nSchool\u0026rdquo;\n\u003c/a\u003e. Glad to see that greed really has no boundaries, even if\nit means sucking the dick of \u003ca\n\thref=\"https://www.jpost.com/international/article-838444\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.jpost.com/international/article-838444\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\ta Nazi\n\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eThe US Government is trying it\u0026rsquo;s damnedest to break all the First Amendment\nrules in stifling Harvard\u0026rsquo;s free speech and expression by \u003ca\n\thref=\"https://www.harvard.edu/president/news/2025/the-promise-of-american-higher-education/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.harvard.edu/president/news/2025/the-promise-of-american-higher-education/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\ttaking away their\ngovernment research funding\n\u003c/a\u003e, \u003ca\n\thref=\"https://www.axios.com/2025/04/16/harvard-irs-tax-exempt-trump\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.axios.com/2025/04/16/harvard-irs-tax-exempt-trump\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\ttrying to get the IRS to remove their\nnon-profit status\n\u003c/a\u003e and now are \u003ca\n\thref=\"https://www.bbc.com/news/articles/c1egdy24v7po\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.bbc.com/news/articles/c1egdy24v7po\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\ttrying to ban getting foreign students\nfor admissions\n\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eThere was a shooting at FSU injuring 6, killing 2. Thankfully, \u003ca\n\thref=\"https://www.nbcnews.com/news/us-news/live-blog/florida-state-university-active-shooter-rcna201756\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.nbcnews.com/news/us-news/live-blog/florida-state-university-active-shooter-rcna201756\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tthey caught\nthe cock- snot and I hope they throw the book at him\n\u003c/a\u003e. A sheriff\u0026rsquo;s child,\ntoo. \u003ca\n\thref=\"https://theonion.com/no-way-to-prevent-this-says-only-nation-where-this-r-1819576527/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://theonion.com/no-way-to-prevent-this-says-only-nation-where-this-r-1819576527/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tWHEN WILL WE TAKE GUN CONTROL AND MENTAL HEALTH SERIOUSLY\n\u003c/a\u003e?\u003c/li\u003e\n\u003c/ul\u003e\n","date_modified":"2025-04-17T17:05:43-04:00","date_published":"2025-04-17T17:05:43-04:00","id":"https://degruchy.org/2025/04/17/its-a-terrible-day-for-reading/","title":"It's a Terrible Day for Reading","url":"https://degruchy.org/2025/04/17/its-a-terrible-day-for-reading/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eFor when you want to \u003ca\n\thref=\"https://finance.yahoo.com/quote/PRAY/profile/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://finance.yahoo.com/quote/PRAY/profile/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tpray away the gay, but still want that sweet, sweet money\nlender income\n\u003c/a\u003e. \u003ca\n\thref=\"https://acvetfs.com\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://acvetfs.com\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tOr you\u0026rsquo;re trying to avoid \u0026ldquo;woke\u0026rdquo; companies\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eWhat is \u0026ldquo;woke?\u0026rdquo;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026ldquo;Woke\u0026rdquo; is an adjective that originated in African-American English, and it has\nbeen used since the 1930s to denote an awareness of racial prejudice and\ndiscrimination\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca\n\thref=\"https://en.wikipedia.org/wiki/Woke\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Woke\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\t(source)\n\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eOh. So it\u0026rsquo;s being aware that there are prejudices and and discrimination in the\nsystem. So if you\u0026rsquo;re not woke, you\u0026rsquo;re a fucking biggot. For all the talk from\nconservative groups about \u0026ldquo;lefties\u0026rdquo; being \u0026ldquo;snowflakes\u0026rdquo;, it feels awfully\ninteresting for them to turn around and be so butthurt about companies not being\ngigantic assholes to minorities. Then again, if conservatives aren\u0026rsquo;t admitting\ntheir kinks by demonizing them, then they\u0026rsquo;d say nothing at all.\u003c/p\u003e\n\u003cp\u003eEat shit.\u003c/p\u003e\n","date_modified":"2025-04-17T08:30:30-04:00","date_published":"2025-04-17T08:30:30-04:00","id":"https://degruchy.org/2025/04/17/til-there-are-religious-and-political-investment-portfolios/","title":"TIL: There are Religious and Political Investment Portfolios","url":"https://degruchy.org/2025/04/17/til-there-are-religious-and-political-investment-portfolios/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cvideo poster=\"p-n-r-jail.jpg\" controls preload=\"auto\" width=\"100%\"  poster=\"/2025/04/16/looks-like-trump-finally-got-around-to-watching-parks-and-rec/p-n-r-jail.jpg\" playsinline class=\"\"\u003e\n    \u003csource src=\"/2025/04/16/looks-like-trump-finally-got-around-to-watching-parks-and-rec/p-n-r-jail.webm\" type=\"video/webm\"\u003e\n    \u003csource src=\"/2025/04/16/looks-like-trump-finally-got-around-to-watching-parks-and-rec/p-n-r-jail.ogv\" type=\"video/ogg\"\u003e\n    \u003csource src=\"/2025/04/16/looks-like-trump-finally-got-around-to-watching-parks-and-rec/p-n-r-jail.mp4\" type=\"video/mp4\"\u003e\n  \u003cspan\u003e\u003c/span\u003e\n\u003c/video\u003e\n\u003cp\u003eThough, I don\u0026rsquo;t think he took the right message from that episode\u0026hellip;\u003c/p\u003e\n","date_modified":"2025-04-16T16:34:02-04:00","date_published":"2025-04-16T16:34:02-04:00","id":"https://degruchy.org/2025/04/16/looks-like-trump-finally-got-around-to-watching-parks-and-rec/","title":"Looks Like Trump Finally got Around to Watching Parks and Rec","url":"https://degruchy.org/2025/04/16/looks-like-trump-finally-got-around-to-watching-parks-and-rec/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\u003ca\n\thref=\"https://mjtsai.com/blog/2025/04/14/google-is-winning-on-every-ai-front/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://mjtsai.com/blog/2025/04/14/google-is-winning-on-every-ai-front/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\t\u0026ldquo;Google is Winning on Every AI Front\u0026rdquo;\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eLet me preface this by saying that I\u0026rsquo;m sure the Gemini team is very proud of\ntheir very real success, and I\u0026rsquo;m glad for them. It\u0026rsquo;s something to be lauded —\nespecially when the stakes around these sorts of things \u003cem\u003eare\u003c/em\u003e so high.\u003c/p\u003e\n\u003ch2 id=\"what-does-winning-even-mean\"\u003eWhat Does \u0026ldquo;Winning\u0026rdquo; Even \u003cem\u003eMean\u003c/em\u003e?\u003c/h2\u003e\n\u003cp\u003eHowever, I don\u0026rsquo;t actually \u003cem\u003ecare\u003c/em\u003e. And by that I mean, \u0026ldquo;winning\u0026rdquo; is kind of a\nmeaningless metric. There was a time when Firefox was \u0026ldquo;winning,\u0026rdquo; too — look how\nthat turned out.\u003c/p\u003e\n\u003cp\u003eThe endless box-ticking and benchmarking just don\u0026rsquo;t sell me anymore. It could\nwrite like Hemingway and reason like Einstein — but if all I\u0026rsquo;m ever using it for\nis writing help, basic coding, and getting familiar with new topics, then\n\u0026ldquo;winning\u0026rdquo; becomes very subjective.\u003c/p\u003e\n\u003ch2 id=\"googles-track-record-still-matters\"\u003eGoogle\u0026rsquo;s Track Record Still Matters\u003c/h2\u003e\n\u003cp\u003eAnd then there\u0026rsquo;s the 800lb elephant in the room in the form of Alphabet (née\nGoogle). Over the last few years, I haven\u0026rsquo;t felt like Google has the consumer\u0026rsquo;s\nbest interests at heart — to put it mildly. The ad-serving arm of the company is\n\u003ca\n\thref=\"https://www.wheresyoured.at/the-men-who-killed-google/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.wheresyoured.at/the-men-who-killed-google/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tindisputably (if not directly) in charge of products\n\u003c/a\u003e at Google. This makes\nit \u003cem\u003every\u003c/em\u003e concerning to use any of their products at all — let alone feeding\ntheir LLM private questions and thoughts that will undoubtedly be funneled into\ntheir ad system to build a larger profile of \u003cem\u003eyou\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eGoogle has a lot to prove \u003cem\u003eto me\u003c/em\u003e in order to earn my trust again — if that\u0026rsquo;s\neven possible.\u003c/p\u003e\n\u003ch2 id=\"we-already-have-excellent-models\"\u003eWe Already Have Excellent Models\u003c/h2\u003e\n\u003cp\u003eSo, good for them. I\u0026rsquo;m already quite happy with ChatGPT and Claude. Both have\nhelped me with everything I\u0026rsquo;ve asked of them — whether it\u0026rsquo;s writing advice, code\ngeneration, or just being a sounding board for my inane rambling.\u003c/p\u003e\n\u003cp\u003eI bet most people use them in much the same way. So, sure, if you\u0026rsquo;re doing some\nvery specific research, or need advanced reasoning or larger contexts, then\nmaybe — for those values of \u0026ldquo;best\u0026rdquo; — Gemini is your guy.\u003c/p\u003e\n\u003ch2 id=\"how-to-win-in-my-eyes\"\u003eHow to \u0026ldquo;Win\u0026rdquo; in My Eyes\u003c/h2\u003e\n\u003cp\u003eWhat would \u003cem\u003ereally\u003c/em\u003e convince me that someone\u0026rsquo;s \u0026ldquo;winning\u0026rdquo; is if they built LLMs\nthat \u003cem\u003earen\u0026rsquo;t\u003c/em\u003e covert tools for information gathering. Respecting users\u0026rsquo; data and\nprivacy goes a \u003cem\u003elong\u003c/em\u003e way in making AI more trustworthy.\u003c/p\u003e\n\u003cp\u003eGive me tools that help me inspect how the model was trained, what data it was\ntrained on, and how my queries are processed and used. Transparency shouldn\u0026rsquo;t be\nan afterthought — it should be the \u003cem\u003estandard\u003c/em\u003e.\u003c/p\u003e\n\u003ch2 id=\"working-with-ai-not-for-it\"\u003eWorking With AI, Not For It\u003c/h2\u003e\n\u003cp\u003eI tend to treat LLMs like people — helpful people who carry lots of knowledge\nthat I can lean on when I\u0026rsquo;m stuck or exploring something new. I don\u0026rsquo;t need them\nto \u0026ldquo;serve\u0026rdquo; me. I want to work \u003cem\u003ewith\u003c/em\u003e them — to talk through a problem, build\nunderstanding, and create something useful together.\u003c/p\u003e\n\u003cp\u003eThat sense of collaboration builds trust. It makes the tool better for me, and\nit makes \u003cem\u003eme\u003c/em\u003e better, too.\u003c/p\u003e\n\u003ch2 id=\"trust-is-important\"\u003eTrust Is Important\u003c/h2\u003e\n\u003cp\u003eUntil then, I\u0026rsquo;ll keep choosing the tools that I feel like I can trust. They may\nnot be the most advanced, but they respect me more than Google does.\u003c/p\u003e\n\u003cp\u003eAnd honestly? That makes all the difference.\u003c/p\u003e\n","date_modified":"2025-04-14T14:31:28-04:00","date_published":"2025-04-14T14:31:28-04:00","id":"https://degruchy.org/2025/04/14/re-google-is-winning-on-every-ai-front/","title":"Re: Google is Winning on Every AI Front","url":"https://degruchy.org/2025/04/14/re-google-is-winning-on-every-ai-front/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecaffeine\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ehs.menubar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003esetCaffeineDisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kr\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003estate\u003c/span\u003e \u003cspan class=\"kr\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003ecaffeine\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003esetTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;☕️\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003ecaffeine\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003esetTooltip\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Device is being kept awake\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kr\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003ecaffeine\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003esetTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;😴\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003ecaffeine\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003esetTooltip\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Device is allowed to sleep\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003ecaffeineClicked\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emodifiers\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kr\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003emodifiers.ctrl\u003c/span\u003e \u003cspan class=\"kr\"\u003ethen\u003c/span\u003e \u003cspan class=\"c1\"\u003e-- quit on ctrl-click\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003ecaffeine\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003edelete\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kr\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003esetCaffeineDisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehs.caffeinate\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;displayIdle\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003ecaffeine\u003c/span\u003e \u003cspan class=\"kr\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003ecaffeine\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003esetClickCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecaffeineClicked\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003esetCaffeineDisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehs.caffeinate\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;displayIdle\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eA quick modification of the Hammerspoon example for making a \u003ccode\u003ecaffeinate\u003c/code\u003e clone\nin Lua. It was actually easier to understand than I imagined, and it seems like\nthere is \u003cem\u003eso much more\u003c/em\u003e that it can do. I just need to get up to speed on Lua.\u003c/p\u003e\n","date_modified":"2025-04-10T16:07:07-04:00","date_published":"2025-04-10T16:07:07-04:00","id":"https://degruchy.org/2025/04/10/caffeinate-via-hammerspoon/","title":"Caffeinate via Hammerspoon","url":"https://degruchy.org/2025/04/10/caffeinate-via-hammerspoon/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eToday, I\u0026rsquo;d like to talk about Windows.\u003c/p\u003e\n\u003cp\u003eWait, before you go, just hear me out: \u0026ldquo;What if Windows was an immutable OS?\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eThis idea might seem familiar to you. We actually had this, for some values of\n\u0026rsquo;this\u0026rsquo;, back in the aughts. We called it \u003ca\n\thref=\"https://www.faronics.com/products/deep-freeze/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.faronics.com/products/deep-freeze/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tDeepFreeze\n\u003c/a\u003e. Of course, it was more\nabout freezing the whole partition, and less of making the OS itself immutable,\nbut it was on the right path. Oh, but I haven\u0026rsquo;t explained \u0026ldquo;Immutable\u0026rdquo;.\u003c/p\u003e\n\u003ch2 id=\"what\"\u003eWhat?\u003c/h2\u003e\n\u003cp\u003eImmutable, at least as far as software goes, means to be unchanging. If you have\nan immutable OS, then the OS is essentially read-only. You can\u0026rsquo;t make changes,\nyou can\u0026rsquo;t fiddle with it, and that\u0026rsquo;s by design. This doesn\u0026rsquo;t mean you \u003cem\u003ecan\u0026rsquo;t\u003c/em\u003e\nfiddle with it. Projects like Fedora Silverblue and NixOS allow you to fiddle\nwith the OS, just outside of the running context. Changes come in signed and\nsealed updates to the \u003cem\u003ewhole\u003c/em\u003e system, not one-off patches. That means when you\nboot your computer, the OS either works, or it doesn\u0026rsquo;t. If it doesn\u0026rsquo;t, then most\nof these systems will roll back to the last working copy, with no leftover bits\nor half-upgraded components. That means you have a solid foundation upon which\nto work on.\u003c/p\u003e\n\u003cp\u003eIn short: The system image is a fixed unit. It is what it is at install/update\ntime. When it comes time to patch, you just replace it, wholesale. If that fails\nfor whatever reason, the change doesn\u0026rsquo;t take place and you\u0026rsquo;re back to where you\nwere: Working.\u003c/p\u003e\n\u003cp\u003eWe even do this already in the wild with applications. Flatpak, while I disagree\nwith it being a replacement for good package management, does this for applications.\nMicrosoft has it\u0026rsquo;s MSIX apps from the Windows Store and Apple\u0026rsquo;s built-in apps are\nall contained on special partitions that get updated wholesale.\u003c/p\u003e\n\u003ch2 id=\"a-brief-history\"\u003eA Brief History\u003c/h2\u003e\n\u003cp\u003eCulture around Operating Systems has evolved over the ~60 years of computing. In\nthe early days, MS-DOS was just some files on the disk that if you deleted or\nmodified would kill your system and require an expensive call to a tech. Later,\nwe organized those files and told people to stay out, but this was mostly\nconvention and not a hard and fast rule. OSes of the Unix variety did have\npermissions to stop tampering, but these were pretty rudimentary and easy to\nmess up.\u003c/p\u003e\n\u003cp\u003eAs OSes have matured as the state of the industry has seen more harmful actors\nwilling data destruction or theft on users and organizations, we\u0026rsquo;ve put up more\nroadblocks. Windows has mostly kept apace with this by erecting stronger\npermission models and adding things like UAC and sandboxing with MSIX. Not all\nof this is well received, but it\u0026rsquo;s the state of the system. However, a lot of\nthe problems that I, as a desktop support tech, see could probably be mitigated\nby making the OS layer read-only.\u003c/p\u003e\n\u003ch2 id=\"why\"\u003eWhy?\u003c/h2\u003e\n\u003cp\u003eWhen your OS is read-only. You, nor Bob, or Sally or xXx420BlazeItBigBallsxXx\ncan make changes to the system. That\u0026rsquo;s it. No more weird OS errors, trojans,\nunbootable systems, half installed patches or corrupt system files. Your\ncomputer turns on, and verifies the system is the way it\u0026rsquo;s supposed to be and\nyou go on your merry way. This allows folks like me and my security \u0026ldquo;friends\u0026rdquo; to\nworry about your \u003cem\u003edata\u003c/em\u003e more, and less about tweaking knobs so that you can\u0026rsquo;t\ninstall 30 toolbars, delete \u003ccode\u003esystem32.dll\u003c/code\u003e or get some drive-by-malware\ninfection from a advertisement.\u003c/p\u003e\n\u003cp\u003eThe patching story cannot be undersold. When \u0026ldquo;Patch Tuesday\u0026rdquo; rolls around, you\ndon\u0026rsquo;t have to worry about it not finishing and leaving you in a half-working\nstate, or not applying \u003cem\u003esome\u003c/em\u003e of the patches because of an improper order or\nsome weird lock on a file not being removed. The whole thing is replaced. If\nthat replacement doesn\u0026rsquo;t work, then you just reboot (probably being done anyway)\nand you\u0026rsquo;re back to the last known good state.\u003c/p\u003e\n\u003cp\u003eThis is being done already on macOS and lowers the effective surface area for\nattacks to take root, and makes sure when you turn on your computer, it actually\nturns on and boots up. The same system can also be used to ensure that applications\nfollow the same behavior. Installing Microsoft Office like this would ensure that\nwhen you open Word, Word is what you get. Just like the OS, no more half-installed\nconfigurations, broken components and reinstall/repair cycles to fix that toolbar\nbutton.\u003c/p\u003e\n\u003ch2 id=\"how\"\u003eHow?\u003c/h2\u003e\n\u003cp\u003eWell, that\u0026rsquo;s the billion-dollar question. There is some groundwork done for this\nalready. There is virtualization and container support in Windows and we already\nhave a lot of prior art in Faronics\u0026rsquo; DeepFreeze software. The big missing area,\nat least as I can see it is backwards-compatibility and handling overrides or\nconfigurations.\u003c/p\u003e\n\u003cp\u003eThe story doesn\u0026rsquo;t end with monoliths like Microsoft, Apple or Red Hat handing\noff blessed OS images and you\u0026rsquo;re just forced to accept it. You can configure\nthings, make changes, and deploy images that are blessed. This even allows you\nto layer configurations atop a blessed image to further customize it. Keeping\nthe OS layer pristine, the configurations in their own space and the user system\nall separate, but perceptually unified components that don\u0026rsquo;t fight with each\nother.\u003c/p\u003e\n\u003cp\u003eBackwards compatibility is going to be a non-starter. Too much software written\nby companies expect to read and write into \u003ccode\u003eC:\\Windows\u003c/code\u003e, \u003ccode\u003eC:\\Program Files\u003c/code\u003e or\neven \u003ccode\u003eC:\\\u003c/code\u003e itself. Preventing that \u003cem\u003ewill break those programs\u003c/em\u003e. Honestly,\nthough? That\u0026rsquo;s a small sacrifice in my eyes. These programs were already broken\nto begin with. Insufficient defense around the ability to read/write to\nprotected OS areas is bush-league and should need to be rewritten anyway. It\u0026rsquo;s\n2025.\u003c/p\u003e\n\u003ch2 id=\"we-already-have-immutable-oses-at-home\"\u003eWe Already Have Immutable OSes at Home\u003c/h2\u003e\n\u003cp\u003eYou\u0026rsquo;re already running them. iOS is immutable, Android is containerizing things\nand already employs this with Work and Personal containers for apps and data.\nChromeOS is completely immutable, verified boot, separate user data partition,\nthe works. Even macOS has begun locking down things by making the OS a signed\npartition that requires booting into the recovery partition to make changes.\nLinux is one of the leaders in this space due in no small part to them being\nused in servers, where containerization is the mechanism du jour for deploying\napplications and virtual infrastructure and services. There are even desktop\nsystems built on Linux that bring the immutability to the masses.\u003c/p\u003e\n\u003cp\u003eSince the whole industry is enjoying the benefits of reliable platforms, the\nquestion becomes: \u0026ldquo;Why isn\u0026rsquo;t Microsoft?\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eWell, \u003ca\n\thref=\"https://support.microsoft.com/en-us/windows/windows-10-and-windows-11-in-s-mode-faq-851057d6-1ee9-b9e5-c30b-93baebeebc85\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://support.microsoft.com/en-us/windows/windows-10-and-windows-11-in-s-mode-faq-851057d6-1ee9-b9e5-c30b-93baebeebc85\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tthey are. Kind of\n\u003c/a\u003e. The problem is that Microsoft being Microsoft\ntries to cater to Microsoft. That means \u0026ldquo;Windows S Mode\u0026rdquo; requires you to get\nyour apps from the Windows Store and use Edge. I mean, they get points for\n\u003cem\u003etrying\u003c/em\u003e. However, if most of the top search results for \u0026ldquo;Microsoft Windows S\nMode\u0026rdquo; are for disabling it, then we have a problem. People like their apps, and\nthe Windows Store doesn\u0026rsquo;t have most of them. Despite Microsoft\u0026rsquo;s\non-again-off-again commitment to encouraging developers to embrace things like\nthe store, it\u0026rsquo;s just not happening.\u003c/p\u003e\n\u003ch2 id=\"could-it-be-done\"\u003eCould it be Done?\u003c/h2\u003e\n\u003cp\u003eYes. But also: probably not. Microsoft doesn\u0026rsquo;t like change, except when they do.\nTheir golden cow is backwards compatibility, and killing that, even for a subset\nof terrible applications, is going to be met with \u003cem\u003efierce\u003c/em\u003e resistance. Any\nperceived change in the current system will likely upset the whole ecosystem and\npush people to other platforms.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m \u003cem\u003esure\u003c/em\u003e that Microsoft knows this. Which is why we still have the leaky SS\nWindows being used in literal trillion-dollar companies with unbelievably tight\nsecurity requirements, despite it not being immutable. There is so much momentum\nto just keep on using it that it\u0026rsquo;d take a seismic shift in industry thinking to\neven broach the subject realistically.\u003c/p\u003e\n\u003ch2 id=\"wrapping-up\"\u003eWrapping up\u003c/h2\u003e\n\u003cp\u003eI don\u0026rsquo;t really \u003cem\u003ehate\u003c/em\u003e Windows. I may not like the company behind it, but the\nengineers\u0026rsquo; blood-sweat-and-tears is proof enough that some \u003cstrong\u003every\u003c/strong\u003e smart people\nhave built something that endures \u0026ndash; \u003cem\u003edespite\u003c/em\u003e it\u0026rsquo;s array of comically\nlow-hanging fruit problems.\u003c/p\u003e\n\u003cp\u003eI think we’ve outgrown the model of mutable systems, especially in high-security\nenvironments. When I find myself recommending iPads over laptops, it’s not\nbecause I’m an Apple shill. It’s because the platform is \u003cem\u003ereliable\u003c/em\u003e, and I don’t\nget calls about some patch or security product wrecking performance. The\nplatform itself \u003cstrong\u003eobviates the need\u003c/strong\u003e for so much of the resource-hungry\nobservation and remediation that\u0026rsquo;s become the status quo.\u003c/p\u003e\n\u003cp\u003eImplementing immutability isn\u0026rsquo;t about locking people out. It\u0026rsquo;s about providing a\nverifiable system that ensures stability and security by defining clear\nboundaries and enforcing them. When you turn your computer on \u0026ndash; like a TV \u0026ndash; it\nshould \u003cem\u003ejust work\u003c/em\u003e. We already have this in phones, ChromeBooks and even macOS.\u003c/p\u003e\n\u003cp\u003eThis isn\u0026rsquo;t a radical idea. In an age of rampant credential theft, ransomware and\ncryptomining zombie farms, maybe the real question is:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhy are we running \u003cem\u003eso much\u003c/em\u003e of that on a platform that \u003cem\u003eisn\u0026rsquo;t\u003c/em\u003e immutable?\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"comments\"\u003eComments\u003c/h2\u003e\n\u003cp\u003e\u003ca\n\thref=\"https://news.ycombinator.com/item?id=43633544\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://news.ycombinator.com/item?id=43633544\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tA comment from Hacker News\n\u003c/a\u003e pointed out that Windows even includes a\n\u003ca\n\thref=\"https://learn.microsoft.com/en-us/windows/configuration/unified-write-filter/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://learn.microsoft.com/en-us/windows/configuration/unified-write-filter/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tDeepFreeze-like feature called UFW\n\u003c/a\u003e, which can redirect disk writes to\nmemory or the paging area. So, what is the hold up from Microsoft? It seems like\nthey could implement immutability posture in chunks by removing the ability for\nprograms to write to areas they shouldn\u0026rsquo;t by overlaying UFW in key areas.\u003c/p\u003e\n","date_modified":"2025-04-09T09:36:39-04:00","date_published":"2025-04-09T09:36:39-04:00","id":"https://degruchy.org/2025/04/09/the-mutable-os/","title":"The Mutable OS","url":"https://degruchy.org/2025/04/09/the-mutable-os/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI\u0026rsquo;ve been reading the \u003cem\u003ecrap\u003c/em\u003e out of the \u003ca\n\thref=\"https://www.barebones.com/support/bbedit/manual.html\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.barebones.com/support/bbedit/manual.html\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tBBEdit manual\n\u003c/a\u003e. All 450 flippin'\npages of it. While it\u0026rsquo;s not \u003cem\u003equite\u003c/em\u003e as comprehensive as the Emacs manual, it\n\u003cem\u003edoes\u003c/em\u003e cover all of the surface features and menus that you can encounter in\nBBEdit, which is a lot. There are whole sections on the different support\nfolders that you can customize BBEdit with, and there are even references to the\ndifferent Emacs features and commands they support. Which is nice, because it\u0026rsquo;s\ncertainly nice to not have to abandon all of my learned muscle memory for\nopening, writing files, searching and line navigation.\u003c/p\u003e\n\u003cp\u003eI \u003ca\n\thref=\"/2025/03/27/bbedit-is-neat/\"\n\t\n\t\u003e\n\talready explored some of BBEdit\u0026rsquo;s features on my own\n\u003c/a\u003e. However, there\nis so much \u003cem\u003emore\u003c/em\u003e to the tool than just it\u0026rsquo;s mild-mannered appearance. Like many\naged characters, it has accumulated quite a lot of features over the years that\nall-too-often get buried in lieu of newer and fancier features. Like LSPs and\nAI Integration. While those are all well and good, I tend to appreciate the older\nand more subtle tools that make the difference between a \u003cem\u003egood\u003c/em\u003e tool and a \u003cem\u003egreat\u003c/em\u003e\ntool. For instance: BBEdit has the ability to find and replace, like any good text\neditor does. However, BBEdit\u0026rsquo;s functionality actually leans heavily on Grep, and\nmany of the internal semantics from the command-line tool are applicable in BBEdit.\nThis makes it easy to go from CLI to GUI without having to relearn tools.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m finding that BBEdit, while not as \u003cem\u003edirectly extensible\u003c/em\u003e as Emacs, it\u0026rsquo;s also a\n\u003cem\u003elot\u003c/em\u003e easier to pick up and run with. Regardless of your familiarity with other\ntools from other platforms or the command-line. I wish there were more well-crafted\nand honed tools like it. There are so many tools that seem more flash-in-pan and\nbuilt for a quick turn around or cash grab.\u003c/p\u003e\n","date_modified":"2025-04-08T22:04:54-04:00","date_published":"2025-04-08T22:04:54-04:00","id":"https://degruchy.org/2025/04/08/the-manual-method/","title":"The Manual Method","url":"https://degruchy.org/2025/04/08/the-manual-method/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eSo, I went and watched the \u0026ldquo;A Minecraft Movie\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eIt was\u0026hellip; a movie. About Minecraft, sure. It was competently acted and had nice\nvisuals and references to the game.\u003c/p\u003e\n\u003cp\u003eThere were cameos and in-game-references that most of the adults probably didn\u0026rsquo;t\nget. That\u0026rsquo;s okay, though, they weren\u0026rsquo;t critical to the story.\u003c/p\u003e\n\u003cp\u003eOther than that, it was just\u0026hellip; okay. Highly predictable, enjoyable romp without\ntoo much to think about.\u003c/p\u003e\n\u003cp\u003eA. Movie. Yep.\u003c/p\u003e\n","date_modified":"2025-04-06T17:32:30-04:00","date_published":"2025-04-06T17:32:30-04:00","id":"https://degruchy.org/2025/04/06/a-minecraft-movie-a-movie-to-be-sure/","title":"A Minecraft Movie: A Movie to be Sure","url":"https://degruchy.org/2025/04/06/a-minecraft-movie-a-movie-to-be-sure/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure class=\"wtfisthis\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/04/hammer.-spoon...-lua/nathan-hammerspoon-apple-ai.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/04/hammer.-spoon...-lua/nathan-hammerspoon-apple-ai.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/04/hammer.-spoon...-lua/nathan-hammerspoon-apple-ai.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/04/04/hammer.-spoon...-lua/nathan-hammerspoon-apple-ai.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/04/hammer.-spoon...-lua/nathan-hammerspoon-apple-ai.jpg\"\n             alt=\"I... I don\u0026#39;t know, me, holding a spoon and a hammer. God it\u0026#39;s awful.\" width=\"640\" height=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eUgh\u003c/h4\u003e\u003cp\u003eMe, dressed as a Norse God holding a hammer in one hand, and a spoon in the other\n                    \u003ccite class=\"fig-attribution\"\u003eSource: \u003ca href=\"https://www.apple.com/apple-intelligence/\"\u003eApple\u0026rsquo;s AI Image Playground\u003c/a\u003e\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eSigh. Lets\u0026hellip; just move on.\u003c/p\u003e\n\u003ch2 id=\"hammerspoon\"\u003eHammerspoon\u003c/h2\u003e\n\u003cp\u003eSo, in addition to the built-in \u003ca\n\thref=\"https://en.wikipedia.org/wiki/AppleScript\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/AppleScript\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tAppleScript\n\u003c/a\u003e, \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Automator_%28macOS%29\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Automator_%28macOS%29\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tAutomator\n\u003c/a\u003e and,\nrecently, \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Shortcuts_%28Apple%29\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Shortcuts_%28Apple%29\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tShortcuts\n\u003c/a\u003e there are other tools that macOS users can use to\nautomate their macs and get things done. One of them is the amazing\n\u003ca\n\thref=\"https://hammerspoon.org/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://hammerspoon.org/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tHammerspoon\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eDespite the weird name, this tool allows you to write \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Lua_%28programming_language%29\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Lua_%28programming_language%29\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tLua\n\u003c/a\u003e scripts to\ninteract with your mac, display dialogs, and handle macOS stuff along with\nthe more traditional unixy stuff that you might associate with Lua. If you\u0026rsquo;re\nnot aware, Lua is a small language that you can easily embed in many \u003cem\u003eother\u003c/em\u003e\nlanguages, and as a stand-alone scripting language, it can be used to make quick\nand easy scripts to do all sorts of things. Notably, Lua is used frequently in\ngame design as a mechanism to allow for scripting or even external plugin\ninfrastructure.\u003c/p\u003e\n\u003cp\u003eExtending this to macOS lets you do all sorts of things that normally you\u0026rsquo;d have\nto reach out into AppleScript territory, or build custom tools to poll the\nsystem services to get the information you need. It also allows you to bring in\nparts of the wider Lua ecosystem to craft what you need. Things like\n\u003ca\n\thref=\"https://fennel-lang.org\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://fennel-lang.org\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tFennel\n\u003c/a\u003e allow you to write Lisp instead of Lua, if that\u0026rsquo;s your thing. It\nall Just Works(tm).\u003c/p\u003e\n\u003cp\u003eRight now, I\u0026rsquo;m in the process of working with ChatGPT to build a simple\nbatch-rename tool in the style of Emacs\u0026rsquo; \u003ccode\u003ewdired-mode\u003c/code\u003e that has you able to edit\nthe file names in an editor and then have them renamed accordingly. The progress\nhas been fast and with few actual errors. I\u0026rsquo;ve been learning how Lua works, and\ngetting advice on how to build applications in Lua. It\u0026rsquo;s made me appreciate the\nlanguage more than I did before.\u003c/p\u003e\n\u003cp\u003eHopefully, once I have something truly working well, I\u0026rsquo;ll post it here. It\u0026rsquo;s not\ntoo long yet, and it brings in some of the cool tricks that Lua can do without\nhaving to puzzle out how to do it in a more complex language like C++ or\nObjective C.\u003c/p\u003e\n\u003cp\u003eThis is just scratching the surface of the tool. Though, be warned, it\u0026rsquo;s a steep\ncliff in terms of learning. When you start it, you have \u003cem\u003enothing\u003c/em\u003e. It expects\nyou to build the parts from the language and it\u0026rsquo;s extensions.\u003c/p\u003e\n","date_modified":"2025-04-04T16:51:53-04:00","date_published":"2025-04-04T16:51:53-04:00","id":"https://degruchy.org/2025/04/04/hammer.-spoon...-lua/","title":"Hammer. Spoon... Lua?","url":"https://degruchy.org/2025/04/04/hammer.-spoon...-lua/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eSo, going back to my love of all things text and, by extension, terminal-based.\nI discovered a feature in the \u003ca\n\thref=\"https://fishshell.com\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://fishshell.com\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tFish Shell\n\u003c/a\u003e that not only helps you build\nshortcuts, but also can help you with longer commands or parts of commands. That\nis \u003ca\n\thref=\"https://fishshell.com/docs/current/cmds/abbr.html\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://fishshell.com/docs/current/cmds/abbr.html\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tabbreviations\n\u003c/a\u003e. At first glance, this built-in looks \u003cem\u003ejust like\u003c/em\u003e the\nmore traditional \u003ccode\u003ealias\u003c/code\u003e tools in lots of other shells out there. You type one\nseries of characters, like \u003ccode\u003e,gc\u003c/code\u003e for \u003ccode\u003egit commit\u003c/code\u003e or \u003ccode\u003e,d.o\u003c/code\u003e for \u003ccode\u003essh degruchy.org\u003c/code\u003e (or if you\u0026rsquo;ve got an SSH alias, \u003ccode\u003e,d.o\u003c/code\u003e to \u003ccode\u003essh d.o\u003c/code\u003e \u0026ndash; now \u003cem\u003ethats\u003c/em\u003e\nlayers). This is extremely handy when having to do tedious or just repetitive\ncommands that may not be in the immediate history, or just long.\u003c/p\u003e\n\u003ch2 id=\"abbr-extends-alias\"\u003e\u003ccode\u003eabbr\u003c/code\u003e Extends \u003ccode\u003ealias\u003c/code\u003e\u003c/h2\u003e\n\u003cp\u003eWell, not \u003cem\u003edirectly\u003c/em\u003e, anyway. Fish shell\u0026rsquo;s \u003ccode\u003eabbr\u003c/code\u003e command is more akin to a text\nexpansion (like in \u003ca\n\thref=\"https://espanso.org\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://espanso.org\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tEspanso\n\u003c/a\u003e). When you type the trigger\n(and press space/return) that text is expanded to the full form. Meaning if you\ntype \u003ccode\u003e,fse\u0026lt;space\u0026gt;\u003c/code\u003e in my shell, you\u0026rsquo;d get \u003ccode\u003efossil status --extra\u003c/code\u003e expanded out\nfor you. It\u0026rsquo;s also useful just in the \u003ccode\u003ealias\u003c/code\u003e sense, because typing \u003ccode\u003e,fse\u0026lt;return\u0026gt;\u003c/code\u003e\ngets you the command run, but also echoing the expanded command above it.\u003c/p\u003e\n\u003ch3 id=\"but-wait-theres-more\"\u003eBut wait\u0026hellip; there\u0026rsquo;s more!\u003c/h3\u003e\n\u003cp\u003eBy default, these expansions happen when you type the trigger at the beginning of a\ncommand. That\u0026rsquo;s fine for most \u003ccode\u003ealias\u003c/code\u003e-esque usage, but you can also tell Fish to\nexpand them \u003cem\u003eanywhere\u003c/em\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fish\" data-lang=\"fish\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eabbr\u003c/span\u003e \u003cspan class=\"na\"\u003e-a\u003c/span\u003e L \u003cspan class=\"na\"\u003e--position\u003c/span\u003e anywhere \u003cspan class=\"na\"\u003e--set-cursor\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;% | less\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOr even have them activate as part of a specific command:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWith \u003ccode\u003e--command COMMAND\u003c/code\u003e, the abbreviation will only expand when it is used as\nan argument to the given \u003ccode\u003eCOMMAND\u003c/code\u003e. Multiple \u003ccode\u003e--command\u003c/code\u003e can be used together,\nand the abbreviation will expand for each. An empty \u003ccode\u003eCOMMAND\u003c/code\u003e means it will\nexpand only when there is no command. \u003ccode\u003e--command\u003c/code\u003e implies \u003ccode\u003e--position\u003c/code\u003e\nanywhere and disallows \u003ccode\u003e--position\u003c/code\u003e command. Even with different \u003ccode\u003eCOMMANDS\u003c/code\u003e,\nthe \u003ccode\u003eNAME\u003c/code\u003e of the abbreviation needs to be unique. Consider using \u003ccode\u003e--regex\u003c/code\u003e if\nyou want to expand the same word differently for multiple commands.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI really love the idea of \u003ccode\u003eabbr\u003c/code\u003e\u0026rsquo;s. They both help shorten typed commands, but\nalso help you remember or expand arguments and other parts to speed up your day\nand reenforce learning by expanding the shortcut and not just replacing it.\u003c/p\u003e\n","date_modified":"2025-04-04T11:00:27-04:00","date_published":"2025-04-04T11:00:27-04:00","id":"https://degruchy.org/2025/04/04/aliases-and-abbreviations/","title":"Aliases and Abbreviations","url":"https://degruchy.org/2025/04/04/aliases-and-abbreviations/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eYeah, I know there were lots of other cool announcements for the Switch 2, and I\ncan rave about those some other time when I actually use it, but this\u0026hellip; this is\n👨‍🍳 😘 🤌\u003c/p\u003e\n\u003cfigure class=\"metroid4-mouse\"\u003e\u003ca href=\"https://youtu.be/1uGRs-ispRU?t=3406\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/04/03/the-only-switch-2-announcement-that-i-care-about/metroid4-mouse.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/04/03/the-only-switch-2-announcement-that-i-care-about/metroid4-mouse.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/04/03/the-only-switch-2-announcement-that-i-care-about/metroid4-mouse.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/04/03/the-only-switch-2-announcement-that-i-care-about/metroid4-mouse.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/04/03/the-only-switch-2-announcement-that-i-care-about/metroid4-mouse.jpg\"\n             alt=\"A screenshot of a YouTube video showing off mouse controls in Metroid 4\" width=\"640\" height=\"355\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003ch4\u003eOMG YES\u003c/h4\u003e\u003cp\u003eIt\u0026rsquo;s all I ever wanted and more! \u003cstrong\u003eWarning:\u003c/strong\u003e YouTube Link\n                    \u003ccite class=\"fig-attribution\"\u003eSource: \u003ca href=\"https://youtu.be/1uGRs-ispRU?t=3406\"\u003eNintendo\u003c/a\u003e\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eThe only thing that could make it better would be mouse and keyboard setup for\nthis.\u003c/p\u003e\n","date_modified":"2025-04-03T12:38:40-04:00","date_published":"2025-04-03T12:38:40-04:00","id":"https://degruchy.org/2025/04/03/the-only-switch-2-announcement-that-i-care-about/","title":"The Only Switch 2 Announcement That I Care About","url":"https://degruchy.org/2025/04/03/the-only-switch-2-announcement-that-i-care-about/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eSo, I\u0026rsquo;m adding featured images to my posts. Well, I\u0026rsquo;m adding the \u003cem\u003eability\u003c/em\u003e to\nprovide featured images for posts. I like posting images, but I don\u0026rsquo;t often like\nmaking featured images because it\u0026rsquo;s hard to get right. I think I\u0026rsquo;ve got the\nformula down, now. I could probably optimize some more with resizing or cropping\nthe image, but one thing at a time, eh?\u003c/p\u003e\n\u003cp\u003eSo, this post will have a featured image. I\u0026rsquo;m still thinking about if I want to\ndisplay it on the post page, too. Again, one thing at a time.\u003c/p\u003e\n","date_modified":"2025-03-31T21:43:42-04:00","date_published":"2025-03-31T21:43:42-04:00","id":"https://degruchy.org/2025/03/31/featured-images-in-posts/","title":"Featured Images in Posts","url":"https://degruchy.org/2025/03/31/featured-images-in-posts/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI work in a high-tech, highly regulated environment. Our security posture is\nend-user visible through the various so-called \u0026rsquo;endpoint security\u0026rsquo; tools that\nare deployed en masse and kept rigidly up-to-date. These tools can do lots of\nthings, like restrict apps from running, restrict installers from all manner of\nsources, prevent things like PowerShell from running, even lock down parts of\nWindows itself.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t have a problem with these tools. When your base is the HMS LeakyWindows,\nyou\u0026rsquo;ve got to patch those holes \u003cem\u003esomehow\u003c/em\u003e. The problem I have is when I use\napproved apps to do legitimate things, that I get caught up in automated\nsecurity dragnets that then get me a nastygram from our Security team. The\nlatest one went something like this:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eSecurity:\u003c/strong\u003e Hey, I see you installed a program from the App Store on your mac call\n\u0026ldquo;Amphetamine\u0026rdquo;, why do you need an Idle Prevention tool?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eMe:\u003c/strong\u003e Because I was tired of having to crack open a useless terminal window to\nrun \u003ccode\u003ecaffeinate\u003c/code\u003e. You know, the tool built into all versions of macOS since\ntime immemorial that allows for idle prevention? I also use the idle\nprevention software built into the unrestricted, signed and approved PowerToys\non Windows, if these tools are so bad, why do you allow them?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m still waiting on their reply.\u003c/p\u003e\n\u003cp\u003eHowever, this is not the first time I\u0026rsquo;ve been bullied. I once had the \u003cem\u003eaudacity\u003c/em\u003e\nto use \u003ccode\u003ecurl.exe\u003c/code\u003e on Windows. No, not one I downloaded from the Internet, the\nbuilt-in one that\u0026rsquo;s been around for neigh on \u003cem\u003eEIGHT YEARS\u003c/em\u003e\u003csup id=\"fnref:1\"\u003e\u003ca href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e1\u003c/a\u003e\u003c/sup\u003e. I didn\u0026rsquo;t even do\nanything ✨mAlIcIoUs✨ with it. I literally just \u003ccode\u003ecurl\u003c/code\u003e\u0026rsquo;d google.com because I\ncouldn\u0026rsquo;t tell if I could get out to the Internet just yet.\u003c/p\u003e\n\u003cp\u003eThe email they sent me was hilarious. The software scanning tool they use had\nsome ancient text about how \u003ccode\u003ecurl.exe\u003c/code\u003e was included in some hacker toolset from\nthe \u003ccode\u003e1337\u003c/code\u003e days of y0r3. I was so surprised something so obviously out of date\nand wrong was still in this kind of database, but that the technician didn\u0026rsquo;t\njust look at it and dismiss it as obviously a false positive.\u003c/p\u003e\n\u003cp\u003eHOW DO SECURITY PEOPLE HAVE JOBS? HOW DO YOU GET INTO A POSITION LIKE THIS WITH\nNO KNOWLEDGE OF YOUR FIELD, THE TOOLS AVAILABLE, AND NO SELF-REASONING SKILLS??\nSERIOUSLY.\u003c/p\u003e\n\u003cp\u003eHow does a desktop support guy know more about your job than \u003cem\u003eyou\u003c/em\u003e do?\u003c/p\u003e\n\u003cp\u003eAre all security folk a joke? No, I imagine not. However these desk jockeys\nthey\u0026rsquo;ve got are little better than talking heads.\u003c/p\u003e\n\u003cdiv class=\"footnotes\" role=\"doc-endnotes\"\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli id=\"fn:1\"\u003e\n\u003cp\u003e\u003ca\n\thref=\"https://curl.se/windows/microsoft.html\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://curl.se/windows/microsoft.html\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tProof\n\u003c/a\u003e\u0026#160;\u003ca href=\"#fnref:1\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n","date_modified":"2025-03-31T15:29:11-04:00","date_published":"2025-03-31T15:29:11-04:00","id":"https://degruchy.org/2025/03/31/another-day-another-nastygram-from-security/","title":"Another Day, Another Nastygram from Security","url":"https://degruchy.org/2025/03/31/another-day-another-nastygram-from-security/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eA few months ago, I talked about \u003ca\n\thref=\"/2025/01/28/emacs-and-filesets/\"\n\t\n\t\u003e\n\tEmacs and the various \u0026lsquo;fileset\u0026rsquo; functions\n\u003c/a\u003e\nthat were buried in it\u0026rsquo;s voluminous core of goodies. While somewhat obscured,\nand certainly not very accessible from the UI, they were \u003cem\u003ethere\u003c/em\u003e and were\n\u003cem\u003efunctional\u003c/em\u003e. They, in true Emacs fashion, allowed you to define filesets as\nwhatever suited your fancy. If you wanted to define a list yourself, you could,\nyou could also define a fileset as a folder of files and probably even have the\nlist be dynamically populated by the result of a function. IDK, Lisps are all\n\u0026ldquo;data is code; code is data\u0026rdquo; and that\u0026rsquo;s cool.\u003c/p\u003e\n\u003ch2 id=\"bbedit-projects\"\u003eBBEdit Projects\u003c/h2\u003e\n\u003cp\u003eHowever, on macOS, BBEdit also has the idea of filesets. Actually a couple of\ndifferent concepts. One, you may be familiar with is the \u0026lsquo;Project\u0026rsquo;. You get a\nlist of files in a directory, usually defined around the root level \u003ccode\u003e.git\u003c/code\u003e\nfolder and pow, fileset. However, you can also create filesets of disparate\nparts, and organize them however you like. You just create a blank project from\nthe menu and start adding files and \u0026lsquo;collections\u0026rsquo; (read: folders). This is handy\nwhen your project only has a few different key files you care about actually\n\u003cem\u003eediting\u003c/em\u003e. I use this for my site, and for Fish Shell\u0026rsquo;s various config folders.\u003c/p\u003e\n\u003cp\u003eSimilarly, you can setup a \u0026ldquo;disk browser\u0026rdquo; collection that just dumps the list of\nfiles in that folder into a project-like view. Bypassing the need to actually\nhave any sort of structured project in the first place, just an assortment of\nvaguely related files.\u003c/p\u003e\n\u003ch3 id=\"notebooks\"\u003eNotebooks\u003c/h3\u003e\n\u003cp\u003eAnother type of fileset is the BBEdit \u0026ldquo;Notebook\u0026rdquo; feature. The notes feature works\nlike an app bundle, in that there is a top-level \u0026ldquo;file\u0026rdquo; that behaves like one\nunit, and inside that file are discreet text files that make up the notes. These\nare usually named uniquely, but presented as whatever the top-level heading\ndefines. Similar to projects, it has it\u0026rsquo;s own structure and the files are\nautomatically maintained.\u003c/p\u003e\n\u003ch3 id=\"everything-else\"\u003eEverything else\u003c/h3\u003e\n\u003cp\u003eThere are a couple of other kinds of container-esque tools, but they\u0026rsquo;re more\nlike special buffers in Emacs. Things like LLM Chats that happen all within one\nMarkdown file. Or shell worksheets that act like a simple prompt that you can\nrun commands in and have the output in BBEdit. It feels like BBEdit is really\ncribbing some of Emacs ideas. Not all of them, but there is certainly a vibe of\npicking up popular features and adapting them to something that GUI-trained\nusers would be comfortable picking up and running with.\u003c/p\u003e\n","date_modified":"2025-03-31T12:53:46-04:00","date_published":"2025-03-31T12:53:46-04:00","id":"https://degruchy.org/2025/03/31/filesets-in-more-places-macos-edition/","title":"Filesets in More Places - macOS Edition","url":"https://degruchy.org/2025/03/31/filesets-in-more-places-macos-edition/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI\u0026rsquo;m not even sure what to make of this anymore. We\u0026rsquo;re barely 4 months into this\ndumpster fire\u003csup id=\"fnref:1\"\u003e\u003ca href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e1\u003c/a\u003e\u003c/sup\u003e of a presidency and \u003ca\n\thref=\"https://www.reuters.com/world/us/trump-says-he-is-not-joking-about-third-presidential-term-2025-03-30/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.reuters.com/world/us/trump-says-he-is-not-joking-about-third-presidential-term-2025-03-30/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tthis is already on the\ntable\n\u003c/a\u003e (\u003ca\n\thref=\"/assets/archives/reuters.com_trump_third_term.html\"\n\t\n\t\u003e\n\tarchive\n\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t get it. I don\u0026rsquo;t get it and I\u0026rsquo;m scared what this might be the \u003cem\u003estart\u003c/em\u003e of.\nThis country has stood for ~300 years as a democracy and now some narcissistic\n\u0026ldquo;billionaire\u0026rdquo; becomes president and now it\u0026rsquo;s going to be an empire. I\u0026rsquo;m so sorry\nfor my son. I\u0026rsquo;m so sorry I couldn\u0026rsquo;t stop this travesty from unrolling and\nleaving you with the burning wreckage of what was once a great place. I know\nit\u0026rsquo;s not \u003cem\u003emy fault\u003c/em\u003e, directly, but I couldn\u0026rsquo;t do enough to stop it for you.\nPlease forgive me.\u003c/p\u003e\n\u003cdiv class=\"footnotes\" role=\"doc-endnotes\"\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli id=\"fn:1\"\u003e\n\u003cp\u003e\u003ca\n\thref=\"https://www.roadandtrack.com/news/a62009993/tesla-cybertruck-fire-takes-more-than-hour-to-put-out/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.roadandtrack.com/news/a62009993/tesla-cybertruck-fire-takes-more-than-hour-to-put-out/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tLike this dumpster, on fire\n\u003c/a\u003e\u0026#160;\u003ca href=\"#fnref:1\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n","date_modified":"2025-03-30T14:45:04-04:00","date_published":"2025-03-30T14:45:04-04:00","id":"https://degruchy.org/2025/03/30/no-im-not-joking.-im-not-joking./","title":"\"No, I'm not joking. I'm not joking.\"","url":"https://degruchy.org/2025/03/30/no-im-not-joking.-im-not-joking./"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cul class=\"caturday gallery\" rel=\"page\"\u003e\u003cli\u003e\n        \u003ca href=\"/2025/03/29/another-caturday-another-day-on-the-patio/squirrel.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/03/29/another-caturday-another-day-on-the-patio/squirrel_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/29/another-caturday-another-day-on-the-patio/squirrel_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/29/another-caturday-another-day-on-the-patio/squirrel_tn.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/29/another-caturday-another-day-on-the-patio/squirrel_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/29/another-caturday-another-day-on-the-patio/squirrel_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eSQUIRREL!\n\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/03/29/another-caturday-another-day-on-the-patio/noticed.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/03/29/another-caturday-another-day-on-the-patio/noticed_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/29/another-caturday-another-day-on-the-patio/noticed_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/29/another-caturday-another-day-on-the-patio/noticed_tn.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/29/another-caturday-another-day-on-the-patio/noticed_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/29/another-caturday-another-day-on-the-patio/noticed_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003e‼\n\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/03/29/another-caturday-another-day-on-the-patio/bailey.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/03/29/another-caturday-another-day-on-the-patio/bailey_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/29/another-caturday-another-day-on-the-patio/bailey_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/29/another-caturday-another-day-on-the-patio/bailey_tn.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/29/another-caturday-another-day-on-the-patio/bailey_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/29/another-caturday-another-day-on-the-patio/bailey_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eGrumpy because he couldn\u0026#39;t get the squirrel\n\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003c/ul\u003e\n\n\u003cstyle\u003e\n\t@layer post\n\t{\n\t\t.gallery\n\t\t{\n\t\t\talign-content: space-evenly;\n\t\t\tbackground-color: var(--theme-color-alt-background);\n\t\t\tborder: 3px solid var(--theme-color-border);\n\t\t\tborder-radius: 10px;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: center;\n\t\t\tpadding: 0;\n\n\t\t\tli\n\t\t\t{\n\t\t\t\tlist-style-type: none;\n\t\t\t}\n\n\t\t\ta\n\t\t\t{\n\t\t\tcolor: var(--theme-color-alt-foreground);\n\t\t\t}\n\n\t\t\tfigcaption\n\t\t\t{\n\t\t\t\theight: 1.4rem;\n\t\t\t\tmax-width: 128px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\ttext-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n\u003c/style\u003e\n\n\u003cp\u003eAnother lovely day on the patio with the catios. This time there was a little\ndrama with a squirrel on their lawn!\u003c/p\u003e\n","date_modified":"2025-03-29T11:46:09-04:00","date_published":"2025-03-29T11:46:09-04:00","id":"https://degruchy.org/2025/03/29/another-caturday-another-day-on-the-patio/","title":"Another Caturday, Another Day on the Patio","url":"https://degruchy.org/2025/03/29/another-caturday-another-day-on-the-patio/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eHrnnnngg\u0026hellip;.\u003c/p\u003e\n\u003cfigure class=\"metroid\"\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Metroid_Prime_4:_Beyond\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/03/28/metroid-prime-4/metroid-prime-4.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/28/metroid-prime-4/metroid-prime-4.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/28/metroid-prime-4/metroid-prime-4.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/28/metroid-prime-4/metroid-prime-4.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/28/metroid-prime-4/metroid-prime-4.jpg\"\n             alt=\"A title card for Metroid Prime 4: Beyond\" width=\"640\" height=\"360\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003cp\u003eIt\u0026rsquo;s finally coming!!!\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003ePlus it went back to \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Metroid_Prime_4:_Beyond\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Metroid_Prime_4:_Beyond\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tbeing handled by Retro Studios\n\u003c/a\u003e, the developers of the\noriginal Metroid Prime series, so no more Ubisoft shenanigans.\u003c/p\u003e\n","date_modified":"2025-03-28T15:19:06-04:00","date_published":"2025-03-28T15:19:06-04:00","id":"https://degruchy.org/2025/03/28/metroid-prime-4/","title":"Metroid Prime 4","url":"https://degruchy.org/2025/03/28/metroid-prime-4/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI can do \u003ca\n\thref=\"https://irace.me/vibe\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://irace.me/vibe\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tApple AI failure\n\u003c/a\u003e posts too!\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/03/28/apple-ai-fail/apple-ai-fail.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/28/apple-ai-fail/apple-ai-fail.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/28/apple-ai-fail/apple-ai-fail.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/28/apple-ai-fail/apple-ai-fail.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/28/apple-ai-fail/apple-ai-fail.jpg\"\n             alt=\"A picture of an email on iOS being proofread by Apple\u0026#39;s AI tool and failing to realize that the \u0026#39;Thank you\u0026#39; message highlighted actually _does_ contain the word \u0026#39;you\u0026#39;\"\u003e\n    \u003c/picture\u003e\u003cfigcaption\u003e\n            \u003ch4\u003eA Tragedy in One Act\u003c/h4\u003e\u003cp\u003eThe proofreading tools needs some proofreading\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n","date_modified":"2025-03-28T09:09:55-04:00","date_published":"2025-03-28T09:09:55-04:00","id":"https://degruchy.org/2025/03/28/apple-ai-fail/","title":"Apple AI Fail","url":"https://degruchy.org/2025/03/28/apple-ai-fail/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\u003ca\n\thref=\"https://arstechnica.com/health/2025/03/this-will-be-a-painful-period-rfk-jr-slashes-24-of-us-health-dept/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://arstechnica.com/health/2025/03/this-will-be-a-painful-period-rfk-jr-slashes-24-of-us-health-dept/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tFucking turd-burgler\n\u003c/a\u003e. Yeah, it\u0026rsquo;ll be hard for \u003cem\u003eus\u003c/em\u003e you dipshit. \u003cem\u003eYou\u003c/em\u003e\nhave money, power and connections. Your ass isn\u0026rsquo;t inconvenienced in \u003cem\u003eany\u003c/em\u003e way.\nSo lets drop the charade that this is about sacrifice to get back on the road to\nfinancial stability. You\u0026rsquo;re saving less than 1% of the budget with these cuts\nyou jagoff. You\u0026rsquo;re letting north of 5,000 people go and reducing funding to the\nmost in-need state support systems for health. So eat a fucking dick you\nshit-for-brains, sorry excuse for a Kennedy.\u003c/p\u003e\n\u003cvideo  preload=\"auto\" width=\"100%\"  autoplay loop playsinline class=\"\"\u003e\n    \u003csource src=\"/2025/03/27/some-of-your-may-die...-that-is-a-sacrifice-im-willing-to-make./sacrifice-meme.webm\" type=\"video/webm\"\u003e\n    \u003csource src=\"/2025/03/27/some-of-your-may-die...-that-is-a-sacrifice-im-willing-to-make./sacrifice-meme.ogv\" type=\"video/ogg\"\u003e\n    \u003csource src=\"/2025/03/27/some-of-your-may-die...-that-is-a-sacrifice-im-willing-to-make./sacrifice-meme.mp4\" type=\"video/mp4\"\u003e\n  \u003cspan\u003e\u003c/span\u003e\n\u003c/video\u003e\n","date_modified":"2025-03-27T15:22:54-04:00","date_published":"2025-03-27T15:22:54-04:00","id":"https://degruchy.org/2025/03/27/some-of-your-may-die...-that-is-a-sacrifice-im-willing-to-make./","title":"Some of your may die... That is a sacrifice I'm willing to make.","url":"https://degruchy.org/2025/03/27/some-of-your-may-die...-that-is-a-sacrifice-im-willing-to-make./"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eThe old trusted-and-true editor for macOS, BBEdit, is still alive and kicking. I\nhadn\u0026rsquo;t used it in \u003cem\u003eages\u003c/em\u003e, so I decided that I\u0026rsquo;d give it another go. Due to it\u0026rsquo;s\nage, it has accumulated a quite a lot of features (and cruft) along with it\u0026rsquo;s\ncult following. I\u0026rsquo;m not quite ready to give up on Emacs just yet, but being on\nmacOS again, I\u0026rsquo;m curious to see how the landscape has changed.\u003c/p\u003e\n\u003ch2 id=\"the-bad\"\u003eThe Bad\u003c/h2\u003e\n\u003cp\u003eFor one, BBEdit has never exactly been the most \u003cem\u003eextensible\u003c/em\u003e editor out there.\nAdding new languages in the past was difficult at best. While that has changed\nwith \u003ca\n\thref=\"https://www.barebones.com/support/develop/clm.html\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.barebones.com/support/develop/clm.html\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tCodeless Language Modules\n\u003c/a\u003e, you don\u0026rsquo;t really get anything outside of\nsyntax highlighting and some word completions. And that\u0026rsquo;s not \u003cem\u003ebad\u003c/em\u003e. It\u0026rsquo;s just\nthat coming from Emacs, you miss out on whole \u0026ldquo;modes\u0026rdquo; where the editor extends\nitself into something more when editing those files.\u003c/p\u003e\n\u003cp\u003eBBEdit is also much more niche-oriented. I seem to remember that it was a great\nchoice for editing MacPerl scripts, AppleScript and HTML. While it\u0026rsquo;s obviously\ngrown to support much more than that, the built-in functionality is still\nsomewhat focused around those kinds of activities. There is even a whole menu\nfor \u0026ldquo;markup\u0026rdquo; which is \u003cem\u003ejust\u003c/em\u003e HTML tools. This is great if that\u0026rsquo;s what you\u0026rsquo;re\nworking on. It\u0026rsquo;s less great when you\u0026rsquo;ve got other languages that are markup\nlanguages that could re-use that space for their own support items.\u003c/p\u003e\n\u003cp\u003eThere is also a notable lack of configurable \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Language_Server_Protocol\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Language_Server_Protocol\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tLanguage Server Protocol\n\u003c/a\u003e\noptions anywhere in the UI. There are \u003ca\n\thref=\"https://www.barebones.com/support/bbedit/lsp-notes.html\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.barebones.com/support/bbedit/lsp-notes.html\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tpreconfigured options\n\u003c/a\u003e that as\nlong as the server is installed in your \u003ccode\u003e$PATH\u003c/code\u003e or in the special folder, then\nit\u0026rsquo;ll Just Work(tm). However, adding one or adding an alternative one seems like\na exercise in frustration. For instance, I do not want to use the VSCode\nTypeScript-Node-Abomination. I want to use SuperHTML, which works well for my\npurposes. In order to add it, I have to copy the HTML language definition and\nmodify the key where it provides for a preferred LSP. This is a mess and\nhonestly just makes me not want to use \u003cem\u003eany\u003c/em\u003e LSPs with BBEdit.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eEdit:\u003c/em\u003e I just discovered that you can override options, like the LSP, for\ninstalled languages, which makes me much happier.\u003c/p\u003e\n\u003ch2 id=\"the-good\"\u003eThe Good\u003c/h2\u003e\n\u003cp\u003eIt does, however, have it\u0026rsquo;s bright spots. The \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Multiple-document_interface\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Multiple-document_interface\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tMDI\n\u003c/a\u003e supports a variety of\ndifferent layouts, like the popular sidebar/project view as well as floating\ntool panels for different tasks like document management and snippets. These\nfeatures feel like the classic interface I remember, and generally \u003cem\u003efeel\u003c/em\u003e better\nto use than something like Sublime Text, where everything is in that activity\nmenu or in a JSON config file.\u003c/p\u003e\n\u003cp\u003eThere also seems like some love for Emacs in the fact that it has a partial\nimplementation of Emacs keybindings for things like save, find-file, search and\nmore. This makes the transition from Emacs to BBEdit all the less painful\nbecause all your trusty keybindings are likely to be supported. You can even get\na little status window to show you what you just triggered. That said, it is\n\u003cem\u003elimited\u003c/em\u003e in what it supports.\u003c/p\u003e\n\u003ch1 id=\"the-verdict\"\u003eThe Verdict\u003c/h1\u003e\n\u003cp\u003eI \u003cem\u003elike\u003c/em\u003e BBEdit. I just don\u0026rsquo;t know if I $60-like-it. It\u0026rsquo;s a hard sell. Sublime\nText, which is also very feature-packed is $100, and that\u0026rsquo;s just a hard no from\nsomeone who doesn\u0026rsquo;t code for a living. $60 I could do, if it was worth it.\u003c/p\u003e\n\u003cp\u003eFor right now, though, Emacs is where I\u0026rsquo;m going to be staying. It\u0026rsquo;s pretty\ncomfortable, but the macOS integration leaves a lot to be desired.\u003c/p\u003e\n","date_modified":"2025-03-27T13:40:36-04:00","date_published":"2025-03-27T13:40:36-04:00","id":"https://degruchy.org/2025/03/27/bbedit-is-neat/","title":"BBEdit is Neat","url":"https://degruchy.org/2025/03/27/bbedit-is-neat/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003ca href=\"https://bsky.app/profile/cpsc.gov/post/3ll7fjvvxp22e\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/03/25/the-us-consumer-product-safety-commission-on-bluesky/cpsc-bsky.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/25/the-us-consumer-product-safety-commission-on-bluesky/cpsc-bsky.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/25/the-us-consumer-product-safety-commission-on-bluesky/cpsc-bsky.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/25/the-us-consumer-product-safety-commission-on-bluesky/cpsc-bsky.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/25/the-us-consumer-product-safety-commission-on-bluesky/cpsc-bsky.jpg\"\n             alt=\"A screenshot of the US Consumer Product Safety Commission\u0026#39;s BlueSky Account talking about riding lawn mower safety\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption\u003e\n            \u003cp\u003eThere are more bangers on their account, including (and I\u0026rsquo;m not joking) \u0026ldquo;Vapo McJuicy\u0026rdquo;\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eI have no notes. Brilliant, on message, straight-to-the-point yet\nattention grabbing. Bravo. I\u0026rsquo;m \u003cem\u003ethrilled\u003c/em\u003e to have my tax dollars at\nwork for this\u0026hellip; \u003cem\u003eART\u003c/em\u003e. *chef kiss*\u003c/p\u003e\n","date_modified":"2025-03-25T13:34:14-04:00","date_published":"2025-03-25T13:34:14-04:00","id":"https://degruchy.org/2025/03/25/the-us-consumer-product-safety-commission-on-bluesky/","title":"The US Consumer Product Safety Commission on BlueSky","url":"https://degruchy.org/2025/03/25/the-us-consumer-product-safety-commission-on-bluesky/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/03/24/mac-ception/mac-ception.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/24/mac-ception/mac-ception.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/24/mac-ception/mac-ception.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/24/mac-ception/mac-ception.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/24/mac-ception/mac-ception.jpg\"\n             alt=\"I have become mac, emulator of worlds\"\u003e\n    \u003c/picture\u003e\u003cfigcaption\u003e\n            \u003cp\u003eI have become mac, emulator of worlds\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003e\u003ca\n\thref=\"https://infinitemac.org\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://infinitemac.org\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tInfinite Mac\n\u003c/a\u003e has updated their online emulators to support some\nearly versions of Mac OS X (yes, instead of just macOS).\u003c/p\u003e\n","date_modified":"2025-03-24T11:46:26-04:00","date_published":"2025-03-24T11:46:26-04:00","id":"https://degruchy.org/2025/03/24/mac-ception/","title":"Mac-ception","url":"https://degruchy.org/2025/03/24/mac-ception/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eToday\u0026rsquo;s a great day for being outside. I was on the patio watching\nMinecraft Live and the cats just wanted to join me for a good time\nchilling.\u003c/p\u003e\n\u003cul class=\"idksomethingincredible gallery\" rel=\"page\"\u003e\u003cli\u003e\n        \u003ca href=\"/2025/03/22/caturday/caturday.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/03/22/caturday/caturday_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/22/caturday/caturday_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/22/caturday/caturday_tn.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/22/caturday/caturday_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/22/caturday/caturday_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eBailey sitting between my legs, because that area is his spot.\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/03/22/caturday/caturday2.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/03/22/caturday/caturday2_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/22/caturday/caturday2_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/22/caturday/caturday2_tn.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/22/caturday/caturday2_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/22/caturday/caturday2_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eEllie, more reserved, decided I needed biscuits shortly after this photo.\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003c/ul\u003e\n\n\u003cstyle\u003e\n\t@layer post\n\t{\n\t\t.gallery\n\t\t{\n\t\t\talign-content: space-evenly;\n\t\t\tbackground-color: var(--theme-color-alt-background);\n\t\t\tborder: 3px solid var(--theme-color-border);\n\t\t\tborder-radius: 10px;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: center;\n\t\t\tpadding: 0;\n\n\t\t\tli\n\t\t\t{\n\t\t\t\tlist-style-type: none;\n\t\t\t}\n\n\t\t\ta\n\t\t\t{\n\t\t\tcolor: var(--theme-color-alt-foreground);\n\t\t\t}\n\n\t\t\tfigcaption\n\t\t\t{\n\t\t\t\theight: 1.4rem;\n\t\t\t\tmax-width: 128px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\ttext-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n\u003c/style\u003e\n\n","date_modified":"2025-03-22T14:49:12-04:00","date_published":"2025-03-22T14:49:12-04:00","id":"https://degruchy.org/2025/03/22/caturday/","title":"Caturday","url":"https://degruchy.org/2025/03/22/caturday/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eIt looks like the New York University website has been hacked\u003csup id=\"fnref:1\"\u003e\u003ca href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e1\u003c/a\u003e\u003c/sup\u003e and\ndefaced by some racist language and cherry-picked data. It claims that\ndiversity in admissions is illegal and that African-Americans are\nsomehow inferior, putting Asian-American\u0026rsquo;s at the top. The logo also\nappears to be stereotypical of an Asian woman\u0026rsquo;s hair clipped with\nmulti-color hair clips.\u003c/p\u003e\n\u003cp\u003eReally disgusting. Just absolutely awful.\u003c/p\u003e\n\u003cdiv class=\"footnotes\" role=\"doc-endnotes\"\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli id=\"fn:1\"\u003e\n\u003cp\u003e\u003ca\n\thref=\"/assets/archives/nyu.edu-hacked.warc\"\n\t\n\t\u003e\n\tArchive\n\u003c/a\u003e, \u003ca\n\thref=\"/assets/archives/nyu.edu-hacked.pdf\"\n\t\n\t\u003e\n\tPDF\n\u003c/a\u003e and \u003ca\n\thref=\"/assets/archives/nyu.edu-hacked.html\"\n\t\n\t\u003e\n\tRaw HTML\n\u003c/a\u003e\u0026#160;\u003ca href=\"#fnref:1\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n","date_modified":"2025-03-22T12:10:25-04:00","date_published":"2025-03-22T12:10:25-04:00","id":"https://degruchy.org/2025/03/22/nyu-website-hacked-and-defaced/","title":"NYU Website Hacked and Defaced","url":"https://degruchy.org/2025/03/22/nyu-website-hacked-and-defaced/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eSo, I see a lot of software out there that replaces the functionality of any\nrange of built-in, or existing services. Programs like \u003ca\n\thref=\"https://culturedcode.com/things/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://culturedcode.com/things/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tThings\n\u003c/a\u003e, or\n\u003ca\n\thref=\"https://evernote.com\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://evernote.com\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tEvernote\n\u003c/a\u003e and the plethora of $50 mArKdOwN eDiToRs like \u003ca\n\thref=\"https://bear.app/#price\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://bear.app/#price\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tBear\n\u003c/a\u003e and\n\u003ca\n\thref=\"https://ia.net/writer\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://ia.net/writer\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tiAWriter\n\u003c/a\u003e\u003csup id=\"fnref:1\"\u003e\u003ca href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e1\u003c/a\u003e\u003c/sup\u003e. They do their thing well, but what they \u003cem\u003edon\u0026rsquo;t\u003c/em\u003e do is actually\nintegrate into services I already \u003cem\u003ehave\u003c/em\u003e. This is a huge problem because if I\nwere to buy your software, I would also be tied into using your platform for\nsync and storage and whatever-fucking-else-you\u0026rsquo;re-siphoning-from-me. I don\u0026rsquo;t\nwant that.\u003c/p\u003e\n\u003cp\u003eWhat I \u003cem\u003ewant\u003c/em\u003e from you is this:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYour cool-ass app.\u003c/li\u003e\n\u003cli\u003eSync with my existing infrastructure, \u003cem\u003eif I have it\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eOffer me your sync-magic-fairy-fucking-bullshit-snake-oil platform that lets\nyou bilk me for more money a month.\u003c/li\u003e\n\u003cli\u003eCan I get a one-time-purchase?\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThat\u0026rsquo;s it. I don\u0026rsquo;t want to pay 50-fucking-dollars to buy the otherwise excellent\nsoftware, only to find out that it doesn\u0026rsquo;t work with my existing Office 365 Tasks\nlist \u003cem\u003eor\u003c/em\u003e my iCloud Tasks list. No, I \u003ca\n\thref=\"https://culturedcode.com/things/support/articles/2803586/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://culturedcode.com/things/support/articles/2803586/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tdon\u0026rsquo;t want to host my meager task list on\nyour big impressive cloud service\n\u003c/a\u003e when I already fucking have one that works\nfine. I would \u003cem\u003elike\u003c/em\u003e it if you just integrated with \u003cem\u003ethat\u003c/em\u003e so I can maybe use it\nelsewhere where I might not have your app installed.\u003c/p\u003e\n\u003ch2 id=\"bbut-your-system-doesnt-support-x-feature\"\u003eB..but your system doesn\u0026rsquo;t support X fEaTuRe\u003c/h2\u003e\n\u003cp\u003eThen work with the company to maybe expand support, or maybe don\u0026rsquo;t use those\nfeatures, or maybe just fucking tell your users about it? I mean, it\u0026rsquo;s not hard.\nYour beautiful, bespoke, artisanally crafted sync serivce is just another\nservice I have to worry about, create a new username and password for and\nultimately ship my shit off to so you can mine it for data. I have enough of\nthose problems \u003cem\u003eas-is\u003c/em\u003e. I don\u0026rsquo;t need another-fucking-one.\u003c/p\u003e\n\u003cp\u003eListen, I get it. You worked \u003cem\u003ehard\u003c/em\u003e on this app, and maybe the existing services\n\u003cem\u003edon\u0026rsquo;t\u003c/em\u003e support all the features you\u0026rsquo;ve packed in there, but don\u0026rsquo;t be a \u003cem\u003edick\u003c/em\u003e\nand make me sign up for your shitty SaaS. Let me know some features won\u0026rsquo;t work.\nI mean, you don\u0026rsquo;t \u003cem\u003ehave\u003c/em\u003e to. Your choice. I\u0026rsquo;m just asking.\u003c/p\u003e\n\u003ch2 id=\"then-dont-use-our-software\"\u003eThen don\u0026rsquo;t use our software!\u003c/h2\u003e\n\u003cp\u003eDone. The problem I have is that there is a plethora of well reviewed, well\nliked software that I am \u003cem\u003einterested\u003c/em\u003e in, but ultimately disuaded from because\nof this stupid Not Invented Here Syndrome bullshit of having to have your own\nservice for every-fucking-thing. I want to have data on my own service. I don\u0026rsquo;t\nneed your shit. I\u0026rsquo;m looking at \u003cem\u003eyou\u003c/em\u003e \u003ca\n\thref=\"https://flexibits.com/account/faq\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://flexibits.com/account/faq\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tFantastical\n\u003c/a\u003e. I shouldn\u0026rsquo;t have to give\nyou my account information to your sErViCe so that you can slurp it up (and mine\nit) just so you can regurgitate it in your special way. Standards exist for a\nreason. Use them.\u003c/p\u003e\n\u003cp\u003eThese sins are even more egregious on macOS because: THE👏. SYSTEM👏. DOES👏.\nTHE👏. HARD👏. WORK👏. FOR👏. YOU👏.\u003c/p\u003e\n\u003cp\u003eNeed access to the calendar? Boop, API for it. Need to do cool shit with email?\nBoop. Use the fucking API. Want to organize and deduplicate my contacts?\n\u003cem\u003eA.P.I.\u003c/em\u003e. But nooooooo it\u0026rsquo;s not enough. You need to have raw access to my\nservices so you can add your special magic whatever. Fuck you, use APIs or talk\nto the service on your own. It\u0026rsquo;s not that hard. You\u0026rsquo;re doing it anyway with your\nfucking bullshit service.\u003c/p\u003e\n\u003cp\u003eIn fact, software \u003cem\u003eused\u003c/em\u003e to do it the hard way. Because that\u0026rsquo;s all we had. You\n\u003cem\u003ehad\u003c/em\u003e to know LDAP, IMAP, POP3 and other stupid acronyms because there wasn\u0026rsquo;t a\nconcept of sharing in the OS. Now there is. Use it.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t even \u003cem\u003ewant\u003c/em\u003e to get into the whole software rental scheme that is so\nprevelant today.\u003c/p\u003e\n\u003cp\u003eFuck!\u003c/p\u003e\n\u003cdiv class=\"footnotes\" role=\"doc-endnotes\"\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli id=\"fn:1\"\u003e\n\u003cp\u003ewtf: \u0026ldquo;iA Writer experienced nearly a decade of free updates, so you might get lucky—or not.\u0026rdquo;\u0026#160;\u003ca href=\"#fnref:1\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n","date_modified":"2025-03-20T16:49:25-04:00","date_published":"2025-03-20T16:49:25-04:00","id":"https://degruchy.org/2025/03/20/things-i-want-from-your-software/","title":"Things I want from your software","url":"https://degruchy.org/2025/03/20/things-i-want-from-your-software/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eHaving not been able to use some of the Handoff and sharing features of macOS in\nthe past ~10 years, it comes as a \u003cem\u003ebit\u003c/em\u003e of a surprise that you can use your iPad\nas a second monitor by just placing it off to the side of the laptop and moving\nyour mouse over there. You can also use the iPhone Mirroring tool to literally\nconnect to your phone and operate it remotely. This is all incredilby\nimpressive, though I\u0026rsquo;m sure there is a down side vis-a-vie security, but to just\nplay with it? It\u0026rsquo;s cool.\u003c/p\u003e\n\u003cp\u003eI wonder what other features I\u0026rsquo;ve missed in that time\u0026hellip;\u003c/p\u003e\n","date_modified":"2025-03-19T22:02:25-04:00","date_published":"2025-03-19T22:02:25-04:00","id":"https://degruchy.org/2025/03/19/using-your-ipad-from-your-laptop-and-your-iphone-too/","title":"Using your iPad from Your Laptop, and your iPhone, too!","url":"https://degruchy.org/2025/03/19/using-your-ipad-from-your-laptop-and-your-iphone-too/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eThis is \u003ca\n\thref=\"https://www.theguardian.com/us-news/2025/mar/19/canadian-detained-us-immigration-jasmine-mooney\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.theguardian.com/us-news/2025/mar/19/canadian-detained-us-immigration-jasmine-mooney\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tdisgusting, dehumanizing and absolutely unacceptable\n\u003c/a\u003e\u003csup id=\"fnref:1\"\u003e\u003ca href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e1\u003c/a\u003e\u003c/sup\u003e.\u003c/p\u003e\n\u003cdiv class=\"footnotes\" role=\"doc-endnotes\"\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli id=\"fn:1\"\u003e\n\u003cp\u003e\u003ca\n\thref=\"/assets/archives/theguardian.com-canadian-ice.warc\"\n\t\n\t\u003e\n\tArchive\n\u003c/a\u003e\u0026#160;\u003ca href=\"#fnref:1\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n","date_modified":"2025-03-19T08:32:00-04:00","date_published":"2025-03-19T08:32:00-04:00","id":"https://degruchy.org/2025/03/19/canadian-gets-detained-by-ice/","title":"🤢 Canadian gets Detained by ICE","url":"https://degruchy.org/2025/03/19/canadian-gets-detained-by-ice/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eSo, lately,  I\u0026rsquo;ve been  doing a lot  of personal work  on a  new macOS\ndevice. While  I really love  the hardware,  the software feels  a bit\nforegin to me. The  last time I actually \u003cem\u003eused\u003c/em\u003e macOS  was back in the\n10.7.x days, and while I have access  to a modern Mac at work, I don\u0026rsquo;t\nreally \u003cem\u003euse\u003c/em\u003e  it for  much other  than work stuff.  Plus much  of it\u0026rsquo;s\nlocked down or disabled.\u003c/p\u003e\n\u003cp\u003eBeing on Linux for so long has gotten me used to absolutely amazing\nutilities and features that you kind of have to cobble together on\nmacOS to get the same effect. I\u0026rsquo;m missing pretty much \u003cem\u003eall\u003c/em\u003e of the\nGNU userland utilities, installable through Homebrew. I\u0026rsquo;m missing a\ngood Logitech configuration tool that doesn\u0026rsquo;t cost \u0026gt;$20, and I feel\nlike things are intentionally hidden from me. Requiring me to do more\nwork.\u003c/p\u003e\n\u003cp\u003eThat being said, the UI components are actually well done, consistent\nthroughout the OS and generally a joy to use. The integration with\niOS and iPadOS is \u003cem\u003egreat\u003c/em\u003e and I can still do much of what I was doing\non the Linux command-line with some modifications and extra steps.\nI\u0026rsquo;m well aware that it shouldn\u0026rsquo;t require this much effort, but I did\nalso have to cobble together my Debian laptop, too.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not about to get rid of my venerable Linux laptop. It\u0026rsquo;s a\nwhip-smart and fast device. However with the \u003ca\n\thref=\"/wishlist/\"\n\t\n\t\u003e\n\tkeys being faulty and\nthe battery life sinking\n\u003c/a\u003e, it may be taking a back seat\nfor a while. After all, I\u0026rsquo;m not entirely in love with the Apple\nsystem as it stands. It has certain advantages over the Linux\nenvironment, but it\u0026rsquo;s hard to give up that control, too.\u003c/p\u003e\n\u003cp\u003eDo you have a story about moving from Linux to macOS or Windows and\nwhat you liked/disliked?\u003c/p\u003e\n","date_modified":"2025-03-18T15:54:00-04:00","date_published":"2025-03-18T15:54:00-04:00","id":"https://degruchy.org/2025/03/18/back-on-macos/","title":"Back on macOS","url":"https://degruchy.org/2025/03/18/back-on-macos/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI added a bit of polish to the site that was sorely lacking when I\nmigrated it over. I\u0026rsquo;m still working out the kinks and may change some\nof it, but it\u0026rsquo;s over all much more organized and easier to maintain.\u003c/p\u003e\n\u003cp\u003eOne of the biggest changes is that the menu is now \u003ca\n\thref=\"/menu/\"\n\t\n\t\u003e\n\tat it\u0026rsquo;s own\npage\n\u003c/a\u003e. The previous one was difficult to wrangle and I had to do a\nbunch of JS hacks to make it not frustrating to work on desktop\nbrowsers. Having its own page gives the menu room to grow, not only in\nlength, but in depth, too. I cribbed \u003ca\n\thref=\"https://blog.jim-nielsen.com/2025/lots-of-little-html-pages/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://blog.jim-nielsen.com/2025/lots-of-little-html-pages/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tsome ideas from Jim Nielsen\n\u003c/a\u003e,\nwhere he just has a separate page for his menu, and uses CSS\nTransitions to make it feel less janky. Of course, this \u003ca\n\thref=\"https://caniuse.com/mdn-css_at-rules_view-transition\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://caniuse.com/mdn-css_at-rules_view-transition\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tonly really\nworks well\n\u003c/a\u003e in \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Chromium_%28web_browser%29\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Chromium_%28web_browser%29\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tChromium-based browsers\n\u003c/a\u003e. However, my pages are\nsmall enough that the load time is negligible when\nclicking. Regardless, I set the page to transition with the \u003ccode\u003eauto\u003c/code\u003e\nmethod, which is apparently some sort of fade-in-out mechanism on\nChromium.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve also rid myself of jQuery, which means many of the little details\nlike time-ago and gallery lightboxes aren\u0026rsquo;t working. I\u0026rsquo;ll figure\nsomething out there. There are plenty of JS mechanisms for that with\nonly a minor search, it appears.\u003c/p\u003e\n\u003cp\u003eLet me know what you think!\u003c/p\u003e\n","date_modified":"2025-03-14T17:02:22-04:00","date_published":"2025-03-14T17:02:22-04:00","id":"https://degruchy.org/2025/03/14/site-updates/","title":"Site Updates","url":"https://degruchy.org/2025/03/14/site-updates/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\n\u003ca href=\"https://www.politico.com/news/2025/03/11/rfk-food-companies-hhs-maha-00224006\"\u003eFrom Politico\u003c/a\u003e. I have no problems with banning some additives. We have\nfar too many in our foods, many of them don\u0026#39;t actually \u003cem\u003edo\u003c/em\u003e\nanything. I am also in favor of reducing the amount of ultra-processed\nfoods that get released.\u003c/p\u003e\n\u003cp\u003e\nI don\u0026#39;t like Kennedy. I don\u0026#39;t like his policies on vaccination, on\ndisease safety and just his politics and associations in\ngeneral. However, I am willing to admit where he is \u003cem\u003eright\u003c/em\u003e. Food\nadditives and ultra-processed food is a danger to the public. Sugar\n(and it\u0026#39;s sweeter alternatives, like high-fructose corn syrup) \u003ca href=\"https://pubmed.ncbi.nlm.nih.gov/23719144/\"\u003ecan\nactually be more addictive than cocaine\u003c/a\u003e. Reducing the public\u0026#39;s\ndependence on this is not only a win for healthier foods, but it\u0026#39;s a\nwin for healthier people in general.\u003c/p\u003e\n\u003cp\u003e\n\u003cstrong\u003eEdit:\u003c/strong\u003e \u003ca href=\"https://www.thedailybeast.com/rfk-jr-it-would-be-better-if-everybody-got-measles/\"\u003eAaaaannnndddddd he went and opened his mouth again\u003c/a\u003e.\u003c/p\u003e\n","date_modified":"2025-03-12T15:29:55-04:00","date_published":"2025-03-12T15:29:55-04:00","id":"https://degruchy.org/2025/03/12/kennedy-wants-to-ban-food-additives/","title":"Kennedy wants to Ban Food Additives","url":"https://degruchy.org/2025/03/12/kennedy-wants-to-ban-food-additives/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\n\u003cp\u003e\nSo, for my \u003ca href=\"/wishlist/\"\u003ewishlist\u003c/a\u003e, I kept trying to find a way link to\n\u003ca href=\"https://camelcamelcamel.com/\"\u003eCamelCamelCamel\u003c/a\u003e (henceforth \u0026#34;🐫🐫🐫\u0026#34;) if the store was Amazon. I\nthought of adding another field to the wishlist \u003ccode class=\"verbatim\"\u003eJSON\u003c/code\u003e file, but that\nadds more work for me. If I get the correct URL, I could probably just\nslice up the link and make one that works for 🐫🐫🐫.\u003c/p\u003e\n\u003cdiv id=\"outline-container-headline-1\" class=\"outline-3\"\u003e\n\u003ch3 id=\"headline-1\"\u003e\nCut to the \u003cdel\u003eChase\u003c/del\u003e Product ID\n\u003c/h3\u003e\n\u003cdiv id=\"outline-text-headline-1\" class=\"outline-text-3\"\u003e\n\u003cp\u003e\nIt \u003cem\u003eappears\u003c/em\u003e that the, \u003ca href=\"https://en.wikipedia.org/wiki/Canonical_link_element\"\u003ecanonical\u003c/a\u003e URL format for Amazon links is in\nthe form of \u003ccode class=\"verbatim\"\u003ehttps://amazon.com/dp/1234567890\u003c/code\u003e. Which means the last\n~10 characters are the product ID. Similarly, 🐫🐫🐫 uses that in their\nlink structure: \u003ccode class=\"verbatim\"\u003ehttps://camelcamelcamel.com/product/1234567890\u003c/code\u003e. Hmm.\u003c/p\u003e\n\u003cdiv class=\"src src-html\"\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {{- if strings.Contains .store \u0026#34;Amazon\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {{     $prod := substr .url -10 -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {{     $cccL := printf \u0026#34;https://camelcamelcamel.com/product/%s\u0026#34; $prod -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;camels\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Check the price history on CamelCamelCamel\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ $cccL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;nofollow\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;_blank\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e🐫🐫🐫\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {{ end -}}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cp\u003e\nEt voila!\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv id=\"outline-container-headline-2\" class=\"outline-3\"\u003e\n\u003ch3 id=\"headline-2\"\u003e\nLipstick for That Camel\n\u003c/h3\u003e\n\u003cdiv id=\"outline-text-headline-2\" class=\"outline-text-3\"\u003e\n\u003cp\u003e\nNow, just style it up real fancy:\u003c/p\u003e\n\u003cdiv class=\"src src-css\"\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-css\" data-lang=\"css\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e#\u003c/span\u003e\u003cspan class=\"nn\"\u003ewishlist\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecamels\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eblock\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003efont-size\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ex-large\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003emargin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.8\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003etext-decoration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eunderline\u003c/span\u003e \u003cspan class=\"kc\"\u003edashed\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mh\"\u003e#CCC\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003etext-underline-position\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eunder\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cp\u003e\nNow they get fancy price history links. And I can stop pestering them\nto make sure they get a good deal by checking for such things. 🎉\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv id=\"outline-container-headline-3\" class=\"outline-3\"\u003e\n\u003ch3 id=\"headline-3\"\u003e\nEditor\u0026#39;s Notes\n\u003c/h3\u003e\n\u003cdiv id=\"outline-text-headline-3\" class=\"outline-text-3\"\u003e\n\u003cp\u003e\nCould I have done this, possibly, with an API request or some other\nfancier lookup that isn\u0026#39;t so fragile? Yeah. I could. I also don\u0026#39;t\ncare.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n","date_modified":"2025-03-12T14:26:45-04:00","date_published":"2025-03-12T14:26:45-04:00","id":"https://degruchy.org/2025/03/12/camel-camel-camel-elion/","title":"Camel Camel Camel-elion","url":"https://degruchy.org/2025/03/12/camel-camel-camel-elion/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eLately, I\u0026rsquo;ve been watching with dread as my modest\u003csup id=\"fnref:1\"\u003e\u003ca href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e1\u003c/a\u003e\u003c/sup\u003e Hetzner server\nhas been going up in price, month-over-month. I don\u0026rsquo;t run much on\nthere. I\u0026rsquo;m always below the 1TB of monthly bandwidth quotas and\nbesides backups, I\u0026rsquo;m just not seeing what I\u0026rsquo;m getting for $11.27\n(€10.29) a month.\u003c/p\u003e\n\u003cp\u003eIt started earlier this year when my bill came in at $9.82, which I\nfelt was semi-reasonable. Less than $10 is not really a breaking point\nfor me. However, it crept up. Next month was $9.88 again, a sort of\nrounding error in price difference. However, this month jumped to\n$11.27, and I can\u0026rsquo;t seem to figure out why. The server is hosted here\nin the US, which I understand there are\u0026hellip; reasons\u0026hellip; for price hikes\nhere, but $1.29 increase for changing nothing? That\u0026rsquo;s not cool.\u003c/p\u003e\n\u003cp\u003eDigging into it, it seems like the rate of the CPX11 instance jumped\nfrom €0.0063 per hour to €0.0072 per hour. This means that it went\nfrom €3.85 per month, to €4.49 per month, which then increases the\nbackup costs of 20% of the final cost per month in kind.\u003c/p\u003e\n\u003cp\u003eHetzner has been a \u003cem\u003every good\u003c/em\u003e host. I\u0026rsquo;ve had little to no problems\nwith their service and would recommend them to anyone looking for a\nquick and easy way to get a VPS started. However, for me, I may be\ngoing back to hosting on my little Raspberry Pi 3b, or saving up for a\nRPi5 and hosting on that via VPN or CloudFlare tunnels. I don\u0026rsquo;t like\nthat idea, but I also don\u0026rsquo;t like having to pony up more for the same\namount of service.\u003c/p\u003e\n\u003cp\u003eDamn I hate this year.\u003c/p\u003e\n\u003cdiv class=\"footnotes\" role=\"doc-endnotes\"\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli id=\"fn:1\"\u003e\n\u003cp\u003e2GB RAM, 2 vCPU 40GB of Storage + 100GB Volume\u0026#160;\u003ca href=\"#fnref:1\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n","date_modified":"2025-03-12T08:58:32-04:00","date_published":"2025-03-12T08:58:32-04:00","id":"https://degruchy.org/2025/03/12/hetzner-is-getting-expensive/","title":"Hetzner is Getting Expensive","url":"https://degruchy.org/2025/03/12/hetzner-is-getting-expensive/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI\u0026rsquo;ve been watching the \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Severance_%28TV_series%29\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Severance_%28TV_series%29\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tApple TV program, \u003cem\u003eSeverance\u003c/em\u003e\n\u003c/a\u003e. In a\nnutshell, it\u0026rsquo;s about employees who have opted to accept a medical\nprocedure that creates a work personality that is only \u0026lsquo;awake\u0026rsquo; while\nat work, remembering nothing of their personal lives and their\npersonal persona knowing nothing about what they do at work. I find\nthis show absolutely captivating. Not only is the acting and staging\ngreat, but the camera work is top-notch. However\u0026hellip;\u003c/p\u003e\n\u003cp\u003eI find that \u003cem\u003eSeverance\u003c/em\u003e hits too close to home in corporate\nenvironments. The sinister smiling, the infantile treating of\nemployees and the willful ignorance to the conditions and well-being\nof the employees. They\u0026rsquo;re all too real. Often, I wonder if having a\n\u0026ldquo;severed\u0026rdquo; personality would be useful to me. I \u003cem\u003eknow\u003c/em\u003e that it creates\nfar more problems than it solves, but damn if I wouldn\u0026rsquo;t want to\nforget the 8-hour-morass of work that leaves me no better than I was\ngoing into it.\u003c/p\u003e\n\u003cp\u003eI hate everything. No, I don\u0026rsquo;t \u003cem\u003ehate\u003c/em\u003e. I just don\u0026rsquo;t care.\u003c/p\u003e\n","date_modified":"2025-03-11T09:13:53-04:00","date_published":"2025-03-11T09:13:53-04:00","id":"https://degruchy.org/2025/03/11/severance-is-far-too-real-for-me/","title":"Severance is far too Real for Me","url":"https://degruchy.org/2025/03/11/severance-is-far-too-real-for-me/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI just played \u003ca\n\thref=\"https://dreamwarps.com/games/what-did-you-get-done-this-week-d6dcfd15-3c6c-4e6a-9eaa-5f1cb7069559\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://dreamwarps.com/games/what-did-you-get-done-this-week-d6dcfd15-3c6c-4e6a-9eaa-5f1cb7069559\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\ta silly web-based, LLM-run, text-adventure about trying\nnot to get fired from X\n\u003c/a\u003e. Based on the stories of Musk dragging\npeople into chats or receiving emails from them, demanding to know\nwhat they\u0026rsquo;re doing, and how it\u0026rsquo;s going to make a difference at X.\u003c/p\u003e\n\u003cp\u003eIf you can hold down the nausea, stroking Elon\u0026rsquo;s ego and bootlicking\nis easy-mode to victory. Though I didn\u0026rsquo;t hit whatever 100% is supposed\nto get you.\u003c/p\u003e\n\u003cul class=\"idksomethingincredible gallery\" rel=\"page\"\u003e\u003cli\u003e\n        \u003ca href=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_1.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_1_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_1_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_1_tn.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_1_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_1_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_2.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_2_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_2_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_2_tn.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_2_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_2_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_3.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_3_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_3_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_3_tn.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_3_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_3_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_4.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_4_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_4_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_4_tn.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_4_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_4_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_5.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_5_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_5_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_5_tn.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_5_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_5_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_6.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_6_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_6_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_6_tn.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_6_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_6_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_7.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_7_tn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_7_tn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_7_tn.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_7_tn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/10/when-dealing-with-big-egos-flattery-wins/musk-x-boondongle_7_tn.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003c/ul\u003e\n\n\u003cstyle\u003e\n\t@layer post\n\t{\n\t\t.gallery\n\t\t{\n\t\t\talign-content: space-evenly;\n\t\t\tbackground-color: var(--theme-color-alt-background);\n\t\t\tborder: 3px solid var(--theme-color-border);\n\t\t\tborder-radius: 10px;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: center;\n\t\t\tpadding: 0;\n\n\t\t\tli\n\t\t\t{\n\t\t\t\tlist-style-type: none;\n\t\t\t}\n\n\t\t\ta\n\t\t\t{\n\t\t\tcolor: var(--theme-color-alt-foreground);\n\t\t\t}\n\n\t\t\tfigcaption\n\t\t\t{\n\t\t\t\theight: 1.4rem;\n\t\t\t\tmax-width: 128px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\ttext-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n\u003c/style\u003e\n\n\u003cp\u003eHere\u0026rsquo;s a transcript for those who don\u0026rsquo;t want to read a bunch of\nscreenshots:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eElon M:\u003c/strong\u003e Ah, finally. You\u0026rsquo;re here. I don\u0026rsquo;t have all day to waste on small\ntalk, so let\u0026rsquo;s get straight to it. What have you done this week\nthat\u0026rsquo;s going to change the world? Or, at the very least, not get you\nfired?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI implemented a new ranking algorithm to help boost Mr. Musk\u0026rsquo;s\neffective visibility in all feeds and timelines.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eElon M:\u003c/strong\u003e A new ranking algorithm, huh? That sounds like something a bunch of\nacademia types would come up with. How many more Twitter followers\ndid I get because of it? Give me numbers, not theories.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOn average, you will see roughly 30,000 new followers week over\nweek. Higher, if you say something seen as controversial.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eClaire B.:\u003c/strong\u003e  Controversy as a metric for success? Isn\u0026rsquo;t that just\nplaying into the algorithmic echo chamber? Are we disrupting the\nstatus quo or just Noise-farming for the sake of numbers?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe algorithm filters out a lot of the noise feedback from unhappy\nusers and amplifies true-believer followers. Mr. Musk\u0026rsquo;s followers\ncan also earn on-platform rewards (avatar stickers, frames, etc)\nfor getting other users to follow.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eDave L.:\u003c/strong\u003e Hold up, rewards for followers? That sounds like a\ncostly endeavor. How do you plan to offset the expense of\nthese\u0026hellip; avatar stickers and frames? Are we looking at a significant\ndent in our profit margins?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUnlikely. The art is generated from Grok.ai, Mr. Musk\u0026rsquo;s amazing AI\nplatform. We also source images, memes and the like from his\ntrue-believer followers. There is language in the ToS and EULA to\nallow for this content sharing. Of course, everything is initially\nvetted by a small team of dedicated workers to ensure it follows\nbrand and Mr. Musk\u0026rsquo;s aesthetic.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eElon M:\u003c/strong\u003e Grok.ai, my baby, being used to generate art for the\nmasses. I like it. But let\u0026rsquo;s not get too comfortable. How do you\nplan to monetize this engagement? Are we talking premium stickers,\nexclusive frames, or perhaps a whole new line of merchandise?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe stickers and frames have a small pool of \u0026lsquo;free\u0026rsquo; items. We use a\nsystem similar to the popular \u0026lsquo;Gacha\u0026rsquo;-style games by providing\nhigher-tier, premium items either through sufficient engagement or\na pay-for-unlock system that allows users to sort of \u0026lsquo;skip\u0026rsquo; the\nengagement portion by buying items directly. This could also\ndovetail with, as Mr. Musk so correctly points out, into a\nreal-world merchandising opportunity.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eElon M:\u003c/strong\u003e I love it! A digital storefront with premium items, and\na real-world merchandising arm to boot. But here\u0026rsquo;s the thing: I\ndon\u0026rsquo;t just want to dip our toes in the water, I want to make a\nsplash. How are you going to scale this to millions of users, and\nmake it a billion-dollar revenue stream?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA very apt question! There are a couple of avenues we can take. One\nthat I find particularly interesting is using the sticker/frame\nsystem in concert with a NFT-style blockchain. This would allow for\nultra-exclusivity for particular virtual items (along with higher\nprices), and allow for offloading of some of the compute to our\nusers. There is also another path using BitTorrent/WebTorrent to\nhelp offset bandwidth for distributing sticker assets (encrypted,\nof course). Both of these methods would soften the blow of a\nlarge-scale ramp up.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eElon M:\u003c/strong\u003e I like the creativity, but let\u0026rsquo;s cut to the chase. We\u0026rsquo;ve\ngot a power outage, and our systems are going dark. Sell me on this\nidea, right now, in the dark. No slides, no spreadsheets, just you\nand your words. Can you convince me this is the future, without any\nof the tech crutches?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eX is the future, if I may be so bold, Mr. Musk. Using this platform\nto spin off similar ventures into banking, identity management,\ngaming and more are all possible using similar techniques. With\neach venture, the shared platform and improvements therein are not\nonly able to save X money in hosting and serving, but also enable X\nto provide services in new \u003cem\u003eand\u003c/em\u003e existing markets faster and more\nefficiently.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eElon M:\u003c/strong\u003e I like the ambition, but I need to see more than just a\ngrand vision. How do you plan to protect our users\u0026rsquo; identities and\nfinancial information in this expanded ecosystem? We can\u0026rsquo;t afford to\nhave a security breach or a scandal that undermines the entire\noperation. Convince me you\u0026rsquo;ve thought this through.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOf course. The tools provided here allow not only private\ntransactions on the blockchain, they also are set-in-stone proof of\ntransactions as they happen. Any \u0026rsquo;theft\u0026rsquo; would be like trying to\nsteal a million grains of sand in hopes of rebuilding a\nseashell. Users identities would, of course, be tied to their\nexisting X account, but for a fee, could have private transactions\nthat only the sending and receiving party would know anything\ninteresting about.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eElon M:\u003c/strong\u003e I\u0026rsquo;m starting to like what I\u0026rsquo;m hearing. You\u0026rsquo;ve got a\nsolid vision, and you\u0026rsquo;re thinking about the security and privacy\naspects. Now, let\u0026rsquo;s talk turkey. What\u0026rsquo;s the timeline for launching\nthis platform, and what kind of resources are we talking about? I\nwant to see a rough estimate of the costs, and a plan for how we\u0026rsquo;re\ngoing to make this thing profitable. Can you give me that?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYes, Mr. Musk. Much of the groundwork for all of this is already\navailable in either off-the-shelf tooling, or freely available\napplications and source-code. Many of these tools are already well\nknown by developers. Implementing this platform would require\nmostly developers, however the use of Grok.ai would probably be\nable supplant many of those, too. I would ballpark the start up\ncost for this as $5-million USD. This would go to infrastructure\nand associated startup costs. We already have subsidized costs in\ndata-centers and Grok.ai, so the initial outlay may actually be\nless than that.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eElon M:\u003c/strong\u003e $5 million, that\u0026rsquo;s a drop in the bucket compared to the\npotential return. I like the way you think, using existing tools and\nGrok.ai to reduce costs. You\u0026rsquo;ve done your homework, and I appreciate\nthat. Now, here\u0026rsquo;s the million-dollar question: are you ready to lead\nthis project, to make it happen, and to make it a success?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOf course, Mr. Musk. I\u0026rsquo;d be happy to direct this under your\nvision. When would you like me to begin?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eElon M:\u003c/strong\u003e Excellent! I like your enthusiasm. Let\u0026rsquo;s get started\nimmediately. I want you to assemble a team, and begin working on the\nplatform. I\u0026rsquo;ll give you the resources you need, and I expect regular\nupdates on your progress. You\u0026rsquo;ve got a lot of work ahead of you, but\nI think you\u0026rsquo;re up to the task. Let\u0026rsquo;s make this happen, and change\nthe world!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOf course, I\u0026rsquo;ll assemble a group of engineers and designers to get\nthe initial framework started. I\u0026rsquo;ll make sure you get regular\nfeedback. Would weekly work? I am tremendously honored that you\u0026rsquo;ve\nentrusted me with carrying out this task. I look forward to\ndelighting you in the future.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eElon M:\u003c/strong\u003e Weekly updates sound perfect. I\u0026rsquo;m looking forward to\nseeing the progress you\u0026rsquo;ll make. You\u0026rsquo;ve convinced me that you\u0026rsquo;re the\nright person for this task, and I\u0026rsquo;m excited to see the\nresults. Let\u0026rsquo;s make this happen, and create something\nrevolutionary. You\u0026rsquo;re dismissed, go make it happen!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThank you, sir!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eElon M:\u003c/strong\u003e Good luck, and don\u0026rsquo;t disappoint me. You\u0026rsquo;re on the path\nto changing the world. Now, get out there and make it happen!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cem\u003eThe meeting is over, and you\u0026rsquo;ve emerged victorious. You\u0026rsquo;ve persuaded\nElon Musk to back your project, and you\u0026rsquo;re one step closer to\nrevolutionizing the world. Congratulations!\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eFlattery gets you everywhere.\u003c/p\u003e\n","date_modified":"2025-03-10T13:25:42-04:00","date_published":"2025-03-10T13:25:42-04:00","id":"https://degruchy.org/2025/03/10/when-dealing-with-big-egos-flattery-wins/","title":"When Dealing with Big Egos, Flattery Wins","url":"https://degruchy.org/2025/03/10/when-dealing-with-big-egos-flattery-wins/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI know I\u0026rsquo;m a bit late in posting this news, but I\u0026rsquo;ve been playing\nquite a bit of C\u0026amp;C via Steam (it\u0026rsquo;s on sale). The source code for many\nof the games that appear in the remastered collection \u003ca\n\thref=\"https://github.com/electronicarts/CnC_Red_Alert\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://github.com/electronicarts/CnC_Red_Alert\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tare now\navailable\n\u003c/a\u003e!\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\n\thref=\"https://github.com/electronicarts/CnC_Renegade\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://github.com/electronicarts/CnC_Renegade\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tRenegade\n\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\n\thref=\"https://github.com/electronicarts/CnC_Generals_Zero_Hour\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://github.com/electronicarts/CnC_Generals_Zero_Hour\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tGenerals (+Zero Hour)\n\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\n\thref=\"https://github.com/electronicarts/CnC_Tiberian_Dawn\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://github.com/electronicarts/CnC_Tiberian_Dawn\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tTiberian Dawn\n\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\n\thref=\"https://github.com/electronicarts/CnC_Remastered_Collection\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://github.com/electronicarts/CnC_Remastered_Collection\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tRemastered Collection\n\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\n\thref=\"https://github.com/electronicarts/CNC_TS_and_RA2_Mission_Editor\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://github.com/electronicarts/CNC_TS_and_RA2_Mission_Editor\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tMission Editor\n\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\n\thref=\"https://github.com/electronicarts/CnC_Modding_Support\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://github.com/electronicarts/CnC_Modding_Support\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tModding support\n\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThis will be a great help to \u003ca\n\thref=\"https://github.com/OpenRA/OpenRA\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://github.com/OpenRA/OpenRA\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tOpenRA\n\u003c/a\u003e, I\u0026rsquo;m sure. \u003ca\n\thref=\"https://www.theverge.com/news/621397/command-conquer-open-source-ea-red-alert-renegade-generals\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.theverge.com/news/621397/command-conquer-open-source-ea-red-alert-renegade-generals\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tNews about\nthe release\n\u003c/a\u003e.\u003c/p\u003e\n","date_modified":"2025-03-06T08:25:23-05:00","date_published":"2025-03-06T08:25:23-05:00","id":"https://degruchy.org/2025/03/06/many-command-conquer-games-open-sourced/","title":"Many Command \u0026 Conquer Games Open Sourced","url":"https://degruchy.org/2025/03/06/many-command-conquer-games-open-sourced/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/03/04/yes-the-party-of-free-speech-indeed/truth-social.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/04/yes-the-party-of-free-speech-indeed/truth-social.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/04/yes-the-party-of-free-speech-indeed/truth-social.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/04/yes-the-party-of-free-speech-indeed/truth-social.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/04/yes-the-party-of-free-speech-indeed/truth-social.jpg\"\n             alt=\"A screenshot of a Truth Social post by Donald Trump\"\u003e\n    \u003c/picture\u003e\u003cfigcaption\u003e\n            \u003cp\u003eYes, the \u003ca\n\thref=\"https://www.thefire.org/news/republican-platform-calls-free-speech-campus\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.thefire.org/news/republican-platform-calls-free-speech-campus\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tParty of Free Speech\n\u003c/a\u003e and morals, indeed.\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eQuoted for those who can\u0026rsquo;t see images\u003csup id=\"fnref:1\"\u003e\u003ca href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e1\u003c/a\u003e\u003c/sup\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAll Federal Funding will STOP for any College, School, or University\nthat allows illegal protests. Agitators will be imprisoned/or\npermanently sent back to the country from which they came. American\nstudents will be permanently expelled or, depending on on the crime,\narrested. NO MASKS! Thank you for your attention to this matter.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca\n\thref=\"https://truthsocial.com/@realDonaldTrump/posts/114104167452161158\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://truthsocial.com/@realDonaldTrump/posts/114104167452161158\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tLink \u0026ndash; WARNING: Truth Social URL\n\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eSpeaking of protests, the one that sparked a huge outpouring of rage\nand the BLM movement, \u003ca\n\thref=\"https://www.rawstory.com/derek-chauvin-2671265779/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.rawstory.com/derek-chauvin-2671265779/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tmight be getting a bit more\ncontentious\n\u003c/a\u003e\u003csup id=\"fnref:2\"\u003e\u003ca href=\"#fn:2\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e2\u003c/a\u003e\u003c/sup\u003e.\u003c/p\u003e\n\u003cdiv class=\"footnotes\" role=\"doc-endnotes\"\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli id=\"fn:1\"\u003e\n\u003cp\u003e\u003ca\n\thref=\"/assets/archives/truthsocial.com-trump-no-protests.warc\"\n\t\n\t\u003e\n\tFor the archivists\n\u003c/a\u003e.\u0026#160;\u003ca href=\"#fnref:1\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli id=\"fn:2\"\u003e\n\u003cp\u003e\u003ca\n\thref=\"/assets/archives/rawstory.com-derek-chauvin.warc\"\n\t\n\t\u003e\n\tArchive link\n\u003c/a\u003e.\u0026#160;\u003ca href=\"#fnref:2\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n","date_modified":"2025-03-04T20:32:37Z","date_published":"2025-03-04T20:32:37Z","id":"https://degruchy.org/2025/03/04/yes-the-party-of-free-speech-indeed/","title":"Yes, the \"Party of Free Speech\" Indeed","url":"https://degruchy.org/2025/03/04/yes-the-party-of-free-speech-indeed/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eApparently, there is a company named Mitsubishi with the \u003cem\u003eexact\u003c/em\u003e three-diamond logo as the car company.\u003c/p\u003e\n\u003cp\u003eActually, \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Mitsubishi_%28disambiguation%29\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Mitsubishi_%28disambiguation%29\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tthere are a \u003cem\u003elot\u003c/em\u003e of companies named Mitsubishi\n\u003c/a\u003e in Japan. The one I\u0026rsquo;m talking about actually \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Uni-ball\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Uni-ball\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\ttrades internationally as \u0026lsquo;Uni\u0026rsquo;\n\u003c/a\u003e. You know, the absolutely awesome Uni-ball pens? Yeah, they\u0026rsquo;ve made pencils for \u003cem\u003ehundreds of years\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eAs a matter of fact, they had \u003ca\n\thref=\"https://notes.stlartsupply.com/the-golden-age-of-japanese-pencils-1952-1967/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://notes.stlartsupply.com/the-golden-age-of-japanese-pencils-1952-1967/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tquite a rivalry\n\u003c/a\u003e (\u003ca\n\thref=\"https://degruchy.org/bookmarks/archives/stlartsupply.com-golden-age-pencil.warc\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://degruchy.org/bookmarks/archives/stlartsupply.com-golden-age-pencil.warc\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tarchive\n\u003c/a\u003e) in Japan with \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Tombow\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Tombow\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tTombow\n\u003c/a\u003e, making amazing stationary and writing tools of all shapes and sizes.\u003c/p\u003e\n\u003cp\u003eIn researching all of this, I fell down a \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Wiki_rabbit_hole\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Wiki_rabbit_hole\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\twikihole\n\u003c/a\u003e and learned that \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Lamy\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Lamy\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tMitsubishi, as of 2024, owns Lamy\n\u003c/a\u003e. Lamy is one of my favorite pen companies. I own several of their excellent fountain pens. I also learned that they have a \u003ca\n\thref=\"https://www.lamy.com/en-us/p/lamy-nexx-harry-potter-fountain-pen/50946380988750\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.lamy.com/en-us/p/lamy-nexx-harry-potter-fountain-pen/50946380988750\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tnew limited edition set of fountain pens for Harry Potter fans\n\u003c/a\u003e (🤤) \u003cem\u003eand\u003c/em\u003e they \u003ca\n\thref=\"https://www.lamy.com/en-us/digital-writing/for-apple\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.lamy.com/en-us/digital-writing/for-apple\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tmake iPad compatible pens that look like Lamy Safari\u0026rsquo;s\n\u003c/a\u003e!\u003c/p\u003e\n\u003cdiv class=\"large\"\u003e🤯\u003c/div\u003e\n\n","date_modified":"2025-03-03T19:53:15Z","date_published":"2025-03-03T19:53:15Z","id":"https://degruchy.org/2025/03/03/til-mitsubishi-is-actually-several-distinct-companies-from-japan/","title":"TIL: Mitsubishi is Actually Several Distinct Companies from Japan","url":"https://degruchy.org/2025/03/03/til-mitsubishi-is-actually-several-distinct-companies-from-japan/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eWhile I have little love for either JavaScript or Oracle, I find it odd that \u003ca\n\thref=\"https://en.wikipedia.org/wiki/JavaScript#Trademark\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/JavaScript#Trademark\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tOracle somehow wound up with the JavaScript trademark\n\u003c/a\u003e. I am, however, completely unsurprised that they haven\u0026rsquo;t given it up, despite doing nominally nothing \u003cem\u003ewith\u003c/em\u003e it. I guess \u003ca\n\thref=\"https://en.wikipedia.org/wiki/ECMAScript\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/ECMAScript\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tECMAScript\n\u003c/a\u003e is probably the \u003cem\u003epreferred\u003c/em\u003e name, despite it sounding like a boring design-by-committee language.\u003c/p\u003e\n\u003cp\u003eNothing about JavaScript (or \u003cem\u003e\u003ca\n\thref=\"https://www.destroyallsoftware.com/talks/the-birth-and-death-of-javascript\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.destroyallsoftware.com/talks/the-birth-and-death-of-javascript\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tYavascript\n\u003c/a\u003e\u003c/em\u003e) should surprise me, though. \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Brendan_Eich#Netscape\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Brendan_Eich#Netscape\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tGiven the short window in which it was developed\n\u003c/a\u003e. The fact that it was \u003cem\u003esupposed\u003c/em\u003e to be \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Scheme_%28programming_language%29\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Scheme_%28programming_language%29\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tScheme\n\u003c/a\u003e and the fact that it was renamed (internally) from Mocha, to LiveScript to finally JavaScript because Sun (at the time) was riding high on the popularity of Java and it seemed like a good idea to crib off of them.\u003c/p\u003e\n\u003cp\u003eYeah, makes me want to write more \u003cem\u003e(yuck)\u003c/em\u003e ECMAScript.\u003c/p\u003e\n","date_modified":"2025-03-03T18:35:21Z","date_published":"2025-03-03T18:35:21Z","id":"https://degruchy.org/2025/03/03/til-javascript-is-a-trademark-of-oracle/","title":"TIL: JavaScript is a Trademark of Oracle","url":"https://degruchy.org/2025/03/03/til-javascript-is-a-trademark-of-oracle/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/03/01/hot-dog/costco.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/03/01/hot-dog/costco.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/03/01/hot-dog/costco.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/03/01/hot-dog/costco.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/03/01/hot-dog/costco.jpg\"\n             alt=\"A picture of a Costco membership card front\" width=\"640\" height=\"416\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003cp\u003eI can now purchase \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Costco_hot_dog\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Costco_hot_dog\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\t$1.50 hot dogs and drinks\n\u003c/a\u003e to my heart\u0026rsquo;s content! No one can stop me!\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eIt was alright. I didn\u0026rsquo;t buy any hot dogs. We got the membership because of a\ncar repair deal that comes with it. Dunno how useful it\u0026rsquo;ll be over say, BJ\u0026rsquo;s.\u003c/p\u003e\n","date_modified":"2025-03-01T17:18:39-05:00","date_published":"2025-03-01T17:18:39-05:00","id":"https://degruchy.org/2025/03/01/hot-dog/","title":"Hot Dog!","url":"https://degruchy.org/2025/03/01/hot-dog/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eThe more I delve into \u003ca\n\thref=\"https://sqlite.org/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://sqlite.org/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tSQLite\n\u003c/a\u003e, \u003ca\n\thref=\"https://fossil-scm.org/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://fossil-scm.org/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tFossil-SCM\n\u003c/a\u003e, the more I\nfind interesting and impressive. \u003ca\n\thref=\"https://pikchr.org/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://pikchr.org/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tThe latest thing I\ndiscovered\n\u003c/a\u003e is that SQLite, and by extension Fossil, have a\nformat for generating diagrams called \u0026lsquo;Pikchr\u0026rsquo;, which is a plain-text\nformat designed to export \u003ca\n\thref=\"https://en.wikipedia.org/wiki/SVG\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/SVG\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tSVG\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eNot only that, but it\u0026rsquo;s designed to be embedded in \u003ca\n\thref=\"https://daringfireball.net/projects/markdown/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://daringfireball.net/projects/markdown/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tmarkdown\n\u003c/a\u003e, as\na code-fence block, that would then be rendered either \u003ca\n\thref=\"https://code.degruchy.org/file?name=content/posts/2025-02-26_take-a-pikchr/network.pikchr\u0026amp;ci=tip\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://code.degruchy.org/file?name=content/posts/2025-02-26_take-a-pikchr/network.pikchr\u0026amp;ci=tip\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tby the\nserver\n\u003c/a\u003e, or in JS \u003ca\n\thref=\"https://pikchr.org/home/pikchrshow\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://pikchr.org/home/pikchrshow\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tas they do on their site\n\u003c/a\u003e. It\u0026rsquo;s\nreally neat! The language takes a bit of wrapping your head around,\nbut it turns out \u003ca\n\thref=\"network.pikchr\"\n\t\n\t\u003e\n\tit\u0026rsquo;s not so bad\n\u003c/a\u003e:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pikchr\" data-lang=\"pikchr\"\u003edown\nInternet: circle \u0026#34;Internet\u0026#34;; move\nRouter: box \u0026#34;Router\u0026#34;\nTailscale: ellipse \u0026#34;Tailscale\u0026#34; at 2cm right of Router.right\nMullvad: circle \u0026#34;Mullvad\u0026#34; \u0026#34;VPN\u0026#34; at 2cm right of Internet.right fit\nServer: box \u0026#34;Server\u0026#34; at 2cm left of Internet.left\narc \u0026lt;-\u0026gt; from Server.s to Internet.s color blue \u0026#34;Tailscale\u0026#34; small small aligned \u0026#34;Tunnel\u0026#34; small small aligned\narrow \u0026lt;-\u0026gt; color blue to Tailscale.top \u0026#34;Tailscale\u0026#34; small small aligned \u0026#34;Tunnel\u0026#34; small small aligned\narrow \u0026lt;-\u0026gt; from Internet.s to Router.n\n\nClients: [\n  right\n  Client1: oval \u0026#34;Client1\u0026#34; fit; move\n  Client2: oval \u0026#34;Client2\u0026#34; fit; move\n  Client3: oval \u0026#34;Client3\u0026#34; fit; move\n  Client4: diamond \u0026#34;Printer\u0026#34; fit;\n] at 2cm below Router.s\n\ndown\n\nNetwork: box thin width Clients.width+1cm height Clients.height+1cm at Clients.center\nCaption: text \u0026#34;Local Network\u0026#34; italic with .n at 0.1cm below Network.s\n\narrow \u0026lt;-\u0026gt; color blue from Network.n to Tailscale.s \u0026#34;Tailscale/Wireguard\u0026#34; aligned small \u0026#34;Tunnel\u0026#34; aligned small\narrow \u0026lt;-\u0026gt; color blue from Tailscale.n to Mullvad.s \u0026#34;Wireguard\u0026#34; aligned small small \u0026#34;Tunnel\u0026#34; aligned small small\narrow \u0026lt;-\u0026gt; color grey from Mullvad.left to Internet.right\narrow \u0026lt;-\u0026gt; color grey from Internet.left to Server.right\narrow \u0026lt;-\u0026gt; from Router.s to Network.n\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRenders:\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/02/26/take-a-pikchr-itll-last-longer/network.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/02/26/take-a-pikchr-itll-last-longer/network.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/02/26/take-a-pikchr-itll-last-longer/network.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/02/26/take-a-pikchr-itll-last-longer/network.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/02/26/take-a-pikchr-itll-last-longer/network.jpg\"\n             alt=\"A representation of a `pikchr` script\" width=\"600\" height=\"446\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:600px;\"\u003e\n            \u003cp\u003eA simple network, rendered and converted from SVG\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eI know someone \u003ca\n\thref=\"https://github.com/gopikchr/gopikchr\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://github.com/gopikchr/gopikchr\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tconverted the pikchr language to Go\n\u003c/a\u003e, so it\u0026rsquo;s\n\u003cem\u003epossible\u003c/em\u003e that it could be included in Hugo in some lofty goal in the\nfuture. However, for now, we\u0026rsquo;ll have to just do it manually. There\u0026rsquo;s\nother hope in the form of a \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Lua_%28programming_language%29\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Lua_%28programming_language%29\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tLua\n\u003c/a\u003e \u003ca\n\thref=\"https://pandoc.org/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://pandoc.org/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\t\u003ccode\u003epandoc\u003c/code\u003e\n\u003c/a\u003e \u003ca\n\thref=\"https://code.jboy.space/pikchr-filter/doc/trunk/README.md\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://code.jboy.space/pikchr-filter/doc/trunk/README.md\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tfilter that will\nconvert it to an SVG for you\n\u003c/a\u003e.\u003c/p\u003e\n","date_modified":"2025-02-26T18:31:26-05:00","date_published":"2025-02-26T18:31:26-05:00","id":"https://degruchy.org/2025/02/26/take-a-pikchr-itll-last-longer/","title":"Take a Pikchr, It'll Last Longer","url":"https://degruchy.org/2025/02/26/take-a-pikchr-itll-last-longer/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eJesus-fucking-Christ.\u003c/p\u003e\n\u003cvideo  controls preload=\"auto\" width=\"100%\"  playsinline class=\"\"\u003e\n    \u003csource src=\"/2025/02/25/what-the-fuck-are-we-doing-with-ai/wtf-ai.webm\" type=\"video/webm\"\u003e\n    \u003csource src=\"/2025/02/25/what-the-fuck-are-we-doing-with-ai/wtf-ai.ogv\" type=\"video/ogg\"\u003e\n    \u003csource src=\"/2025/02/25/what-the-fuck-are-we-doing-with-ai/wtf-ai.mp4\" type=\"video/mp4\"\u003e\n  \u003cspan\u003e\u003c/span\u003e\n\u003c/video\u003e\n\u003cp\u003eIn addition to the creepiness factor of having AI tools watch and\ngrade your work performance while working in, ostensibly,\n\u003cem\u003esweatshop\u003c/em\u003e-like conditions, \u003ca\n\thref=\"https://www.404media.co/email/b7eb2339-2ea1-4a37-96cc-a360494c214c/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.404media.co/email/b7eb2339-2ea1-4a37-96cc-a360494c214c/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\thaving your boss have real-time analytics\non this interaction is horrifying\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe above video is pretty fucking awful, too. What are we doing to\neach other? Why do we \u003cem\u003etreat\u003c/em\u003e each other this way? Oh, right, all to\n\u003ca\n\thref=\"https://youtu.be/I-yLk8SZAJY?feature=shared\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://youtu.be/I-yLk8SZAJY?feature=shared\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tmake hinges faster\n\u003c/a\u003e (\u003cem\u003ewarning:\u003c/em\u003e YouTube link, Holocaust).\u003c/p\u003e\n\u003cp\u003e\u0026#x1f92e;\u003c/p\u003e\n\u003cp\u003eOh, lets also not forget that they \u003ca\n\thref=\"https://www.youtube.com/watch?v=J1ejAucYL0w\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.youtube.com/watch?v=J1ejAucYL0w\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\ttest vape units in China. By\nMouth\n\u003c/a\u003e (\u003cem\u003ewarning:\u003c/em\u003e YouTube link).\u003c/p\u003e\n","date_modified":"2025-02-25T13:29:27-05:00","date_published":"2025-02-25T13:29:27-05:00","id":"https://degruchy.org/2025/02/25/what-the-fuck-are-we-doing-with-ai/","title":"What the Fuck are We Doing with AI?","url":"https://degruchy.org/2025/02/25/what-the-fuck-are-we-doing-with-ai/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\nYay, my favorite editor has reached milestone version 30.1, with \u003ca href=\"https://www.masteringemacs.org/article/whats-new-in-emacs-301\"\u003ea\nslew of new features and performance enhancements\u003c/a\u003e. While I\u0026#39;m still on\n28.2, I\u0026#39;m glad to see how many bugs get squashed and new features get\nrefined.\u003c/p\u003e\n\u003cp\u003e\nGreat release. Can\u0026#39;t wait to try it. Right now even the \u003ccode\u003egit\u003c/code\u003e\nrepository is being hugged to death.\u003c/p\u003e\n\u003cdiv class=\"src src-shell\"\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e[\u003c/span\u003eJ0\u003cspan class=\"o\"\u003e][\u003c/span\u003eE0\u003cspan class=\"o\"\u003e]\u003c/span\u003e emacs $\u0026gt; git pull\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  fatal: unable to access \u003cspan class=\"s1\"\u003e\u0026#39;https://git.savannah.gnu.org/git/emacs.git/\u0026#39;\u003c/span\u003e: Failed to connect to git.savannah.gnu.org port \u003cspan class=\"m\"\u003e443\u003c/span\u003e after \u003cspan class=\"m\"\u003e130654\u003c/span\u003e ms: Couldn\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003et connect to server\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n","date_modified":"2025-02-24T09:35:14-05:00","date_published":"2025-02-24T09:35:14-05:00","id":"https://degruchy.org/2025/02/24/emacs-30.1-released/","title":"Emacs 30.1 Released!","url":"https://degruchy.org/2025/02/24/emacs-30.1-released/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI love a lot of \u003ca\n\thref=\"https://ffm.bio/anthonyvincent\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://ffm.bio/anthonyvincent\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tAnthony\u0026rsquo;s music\n\u003c/a\u003e, but this one nails the style of Queen\n\u003cem\u003eso well\u003c/em\u003e that I can\u0026rsquo;t help but listen to it on repeat. I know the\nElvis version is special for a lot of people, but it\u0026rsquo;s made \u003cem\u003eso much\nbetter\u003c/em\u003e when made in Queen\u0026rsquo;s iconic style.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://music.apple.com/us/album/cant-help-falling-in-love-in-the-style-of-queen-single/1795976639\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/02/20/anthony-vincent-i-cant-help-falling-in-love-in-the-style-of-queen/anthony-vincent-cover.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/02/20/anthony-vincent-i-cant-help-falling-in-love-in-the-style-of-queen/anthony-vincent-cover.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/02/20/anthony-vincent-i-cant-help-falling-in-love-in-the-style-of-queen/anthony-vincent-cover.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/02/20/anthony-vincent-i-cant-help-falling-in-love-in-the-style-of-queen/anthony-vincent-cover.jpg\"\n             alt=\"Cover art from the single from Anthony Vincent\" width=\"316\" height=\"316\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:316px;\"\u003e\n            \u003cp\u003eAnthony Vincent - \u003cem\u003eCan\u0026rsquo;t Help Falling in Love\u003c/em\u003e (in the style of Queen)\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n","date_modified":"2025-02-20T11:41:17-05:00","date_published":"2025-02-20T11:41:17-05:00","id":"https://degruchy.org/2025/02/20/anthony-vincent-i-cant-help-falling-in-love-in-the-style-of-queen/","title":"Anthony Vincent - I Can't Help Falling in Love (in the style of Queen)","url":"https://degruchy.org/2025/02/20/anthony-vincent-i-cant-help-falling-in-love-in-the-style-of-queen/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eWhen I say those words. I know it\u0026rsquo;s time to contact my therapist. I\nknow there is a lot of emotional fatigue going around with the whole\nTrump thing, but I feel tired on a different level. I mean, I suffer\nfrom Depression, but there is also just family life and problems that\ncome up to drag me down.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been repeating the title a lot recently. Time for another\nappointment.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eEdit:\u003c/strong\u003e I just got a call back from my prescription\nprovider. They\u0026rsquo;re not covering my Wegovy prescription anymore, so the\nprice I paid (retail ~$1300 USD) is the price I\u0026rsquo;m going to pay until\nmy next dose, which is higher and more expensive. Fuck this.\u003c/p\u003e\n","date_modified":"2025-02-20T11:02:50-05:00","date_published":"2025-02-20T11:02:50-05:00","id":"https://degruchy.org/2025/02/20/i-wish-i-cared/","title":"I Wish I Cared","url":"https://degruchy.org/2025/02/20/i-wish-i-cared/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\u003ca\n\thref=\"https://web.archive.org/web/20250217180159/https://andysblog.uk/blogging-for-traffic-not-design/#expand\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://web.archive.org/web/20250217180159/https://andysblog.uk/blogging-for-traffic-not-design/#expand\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tBlogging for traffic, not design\n\u003c/a\u003e. Via \u003ca\n\thref=\"https://kevquirk.com/notes/20250218-2106\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://kevquirk.com/notes/20250218-2106\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tkev\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eEdit:\u003c/strong\u003e He took down 😂. Archive linked.\u003c/p\u003e\n\u003cvideo poster=\"laughing-hysterically.gif\" preload=\"auto\" width=\"100%\" height=\"316\" autoplay loop muted poster=\"/2025/02/18/lol/laughing-hysterically.gif\" playsinline class=\"\"\u003e\n    \u003csource src=\"/2025/02/18/lol/laughing-hysterically.webm\" type=\"video/webm\"\u003e\n    \u003csource src=\"/2025/02/18/lol/laughing-hysterically.ogv\" type=\"video/ogg\"\u003e\n    \u003csource src=\"/2025/02/18/lol/laughing-hysterically.mp4\" type=\"video/mp4\"\u003e\n  \u003cspan\u003e\u003c/span\u003e\n\u003c/video\u003e\n\u003cp\u003e🤣 I hope this is a satirical post. Nice way to cap an evening.\u003c/p\u003e\n","date_modified":"2025-02-18T20:33:31-05:00","date_published":"2025-02-18T20:33:31-05:00","id":"https://degruchy.org/2025/02/18/lol/","title":"lol","url":"https://degruchy.org/2025/02/18/lol/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI\u0026rsquo;ve been working on updating some of the data-driven pages on my\nsite, instead of backlogged content. Many of my pages are lists, or\ncontent that is repeated frequently, so I decided to move them into\nHugo\u0026rsquo;s \u003ccode\u003edata\u003c/code\u003e format to make it easier to update. Instead of having to\nwrite awkward HTML for each \u003ca\n\thref=\"/wishlist\"\n\t\n\t\u003e\n\twishlist\n\u003c/a\u003e item, or new\n\u003ca\n\thref=\"/bookmarks\"\n\t\n\t\u003e\n\tbookmark\n\u003c/a\u003e, I can add a stanza of JSON to and then rebuild\nto update. That way I don\u0026rsquo;t have to worry about missing fields,\nimproperly nested tags and all the associated metadata for links and\nthe like.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m also looking at updating the site\u0026rsquo;s style a bit. There is a cool\n\u003ca\n\thref=\"https://uchu.style/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://uchu.style/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tcolor pallet\n\u003c/a\u003e that I\u0026rsquo;d like to try. Given it\u0026rsquo;s similarity to\nthe \u0026ldquo;standard\u0026rdquo; web colors, I don\u0026rsquo;t think it\u0026rsquo;ll be too much of a\nproblem.\u003c/p\u003e\n","date_modified":"2025-02-17T17:18:56-05:00","date_published":"2025-02-17T17:18:56-05:00","id":"https://degruchy.org/2025/02/17/site-updates/","title":"Site Updates","url":"https://degruchy.org/2025/02/17/site-updates/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eValentine\u0026rsquo;s Day was a really special day for us, we got to see \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Alton_Brown\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Alton_Brown\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tAlton\nBrown\n\u003c/a\u003e in his \u003ca\n\thref=\"https://www.altonbrownlive.com/altonbrown\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.altonbrownlive.com/altonbrown\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tfinal(?) live tour\n\u003c/a\u003e! We even got to sample some of the\nfood on stage!\u003c/p\u003e\n\u003cul class=\"alton-brown-final-bite gallery\" rel=\"page\"\u003e\u003cli\u003e\n        \u003ca href=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_1_r.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_1_r_hu_f63e54a3baadcb7b.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_1_r_hu_55f6702d9f8a07a2.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_2_r.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_2_r_hu_66e7cb0e0a1c8e11.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_2_r_hu_aac0f40a36aa3582.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_3_r.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_3_r_hu_fcd5e4b472cbcd85.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_3_r_hu_891d540b22895951.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_4_r.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_4_r_hu_913418429d23f5b1.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_4_r_hu_a002ae4f15fc7cd4.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_5_r.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_5_r_hu_f58ac61cb02ba8ea.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_5_r_hu_66ede841976f8e67.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_6_r.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_6_r_hu_62cd69811e3fdec2.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_6_r_hu_a56488c4cce598f0.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_7_r.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_7_r_hu_f6095375cf53d2b9.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/02/14/alton-browns-final-bite-tour/alton-brown-final-bite_7_r_hu_fec8408202469d0c.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003c/ul\u003e\n\n\u003cstyle\u003e\n\t@layer post\n\t{\n\t\t.gallery\n\t\t{\n\t\t\talign-content: space-evenly;\n\t\t\tbackground-color: var(--theme-color-alt-background);\n\t\t\tborder: 3px solid var(--theme-color-border);\n\t\t\tborder-radius: 10px;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: center;\n\t\t\tpadding: 0;\n\n\t\t\tli\n\t\t\t{\n\t\t\t\tlist-style-type: none;\n\t\t\t}\n\n\t\t\ta\n\t\t\t{\n\t\t\tcolor: var(--theme-color-alt-foreground);\n\t\t\t}\n\n\t\t\tfigcaption\n\t\t\t{\n\t\t\t\theight: 1.4rem;\n\t\t\t\tmax-width: 128px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\ttext-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n\u003c/style\u003e\n\n","date_modified":"2025-02-14T21:00:00-05:00","date_published":"2025-02-14T21:00:00-05:00","id":"https://degruchy.org/2025/02/14/alton-browns-final-bite-tour/","title":"Alton Brown's Final Bite Tour","url":"https://degruchy.org/2025/02/14/alton-browns-final-bite-tour/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eSo, I updated the site. If you noticed your feed updating, that was\nme. The site is being built by \u003ca\n\thref=\"https://gohugo.com\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://gohugo.com\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tHugo\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003ePreviously, I had difficulties understanding how the Go Template\nsystem worked, as well as a sense of dread trying to tackle things\nlike short codes that would be needed to do complicated parts. With\n\u003ca\n\thref=\"https://chatgpt.com/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://chatgpt.com/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tChatGPT\n\u003c/a\u003e an \u003ca\n\thref=\"https://claude.ai/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://claude.ai/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tClaude.ai\n\u003c/a\u003e, I feel more at-ease building out the\nsite in a SSG like Hugo.\u003c/p\u003e\n\u003cp\u003eSo far, I\u0026rsquo;ve been able to replicate galleries, multi-format picture\nelements, and even generate my \u003ca\n\thref=\"/reading/\"\n\t\n\t\u003e\n\treading\n\u003c/a\u003e and \u003ca\n\thref=\"/wishlist/\"\n\t\n\t\u003e\n\twishlist\n\u003c/a\u003e from CSV\nfiles, making updating content easier. While there are still some\nrough edges, the uplift I\u0026rsquo;ve gotten has given me a bit of confidence\nin extending functionality using the tooling in Hugo.\u003c/p\u003e\n\u003cp\u003eYou\u0026rsquo;ll note that I didn\u0026rsquo;t go all the way back to 2022. I was able to\nwork through a month\u0026rsquo;s worth of posts, but more than that will take\ntime. For now, I\u0026rsquo;ve \u003ca\n\thref=\"/old-archive.html\"\n\t\n\t\u003e\n\tuploaded the static HTML page\n\u003c/a\u003e for archival\npurposes.\u003c/p\u003e\n","date_modified":"2025-02-14T17:39:16-05:00","date_published":"2025-02-14T17:39:16-05:00","id":"https://degruchy.org/2025/02/14/yes-its-hugo-again/","title":"Yes, It's Hugo, Again","url":"https://degruchy.org/2025/02/14/yes-its-hugo-again/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\u003ca\n\thref=\"https://arstechnica.com/tech-policy/2025/02/doges-gov-site-lampooned-as-coders-quickly-realize-it-can-be-edited-by-anyone/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://arstechnica.com/tech-policy/2025/02/doges-gov-site-lampooned-as-coders-quickly-realize-it-can-be-edited-by-anyone/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tApparently, security is \u003cem\u003enot\u003c/em\u003e the top priority\n\u003c/a\u003e at the\n\u0026ldquo;temporary\u0026rdquo; organization that has bullied it\u0026rsquo;s way in to all of the\ninformation the Feds have on you. No need to worry. They\u0026rsquo;re posting\neverything on \u003cdel\u003eTwitter\u003c/del\u003e X. You know, because \u003cem\u003ethat\u0026rsquo;s\u003c/em\u003e transparency.\u003c/p\u003e\n\u003cp\u003e🙄\u003c/p\u003e\n","date_modified":"2025-02-14T15:39:19-05:00","date_published":"2025-02-14T15:39:19-05:00","id":"https://degruchy.org/2025/02/14/doge-org-left-their-database-open-to-the-internet/","title":"DOGE Org Left Their Database Open to the Internet","url":"https://degruchy.org/2025/02/14/doge-org-left-their-database-open-to-the-internet/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI had my attention turned to \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Adbusters\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Adbusters\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\ta group that produce a magazine\n\u003c/a\u003e\nknown as \u003ca\n\thref=\"https://www.adbusters.org/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.adbusters.org/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tAdbusters\n\u003c/a\u003e. Anti-captialist and more than a little\nAnti-Trump, it seems like a good fit for my worldview. There\u0026rsquo;s just\none odd problem: They use the \u003cem\u003eshit\u003c/em\u003e out of Google services.\u003c/p\u003e\n\u003cp\u003eThe above the fold, autoplay video is hosted on YouTube. The fonts are\nloaded from Google Fonts. There is Google Analytics embedded in the\npage. They rely on Amazon\u0026rsquo;s CloudFront to host CDN traffic. As I\nscrolled through the page, my uBlock add-in blocked an estimated \u003cem\u003e22%\u003c/em\u003e\nof the requests before they get shipped off to whom? Advertisers. Or,\nat the least, Information Brokers.\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/02/12/adbusters-are-weird/adbusters-tracking.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/02/12/adbusters-are-weird/adbusters-tracking.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/02/12/adbusters-are-weird/adbusters-tracking.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/02/12/adbusters-are-weird/adbusters-tracking.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/02/12/adbusters-are-weird/adbusters-tracking.jpg\"\n             alt=\"A screenshot of uBlock Origin showing numerous tracking links being blocked\" width=\"595\" height=\"640\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:595px;\"\u003e\n            \u003cp\u003eThat\u0026rsquo;s a lot of trackers\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eHow can I trust a group of anti-capitalist, anti-advertising,\ncounter-culture folks that are, themselves, so embedded in the tools\nthat enable that culture?\u003c/p\u003e\n\u003ch3 id=\"more-appalling\"\u003eMore Appalling\u003c/h3\u003e\n\u003cp\u003eIt seems like their downloads page is full things that should\n(probably) be simple postscript files, tiffs or other more open fomats\ninstead of PDFs and Word Docs.\u003c/p\u003e\n\u003ch3 id=\"an-open-letter\"\u003eAn Open Letter\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHello!\u003c/p\u003e\n\u003cp\u003eMy name is Nathan, and I want to start off by saying that I respect\nwhat you do. It\u0026rsquo;s not easy trying to be anti-capitalist and\nanti-advertising along with being anti-whatever-Trump-is. So, keep up\nthe good fight.\u003c/p\u003e\n\u003cp\u003eMy concern, as the subject states, is with your website. It currently\ncontains a litany of connections to some of either the largest\nadvertisers on the planet, or those who service (and therefore\nsurveil) enough of the Internet to make the original inventor of the\nPanopticon blush. This makes it hard, as someone who is tech savvy, to\ntrust what you say without thinking that there is some sort of hidden\nagenda.\u003c/p\u003e\n\u003cp\u003eI get it. It\u0026rsquo;s hard being on the Internet without relying on someone\nelse\u0026rsquo;s tech stack. Even harder if you want to reach people and\nactually get them to see your content. Lord knows I don\u0026rsquo;t get any\nviewership. However, I think there is middle-ground to be had\nhere. We\u0026rsquo;ve long had the ability to self-host sites and tools without\nthe explicit support of the Tech Oligarchs. It\u0026rsquo;s harder, and more\nexpensive, sure. However it\u0026rsquo;s also a small act of defiance that says\nmore about the people doing it, than the act itself.\u003c/p\u003e\n\u003cp\u003eDon\u0026rsquo;t get me wrong. Your publication is yours to run alone. I don\u0026rsquo;t\nknow the back-of-the-store circumstances that keep the machine\nrunning. I know, having worked in magazines before, that often times\nthe website is the lowest priority. It\u0026rsquo;s reasonable to hold the view\nthat journalism and activism (as well as getting enough subscribers)\nare far higher on the list of things to do. I wouldn\u0026rsquo;t change that.\u003c/p\u003e\n\u003cp\u003eI would, however, like you to at least sit down and look at what\nyou\u0026rsquo;ve put together and see if, at some point, you can make your site\nsay what your message says you do. Get rid of the proprietary formats\non the download page, lose the Google tech for visitor metrics, and\nopt-out of CloudFlare and CloudFront\u0026rsquo;s panopticon for delivering\nclosest-hop CDN data. These companies are the ones not just enabling\nthe hyper-capitalistic now, but actively innovating in the space to\nmake it even more inescapable.\u003c/p\u003e\n\u003cp\u003eThank you for your time and consideration.\u003c/p\u003e\n\u003c/blockquote\u003e\n","date_modified":"2025-02-12T00:00:00-05:00","date_published":"2025-02-12T00:00:00-05:00","id":"https://degruchy.org/2025/02/12/adbusters-are-weird/","title":"Adbusters are Weird","url":"https://degruchy.org/2025/02/12/adbusters-are-weird/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\u003ca\n\thref=\"https://www.npr.org/2025/02/07/nx-s1-5288947/trump-dei-disney-pepsi-diversity\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.npr.org/2025/02/07/nx-s1-5288947/trump-dei-disney-pepsi-diversity\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tGM I can believe. But Pepsi and Disney\n\u003c/a\u003e (\u003ca\n\thref=\"/assets/archives/2025-02-11_gm_pepsi_disney_dei_npr.org.warc\"\n\t\n\t\u003e\n\t\u003ccode\u003e.warc\u003c/code\u003e\narchive\n\u003c/a\u003e)? Spineless, the whole lot of \u0026rsquo;em!\u003c/p\u003e\n","date_modified":"2025-02-11T14:09:07-05:00","date_published":"2025-02-11T14:09:07-05:00","id":"https://degruchy.org/2025/02/11/spineless/","title":"Spineless","url":"https://degruchy.org/2025/02/11/spineless/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eSometimes, you don’t need full on (Emacs) \u003cem\u003eBankruptcy\u003c/em\u003e, sometimes you\njust need to…\u003ca\n\thref=\"https://en.wikipedia.org/wiki/Debt_restructuring\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Debt_restructuring\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\trestructure\n\u003c/a\u003e some things in your\nconfig. You know, give those config files \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Debt_restructuring#Bondholder_haircuts\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Debt_restructuring#Bondholder_haircuts\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\ta little\nhaircut\n\u003c/a\u003e.  That’s what I did today.\u003c/p\u003e\n\u003cp\u003eMost of my configuration was well enough coded that I didn’t need any\nreal rejiggering, just some trimming and cleaning up here and there.\nThere were some clear parts that I had started, but never did anything\nwith. I was also curious about some of the mechanisms that I never\nreally explored out of the box. I was also kind of tired of compiling\nEmacs every couple of days to stay on top of the new (bugs). So I had\nsome cleanup to do vis-a-vis going back to Emacs 28.2 in Debian stable.\u003c/p\u003e\n\u003cp\u003eSo far, things are good. The default theme is nice, I also am using GUI\nEmacs for a change (Lucid toolkit). Still mulling over if that’s a wise\nchoice, given my distaste for variable font sizes. We’ll see. I tried\nCUA-mode for a month, I can stomach some font changes for a while.\u003c/p\u003e\n\u003cp\u003eI find the more that I use Emacs, the more that I calcify some options.\nThings like diary, calendar, flyspell and vc-mode over newer stuff like\nOrg or Magit. I’m also willing to try new packages if they’re able to\nimprove my workflow. I keep trying the\nvertico+orderless+corfu+marginalia powerhouse every so often, but I find\nthat it’s just a tad bit too flakey for me. Then I try helm and I’m\noverwhelmed.\u003c/p\u003e\n\u003cp\u003eHopefully this restructuring will let me find some more packages that\nreally hit home and become permenant fixtures of my configuration.\u003c/p\u003e\n","date_modified":"2025-02-11T00:00:00-05:00","date_published":"2025-02-11T00:00:00-05:00","id":"https://degruchy.org/2025/02/11/chapter-28.2-emacs-restructuring/","title":"Chapter 28.2 Emacs Restructuring","url":"https://degruchy.org/2025/02/11/chapter-28.2-emacs-restructuring/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eSometimes, I post things that \u003ca\n\thref=\"#hello\"\n\t\n\t\u003e\n\tmight not be liked by everyone\n\u003c/a\u003e.\nText is easy to hide or \u0026lsquo;spoiler\u0026rsquo;, but images are harder. So I sought\nout a way to make images work like they do on Mastodon\u0026rsquo;s web interface.\u003c/p\u003e\n\u003cp\u003eEnter, this \u003ca\n\thref=\"https://www.abitofaccess.com/image-spoiler-protection\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.abitofaccess.com/image-spoiler-protection\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tneat little CSS technique that uses no JS\n\u003c/a\u003e (\u003ca\n\thref=\"/assets/archives/abitofaccess.com.warc\"\n\t\n\t\u003e\n\tweb archive\nlink\n\u003c/a\u003e). Essentially, it uses a form element (checkbox) and a label to\ntoggle the CSS blur filter on an image. I\u0026rsquo;ve \u003ca\n\thref=\"#20250205-tax-ads\"\n\t\n\t\u003e\n\timplemented it in a previous\npost\n\u003c/a\u003e, one that contains advertising, and since I don\u0026rsquo;t like\nseeing advertising, I\u0026rsquo;ve spoilered it.\u003c/p\u003e\n\u003cp\u003eI did add a bit of JS to the trick. See, because my site is not a\ndiscreet set of pages per post, the state of the page can be remembered\nacross reloads. So I add some simple JS to uncheck all checkboxes on the\npage.\u003c/p\u003e\n\u003ch3 id=\"a-revision-in-the-texts\"\u003eA Revision in the Texts!\u003c/h3\u003e\n\u003cp\u003eSo, yeah, it was kind of janky. Enter 3 lines of jQuery:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;.blurred\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003eeach\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;click\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003etoggleClass\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;blurred\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI\u0026rsquo;ll probably add some text or note to prompt user action.\u003c/p\u003e\n","date_modified":"2025-02-10T16:52:35-05:00","date_published":"2025-02-10T16:52:35-05:00","id":"https://degruchy.org/2025/02/10/despoiling-images/","title":"Despoiling Images","url":"https://degruchy.org/2025/02/10/despoiling-images/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\u003ca\n\thref=\"https://mattgemmell.scot/back-to-mac/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://mattgemmell.scot/back-to-mac/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tBack to Mac\n\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s always fascinating to read about someone\u0026rsquo;s journey in doing\nsomething just outside the norms. For a long time, I\u0026rsquo;ve known that\n\u003cem\u003emost\u003c/em\u003e people can do \u003cem\u003emost\u003c/em\u003e of their tasks on a device as \u0026ldquo;basic\u0026rdquo; as an\niPad with no real friction. For what it\u0026rsquo;s worth, \u003cem\u003eI\u003c/em\u003e could be one of\nthose people. Sure, there are holdouts in the arena of Excel and other\ndata-heavy tasks that still rely on well-honed power tools. For the most\npart, though, people would probably not notice a difference in using an\niPad as a daily driver. Many people already live most of their lives on\ntheir phones. An iPad would probably be a step up for them.\u003c/p\u003e\n\u003cp\u003eThis brave man switched primary machines for an iPad for \u003cem\u003eeight-years\u003c/em\u003e!\nThat\u0026rsquo;s some dedication. While I\u0026rsquo;m not in the market for switching to an\niPad, it does go to show you how much the ecosystem around them has\ngrown. With tooling like Affinity, Notability, Logic and Blackmagic, you\ncan get quite a lot done as someone creating content. A far cry from the\nearly days of being told that it\u0026rsquo;s just a content consumption device. I\nfeel like this article is not just a refutation of needing a \u0026ldquo;full\u0026rdquo;\nlaptop, but a refutation of the idea that we \u003cem\u003eneed\u003c/em\u003e so much hardware\nyear over year to do the same basic tasks.\u003c/p\u003e\n","date_modified":"2025-02-10T12:07:08-05:00","date_published":"2025-02-10T12:07:08-05:00","id":"https://degruchy.org/2025/02/10/link-back-to-mac/","title":"Link: Back to Mac","url":"https://degruchy.org/2025/02/10/link-back-to-mac/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eSometimes you just want to \u003cem\u003epreserve\u003c/em\u003e something. Like a page you\nvisited, or are visiting. Sometimes, the browser is Good Enough™ and\nyou can save it for offline viewing. Sometimes, however, you want some\nlevel of \u003cem\u003earchive\u003c/em\u003e. Thankfully, \u003ca\n\thref=\"https://en.wikipedia.org/wiki/WARC_%28file_format%29\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/WARC_%28file_format%29\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tthere is a standard for\nthat\n\u003c/a\u003e!\u003c/p\u003e\n\u003cp\u003eBut \u003cem\u003ehow\u003c/em\u003e do you actually make one of these so-called \u003ccode\u003e.warc\u003c/code\u003e files?\nWell, thanks to the folks at the GNU Project, \u003ccode\u003ewget\u003c/code\u003e already has it\nbuilt in! You can just use some options to get an archive:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ wget --adjust-extension \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       --execute \u003cspan class=\"nv\"\u003erobots\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eoff \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       --convert-links \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       --no-parent\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       --mirror \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       --warc-file\u003cspan class=\"o\"\u003e=\u003c/span\u003edomainname.com \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       --no-warc-keep-log \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       --page-requisites \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       --no-verbose \u003cspan class=\"s2\"\u003e\u0026#34;https://urlhere.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow, you\u0026rsquo;ll get a folder of files that mirror the page or site, plus\nyou\u0026rsquo;ll get a \u003ccode\u003e.warc\u003c/code\u003e file that contains all of that in a single\ndigestable format suitable for libraries and search engines, neat!\u003c/p\u003e\n","date_modified":"2025-02-10T10:01:48-05:00","date_published":"2025-02-10T10:01:48-05:00","id":"https://degruchy.org/2025/02/10/webarchivn/","title":"Webarchivn'","url":"https://degruchy.org/2025/02/10/webarchivn/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/02/09/tonights-superb-owl/superb-owl.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/02/09/tonights-superb-owl/superb-owl.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/02/09/tonights-superb-owl/superb-owl.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/02/09/tonights-superb-owl/superb-owl.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/02/09/tonights-superb-owl/superb-owl.jpg\"\n             alt=\"An owl wakes up in its cage on a sunny spring day in a park in Essen, western Germany, on March 26, 2014\" width=\"640\" height=\"412\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003cp\u003eAn owl wakes up in its cage on a sunny spring day in a park in Essen, western Germany, on March 26, 2014Martin Meissner/AP\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eHappy Superb Owl Sunday, everyone!\u003c/p\u003e\n","date_modified":"2025-02-09T00:00:00-05:00","date_published":"2025-02-09T00:00:00-05:00","id":"https://degruchy.org/2025/02/09/tonights-superb-owl/","title":"Tonight's Superb Owl","url":"https://degruchy.org/2025/02/09/tonights-superb-owl/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI’ve been \u003ca\n\thref=\"https://chatgpt.com/share/67a5371d-0bec-8000-bb34-0db030efeec2\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://chatgpt.com/share/67a5371d-0bec-8000-bb34-0db030efeec2\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\ttalking a bit with ChatGPT about my site\n\u003c/a\u003e. Mostly\nbecause I struggle with the hows of the site, instead of the \u003cem\u003ewhy\u003c/em\u003e of\nthe site. Rather, I am more focused on the experience of posting than\nposting in of itself. So I reached out to GPT to see what they thought\nof it.\u003c/p\u003e\n\u003cp\u003eI’m pleased to say that they provided a really good answer. My human\nsummary: Is it worth upending what you have working for something that\nmay not be everything you want it to be?\u003c/p\u003e\n\u003cp\u003eThe idea that \u003cem\u003emost\u003c/em\u003e of my pain points are really just me looking at\nwhat \u003cem\u003eother\u003c/em\u003e systems are doing and wondering if \u003cem\u003eI\u003c/em\u003e should do that, too.\nGenerally, the answer is no. I don’t have scads and scads of content.\nThe site, as it sits currently runs ~80kb (~160kb with everything)\nwith brotli compression. It’s not slow. Perhaps it’s not \u003cem\u003eas performant\u003c/em\u003e\nas it could be, but I’ve gone to great lengths to make sure that\neverything that can be lazy loaded \u003cem\u003eis\u003c/em\u003e, to help keep requests to a\nminimum.\u003c/p\u003e\n\u003cp\u003eI also have a bunch of really familiar tooling backing me. The site is\n‘built’ using Emacs, \u003ccode\u003emake\u003c/code\u003e, \u003ccode\u003esed\u003c/code\u003e and \u003ccode\u003ecat\u003c/code\u003e. It’s all launched up to\nthe Internet via \u003ccode\u003ersync\u003c/code\u003e and most of the other work is done by me in the\nshell or Emacs, by hand. That way I know I’ve done it right, or at the\nvery least I know where I screwed up. All of the tools are\nbattle-tested. The biggest issue I had, in retrospect is that writing\nHTML directly in the \u003ccode\u003eindex.html\u003c/code\u003e file was killing my thought process,\nand therefore canceling posts before I got anywhere. Even with things\nlike \u003ccode\u003eyasnippet\u003c/code\u003e, \u003ccode\u003eweb-mode\u003c/code\u003e and \u003ccode\u003eemmet\u003c/code\u003e making it easy to generate\nscaffolding and templates.\u003c/p\u003e\n\u003cp\u003eFor that, I came to the conclusion of just having a folder that doesn’t\nget uploaded called ‘drafts’. I write in markdown or org-mode and use\n\u003ccode\u003epandoc\u003c/code\u003e to generate the markup needed. Writing in this way frees me\nfrom having to think \u003cem\u003etoo much\u003c/em\u003e about the structure and boring parts. As\na bonus, I can still include HTML in these formats that gets passed\nthrough. So I can just tweak \u003ccode\u003eyasnippet\u003c/code\u003e to provide the same templates\nfor Markdown mode, and when I type \u003ccode\u003edogal\u003c/code\u003e, it expands to the same\ngallery skeleton as it would in \u003ccode\u003eweb-mode\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eI’m thankful that I can just bounce ideas off of someone or something\nlike ChatGPT, because often this kind of ‘rubber-ducky’ problem solving\nis what is needed, instead of a bunch of opinions on what the best\nplatform is.\u003c/p\u003e\n\u003cp\u003eSo, here I stay. While it’s not the best blogging system. It’s \u003cem\u003emine\u003c/em\u003e.\nAnd I know how it works, and I control it from start to end. And that’s\nimportant to me.\u003c/p\u003e\n","date_modified":"2025-02-06T17:23:38-05:00","date_published":"2025-02-06T17:23:38-05:00","id":"https://degruchy.org/2025/02/06/conversations-with-gpt/","title":"Conversations with GPT","url":"https://degruchy.org/2025/02/06/conversations-with-gpt/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\n","date_modified":"2025-02-05T15:34:22-05:00","date_published":"2025-02-05T15:34:22-05:00","id":"https://degruchy.org/2025/02/05/looks-at-current-us-political-climate/","title":"*Looks at current US Political Climate*","url":"https://degruchy.org/2025/02/05/looks-at-current-us-political-climate/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure class=\"blurred\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/02/05/tax-ads/tax-ads.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/02/05/tax-ads/tax-ads.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/02/05/tax-ads/tax-ads.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/02/05/tax-ads/tax-ads.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/02/05/tax-ads/tax-ads.jpg\"\n             alt=\"A picture of some advertising included with my tax documentation\" width=\"640\" height=\"564\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003cp\u003eA picture of some advertising included with my tax documentation\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eHave we reached peak ads yet? Because I\u0026rsquo;m getting them in my federal\ntax documentation, now.\u003c/p\u003e\n","date_modified":"2025-02-05T15:46:45Z","date_published":"2025-02-05T15:46:45Z","id":"https://degruchy.org/2025/02/05/tax-ads/","title":"Tax Ads","url":"https://degruchy.org/2025/02/05/tax-ads/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\u003ca\n\thref=\"https://www.ifixit.com/News/107532/what-happens-to-your-gifts-after-you-return-them\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.ifixit.com/News/107532/what-happens-to-your-gifts-after-you-return-them\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tiFixit: What Happens To Your Gifts After You Return Them?\n\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMostly? Recycled, but also \u003cem\u003ea lot of\u003c/em\u003e \u003cstrong\u003etrash\u003c/strong\u003e. We can do better, but\nwe have to \u003cem\u003emake\u003c/em\u003e companies produce easy-to-repair products, first.\u003c/p\u003e\n","date_modified":"2025-02-05T09:50:57-05:00","date_published":"2025-02-05T09:50:57-05:00","id":"https://degruchy.org/2025/02/05/link-what-happens-to-your-gifts-after-you-return-them/","title":"Link: What Happens to Your Gifts After You Return Them?","url":"https://degruchy.org/2025/02/05/link-what-happens-to-your-gifts-after-you-return-them/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eSo, my preferred dentist was bought out by a much larger conglomerate\nand things are changing in ways I didn\u0026rsquo;t like. So, I took the\nopportunity to shop around, and found one closer to work. It was even\npainless to get setup as a new patient.\u003c/p\u003e\n\u003cp\u003eOnce I was all done getting entered in the system, I called my old\ndentist to cancel my appointment, and to get my records. What they sent\nme was surprising.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e2 \u003ccode\u003e.png\u003c/code\u003e\u0026rsquo;s of my teeth x-rays, taken as screenshots from the\ndesktop (UI chrome and all)\u003c/li\u003e\n\u003cli\u003eA sideways, blurry, hastily scanned pdf of my procedures and the\nvarious prices\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePutting aside the fact that they just sent this over email, and that the\ndata is lossy, \u003cem\u003eat best\u003c/em\u003e, it\u0026rsquo;s still kind of shitty to just hand over\nyour customer\u0026rsquo;s data in the worst possible formats for transfer. No\n\u003ccode\u003e.tiff\u003c/code\u003e or any medically approved image format for my x-rays? No \u003ccode\u003e.csv\u003c/code\u003e\nor any journal format for my procedures? It feels like amateur hour\nhere.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eEdit:\u003c/strong\u003e I\u0026rsquo;m \u003ca\n\thref=\"https://en.wikipedia.org/wiki/DICOM\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/DICOM\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\trequesting \u003ccode\u003eDICOM\u003c/code\u003e formatted images\n\u003c/a\u003e and an\nactual ledger. It also turns out that \u003ca\n\thref=\"https://packages.debian.org/sid/dicomscope\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://packages.debian.org/sid/dicomscope\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tDebian has a suite\n\u003c/a\u003e of\n\u003ca\n\thref=\"https://packages.debian.org/bookworm/dicom3tools\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://packages.debian.org/bookworm/dicom3tools\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tDICOM tools\n\u003c/a\u003e, so not only can I get my records, I can also\nview them.\u003c/p\u003e\n\u003cp\u003eStonewalled:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNo, we do not, this is how we send our x-rays. We use a different\nsoftware than most other practices.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e🙄\u003c/p\u003e\n\u003cp\u003eLets see if the \u003ca\n\thref=\"https://www.carestreamdental.com/en-us/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.carestreamdental.com/en-us/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tdevelopers behind their software\n\u003c/a\u003e are any more responsive.\u003c/p\u003e\n","date_modified":"2025-02-04T13:07:37-05:00","date_published":"2025-02-04T13:07:37-05:00","id":"https://degruchy.org/2025/02/04/pain-in-the-teeth/","title":"Pain in the Teeth","url":"https://degruchy.org/2025/02/04/pain-in-the-teeth/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\u003ca\n\thref=\"https://rknight.me/blog/music-questions-challenge/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://rknight.me/blog/music-questions-challenge/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tRobb Knight\n\u003c/a\u003e posted about some of his favorite music, so I\ndecided that even though I’m not ‘tagged’ anywhere, I’d do it myself\nbecause sometimes it’s nice to get a better picture of the blogger.\u003c/p\u003e\n\u003ch3 id=\"what-are-five-of-your-favourite-albums\"\u003eWhat are five of your favourite albums?\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cem\u003e\u003ca\n\thref=\"https://en.wikipedia.org/wiki/Long_Division_%28Rustic_Overtones_album%29\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Long_Division_%28Rustic_Overtones_album%29\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tLong Division\n\u003c/a\u003e\u003c/em\u003e by \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Rustic_Overtones\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Rustic_Overtones\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tRustic Overtones\n\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eOK Computer\u003c/em\u003e by Radiohead\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eDookie\u003c/em\u003e by Green Day\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eCowboy Bebop OST\u003c/em\u003e by \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Seatbelts_%28band%29\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Seatbelts_%28band%29\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tSeatbelts\n\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eMellon Collie and the Infinite Sadness\u003c/em\u003e by The Smashing Pumpkins\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"what-are-five-of-your-favourite-songs\"\u003eWhat are five of your favourite songs?\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cem\u003eIron Boots\u003c/em\u003e by Rustic Overtones\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eHow to Disappear Completely\u003c/em\u003e by Radiohead\u003c/li\u003e\n\u003cli\u003e\u003cem\u003ePanic Song\u003c/em\u003e by Green Day\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eBasket Case\u003c/em\u003e by Green Day\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e1979\u003c/em\u003e by The Smashing Pumpkins\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"favourite-instruments\"\u003eFavourite instrument(s)?\u003c/h3\u003e\n\u003cp\u003eI can’t play anything on any instrument. If I had to make a choice\nfrom what I’ve seen played, then the guitar or bass. Both are cool\nlooking and usually have a great sound associated with them.\u003c/p\u003e\n\u003ch3 id=\"what-song-or-album-are-you-currently-listening-to\"\u003eWhat song or album are you currently listening to?\u003c/h3\u003e\n\u003cp\u003e\u003cem\u003eAnthems for a Seventeen Year-Old Girl\u003c/em\u003e by Broken Social Scene\u003c/p\u003e\n\u003ch3 id=\"do-you-listen-to-the-radio-if-so-how-often\"\u003eDo you listen to the radio? If so, how often?\u003c/h3\u003e\n\u003cp\u003eI do, occasionally, though I dislike most of it. I tend to listen to\n‘Easy listening’ or similar because most of the newer stuff is all\nforeign to me.\u003c/p\u003e\n\u003ch3 id=\"how-often-do-you-listen-to-music\"\u003eHow often do you listen to music?\u003c/h3\u003e\n\u003cp\u003eI \u003cem\u003etry\u003c/em\u003e to listen everyday, but honestly probably a couple of times a\nweek. I’ve had long stints where I didn’t listen to anything. I’m\ntrying to change that, because music can make time go faster, and\nchange moods.\u003c/p\u003e\n\u003ch3 id=\"how-often-do-you-discover-music-and-how-do-you-discover-music\"\u003eHow often do you discover music? And how do you discover music?\u003c/h3\u003e\n\u003cp\u003eNot often. I usually play the Apple Music radio station “For you” and\nif something there comes up that I like, I favorite it. I also\noccasionally browse \u003ca\n\thref=\"https://bandcamp.com/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://bandcamp.com/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tBandcamp\n\u003c/a\u003e to see if there is anything I\nlike. I’ve found that as I get older, the less I seek out new music.\u003c/p\u003e\n\u003ch3 id=\"whats-a-song-or-album-that-you-enjoy-that-you-wish-had-more-recognition\"\u003eWhat’s a song or album that you enjoy that you wish had more recognition?\u003c/h3\u003e\n\u003cp\u003ePretty much anything by Rustic Overtones. They’re a band from Maine with\nan amazing sound that I wish got more coverage. I don’t think they’re\ntogether anymore. It’s hard to keep up.\u003c/p\u003e\n\u003ch3 id=\"whats-your-favourite-song-of-all-time\"\u003eWhat’s your favourite song of all time?\u003c/h3\u003e\n\u003cp\u003eProbably \u003cem\u003eLong Divison\u003c/em\u003e by Rustic Overtones on their titular album. Good\nstuff.\u003c/p\u003e\n\u003ch3 id=\"has-your-taste-in-music-evolved-over-the-years\"\u003eHas your taste in music evolved over the years?\u003c/h3\u003e\n\u003cp\u003eYes. I used to dislike R\u0026amp;B and Rap, but I realized that I like it more\nthan I gave it credit for. Though, I still \u003cem\u003edislike\u003c/em\u003e country. I’ve\npicked up more classical and other different genres as I’ve gotten\nolder.\u003c/p\u003e\n","date_modified":"2025-02-03T18:01:11-05:00","date_published":"2025-02-03T18:01:11-05:00","id":"https://degruchy.org/2025/02/03/music-preferences/","title":"Music Preferences","url":"https://degruchy.org/2025/02/03/music-preferences/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eIt\u0026rsquo;s tempting to stop using Emacs. Not that it\u0026rsquo;s not good, it\u0026rsquo;s just\nGUIs look so \u003cem\u003eslick\u003c/em\u003e sometimes. Being able to just click a button to\ncompile, or having tables and graphs of my finances, even just having a\nGUI for email and calendars sometimes feels \u003cem\u003enice\u003c/em\u003e. Thus, I am tempted\nto download Thunderbird, Kate (or VSCode), and KMyMoney and do things\nthat way. I do it because I\u0026rsquo;m weak. I \u003cem\u003ewant\u003c/em\u003e to fit in. I want all the\nconveniences, to do it all and be \u003cem\u003enormal\u003c/em\u003e (or at least something\napproaching normal).\u003c/p\u003e\n\u003cp\u003eBut I always find myself back in Emacs. Kate, good as it is, struggles\nwith doing things like piping text through external commands. It doesn\u0026rsquo;t\nsupport Fossil SCM. It forgets build settings, despite the \u003ccode\u003eMakefile\u003c/code\u003e\nbeing \u003cem\u003eright there\u003c/em\u003e. Or VSCode needing \u003cem\u003eyet another extension\u003c/em\u003e to do\nsimple crap like line wrapping (i.e.: \u003ccode\u003efill-paragraph\u003c/code\u003e) and basic text\nmanipulation. Thunderbird doesn\u0026rsquo;t even want to play nice with the GPG\ninstalled on my system, where I already have a keypair made and ready to\nuse, it acts like \u003cem\u003eit\u003c/em\u003e has to do it, otherwise I\u0026rsquo;ll just screw it up.\nThe OWL extension for Thunderbird makes great strides in Exchange\nsupport, but mostly it just gets all janky and pops up errors or takes\nforever to do a thing.\u003c/p\u003e\n\u003cp\u003eNo, Emacs (especially Emacs in the terminal, as I use it) is not ✨\nAmAzInG ✨. Getting emoji requires opening another app and copy/pasting\nit. Packages are very hit or miss. Sure they\u0026rsquo;ll work \u003cem\u003eforever\u003c/em\u003e in some\nlimited capacity, but sometimes they\u0026rsquo;re just bad. Plus, it feels like my\nconfig is a big book of glue code holding things together into a shape\nof an editor. But it\u0026rsquo;s \u003cem\u003emy\u003c/em\u003e glue and \u003cem\u003emy\u003c/em\u003e editor. I made it into what I\nneed it to be. Sure, that means I have to deal with janky ass looking\nemails, no desktop notifications for calendar appointments and other\nweird-ass-shit that doesn\u0026rsquo;t always line up, but for the most part, it\nworks. It\u0026rsquo;ll work long after I\u0026rsquo;m gone, as it did long before I even was\na person. And that\u0026rsquo;s something.\u003c/p\u003e\n","date_modified":"2025-02-03T15:07:03-05:00","date_published":"2025-02-03T15:07:03-05:00","id":"https://degruchy.org/2025/02/03/temptation-to-live-in-the-modern-era/","title":"Temptation to Live in the \"Modern Era\"","url":"https://degruchy.org/2025/02/03/temptation-to-live-in-the-modern-era/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eOkay, my mind is a little blown.\u003c/p\u003e\n\u003cp\u003eI have a reader! 🤯\u003c/p\u003e\n\u003cp\u003eAnyway, they contacted me because since I reforged this\u0026hellip;\nmonstrosity\u0026hellip; I\u0026rsquo;ve neglected to put the post content in the feed\u0026rsquo;s\n\u003ccode\u003e\u0026lt;content /\u0026gt;\u003c/code\u003e tag. This is/was a function of pure laziness, as putting\ncontent in feeds require a bit of content finagling. Though, through\nconsultations with ChatGPT, I might have a simple way of making that\nhappen. Starting with this post going forward. I\u0026rsquo;ll try and update the\nolder posts, but I can\u0026rsquo;t make any concrete promises on the timeline.\nTurns out I posted quite a bit.\u003c/p\u003e\n","date_modified":"2025-02-02T09:41:13-05:00","date_published":"2025-02-02T09:41:13-05:00","id":"https://degruchy.org/2025/02/02/giving-them-content/","title":"Giving them Content","url":"https://degruchy.org/2025/02/02/giving-them-content/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eReading even \u003cem\u003etech\u003c/em\u003e news is getting too depressing to do. All this makes\nme want to take my family and hole up somewhere where we can\u0026rsquo;t be\nbothered. It\u0026rsquo;s not a good feeling.\u003c/p\u003e\n\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/01/31/i-cant-do-it-anymore/delete-hn.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/01/31/i-cant-do-it-anymore/delete-hn.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/01/31/i-cant-do-it-anymore/delete-hn.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/01/31/i-cant-do-it-anymore/delete-hn.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/01/31/i-cant-do-it-anymore/delete-hn.png\"\n             alt=\"A picture of me deleting my Hacker News bookmark\" width=\"354\" height=\"202\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:354px;\"\u003e\n            \u003cp\u003eA picture of me deleting my Hacker News bookmark\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eNow, I\u0026rsquo;m down to not reading \u003cem\u003eanything\u003c/em\u003e. Not sure this is\nbetter…\u003c/p\u003e\n","date_modified":"2025-01-31T17:02:18-05:00","date_published":"2025-01-31T17:02:18-05:00","id":"https://degruchy.org/2025/01/31/i-cant-do-it-anymore/","title":"I Can't Do it Anymore","url":"https://degruchy.org/2025/01/31/i-cant-do-it-anymore/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eEmacs has a concept of\n\u003ca\n\thref=\"https://en.wikipedia.org/wiki/Fileset\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Fileset\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tfilesets\n\u003c/a\u003e. It actually has \u003cem\u003etwo\u003c/em\u003e\nkinds of \u003ca\n\thref=\"https://www.gnu.org/software/emacs/manual/html_node/emacs/Filesets.html\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.gnu.org/software/emacs/manual/html_node/emacs/Filesets.html\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tfileset\nconcepts\n\u003c/a\u003e.\nOne is the much more recognizable \u003ccode\u003evc\u003c/code\u003e interface for interacting with\nversion control repositories. The other one is not used often, but still\nhas some interesting characteristics.\u003c/p\u003e\n\u003cp\u003eFirst, \u003cem\u003eyou\u003c/em\u003e define what is in a file set. The GUI gives you a menu to\nadd items to a named set, but you can also define them manually in code\nor through the Customize mechanism. I actually had to think about this\nfor a bit, because it didn\u0026rsquo;t seem to make sense why I would have items\nthat were related, but not also somehow in a version control system.\nTurns out I do: Booklists, health documents, bash/profile preferences,\nand more.\u003c/p\u003e\n\u003cp\u003eSee, I could actually put all of those documents into a repository, but\noften I don\u0026rsquo;t need to do that, especially since I back them up in more\ntraditional ways anyway. Lets take a look at defining a set.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-elisp\" data-lang=\"elisp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003esetq\u003c/span\u003e \u003cspan class=\"nv\"\u003efilesets-data\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Books\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                       \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003e:ingroup\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;~/Documents/Books\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis defines a \u0026lsquo;Books\u0026rsquo; set that will simply show you the contents of the\ndirectory, similar to an Emacs bookmark. Not very helpful, but still\nneat.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-elisp\" data-lang=\"elisp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003esetq\u003c/span\u003e \u003cspan class=\"nv\"\u003efilesets-data\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Config files\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                      \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003e:files\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;~/.profile\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                              \u003cspan class=\"s\"\u003e\u0026#34;~/.bashrc\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis one will open all the listed files defined in that set. One other\ncool feature is that you can operate on the fileset with commands and\nwhen done with them you can close them all at once. Filesets can even\njust be a regular expression of files in a directory, letting you\ncherry-pick items from the folder that you want to see.\u003c/p\u003e\n\u003cp\u003eI can understand why folks probably don\u0026rsquo;t use this too often. Sometimes\nit\u0026rsquo;s less mental overhead to just open files as needed, instead of\ninvoking a new mechanism that might be too much or too little for your\nneeds at the time. Also, the \u003ca\n\thref=\"https://www.emacswiki.org/emacs/FileSets\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.emacswiki.org/emacs/FileSets\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tfileset program hasn\u0026rsquo;t really been updated\nin ages\n\u003c/a\u003e. Even the original\nauthor\u0026rsquo;s site is now only accessible via the Wayback machine.\nRegardless, I think that there are some really good uses that could come\nout of filesets, as with most Emacs archeology, you only get more\nfeatures and a deeper understanding of the arcana that makes Emacs run.\u003c/p\u003e\n\u003ch3 id=\"but-wait-theres-more\"\u003eBut Wait\u0026hellip; There\u0026rsquo;s More!\u003c/h3\u003e\n\u003cp\u003eWell, not \u003cem\u003emuch\u003c/em\u003e more. I also realized, that \u003ccode\u003eprojects.el\u003c/code\u003e represents a\nsort of fileset, too. While it automatically works for folders that have\nsome sort of detectable VC system, it can be manually defined, too.\u003c/p\u003e\n","date_modified":"2025-01-28T15:34:01-05:00","date_published":"2025-01-28T15:34:01-05:00","id":"https://degruchy.org/2025/01/28/emacs-and-filesets/","title":"Emacs and Filesets","url":"https://degruchy.org/2025/01/28/emacs-and-filesets/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\u003ca\n\thref=\"https://arstechnica.com/tech-policy/2025/01/bowing-to-trump-google-maps-plans-to-quickly-rename-the-gulf-of-mexico/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://arstechnica.com/tech-policy/2025/01/bowing-to-trump-google-maps-plans-to-quickly-rename-the-gulf-of-mexico/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tWhen you can\u0026rsquo;t govern, shift shit around to make it look like you\u0026rsquo;re\naccomplishing\nthings.\n\u003c/a\u003e\u003c/p\u003e\n","date_modified":"2025-01-28T12:08:39-05:00","date_published":"2025-01-28T12:08:39-05:00","id":"https://degruchy.org/2025/01/28/golf-of-america/","title":"Golf of America","url":"https://degruchy.org/2025/01/28/golf-of-america/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/01/27/y-no-plain-text/ynoplaintext.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/01/27/y-no-plain-text/ynoplaintext.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/01/27/y-no-plain-text/ynoplaintext.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/01/27/y-no-plain-text/ynoplaintext.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/01/27/y-no-plain-text/ynoplaintext.png\"\n             alt=\"A picture of my email from ThriftBooks that has no plain-text alternative\" width=\"640\" height=\"427\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003cp\u003eA picture of my email from ThriftBooks that has no plain-text alternative\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eIt\u0026rsquo;s not the first time I\u0026rsquo;ve seen it, and not the last, but damn I\nwish companies would \u003cem\u003etry\u003c/em\u003e.\u003c/p\u003e\n","date_modified":"2025-01-27T14:03:41-05:00","date_published":"2025-01-27T14:03:41-05:00","id":"https://degruchy.org/2025/01/27/y-no-plain-text/","title":"Y no Plain-text?","url":"https://degruchy.org/2025/01/27/y-no-plain-text/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eSometimes I find it hard to know \u003cem\u003ewhen\u003c/em\u003e to automate some process.\nSometimes, I find legitimate automation ideas too hard for me to\nimplement. Sometimes, like with this blog, I enjoy the process of doing\nthe task and all it\u0026rsquo;s warty sub-tasks.\u003c/p\u003e\n\u003cp\u003eFor some things, like banking, I don\u0026rsquo;t \u003cem\u003ewant\u003c/em\u003e some tool clumsily\naccessing my bank\u0026rsquo;s byzantine API just so that I don\u0026rsquo;t have to manually\nenter transactions into my ledger file. Sure, there are easy tools like\n\u003ccode\u003eaqbanking\u003c/code\u003e that make the process easier, but I\u0026rsquo;m kind of paranoid about\nmoney. Something about automating this process seems \u003cem\u003ewrong\u003c/em\u003e or at the\nvery least, fraught with danger.\u003c/p\u003e\n\u003cp\u003eThere are times where automation just doesn\u0026rsquo;t make sense. I don\u0026rsquo;t \u003cem\u003eneed\u003c/em\u003e\na \u0026lsquo;smart\u0026rsquo; scale to automatically report to my phone/cloud/whatever to\ntrack my weight. I can just enter it. It\u0026rsquo;s not hard. The same goes with\na lot of home automation. I don\u0026rsquo;t need lights automatically turning on\nand off, or coffee systems to brew before I wake up. The things I want\nautomated are the drudgery stuff: vacuuming floors, doing laundry and\ncleaning dishes. I have one of those already, and it\u0026rsquo;s great. Best\nChristmas gift we\u0026rsquo;ve bought ourselves 4 years running.\u003c/p\u003e\n\u003cp\u003eI guess there was a time in which I watched \u003cem\u003eStar Trek\u003c/em\u003e and thought\n“Wow! Wouldn\u0026rsquo;t it be great if all my needs were just taken care of for\nme? I didn\u0026rsquo;t have to \u003cem\u003edo\u003c/em\u003e anything?”. Then I got older, and I saw how\ntechnology works, and how it doesn\u0026rsquo;t work, and how it sometimes is out\nto do more nefarious things without your knowledge. I also know that\nsome of this stuff is just trash. Trash that sells you a thing that\nbeaks or is bricked or obsoleted soon after you buy it because you know:\nshareholder value. I guess that now that I\u0026rsquo;m older, and a bit more world\nweary, I find that not \u003cem\u003eall\u003c/em\u003e automation is needed. Sometimes getting up,\nmaking my coffee, taking my pills, making breakfast, taking a shower and\ngetting dressed are not wasted time. They\u0026rsquo;re living. I don\u0026rsquo;t want my\nlife automated away from me.\u003c/p\u003e\n","date_modified":"2025-01-27T09:17:09-05:00","date_published":"2025-01-27T09:17:09-05:00","id":"https://degruchy.org/2025/01/27/when-to-automate/","title":"When to Automate?","url":"https://degruchy.org/2025/01/27/when-to-automate/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI\u0026rsquo;m a huge fan of the Lockpicking Lawyer. He has a soothing voice and\na methodical explanation around lock picking and functions. One such\nfunction is the devilishly simple \u0026ldquo;Hines Key System\u0026rdquo;. A simple set of\ngroves to capture improperly raised pins that will jam a lock from\nopening if done improperly. Take a look:\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://www.youtube.com/watch?v=3g0-pxXD794\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/01/24/lpl-teaches-you-about-lock-traps-and-how-to-make-your-own-on-the-cheap/lpl-hines-key-system.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/01/24/lpl-teaches-you-about-lock-traps-and-how-to-make-your-own-on-the-cheap/lpl-hines-key-system.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/01/24/lpl-teaches-you-about-lock-traps-and-how-to-make-your-own-on-the-cheap/lpl-hines-key-system.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/01/24/lpl-teaches-you-about-lock-traps-and-how-to-make-your-own-on-the-cheap/lpl-hines-key-system.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/01/24/lpl-teaches-you-about-lock-traps-and-how-to-make-your-own-on-the-cheap/lpl-hines-key-system.jpg\"\n             alt=\"A picture of the Hines Key System on LPL\u0026#39;s site\" width=\"640\" height=\"360\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003cp\u003eWarning, YouTube Link\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eNow, a cheap and easy modifiction to a common Kwikset lock that makes\nit work like the above:\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"https://www.youtube.com/watch?v=7JlgKCUqzA0\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/01/24/lpl-teaches-you-about-lock-traps-and-how-to-make-your-own-on-the-cheap/lpl-kwikset-hines.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/01/24/lpl-teaches-you-about-lock-traps-and-how-to-make-your-own-on-the-cheap/lpl-kwikset-hines.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/01/24/lpl-teaches-you-about-lock-traps-and-how-to-make-your-own-on-the-cheap/lpl-kwikset-hines.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/01/24/lpl-teaches-you-about-lock-traps-and-how-to-make-your-own-on-the-cheap/lpl-kwikset-hines.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/01/24/lpl-teaches-you-about-lock-traps-and-how-to-make-your-own-on-the-cheap/lpl-kwikset-hines.jpg\"\n             alt=\"A picture of the Kwikset modification to make it Hines-like\" width=\"640\" height=\"360\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003cp\u003eWarning, YouTube Link\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n","date_modified":"2025-01-24T15:38:28-05:00","date_published":"2025-01-24T15:38:28-05:00","id":"https://degruchy.org/2025/01/24/lpl-teaches-you-about-lock-traps-and-how-to-make-your-own-on-the-cheap/","title":"LPL Teaches You About Lock Traps, and how to Make Your Own on the Cheap","url":"https://degruchy.org/2025/01/24/lpl-teaches-you-about-lock-traps-and-how-to-make-your-own-on-the-cheap/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003e\u003ca\n\thref=\"https://www.nbcnews.com/nbc-out/out-politics-and-policy/missouri-republican-candidate-torches-lgbtq-inclusive-books-viral-vide-rcna137715\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.nbcnews.com/nbc-out/out-politics-and-policy/missouri-republican-candidate-torches-lgbtq-inclusive-books-viral-vide-rcna137715\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tThe book burning from the right has\nbegun\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ca\n\thref=\"https://www.pbs.org/wgbh/americanexperience/features/goebbels-burnings/\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://www.pbs.org/wgbh/americanexperience/features/goebbels-burnings/\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tNow where have we seen this kind of behavior\nbefore?\n\u003c/a\u003e\u003c/p\u003e\n","date_modified":"2025-01-24T11:28:32-05:00","date_published":"2025-01-24T11:28:32-05:00","id":"https://degruchy.org/2025/01/24/and-so-it-begins/","title":"And So it Begins","url":"https://degruchy.org/2025/01/24/and-so-it-begins/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI could have sworn it was closed down or sold. Amazing.\u003c/p\u003e\n","date_modified":"2025-01-23T16:01:20-05:00","date_published":"2025-01-23T16:01:20-05:00","id":"https://degruchy.org/2025/01/23/til-craigslist-is-still-a-thing/","title":"TIL: Craigslist is Still a Thing","url":"https://degruchy.org/2025/01/23/til-craigslist-is-still-a-thing/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/01/23/no-i-dont-think-i-will-youtube/youtube-not-a-bot.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/01/23/no-i-dont-think-i-will-youtube/youtube-not-a-bot.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/01/23/no-i-dont-think-i-will-youtube/youtube-not-a-bot.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/01/23/no-i-dont-think-i-will-youtube/youtube-not-a-bot.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/01/23/no-i-dont-think-i-will-youtube/youtube-not-a-bot.png\"\n             alt=\"A picture of the youtube block image when it thinks you\u0026rsquo;re a bot\" width=\"640\" height=\"348\"\u003e\n    \u003c/picture\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003cp\u003eA picture of the youtube block image when it thinks you\u0026rsquo;re a bot\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eNo, YouTube. I don\u0026rsquo;t think I will. Just because I use a VPN doesn\u0026rsquo;t mean I\u0026rsquo;m a bot.\u003c/p\u003e\n","date_modified":"2025-01-23T11:45:58-05:00","date_published":"2025-01-23T11:45:58-05:00","id":"https://degruchy.org/2025/01/23/no-i-dont-think-i-will-youtube/","title":"No, I Don't Think I Will, YouTube","url":"https://degruchy.org/2025/01/23/no-i-dont-think-i-will-youtube/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cp\u003eI tried.\u003c/p\u003e\n\u003cp\u003eI tried to go back to GUI and HTML email. I tried like I tried to use a\nGUI finance manager instead of ledger, or pay for an RSS aggregator, or\nmany other things.\u003c/p\u003e\n\u003cp\u003eI tried to use Micro.blog. I tried to have a nice place where I could\ncomment, get \u003ca\n\thref=\"https://en.wikipedia.org/wiki/Fediverse\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://en.wikipedia.org/wiki/Fediverse\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tFediverse\n\u003c/a\u003e reactions and \u003ca\n\thref=\"https://indieweb.org\"\n\t\n\t\n\tdata-umami-event=\"outbound-link-click\"\n\tdata-umami-event-url=\"https://indieweb.org\"\n\ttarget=\"_blank\" rel=\"noopener\"\n\t\u003e\n\tIndieWeb\n\u003c/a\u003e\nfunctionality. Then I discovered there was a huge\nknock-down-drag-out-fight over some social media posts and Elon Musk\nand trans people and whatever.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t like social media. I\u0026rsquo;m back to it being nice and quiet.\u003c/p\u003e\n","date_modified":"2025-01-22T17:26:18-05:00","date_published":"2025-01-22T17:26:18-05:00","id":"https://degruchy.org/2025/01/22/not-so-social-media/","title":"Not So Social Media","url":"https://degruchy.org/2025/01/22/not-so-social-media/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cfigure\u003e\u003ca href=\"https://www.jpost.com/international/article-838444\"\u003e\u003cpicture\u003e\u003csource srcset=\"/2025/01/20/elon-youre-not-supposed-to-say-the-quiet-part-out-loud/elon-heil.jxl\" type=\"image/jxl\"\u003e\u003csource srcset=\"/2025/01/20/elon-youre-not-supposed-to-say-the-quiet-part-out-loud/elon-heil.heic\" type=\"image/heic\"\u003e\u003csource srcset=\"/2025/01/20/elon-youre-not-supposed-to-say-the-quiet-part-out-loud/elon-heil.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/2025/01/20/elon-youre-not-supposed-to-say-the-quiet-part-out-loud/elon-heil.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/01/20/elon-youre-not-supposed-to-say-the-quiet-part-out-loud/elon-heil.jpg\"\n             alt=\"Elon making a \u0026#39;Seig Heil\u0026#39; gesture at a rally\" width=\"640\" height=\"418\"\u003e\n    \u003c/picture\u003e\u003c/a\u003e\u003cfigcaption style=\"margin: 0 auto; width:640px;\"\u003e\n            \u003cp\u003eElon making a \u0026lsquo;Sieg Heil\u0026rsquo; gesture at a rally\u003c/cite\u003e\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eWhat a chucklefuck. Though, I\u0026rsquo;m pretty sure no one is actually\n\u003cem\u003esurprised\u003c/em\u003e by this. If you are, then goodness help you for the\nnext 4+ years.\u003c/p\u003e\n","date_modified":"2025-01-20T17:16:22-05:00","date_published":"2025-01-20T17:16:22-05:00","id":"https://degruchy.org/2025/01/20/elon-youre-not-supposed-to-say-the-quiet-part-out-loud/","title":"Elon, You're Not Supposed to Say the Quiet Part Out Loud","url":"https://degruchy.org/2025/01/20/elon-youre-not-supposed-to-say-the-quiet-part-out-loud/"},{"authors":[{"avatar":"https://degruchy.org/assets/images/avatar-opengraph.avif","name":"Nathan DeGruchy","url":"https://degruchy.org/"}],"content_html":"\u003cul class=\"caturday gallery\" rel=\"page\"\u003e\u003cli\u003e\n        \u003ca href=\"/2025/01/19/late-caturday/ellie.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/01/19/late-caturday/ellie_hu_3af9c5b3d5e40a16.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/01/19/late-caturday/ellie_hu_a3689fc822fb41cd.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eEllie, lounging on the bench\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003cli\u003e\n        \u003ca href=\"/2025/01/19/late-caturday/bailey.jpg\"\u003e\n            \u003cfigure\u003e\n                \u003cpicture\u003e\u003csource srcset=\"/2025/01/19/late-caturday/bailey_hu_c73e241c1fa663a7.webp\" type=\"image/webp\"\u003e\u003cimg src=\"/2025/01/19/late-caturday/bailey_hu_dd777270c99d62d8.jpg\" alt=\"\" width=\"128\" height=\"128\" loading=\"lazy\"\u003e\u003c/picture\u003e\u003cfigcaption\u003eBailey in boxes\u003c/figcaption\u003e\u003c/figure\u003e\n        \u003c/a\u003e\n    \u003c/li\u003e\u003c/ul\u003e\n\n\u003cstyle\u003e\n\t@layer post\n\t{\n\t\t.gallery\n\t\t{\n\t\t\talign-content: space-evenly;\n\t\t\tbackground-color: var(--theme-color-alt-background);\n\t\t\tborder: 3px solid var(--theme-color-border);\n\t\t\tborder-radius: 10px;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: center;\n\t\t\tpadding: 0;\n\n\t\t\tli\n\t\t\t{\n\t\t\t\tlist-style-type: none;\n\t\t\t}\n\n\t\t\ta\n\t\t\t{\n\t\t\tcolor: var(--theme-color-alt-foreground);\n\t\t\t}\n\n\t\t\tfigcaption\n\t\t\t{\n\t\t\t\theight: 1.4rem;\n\t\t\t\tmax-width: 128px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\ttext-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n\u003c/style\u003e\n\n","date_modified":"2025-01-19T16:01:05-05:00","date_published":"2025-01-19T16:01:05-05:00","id":"https://degruchy.org/2025/01/19/late-caturday/","title":"Late Caturday","url":"https://degruchy.org/2025/01/19/late-caturday/"}],"language":"en-us","title":"Verily","version":"https://jsonfeed.org/version/1.1"}