Browse Source

Deploying to gh-pages from @ garritfra/garrit.xyz@890710aa3df91b1e1ceb4b842d0b89c638f6a0ce 🚀

gh-pages
garritfra 3 weeks ago
parent
commit
fbba103db5
  1. 2
      404.html
  2. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/beats.json
  3. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/blogroll.json
  4. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/contact.json
  5. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/ctf.json
  6. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/cv.json
  7. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/guestbook.json
  8. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/impossible.json
  9. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/index.json
  10. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/index/index.json
  11. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/journal.json
  12. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/links.json
  13. 1
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts.json
  14. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2020-11-06-current-doings.json
  15. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2020-11-17-booleans-are-wasted-memory.json
  16. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2020-12-18-update-december.json
  17. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-07-delete-facebook.json
  18. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-11-100daystooffload.json
  19. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-11-are-humans-still-evolving.json
  20. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-13-512kb-club.json
  21. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-15-compiling-your-own-kernel.json
  22. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-18-reasons-the-fediverse-is-better.json
  23. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-23-signal-to-noise.json
  24. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-26-vim-macros.json
  25. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-29-sudo-to-doas.json
  26. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-02-02-bem-methodology.json
  27. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-02-07-storage-setup.json
  28. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-02-11-10-percent-100daystooffload.json
  29. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-02-17-notes-on-flutter-web.json
  30. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-02-20-changelogs.json
  31. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-02-24-vim-terminal-strategies.json
  32. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-03-13-git-builtin-lifesaver.json
  33. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-04-07-pgp-guide.json
  34. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-05-15-healthchecks-io-with-docker.json
  35. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-08-08-fun-with-pen-and-paper-race-cars.json
  36. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-09-13-fixing-an-annoying-cron-gotcha.json
  37. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-10-04-server-side-caching-with-apollo-graphql.json
  38. 1
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-12-21-usetoggle-react-hook.json
  39. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-12-24-notes-on-pruning-chinese-elms.json
  40. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-12-31-btrfs-on-alpine.json
  41. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-01-28-til-how-to-get-the-selected-language-of-a-browser.json
  42. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-03-18-fix-traefik-proxy-issues.json
  43. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-03-24-swapping-numbers-without-temp.json
  44. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-04-25-weeknote-16-2022.json
  45. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-04-28-hello-to-all-the-new-mastodon-users.json
  46. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-04-29-weeknote-17-2022.json
  47. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-05-06-weeknote-18-2022.json
  48. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-05-24-cloning-windows-to-a-new-drive.json
  49. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-05-31-database-server-migration-cheat-sheet.json
  50. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-06-02-tar-commands.json
  51. 1
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-06-10-a-list-of-bugs-in-macos.json
  52. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-06-29-the-only-true-answer-to-tabs-vs-spaces.json
  53. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-08-31-whats-on-my-feed.json
  54. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-09-22-kubernetes-is-a-domain-specific-database.json
  55. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-09-26-self-hosted-software-im-thankful-for.json
  56. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-09-30-debugging-docker-images.json
  57. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-10-05-simple-guestbook.json
  58. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-11-03-reselling-managed-kubernetes.json
  59. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-11-11-cursed-user-agents.json
  60. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-11-24-smart-move-google.json
  61. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-12-05-contributing-to-open-source-knowledge.json
  62. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-01-02-welcome-2023.json
  63. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-02-14-openssf-best-practices.json
  64. 1
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-02-19-til-about-css-insets.json
  65. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-02-20-what-problem-does-kubernetes-solve.json
  66. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-02-21-what's-next-for-modern-infrastructure.json
  67. 1
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-02-22-dockerignore-troubles.json
  68. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-02-24-visual-distractions.json
  69. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-03-notes-on-containerizing-php-applications.json
  70. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-04-pods-vs.-containers.json
  71. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-08-terraform-and-kubernetes-are-fundamentally-different.json
  72. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-10-debugging-ecs-tasks.json
  73. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-11-a-software-requirements-checklist.json
  74. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-16-terraform-project-learnings.json
  75. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-21-i-wont-buy-a-yubikey.json
  76. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-23-fullscreen-terminals-in-vscode.json
  77. 1
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-26-software-is-not-defined-by-the-language-it's-written-in.json
  78. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-30-designing-resilient-cloud-infrastructure.json
  79. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-04-01-quality-vs.-quantity.json
  80. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-04-07-older-is-often-better.json
  81. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-04-12-instant-dark-theme.json
  82. 1
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-04-22-the-role-of-a-devops-engineer.json
  83. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-04-27-migrating-homeassistant-from-sd-to-ssd.json
  84. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-04-28-serverless-framework-retrospective.json
  85. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-05-19-work-batch-sizing.json
  86. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-06-01-single-page-applications-on-github-pages.json
  87. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-06-25-make-a-list.json
  88. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-07-06-rss-changes.json
  89. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-07-11-principles-of-devops-introduction.json
  90. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-07-12-principles-of-devops--flow.json
  91. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-08-23-so,-you-want-to-win-the-lottery.json
  92. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-09-09-everyday-carry-notebooks.json
  93. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-09-10-short-story-haunted-memories.json
  94. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-09-11-linkdump-software-development.json
  95. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-09-29-undo-on-mobile-phones.json
  96. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-10-01-the-mind-rope-experiment.json
  97. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-10-03-project-hail-mary.json
  98. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-10-09-field-notes-2.json
  99. 0
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-10-10-did-you-try-turning-it-off.json
  100. 2
      _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-10-13-organizing-multiple-git-identities.json
  101. Some files were not shown because too many files have changed in this diff Show More

2
404.html

@ -1 +1 @@
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1"/><meta charSet="utf-8"/><title></title><meta name="Description" content="Generalist software developer writing about scalable infrastructure, fullstack development and DevOps practices."/><link rel="icon" type="image/svg+xml" href="/favicon.svg"/><link rel="manifest" href="/site.webmanifest"/><link rel="webmention" href="https://webmention.io/garrit.xyz/webmention"/><link rel="pingback" href="https://webmention.io/garrit.xyz/xmlrpc"/><meta name="next-head-count" content="8"/><link rel="preload" href="/_next/static/css/386ff04d0e85da2f.css" as="style" crossorigin=""/><link rel="stylesheet" href="/_next/static/css/386ff04d0e85da2f.css" crossorigin="" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" crossorigin="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="/_next/static/chunks/webpack-ee7e63bc15b31913.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/framework-5429a50ba5373c56.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/main-d2ba44903cd47711.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/pages/_app-79c931a4d8897bd8.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/pages/404-08cd16f8c995e693.js" defer="" crossorigin=""></script><script src="/_next/static/rmckNz7veqFvftdvd7gkL/_buildManifest.js" defer="" crossorigin=""></script><script src="/_next/static/rmckNz7veqFvftdvd7gkL/_ssgManifest.js" defer="" crossorigin=""></script></head><body><div id="__next"><section class="layout"><header class="header"><nav class="nav" role="navigation" aria-label="main navigation"><div class="header__container"><a href="/" class="header__container__logo"></a></div><ul class="header__links"><li><a href="/posts">Blog</a></li><li><a href="/contact">Contact</a></li><li><a href="/links">More ...</a></li></ul></nav></header><div class="content"><article class="page h-entry"><div class="page__body e-content"><h1>404 - Page Not Found</h1><a href="/">Go back home</a></div></article></div><footer class="footer"><div class="notice"><p>I invite you to read my new book<!-- --> <a target="_blank" href="https://www.buymeacoffee.com/garrit/e/233695">Five Years of Blogging: Ideas, Opinions and Guides written 2019 to 2024</a>. Becoming a member on<!-- --> <a target="_blank" href="https://www.buymeacoffee.com/garrit">Buy Me a Coffee</a> <!-- -->will grant you free access to the book!</p><a href="https://www.buymeacoffee.com/garrit/extras"><img src="/assets/five-years-of-blogging-cover-3d.png" alt="Cover of Five Years of Blogging" loading="lazy"/></a></div><div class="footer__content"><h3>Links of Interest</h3><a href="/rss.xml">RSS Feed</a><br/><a href="/todo">Todo List</a><br/><a href="https://keys.openpgp.org/vks/v1/by-fingerprint/2218337E54AA1DBE207B404DBB54AF7EB0939F3D">PGP Key</a><br/><a href="/guestbook">Guestbook</a><br/><a href="/blogroll">Blogroll</a><br/><a href="/ctf">Capture the Flag</a><h3>Elsewhere</h3><a href="https://github.com/garritfra" rel="me">Github</a><br/><a href="https://www.linkedin.com/in/garritfranke/">LinkedIn</a><br/><a href="https://fosstodon.org/@garritfra">Mastodon (ActivityPub)</a><br/><a href="/contact">Contact</a></div><a href="https://www.buymeacoffee.com/garrit" target="_blank"><img src="https://img.buymeacoffee.com/button-api/?text=Buy me a tea&amp;emoji=&amp;slug=garrit&amp;button_colour=FFB300&amp;font_colour=000000&amp;font_family=Cookie&amp;outline_colour=000000&amp;coffee_colour=ffffff"/></a><p>👻 Proud member of<!-- --> <a target="_blank" href="https://darktheme.club/">darktheme.club</a> <!-- -->👻</p><p>© 2018-<!-- -->2024<!-- --> Garrit Franke<br/><a href="/privacy">Privacy</a> |<!-- --> <a target="_blank" href="https://github.com/garritfra/garrit.xyz">Source Code</a></p></footer></section></div><script id="__NEXT_DATA__" type="application/json" crossorigin="">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"rmckNz7veqFvftdvd7gkL","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1"/><meta charSet="utf-8"/><title></title><meta name="Description" content="Generalist software developer writing about scalable infrastructure, fullstack development and DevOps practices."/><link rel="icon" type="image/svg+xml" href="/favicon.svg"/><link rel="manifest" href="/site.webmanifest"/><link rel="webmention" href="https://webmention.io/garrit.xyz/webmention"/><link rel="pingback" href="https://webmention.io/garrit.xyz/xmlrpc"/><meta name="next-head-count" content="8"/><link rel="preload" href="/_next/static/css/386ff04d0e85da2f.css" as="style" crossorigin=""/><link rel="stylesheet" href="/_next/static/css/386ff04d0e85da2f.css" crossorigin="" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" crossorigin="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="/_next/static/chunks/webpack-ee7e63bc15b31913.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/framework-5429a50ba5373c56.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/main-d2ba44903cd47711.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/pages/_app-79c931a4d8897bd8.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/pages/404-08cd16f8c995e693.js" defer="" crossorigin=""></script><script src="/_next/static/P6_Tjd_l0BLYM1McFXyK9/_buildManifest.js" defer="" crossorigin=""></script><script src="/_next/static/P6_Tjd_l0BLYM1McFXyK9/_ssgManifest.js" defer="" crossorigin=""></script></head><body><div id="__next"><section class="layout"><header class="header"><nav class="nav" role="navigation" aria-label="main navigation"><div class="header__container"><a href="/" class="header__container__logo"></a></div><ul class="header__links"><li><a href="/posts">Blog</a></li><li><a href="/contact">Contact</a></li><li><a href="/links">More ...</a></li></ul></nav></header><div class="content"><article class="page h-entry"><div class="page__body e-content"><h1>404 - Page Not Found</h1><a href="/">Go back home</a></div></article></div><footer class="footer"><div class="notice"><p>I invite you to read my new book<!-- --> <a target="_blank" href="https://www.buymeacoffee.com/garrit/e/233695">Five Years of Blogging: Ideas, Opinions and Guides written 2019 to 2024</a>. Becoming a member on<!-- --> <a target="_blank" href="https://www.buymeacoffee.com/garrit">Buy Me a Coffee</a> <!-- -->will grant you free access to the book!</p><a href="https://www.buymeacoffee.com/garrit/extras"><img src="/assets/five-years-of-blogging-cover-3d.png" alt="Cover of Five Years of Blogging" loading="lazy"/></a></div><div class="footer__content"><h3>Links of Interest</h3><a href="/rss.xml">RSS Feed</a><br/><a href="/todo">Todo List</a><br/><a href="https://keys.openpgp.org/vks/v1/by-fingerprint/2218337E54AA1DBE207B404DBB54AF7EB0939F3D">PGP Key</a><br/><a href="/guestbook">Guestbook</a><br/><a href="/blogroll">Blogroll</a><br/><a href="/ctf">Capture the Flag</a><h3>Elsewhere</h3><a href="https://github.com/garritfra" rel="me">Github</a><br/><a href="https://www.linkedin.com/in/garritfranke/">LinkedIn</a><br/><a href="https://fosstodon.org/@garritfra">Mastodon (ActivityPub)</a><br/><a href="/contact">Contact</a></div><a href="https://www.buymeacoffee.com/garrit" target="_blank"><img src="https://img.buymeacoffee.com/button-api/?text=Buy me a tea&amp;emoji=&amp;slug=garrit&amp;button_colour=FFB300&amp;font_colour=000000&amp;font_family=Cookie&amp;outline_colour=000000&amp;coffee_colour=ffffff"/></a><p>👻 Proud member of<!-- --> <a target="_blank" href="https://darktheme.club/">darktheme.club</a> <!-- -->👻</p><p>© 2018-<!-- -->2024<!-- --> Garrit Franke<br/><a href="/privacy">Privacy</a> |<!-- --> <a target="_blank" href="https://github.com/garritfra/garrit.xyz">Source Code</a></p></footer></section></div><script id="__NEXT_DATA__" type="application/json" crossorigin="">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"P6_Tjd_l0BLYM1McFXyK9","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>

0
_next/data/rmckNz7veqFvftdvd7gkL/beats.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/beats.json

0
_next/data/rmckNz7veqFvftdvd7gkL/blogroll.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/blogroll.json

0
_next/data/rmckNz7veqFvftdvd7gkL/contact.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/contact.json

0
_next/data/rmckNz7veqFvftdvd7gkL/ctf.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/ctf.json

0
_next/data/rmckNz7veqFvftdvd7gkL/cv.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/cv.json

0
_next/data/rmckNz7veqFvftdvd7gkL/guestbook.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/guestbook.json

0
_next/data/rmckNz7veqFvftdvd7gkL/impossible.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/impossible.json

2
_next/data/rmckNz7veqFvftdvd7gkL/index.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/index.json

@ -1 +1 @@
{"pageProps":{"markdownBody":"# I'm Garrit, a generalist DevOps Engineer\n\nMy interests include...\n\n- Scalable Infrastructure\n- DevOps Practices\n- Fullstack Development\n- Minimalist Software\n- Free Software\n\n&emsp;\n\nOn my [blog](/posts), I ramble about software and tech-related topics. Check\nout my [todos](/todo) if you need inspiration for your next project.\n\nI'm always up for a chat. Feel free to [reach out](/contact), or leave a note in\nmy [guestbook](/guestbook)!\n\nPssst! Can you find all [hidden flags](/ctf) on this page?\n\n## Projects\n\n**[Positive Hacker News](https://github.com/garritfra/positive_hackernews)**\n\nEnjoy a more positive news-reading experience with the Positive Hacker News RSS Feed! 🌟\n\n**[sendpasswords.net](https://sendpasswords.net/)**\n\nSimplifies secure password transmission using local encryption and temporary PGP keys.\n\n**[seeking-maintainers.net](https://seeking-maintainers.net/)**\n\nAn index of open source projects seeking new maintainers.\n\n**[darktheme.club](https://darktheme.club/)**\n\nThe Darktheme Club is a collection of accessible web pages from across the Internet.\n\n**[qbe-rs](https://github.com/garritfra/qbe-rs)**\n\nA Rust crate that seeks to provide a Rust-y representation of QBE IR. It can be\nused by compilers for code generation.\n\n**[Antimony Programming language](https://github.com/antimony-lang/antimony)**\n\nA bullshit-free programming language that compiles to JavaScript.\n","recentPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-07-five-years-of-blogging","frontmatter":{"title":"Five Years of Blogging","date":"2024-04-07","tags":"note, books, writing, meta"},"tags":["note","books","writing","meta"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]}]},"__N_SSG":true}
{"pageProps":{"markdownBody":"# I'm Garrit, a generalist DevOps Engineer\n\nMy interests include...\n\n- Scalable Infrastructure\n- DevOps Practices\n- Fullstack Development\n- Minimalist Software\n- Free Software\n\n&emsp;\n\nOn my [blog](/posts), I ramble about software and tech-related topics. Check\nout my [todos](/todo) if you need inspiration for your next project.\n\nI'm always up for a chat. Feel free to [reach out](/contact), or leave a note in\nmy [guestbook](/guestbook)!\n\nPssst! Can you find all [hidden flags](/ctf) on this page?\n\n## Projects\n\n**[Positive Hacker News](https://github.com/garritfra/positive_hackernews)**\n\nEnjoy a more positive news-reading experience with the Positive Hacker News RSS Feed! 🌟\n\n**[sendpasswords.net](https://sendpasswords.net/)**\n\nSimplifies secure password transmission using local encryption and temporary PGP keys.\n\n**[seeking-maintainers.net](https://seeking-maintainers.net/)**\n\nAn index of open source projects seeking new maintainers.\n\n**[darktheme.club](https://darktheme.club/)**\n\nThe Darktheme Club is a collection of accessible web pages from across the Internet.\n\n**[qbe-rs](https://github.com/garritfra/qbe-rs)**\n\nA Rust crate that seeks to provide a Rust-y representation of QBE IR. It can be\nused by compilers for code generation.\n\n**[Antimony Programming language](https://github.com/antimony-lang/antimony)**\n\nA bullshit-free programming language that compiles to JavaScript.\n","recentPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-07-five-years-of-blogging","frontmatter":{"title":"Five Years of Blogging","date":"2024-04-07","tags":"note, books, writing, meta"},"tags":["note","books","writing","meta"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]}]},"__N_SSG":true}

0
_next/data/rmckNz7veqFvftdvd7gkL/index/index.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/index/index.json

0
_next/data/rmckNz7veqFvftdvd7gkL/journal.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/journal.json

0
_next/data/rmckNz7veqFvftdvd7gkL/links.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/links.json

1
_next/data/P6_Tjd_l0BLYM1McFXyK9/posts.json

File diff suppressed because one or more lines are too long

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2020-11-06-current-doings.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2020-11-06-current-doings.json

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2020-11-17-booleans-are-wasted-memory.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2020-11-17-booleans-are-wasted-memory.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2020-11-17-booleans-are-wasted-memory","markdownBody":"\nA boolean is either `true` or `false`. That translates to `1` or `0`. If you think that one bit is enough to store this information, you'd be wrong.\n\nIn order to keep the binary layout of a program simple and convenient, most languages store information in 8 bit (1 byte) blocks.\nIf you allocate a `bool` in Rust or (most) other languages that are based on LLVM, [it will take up 1 `i1`, or 1 byte of memory](https://llvm.org/docs/LangRef.html#simple-constants). If you allocate a boolean value in C, you will get [an integer constant with a value of either 1 or 0](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdbool.h.html).\n\nIf you find yourself having to store multiple boolean states somewhere, you might simply declare those booleans and call it a day:\n\n```c\n#include <stdbool.h>\n#include <stdio.h>\nint main()\n{\n bool can_read = true;\n bool can_write = true;\n bool can_execute = false;\n\n if (can_read)\n printf(\"read bit set\\n\");\n if (can_write)\n printf(\"write bit set\\n\");\n if (can_execute)\n printf(\"execute bit set\\n\");\n\n // Output:\n // read bit set\n // write bit set\n}\n```\n\n## We can do better than this\n\nAn alternative approach to store boolean values is to share a \"chunk\" of bits with other values. This is usually done using bitwise operations:\n\n```c\n#include <stdbool.h>\n#include <stdio.h>\n\n// Define permissions\n#define PERM_NONE 0b000\n#define PERM_READ 0b001\n#define PERM_WRITE 0b010\n#define PERM_EXECUTE 0b100\n\n#define PERM_ALL PERM_READ | PERM_WRITE | PERM_EXECUTE\n\nint main()\n{\n // Allocate 1 byte for permissions\n char permissions = PERM_READ | PERM_WRITE;\n\n if (permissions & PERM_READ)\n printf(\"write bit set\\n\");\n if (permissions & PERM_WRITE)\n printf(\"read bit set\\n\");\n if (permissions & PERM_EXECUTE)\n printf(\"execute bit set\\n\");\n\n // Output:\n // read bit set\n // write bit set\n}\n```\n\nThis example still wastes 5 bits since we only use 3 out of 8 possible bits of the char type, but I'm sure you get the point. Allocating 3 boolean values independently would waste 7 \\* 3 = 21 bits, so it's a massive improvement. Whenever you find yourself needing multiple boolean values, think twice if you can use this pattern.\n\nMicrocontrollers have a very constrainted environment, therefore bitwise operations are essential in those scenarios. 7 wasted bits are a lot if there are only 4 kb of total memory available. For larger systems we often forget about these constraints, until they add up.\n\n## My Plea\n\n- Be mindful about the software you create.\n- Appreciate the resources at your disposal.\n","frontmatter":{"title":"Booleans are wasted memory","date":"2020-11-17","tags":"note, guide, programming, tech"},"tags":["note","guide","programming","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2020-11-17-booleans-are-wasted-memory","markdownBody":"\nA boolean is either `true` or `false`. That translates to `1` or `0`. If you think that one bit is enough to store this information, you'd be wrong.\n\nIn order to keep the binary layout of a program simple and convenient, most languages store information in 8 bit (1 byte) blocks.\nIf you allocate a `bool` in Rust or (most) other languages that are based on LLVM, [it will take up 1 `i1`, or 1 byte of memory](https://llvm.org/docs/LangRef.html#simple-constants). If you allocate a boolean value in C, you will get [an integer constant with a value of either 1 or 0](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdbool.h.html).\n\nIf you find yourself having to store multiple boolean states somewhere, you might simply declare those booleans and call it a day:\n\n```c\n#include <stdbool.h>\n#include <stdio.h>\nint main()\n{\n bool can_read = true;\n bool can_write = true;\n bool can_execute = false;\n\n if (can_read)\n printf(\"read bit set\\n\");\n if (can_write)\n printf(\"write bit set\\n\");\n if (can_execute)\n printf(\"execute bit set\\n\");\n\n // Output:\n // read bit set\n // write bit set\n}\n```\n\n## We can do better than this\n\nAn alternative approach to store boolean values is to share a \"chunk\" of bits with other values. This is usually done using bitwise operations:\n\n```c\n#include <stdbool.h>\n#include <stdio.h>\n\n// Define permissions\n#define PERM_NONE 0b000\n#define PERM_READ 0b001\n#define PERM_WRITE 0b010\n#define PERM_EXECUTE 0b100\n\n#define PERM_ALL PERM_READ | PERM_WRITE | PERM_EXECUTE\n\nint main()\n{\n // Allocate 1 byte for permissions\n char permissions = PERM_READ | PERM_WRITE;\n\n if (permissions & PERM_READ)\n printf(\"write bit set\\n\");\n if (permissions & PERM_WRITE)\n printf(\"read bit set\\n\");\n if (permissions & PERM_EXECUTE)\n printf(\"execute bit set\\n\");\n\n // Output:\n // read bit set\n // write bit set\n}\n```\n\nThis example still wastes 5 bits since we only use 3 out of 8 possible bits of the char type, but I'm sure you get the point. Allocating 3 boolean values independently would waste 7 \\* 3 = 21 bits, so it's a massive improvement. Whenever you find yourself needing multiple boolean values, think twice if you can use this pattern.\n\nMicrocontrollers have a very constrainted environment, therefore bitwise operations are essential in those scenarios. 7 wasted bits are a lot if there are only 4 kb of total memory available. For larger systems we often forget about these constraints, until they add up.\n\n## My Plea\n\n- Be mindful about the software you create.\n- Appreciate the resources at your disposal.\n","frontmatter":{"title":"Booleans are wasted memory","date":"2020-11-17","tags":"note, guide, programming, tech"},"tags":["note","guide","programming","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2020-12-18-update-december.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2020-12-18-update-december.json

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-01-07-delete-facebook.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-07-delete-facebook.json

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-01-11-100daystooffload.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-11-100daystooffload.json

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-01-11-are-humans-still-evolving.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-11-are-humans-still-evolving.json

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-01-13-512kb-club.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-13-512kb-club.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2021-01-13-512kb-club","markdownBody":"\nJavaScript rules the web, literally. In fact, this website is built with JavaScript (Next.js). I recently started to think about if I really needed this much overhead for a simple site like this. After all, I don't have any fancy user interaction features or complex animation that would justify the JavaScript on this page.\n\nThere is a new (no, not that new) philosophy called [the lean web](https://leanweb.dev/). It essentially tries to keep websites tiny and semantically correct. This has many benefits, ranging from less pollution generated by your site to improved SEO, since many search engines favor a semantically correct website over a site that abuses JavaScript to mimic the features, that are baked into html anyway.\n\nIn order to get lean, I decided to join [the 512KB club](https://512kb.club/). This website lists sites that are below 512KB in total (uncompressed, with all dependencies). To get below that mark, I had to remove my face from the frontpage (I'm sure you'll miss it😅), since the image itself was roughly 750KB. I'm now just below 500KB, which qualifies me to join the blue team.\n\n[![Blue Team](https://512kb.club/images/blue-team.svg)](https://512kb.club)\n\nI'm not planning to stop here though. I think keeping a website small and simple is an excellent practice. My next step will be to get rid of all the JS junk on this site and only rely on HTML and CSS. I still want to be able to write my posts in Markdown, so I will have to come up with a way to generate pages from them. A safe bet for this would be to use a SSG like [Hugo](https://gohugo.io/). Frankly, [writing my own simple SSG probably wouldn't hurt either](https://erikwinter.nl/articles/2020/why-i-built-my-own-shitty-static-site-generator/). Let's see how high I can climb the ranks of the 512KB club. Care to join me?\n\nThis is post 003 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"I joined the 512KB club","date":"2021-01-13","tags":"web, javascript, 100DaysToOffload, meta, tech"},"tags":["web","javascript","100DaysToOffload","meta","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-07-five-years-of-blogging","frontmatter":{"title":"Five Years of Blogging","date":"2024-04-07","tags":"note, books, writing, meta"},"tags":["note","books","writing","meta"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2021-01-13-512kb-club","markdownBody":"\nJavaScript rules the web, literally. In fact, this website is built with JavaScript (Next.js). I recently started to think about if I really needed this much overhead for a simple site like this. After all, I don't have any fancy user interaction features or complex animation that would justify the JavaScript on this page.\n\nThere is a new (no, not that new) philosophy called [the lean web](https://leanweb.dev/). It essentially tries to keep websites tiny and semantically correct. This has many benefits, ranging from less pollution generated by your site to improved SEO, since many search engines favor a semantically correct website over a site that abuses JavaScript to mimic the features, that are baked into html anyway.\n\nIn order to get lean, I decided to join [the 512KB club](https://512kb.club/). This website lists sites that are below 512KB in total (uncompressed, with all dependencies). To get below that mark, I had to remove my face from the frontpage (I'm sure you'll miss it😅), since the image itself was roughly 750KB. I'm now just below 500KB, which qualifies me to join the blue team.\n\n[![Blue Team](https://512kb.club/images/blue-team.svg)](https://512kb.club)\n\nI'm not planning to stop here though. I think keeping a website small and simple is an excellent practice. My next step will be to get rid of all the JS junk on this site and only rely on HTML and CSS. I still want to be able to write my posts in Markdown, so I will have to come up with a way to generate pages from them. A safe bet for this would be to use a SSG like [Hugo](https://gohugo.io/). Frankly, [writing my own simple SSG probably wouldn't hurt either](https://erikwinter.nl/articles/2020/why-i-built-my-own-shitty-static-site-generator/). Let's see how high I can climb the ranks of the 512KB club. Care to join me?\n\nThis is post 003 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"I joined the 512KB club","date":"2021-01-13","tags":"web, javascript, 100DaysToOffload, meta, tech"},"tags":["web","javascript","100DaysToOffload","meta","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-07-five-years-of-blogging","frontmatter":{"title":"Five Years of Blogging","date":"2024-04-07","tags":"note, books, writing, meta"},"tags":["note","books","writing","meta"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-01-15-compiling-your-own-kernel.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-15-compiling-your-own-kernel.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2021-01-15-compiling-your-own-kernel","markdownBody":"\nI'm currently in the midst of fiddling around with the kernel a bit, and I figured I just documented my process a bit. Unfortunately, since I'm using a Mac for day to day work, I have to rely on a virtual machine to run anything Linux-related. VirtualBox doesn't support the most recent kernels (5.9 is the most recent supported one), so there won't be any cutting-edge development happening here. I decided to use ubuntu as my guest system, since it's very easy to set up.\n\nSo, the first step is to get the sources. You could simply go ahead and download a specific release from [kernel.org](https://kernel.org/), but since I want to hack on it, I decided to go the git-route. Simply download the sources from [their repo](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/) and check out the tag you want to build.\n\n> **Note**: this might take a while. Their repository is huge! If you want to only need the `HEAD` and want to build on bare-metal (no VirtualBox), you could only clone the latest commit using `git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git --depth=1`.\n\nNext up, you need to generate a `.config`. This file describes which features you want to compile into your kernel. To make a generic config that only compiles drivers for the hardware of your system, you can run the following commands:\n\n```bash\n# Copy the config of your current kernel into the repo\nmake oldconfig\n\n# Only enable modules that are currently used by the system\nmake localmodconfig\n```\n\nNow, let's get to actually compiling the kernel. In my case, I assigned 4 cores to my VM. The `-j` option tells make to run 4 jobs in parallel.\n\n> **Caution**: Just providing -j will freeze your system, since make will try to launch an infinite amount of processes!\n\n```\nmake -j4\n```\n\nAgain, this might take some time. Go for a walk, get a coffee or watch your favorite TV-show. After compilation has finished, we need to install the kernel. To do so, run the following commands:\n\n```\nsudo make modules_install\nsudo make install\n```\n\nIn order to boot, we need to tell our bootloader about our new kernel. Run this command to update your grub config:\n\n```\nsudo update-grub2\n```\n\nAnd voila! Your new kernel should be ready.\n\nReboot the system, and grub should pick up the new kernel and boot to it. If that's not the case, you should be able to pick the kernel from the grub menu under `advanced options`.\n\n## Retrospective\n\nI found that building my own kernel is a highly educational and fun experience. Using VirtualBox is a pain in the `/dev/null` to work with, since it has to add a lot of overhead to the system in order to work. You sometimes have to wait over 6 month until the support for a new kernel arrives. This problem should not apply if you compile on bare metal systems.\n\nThanks for your time!\n\nThis is post 004 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Compiling your own kernel","date":"2021-01-15","tags":"linux, guide, 100DaysToOffload, infrastructure, tech"},"tags":["linux","guide","100DaysToOffload","infrastructure","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2021-01-15-compiling-your-own-kernel","markdownBody":"\nI'm currently in the midst of fiddling around with the kernel a bit, and I figured I just documented my process a bit. Unfortunately, since I'm using a Mac for day to day work, I have to rely on a virtual machine to run anything Linux-related. VirtualBox doesn't support the most recent kernels (5.9 is the most recent supported one), so there won't be any cutting-edge development happening here. I decided to use ubuntu as my guest system, since it's very easy to set up.\n\nSo, the first step is to get the sources. You could simply go ahead and download a specific release from [kernel.org](https://kernel.org/), but since I want to hack on it, I decided to go the git-route. Simply download the sources from [their repo](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/) and check out the tag you want to build.\n\n> **Note**: this might take a while. Their repository is huge! If you want to only need the `HEAD` and want to build on bare-metal (no VirtualBox), you could only clone the latest commit using `git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git --depth=1`.\n\nNext up, you need to generate a `.config`. This file describes which features you want to compile into your kernel. To make a generic config that only compiles drivers for the hardware of your system, you can run the following commands:\n\n```bash\n# Copy the config of your current kernel into the repo\nmake oldconfig\n\n# Only enable modules that are currently used by the system\nmake localmodconfig\n```\n\nNow, let's get to actually compiling the kernel. In my case, I assigned 4 cores to my VM. The `-j` option tells make to run 4 jobs in parallel.\n\n> **Caution**: Just providing -j will freeze your system, since make will try to launch an infinite amount of processes!\n\n```\nmake -j4\n```\n\nAgain, this might take some time. Go for a walk, get a coffee or watch your favorite TV-show. After compilation has finished, we need to install the kernel. To do so, run the following commands:\n\n```\nsudo make modules_install\nsudo make install\n```\n\nIn order to boot, we need to tell our bootloader about our new kernel. Run this command to update your grub config:\n\n```\nsudo update-grub2\n```\n\nAnd voila! Your new kernel should be ready.\n\nReboot the system, and grub should pick up the new kernel and boot to it. If that's not the case, you should be able to pick the kernel from the grub menu under `advanced options`.\n\n## Retrospective\n\nI found that building my own kernel is a highly educational and fun experience. Using VirtualBox is a pain in the `/dev/null` to work with, since it has to add a lot of overhead to the system in order to work. You sometimes have to wait over 6 month until the support for a new kernel arrives. This problem should not apply if you compile on bare metal systems.\n\nThanks for your time!\n\nThis is post 004 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Compiling your own kernel","date":"2021-01-15","tags":"linux, guide, 100DaysToOffload, infrastructure, tech"},"tags":["linux","guide","100DaysToOffload","infrastructure","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-01-18-reasons-the-fediverse-is-better.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-18-reasons-the-fediverse-is-better.json

File diff suppressed because one or more lines are too long

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-01-23-signal-to-noise.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-23-signal-to-noise.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2021-01-23-signal-to-noise","markdownBody":"\nFor a very long time, the thought of leaving GitHub and moving to another platform daunted me. Having more users on one platforms means that more people will contribute to my project, right? Wrong.\n\nThe problem with GitHub is that there's a lot of things going on around you. How many times have you discovered a cool project on GitHub, starred it and never heard from it again? In essence, this is the same phenomenon as with modern social media. A bombardment of positive stimulants makes the user crave for more, letting them forget about previously consumed content. Sure, if you just want to get your code out there, GitHub might be a great place, but if you are just starting out as a developer and you're looking for contributers and feedback, you will probably be very bummed to find out that nobody cares about your work. Many developers are using the platform because other developers are using it. Your project on GitHub is a drop in an ocean of other projects.\n\nA few months ago, I decided to make the leap and switch most of my development over to [Sourcehut](https://sourcehut.org/), a free and open source code-hosting platform. Besides its great tooling (mailing lists, automated builds, etc.), it has the benefit of a high **signal-to-noise ratio**. Less developers are using the platform, but most of them are very passionate about their work. They care about collaborating with others and they believe in what they are doing, which probably lead them to sign up for this platform in the first place.\n\nOf course, switching away from a platform like GitHub alone does not ensure more contributions. You might be trying to advertise your projects by spamming links on popular newsboards and forums, but this only generates **noise**. Instead, you should intentionally talk about your personal journey with the project in a smaller circle. If other developers in your niche see that you continuously give updates about the project and its improvements, they will eventually start to relate to it. Some of them will look at your project and give feedback, or even contribute patches.\n\nThis is post 006 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Signal-to-Noise, or why nobody cares about your GitHub project","date":"2021-01-23","tags":"note, 100DaysToOffload, tech"},"tags":["note","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2021-01-23-signal-to-noise","markdownBody":"\nFor a very long time, the thought of leaving GitHub and moving to another platform daunted me. Having more users on one platforms means that more people will contribute to my project, right? Wrong.\n\nThe problem with GitHub is that there's a lot of things going on around you. How many times have you discovered a cool project on GitHub, starred it and never heard from it again? In essence, this is the same phenomenon as with modern social media. A bombardment of positive stimulants makes the user crave for more, letting them forget about previously consumed content. Sure, if you just want to get your code out there, GitHub might be a great place, but if you are just starting out as a developer and you're looking for contributers and feedback, you will probably be very bummed to find out that nobody cares about your work. Many developers are using the platform because other developers are using it. Your project on GitHub is a drop in an ocean of other projects.\n\nA few months ago, I decided to make the leap and switch most of my development over to [Sourcehut](https://sourcehut.org/), a free and open source code-hosting platform. Besides its great tooling (mailing lists, automated builds, etc.), it has the benefit of a high **signal-to-noise ratio**. Less developers are using the platform, but most of them are very passionate about their work. They care about collaborating with others and they believe in what they are doing, which probably lead them to sign up for this platform in the first place.\n\nOf course, switching away from a platform like GitHub alone does not ensure more contributions. You might be trying to advertise your projects by spamming links on popular newsboards and forums, but this only generates **noise**. Instead, you should intentionally talk about your personal journey with the project in a smaller circle. If other developers in your niche see that you continuously give updates about the project and its improvements, they will eventually start to relate to it. Some of them will look at your project and give feedback, or even contribute patches.\n\nThis is post 006 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Signal-to-Noise, or why nobody cares about your GitHub project","date":"2021-01-23","tags":"note, 100DaysToOffload, tech"},"tags":["note","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-01-26-vim-macros.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-26-vim-macros.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2021-01-26-vim-macros","markdownBody":"\nFor a long time, macros in Vim were a huge mystery for me. I knew they existed, but I didn't know how or why you'd use them. A recent task of mine involved replacing the unsafe operator (`!!`) in a large kotlin codebase with a null-safe operator (`?`). This game me a good opportunity to learn about macros. This is a snippet I encountered numerous times:\n\n```kt\nmLeftButton!!.text = \"Left\"\nmLeftButton!!.setOnClickListener(leftListener)\nmLeftButton!!.visibility = View.VISIBLE\nmRightButton!!.text = \"Right\"\nmRightButton!!.setOnClickListener(rightListener)\nmRightButton!!.visibility = View.VISIBLE\n```\n\nYou could go ahead and change each line individually, or use the IDEs built in \"multi-cursor\" tool to save you some work. But, let me show you how I automated this using a Vim-Plugin for Android Studio. Not that the plugin matter, it will work in every Vim-like editor.\n\nA macro in Vim works like this:\n\n1. Record any sequence of keystrokes and assign them to a key\n1. Execute that sequence as often as you wish\n\nSo let's see how we'd do that.\n\n## Recording a macro\n\nTo record a macro in Vim, you press `q` (In normal mode) followed by a key you want to assign the macro to. So, if you wanted to record a macro and save it to the `q` key, you'd press `qq`. Vim will notify you that a macro is being recorded. Now, you can press the keystrokes that define your actions. When you're done, press `q` in normal mode again to quit your macro.\n\nComing back to my task, I would want to do the following:\n\n1. `qq` Record a macro and save it to the `q` key\n1. `_` - Jump to the beginning of the line\n1. `f!` - Find next occurrence of `!`\n1. `cw` - Change word (Delete word and enter insert mode)\n1. `?.` - Insert the new characters\n1. `<esc>` - Enter normal mode\n1. `j` - go down a line\n1. `q` - Finish macro\n\nIf everything went right, this line:\n\n```\nmLeftButton!!.text = \"Left\"\n```\n\nShould now look like this:\n\n```\nmLeftButton?.text = \"Left\"\n```\n\nand your macro should be saved under the `q` key.\n\n## Using the macro\n\nIn order to use a macro in vim, you press the `@` key, followed by the key the macro is saved under. Since our macro is defined as `q`, we'd press `@q`, and the macro is executed immediately.\n\nLet's take this further. You might have noticed that I went down a line before closing the macro. This becomes handy when you want to execute it many times. In our case we have 6 lines we want to refactor. 1 line has already been altered, so we have to execute it 5 more times. As per usual with vim, you can execute an action n times by specifying a number before doing the action. Let's press `5@q` to execute the macro 5 times. And voila! Our unsafe code is now null-safe.\n\n```kt\nmLeftButton?.text = \"Left\"\nmLeftButton?.setOnClickListener(leftListener)\nmLeftButton?.visibility = View.VISIBLE\nmRightButton?.text = \"Right\"\nmRightButton?.setOnClickListener(rightListener)\nmRightButton?.visibility = View.VISIBLE\n```\n\nMacros are really satisfying to watch, if you ask me!\n\nThis is post 007 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Using Macros in Vim","date":"2021-01-26","tags":"vim, 100DaysToOffload, guide, tech"},"tags":["vim","100DaysToOffload","guide","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2021-01-26-vim-macros","markdownBody":"\nFor a long time, macros in Vim were a huge mystery for me. I knew they existed, but I didn't know how or why you'd use them. A recent task of mine involved replacing the unsafe operator (`!!`) in a large kotlin codebase with a null-safe operator (`?`). This game me a good opportunity to learn about macros. This is a snippet I encountered numerous times:\n\n```kt\nmLeftButton!!.text = \"Left\"\nmLeftButton!!.setOnClickListener(leftListener)\nmLeftButton!!.visibility = View.VISIBLE\nmRightButton!!.text = \"Right\"\nmRightButton!!.setOnClickListener(rightListener)\nmRightButton!!.visibility = View.VISIBLE\n```\n\nYou could go ahead and change each line individually, or use the IDEs built in \"multi-cursor\" tool to save you some work. But, let me show you how I automated this using a Vim-Plugin for Android Studio. Not that the plugin matter, it will work in every Vim-like editor.\n\nA macro in Vim works like this:\n\n1. Record any sequence of keystrokes and assign them to a key\n1. Execute that sequence as often as you wish\n\nSo let's see how we'd do that.\n\n## Recording a macro\n\nTo record a macro in Vim, you press `q` (In normal mode) followed by a key you want to assign the macro to. So, if you wanted to record a macro and save it to the `q` key, you'd press `qq`. Vim will notify you that a macro is being recorded. Now, you can press the keystrokes that define your actions. When you're done, press `q` in normal mode again to quit your macro.\n\nComing back to my task, I would want to do the following:\n\n1. `qq` Record a macro and save it to the `q` key\n1. `_` - Jump to the beginning of the line\n1. `f!` - Find next occurrence of `!`\n1. `cw` - Change word (Delete word and enter insert mode)\n1. `?.` - Insert the new characters\n1. `<esc>` - Enter normal mode\n1. `j` - go down a line\n1. `q` - Finish macro\n\nIf everything went right, this line:\n\n```\nmLeftButton!!.text = \"Left\"\n```\n\nShould now look like this:\n\n```\nmLeftButton?.text = \"Left\"\n```\n\nand your macro should be saved under the `q` key.\n\n## Using the macro\n\nIn order to use a macro in vim, you press the `@` key, followed by the key the macro is saved under. Since our macro is defined as `q`, we'd press `@q`, and the macro is executed immediately.\n\nLet's take this further. You might have noticed that I went down a line before closing the macro. This becomes handy when you want to execute it many times. In our case we have 6 lines we want to refactor. 1 line has already been altered, so we have to execute it 5 more times. As per usual with vim, you can execute an action n times by specifying a number before doing the action. Let's press `5@q` to execute the macro 5 times. And voila! Our unsafe code is now null-safe.\n\n```kt\nmLeftButton?.text = \"Left\"\nmLeftButton?.setOnClickListener(leftListener)\nmLeftButton?.visibility = View.VISIBLE\nmRightButton?.text = \"Right\"\nmRightButton?.setOnClickListener(rightListener)\nmRightButton?.visibility = View.VISIBLE\n```\n\nMacros are really satisfying to watch, if you ask me!\n\nThis is post 007 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Using Macros in Vim","date":"2021-01-26","tags":"vim, 100DaysToOffload, guide, tech"},"tags":["vim","100DaysToOffload","guide","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-01-29-sudo-to-doas.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-01-29-sudo-to-doas.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2021-01-29-sudo-to-doas","markdownBody":"\nYou might have heard that there is currently [a pretty significant vulnerability](https://www.qualys.com/2021/01/26/cve-2021-3156/baron-samedit-heap-based-overflow-sudo.txt) affecting `sudo`, the program we all know and love. It is the de facto standard for when you want to run a command as a priviledged user, but that's really it. Under the hood, sudo is a very powerful tool with a lot of features. It can be used to build out complex permission-systems that span across entire clusters of servers. But all of these features come at a price: **complexity**. Last time I checked, the [source code](https://www.sudo.ws/repos/sudo) of sudo had about 330k lines of code (using cloc as a benchmark). This massive complexity plays a large role in its security.\n\nLuckily, there is a **far** more lightweight alternative to sudo called [doas](https://github.com/Duncaen/OpenDoas.git). It essentially does all the things you'd expect from sudo for your average end user. Doas is written in just over 3k lines of code, which, if you think of it, should be more than enough to provide a tool that executes a command as a priviledged user.\n\n## Setup\n\nWhile there are packages for [some distibutions](https://github.com/slicer69/doas#installation-via-packagesrepositories), I personally had trouble setting it up on arch using yay (for permission reasons, ironically). I recommend going the extra mile and building it from source, which consists of a few commands and some seconds of your time:\n\n```sh\ngit clone https://github.com/slicer69/doas\ncd doas\nmake\nsudo make install\n```\n\nNext, you will need to create a config file at `/usr/local/etc/doas.conf`. Paste the following line into it to give your user root access:\n\n```sh\npermit alice as root\n```\n\nYou obviously want to substitute alice with your username. If you have multiple users on your system, simply duplicate that line and substitute the username accordingly. Just restart your terminal window, and you should be able to run programs as root using doas instead of sudo:\n\n```sh\n➜ ~ doas id\nuid=0(root) gid=0(root) groups=0(root)\n```\n\n## Bonus: Save your muscle memory\n\nIf you still want to \"use\" sudo on your machine, you can set up a simple alias in your `.{bash|zsh|fish}rc`. This will also help with compatibility issues of some scripts, if you decide to ditch the actual sudo from your Box entirely. Just paste this line into your corresponding rc file:\n\n```\nalias sudo=\"doas\"\n```\n\n## Bonus Bonus: Passwordless authentification\n\nYou can setup doas to skip the password prompt every time you run a command with it. Simply add the `nopass` option in your doas configuration file:\n\n```sh\npermit nopass alice as root\n```\n\nI hope you found this useful!\n\nThis is post 008 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"From sudo to doas","date":"2021-01-29","tags":"linux, 100DaysToOffload, guide, tech"},"tags":["linux","100DaysToOffload","guide","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2021-01-29-sudo-to-doas","markdownBody":"\nYou might have heard that there is currently [a pretty significant vulnerability](https://www.qualys.com/2021/01/26/cve-2021-3156/baron-samedit-heap-based-overflow-sudo.txt) affecting `sudo`, the program we all know and love. It is the de facto standard for when you want to run a command as a priviledged user, but that's really it. Under the hood, sudo is a very powerful tool with a lot of features. It can be used to build out complex permission-systems that span across entire clusters of servers. But all of these features come at a price: **complexity**. Last time I checked, the [source code](https://www.sudo.ws/repos/sudo) of sudo had about 330k lines of code (using cloc as a benchmark). This massive complexity plays a large role in its security.\n\nLuckily, there is a **far** more lightweight alternative to sudo called [doas](https://github.com/Duncaen/OpenDoas.git). It essentially does all the things you'd expect from sudo for your average end user. Doas is written in just over 3k lines of code, which, if you think of it, should be more than enough to provide a tool that executes a command as a priviledged user.\n\n## Setup\n\nWhile there are packages for [some distibutions](https://github.com/slicer69/doas#installation-via-packagesrepositories), I personally had trouble setting it up on arch using yay (for permission reasons, ironically). I recommend going the extra mile and building it from source, which consists of a few commands and some seconds of your time:\n\n```sh\ngit clone https://github.com/slicer69/doas\ncd doas\nmake\nsudo make install\n```\n\nNext, you will need to create a config file at `/usr/local/etc/doas.conf`. Paste the following line into it to give your user root access:\n\n```sh\npermit alice as root\n```\n\nYou obviously want to substitute alice with your username. If you have multiple users on your system, simply duplicate that line and substitute the username accordingly. Just restart your terminal window, and you should be able to run programs as root using doas instead of sudo:\n\n```sh\n➜ ~ doas id\nuid=0(root) gid=0(root) groups=0(root)\n```\n\n## Bonus: Save your muscle memory\n\nIf you still want to \"use\" sudo on your machine, you can set up a simple alias in your `.{bash|zsh|fish}rc`. This will also help with compatibility issues of some scripts, if you decide to ditch the actual sudo from your Box entirely. Just paste this line into your corresponding rc file:\n\n```\nalias sudo=\"doas\"\n```\n\n## Bonus Bonus: Passwordless authentification\n\nYou can setup doas to skip the password prompt every time you run a command with it. Simply add the `nopass` option in your doas configuration file:\n\n```sh\npermit nopass alice as root\n```\n\nI hope you found this useful!\n\nThis is post 008 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"From sudo to doas","date":"2021-01-29","tags":"linux, 100DaysToOffload, guide, tech"},"tags":["linux","100DaysToOffload","guide","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-02-02-bem-methodology.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-02-02-bem-methodology.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2021-02-02-bem-methodology","markdownBody":"\nIn the coming weeks, months and years, I will be working on frontend-development as part of my dayjob. These are some personal notes I took during my research about the BEM methodology. If you want to read the official introduction, you should visit [their website](http://getbem.com/).\n\n# Overview - What is BEM?\n\nBEMBlock Element Modifier is a methodology that helps you to create reusable components and code sharing in front-end development. It aims to group css-classes in a meaningful way, making it easier to understand\n\n1. where this class is used\n2. what it describes and\n3. what state the element is in.\n\nThe BEM-notation is divided into three main parts: Blocks, Elements and Modifiers.\n\n## Blocks\n\nA standalone entity that is meaningful on its own. Some examples might be **headers, containers, menus, inputs, checkboxes**, etc.\n\n## Elements\n\nA part of a block that has no standalone meaning and is semantically tied to its block. This could be a **menu item or an input placeholder**.\n\n## Modifiers\n\nA flag on a block or an element. Used to change appearance or behavior. This might be **disabled, checked, fixed, big**, etc.\n\n# Putting it together\n\nA block itself is referenced though its name.\n\n```css\n.button {\n}\n```\n\nTo reference elements inside of the block, you add it to the block element with two underscores (`__`):\n\n```css\n.button {\n}\n.button__text {\n}\n```\n\nIf you want to add a modifier to a block or an element, you separate it with two dashes (`--`):\n\n```css\n.button {\n}\n.button--disabled {\n}\n.button__text--inverted {\n}\n```\n\n# Benefits of BEM\n\n**Modularity**: Block styles never depend on one another. They can easily be moved to other parts of the app.\n\n**Reusability**: Composing styles in a meaningful way reduces the amount of code duplication.\n\n**Structure**: BEM gives your code a solid structure that is both easy to understand and to expand.\n\n# References\n\n- http://getbem.com/\n- https://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/\n\nThis is post 009 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Notes about BEM (Block Element Modifier)","date":"2021-02-02","tags":"note, css, 100DaysToOffload, programming, tech"},"tags":["note","css","100DaysToOffload","programming","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2021-02-02-bem-methodology","markdownBody":"\nIn the coming weeks, months and years, I will be working on frontend-development as part of my dayjob. These are some personal notes I took during my research about the BEM methodology. If you want to read the official introduction, you should visit [their website](http://getbem.com/).\n\n# Overview - What is BEM?\n\nBEMBlock Element Modifier is a methodology that helps you to create reusable components and code sharing in front-end development. It aims to group css-classes in a meaningful way, making it easier to understand\n\n1. where this class is used\n2. what it describes and\n3. what state the element is in.\n\nThe BEM-notation is divided into three main parts: Blocks, Elements and Modifiers.\n\n## Blocks\n\nA standalone entity that is meaningful on its own. Some examples might be **headers, containers, menus, inputs, checkboxes**, etc.\n\n## Elements\n\nA part of a block that has no standalone meaning and is semantically tied to its block. This could be a **menu item or an input placeholder**.\n\n## Modifiers\n\nA flag on a block or an element. Used to change appearance or behavior. This might be **disabled, checked, fixed, big**, etc.\n\n# Putting it together\n\nA block itself is referenced though its name.\n\n```css\n.button {\n}\n```\n\nTo reference elements inside of the block, you add it to the block element with two underscores (`__`):\n\n```css\n.button {\n}\n.button__text {\n}\n```\n\nIf you want to add a modifier to a block or an element, you separate it with two dashes (`--`):\n\n```css\n.button {\n}\n.button--disabled {\n}\n.button__text--inverted {\n}\n```\n\n# Benefits of BEM\n\n**Modularity**: Block styles never depend on one another. They can easily be moved to other parts of the app.\n\n**Reusability**: Composing styles in a meaningful way reduces the amount of code duplication.\n\n**Structure**: BEM gives your code a solid structure that is both easy to understand and to expand.\n\n# References\n\n- http://getbem.com/\n- https://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/\n\nThis is post 009 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Notes about BEM (Block Element Modifier)","date":"2021-02-02","tags":"note, css, 100DaysToOffload, programming, tech"},"tags":["note","css","100DaysToOffload","programming","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-02-07-storage-setup.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-02-07-storage-setup.json

File diff suppressed because one or more lines are too long

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-02-11-10-percent-100daystooffload.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-02-11-10-percent-100daystooffload.json

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-02-17-notes-on-flutter-web.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-02-17-notes-on-flutter-web.json

File diff suppressed because one or more lines are too long

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-02-20-changelogs.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-02-20-changelogs.json

File diff suppressed because one or more lines are too long

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-02-24-vim-terminal-strategies.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-02-24-vim-terminal-strategies.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2021-02-24-vim-terminal-strategies","markdownBody":"\nOne thing that bothered me about vim for a long time, was the lack of a terminal\ndirectly in your editor. If I'm not using Vim, I'm most definetely using VSCode\nand its built-in Terminal. After searching the webs for possible solutions, I\ncame across a couple of strategies to achive this.\n\n## Executing single commands\n\nIf you just want to issue a single command without spawning an entire shell,\nyou can just use the `:!` command:\n\n```\n:! printf \"Hello Sailor\"\n```\n\n## Vims builtin terminal\n\nI couldn't believe my eyes when I read this, but Vim ships with a builtin\nterminal! Executing `:term` will spawn it in your current buffer. How you\nintegrate it in your workflow is up to you. You could use tabs or open a\nhorizontal buffer and spawn it there. I must say that it is rather clunky to\nuse, since its literally a Vim buffer that forwards stdin and stdout to the\nbuffer, but it's there for you to use.\n\n## Vim x Tmux\n\nAnother great alternative is to set up Tmux with two windows, one for Vim and\none for your terminal, and switch between them. This works great on a minimal\nsystem, but on MacOS for example, it is easier to simply use cmd+1 and cmd+2 to\nswitch between two tabs of the Terminal application.\n\n## Pausing and resuming Vim\n\nThis one is my personal favorite. The idea comes from\n[this](https://stackoverflow.com/a/1258318/9046809) stackoverflow answer.\n\nThe plan is to pause the Vim process and resume it later. To pause Vim, you\npress `<ctrl>-z`. This sends the process in the background. Then, to resume the\nprocess, simply issue the `fg` command and Vims process resumes in the\nforeground.\n\n## Conclusion\n\nI'm sure there are many more strategies that could be added to this list. I'd be\ninterested to hear how your setup works! If you liked these techniques, you\nmight be interested in\n[@lopeztel](https://fosstodon.org/web/accounts/211905)s\n[cheat sheet](https://lopeztel.xyz/2021/02/21/my-neovim-cheatsheet/) for Vim.\n\nThis is post 014 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Strategies to use a terminal alongside (Neo)Vim","date":"2021-02-23","tags":"vim, guide, 100DaysToOffload, tech"},"tags":["vim","guide","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2021-02-24-vim-terminal-strategies","markdownBody":"\nOne thing that bothered me about vim for a long time, was the lack of a terminal\ndirectly in your editor. If I'm not using Vim, I'm most definetely using VSCode\nand its built-in Terminal. After searching the webs for possible solutions, I\ncame across a couple of strategies to achive this.\n\n## Executing single commands\n\nIf you just want to issue a single command without spawning an entire shell,\nyou can just use the `:!` command:\n\n```\n:! printf \"Hello Sailor\"\n```\n\n## Vims builtin terminal\n\nI couldn't believe my eyes when I read this, but Vim ships with a builtin\nterminal! Executing `:term` will spawn it in your current buffer. How you\nintegrate it in your workflow is up to you. You could use tabs or open a\nhorizontal buffer and spawn it there. I must say that it is rather clunky to\nuse, since its literally a Vim buffer that forwards stdin and stdout to the\nbuffer, but it's there for you to use.\n\n## Vim x Tmux\n\nAnother great alternative is to set up Tmux with two windows, one for Vim and\none for your terminal, and switch between them. This works great on a minimal\nsystem, but on MacOS for example, it is easier to simply use cmd+1 and cmd+2 to\nswitch between two tabs of the Terminal application.\n\n## Pausing and resuming Vim\n\nThis one is my personal favorite. The idea comes from\n[this](https://stackoverflow.com/a/1258318/9046809) stackoverflow answer.\n\nThe plan is to pause the Vim process and resume it later. To pause Vim, you\npress `<ctrl>-z`. This sends the process in the background. Then, to resume the\nprocess, simply issue the `fg` command and Vims process resumes in the\nforeground.\n\n## Conclusion\n\nI'm sure there are many more strategies that could be added to this list. I'd be\ninterested to hear how your setup works! If you liked these techniques, you\nmight be interested in\n[@lopeztel](https://fosstodon.org/web/accounts/211905)s\n[cheat sheet](https://lopeztel.xyz/2021/02/21/my-neovim-cheatsheet/) for Vim.\n\nThis is post 014 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Strategies to use a terminal alongside (Neo)Vim","date":"2021-02-23","tags":"vim, guide, 100DaysToOffload, tech"},"tags":["vim","guide","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-03-13-git-builtin-lifesaver.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-03-13-git-builtin-lifesaver.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2021-03-13-git-builtin-lifesaver","markdownBody":"\nEveryone was in this situation at some point. You wasted a days worth of work by accidentally deleting a branch. But, all hope is not lost! Git never forgets.\n\nEvery action, be it committing changes, deleting or switching branches, is noted down by Git. To see your latest actions, you can simply run `git reflog` (It's pronounced `ref-log` but `re-flog` sounds just as reasonable):\n\n```\n5704fba HEAD@{45}: commit: docs: update changelog\nb471457 HEAD@{46}: commit: chore: refactor binop checks in parse_expression\n5f5c5d4 HEAD@{47}: commit: fix: struct imports\n76db271 HEAD@{48}: commit: chore: fix clippy warning\nac3e11c HEAD@{49}: commit: fix: circular imports\n0cbdc88 HEAD@{50}: am: lexer: handle ' or \" within the string properly\n27699f9 HEAD@{51}: commit: docs: spec: add notation\n```\n\nCommits in Git are just data that is not associated by anything. If you accidentally delete a branch, the commits will stay where they are, and you can reference them directly. To recreate your deleted branch, simply run this command:\n\n```\ngit checkout -b <branch> <sha>\n```\n\nAnd that's it! Your branch is restored. Remember to commit early and often, or prepare to loose your work!\n\nThis is post 015 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Git's built-in lifesaver","date":"2021-03-13","tags":"git, 100DaysToOffload, guide, tech"},"tags":["git","100DaysToOffload","guide","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2021-03-13-git-builtin-lifesaver","markdownBody":"\nEveryone was in this situation at some point. You wasted a days worth of work by accidentally deleting a branch. But, all hope is not lost! Git never forgets.\n\nEvery action, be it committing changes, deleting or switching branches, is noted down by Git. To see your latest actions, you can simply run `git reflog` (It's pronounced `ref-log` but `re-flog` sounds just as reasonable):\n\n```\n5704fba HEAD@{45}: commit: docs: update changelog\nb471457 HEAD@{46}: commit: chore: refactor binop checks in parse_expression\n5f5c5d4 HEAD@{47}: commit: fix: struct imports\n76db271 HEAD@{48}: commit: chore: fix clippy warning\nac3e11c HEAD@{49}: commit: fix: circular imports\n0cbdc88 HEAD@{50}: am: lexer: handle ' or \" within the string properly\n27699f9 HEAD@{51}: commit: docs: spec: add notation\n```\n\nCommits in Git are just data that is not associated by anything. If you accidentally delete a branch, the commits will stay where they are, and you can reference them directly. To recreate your deleted branch, simply run this command:\n\n```\ngit checkout -b <branch> <sha>\n```\n\nAnd that's it! Your branch is restored. Remember to commit early and often, or prepare to loose your work!\n\nThis is post 015 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Git's built-in lifesaver","date":"2021-03-13","tags":"git, 100DaysToOffload, guide, tech"},"tags":["git","100DaysToOffload","guide","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-04-07-pgp-guide.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-04-07-pgp-guide.json

File diff suppressed because one or more lines are too long

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-05-15-healthchecks-io-with-docker.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-05-15-healthchecks-io-with-docker.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2021-05-15-healthchecks-io-with-docker","markdownBody":"\nI'm currently in the midst of improving the monitoring of my infrastructure. I\nmake heavy use of docker and docker-compose for my hosting, so it's vital to add\nmonitoring for most of the containers.\n\nI'm hosting my own instance of [healthchecks.io](https://healthchecks.io/).\nTheir solution to monitoring involves **you** having to ping **them**, instead\nof the other way around. This let's you add healthchecks to virtually anything\nthat can ping a http-endpoint.\n\ndocker-compose let's you define healthchecks to your config that, when\ncompleting sucessfully, mark the container as \"healthy\". The process of adding\nsuch a healthcheck is simple. First, create a new check in your healthchecks.io\naccount and set the ping interval to 1 minute, or a value you prefer. Then, add\nthis snippet to your docker-compose file:\n\n```yaml\napp:\n image: nextcloud\n ports:\n - 127.0.0.1:8080:80\n healthcheck:\n test:\n [\n \"CMD\",\n \"curl\",\n \"-f\",\n \"https://app-endpoint.tld\",\n \"&&\",\n \"curl\",\n \"-fsS\",\n \"-m\",\n \"10\",\n \"--retry\",\n \"5\",\n \"-o\",\n \"/dev/null\",\n \"https://healthchecks.io/ping/<UUID>\",\n ]\n interval: 60s\n timeout: 10s\n retries: 6\n```\n\nChange the first url to the url of your app. The second URL is the endpoint of\nyour healthchecks.io instance. You can obtain it from the check you configured\nearlier.\n\nThis configuration will try to ping your application and, if successful, notify\nthe healthcheck that the application is healthy. If the app is not reachable or\nthe container is down, the latter request will not be executed and your service\nis marked as \"down\".\n\nIn addition to the healthchecks of my docker containers, I also added basic\nhealthchecks to my servers cronfiles and its backup-commands.\n\nDo you have any suggestions regarding this topic? Feel free to reach out to me\nvia Matrix or email!\n\nThis is post 017 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Docker healthchecks using healthchecks.io","date":"2021-05-15","tags":"docker, 100DaysToOffload, guide, homelab, tech"},"tags":["docker","100DaysToOffload","guide","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2021-05-15-healthchecks-io-with-docker","markdownBody":"\nI'm currently in the midst of improving the monitoring of my infrastructure. I\nmake heavy use of docker and docker-compose for my hosting, so it's vital to add\nmonitoring for most of the containers.\n\nI'm hosting my own instance of [healthchecks.io](https://healthchecks.io/).\nTheir solution to monitoring involves **you** having to ping **them**, instead\nof the other way around. This let's you add healthchecks to virtually anything\nthat can ping a http-endpoint.\n\ndocker-compose let's you define healthchecks to your config that, when\ncompleting sucessfully, mark the container as \"healthy\". The process of adding\nsuch a healthcheck is simple. First, create a new check in your healthchecks.io\naccount and set the ping interval to 1 minute, or a value you prefer. Then, add\nthis snippet to your docker-compose file:\n\n```yaml\napp:\n image: nextcloud\n ports:\n - 127.0.0.1:8080:80\n healthcheck:\n test:\n [\n \"CMD\",\n \"curl\",\n \"-f\",\n \"https://app-endpoint.tld\",\n \"&&\",\n \"curl\",\n \"-fsS\",\n \"-m\",\n \"10\",\n \"--retry\",\n \"5\",\n \"-o\",\n \"/dev/null\",\n \"https://healthchecks.io/ping/<UUID>\",\n ]\n interval: 60s\n timeout: 10s\n retries: 6\n```\n\nChange the first url to the url of your app. The second URL is the endpoint of\nyour healthchecks.io instance. You can obtain it from the check you configured\nearlier.\n\nThis configuration will try to ping your application and, if successful, notify\nthe healthcheck that the application is healthy. If the app is not reachable or\nthe container is down, the latter request will not be executed and your service\nis marked as \"down\".\n\nIn addition to the healthchecks of my docker containers, I also added basic\nhealthchecks to my servers cronfiles and its backup-commands.\n\nDo you have any suggestions regarding this topic? Feel free to reach out to me\nvia Matrix or email!\n\nThis is post 017 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Docker healthchecks using healthchecks.io","date":"2021-05-15","tags":"docker, 100DaysToOffload, guide, homelab, tech"},"tags":["docker","100DaysToOffload","guide","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-08-08-fun-with-pen-and-paper-race-cars.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-08-08-fun-with-pen-and-paper-race-cars.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2021-08-08-fun-with-pen-and-paper-race-cars","markdownBody":"\nI recently came across some fun games that can be played using nothing but a\npen and some paper. One of those games was called \"Race Cars\" and I wondered\nhow on earth you would play a racing game on paper, and the answer is: simple\nmath!\n\n## The core idea\n\nThe goal of the game is to cross the finish line of a hand-drawn race track\nfirst without hitting the edge. Race cars have a velocity that can be adjusted\neach move. If you're too greedy, you will crash. If you hit the breaks too\nearly, another player will win.\n\n## How it's played\n\nWe start out with a hand-drawn race track. The shape really can be anything you\nlike. Just be creative!\n\n![A race track on paper](/assets/paperracer/0.jpg)\n\nNext, each player makes a cross on the starting line. This resembles the\nplayers racecar. Right now, none of the cars is moving. They have a velocity of\n0 on the x axis and 0 on the y axis.\n\n![Two crosses on the starting line](/assets/paperracer/1.jpg)\n\nEach move, a player can accelerate or decelerate his vehicle by 1 on any axis.\nThe first move of each player is somewhat obvious. They want to accelerate\nstraight forward. On our race track, that means accelerate by 1 on the y axis.\n\n![A race car made a move](/assets/paperracer/2.jpg)\n\nNext, we can either keep on accelerating like the red player does, or \"turn\"\nour vehicle left by changing our y velocity from 0 to -1, which gives us a\nvelocity of -1, 1.\n\n![Paper race cars after two moves](/assets/paperracer/3.jpg)\n\nOn a long stretch, the red player wants to overtake blue by keeping his foot on\nthe paddle. Blue on the other hand plays it safe and hits the breaks.\n\n![Paper race cars on a long stretch](/assets/paperracer/4.jpg)\n\nSoon after, red realizes his mistake. Being so busy trying to turn, he's unable\nto hit the breaks. A crash is inevitable. Blue however continues to take the\nturn nice and slow. His humble mind brought him victory!\n\n![The red player right before crashing into a wall](/assets/paperracer/5.jpg)\n\n## It's all about fun\n\nThe concept of this game is very flexible. You can play it with a friend and\nsee who's the fastest paper racer, or by yourself and try to beat your record.\nGetting tired of just cruising around? Introduce the concept of \"items\" that\ngive you a boost or slow down the opponent (think Mario Kart!). If ordinary\ntracks are boring, try adding intersections or obstacles. Can you add a third\ndimension? The sky is the limit. Get out there and be creative.\n\nThis is post 018 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Fun with Pen and Paper: Race Cars","date":"2021-08-08","tags":"fun, guide, 100DaysToOffload"},"tags":["fun","guide","100DaysToOffload"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]},{"slug":"2024-01-05-greg-the-developer","frontmatter":{"title":"Greg, the Developer","date":"2024-01-05","tags":"note, tech, fun, shortstory, writing, programming, practices, devops"},"tags":["note","tech","fun","shortstory","writing","programming","practices","devops"]},{"slug":"2023-12-18-overcoming-air-hunger","frontmatter":{"title":"Overcoming \"air hunger\"","date":"2023-12-18","tags":"100DaysToOffload, guide, note, life, til"},"tags":["100DaysToOffload","guide","note","life","til"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2021-08-08-fun-with-pen-and-paper-race-cars","markdownBody":"\nI recently came across some fun games that can be played using nothing but a\npen and some paper. One of those games was called \"Race Cars\" and I wondered\nhow on earth you would play a racing game on paper, and the answer is: simple\nmath!\n\n## The core idea\n\nThe goal of the game is to cross the finish line of a hand-drawn race track\nfirst without hitting the edge. Race cars have a velocity that can be adjusted\neach move. If you're too greedy, you will crash. If you hit the breaks too\nearly, another player will win.\n\n## How it's played\n\nWe start out with a hand-drawn race track. The shape really can be anything you\nlike. Just be creative!\n\n![A race track on paper](/assets/paperracer/0.jpg)\n\nNext, each player makes a cross on the starting line. This resembles the\nplayers racecar. Right now, none of the cars is moving. They have a velocity of\n0 on the x axis and 0 on the y axis.\n\n![Two crosses on the starting line](/assets/paperracer/1.jpg)\n\nEach move, a player can accelerate or decelerate his vehicle by 1 on any axis.\nThe first move of each player is somewhat obvious. They want to accelerate\nstraight forward. On our race track, that means accelerate by 1 on the y axis.\n\n![A race car made a move](/assets/paperracer/2.jpg)\n\nNext, we can either keep on accelerating like the red player does, or \"turn\"\nour vehicle left by changing our y velocity from 0 to -1, which gives us a\nvelocity of -1, 1.\n\n![Paper race cars after two moves](/assets/paperracer/3.jpg)\n\nOn a long stretch, the red player wants to overtake blue by keeping his foot on\nthe paddle. Blue on the other hand plays it safe and hits the breaks.\n\n![Paper race cars on a long stretch](/assets/paperracer/4.jpg)\n\nSoon after, red realizes his mistake. Being so busy trying to turn, he's unable\nto hit the breaks. A crash is inevitable. Blue however continues to take the\nturn nice and slow. His humble mind brought him victory!\n\n![The red player right before crashing into a wall](/assets/paperracer/5.jpg)\n\n## It's all about fun\n\nThe concept of this game is very flexible. You can play it with a friend and\nsee who's the fastest paper racer, or by yourself and try to beat your record.\nGetting tired of just cruising around? Introduce the concept of \"items\" that\ngive you a boost or slow down the opponent (think Mario Kart!). If ordinary\ntracks are boring, try adding intersections or obstacles. Can you add a third\ndimension? The sky is the limit. Get out there and be creative.\n\nThis is post 018 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Fun with Pen and Paper: Race Cars","date":"2021-08-08","tags":"fun, guide, 100DaysToOffload"},"tags":["fun","guide","100DaysToOffload"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]},{"slug":"2024-01-05-greg-the-developer","frontmatter":{"title":"Greg, the Developer","date":"2024-01-05","tags":"note, tech, fun, shortstory, writing, programming, practices, devops"},"tags":["note","tech","fun","shortstory","writing","programming","practices","devops"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-09-13-fixing-an-annoying-cron-gotcha.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-09-13-fixing-an-annoying-cron-gotcha.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2021-09-13-fixing-an-annoying-cron-gotcha","markdownBody":"\nA while ago I went through my server and reworked my [storage\nsetup](/posts/2021-02-07-storage-setup). As discribed in that blog post, I set\nup daily backups to [Backblaze\nB2](https://www.backblaze.com/cloud-storage) using their amazing CLI\nthrough a cron script. A day went by and I noticed that the\n[healthcheck](/posts/2021-05-15-healthchecks-io-with-docker) didn't pass.\nUnfortunately I didn't have time to fix this problem immediately, so instead I\nexecuted the command by hand every couple of days. One could argue that this in\ntotal took way more time than the actual fix, but hey, I was lazy. In the end,\nI finally dedicated some time to fix this annoying issue.\n\nIt turns out that a command executed by cron doesn't run through sh or bash,\nbut in a minimal environment without your usual environment-variables. As a\nresult, my `b2` command (and many other commands for that matter) won't run as\nexpected, if at all. A quick fix is to run your command through bash or sh\nexplicitly:\n\n```sh\nsh -c \"mycommand\"\n```\n\nAlternatively, if you want all your entries to use sh or bash, you can set the\n`SHELL` variable at the very beginning of your crontab:\n\n```sh\nSHELL=/bin/bash\n\n15 1 * * * some_command\n```\n\n[Here](https://askubuntu.com/a/23438) is an answer that goes into more detail\nabout this. Have a great day!\n\nThis is post 019 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Finally fixing that annoying Cron gotcha","date":"2021-09-13","tags":"linux, guide, 100DaysToOffload, homelab, tech"},"tags":["linux","guide","100DaysToOffload","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2021-09-13-fixing-an-annoying-cron-gotcha","markdownBody":"\nA while ago I went through my server and reworked my [storage\nsetup](/posts/2021-02-07-storage-setup). As discribed in that blog post, I set\nup daily backups to [Backblaze\nB2](https://www.backblaze.com/cloud-storage) using their amazing CLI\nthrough a cron script. A day went by and I noticed that the\n[healthcheck](/posts/2021-05-15-healthchecks-io-with-docker) didn't pass.\nUnfortunately I didn't have time to fix this problem immediately, so instead I\nexecuted the command by hand every couple of days. One could argue that this in\ntotal took way more time than the actual fix, but hey, I was lazy. In the end,\nI finally dedicated some time to fix this annoying issue.\n\nIt turns out that a command executed by cron doesn't run through sh or bash,\nbut in a minimal environment without your usual environment-variables. As a\nresult, my `b2` command (and many other commands for that matter) won't run as\nexpected, if at all. A quick fix is to run your command through bash or sh\nexplicitly:\n\n```sh\nsh -c \"mycommand\"\n```\n\nAlternatively, if you want all your entries to use sh or bash, you can set the\n`SHELL` variable at the very beginning of your crontab:\n\n```sh\nSHELL=/bin/bash\n\n15 1 * * * some_command\n```\n\n[Here](https://askubuntu.com/a/23438) is an answer that goes into more detail\nabout this. Have a great day!\n\nThis is post 019 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Finally fixing that annoying Cron gotcha","date":"2021-09-13","tags":"linux, guide, 100DaysToOffload, homelab, tech"},"tags":["linux","guide","100DaysToOffload","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-10-04-server-side-caching-with-apollo-graphql.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-10-04-server-side-caching-with-apollo-graphql.json

File diff suppressed because one or more lines are too long

1
_next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-12-21-usetoggle-react-hook.json

@ -0,0 +1 @@
{"pageProps":{"post":{"slug":"2021-12-21-usetoggle-react-hook","markdownBody":"\nHere's a useful react hook for situations where you have to keep track of the\nstate of a dialog, popup, etc.:\n\n```js\nimport { useState } from \"react\";\n\nexport default (value) => {\n\tconst [state, setState] = useState(value);\n\n\tconst setStateActive = () => {\n\t\tsetState(true);\n\t};\n\n\tconst setStateInactive = () => {\n\t\tsetState(false);\n\t};\n\n\treturn [state, setStateActive, setStateInactive];\n};\n```\n\nUsage:\n\n```js\nconst SomeComponent = () => {\n\tconst [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] =\n\t\tuseToggle(false);\n\n\treturn (\n\t\t<>\n\t\t\t<Button onClick={openDeleteDialog}>Open Delete Dialog</Button>\n\t\t\t<Dialog isOpen={isDeleteDialogOpen} onClose={closeDeleteDialog}></Dialog>\n\t\t</>\n\t);\n};\n```\n\nThis is post 021 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Quick tip! React useToggle Hook","date":"2021-12-21","tags":"javascript, react, quick-tip, 100DaysToOffload, web, programming, tech"},"tags":["javascript","react","quick-tip","100DaysToOffload","web","programming","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-12-24-notes-on-pruning-chinese-elms.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-12-24-notes-on-pruning-chinese-elms.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2021-12-24-notes-on-pruning-chinese-elms","markdownBody":"\nI recently bought a chinese elm bonsai. To keep it alive and healthy, I devoted\nsome time to learning how to properly prune it.\n\nChinese elms are very robust trees with strong growth. Even in the winter\nseason, I can prune it on a weekly basis. I just watched [this\nvideo](https://www.youtube.com/watch?v=Nsvc2Ll1X2A) which gives some helpful\ntips on pruning.\n\nI noticed that the author let the tree grow heavily to develop stronger\nbranches. Until now, I pruned the branches back to one leaf whenever it had\nabout 5 leaves. However, a branch should only be cut on its woody parts in order\nto develop more shoots, and a branch needs some growth in order to turn to wood.\n**Don't prune the branches too early**!\n\nSecondly, I thought that cutting the branches just behind a leaf would lead to\nmore growth, but I found that this is not true. The branches should be cut just\na bit above the leaf to prevent branch to die back and kill the leaf. It could\nalso lead to the shoot coming out straight instead of angled, which is not\ndesired.\n\nLastly I learned that branches pointing upwards should most likely be pruned,\nsince they take a lot of energy that the tree could use elsewhere, which is also\npointed out in [this video](https://www.youtube.com/watch?v=93c985zOwhs).\n\nHere's a picture of my chinese elm just how I bought it. You can clearly tell\nthat it was cheaply imported from china. It needs a lot of work, but I'm having\na lot of fun learning about this tree!\n\n![Chinese Elm](/assets/chinese_elm.jpeg)\n\nThis is post 022 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Notes on pruning chinese elms","date":"2021-12-24","tags":"bonsai, note, guide, 100DaysToOffload"},"tags":["bonsai","note","guide","100DaysToOffload"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]},{"slug":"2023-12-18-overcoming-air-hunger","frontmatter":{"title":"Overcoming \"air hunger\"","date":"2023-12-18","tags":"100DaysToOffload, guide, note, life, til"},"tags":["100DaysToOffload","guide","note","life","til"]},{"slug":"2023-11-01-tracking-sqlite-database-changes-in-git","frontmatter":{"title":"Tracking SQLite Database Changes in Git","date":"2023-11-01","tags":"100DaysToOffload, guide, note, til, git, tech, sqlite"},"tags":["100DaysToOffload","guide","note","til","git","tech","sqlite"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2021-12-24-notes-on-pruning-chinese-elms","markdownBody":"\nI recently bought a chinese elm bonsai. To keep it alive and healthy, I devoted\nsome time to learning how to properly prune it.\n\nChinese elms are very robust trees with strong growth. Even in the winter\nseason, I can prune it on a weekly basis. I just watched [this\nvideo](https://www.youtube.com/watch?v=Nsvc2Ll1X2A) which gives some helpful\ntips on pruning.\n\nI noticed that the author let the tree grow heavily to develop stronger\nbranches. Until now, I pruned the branches back to one leaf whenever it had\nabout 5 leaves. However, a branch should only be cut on its woody parts in order\nto develop more shoots, and a branch needs some growth in order to turn to wood.\n**Don't prune the branches too early**!\n\nSecondly, I thought that cutting the branches just behind a leaf would lead to\nmore growth, but I found that this is not true. The branches should be cut just\na bit above the leaf to prevent branch to die back and kill the leaf. It could\nalso lead to the shoot coming out straight instead of angled, which is not\ndesired.\n\nLastly I learned that branches pointing upwards should most likely be pruned,\nsince they take a lot of energy that the tree could use elsewhere, which is also\npointed out in [this video](https://www.youtube.com/watch?v=93c985zOwhs).\n\nHere's a picture of my chinese elm just how I bought it. You can clearly tell\nthat it was cheaply imported from china. It needs a lot of work, but I'm having\na lot of fun learning about this tree!\n\n![Chinese Elm](/assets/chinese_elm.jpeg)\n\nThis is post 022 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Notes on pruning chinese elms","date":"2021-12-24","tags":"bonsai, note, guide, 100DaysToOffload"},"tags":["bonsai","note","guide","100DaysToOffload"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]},{"slug":"2023-12-18-overcoming-air-hunger","frontmatter":{"title":"Overcoming \"air hunger\"","date":"2023-12-18","tags":"100DaysToOffload, guide, note, life, til"},"tags":["100DaysToOffload","guide","note","life","til"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2021-12-31-btrfs-on-alpine.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2021-12-31-btrfs-on-alpine.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2021-12-31-btrfs-on-alpine","markdownBody":"\nI'm currently in the midst of migrating some of my infrastructure from the cloud\nto \"on prem\", aka a local server, aka my old PC. I wanted to try alpine linux as\nthe host OS to see how it behaves as a lightweight server distro.\n\nSo far it stands up quite nicely, it has everything you'd expect from a\nlinux-based operating system. The only problem I encountered was getting BTRFS\nto work out of the box. Here are some things you should know when using BTRFS on\nAlpine linux.\n\n### Installing BTRFS\n\nInstalling BTRFS is relatively straight forward. Simply install the package and\ntell Alpine to load the module on startup:\n\n```\napk add btrfs-progs\necho btrfs >> /etc/modules\n```\n\nTo load the module right away, you can use the following command:\n\n```\nmodprobe btrfs\n```\n\n### Mounting a volume\n\nIf you try mounting a btrfs volume via your fstab, you will get an error. This\nis because BTRFS does not know about the drives yet when the filesystems are\nmounted. To work around this, you can create an OpenRC service that runs a\n`btrfs scan` to detect the drives. To do so, create a service under\n`/etc/init.d/btrfs-scan` with the following content:\n\n```sh\n#!/sbin/openrc-run\n\nname=\"btrfs-scan\"\n\ndepend() {\n before localmount\n}\n\nstart() {\n /sbin/btrfs device scan\n}\n```\n\nMake the service executable and register it:\n\n```\nchmod +x /etc/init.d/btrfs-scan\nrc-update add btrfs-scan boot\n```\n\nNow, you should be able to add the volume to your `/etc/fstab`:\n\n```\nUUID=abcdef-0055-4958-990f-1413ed1186ec /var/data btrfs defaults,nofail,subvol=@ 0 0\n```\n\nAfter a reboot, you should be able to see the drive mounted at `/var/data`.\n\n### Resources\n\n- [Nathan Parsons - \"Using BTRFS on Alpine Linux\"](https://nparsons.uk/blog/using-btrfs-on-alpine-linux)\n- [A bug report about this problem](https://gitlab-test.alpinelinux.org/alpine/aports/-/issues/9539)\n\nThis is post 023 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"BTRFS on Alpine Linux","date":"2021-12-31","tags":"linux, infrastructure, note, guide, 100DaysToOffload, homelab, tech"},"tags":["linux","infrastructure","note","guide","100DaysToOffload","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2021-12-31-btrfs-on-alpine","markdownBody":"\nI'm currently in the midst of migrating some of my infrastructure from the cloud\nto \"on prem\", aka a local server, aka my old PC. I wanted to try alpine linux as\nthe host OS to see how it behaves as a lightweight server distro.\n\nSo far it stands up quite nicely, it has everything you'd expect from a\nlinux-based operating system. The only problem I encountered was getting BTRFS\nto work out of the box. Here are some things you should know when using BTRFS on\nAlpine linux.\n\n### Installing BTRFS\n\nInstalling BTRFS is relatively straight forward. Simply install the package and\ntell Alpine to load the module on startup:\n\n```\napk add btrfs-progs\necho btrfs >> /etc/modules\n```\n\nTo load the module right away, you can use the following command:\n\n```\nmodprobe btrfs\n```\n\n### Mounting a volume\n\nIf you try mounting a btrfs volume via your fstab, you will get an error. This\nis because BTRFS does not know about the drives yet when the filesystems are\nmounted. To work around this, you can create an OpenRC service that runs a\n`btrfs scan` to detect the drives. To do so, create a service under\n`/etc/init.d/btrfs-scan` with the following content:\n\n```sh\n#!/sbin/openrc-run\n\nname=\"btrfs-scan\"\n\ndepend() {\n before localmount\n}\n\nstart() {\n /sbin/btrfs device scan\n}\n```\n\nMake the service executable and register it:\n\n```\nchmod +x /etc/init.d/btrfs-scan\nrc-update add btrfs-scan boot\n```\n\nNow, you should be able to add the volume to your `/etc/fstab`:\n\n```\nUUID=abcdef-0055-4958-990f-1413ed1186ec /var/data btrfs defaults,nofail,subvol=@ 0 0\n```\n\nAfter a reboot, you should be able to see the drive mounted at `/var/data`.\n\n### Resources\n\n- [Nathan Parsons - \"Using BTRFS on Alpine Linux\"](https://nparsons.uk/blog/using-btrfs-on-alpine-linux)\n- [A bug report about this problem](https://gitlab-test.alpinelinux.org/alpine/aports/-/issues/9539)\n\nThis is post 023 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"BTRFS on Alpine Linux","date":"2021-12-31","tags":"linux, infrastructure, note, guide, 100DaysToOffload, homelab, tech"},"tags":["linux","infrastructure","note","guide","100DaysToOffload","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-01-28-til-how-to-get-the-selected-language-of-a-browser.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-01-28-til-how-to-get-the-selected-language-of-a-browser.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-01-28-til-how-to-get-the-selected-language-of-a-browser","markdownBody":"\nToday I learned how to get the selected language of a browser.\n\nIt's super simple!\n\n```js\nconst userLang = navigator.language || navigator.userLanguage;\n```\n\n## An interesting discovery\n\nEventhough I'm using a chromium-based browser, the user-agent and some other\nfields of the `navigator` object imply that I'm running Mozilla Netscape 5.0.\nThis is a relic of the past, where the user agent heavily influenced the look\nand feel of a served website. Nowadays, all rendering engines work more or less\nequally, but back then, browsers tried to be as good as the market leader, so\nthey disquised themselves as Netscape. This podcast episode goes into more\ndetail about how this developed (jump to minute 3 to listen to this topic):\n\n<iframe style=\"border-radius:12px\" src=\"https://open.spotify.com/embed/episode/71URVFdhF6pcUBRhxerDIV?utm_source=generator&t=190\" width=\"100%\" height=\"232\" frameBorder=\"0\" allowfullscreen=\"\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\"></iframe>\n\n---\n\nThis is post 024 of [#100DaysToOffload](https://100daystooffload.com/).\n\n## Resources\n\n- [Stack Overflow Thread on getting the user language](https://stackoverflow.com/questions/8199760/how-to-get-the-browser-language-using-javascript)\n- [Full link to the Podcast episode](https://corecursive.com/internet-is-duct-tape/#)\n","frontmatter":{"title":"TIL how to get the active language of a browser","date":"2022-01-28","tags":"note, til, javascript, web, 100DaysToOffload, tech"},"tags":["note","til","javascript","web","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-01-28-til-how-to-get-the-selected-language-of-a-browser","markdownBody":"\nToday I learned how to get the selected language of a browser.\n\nIt's super simple!\n\n```js\nconst userLang = navigator.language || navigator.userLanguage;\n```\n\n## An interesting discovery\n\nEventhough I'm using a chromium-based browser, the user-agent and some other\nfields of the `navigator` object imply that I'm running Mozilla Netscape 5.0.\nThis is a relic of the past, where the user agent heavily influenced the look\nand feel of a served website. Nowadays, all rendering engines work more or less\nequally, but back then, browsers tried to be as good as the market leader, so\nthey disquised themselves as Netscape. This podcast episode goes into more\ndetail about how this developed (jump to minute 3 to listen to this topic):\n\n<iframe style=\"border-radius:12px\" src=\"https://open.spotify.com/embed/episode/71URVFdhF6pcUBRhxerDIV?utm_source=generator&t=190\" width=\"100%\" height=\"232\" frameBorder=\"0\" allowfullscreen=\"\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\"></iframe>\n\n---\n\nThis is post 024 of [#100DaysToOffload](https://100daystooffload.com/).\n\n## Resources\n\n- [Stack Overflow Thread on getting the user language](https://stackoverflow.com/questions/8199760/how-to-get-the-browser-language-using-javascript)\n- [Full link to the Podcast episode](https://corecursive.com/internet-is-duct-tape/#)\n","frontmatter":{"title":"TIL how to get the active language of a browser","date":"2022-01-28","tags":"note, til, javascript, web, 100DaysToOffload, tech"},"tags":["note","til","javascript","web","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-03-18-fix-traefik-proxy-issues.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-03-18-fix-traefik-proxy-issues.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-03-18-fix-traefik-proxy-issues","markdownBody":"\nAfter changing my proxy from NGINX to Traefik, I noticed that some of my\nservices started misbehaving.\n\nIn particular, my instance of\n[BirdsiteLive](https://github.com/NicolasConstant/BirdsiteLive)\n([birdsite.slashdev.space](https://birdsite.slashdev.space)) had issues\nforwarding tweets to the\n[Fediverse](https://garrit.xyz/posts/2021-01-18-reasons-the-fediverse-is-better).\n\nThe only difference between my old NGINX and my Traefik config were the headers.\nI didn't think that that's what's causing the issue, but after digging around a\nbit I figured out what's wrong. I still can't wrap my head around it entirely,\nbut it has something to do with forwarding external `https` requests to internal\n`http` services, since the `x-forwarded-` headers where missing in the forwarded\nrequests.\n\nIn the world of NGINX, we can instruct the proxy to forward _all_ headers using\nthis directive:\n\n```conf\nproxy_pass_request_headers on;\n```\n\nwhich takes care of the issue. In Traefik, it's a bit more convoluted. Traefik\ncan use a combination of \"Entrypoints\" and middleware to route traffic around.\nIn my setup, I use a `webSecure` entrypoint listening for SSL/TLS traffic, and a\n`web` entrypoint that just redirects to `webSecure`:\n\n```yaml\nentryPoints:\n web:\n address: :80\n http:\n redirections:\n entryPoint:\n to: \"websecure\"\n scheme: \"https\"\n\n websecure:\n address: :443\n```\n\nApparently, some services send requests to the `web` entrypoint, and the\n`x-forwarded-for` headers are dropped. To prevent this, you can set the\n`proxyProtocol` and `forwardedHeaders` in the `web` entrypoint to `insecure`,\nlike so:\n\n```yaml\nentryPoints:\n web:\n address: :80\n proxyProtocol:\n insecure: true\n forwardedHeaders:\n insecure: true\n # ...\n# ...\n```\n\nI'm sure there's a reason why this is marked as `insecure`, but it behaves just\nlike the NGINX counterpart, so I didn't bother digging deeper into the matter.\nMaybe one day I'll come back to properly fix this.\n\nIf you want to read more, check out\n[this](https://medium.com/@_jonas/traefik-kubernetes-ingress-and-x-forwarded-headers-82194d319b0e)\narticle on Medium. It explains the issue in more detail.\n\n---\n\nThis is post 025 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Fixing Traefik Proxy Issues","date":"2022-03-18","tags":"note, guide, infrastructure, web, 100DaysToOffload, homelab, tech"},"tags":["note","guide","infrastructure","web","100DaysToOffload","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-03-18-fix-traefik-proxy-issues","markdownBody":"\nAfter changing my proxy from NGINX to Traefik, I noticed that some of my\nservices started misbehaving.\n\nIn particular, my instance of\n[BirdsiteLive](https://github.com/NicolasConstant/BirdsiteLive)\n([birdsite.slashdev.space](https://birdsite.slashdev.space)) had issues\nforwarding tweets to the\n[Fediverse](https://garrit.xyz/posts/2021-01-18-reasons-the-fediverse-is-better).\n\nThe only difference between my old NGINX and my Traefik config were the headers.\nI didn't think that that's what's causing the issue, but after digging around a\nbit I figured out what's wrong. I still can't wrap my head around it entirely,\nbut it has something to do with forwarding external `https` requests to internal\n`http` services, since the `x-forwarded-` headers where missing in the forwarded\nrequests.\n\nIn the world of NGINX, we can instruct the proxy to forward _all_ headers using\nthis directive:\n\n```conf\nproxy_pass_request_headers on;\n```\n\nwhich takes care of the issue. In Traefik, it's a bit more convoluted. Traefik\ncan use a combination of \"Entrypoints\" and middleware to route traffic around.\nIn my setup, I use a `webSecure` entrypoint listening for SSL/TLS traffic, and a\n`web` entrypoint that just redirects to `webSecure`:\n\n```yaml\nentryPoints:\n web:\n address: :80\n http:\n redirections:\n entryPoint:\n to: \"websecure\"\n scheme: \"https\"\n\n websecure:\n address: :443\n```\n\nApparently, some services send requests to the `web` entrypoint, and the\n`x-forwarded-for` headers are dropped. To prevent this, you can set the\n`proxyProtocol` and `forwardedHeaders` in the `web` entrypoint to `insecure`,\nlike so:\n\n```yaml\nentryPoints:\n web:\n address: :80\n proxyProtocol:\n insecure: true\n forwardedHeaders:\n insecure: true\n # ...\n# ...\n```\n\nI'm sure there's a reason why this is marked as `insecure`, but it behaves just\nlike the NGINX counterpart, so I didn't bother digging deeper into the matter.\nMaybe one day I'll come back to properly fix this.\n\nIf you want to read more, check out\n[this](https://medium.com/@_jonas/traefik-kubernetes-ingress-and-x-forwarded-headers-82194d319b0e)\narticle on Medium. It explains the issue in more detail.\n\n---\n\nThis is post 025 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Fixing Traefik Proxy Issues","date":"2022-03-18","tags":"note, guide, infrastructure, web, 100DaysToOffload, homelab, tech"},"tags":["note","guide","infrastructure","web","100DaysToOffload","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-03-24-swapping-numbers-without-temp.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-03-24-swapping-numbers-without-temp.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-03-24-swapping-numbers-without-temp","markdownBody":"\nEver wondered how to swap two numbers without using a temporary variable?\n\nI just found this very old note that I thought is worth sharing. The trick is\nquite old and you might already know about this, but when I started out with\nprogramming, it blew my mind.\n\nIn school, we get taught to use a temporary\nvariable to swap two numbers:\n\n```js\nlet a = 5;\nlet b = 10;\n\nlet temp = a;\n\na = b; // a = 10\nb = temp; // b = 5\n```\n\nBut by using some arithmetic, we can save us a few bytes of memory:\n\n```js\nlet a = 5;\nlet b = 10;\n\na = a + b; // a = 15 ; b = 10\nb = a - b; // a = 15 ; b = 5\na = a - b; // a = 10 ; b = 5\n```\n\nPlease **never** use this in any production code. The less we have to think\nabout a piece of code, the better it is. It's a fun thought experiment\nnevertheless!\n\n---\n\nThis is post 026 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Swapping two Numbers without Temporary Variables","date":"2022-03-24","tags":"note, programming, 100DaysToOffload, tech"},"tags":["note","programming","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-03-24-swapping-numbers-without-temp","markdownBody":"\nEver wondered how to swap two numbers without using a temporary variable?\n\nI just found this very old note that I thought is worth sharing. The trick is\nquite old and you might already know about this, but when I started out with\nprogramming, it blew my mind.\n\nIn school, we get taught to use a temporary\nvariable to swap two numbers:\n\n```js\nlet a = 5;\nlet b = 10;\n\nlet temp = a;\n\na = b; // a = 10\nb = temp; // b = 5\n```\n\nBut by using some arithmetic, we can save us a few bytes of memory:\n\n```js\nlet a = 5;\nlet b = 10;\n\na = a + b; // a = 15 ; b = 10\nb = a - b; // a = 15 ; b = 5\na = a - b; // a = 10 ; b = 5\n```\n\nPlease **never** use this in any production code. The less we have to think\nabout a piece of code, the better it is. It's a fun thought experiment\nnevertheless!\n\n---\n\nThis is post 026 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Swapping two Numbers without Temporary Variables","date":"2022-03-24","tags":"note, programming, 100DaysToOffload, tech"},"tags":["note","programming","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-04-25-weeknote-16-2022.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-04-25-weeknote-16-2022.json

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-04-28-hello-to-all-the-new-mastodon-users.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-04-28-hello-to-all-the-new-mastodon-users.json

File diff suppressed because one or more lines are too long

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-04-29-weeknote-17-2022.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-04-29-weeknote-17-2022.json

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-05-06-weeknote-18-2022.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-05-06-weeknote-18-2022.json

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-05-24-cloning-windows-to-a-new-drive.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-05-24-cloning-windows-to-a-new-drive.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-05-24-cloning-windows-to-a-new-drive","markdownBody":"\nMy grandpa has been using his current computer for about 10 years now. After\nsuch a long time, the system has become quite slow and bulky. Back then it was\nrelatively normal to use a HDD as a primary hard drive, which adds to the slow\nexperience. It was time for an upgrade!\n\n> **TL;DR**: Use [Clonezilla](https://clonezilla.org/) on a live usb stick to\n> create an exact copy of your old drive onto your new one.\n\nI got him a 512 GB SSD, which, conveniently, is the same size of his current\nHDD. While installing the new drive alongside his existing one, I thought about\nhow to copy the existing Windows-installation.\n\nNaïvely, I thought that I could just `dd` the contents of the HDD onto the new\ndrive would work, since, _every byte is copied as is_, or at least that's what I\nthought. Turns out it wasn't that easy. I'm sure it would've worked if I was\nmore careful, but by default, `dd` just wipes over each byte, not caring if it\nmade a mistake. After very long 5 hours, I came back to the PC to see that it\nfinished copying the 512 GB (yes, it's not just copying the data, it's copying\nthe entire partition!). In a super excited mood, I restarted the PC and selected\nthe SSD as a boot medium. Aaaaand... nothing. Windows tried to repair some stuff\nbut it wasn't successful. I fiddled around with the boot partition a bit, but I\nhad to give up after an hour or so.\n\n## The second attempt\n\nAfter researching a bit (I should've done that sooner...) I stumbled across\n[Clonezilla](https://clonezilla.org/), a Linux distribution custom-built for\nthis purpose. I flashed it onto a usb-stick and started the cloning process.\nAfter just 20 minutes (!), it was done cloning the existing data. The process is\nextremely simple!\n\nBefore rebooting, I disconnected the old drive to make sure that there's no\nfunny business going on. Apparently, Windows had to self-adjust UIDs of the\ndrives, but after a short \"Preparing Windows\" animation, the system started up\nas expected. **Success**!!\n\nThe performance of the new hard drive is amazing, at least compared to the HDD\nmy grandpa had before. Plus, we can use the existing HDD to take full system\nbackups every now and then, using the same process.\n\nThis is post 031 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Cloning Windows to a new drive","date":"2022-05-24","tags":"note, guide, windows, til, 100DaysToOffload, tech"},"tags":["note","guide","windows","til","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-05-24-cloning-windows-to-a-new-drive","markdownBody":"\nMy grandpa has been using his current computer for about 10 years now. After\nsuch a long time, the system has become quite slow and bulky. Back then it was\nrelatively normal to use a HDD as a primary hard drive, which adds to the slow\nexperience. It was time for an upgrade!\n\n> **TL;DR**: Use [Clonezilla](https://clonezilla.org/) on a live usb stick to\n> create an exact copy of your old drive onto your new one.\n\nI got him a 512 GB SSD, which, conveniently, is the same size of his current\nHDD. While installing the new drive alongside his existing one, I thought about\nhow to copy the existing Windows-installation.\n\nNaïvely, I thought that I could just `dd` the contents of the HDD onto the new\ndrive would work, since, _every byte is copied as is_, or at least that's what I\nthought. Turns out it wasn't that easy. I'm sure it would've worked if I was\nmore careful, but by default, `dd` just wipes over each byte, not caring if it\nmade a mistake. After very long 5 hours, I came back to the PC to see that it\nfinished copying the 512 GB (yes, it's not just copying the data, it's copying\nthe entire partition!). In a super excited mood, I restarted the PC and selected\nthe SSD as a boot medium. Aaaaand... nothing. Windows tried to repair some stuff\nbut it wasn't successful. I fiddled around with the boot partition a bit, but I\nhad to give up after an hour or so.\n\n## The second attempt\n\nAfter researching a bit (I should've done that sooner...) I stumbled across\n[Clonezilla](https://clonezilla.org/), a Linux distribution custom-built for\nthis purpose. I flashed it onto a usb-stick and started the cloning process.\nAfter just 20 minutes (!), it was done cloning the existing data. The process is\nextremely simple!\n\nBefore rebooting, I disconnected the old drive to make sure that there's no\nfunny business going on. Apparently, Windows had to self-adjust UIDs of the\ndrives, but after a short \"Preparing Windows\" animation, the system started up\nas expected. **Success**!!\n\nThe performance of the new hard drive is amazing, at least compared to the HDD\nmy grandpa had before. Plus, we can use the existing HDD to take full system\nbackups every now and then, using the same process.\n\nThis is post 031 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Cloning Windows to a new drive","date":"2022-05-24","tags":"note, guide, windows, til, 100DaysToOffload, tech"},"tags":["note","guide","windows","til","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-05-31-database-server-migration-cheat-sheet.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-05-31-database-server-migration-cheat-sheet.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-05-31-database-server-migration-cheat-sheet","markdownBody":"\nI just finished migrating a postgres database to a new host. To remember how to\ndo it next time, I'm writing down the commands I used here.\n\nI usually just shut down the database and then copy the local directory where\nthe volume was mounted onto the new host. This time though, I seemed to be\ngetting some I/O errors, so I had to do it the \"right\" way.\n\nTo be fair, this note is based on\n[this](https://www.netguru.com/blog/how-to-dump-and-restore-postgresql-database)\nguide. I modified it to fit my workflow with docker.\n\n## Creating a dump\n\nLog into the old host:\n\n```\nssh <user>@host\n```\n\nConnect to the postgres-container:\n\n```\ndocker exec -ti myservice_db_1 /bin/bash\n```\n\nCreate a dump. You can name your dump as you wish - I'm using dates to\ndistinguish multiple dumps:\n\n```\npg_dump -U db_user db_name > db_name_20220531.sql\n```\n\nCopy the dump to the host machine:\n\n```\ndocker cp myservice_db_1:/db_name_20220531.sql ~/\n```\n\n## Moving the dump to the new host\n\nThe easiest way to get the dump off of the old server and onto the new one is to\nuse your local machine as a middleman.\n\nFirst, download the dump to your machine:\n\n```\nscp <user>@<host>:~/db_name_20220531.sql .\n```\n\nThen, do the same thing but reversed, with the new host:\n\n```\nscp ./db_name_20220531.sql <user>@<host>:~/\n```\n\n## Restoring the dump\n\nFirst, connect to the new host:\n\n```\nssh <user>@<host>\n```\n\nAssuming the docker service is already running on the new host, attach to the\ndb-container, just like above:\n\n```\ndocker exec -ti myservice_db_1 /bin/bash\n```\n\nThis time, we have to do some fiddling on the database, so attach a session to\npostgres using their cli:\n\n```\npsql -U my_user\n```\n\nBefore \"resetting\" the existing DB to apply the dump, we have to connect to\nanother database. The `postgres` DB is always there, so you can use that.\n\n```\n\\c postgres\n```\n\nNow, we drop the existing DB and re-add it:\n\n```sql\ndrop database database_name;\ncreate database database_name with owner your_user_name;\n```\n\nAnd now, the moment you've been waiting for! Leave the psql-session and apply\nthe dump:\n\n```\npsql -U db_user db_name < db_name_20220531.sql\n```\n\nThat's all! You now have the exact copy of production database available on your\nmachine.\n\nThis is post 032 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Postgres Docker Container Migration Cheat Sheet","date":"2022-05-31","tags":"note, guide, 100DaysToOffload, database, docker, postgres, homelab, tech"},"tags":["note","guide","100DaysToOffload","database","docker","postgres","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-05-31-database-server-migration-cheat-sheet","markdownBody":"\nI just finished migrating a postgres database to a new host. To remember how to\ndo it next time, I'm writing down the commands I used here.\n\nI usually just shut down the database and then copy the local directory where\nthe volume was mounted onto the new host. This time though, I seemed to be\ngetting some I/O errors, so I had to do it the \"right\" way.\n\nTo be fair, this note is based on\n[this](https://www.netguru.com/blog/how-to-dump-and-restore-postgresql-database)\nguide. I modified it to fit my workflow with docker.\n\n## Creating a dump\n\nLog into the old host:\n\n```\nssh <user>@host\n```\n\nConnect to the postgres-container:\n\n```\ndocker exec -ti myservice_db_1 /bin/bash\n```\n\nCreate a dump. You can name your dump as you wish - I'm using dates to\ndistinguish multiple dumps:\n\n```\npg_dump -U db_user db_name > db_name_20220531.sql\n```\n\nCopy the dump to the host machine:\n\n```\ndocker cp myservice_db_1:/db_name_20220531.sql ~/\n```\n\n## Moving the dump to the new host\n\nThe easiest way to get the dump off of the old server and onto the new one is to\nuse your local machine as a middleman.\n\nFirst, download the dump to your machine:\n\n```\nscp <user>@<host>:~/db_name_20220531.sql .\n```\n\nThen, do the same thing but reversed, with the new host:\n\n```\nscp ./db_name_20220531.sql <user>@<host>:~/\n```\n\n## Restoring the dump\n\nFirst, connect to the new host:\n\n```\nssh <user>@<host>\n```\n\nAssuming the docker service is already running on the new host, attach to the\ndb-container, just like above:\n\n```\ndocker exec -ti myservice_db_1 /bin/bash\n```\n\nThis time, we have to do some fiddling on the database, so attach a session to\npostgres using their cli:\n\n```\npsql -U my_user\n```\n\nBefore \"resetting\" the existing DB to apply the dump, we have to connect to\nanother database. The `postgres` DB is always there, so you can use that.\n\n```\n\\c postgres\n```\n\nNow, we drop the existing DB and re-add it:\n\n```sql\ndrop database database_name;\ncreate database database_name with owner your_user_name;\n```\n\nAnd now, the moment you've been waiting for! Leave the psql-session and apply\nthe dump:\n\n```\npsql -U db_user db_name < db_name_20220531.sql\n```\n\nThat's all! You now have the exact copy of production database available on your\nmachine.\n\nThis is post 032 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Postgres Docker Container Migration Cheat Sheet","date":"2022-05-31","tags":"note, guide, 100DaysToOffload, database, docker, postgres, homelab, tech"},"tags":["note","guide","100DaysToOffload","database","docker","postgres","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-06-02-tar-commands.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-06-02-tar-commands.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-06-02-tar-commands","markdownBody":"\n> **Update**: [@kaushalmodi@mastodon.technology](https://mastodon.technology/@kaushalmodi)\n> replied to this post with a way more complete cheat sheet. If you don't want\n> to hear me rant about tar and actually want to get good at it, go read their\n> post instead:\n>\n> https://scripter.co/disarming-the-tar-bomb-in-10-seconds/\n\nGod dammit. I can't tell you how often I had to look up how to create or\nextract a tar archive on linux. There are SOO many options!!\n\n![xkcd 1168](https://imgs.xkcd.com/comics/tar_2x.png)\n\n## Let's settle this once and for all\n\nHere's how you create an archive:\n\n```\ntar cf archive.tar directory\n```\n\nTry to remember \"Create File\".\n\nAnd here's how you extract an archive:\n\n```\ntar xf archive.tar\n```\n\nFor this one, try to remember \"(e)Xtract File\".\n\nAnd if there's some other compressions in the mix: keep looking it up! A more\ncomprehensive cheat sheet can be found here:\nhttps://simplecheatsheet.com/linux-tar-files/\n\nSorry for this dumb post. I'm sure you can relate to my feelings. ;)\n\nThis is post 033 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Here's the tar command you keep looking for","date":"2022-06-02","tags":"note, 100DaysToOffload, linux, tech"},"tags":["note","100DaysToOffload","linux","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-06-02-tar-commands","markdownBody":"\n> **Update**: [@kaushalmodi@mastodon.technology](https://mastodon.technology/@kaushalmodi)\n> replied to this post with a way more complete cheat sheet. If you don't want\n> to hear me rant about tar and actually want to get good at it, go read their\n> post instead:\n>\n> https://scripter.co/disarming-the-tar-bomb-in-10-seconds/\n\nGod dammit. I can't tell you how often I had to look up how to create or\nextract a tar archive on linux. There are SOO many options!!\n\n![xkcd 1168](https://imgs.xkcd.com/comics/tar_2x.png)\n\n## Let's settle this once and for all\n\nHere's how you create an archive:\n\n```\ntar cf archive.tar directory\n```\n\nTry to remember \"Create File\".\n\nAnd here's how you extract an archive:\n\n```\ntar xf archive.tar\n```\n\nFor this one, try to remember \"(e)Xtract File\".\n\nAnd if there's some other compressions in the mix: keep looking it up! A more\ncomprehensive cheat sheet can be found here:\nhttps://simplecheatsheet.com/linux-tar-files/\n\nSorry for this dumb post. I'm sure you can relate to my feelings. ;)\n\nThis is post 033 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Here's the tar command you keep looking for","date":"2022-06-02","tags":"note, 100DaysToOffload, linux, tech"},"tags":["note","100DaysToOffload","linux","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

1
_next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-06-10-a-list-of-bugs-in-macos.json

@ -0,0 +1 @@
{"pageProps":{"post":{"slug":"2022-06-10-a-list-of-bugs-in-macos","markdownBody":"\nI've been using MacOS for years, and I was always happy with it. However, it\nhas some really annoying problems that don't seem to get attention by Apple.\nThis is a list of things that personally bother me. I will try to update it\nwhenever I encounter new issues.\n\n- ~~When plugging in a external monitor, some native Windows can't be used with a\n mouse anymore. Restart required to fix.~~ (This seems to be fixed)\n- Dash-to-dock sometimes doesn't work for fullscreen-applications.\n- When opening a fullscreen window from the workspace-overview, the dock\n sometimes stays visible. Has to be manually hovered to hide.\n- When using a chromium-based browser on an external monitor in\n fullscreen-mode, the menu-bar sometimes doesn't appear when hovered.\n- When switching from the internal to an external monitor, the workspace\n alignment is not how I left it.\n\nThis is post 034 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"A list of bugs in MacOS","date":"2022-06-14","tags":"note, 100DaysToOffload, MacOS, tech, rant"},"tags":["note","100DaysToOffload","MacOS","tech","rant"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-06-29-the-only-true-answer-to-tabs-vs-spaces.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-06-29-the-only-true-answer-to-tabs-vs-spaces.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-06-29-the-only-true-answer-to-tabs-vs-spaces","markdownBody":"\nI recently dove into a new project at work. We're starting from a blank page,\nso of course this classic question came up:\n\n> \"So should we use tabs or spaces for our formatting?\"\n\nOne of my teammates explained to us why the only logical answer to this is\n\"Tabs\", and you'll soon know why.\n\n## The problem\n\nMost formatters, by default, use either two or four spaces for indentation by\ndefault. The [Prettier](https://prettier.io/) formatter does this, and it\nsomewhat became the norm for JavaScript projects. This has one huge downside\nthough: everyone on the team has to agree, or live with this standard.\n\nNowadays, almost all editors come with the ability to change the preferred\nindentation settings, which will be overridden by the settings of the\nformatter. I prefer an indentation of 4 spaces, which is reflected in all of my\ncode. If I'm working on a project that uses an indentation of 2 spaces via\nprettier, my preference will be overridden when formatting the code.\n\n## Just use tabs\n\nThe solution to this problem is simple: Create a `.editorconfig` file and set\nthe indentation style to tab, without a width:\n\n```editorconfig\nroot = true\n\n[*]\nend_of_line = lf\ncharset = utf-8\nindent_style = tab\n```\n\nAlmost all editors will be able to pick this file up and configure some\nproject-wide settings. If your editor is configured to use a indent width of 4,\nthis setting will be respected. If you're a maniac that indents their code with\n8 spaces, you'll be pleased to see that you can finally use this style in your\ncode, without forcing anyone else to do as you do.\n\nEven GitHub, GitLab and friends are able to respect this setting, giving\neveryone the opportunity to view code in their preferred style.\n\nI hope you now know why using a single tab of indentation makes the most sense if\nyou're working in a team. Let me know your thoughts!\n\nThis is post 035 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"The only true answer to 'tabs vs spaces'","date":"2022-06-29","tags":"note, guide, 100DaysToOffload, programming, practices, tech"},"tags":["note","guide","100DaysToOffload","programming","practices","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-06-29-the-only-true-answer-to-tabs-vs-spaces","markdownBody":"\nI recently dove into a new project at work. We're starting from a blank page,\nso of course this classic question came up:\n\n> \"So should we use tabs or spaces for our formatting?\"\n\nOne of my teammates explained to us why the only logical answer to this is\n\"Tabs\", and you'll soon know why.\n\n## The problem\n\nMost formatters, by default, use either two or four spaces for indentation by\ndefault. The [Prettier](https://prettier.io/) formatter does this, and it\nsomewhat became the norm for JavaScript projects. This has one huge downside\nthough: everyone on the team has to agree, or live with this standard.\n\nNowadays, almost all editors come with the ability to change the preferred\nindentation settings, which will be overridden by the settings of the\nformatter. I prefer an indentation of 4 spaces, which is reflected in all of my\ncode. If I'm working on a project that uses an indentation of 2 spaces via\nprettier, my preference will be overridden when formatting the code.\n\n## Just use tabs\n\nThe solution to this problem is simple: Create a `.editorconfig` file and set\nthe indentation style to tab, without a width:\n\n```editorconfig\nroot = true\n\n[*]\nend_of_line = lf\ncharset = utf-8\nindent_style = tab\n```\n\nAlmost all editors will be able to pick this file up and configure some\nproject-wide settings. If your editor is configured to use a indent width of 4,\nthis setting will be respected. If you're a maniac that indents their code with\n8 spaces, you'll be pleased to see that you can finally use this style in your\ncode, without forcing anyone else to do as you do.\n\nEven GitHub, GitLab and friends are able to respect this setting, giving\neveryone the opportunity to view code in their preferred style.\n\nI hope you now know why using a single tab of indentation makes the most sense if\nyou're working in a team. Let me know your thoughts!\n\nThis is post 035 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"The only true answer to 'tabs vs spaces'","date":"2022-06-29","tags":"note, guide, 100DaysToOffload, programming, practices, tech"},"tags":["note","guide","100DaysToOffload","programming","practices","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-08-31-whats-on-my-feed.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-08-31-whats-on-my-feed.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-08-31-whats-on-my-feed","markdownBody":"\nRSS is - in my humble opinion - one of the best ways to consume content today.\nIts only downside is that it's quite difficult to find new interesting feeds.\nIf you're looking for inspiration, here's a list of the RSS-feeds I'm subscribed\nto as of August, 2022. Some of the entries may intersect with my\n[blogroll](/blogroll).\n\nLet's not keep this one-sided! If you're also using RSS and have a blog, why not\npublish a list of **your** favorite feeds?\n\n- **HackerNews** ([Pretty](https://news.ycombinator.com/), [RSS](https://hnrss.org/frontpage)) - This one's obvious!\n- **Matt Rickard** ([Pretty](https://matt-rickard.com/), [RSS](https://matt-rickard.com/rss)) - Highly interesting posts about software and startups\n- **Drew DeVault** ([Pretty](https://drewdevault.com), [RSS](https://drewdevault.com/blog/index.xml)) - While Drew's opinions are highly controversial, I do think it's valuable to read his posts\n- **Wandering Thoughts** ([Pretty](https://utcc.utoronto.ca/~cks/space/blog/), [RSS](https://utcc.utoronto.ca/~cks/space/blog/?atom)) - Interesting articles about Linux, SystemD and DevOps\n- **Kev Quirk** ([Pretty](https://kevq.uk), [RSS](https://kevq.uk/feed/)) - Kev's posts are always a fun read!\n- **Seth Godin** ([Pretty](https://seths.blog), [RSS](https://feeds.feedblitz.com/sethsblog)) - I don't actively follow this blog, but it occasionally gives me food for inspiration\n- **The New Oil** ([Pretty](https://blog.thenewoil.org/), [RSS](https://blog.thenewoil.org/feed/)) - Some occasional technology reviews\n- **Tiny Projects/Ben Stokes** ([Pretty](https://tinyprojects.dev/), [RSS](https://tinyprojects.dev/feed.xml)) - Ben doesn't post as much as he used to, but his posts are full of great ideas!\n- **Tagesschau** ([Pretty](https://www.tagesschau.de), [RSS](https://www.tagesschau.de/xml/rss2/)) - My source of german news\n- **t3n** ([Pretty](https://t3n.de), [RSS](https://t3n.de/rss.xml)) - Another german news source, focused around technology and NewWork topics. I thought about removing the description though, as the articles are somewhat poorly written. Still looking for alternatives!\n- **xkcd** ([Pretty](https://xkcd.com/), [RSS](https://xkcd.com/atom.xml)) - come on, did you really think I wasn't subscribed to Randall?\n\nWrote a \"What's on my feed?\" entry yourself? Let me know, and I'll link it here!\n\nThis is post 036 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"What's on my feed? (2022)","date":"2022-08-31","tags":"note, 100DaysToOffload, update, tech"},"tags":["note","100DaysToOffload","update","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-08-31-whats-on-my-feed","markdownBody":"\nRSS is - in my humble opinion - one of the best ways to consume content today.\nIts only downside is that it's quite difficult to find new interesting feeds.\nIf you're looking for inspiration, here's a list of the RSS-feeds I'm subscribed\nto as of August, 2022. Some of the entries may intersect with my\n[blogroll](/blogroll).\n\nLet's not keep this one-sided! If you're also using RSS and have a blog, why not\npublish a list of **your** favorite feeds?\n\n- **HackerNews** ([Pretty](https://news.ycombinator.com/), [RSS](https://hnrss.org/frontpage)) - This one's obvious!\n- **Matt Rickard** ([Pretty](https://matt-rickard.com/), [RSS](https://matt-rickard.com/rss)) - Highly interesting posts about software and startups\n- **Drew DeVault** ([Pretty](https://drewdevault.com), [RSS](https://drewdevault.com/blog/index.xml)) - While Drew's opinions are highly controversial, I do think it's valuable to read his posts\n- **Wandering Thoughts** ([Pretty](https://utcc.utoronto.ca/~cks/space/blog/), [RSS](https://utcc.utoronto.ca/~cks/space/blog/?atom)) - Interesting articles about Linux, SystemD and DevOps\n- **Kev Quirk** ([Pretty](https://kevq.uk), [RSS](https://kevq.uk/feed/)) - Kev's posts are always a fun read!\n- **Seth Godin** ([Pretty](https://seths.blog), [RSS](https://feeds.feedblitz.com/sethsblog)) - I don't actively follow this blog, but it occasionally gives me food for inspiration\n- **The New Oil** ([Pretty](https://blog.thenewoil.org/), [RSS](https://blog.thenewoil.org/feed/)) - Some occasional technology reviews\n- **Tiny Projects/Ben Stokes** ([Pretty](https://tinyprojects.dev/), [RSS](https://tinyprojects.dev/feed.xml)) - Ben doesn't post as much as he used to, but his posts are full of great ideas!\n- **Tagesschau** ([Pretty](https://www.tagesschau.de), [RSS](https://www.tagesschau.de/xml/rss2/)) - My source of german news\n- **t3n** ([Pretty](https://t3n.de), [RSS](https://t3n.de/rss.xml)) - Another german news source, focused around technology and NewWork topics. I thought about removing the description though, as the articles are somewhat poorly written. Still looking for alternatives!\n- **xkcd** ([Pretty](https://xkcd.com/), [RSS](https://xkcd.com/atom.xml)) - come on, did you really think I wasn't subscribed to Randall?\n\nWrote a \"What's on my feed?\" entry yourself? Let me know, and I'll link it here!\n\nThis is post 036 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"What's on my feed? (2022)","date":"2022-08-31","tags":"note, 100DaysToOffload, update, tech"},"tags":["note","100DaysToOffload","update","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-09-22-kubernetes-is-a-domain-specific-database.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-09-22-kubernetes-is-a-domain-specific-database.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-09-22-kubernetes-is-a-domain-specific-database","markdownBody":"\nI just finished listening to [an\nepisode](https://kubernetespodcast.com/episode/129-linkerd/) of the Kubernetes\npodcast. In it, [Thomas Rampelberg](https://saunter.org/) makes an analogy that\nI think is worth sharing:\n\n> \"[...] Kubernetes is really a domain-specific database. And you need to look at it\n> that way. The YAML is literally writing a select statement or an insert\n> statement for a database. That's what the YAML is. And it's awesome that it is\n> already configured for how it is. And it's awesome that it's got a schema. But\n> the YAML is you writing an insert statement into Kubernetes. [...]\"\n\nThe Kubernetes API abstracts two types of states: desired state and actual\nstate. Whenever you apply a manifest, you update the _desired state_ of the\ncluster, just like you do in a regular, non domain-specific database like\nPostgreSQL or Redis. Kubernetes then frequently compares the desired state with\nthe _actual_ state of the cluster. If they don't match, Kubernetes will do\nwhatever it does to match these two states. Usually, this data is persisted\nusing a key-value database like [etcd](https://etcd.io/) running in a cluster,\nthough one could theoretically also hook up an external MySQL or Postgres\ndatabase for this purpose.\n\nI found this great diagram by [Tim\nDowney](https://downey.io/blog/desired-state-vs-actual-state-in-kubernetes/),\nshowing an oversimplified analogy of this pattern:\n\n![Thermostat\nExample](/assets/posts/2022-09-22-kubernetes-is-a-domain-specific-database/desired-state-hvac-diagram.png)\n\nYou _insert_ your desired state into the system, and the system adjusts the\nactual state to match the desired state. In the case of thermostats the state is\na temperature. In Kubernetes, it's [resource\nobjects](https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/)\n\nThis is post 037 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Kubernetes is a domain specific database","date":"2022-09-22","tags":"note, 100DaysToOffload, infrastructure, kubernetes, tech"},"tags":["note","100DaysToOffload","infrastructure","kubernetes","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-09-22-kubernetes-is-a-domain-specific-database","markdownBody":"\nI just finished listening to [an\nepisode](https://kubernetespodcast.com/episode/129-linkerd/) of the Kubernetes\npodcast. In it, [Thomas Rampelberg](https://saunter.org/) makes an analogy that\nI think is worth sharing:\n\n> \"[...] Kubernetes is really a domain-specific database. And you need to look at it\n> that way. The YAML is literally writing a select statement or an insert\n> statement for a database. That's what the YAML is. And it's awesome that it is\n> already configured for how it is. And it's awesome that it's got a schema. But\n> the YAML is you writing an insert statement into Kubernetes. [...]\"\n\nThe Kubernetes API abstracts two types of states: desired state and actual\nstate. Whenever you apply a manifest, you update the _desired state_ of the\ncluster, just like you do in a regular, non domain-specific database like\nPostgreSQL or Redis. Kubernetes then frequently compares the desired state with\nthe _actual_ state of the cluster. If they don't match, Kubernetes will do\nwhatever it does to match these two states. Usually, this data is persisted\nusing a key-value database like [etcd](https://etcd.io/) running in a cluster,\nthough one could theoretically also hook up an external MySQL or Postgres\ndatabase for this purpose.\n\nI found this great diagram by [Tim\nDowney](https://downey.io/blog/desired-state-vs-actual-state-in-kubernetes/),\nshowing an oversimplified analogy of this pattern:\n\n![Thermostat\nExample](/assets/posts/2022-09-22-kubernetes-is-a-domain-specific-database/desired-state-hvac-diagram.png)\n\nYou _insert_ your desired state into the system, and the system adjusts the\nactual state to match the desired state. In the case of thermostats the state is\na temperature. In Kubernetes, it's [resource\nobjects](https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/)\n\nThis is post 037 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Kubernetes is a domain specific database","date":"2022-09-22","tags":"note, 100DaysToOffload, infrastructure, kubernetes, tech"},"tags":["note","100DaysToOffload","infrastructure","kubernetes","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-09-26-self-hosted-software-im-thankful-for.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-09-26-self-hosted-software-im-thankful-for.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-09-26-self-hosted-software-im-thankful-for","markdownBody":"\nSelf-hosting software is not just rainbows and sunshine. I used to self-host a lot of my tools, but after some time the burden of maintaining those tools made me switch to hosted alternatives.\n\nHowever, there are a few projects that I stuck with over the years, and which I think deserve a deep appreciation.\n\n## Miniflux\n\n[Miniflux](https://miniflux.app/) is a very minimal, self-hostable RSS reader. It's been rock-solid since they day I started using it. The data for the application entirely lives In a Postgres database, which makes migrating the application to new infrastructure setups an absolute breeze. I've been meaning to support the author for quite some time now, but the cost of maintaining an instance yourself is basically zero, so I've yet to find the time to switch to their paid hosted instance.\n\n## Plausible Analytics\n\n[Plausible](https://plausible.io/) is another tool that just keeps on running. I haven't had any issues with it whatsoever, and I can't remember the last time I had to do a manual intervention. Just like Miniflux, there's a paid instance, which supports the author, and just like Miniflux, the software is so good that I haven't had a reason to switch to it yet. Oh, the irony.\n\n## BirdsiteLIVE\n\nWhile my instance of [BirdsiteLIVE](https://birdsite.slashdev.space/) is currently in a bad shape, this is not at all the fault of the software. There are limitations to the amount of Twitter API requests you can make, and I did a poor job managing the users on that instance. It's currently very overloaded and just very few tweets make it through. I will have to set aside some time to fix this, but the software itself has been rock solid since the day I started using it.\n\n## Synapse (Matrix)\n\nI was hesitant to mention [Matrix](https://matrix.org/) on this list. I had my ups and downs with Synapse (their Python implementation of a Matrix server), but the fact that my instance is still running after multiple infrastructure transitions and even a migration from SQLite to Postgres says something about the quality of the software. I have a feeling that Synapse is fairly resource-hungry, but if you feed it with enough RAM and disk, it will keep running indefinitely.\n\n## Homeassistant\n\nYou can throw [Homeassistant](https://www.home-assistant.io/) on a Raspberry Pi and everything works out of the gate. I even migrated my instance from a RPi 3 to a RPi 4 via their backup and restore functionality. It's absolutely flawless.\n\n## Dead projects\n\nI think it's fair to also mention the software that I no longer self-host.\n\n### E-Mail\n\nJust don't roll your own email.\n\n### Mastodon\n\nToo power hungry for my taste. No easy way to host inside docker, which made it a pain to keep running. I'm very happy with [Fosstodon](https://fosstodon.org/), and don't see a reason to switch to a self-hosted instance any time soon.\n\n### FreshRSS\n\nI tried replacing Miniflux once, but failed. Nothing beats Miniflux.\n\n### Prometheus + Grafana\n\nMonitoring **_inside_** your infra works until the infra goes down, at which point you're essentially driving blindfolded. I switched to Grafana Cloud, which includes a very generous free tier.\n\nThis is post 038 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Self-hosted software I'm thankful for","date":"2022-09-26","tags":"note, 100DaysToOffload, infrastructure, homelab, tech"},"tags":["note","100DaysToOffload","infrastructure","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-09-26-self-hosted-software-im-thankful-for","markdownBody":"\nSelf-hosting software is not just rainbows and sunshine. I used to self-host a lot of my tools, but after some time the burden of maintaining those tools made me switch to hosted alternatives.\n\nHowever, there are a few projects that I stuck with over the years, and which I think deserve a deep appreciation.\n\n## Miniflux\n\n[Miniflux](https://miniflux.app/) is a very minimal, self-hostable RSS reader. It's been rock-solid since they day I started using it. The data for the application entirely lives In a Postgres database, which makes migrating the application to new infrastructure setups an absolute breeze. I've been meaning to support the author for quite some time now, but the cost of maintaining an instance yourself is basically zero, so I've yet to find the time to switch to their paid hosted instance.\n\n## Plausible Analytics\n\n[Plausible](https://plausible.io/) is another tool that just keeps on running. I haven't had any issues with it whatsoever, and I can't remember the last time I had to do a manual intervention. Just like Miniflux, there's a paid instance, which supports the author, and just like Miniflux, the software is so good that I haven't had a reason to switch to it yet. Oh, the irony.\n\n## BirdsiteLIVE\n\nWhile my instance of [BirdsiteLIVE](https://birdsite.slashdev.space/) is currently in a bad shape, this is not at all the fault of the software. There are limitations to the amount of Twitter API requests you can make, and I did a poor job managing the users on that instance. It's currently very overloaded and just very few tweets make it through. I will have to set aside some time to fix this, but the software itself has been rock solid since the day I started using it.\n\n## Synapse (Matrix)\n\nI was hesitant to mention [Matrix](https://matrix.org/) on this list. I had my ups and downs with Synapse (their Python implementation of a Matrix server), but the fact that my instance is still running after multiple infrastructure transitions and even a migration from SQLite to Postgres says something about the quality of the software. I have a feeling that Synapse is fairly resource-hungry, but if you feed it with enough RAM and disk, it will keep running indefinitely.\n\n## Homeassistant\n\nYou can throw [Homeassistant](https://www.home-assistant.io/) on a Raspberry Pi and everything works out of the gate. I even migrated my instance from a RPi 3 to a RPi 4 via their backup and restore functionality. It's absolutely flawless.\n\n## Dead projects\n\nI think it's fair to also mention the software that I no longer self-host.\n\n### E-Mail\n\nJust don't roll your own email.\n\n### Mastodon\n\nToo power hungry for my taste. No easy way to host inside docker, which made it a pain to keep running. I'm very happy with [Fosstodon](https://fosstodon.org/), and don't see a reason to switch to a self-hosted instance any time soon.\n\n### FreshRSS\n\nI tried replacing Miniflux once, but failed. Nothing beats Miniflux.\n\n### Prometheus + Grafana\n\nMonitoring **_inside_** your infra works until the infra goes down, at which point you're essentially driving blindfolded. I switched to Grafana Cloud, which includes a very generous free tier.\n\nThis is post 038 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Self-hosted software I'm thankful for","date":"2022-09-26","tags":"note, 100DaysToOffload, infrastructure, homelab, tech"},"tags":["note","100DaysToOffload","infrastructure","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-09-30-debugging-docker-images.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-09-30-debugging-docker-images.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-09-30-debugging-docker-images","markdownBody":"\nDocker builds images incrementally. Every line in a Dockerfile will generate a\nnew image that builds on top of the last one. This can be really handy if\nsomething is not right in your build.\n\nSince version 18.09 Docker has added a new backend for building images,\n[buildkit](https://github.com/moby/buildkit#buildkit). Unfortunately, buildkit\ndoes not let you view the IDs of the intermediate containers it uses under the\nhood. To work around that, you can opt out of buildkit by running a build with\nbuildkit disabled:\n\n```sh\nDOCKER_BUILDKIT=0 docker build --pull --rm -t myproject:latest .\n```\n\nYou should now see the IDs of the intermediate containers:\n\n```sh\nSending build context to Docker daemon 87.84MB\nStep 1/16 : FROM node:16.15.1-alpine3.16 AS development\n16.15.1-alpine3.16: Pulling from library/node\nDigest: sha256:c785e617c8d7015190c0d41af52cc69be8a16e3d9eb7cb21f0bb58bcfca14d6b\nStatus: Image is up to date for node:16.15.1-alpine3.16\n ---> e548f8c9983f\nStep 2/16 : WORKDIR /usr/src/app\n ---> Using cache\n ---> 34e5c9bdb910\nStep 3/16 : COPY package*.json ./\n ---> Using cache\n ---> 626e4ae998fc\nStep 4/16 : RUN npm install glob rimraf\n ---> Using cache\n ---> 2d036b8354e0\nStep 5/16 : RUN npm install\n ---> Using cache\n ---> 948709b4957f <-- HERE\nStep 6/16 : COPY . .\n...\n```\n\nAs mentioned, these IDs are valid docker images, so you can just launch them\nand attach a shell like every other image:\n\n```sh\ndocker run -ti --rm 948709b4957f\n```\n\nIf you're not seeing a regular shell, but a Node.js REPL for example, this\nmight be because the `ENTRYPOINT` of that image was set to the binary of that\nREPL. To work around that, you can override the entrypoint:\n\n```sh\ndocker run -ti --rm --entrypoint=/bin/sh 948709b4957f\n```\n\n## When is this helpful?\n\nIf your build fails at a particular step, you can attach a shell to the **last\nworking** step, inspect the filesystem, and execute the failing command manually.\n\nThat's all!\n\nThis is post 039 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Debugging Docker images","date":"2022-09-30","tags":"note, 100DaysToOffload, guide, programming, docker, tech"},"tags":["note","100DaysToOffload","guide","programming","docker","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-09-30-debugging-docker-images","markdownBody":"\nDocker builds images incrementally. Every line in a Dockerfile will generate a\nnew image that builds on top of the last one. This can be really handy if\nsomething is not right in your build.\n\nSince version 18.09 Docker has added a new backend for building images,\n[buildkit](https://github.com/moby/buildkit#buildkit). Unfortunately, buildkit\ndoes not let you view the IDs of the intermediate containers it uses under the\nhood. To work around that, you can opt out of buildkit by running a build with\nbuildkit disabled:\n\n```sh\nDOCKER_BUILDKIT=0 docker build --pull --rm -t myproject:latest .\n```\n\nYou should now see the IDs of the intermediate containers:\n\n```sh\nSending build context to Docker daemon 87.84MB\nStep 1/16 : FROM node:16.15.1-alpine3.16 AS development\n16.15.1-alpine3.16: Pulling from library/node\nDigest: sha256:c785e617c8d7015190c0d41af52cc69be8a16e3d9eb7cb21f0bb58bcfca14d6b\nStatus: Image is up to date for node:16.15.1-alpine3.16\n ---> e548f8c9983f\nStep 2/16 : WORKDIR /usr/src/app\n ---> Using cache\n ---> 34e5c9bdb910\nStep 3/16 : COPY package*.json ./\n ---> Using cache\n ---> 626e4ae998fc\nStep 4/16 : RUN npm install glob rimraf\n ---> Using cache\n ---> 2d036b8354e0\nStep 5/16 : RUN npm install\n ---> Using cache\n ---> 948709b4957f <-- HERE\nStep 6/16 : COPY . .\n...\n```\n\nAs mentioned, these IDs are valid docker images, so you can just launch them\nand attach a shell like every other image:\n\n```sh\ndocker run -ti --rm 948709b4957f\n```\n\nIf you're not seeing a regular shell, but a Node.js REPL for example, this\nmight be because the `ENTRYPOINT` of that image was set to the binary of that\nREPL. To work around that, you can override the entrypoint:\n\n```sh\ndocker run -ti --rm --entrypoint=/bin/sh 948709b4957f\n```\n\n## When is this helpful?\n\nIf your build fails at a particular step, you can attach a shell to the **last\nworking** step, inspect the filesystem, and execute the failing command manually.\n\nThat's all!\n\nThis is post 039 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Debugging Docker images","date":"2022-09-30","tags":"note, 100DaysToOffload, guide, programming, docker, tech"},"tags":["note","100DaysToOffload","guide","programming","docker","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-10-05-simple-guestbook.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-10-05-simple-guestbook.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-10-05-simple-guestbook","markdownBody":"\n> **TL;DR**: Click [here](/guestbook) to view the guestbook.\n\nFor a while now, I wanted to have a quick way to update the pages on my website.\n\nGitHub has the\n[\".\"](https://docs.github.com/en/get-started/using-github/keyboard-shortcuts#source-code-editing)\nhotkey, which opens a web based editor for the file you're currently viewing.\nThis site now has this feature as well! To try it out, just hit `.`, and you'll\nbe redirected to the file editor for this page.\n\nTo see how I implemented this feature, you take a look at\n[this](https://github.com/garritfra/garrit.xyz/commit/658efa3a3ebfebebbf74d0eb6aae6c1cc9566516)\ncommit. It boils down to this snippet of code:\n\n```js\nwindow.addEventListener(\"keypress\", (e) => {\n\tif (e.key === \".\") {\n\t\tconst baseUrl = \"https://github.com/garritfra/garrit.xyz/edit/main/content\";\n\t\tconst filePath = window.location.pathname;\n\t\tconst url = `${baseUrl}${filePath}.md`;\n\n\t\twindow.location.href = url;\n\t}\n});\n```\n\nPretty simple, huh?\n\nSince this doesn't work on mobile devices, I also added [a custom 404\npage](https://github.com/garritfra/garrit.xyz/commit/8c374a8bc0b66192c454300489fee52e7299c9dd#diff-2cbafea0c9dff483ebab9ad670b1cdb3eb7aac552f9c161e42fee84c2efe3a69)\nwhich also redirects to the editor, if the filepath ends with in `/edit`.\n\nLet's have some fun and put this feature to use. I added a simple\n[guestbook](/guestbook) to this site, which is open to receive pull requests.\nI'd love to hear from you!\n\nThis is post 040 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"A simple guestbook","date":"2022-10-05","tags":"note, meta, 100DaysToOffload, guide"},"tags":["note","meta","100DaysToOffload","guide"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-07-five-years-of-blogging","frontmatter":{"title":"Five Years of Blogging","date":"2024-04-07","tags":"note, books, writing, meta"},"tags":["note","books","writing","meta"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]},{"slug":"2023-12-23-100daystooffload-i-made-it","frontmatter":{"title":"#100DaysToOffload: I made it!","date":"2023-12-23","tags":"100DaysToOffload, note, learnings, meta, writing"},"tags":["100DaysToOffload","note","learnings","meta","writing"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-10-05-simple-guestbook","markdownBody":"\n> **TL;DR**: Click [here](/guestbook) to view the guestbook.\n\nFor a while now, I wanted to have a quick way to update the pages on my website.\n\nGitHub has the\n[\".\"](https://docs.github.com/en/get-started/using-github/keyboard-shortcuts#source-code-editing)\nhotkey, which opens a web based editor for the file you're currently viewing.\nThis site now has this feature as well! To try it out, just hit `.`, and you'll\nbe redirected to the file editor for this page.\n\nTo see how I implemented this feature, you take a look at\n[this](https://github.com/garritfra/garrit.xyz/commit/658efa3a3ebfebebbf74d0eb6aae6c1cc9566516)\ncommit. It boils down to this snippet of code:\n\n```js\nwindow.addEventListener(\"keypress\", (e) => {\n\tif (e.key === \".\") {\n\t\tconst baseUrl = \"https://github.com/garritfra/garrit.xyz/edit/main/content\";\n\t\tconst filePath = window.location.pathname;\n\t\tconst url = `${baseUrl}${filePath}.md`;\n\n\t\twindow.location.href = url;\n\t}\n});\n```\n\nPretty simple, huh?\n\nSince this doesn't work on mobile devices, I also added [a custom 404\npage](https://github.com/garritfra/garrit.xyz/commit/8c374a8bc0b66192c454300489fee52e7299c9dd#diff-2cbafea0c9dff483ebab9ad670b1cdb3eb7aac552f9c161e42fee84c2efe3a69)\nwhich also redirects to the editor, if the filepath ends with in `/edit`.\n\nLet's have some fun and put this feature to use. I added a simple\n[guestbook](/guestbook) to this site, which is open to receive pull requests.\nI'd love to hear from you!\n\nThis is post 040 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"A simple guestbook","date":"2022-10-05","tags":"note, meta, 100DaysToOffload, guide"},"tags":["note","meta","100DaysToOffload","guide"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-07-five-years-of-blogging","frontmatter":{"title":"Five Years of Blogging","date":"2024-04-07","tags":"note, books, writing, meta"},"tags":["note","books","writing","meta"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-11-03-reselling-managed-kubernetes.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-11-03-reselling-managed-kubernetes.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-11-03-reselling-managed-kubernetes","markdownBody":"\nI'm currently working on a side project involving reselling Kubernetes clusters.\nWhat I discovered is that it's impossible to resell *managed* Kubernetes, as in\n[EKS](https://aws.amazon.com/de/eks/) and\n[GKE](https://cloud.google.com/kubernetes-engine/).\n\nThe only possible scenario where reselling Kubernetes to your and the\nend-customers advantage is to manage the nodes yourself. The reason is the\nscaling of cost per CPU.\n\nWhen renting VMs, the price per CPU often varies for the size of the machine. \nThis leaves the reseller flexibility in the choice of resources. To give you an\nexample, here is the pricing for virtual machines at\n[Hetzner](https://www.hetzner.com/), and the price per CPU:\n\n| Product | Number of vCPUs | Price (in €/month) | Price per vCPU (in €/month) |\n|-----------------|--------------------|--------------------|-----------------------------|\n| CX11 | 1 | 4.51 | 4.51 |\n| CPX11 | 2 | 5.18 | 2.59 |\n| CPX21 | 3 | 8.98 | 2.99 |\n| CPX31 | 4 | 16.18 | 4.05 |\n| CPX41 | 8 | 29.99 | 3.75 |\n| CPX51 | 16 | 65.33 | 4.08 |\n\nWhen comparing this to a managed Kubernetes product like\n[CIVO](https://www.civo.com), we see that the price per CPU stays constant:\n\n| Product | Number of vCPUs | Price (in €/month) | Price per vCPU (in €/month) |\n|-----------------|--------------------|--------------------|-----------------------------|\n| Extra Small | 1 | 5 | 5 |\n| Small | 2 | 10 | 5 |\n| Medium | 4 | 20 | 5 |\n| Large | 8 | 40 | 5 |\n\nThis pricing model is nice and predictable for the customer, but it makes it\nimpossible to justify a resell product. If CIVO charges 5€/month per vCPU, we\nwould need to charge extra to be profitable, which in turn overcuts the\ncompetition.\n\nWhen choosing Hetzner (or any other platform offering VMs), we are still able to\nundercut the competition and even optimize how the resources are laid out on\nthe nodes. The obvious downside of course being that we have to manage the\nclusters ourselves.\n\n## Share your thoughts\n\nReselling Kubernetes is tricky. I'm currently sketching out ideas for an\nalternative way to sell Kubernetes hosting at an ultra cheap price. The project\nis still in its infancy but if you're interested, you're more than welcome to\nshare your thoughts in our [Matrix\nRoom](https://matrix.to/#/!cTXkqtlnbHScIxnlqO:matrix.org?via=matrix.org&via=envs.net)!\n\nThis is post 041 of [#100DaysToOffload](https://100daystooffload.com/).","frontmatter":{"title":"Reselling Kubernetes","date":"2022-11-03","tags":"note, 100DaysToOffload, kubernetes, infrastructure, tech"},"tags":["note","100DaysToOffload","kubernetes","infrastructure","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-11-03-reselling-managed-kubernetes","markdownBody":"\nI'm currently working on a side project involving reselling Kubernetes clusters.\nWhat I discovered is that it's impossible to resell *managed* Kubernetes, as in\n[EKS](https://aws.amazon.com/de/eks/) and\n[GKE](https://cloud.google.com/kubernetes-engine/).\n\nThe only possible scenario where reselling Kubernetes to your and the\nend-customers advantage is to manage the nodes yourself. The reason is the\nscaling of cost per CPU.\n\nWhen renting VMs, the price per CPU often varies for the size of the machine. \nThis leaves the reseller flexibility in the choice of resources. To give you an\nexample, here is the pricing for virtual machines at\n[Hetzner](https://www.hetzner.com/), and the price per CPU:\n\n| Product | Number of vCPUs | Price (in €/month) | Price per vCPU (in €/month) |\n|-----------------|--------------------|--------------------|-----------------------------|\n| CX11 | 1 | 4.51 | 4.51 |\n| CPX11 | 2 | 5.18 | 2.59 |\n| CPX21 | 3 | 8.98 | 2.99 |\n| CPX31 | 4 | 16.18 | 4.05 |\n| CPX41 | 8 | 29.99 | 3.75 |\n| CPX51 | 16 | 65.33 | 4.08 |\n\nWhen comparing this to a managed Kubernetes product like\n[CIVO](https://www.civo.com), we see that the price per CPU stays constant:\n\n| Product | Number of vCPUs | Price (in €/month) | Price per vCPU (in €/month) |\n|-----------------|--------------------|--------------------|-----------------------------|\n| Extra Small | 1 | 5 | 5 |\n| Small | 2 | 10 | 5 |\n| Medium | 4 | 20 | 5 |\n| Large | 8 | 40 | 5 |\n\nThis pricing model is nice and predictable for the customer, but it makes it\nimpossible to justify a resell product. If CIVO charges 5€/month per vCPU, we\nwould need to charge extra to be profitable, which in turn overcuts the\ncompetition.\n\nWhen choosing Hetzner (or any other platform offering VMs), we are still able to\nundercut the competition and even optimize how the resources are laid out on\nthe nodes. The obvious downside of course being that we have to manage the\nclusters ourselves.\n\n## Share your thoughts\n\nReselling Kubernetes is tricky. I'm currently sketching out ideas for an\nalternative way to sell Kubernetes hosting at an ultra cheap price. The project\nis still in its infancy but if you're interested, you're more than welcome to\nshare your thoughts in our [Matrix\nRoom](https://matrix.to/#/!cTXkqtlnbHScIxnlqO:matrix.org?via=matrix.org&via=envs.net)!\n\nThis is post 041 of [#100DaysToOffload](https://100daystooffload.com/).","frontmatter":{"title":"Reselling Kubernetes","date":"2022-11-03","tags":"note, 100DaysToOffload, kubernetes, infrastructure, tech"},"tags":["note","100DaysToOffload","kubernetes","infrastructure","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-11-11-cursed-user-agents.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-11-11-cursed-user-agents.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-11-11-cursed-user-agents","markdownBody":"\n> **Warning**: This is a rather ranty post. I just needed a place to dump my emotions about this topic. Please take it with a grain of salt. :)\n\nI'm currently [fiddling\naround](https://github.com/garritfra/ua-parser-js/pull/8) with User-Agents of\nSmart TVs, or more specifically [HbbTV](https://www.hbbtv.org/). Interpreting\nthem is an absolute nightmare, so let me rant about interesting edge-cases I\ndiscovered along the way.\n\nTo set the mood: User-Agents in this field have a standardized format, yet many\nvendors seem to do their own thing, making it impossible to build one parser to\nrule them all. For reference, here's what the HbbTV section in a user agent\nSHOULD look like:\n\n```\nHbbTV/<version> (<capabilities>; <vendorName>; <modelName>; <softwareVersion>; [<hardwareVersion>]; <familyName>; <reserved>)\n```\n\n## The \"we'll update that later\"\n\n```\nHbbTV/1.1.1 (; Loewe; MB180; 1.0; 1.0;) NetFront/4.1\n```\n\n1.0 for both software and hardware versions suspiciously looks like a working\ntitle. At least we get some information about the vendor and the model.\n\n## The Overcommitted\n\n```\nMozilla/5.0 (Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 OPR/40.0.2207.0 OMI/4.9.0.237.DOM3-OPT.245 Model/Vestel-MB211 VSTVB MB200 HbbTV/1.2.1 (; JVC; MB211; 3.19.4.2; _TV_NT72563_2017 SmartTvA/3.0.0\n```\n\nIt's nice that we get a lot of information about the device, yet no one seemed\nto check if the string actually fits into storage.\n\n## The Lazy Boy\n\n```\nHbbTV/1.1.1 (;;;;;) Maple;2011\n```\n\nTo be fair, this is one of the earliest HbbTV devices ever. No one knew that\nthis technology would stand the test of time. Apparently not even Samsung.\n\n## Conclusion\n\nI learned that building a generic parser for user agents isn't easy, especially\nif the devices you work with could be over a decade old.\n\nOne thing that all devices do seem to get right though is the presence of the\nHbbTV section in the User-Agent. I did not encounter a single device without it.\n\nThis is post 042 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Cursed User-Agents","date":"2022-11-11","tags":"note, 100DaysToOffload, web, tech, rant"},"tags":["note","100DaysToOffload","web","tech","rant"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-11-11-cursed-user-agents","markdownBody":"\n> **Warning**: This is a rather ranty post. I just needed a place to dump my emotions about this topic. Please take it with a grain of salt. :)\n\nI'm currently [fiddling\naround](https://github.com/garritfra/ua-parser-js/pull/8) with User-Agents of\nSmart TVs, or more specifically [HbbTV](https://www.hbbtv.org/). Interpreting\nthem is an absolute nightmare, so let me rant about interesting edge-cases I\ndiscovered along the way.\n\nTo set the mood: User-Agents in this field have a standardized format, yet many\nvendors seem to do their own thing, making it impossible to build one parser to\nrule them all. For reference, here's what the HbbTV section in a user agent\nSHOULD look like:\n\n```\nHbbTV/<version> (<capabilities>; <vendorName>; <modelName>; <softwareVersion>; [<hardwareVersion>]; <familyName>; <reserved>)\n```\n\n## The \"we'll update that later\"\n\n```\nHbbTV/1.1.1 (; Loewe; MB180; 1.0; 1.0;) NetFront/4.1\n```\n\n1.0 for both software and hardware versions suspiciously looks like a working\ntitle. At least we get some information about the vendor and the model.\n\n## The Overcommitted\n\n```\nMozilla/5.0 (Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 OPR/40.0.2207.0 OMI/4.9.0.237.DOM3-OPT.245 Model/Vestel-MB211 VSTVB MB200 HbbTV/1.2.1 (; JVC; MB211; 3.19.4.2; _TV_NT72563_2017 SmartTvA/3.0.0\n```\n\nIt's nice that we get a lot of information about the device, yet no one seemed\nto check if the string actually fits into storage.\n\n## The Lazy Boy\n\n```\nHbbTV/1.1.1 (;;;;;) Maple;2011\n```\n\nTo be fair, this is one of the earliest HbbTV devices ever. No one knew that\nthis technology would stand the test of time. Apparently not even Samsung.\n\n## Conclusion\n\nI learned that building a generic parser for user agents isn't easy, especially\nif the devices you work with could be over a decade old.\n\nOne thing that all devices do seem to get right though is the presence of the\nHbbTV section in the User-Agent. I did not encounter a single device without it.\n\nThis is post 042 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Cursed User-Agents","date":"2022-11-11","tags":"note, 100DaysToOffload, web, tech, rant"},"tags":["note","100DaysToOffload","web","tech","rant"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-11-24-smart-move-google.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-11-24-smart-move-google.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2022-11-24-smart-move-google","markdownBody":"\nFor as long as I can remember, `maps.google.com` was the defacto domain for\nGoogle Maps. Also for as long as I can remember, I allowed this domain to use\nthe location services of my browser.\n\nYesterday I was asked to allow the usage of location services for Google Maps\nseemingly out of nowhere. Of course I accepted. After all, I just wanted to\ncheck a route to a local business and I was in a hurry. Back home I opened\nGoogle Maps again, and noticed that `maps.google.com` now redirects to\n`google.com/maps`. This implies that the permissions I give to Google Maps now\napply to **all** of Googles services hosted under this domain. So far I only\nidentified Google Flights to have made the same switch (`google.com/flights`),\nthough I'm sure they're just beginning to transfer their services to the main\n`google.com` domain.\n\nCongratulations, you now have permission to geo-track me across **all** of your\nservices.\n\nSmart move, Google.\n\nThis is post 043 of [#100DaysToOffload](https://100daystooffload.com/).\n\n---\n\nThis post generated some interesting discussions on\n[HackerNews](https://news.ycombinator.com/item?id=33729345).\n\n### Backlinks\n\n- [Google Bypasses Privacy, Puts Users’ Data on the Map](https://analyticsindiamag.com/google-bypasses-privacy-puts-users-data-on-the-map/)\n- [Last Week in Local - December 5, 2022](https://open.spotify.com/episode/2EfB2yqlh7B62701mzc82v)\n- [Softantenna](https://softantenna.com/blog/google-smart-move/) ([English](https://softantenna-com.translate.goog/blog/google-smart-move/?_x_tr_sl=auto&_x_tr_tl=en&_x_tr_hl=de&_x_tr_pto=wapp))\n- [Google kann euren Standort unter Umständen mit allen Services verfolgen](https://stadt-bremerhaven.de/google-kann-euren-standort-unter-umstaenden-mit-allen-services-verfolgen/) ([English](https://stadt--bremerhaven-de.translate.goog/google-kann-euren-standort-unter-umstaenden-mit-allen-services-verfolgen/?_x_tr_sl=auto&_x_tr_tl=en&_x_tr_hl=de&_x_tr_pto=wapp))\n- [zive.cz](https://www.zive.cz/clanky/google-vymyslel-figl-jak-nas-plosne-sledovat-stacilo-mapam-zmenit-adresu/sc-3-a-219564/default.aspx) ([English](https://www-zive-cz.translate.goog/clanky/google-vymyslel-figl-jak-nas-plosne-sledovat-stacilo-mapam-zmenit-adresu/sc-3-a-219564/default.aspx?_x_tr_sl=auto&_x_tr_tl=en&_x_tr_hl=de&_x_tr_pto=wapp))\n","frontmatter":{"title":"Smart Move, Google","date":"2022-11-24","tags":"note, 100DaysToOffload, practices, tech, rant"},"tags":["note","100DaysToOffload","practices","tech","rant"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2022-11-24-smart-move-google","markdownBody":"\nFor as long as I can remember, `maps.google.com` was the defacto domain for\nGoogle Maps. Also for as long as I can remember, I allowed this domain to use\nthe location services of my browser.\n\nYesterday I was asked to allow the usage of location services for Google Maps\nseemingly out of nowhere. Of course I accepted. After all, I just wanted to\ncheck a route to a local business and I was in a hurry. Back home I opened\nGoogle Maps again, and noticed that `maps.google.com` now redirects to\n`google.com/maps`. This implies that the permissions I give to Google Maps now\napply to **all** of Googles services hosted under this domain. So far I only\nidentified Google Flights to have made the same switch (`google.com/flights`),\nthough I'm sure they're just beginning to transfer their services to the main\n`google.com` domain.\n\nCongratulations, you now have permission to geo-track me across **all** of your\nservices.\n\nSmart move, Google.\n\nThis is post 043 of [#100DaysToOffload](https://100daystooffload.com/).\n\n---\n\nThis post generated some interesting discussions on\n[HackerNews](https://news.ycombinator.com/item?id=33729345).\n\n### Backlinks\n\n- [Google Bypasses Privacy, Puts Users’ Data on the Map](https://analyticsindiamag.com/google-bypasses-privacy-puts-users-data-on-the-map/)\n- [Last Week in Local - December 5, 2022](https://open.spotify.com/episode/2EfB2yqlh7B62701mzc82v)\n- [Softantenna](https://softantenna.com/blog/google-smart-move/) ([English](https://softantenna-com.translate.goog/blog/google-smart-move/?_x_tr_sl=auto&_x_tr_tl=en&_x_tr_hl=de&_x_tr_pto=wapp))\n- [Google kann euren Standort unter Umständen mit allen Services verfolgen](https://stadt-bremerhaven.de/google-kann-euren-standort-unter-umstaenden-mit-allen-services-verfolgen/) ([English](https://stadt--bremerhaven-de.translate.goog/google-kann-euren-standort-unter-umstaenden-mit-allen-services-verfolgen/?_x_tr_sl=auto&_x_tr_tl=en&_x_tr_hl=de&_x_tr_pto=wapp))\n- [zive.cz](https://www.zive.cz/clanky/google-vymyslel-figl-jak-nas-plosne-sledovat-stacilo-mapam-zmenit-adresu/sc-3-a-219564/default.aspx) ([English](https://www-zive-cz.translate.goog/clanky/google-vymyslel-figl-jak-nas-plosne-sledovat-stacilo-mapam-zmenit-adresu/sc-3-a-219564/default.aspx?_x_tr_sl=auto&_x_tr_tl=en&_x_tr_hl=de&_x_tr_pto=wapp))\n","frontmatter":{"title":"Smart Move, Google","date":"2022-11-24","tags":"note, 100DaysToOffload, practices, tech, rant"},"tags":["note","100DaysToOffload","practices","tech","rant"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2022-12-05-contributing-to-open-source-knowledge.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2022-12-05-contributing-to-open-source-knowledge.json

File diff suppressed because one or more lines are too long

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-01-02-welcome-2023.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-01-02-welcome-2023.json

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-02-14-openssf-best-practices.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-02-14-openssf-best-practices.json

File diff suppressed because one or more lines are too long

1
_next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-02-19-til-about-css-insets.json

@ -0,0 +1 @@
{"pageProps":{"post":{"slug":"2023-02-19-til-about-css-insets","markdownBody":"\r\nJust a quick tip that I thought is worth sharing. Instead of declaring:\r\n\r\n```css\r\n.foo { \r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n left: 0;\r\n}\r\n```\r\n\r\nyou can just use:\r\n\r\n```css\r\n.foo {\r\n inset: 0;\r\n}\r\n```\r\n\r\nIt's supported everywhere computers are sold!\r\n\r\nMDN: https://developer.mozilla.org/en-US/docs/Web/CSS/inset\r\n\r\nSource: https://front-end.social/@estelle/109878532782943511\r\n\r\nThis is post 047 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"TIL about CSS Insets","date":"2023-02-19","tags":"web, note, til, quick-tip, css, 100DaysToOffload, tech"},"tags":["web","note","til","quick-tip","css","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-02-20-what-problem-does-kubernetes-solve.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-02-20-what-problem-does-kubernetes-solve.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-02-20-what-problem-does-kubernetes-solve","markdownBody":"\r\nThis is a common question that many people (including me) ask themselves.\r\n\r\nI recently came across a great [post](https://blog.adamchalmers.com/kubernetes-problems/) which explains the problem really well:\r\n\r\n> Kubernetes exists to solve one problem: how do I run m containers across n servers?\r\n\r\nThe post also nails the answer to **how** Kubernetes solves this problem:\r\n\r\n> It's a big abstract virtual computer, with its own virtual IP stack, networks, disk, RAM and CPU. It lets you deploy containers as if you were deploying them on one machine that didn't run anything else. Clusters abstract over the various physical machines that run the cluster.\r\n\r\nI'd highly encourage you to read through the article if you want to learn more about why Kubernetes exists.\r\n\r\nThis is post 048 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n","frontmatter":{"title":"What problem does Kubernetes solve?","date":"2023-02-20","tags":"note, kubernetes, infrastructure, 100DaysToOffload, tech"},"tags":["note","kubernetes","infrastructure","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-02-20-what-problem-does-kubernetes-solve","markdownBody":"\r\nThis is a common question that many people (including me) ask themselves.\r\n\r\nI recently came across a great [post](https://blog.adamchalmers.com/kubernetes-problems/) which explains the problem really well:\r\n\r\n> Kubernetes exists to solve one problem: how do I run m containers across n servers?\r\n\r\nThe post also nails the answer to **how** Kubernetes solves this problem:\r\n\r\n> It's a big abstract virtual computer, with its own virtual IP stack, networks, disk, RAM and CPU. It lets you deploy containers as if you were deploying them on one machine that didn't run anything else. Clusters abstract over the various physical machines that run the cluster.\r\n\r\nI'd highly encourage you to read through the article if you want to learn more about why Kubernetes exists.\r\n\r\nThis is post 048 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n","frontmatter":{"title":"What problem does Kubernetes solve?","date":"2023-02-20","tags":"note, kubernetes, infrastructure, 100DaysToOffload, tech"},"tags":["note","kubernetes","infrastructure","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-02-21-what's-next-for-modern-infrastructure.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-02-21-what's-next-for-modern-infrastructure.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-02-21-what's-next-for-modern-infrastructure","markdownBody":"\r\nModern infrastructure is incredibly complex. I identified 4 main \"levels\" of infrastructure abstraction:\r\n\r\n## Level 1: A website on a server\r\n\r\nThis is the most straight forward way to host a website. A webserver hosted on bare metal or a VM.\r\n\r\n## Level 2: Multiple servers behind a load balancer\r\n\r\nAt this stage, you start treating servers as cattle rather than pets. Servers may be spun up and down at will without influencing the availability of the application.\r\n\r\n## Level 3: An orchestrated cluster of servers\r\n\r\nInstead of a server serving a specific purpose (e.g. webserver, DB server, etc.), a server becomes a worker for arbitrary workloads (see Kubernetes, ECS).\r\n\r\n## Level 4: Multicluster service mesh\r\n\r\nIf an organization manages multiple clusters (e.g. multiple application teams), they can be tied together into a [service mesh](https://istio.io/latest/docs/reference/glossary/#service-mesh) to better optimize communication and observability.\r\n\r\n## Level 5: ???\r\n\r\nHistory shows that we never stop abstracting. Multicluster service meshes are about the most abstract concept many people (including myself) can comprehend, but I doubt that this is the end of this journey. So, what's next for modern infrastructure?\r\n\r\nThis is post 049 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"What's next for modern infrastructure?","date":"2023-02-21","tags":"note, infrastructure, kubernetes, 100DaysToOffload, tech"},"tags":["note","infrastructure","kubernetes","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-02-21-what's-next-for-modern-infrastructure","markdownBody":"\r\nModern infrastructure is incredibly complex. I identified 4 main \"levels\" of infrastructure abstraction:\r\n\r\n## Level 1: A website on a server\r\n\r\nThis is the most straight forward way to host a website. A webserver hosted on bare metal or a VM.\r\n\r\n## Level 2: Multiple servers behind a load balancer\r\n\r\nAt this stage, you start treating servers as cattle rather than pets. Servers may be spun up and down at will without influencing the availability of the application.\r\n\r\n## Level 3: An orchestrated cluster of servers\r\n\r\nInstead of a server serving a specific purpose (e.g. webserver, DB server, etc.), a server becomes a worker for arbitrary workloads (see Kubernetes, ECS).\r\n\r\n## Level 4: Multicluster service mesh\r\n\r\nIf an organization manages multiple clusters (e.g. multiple application teams), they can be tied together into a [service mesh](https://istio.io/latest/docs/reference/glossary/#service-mesh) to better optimize communication and observability.\r\n\r\n## Level 5: ???\r\n\r\nHistory shows that we never stop abstracting. Multicluster service meshes are about the most abstract concept many people (including myself) can comprehend, but I doubt that this is the end of this journey. So, what's next for modern infrastructure?\r\n\r\nThis is post 049 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"What's next for modern infrastructure?","date":"2023-02-21","tags":"note, infrastructure, kubernetes, 100DaysToOffload, tech"},"tags":["note","infrastructure","kubernetes","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

1
_next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-02-22-dockerignore-troubles.json

@ -0,0 +1 @@
{"pageProps":{"post":{"slug":"2023-02-22-dockerignore-troubles","markdownBody":"\r\nI commonly used to create a `.Dockerignore` file next to my `Dockerfile`. After countless hours of ignoring the problems in my setup, I found out that the uppercase `.Dockerignore` doesn't get picked up by Docker on MacOS. Only the lowercase `.dockerignore` is valid.\r\n\r\nI didn't find official documentation on this, but I think it's because both MacOS and Linux are case-sensitive, while Windows isn't. I don't remember why I got used to the `.Dockerignore` convention, but I swear I saw someone using it in the wild. Or it's my (un)logical reasoning that, because `Dockerfile` is uppercased, `.Dockerignore` should be uppercased as well.\r\n\r\nEither way, stay away from `.Dockerfile`s and stick to `.dockerfile`s.\r\n\r\nThis is post 050 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"Dockerignore troubles","date":"2023-02-22","tags":"note, docker, web, 100DaysToOffload, tech"},"tags":["note","docker","web","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-02-24-visual-distractions.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-02-24-visual-distractions.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-02-24-visual-distractions","markdownBody":"\r\nEverywhere we look, we're bombarded with flashy symbols trying to grab our attention. This is even the case where we **think** that we're in control of what we're looking at. I made two simple changes that reduce visual distractions in my life.\r\n\r\n## Android App Icons\r\n\r\nApp icons play a serious role in how we interact with our phone. Over the years, there has been a constant battle for the most flashy icon on our home screen. But there's a cure: newer versions of Android [let you choose a color theme for apps that implement it](https://www.lifewire.com/change-color-of-apps-on-android-phones-5213663). It's by far not supported by every app out there, but in my case 90% of the app icons now have the same color. I feel way more comfortable looking at my phone, knowing that less things are trying to grab my attention right when I unlock my phone.\r\n\r\nWith this change, I found that I am more mindful about what app icon I tap on, since I was used to each icon having a different color. This makes it harder for my muscle memory to develop bad habits.\r\n\r\n## RSS-Reader Favicons\r\n\r\nIf you're using an RSS reader, chances are you're used to seeing a favicon next to the articles. I had the feeling that I was drawn more towards the favicon than the headline of the article, so I started looking for ways to disable favicons all together.\r\n\r\nMiniflux provides a way to override the stylesheet of the feed in the settings. Simply append the following code-snippet and the favicons will be history:\r\n\r\n```css\r\n.item-title img, .entry-website img {\r\n display: none;\r\n}\r\n```\r\n\r\nOf course every reader is different, so you might want to look into the documentation of your reader of choice.\r\n\r\n## Conclusion\r\n\r\nThese changes might seem insignificant, but I found that they made a huge difference in how I interact with my phone. The suggestions above might not apply to your life, but I'd like to encourage you to keep an eye out for unnecessary visual distraction in your life. Try to avoid it as much as possible.\r\n\r\n---\r\n\r\nThis is post 051 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"Visual Distractions","date":"2023-02-24","tags":"note, guide, life, 100DaysToOffload"},"tags":["note","guide","life","100DaysToOffload"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-01-toil","frontmatter":{"title":"Toil","date":"2024-04-01","tags":"note, life"},"tags":["note","life"]},{"slug":"2024-03-12-dive-log-vietnam","frontmatter":{"title":"Dive Log: Vietnam","date":"2024-03-12","tags":"note, life, diving, divelog"},"tags":["note","life","diving","divelog"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-02-24-visual-distractions","markdownBody":"\r\nEverywhere we look, we're bombarded with flashy symbols trying to grab our attention. This is even the case where we **think** that we're in control of what we're looking at. I made two simple changes that reduce visual distractions in my life.\r\n\r\n## Android App Icons\r\n\r\nApp icons play a serious role in how we interact with our phone. Over the years, there has been a constant battle for the most flashy icon on our home screen. But there's a cure: newer versions of Android [let you choose a color theme for apps that implement it](https://www.lifewire.com/change-color-of-apps-on-android-phones-5213663). It's by far not supported by every app out there, but in my case 90% of the app icons now have the same color. I feel way more comfortable looking at my phone, knowing that less things are trying to grab my attention right when I unlock my phone.\r\n\r\nWith this change, I found that I am more mindful about what app icon I tap on, since I was used to each icon having a different color. This makes it harder for my muscle memory to develop bad habits.\r\n\r\n## RSS-Reader Favicons\r\n\r\nIf you're using an RSS reader, chances are you're used to seeing a favicon next to the articles. I had the feeling that I was drawn more towards the favicon than the headline of the article, so I started looking for ways to disable favicons all together.\r\n\r\nMiniflux provides a way to override the stylesheet of the feed in the settings. Simply append the following code-snippet and the favicons will be history:\r\n\r\n```css\r\n.item-title img, .entry-website img {\r\n display: none;\r\n}\r\n```\r\n\r\nOf course every reader is different, so you might want to look into the documentation of your reader of choice.\r\n\r\n## Conclusion\r\n\r\nThese changes might seem insignificant, but I found that they made a huge difference in how I interact with my phone. The suggestions above might not apply to your life, but I'd like to encourage you to keep an eye out for unnecessary visual distraction in your life. Try to avoid it as much as possible.\r\n\r\n---\r\n\r\nThis is post 051 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"Visual Distractions","date":"2023-02-24","tags":"note, guide, life, 100DaysToOffload"},"tags":["note","guide","life","100DaysToOffload"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-01-toil","frontmatter":{"title":"Toil","date":"2024-04-01","tags":"note, life"},"tags":["note","life"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-03-03-notes-on-containerizing-php-applications.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-03-notes-on-containerizing-php-applications.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-03-03-notes-on-containerizing-php-applications","markdownBody":"\r\nI was recently tasked with building a rudimentary infrastructure for a PHP application. Coming from a Node.js-driven world where every human and their grandmother has a blog post about containerizing your application, it was very interesting to see where PHP differs to other applications.\r\n\r\nOne major gotcha for me was that PHP code is executed on **request-time**, meaning a new process is spawned for each incoming request. Most other languages have dedicated runtimes that handle incoming requests. This unique approach is very flexible and scalable, but it comes with the implication that there is a **separate webserver** that calls into the PHP interpreter when it needs to.\r\n\r\nIn Node.js (and most other languages), you can \"just run the app\", as demonstrated by this Dockerfile:\r\n\r\n```dockerfile\r\nFROM node:18.14.2-alpine3.17 AS build\r\n\r\nWORKDIR /usr/src/app\r\n\r\nCOPY package*.json ./\r\n\r\nRUN npm ci\r\n\r\nCOPY . .\r\n\r\nEXPOSE 3000\r\n\r\nCMD [ \"node\", \"server.js\" ]\r\n```\r\n\r\nPHP on the other side is rarely used on its own. Most of the time, it needs a webserver alongside it:\r\n\r\n```dockerfile\r\nFROM php:8.1-apache-bullseye\r\n\r\n# <snip>\r\n\r\nCOPY . /var/www/html\r\nWORKDIR /var/www/html\r\n\r\n# <snip>\r\n```\r\n\r\nAs you can see, I'm using the official PHP docker image. The PHP maintainers know that adding a webserver alongside PHP is a very common pattern, so most of the variants of the image ship with a webserver. In this example I'm using Apache, but we might as well use NGINX or some other webserver. There's also the option to use [FPM](https://www.php.net/manual/de/install.fpm.php) as a FastCGI implementation and a webserver in a **separate** container.\r\n\r\nGrasping this took me some time, but after it clicked it made many things a lot clearer.\r\n\r\n## More complete Dockerfile example\r\n\r\nThe Dockerfile above is meant to demonstrate how PHP applications differ from other languages. The following is a more complete example you can use to containerize your PHP application. In this case it’s a Laravel app, so your mileage may vary.\r\n\r\n```dockerfile\r\nFROM php:8.1-apache-bullseye\r\n\r\nRUN apt-get clean && \\\r\n apt-get update && \\\r\n apt-get install --fix-missing -y \\\r\n zip && \\\r\n docker-php-ext-install \\\r\n pdo \\\r\n pdo_mysql \\\r\n bcmath\r\n\r\nCOPY --from=composer:2 /usr/bin/composer /usr/bin/composer\r\n\r\nCOPY . /var/www/html\r\nWORKDIR /var/www/html\r\n\r\nENV APACHE_DOCUMENT_ROOT /var/www/html/public\r\n\r\nRUN composer install --no-dev --optimize-autoloader --no-interaction && \\\r\n sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf && \\\r\n sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf && \\\r\n php artisan config:cache && \\\r\n php artisan view:cache && \\\r\n php artisan route:cache && \\\r\n php artisan storage:link && \\\r\n chmod 777 -R /var/www/html/storage/ && \\\r\n chown -R www-data:www-data /var/www/ && \\\r\n a2enmod rewrite\r\n```\r\n\r\n---\r\nThis is post 052 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"Notes on containerizing PHP applications","date":"2023-03-03","tags":"note, infrastructure, docker, php, 100DaysToOffload, tech"},"tags":["note","infrastructure","docker","php","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-03-03-notes-on-containerizing-php-applications","markdownBody":"\r\nI was recently tasked with building a rudimentary infrastructure for a PHP application. Coming from a Node.js-driven world where every human and their grandmother has a blog post about containerizing your application, it was very interesting to see where PHP differs to other applications.\r\n\r\nOne major gotcha for me was that PHP code is executed on **request-time**, meaning a new process is spawned for each incoming request. Most other languages have dedicated runtimes that handle incoming requests. This unique approach is very flexible and scalable, but it comes with the implication that there is a **separate webserver** that calls into the PHP interpreter when it needs to.\r\n\r\nIn Node.js (and most other languages), you can \"just run the app\", as demonstrated by this Dockerfile:\r\n\r\n```dockerfile\r\nFROM node:18.14.2-alpine3.17 AS build\r\n\r\nWORKDIR /usr/src/app\r\n\r\nCOPY package*.json ./\r\n\r\nRUN npm ci\r\n\r\nCOPY . .\r\n\r\nEXPOSE 3000\r\n\r\nCMD [ \"node\", \"server.js\" ]\r\n```\r\n\r\nPHP on the other side is rarely used on its own. Most of the time, it needs a webserver alongside it:\r\n\r\n```dockerfile\r\nFROM php:8.1-apache-bullseye\r\n\r\n# <snip>\r\n\r\nCOPY . /var/www/html\r\nWORKDIR /var/www/html\r\n\r\n# <snip>\r\n```\r\n\r\nAs you can see, I'm using the official PHP docker image. The PHP maintainers know that adding a webserver alongside PHP is a very common pattern, so most of the variants of the image ship with a webserver. In this example I'm using Apache, but we might as well use NGINX or some other webserver. There's also the option to use [FPM](https://www.php.net/manual/de/install.fpm.php) as a FastCGI implementation and a webserver in a **separate** container.\r\n\r\nGrasping this took me some time, but after it clicked it made many things a lot clearer.\r\n\r\n## More complete Dockerfile example\r\n\r\nThe Dockerfile above is meant to demonstrate how PHP applications differ from other languages. The following is a more complete example you can use to containerize your PHP application. In this case it’s a Laravel app, so your mileage may vary.\r\n\r\n```dockerfile\r\nFROM php:8.1-apache-bullseye\r\n\r\nRUN apt-get clean && \\\r\n apt-get update && \\\r\n apt-get install --fix-missing -y \\\r\n zip && \\\r\n docker-php-ext-install \\\r\n pdo \\\r\n pdo_mysql \\\r\n bcmath\r\n\r\nCOPY --from=composer:2 /usr/bin/composer /usr/bin/composer\r\n\r\nCOPY . /var/www/html\r\nWORKDIR /var/www/html\r\n\r\nENV APACHE_DOCUMENT_ROOT /var/www/html/public\r\n\r\nRUN composer install --no-dev --optimize-autoloader --no-interaction && \\\r\n sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf && \\\r\n sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf && \\\r\n php artisan config:cache && \\\r\n php artisan view:cache && \\\r\n php artisan route:cache && \\\r\n php artisan storage:link && \\\r\n chmod 777 -R /var/www/html/storage/ && \\\r\n chown -R www-data:www-data /var/www/ && \\\r\n a2enmod rewrite\r\n```\r\n\r\n---\r\nThis is post 052 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"Notes on containerizing PHP applications","date":"2023-03-03","tags":"note, infrastructure, docker, php, 100DaysToOffload, tech"},"tags":["note","infrastructure","docker","php","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-03-04-pods-vs.-containers.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-04-pods-vs.-containers.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-03-04-pods-vs.-containers","markdownBody":"\r\nIn Kubernetes, pods and containers are often confused. I found a [great article](https://iximiuz.com/en/posts/containers-vs-pods/) going over the differences of the two terms.\r\n\r\n> Containers and Pods are alike. Under the hood, they heavily rely on Linux namespaces and cgroups. However, Pods aren't just groups of containers. A Pod is a self-sufficient higher-level construct. All pod's containers run on the same machine (cluster node), their lifecycle is synchronized, and mutual isolation is weakened to simplify the inter-container communication. This makes Pods much closer to traditional VMs, [bringing back the familiar deployment patterns like sidecar or reverse proxy](https://www.mirantis.com/blog/multi-container-pods-and-container-communication-in-kubernetes/).\r\n\r\nIn my own words: Containers are made up of Linux namespaces and cgroups. Pods can be thought of as a cgroup of cgroups (though not really), mimicing the behavior of a virtual machine that runs multiple containers with a synchronized lifecycle. The containers in a pod are losely isolated, making it easy to communicate between each other. Containers in a pod can however set individual resource requests, enabled by Linux namespaces.\r\n\r\nI'd highly encourage you to check out [the original article](https://iximiuz.com/en/posts/containers-vs-pods/) if you want to learn more about this topic.\r\n\r\n---\r\n\r\nThis is post 053 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"Pods vs. Containers","date":"2023-03-04","tags":"note, kubernetes, infrastructure, docker, 100DaysToOffload, tech"},"tags":["note","kubernetes","infrastructure","docker","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-03-04-pods-vs.-containers","markdownBody":"\r\nIn Kubernetes, pods and containers are often confused. I found a [great article](https://iximiuz.com/en/posts/containers-vs-pods/) going over the differences of the two terms.\r\n\r\n> Containers and Pods are alike. Under the hood, they heavily rely on Linux namespaces and cgroups. However, Pods aren't just groups of containers. A Pod is a self-sufficient higher-level construct. All pod's containers run on the same machine (cluster node), their lifecycle is synchronized, and mutual isolation is weakened to simplify the inter-container communication. This makes Pods much closer to traditional VMs, [bringing back the familiar deployment patterns like sidecar or reverse proxy](https://www.mirantis.com/blog/multi-container-pods-and-container-communication-in-kubernetes/).\r\n\r\nIn my own words: Containers are made up of Linux namespaces and cgroups. Pods can be thought of as a cgroup of cgroups (though not really), mimicing the behavior of a virtual machine that runs multiple containers with a synchronized lifecycle. The containers in a pod are losely isolated, making it easy to communicate between each other. Containers in a pod can however set individual resource requests, enabled by Linux namespaces.\r\n\r\nI'd highly encourage you to check out [the original article](https://iximiuz.com/en/posts/containers-vs-pods/) if you want to learn more about this topic.\r\n\r\n---\r\n\r\nThis is post 053 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"Pods vs. Containers","date":"2023-03-04","tags":"note, kubernetes, infrastructure, docker, 100DaysToOffload, tech"},"tags":["note","kubernetes","infrastructure","docker","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-03-08-terraform-and-kubernetes-are-fundamentally-different.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-08-terraform-and-kubernetes-are-fundamentally-different.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-03-08-terraform-and-kubernetes-are-fundamentally-different","markdownBody":"\r\nOn the surface, Infrastructure as Code tools like [Terraform](https://www.terraform.io/) or [CloudFormation](https://aws.amazon.com/de/cloudformation/) may seem to behave similar to [Kubernetes](https://kubernetes.io/) YAMLs, but they are in fact fundamentally different approaches to cloud infrastructure.\r\n\r\nTerraform tries to provide a declarative way to express imperative actions. If you tell Terraform that you need an EC2 instance, it will notice that no such resource exists and instruct the AWS API to create one. If you don't need the instance anymore and remove the resource definition from your code, Terraform will also pick that up and instruct the AWS API to delete the instance. This works well in most cases, but every once in a while the declarative state may get out of sync with the real world, resulting in errors that are hard to debug and resolve.\r\n\r\nKubernetes on the other hand is a fully declarative system. In a [previous post](/posts/2022-09-22-kubernetes-is-a-domain-specific-database) I touched on how Kubernetes constantly compares the *desired* state with the *actual* state of the resources and tries to match the two. Although it is theoretically possible to issue imperative actions, Kubernetes is built from the ground up to be declarative.\r\n\r\n---\r\n\r\nThis is post 054 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"The fundamental difference between Terraform and Kubernetes","date":"2023-03-08","tags":"note, infrastructure, terraform, kubernetes, 100DaysToOffload, tech"},"tags":["note","infrastructure","terraform","kubernetes","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-03-08-terraform-and-kubernetes-are-fundamentally-different","markdownBody":"\r\nOn the surface, Infrastructure as Code tools like [Terraform](https://www.terraform.io/) or [CloudFormation](https://aws.amazon.com/de/cloudformation/) may seem to behave similar to [Kubernetes](https://kubernetes.io/) YAMLs, but they are in fact fundamentally different approaches to cloud infrastructure.\r\n\r\nTerraform tries to provide a declarative way to express imperative actions. If you tell Terraform that you need an EC2 instance, it will notice that no such resource exists and instruct the AWS API to create one. If you don't need the instance anymore and remove the resource definition from your code, Terraform will also pick that up and instruct the AWS API to delete the instance. This works well in most cases, but every once in a while the declarative state may get out of sync with the real world, resulting in errors that are hard to debug and resolve.\r\n\r\nKubernetes on the other hand is a fully declarative system. In a [previous post](/posts/2022-09-22-kubernetes-is-a-domain-specific-database) I touched on how Kubernetes constantly compares the *desired* state with the *actual* state of the resources and tries to match the two. Although it is theoretically possible to issue imperative actions, Kubernetes is built from the ground up to be declarative.\r\n\r\n---\r\n\r\nThis is post 054 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"The fundamental difference between Terraform and Kubernetes","date":"2023-03-08","tags":"note, infrastructure, terraform, kubernetes, 100DaysToOffload, tech"},"tags":["note","infrastructure","terraform","kubernetes","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-03-10-debugging-ecs-tasks.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-10-debugging-ecs-tasks.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-03-10-debugging-ecs-tasks","markdownBody":"\r\nI just had to debug an application on AWS ECS. The whole procedure is documented in more detail in the [documentation](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html), but I think it's beneficial (both for my future self and hopefully to someone out there) to write down the proccess in my own words.\r\n\r\nFirst of all, you need access to the cluster via the [CLI](https://aws.amazon.com/de/cli/). In addition to the CLI, you need the [AWS Session Manager plugin for the CLI](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html). If you're on MacOS, you can install that via [Homebrew](https://formulae.brew.sh/cask/session-manager-plugin):\r\n\r\n```\r\nbrew install --cask session-manager-plugin\r\n```\r\n\r\nNext, you need to allow the task you want to debug to be able to execute commands. Since I'm using Terraform, this was just a matter of adding the [`enable_execute_command`](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_service#enable_execute_command) attribute to the service:\r\n\r\n```tf\r\nresource \"aws_ecs_service\" \"my_service\" {\r\n name = \"my-service\"\r\n cluster = aws_ecs_cluster.my_cluster.id\r\n task_definition = aws_ecs_task_definition.my_task_definition.id\r\n desired_count = var.app_count\r\n launch_type = \"FARGATE\"\r\n enable_execute_command = true # TODO: Disable after debugging\r\n}\r\n```\r\n\r\nYou may also need specify an execution role in the task definition:\r\n\r\n```tf\r\nresource \"aws_ecs_task_definition\" \"my_task_definition\" {\r\n family = \"my-task\"\r\n task_role_arn = aws_iam_role.ecs_task_execution_role.arn\r\n execution_role_arn = aws_iam_role.ecs_task_execution_role.arn # <-- Add this\r\n}\r\n```\r\n\r\nMake sure that this role has the correct access rights. There's a nice [troubleshooting guide](https://aws.amazon.com/de/premiumsupport/knowledge-center/ecs-error-execute-command/) going over the required permissions.\r\n\r\nIf you had to do some modifications, make sure to roll out a new deployment with the fresh settings:\r\n\r\n```\r\naws ecs update-service --cluster my-cluster --service my-service --force-new-deployment\r\n```\r\n\r\nNow, you should be able to issue commands against any running container!\r\n\r\n```\r\naws ecs execute-command --cluster westfalen --task <task-id-or-arn> --container my-container --interactive --command=\"/bin/sh\"\r\n```\r\n\r\nI hope this helps!\r\n\r\n---\r\n\r\nThis is post 055 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"Debugging ECS Tasks","date":"2023-03-10","tags":"100DaysToOffload, infrastructure, aws, guide, note, terraform, tech"},"tags":["100DaysToOffload","infrastructure","aws","guide","note","terraform","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-03-10-debugging-ecs-tasks","markdownBody":"\r\nI just had to debug an application on AWS ECS. The whole procedure is documented in more detail in the [documentation](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html), but I think it's beneficial (both for my future self and hopefully to someone out there) to write down the proccess in my own words.\r\n\r\nFirst of all, you need access to the cluster via the [CLI](https://aws.amazon.com/de/cli/). In addition to the CLI, you need the [AWS Session Manager plugin for the CLI](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html). If you're on MacOS, you can install that via [Homebrew](https://formulae.brew.sh/cask/session-manager-plugin):\r\n\r\n```\r\nbrew install --cask session-manager-plugin\r\n```\r\n\r\nNext, you need to allow the task you want to debug to be able to execute commands. Since I'm using Terraform, this was just a matter of adding the [`enable_execute_command`](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_service#enable_execute_command) attribute to the service:\r\n\r\n```tf\r\nresource \"aws_ecs_service\" \"my_service\" {\r\n name = \"my-service\"\r\n cluster = aws_ecs_cluster.my_cluster.id\r\n task_definition = aws_ecs_task_definition.my_task_definition.id\r\n desired_count = var.app_count\r\n launch_type = \"FARGATE\"\r\n enable_execute_command = true # TODO: Disable after debugging\r\n}\r\n```\r\n\r\nYou may also need specify an execution role in the task definition:\r\n\r\n```tf\r\nresource \"aws_ecs_task_definition\" \"my_task_definition\" {\r\n family = \"my-task\"\r\n task_role_arn = aws_iam_role.ecs_task_execution_role.arn\r\n execution_role_arn = aws_iam_role.ecs_task_execution_role.arn # <-- Add this\r\n}\r\n```\r\n\r\nMake sure that this role has the correct access rights. There's a nice [troubleshooting guide](https://aws.amazon.com/de/premiumsupport/knowledge-center/ecs-error-execute-command/) going over the required permissions.\r\n\r\nIf you had to do some modifications, make sure to roll out a new deployment with the fresh settings:\r\n\r\n```\r\naws ecs update-service --cluster my-cluster --service my-service --force-new-deployment\r\n```\r\n\r\nNow, you should be able to issue commands against any running container!\r\n\r\n```\r\naws ecs execute-command --cluster westfalen --task <task-id-or-arn> --container my-container --interactive --command=\"/bin/sh\"\r\n```\r\n\r\nI hope this helps!\r\n\r\n---\r\n\r\nThis is post 055 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"Debugging ECS Tasks","date":"2023-03-10","tags":"100DaysToOffload, infrastructure, aws, guide, note, terraform, tech"},"tags":["100DaysToOffload","infrastructure","aws","guide","note","terraform","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-03-11-a-software-requirements-checklist.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-11-a-software-requirements-checklist.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-03-11-a-software-requirements-checklist","markdownBody":"\r\nI just found a [great post](https://www.etsy.com/codeascraft/a-checklist-manifetsy) on the Etsy Engineering blog suggesting a possible checklist for new product requirements. In reality, this checklist is very hard to fulfill, but it's a nice reminder of what a well thought out requirement could look like.\r\n\r\n### Scope\r\n\r\n- Is the feature meant to be very polished and finished or are we just trying to get user feedback as an MVP?\r\n- If we are running a MVP, is the current feature a true MVP? How can we simplify or cut scope?\r\n\r\n### Eligibility\r\n\r\n- What populations should be included or excluded from the experiment? When should users see this feature? (Which pages, signed in/signed out, mobile, desktop, etc.)\r\nWhere/when should bucketing occur?\r\n- Will the experiment conflict with any other experiments? Do the experiments need to run exclusively?\r\n- What countries should the experiment run in (can impact translations)?\r\n\r\n### A11Y\r\n\r\n- Is there any special accessibility work this feature will require? If extra work is anticipated, check in early with our a11y team.\r\n- When testing and developing we should keep two users in mind - a keyboard user and a voice over user, do we need to add other code for these users?\r\n\r\n### Translations\r\n\r\n- Are there any strings to be translated that should be submitted ASAP?\r\n- Do we need to translate any labels for a11y?\r\n\r\n### Observability\r\n\r\n- How will we know that the feature is working? Are there existing graphs we can use or do we need new ones?\r\n- Should any of these metrics have a threshold or alerting?\r\n- Are we missing any key events to obtain user feedback?\r\n- How will we compare our control and variant?\r\n\r\n### Performance\r\n\r\n- Is there anything in my experiment that could degrade performance of the site?\r\n- Do I need an operational experiment to verify that I’m not impacting performance?\r\n\r\n### Error States\r\n\r\n- Do we have designs for loading states?\r\n- Do we have designs for unsuccessful requests and error handling?\r\n- Do we have informative logging when there are errors?\r\n\r\n### QA\r\n\r\n- What set of browsers and devices should we test our new feature against?\r\n- Which user perspectives do we need to test?\r\n\r\n### Ramping\r\n\r\n- What will our ramping strategy be?\r\n\r\n---\r\n\r\nCheck out the [original post](https://www.etsy.com/codeascraft/a-checklist-manifetsy) for a full writeup and the intentions behind this checklist.\r\n\r\n---\r\n\r\nThis is post 056 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"A software requirements checklist","date":"2023-03-11","tags":"100DaysToOffload, note, quote, practices, tech"},"tags":["100DaysToOffload","note","quote","practices","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-02-10-cosmic-horror-the-festival","frontmatter":{"title":"Cosmic Horror: The Festival","date":"2024-02-10","tags":"note, quote, writing, review, horror"},"tags":["note","quote","writing","review","horror"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-03-11-a-software-requirements-checklist","markdownBody":"\r\nI just found a [great post](https://www.etsy.com/codeascraft/a-checklist-manifetsy) on the Etsy Engineering blog suggesting a possible checklist for new product requirements. In reality, this checklist is very hard to fulfill, but it's a nice reminder of what a well thought out requirement could look like.\r\n\r\n### Scope\r\n\r\n- Is the feature meant to be very polished and finished or are we just trying to get user feedback as an MVP?\r\n- If we are running a MVP, is the current feature a true MVP? How can we simplify or cut scope?\r\n\r\n### Eligibility\r\n\r\n- What populations should be included or excluded from the experiment? When should users see this feature? (Which pages, signed in/signed out, mobile, desktop, etc.)\r\nWhere/when should bucketing occur?\r\n- Will the experiment conflict with any other experiments? Do the experiments need to run exclusively?\r\n- What countries should the experiment run in (can impact translations)?\r\n\r\n### A11Y\r\n\r\n- Is there any special accessibility work this feature will require? If extra work is anticipated, check in early with our a11y team.\r\n- When testing and developing we should keep two users in mind - a keyboard user and a voice over user, do we need to add other code for these users?\r\n\r\n### Translations\r\n\r\n- Are there any strings to be translated that should be submitted ASAP?\r\n- Do we need to translate any labels for a11y?\r\n\r\n### Observability\r\n\r\n- How will we know that the feature is working? Are there existing graphs we can use or do we need new ones?\r\n- Should any of these metrics have a threshold or alerting?\r\n- Are we missing any key events to obtain user feedback?\r\n- How will we compare our control and variant?\r\n\r\n### Performance\r\n\r\n- Is there anything in my experiment that could degrade performance of the site?\r\n- Do I need an operational experiment to verify that I’m not impacting performance?\r\n\r\n### Error States\r\n\r\n- Do we have designs for loading states?\r\n- Do we have designs for unsuccessful requests and error handling?\r\n- Do we have informative logging when there are errors?\r\n\r\n### QA\r\n\r\n- What set of browsers and devices should we test our new feature against?\r\n- Which user perspectives do we need to test?\r\n\r\n### Ramping\r\n\r\n- What will our ramping strategy be?\r\n\r\n---\r\n\r\nCheck out the [original post](https://www.etsy.com/codeascraft/a-checklist-manifetsy) for a full writeup and the intentions behind this checklist.\r\n\r\n---\r\n\r\nThis is post 056 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"A software requirements checklist","date":"2023-03-11","tags":"100DaysToOffload, note, quote, practices, tech"},"tags":["100DaysToOffload","note","quote","practices","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-02-10-cosmic-horror-the-festival","frontmatter":{"title":"Cosmic Horror: The Festival","date":"2024-02-10","tags":"note, quote, writing, review, horror"},"tags":["note","quote","writing","review","horror"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-03-16-terraform-project-learnings.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-16-terraform-project-learnings.json

File diff suppressed because one or more lines are too long

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-03-21-i-wont-buy-a-yubikey.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-21-i-wont-buy-a-yubikey.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-03-21-i-wont-buy-a-yubikey","markdownBody":"\nI have a YubiKey that I use for work, and I love using it. But I won't get one for my personal life.\n\nI've been thinking about this for some time now, but I ultimately don't think the benefits outweigh the hassle of always carrying around another device that I risk losing or breaking.\n\nA Yubikey provides a very good second factor, but so does my phone. My phone, just like a Yubikey, is locked behind a third factor (a pin or biometric sensor), so my phone essentially *is* a Yubikey. You can argue that the authenticator app on my phone (bitwarden) can be hacked, but I'm willing to take that risk if it means I have to reset all security measures on all accounts if I lose the key.\n\nSo, I'm not getting a Yubikey.\n\n### Replies & Mentions\n\n- [Kev Quirk: re: I won't buy a YubiKey](https://kevquirk.com/i-wont-by-a-yubikey/)\n- [Alson Kaw: Why I won't use a YubiKey](https://alsonkaw.com/muses/why-i-wont-use-a-yubikey/)\n\n---\n\nThis is post 058 of [#100DaysToOffload](https://100daystooffload.com/).\n\n","frontmatter":{"title":"I won't buy a YubiKey","date":"2023-03-21","tags":"100DaysToOffload, note, opinion, privacy, security, tech"},"tags":["100DaysToOffload","note","opinion","privacy","security","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-03-21-i-wont-buy-a-yubikey","markdownBody":"\nI have a YubiKey that I use for work, and I love using it. But I won't get one for my personal life.\n\nI've been thinking about this for some time now, but I ultimately don't think the benefits outweigh the hassle of always carrying around another device that I risk losing or breaking.\n\nA Yubikey provides a very good second factor, but so does my phone. My phone, just like a Yubikey, is locked behind a third factor (a pin or biometric sensor), so my phone essentially *is* a Yubikey. You can argue that the authenticator app on my phone (bitwarden) can be hacked, but I'm willing to take that risk if it means I have to reset all security measures on all accounts if I lose the key.\n\nSo, I'm not getting a Yubikey.\n\n### Replies & Mentions\n\n- [Kev Quirk: re: I won't buy a YubiKey](https://kevquirk.com/i-wont-by-a-yubikey/)\n- [Alson Kaw: Why I won't use a YubiKey](https://alsonkaw.com/muses/why-i-wont-use-a-yubikey/)\n\n---\n\nThis is post 058 of [#100DaysToOffload](https://100daystooffload.com/).\n\n","frontmatter":{"title":"I won't buy a YubiKey","date":"2023-03-21","tags":"100DaysToOffload, note, opinion, privacy, security, tech"},"tags":["100DaysToOffload","note","opinion","privacy","security","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-03-23-fullscreen-terminals-in-vscode.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-23-fullscreen-terminals-in-vscode.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-03-23-fullscreen-terminals-in-vscode","markdownBody":"\r\nI often find myself using a \"real\" terminal alongside my VSCode setup, because for some tasks the built-in terminal, due to its small size, is quite flimsy to use. *But*! I just found out there's a a way to switch the terminal into fullscreen mode, using the \"View: Toggle Maximized Panel\" command.\r\n\r\nYou can bind it to a shortcut, which makes switching between editor and terminal a breeze! Simply add this to your `keybindings.json` (also accessible via the [command palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette)):\r\n\r\n```\r\n {\r\n \"key\": \"cmd+alt+m\",\r\n \"command\": \"workbench.action.toggleMaximizedPanel\"\r\n }\r\n```\r\n\r\n### References\r\n\r\n- [Original StackOverflow answer](https://stackoverflow.com/a/48512128/9046809)\r\n\r\n---\r\n\r\nThis is post 059 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n","frontmatter":{"title":"Fullscreen Terminals in VSCode","date":"2023-03-23","tags":"100DaysToOffload, guide, note, editors, tech"},"tags":["100DaysToOffload","guide","note","editors","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-03-23-fullscreen-terminals-in-vscode","markdownBody":"\r\nI often find myself using a \"real\" terminal alongside my VSCode setup, because for some tasks the built-in terminal, due to its small size, is quite flimsy to use. *But*! I just found out there's a a way to switch the terminal into fullscreen mode, using the \"View: Toggle Maximized Panel\" command.\r\n\r\nYou can bind it to a shortcut, which makes switching between editor and terminal a breeze! Simply add this to your `keybindings.json` (also accessible via the [command palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette)):\r\n\r\n```\r\n {\r\n \"key\": \"cmd+alt+m\",\r\n \"command\": \"workbench.action.toggleMaximizedPanel\"\r\n }\r\n```\r\n\r\n### References\r\n\r\n- [Original StackOverflow answer](https://stackoverflow.com/a/48512128/9046809)\r\n\r\n---\r\n\r\nThis is post 059 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n","frontmatter":{"title":"Fullscreen Terminals in VSCode","date":"2023-03-23","tags":"100DaysToOffload, guide, note, editors, tech"},"tags":["100DaysToOffload","guide","note","editors","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

1
_next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-26-software-is-not-defined-by-the-language-it's-written-in.json

@ -0,0 +1 @@
{"pageProps":{"post":{"slug":"2023-03-26-software-is-not-defined-by-the-language-it's-written-in","markdownBody":"\nRust is not just a programming language, it's also a status symbol. By now, it kind of became a meme that people writing programs in Rust have to make explicit that \"X is written in Rust\".\n\nHow fast or safe the language is doesn't define how good the software is. Software in TypeScript can be just as good as software written in C, if written by the right people.\n\nWhen starting a new project, try to focus on the domain of the problem and pick a language based on that. Don't decide on the language before you know what problem you're trying to solve. If the answer to this is always one option (like Rust), [you might be in a bubble](https://seths.blog/2023/03/the-answer-to-every-question/).\n\n---\n\nThis is post 060 of [#100DaysToOffload](https://100daystooffload.com/).\n\n\n\n","frontmatter":{"title":"Software is not defined by the language it's written in","date":"2023-03-26","tags":"100DaysToOffload, note, practices, opinion, tech"},"tags":["100DaysToOffload","note","practices","opinion","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-03-30-designing-resilient-cloud-infrastructure.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-03-30-designing-resilient-cloud-infrastructure.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-03-30-designing-resilient-cloud-infrastructure","markdownBody":"\r\nAs mentioned in a [previous post](/posts/2023-03-16-terraform-project-learnings), I'm currently finishing up building my first cloud infrastructure on AWS for a client at work. During the development, I learned a lot about designing components to be resilient and scalable. Here are some key takeaways.\r\n\r\nOne of the most critical components of a resilient infrastructure is redundancy. On AWS, you place your components inside a \"region\". This could be `eu-central-1` (Frankfurt) or `us-east-1` (North Virgina), etc. To further reduce the risk of an outage, each region is divided into multiple [Availability Zones](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html) (AZs). The AZs of a region are usually located some distance apart from each other. In case of a flood, a fire or a bomb detonating near one AZ, the other AZs should in most cases still be intact. You should have at least two, preferably three replicas of each component across multiple availability zones in a region. By having replicas of your components in different availability zones, you reduce the risk of downtime caused by an outage in a single availability zone.\r\n\r\nAnother way to ensure scalability and resilience for your database is to use [Aurora Serverless v2](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.html). This database service is specifically designed for scalable, on-demand, and cost-effective performance. The database scales itself up or down based on the workload, which allows you to automatically and dynamically adjust the database capacity to meet the demand of your application, ensuring that your application is responsive and performs well without the need for manual intervention. Adding Serverless instances to an existing RDS cluster is also a seemless proccess.\r\n\r\nIn addition to switching to Aurora Serverless v2, using read replicas for cache and database in a separate availability zone can act as a hot standby without extra configuration. Keep in mind that read replicas are only utilized by explicitly using the read-only endpoint of a cluster. But even if you're only using the \"main\" cluster endpoint (and therefore just the primary instance), a read replica can promote itself to the primary instance in case of a fail over, which drastically reduces downtime.\r\n\r\nWhen using Amazon Elastic Container Service (ECS), use Fargate as opposed to EC2 instances. Fargate is a serverless compute engine for containers that allows you to run containers without having to manage the underlying infrastructure. It smartly locates instances across availability zones, ensuring that your application is always available.\r\n\r\nIn conclusion, you should always ensure that there are more than one instance of a component in your infrastructure. There are also services on AWS that abstract away the physical infrastructure (Fargate, S3, Lambda) and use a multi-AZ pattern by default.\r\n\r\n---\r\n\r\nThis is post 061 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n","frontmatter":{"title":"Designing resilient cloud infrastructure","date":"2023-03-30","tags":"100DaysToOffload, infrastructure, aws, guide, note, learnings, tech"},"tags":["100DaysToOffload","infrastructure","aws","guide","note","learnings","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-03-30-designing-resilient-cloud-infrastructure","markdownBody":"\r\nAs mentioned in a [previous post](/posts/2023-03-16-terraform-project-learnings), I'm currently finishing up building my first cloud infrastructure on AWS for a client at work. During the development, I learned a lot about designing components to be resilient and scalable. Here are some key takeaways.\r\n\r\nOne of the most critical components of a resilient infrastructure is redundancy. On AWS, you place your components inside a \"region\". This could be `eu-central-1` (Frankfurt) or `us-east-1` (North Virgina), etc. To further reduce the risk of an outage, each region is divided into multiple [Availability Zones](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html) (AZs). The AZs of a region are usually located some distance apart from each other. In case of a flood, a fire or a bomb detonating near one AZ, the other AZs should in most cases still be intact. You should have at least two, preferably three replicas of each component across multiple availability zones in a region. By having replicas of your components in different availability zones, you reduce the risk of downtime caused by an outage in a single availability zone.\r\n\r\nAnother way to ensure scalability and resilience for your database is to use [Aurora Serverless v2](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.html). This database service is specifically designed for scalable, on-demand, and cost-effective performance. The database scales itself up or down based on the workload, which allows you to automatically and dynamically adjust the database capacity to meet the demand of your application, ensuring that your application is responsive and performs well without the need for manual intervention. Adding Serverless instances to an existing RDS cluster is also a seemless proccess.\r\n\r\nIn addition to switching to Aurora Serverless v2, using read replicas for cache and database in a separate availability zone can act as a hot standby without extra configuration. Keep in mind that read replicas are only utilized by explicitly using the read-only endpoint of a cluster. But even if you're only using the \"main\" cluster endpoint (and therefore just the primary instance), a read replica can promote itself to the primary instance in case of a fail over, which drastically reduces downtime.\r\n\r\nWhen using Amazon Elastic Container Service (ECS), use Fargate as opposed to EC2 instances. Fargate is a serverless compute engine for containers that allows you to run containers without having to manage the underlying infrastructure. It smartly locates instances across availability zones, ensuring that your application is always available.\r\n\r\nIn conclusion, you should always ensure that there are more than one instance of a component in your infrastructure. There are also services on AWS that abstract away the physical infrastructure (Fargate, S3, Lambda) and use a multi-AZ pattern by default.\r\n\r\n---\r\n\r\nThis is post 061 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n","frontmatter":{"title":"Designing resilient cloud infrastructure","date":"2023-03-30","tags":"100DaysToOffload, infrastructure, aws, guide, note, learnings, tech"},"tags":["100DaysToOffload","infrastructure","aws","guide","note","learnings","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]}]},"__N_SSG":true}

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-04-01-quality-vs.-quantity.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-04-01-quality-vs.-quantity.json

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-04-07-older-is-often-better.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-04-07-older-is-often-better.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-04-07-older-is-often-better","markdownBody":"\nI'm guilty of buying shiny new things. After being unhappy with the Bluetooth connectivity in the OnePlus Nord I bought in december of 2020, I bought a brand new Pixel 7 last december. I told myself that t would be using the OnePlus Nord for at least three years, preferably four, yet I gave in after two years due to some issue that could have been fixed with a pair of cable-headphones. I'm now asking myself again: am I able to use my new Pixel 7 for more than 3 years?\n\nI just stumbled upon a blog post called \"[My long goodbye to Windows XP](https://woodfromeden.substack.com/p/my-long-goodbye-to-windows-xp)\", in which the author explains that he is currently replacing his 2008 laptop running Windows XP with a \"new\" PC running Windows 7. He states that he knew the ins and outs of this operating system, so why switch to a new one? Eventually he did switch, but to an OS that is already end of life.\n\nI totally love this. If you're happy with what you got, you shouldn't let a new feature dictate how to change your workflow. Does one really need the features introduced in some software/hardware/tool in the past year? Wouldn't it make sense to use the things that have been battle-tested for at least a few years?\n\nAs I said, I'm very guilty of living at the cutting edge of technology. Maybe it's time to slow down. I'm certain it would simplify a lot of things.\n\n---\n\nThis is post 063 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Older is often better","date":"2023-04-07","tags":"100DaysToOffload, note, opinion, life, tech"},"tags":["100DaysToOffload","note","opinion","life","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-04-01-toil","frontmatter":{"title":"Toil","date":"2024-04-01","tags":"note, life"},"tags":["note","life"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-04-07-older-is-often-better","markdownBody":"\nI'm guilty of buying shiny new things. After being unhappy with the Bluetooth connectivity in the OnePlus Nord I bought in december of 2020, I bought a brand new Pixel 7 last december. I told myself that t would be using the OnePlus Nord for at least three years, preferably four, yet I gave in after two years due to some issue that could have been fixed with a pair of cable-headphones. I'm now asking myself again: am I able to use my new Pixel 7 for more than 3 years?\n\nI just stumbled upon a blog post called \"[My long goodbye to Windows XP](https://woodfromeden.substack.com/p/my-long-goodbye-to-windows-xp)\", in which the author explains that he is currently replacing his 2008 laptop running Windows XP with a \"new\" PC running Windows 7. He states that he knew the ins and outs of this operating system, so why switch to a new one? Eventually he did switch, but to an OS that is already end of life.\n\nI totally love this. If you're happy with what you got, you shouldn't let a new feature dictate how to change your workflow. Does one really need the features introduced in some software/hardware/tool in the past year? Wouldn't it make sense to use the things that have been battle-tested for at least a few years?\n\nAs I said, I'm very guilty of living at the cutting edge of technology. Maybe it's time to slow down. I'm certain it would simplify a lot of things.\n\n---\n\nThis is post 063 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Older is often better","date":"2023-04-07","tags":"100DaysToOffload, note, opinion, life, tech"},"tags":["100DaysToOffload","note","opinion","life","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-04-12-instant-dark-theme.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-04-12-instant-dark-theme.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-04-12-instant-dark-theme","markdownBody":"\r\nThanks to [Jacksons](https://jacksonchen666.com/) [update to darktheme.club](https://github.com/garritfra/darktheme.club/pull/79), I just came across a neat little [CSS property](https://developer.mozilla.org/en-US/docs/Web/CSS/color-scheme) that turns a mostly CSS-free document into a pleasantly dark site:\r\n\r\n```css\r\n:root {\r\n color-scheme: light dark;\r\n}\r\n```\r\n\r\nThis will adjust all elements on the page to the color scheme preferred by the user - without any other custom styles! 🤯 It is also [widely supported](https://caniuse.com/mdn-css_properties_color-scheme) by browsers.\r\n\r\nI've always been quite dependent on CSS-frameworks for any project I'm starting. Going forward, I'd be interested to see how framework-less sites would feel using this property. If all else fails, there's always the awesome [simple.css](https://simplecss.org/) library, which you can slap on top of a raw document to make it pretty (and dark, if preferred) without using custom classes.\r\n\r\n---\r\n\r\nThis is post 064 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"Instant dark theme","date":"2023-04-12","tags":"100DaysToOffload, guide, note, learnings, web, css, til, tech"},"tags":["100DaysToOffload","guide","note","learnings","web","css","til","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-04-12-instant-dark-theme","markdownBody":"\r\nThanks to [Jacksons](https://jacksonchen666.com/) [update to darktheme.club](https://github.com/garritfra/darktheme.club/pull/79), I just came across a neat little [CSS property](https://developer.mozilla.org/en-US/docs/Web/CSS/color-scheme) that turns a mostly CSS-free document into a pleasantly dark site:\r\n\r\n```css\r\n:root {\r\n color-scheme: light dark;\r\n}\r\n```\r\n\r\nThis will adjust all elements on the page to the color scheme preferred by the user - without any other custom styles! 🤯 It is also [widely supported](https://caniuse.com/mdn-css_properties_color-scheme) by browsers.\r\n\r\nI've always been quite dependent on CSS-frameworks for any project I'm starting. Going forward, I'd be interested to see how framework-less sites would feel using this property. If all else fails, there's always the awesome [simple.css](https://simplecss.org/) library, which you can slap on top of a raw document to make it pretty (and dark, if preferred) without using custom classes.\r\n\r\n---\r\n\r\nThis is post 064 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"Instant dark theme","date":"2023-04-12","tags":"100DaysToOffload, guide, note, learnings, web, css, til, tech"},"tags":["100DaysToOffload","guide","note","learnings","web","css","til","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]}]},"__N_SSG":true}

1
_next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-04-22-the-role-of-a-devops-engineer.json

@ -0,0 +1 @@
{"pageProps":{"post":{"slug":"2023-04-22-the-role-of-a-devops-engineer","markdownBody":"\r\nThe term \"DevOps\" can be interpreted in many different ways. It's often thrown around as a buzzword whenever somebody is talking about \"what comes after development\". Obviously, it's not just that. Or is it? It depends on whom you're talking to.\r\n\r\nAlthough I just recently started my new role as a \"DevOps Engineer\", I'm still discovering what that term means to me. I just had a fruitful conversation with the DevOps lead of a client, and they phrased this role in a very fitting way.\r\n\r\n> A DevOps Engineer doesn't push the button, they enable the developers to push the button themselves.\r\n\r\nTo me this role is fascinating, since it touches so many different aspects of software delivery.\r\n\r\n---\r\n\r\nThis is post 065 of [#100DaysToOffload](https://100daystooffload.com/).\r\n","frontmatter":{"title":"The role of a DevOps Engineer","date":"2023-04-22","tags":"100DaysToOffload, note, practices, devops, tech"},"tags":["100DaysToOffload","note","practices","devops","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-04-27-migrating-homeassistant-from-sd-to-ssd.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-04-27-migrating-homeassistant-from-sd-to-ssd.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-04-27-migrating-homeassistant-from-sd-to-ssd","markdownBody":"\r\nI finally got frustrated with the performance of my Raspberry Pi 4 running Homeassistant on a SD card, so I went ahead and got an SSD.\r\n\r\nThe migration was **very** easy:\r\n\r\n1. Create and download a full backup through the UI\r\n2. Flash Homeassistant onto the SSD\r\n3. Remove the SD card and plug the SSD into a USB 3.0 port of the Pi\r\n4. Boot\r\n5. Go through the onboarding procedure\r\n6. Restore Backup\r\n7. Profit\r\n\r\nIt worked like a charm! The speed has improved A LOT, and everything was set up as it should be. \r\n\r\n...Until we turned on the lights in the livingroom. My ZigBee-dongle, plugged into another USB port, wasn't able to communicate with the devices on the network.\r\n\r\nAfter some digging around, I came across several threads stating that an SSD over USB 3.0 apparently creates a lot of interference to surrounding hardware, including my ZigBee dongle. The fix was simple: either get an extension port for the dongle, or plug the SSD into a USB 2.0 port of the Pi. Since I didn't have an extension cord to get the dongle far away enough from the SSD, I went with the latter option for now. And that fixed it! The performance was much worse, but still better than the SD I used before. My next step will be to grab an extension cord from my parents. I'm sure they won't mind.\r\n\r\nI hope this helps!\r\n\r\n---\r\n\r\nThis is post 066 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n\r\n\r\n\r\n\r\n","frontmatter":{"title":"Migrating Homeassistant from SD to SSD","date":"2023-04-27","tags":"100DaysToOffload, guide, note, homeassistant, homelab, tech"},"tags":["100DaysToOffload","guide","note","homeassistant","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-04-27-migrating-homeassistant-from-sd-to-ssd","markdownBody":"\r\nI finally got frustrated with the performance of my Raspberry Pi 4 running Homeassistant on a SD card, so I went ahead and got an SSD.\r\n\r\nThe migration was **very** easy:\r\n\r\n1. Create and download a full backup through the UI\r\n2. Flash Homeassistant onto the SSD\r\n3. Remove the SD card and plug the SSD into a USB 3.0 port of the Pi\r\n4. Boot\r\n5. Go through the onboarding procedure\r\n6. Restore Backup\r\n7. Profit\r\n\r\nIt worked like a charm! The speed has improved A LOT, and everything was set up as it should be. \r\n\r\n...Until we turned on the lights in the livingroom. My ZigBee-dongle, plugged into another USB port, wasn't able to communicate with the devices on the network.\r\n\r\nAfter some digging around, I came across several threads stating that an SSD over USB 3.0 apparently creates a lot of interference to surrounding hardware, including my ZigBee dongle. The fix was simple: either get an extension port for the dongle, or plug the SSD into a USB 2.0 port of the Pi. Since I didn't have an extension cord to get the dongle far away enough from the SSD, I went with the latter option for now. And that fixed it! The performance was much worse, but still better than the SD I used before. My next step will be to grab an extension cord from my parents. I'm sure they won't mind.\r\n\r\nI hope this helps!\r\n\r\n---\r\n\r\nThis is post 066 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n\r\n\r\n\r\n\r\n","frontmatter":{"title":"Migrating Homeassistant from SD to SSD","date":"2023-04-27","tags":"100DaysToOffload, guide, note, homeassistant, homelab, tech"},"tags":["100DaysToOffload","guide","note","homeassistant","homelab","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-04-28-serverless-framework-retrospective.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-04-28-serverless-framework-retrospective.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-04-28-serverless-framework-retrospective","markdownBody":"\r\nA current project requires the infrastructure to be highly scalable. It's expected that > 50k Users hit the platform within a five minute period. Regular ECS containers take about one minute to scale up. That just won't cut it. I decided to go all in on the [serverless](https://www.serverless.com/) framework on AWS. Here's how it went.\r\n\r\n### Setup\r\n\r\nSetting up a serverless application was a breeze. You create a config file and use their CLI to deploy the app.\r\n\r\n### The rest of the infrastructure\r\n\r\nI decided to define the rest of the infrastructure (VPC, DB, cache, ...) in Terraform. But, since I wasn't familiar with how the Serverless Framework worked, I struggled to draw the line between what serverless should handle vs. what the rest of the infrastructure (Terraform) should provide. In a more traditional deployment workflow, you might let the CI deploy a container image to ECR and point the ECS service to that new image.\r\n\r\nI chose to let Serverless deploy the entire app through CI and build the rest of the infrastructure around it. The problem with this approach is that we lose fine-grained control over what's deployed where, which leads to a lot of permission errors.\r\n\r\nIn retrospect, I should've probably chosen the location of the S3 archive as the deployment target for the CI, and then point the lambda function to the location of the new artifact. This defeats the purpose of the framework, but it gives you a lot more control over your infrastructure. Once the next project comes along, I'll probably go that route instead.\r\n\r\n### Permissions\r\n\r\nServerless suggests to use admin permissions for deployments, and I see where they're coming from. Managing permissions in this framework is an absolute mess. Here's what the average deployment workflow looks like, if you want to use fine grained permissions:\r\n\r\n1. Wait for CloudFormation to roll back changes (~2 minutes)\r\n2. Update IAM role\r\n3. Deploy Serverless App\r\n4. If there's an error, go to 1\r\n\r\nThankfully, some people have already gone through the process of figuring this out. [Here's](https://serverlessfirst.com/create-iam-deployer-roles-serverless-app/#determining-deploy-time-permissions) a great guide with a starting point of the needed permissions.\r\n\r\n### Conclusion\r\n\r\nUsing the serverless framework is a solid choice if you just want to throw an app out there. Unfortunately the app I was deploying isn't \"just\" a dynamic website. The next time I'm building a serverless application it's probably not going to be with the Serverless Framework, though I learned a lot about serverless applications in general.\r\n\r\n---\r\n\r\nThis is post 067 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n\r\n\r\n\r\n","frontmatter":{"title":"Serverless Framework Retrospective","date":"2023-04-28","tags":"100DaysToOffload, infrastructure, aws, note, terraform, learnings, devops, serverless, tech"},"tags":["100DaysToOffload","infrastructure","aws","note","terraform","learnings","devops","serverless","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-04-28-serverless-framework-retrospective","markdownBody":"\r\nA current project requires the infrastructure to be highly scalable. It's expected that > 50k Users hit the platform within a five minute period. Regular ECS containers take about one minute to scale up. That just won't cut it. I decided to go all in on the [serverless](https://www.serverless.com/) framework on AWS. Here's how it went.\r\n\r\n### Setup\r\n\r\nSetting up a serverless application was a breeze. You create a config file and use their CLI to deploy the app.\r\n\r\n### The rest of the infrastructure\r\n\r\nI decided to define the rest of the infrastructure (VPC, DB, cache, ...) in Terraform. But, since I wasn't familiar with how the Serverless Framework worked, I struggled to draw the line between what serverless should handle vs. what the rest of the infrastructure (Terraform) should provide. In a more traditional deployment workflow, you might let the CI deploy a container image to ECR and point the ECS service to that new image.\r\n\r\nI chose to let Serverless deploy the entire app through CI and build the rest of the infrastructure around it. The problem with this approach is that we lose fine-grained control over what's deployed where, which leads to a lot of permission errors.\r\n\r\nIn retrospect, I should've probably chosen the location of the S3 archive as the deployment target for the CI, and then point the lambda function to the location of the new artifact. This defeats the purpose of the framework, but it gives you a lot more control over your infrastructure. Once the next project comes along, I'll probably go that route instead.\r\n\r\n### Permissions\r\n\r\nServerless suggests to use admin permissions for deployments, and I see where they're coming from. Managing permissions in this framework is an absolute mess. Here's what the average deployment workflow looks like, if you want to use fine grained permissions:\r\n\r\n1. Wait for CloudFormation to roll back changes (~2 minutes)\r\n2. Update IAM role\r\n3. Deploy Serverless App\r\n4. If there's an error, go to 1\r\n\r\nThankfully, some people have already gone through the process of figuring this out. [Here's](https://serverlessfirst.com/create-iam-deployer-roles-serverless-app/#determining-deploy-time-permissions) a great guide with a starting point of the needed permissions.\r\n\r\n### Conclusion\r\n\r\nUsing the serverless framework is a solid choice if you just want to throw an app out there. Unfortunately the app I was deploying isn't \"just\" a dynamic website. The next time I'm building a serverless application it's probably not going to be with the Serverless Framework, though I learned a lot about serverless applications in general.\r\n\r\n---\r\n\r\nThis is post 067 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n\r\n\r\n\r\n","frontmatter":{"title":"Serverless Framework Retrospective","date":"2023-04-28","tags":"100DaysToOffload, infrastructure, aws, note, terraform, learnings, devops, serverless, tech"},"tags":["100DaysToOffload","infrastructure","aws","note","terraform","learnings","devops","serverless","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-05-19-work-batch-sizing.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-05-19-work-batch-sizing.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-05-19-work-batch-sizing","markdownBody":"\nI've been playing \n[Carcassonne](https://en.m.wikipedia.org/wiki/Carcassonne_(board_game)) a lot with my girlfriend recently. It's a boardgame about building cities, roads and farms, and each completed \"project\" earns you some amount of points. The twist is that there's only a limited number of tiles, and once all tiles are used, the game is over unfinished projects are discarded.\n\nThe first couple of playthroughs I tried to maximize my score by increasing the number of projects I actively had going. I'd start a new city or road whenever I could, thinking that the multipliers you sometimes get would pay off in the end. Boy was I wrong.\n\nWhere I'm from, we have multiple sayings for this approach. \"Having too many irons in the fire\" or \"dancing on too many parties\". I was too busy starting new projects instead of making actual progress.\n\nA far better approach is to finish projects early, earning less points, but with a greater certainty that they will pay off. With every project you start, the likelyhood of the other projects paying off decreases.\n\nKeeping batch sizes small was a key concept of the [lean manufacturing movement](https://en.m.wikipedia.org/wiki/Lean_manufacturing) in the 1980s, and has since been adopted by the [DevOps movement](https://de.m.wikipedia.org/wiki/DevOps) for the IT industry. If you want to learn more about this topic, you should check out [The DevOps Handbook](https://itrevolution.com/product/the-devops-handbook-second-edition/). It goes well beyond the basics of making IT processes more productive and efficient.\n\nAfter realizing that small batch sizes are the key to success, I haven't lost a game of Carcassonne since. I hope you're not reading this, honey.🤭\n\n---\n\nThis is post 068 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Optimizing work batch size","date":"2023-05-19","tags":"100DaysToOffload, note, practices, learnings, life, devops, tech"},"tags":["100DaysToOffload","note","practices","learnings","life","devops","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-04-01-toil","frontmatter":{"title":"Toil","date":"2024-04-01","tags":"note, life"},"tags":["note","life"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-05-19-work-batch-sizing","markdownBody":"\nI've been playing \n[Carcassonne](https://en.m.wikipedia.org/wiki/Carcassonne_(board_game)) a lot with my girlfriend recently. It's a boardgame about building cities, roads and farms, and each completed \"project\" earns you some amount of points. The twist is that there's only a limited number of tiles, and once all tiles are used, the game is over unfinished projects are discarded.\n\nThe first couple of playthroughs I tried to maximize my score by increasing the number of projects I actively had going. I'd start a new city or road whenever I could, thinking that the multipliers you sometimes get would pay off in the end. Boy was I wrong.\n\nWhere I'm from, we have multiple sayings for this approach. \"Having too many irons in the fire\" or \"dancing on too many parties\". I was too busy starting new projects instead of making actual progress.\n\nA far better approach is to finish projects early, earning less points, but with a greater certainty that they will pay off. With every project you start, the likelyhood of the other projects paying off decreases.\n\nKeeping batch sizes small was a key concept of the [lean manufacturing movement](https://en.m.wikipedia.org/wiki/Lean_manufacturing) in the 1980s, and has since been adopted by the [DevOps movement](https://de.m.wikipedia.org/wiki/DevOps) for the IT industry. If you want to learn more about this topic, you should check out [The DevOps Handbook](https://itrevolution.com/product/the-devops-handbook-second-edition/). It goes well beyond the basics of making IT processes more productive and efficient.\n\nAfter realizing that small batch sizes are the key to success, I haven't lost a game of Carcassonne since. I hope you're not reading this, honey.🤭\n\n---\n\nThis is post 068 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Optimizing work batch size","date":"2023-05-19","tags":"100DaysToOffload, note, practices, learnings, life, devops, tech"},"tags":["100DaysToOffload","note","practices","learnings","life","devops","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-06-01-single-page-applications-on-github-pages.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-06-01-single-page-applications-on-github-pages.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-06-01-single-page-applications-on-github-pages","markdownBody":"\nMy latest project, [sendpasswords.net](https://sendpasswords.net/) is a [Single Page Application](https://developer.mozilla.org/en-US/docs/Glossary/SPA) deployed on GitHub Pages.\n\nGitHub Pages is configured in a way to host static HTML files without any bells and whistles. This means that if you try to fetch a document that's *not* the index, for example `/foo`, the server will try to load the file with that name. \n\nBy nature, SPAs only consist of a single HTML entry point (`index.html` in most cases). It's responsible for routing the user to the correct page if there are multiple paths. And here's the crux: if the user tries to load `/foo`, he will not land at the SPA entry point. Instead, he will see a `404` error.\n\n## The solution\n\nA `404` response will automatically return a file called `404.html`, which we can use to our advantage. After building the application, simply copy the `index.html` to `404.html`, as demonstrated by [this commit](https://github.com/garritfra/sendpasswords.net/commit/66bdb68c229a3ac3386f7816a746155e658eb586). This will use `index.html` to serve the application on the root level, and `404.html` to load *the same app* if the page doesn't exist as a file. Whether the `index.html` is needed if there's already a `404.html` is up to you. I left it in to make clear that this is just a workaround.\n\nThis is a [well known](https://stackoverflow.com/a/69308662/9046809) workaround, but I wanted to bring some extra awareness to it, since it's a problem I ran into a couple of times so far. Happy SPAing!\n\n---\n\nThis is post 069 (nice) of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Single Page Applications on GitHub Pages","date":"2023-06-01","tags":"100DaysToOffload, guide, note, web, javascript, github, tech"},"tags":["100DaysToOffload","guide","note","web","javascript","github","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-06-01-single-page-applications-on-github-pages","markdownBody":"\nMy latest project, [sendpasswords.net](https://sendpasswords.net/) is a [Single Page Application](https://developer.mozilla.org/en-US/docs/Glossary/SPA) deployed on GitHub Pages.\n\nGitHub Pages is configured in a way to host static HTML files without any bells and whistles. This means that if you try to fetch a document that's *not* the index, for example `/foo`, the server will try to load the file with that name. \n\nBy nature, SPAs only consist of a single HTML entry point (`index.html` in most cases). It's responsible for routing the user to the correct page if there are multiple paths. And here's the crux: if the user tries to load `/foo`, he will not land at the SPA entry point. Instead, he will see a `404` error.\n\n## The solution\n\nA `404` response will automatically return a file called `404.html`, which we can use to our advantage. After building the application, simply copy the `index.html` to `404.html`, as demonstrated by [this commit](https://github.com/garritfra/sendpasswords.net/commit/66bdb68c229a3ac3386f7816a746155e658eb586). This will use `index.html` to serve the application on the root level, and `404.html` to load *the same app* if the page doesn't exist as a file. Whether the `index.html` is needed if there's already a `404.html` is up to you. I left it in to make clear that this is just a workaround.\n\nThis is a [well known](https://stackoverflow.com/a/69308662/9046809) workaround, but I wanted to bring some extra awareness to it, since it's a problem I ran into a couple of times so far. Happy SPAing!\n\n---\n\nThis is post 069 (nice) of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Single Page Applications on GitHub Pages","date":"2023-06-01","tags":"100DaysToOffload, guide, note, web, javascript, github, tech"},"tags":["100DaysToOffload","guide","note","web","javascript","github","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-06-25-make-a-list.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-06-25-make-a-list.json

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-07-06-rss-changes.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-07-06-rss-changes.json

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-07-11-principles-of-devops-introduction.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-07-11-principles-of-devops-introduction.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-07-11-principles-of-devops-introduction","markdownBody":"\r\nI recently changed roles in my company, and I can officially call myself a \"DevOps Engineer\" now. But what does that really mean?\r\n\r\nIn an attempt to write down my thoughts about this topic, I'm starting a series of blog posts called \"Principles of DevOps\". I'm usually very bad at sticking to things, so I'm curious to see if this series will lead anywhere.\r\n\r\nTo collect the posts of this series, I created a tag called [#PrinciplesOfDevOps](/posts?tags=PrinciplesOfDevOps). If you're reading this in the future, be sure to check out this tag to see all installments.\r\n\r\n## What is DevOps?\r\n\r\nLet's kick off the series with a very basic question: What on earth is DevOps?\r\n\r\nDevOps is often used as an inflationary term to describe \"whatever comes after dev\". This can't be further from the truth.\r\n\r\nIn the past, developers, operations, designers, QA and other stakeholders of an applications were often implicitly trained to work in \"silos\". Once designers have finished their job, they pass their mockups to developers. When developers are done writing the application, they pass their code to operations, whose job it is to deploy it.\r\n\r\nDevOps is a set of practices that aims to combine the work of project stakeholders to unite people, process, and technology in application planning, development, delivery, and operations. Although the term DevOps only consists of \"Dev\" and \"Ops\", it has since evolved to include design, quality assurance and security. You may have heard of \"DevSecOps\", which aims to incorporate more roles into the term, but \"DevOps\" seems to stick the best with most people.\r\n\r\n## What does a \"DevOps Engineer\" do?\r\n\r\nI recently wrote a blog post about this: [The role of a DevOps Engineer](/posts/2023-04-22-the-role-of-a-devops-engineer).\r\n\r\nIn short, the job of a DevOps Engineer is to reduce the friction between stakeholders of a project. A collegue of mine explained this in a really good way:\r\n\r\n> A DevOps Engineer doesn't push the button, they enable the developers to push the button themselves.\r\n\r\n## Let's jump in!\r\n\r\nI hope by now you have a vague sense of what DevOps is. Next up, I want to uncover the principles and practices of DevOps. Thanks for reading to the end!\r\n\r\n---\r\n\r\nThis is post 072 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n\r\n","frontmatter":{"title":"Principles of DevOps: Introduction","date":"2023-07-11","tags":"note, practices, devops, PrinciplesOfDevOps, 100DaysToOffload, tech"},"tags":["note","practices","devops","PrinciplesOfDevOps","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-07-11-principles-of-devops-introduction","markdownBody":"\r\nI recently changed roles in my company, and I can officially call myself a \"DevOps Engineer\" now. But what does that really mean?\r\n\r\nIn an attempt to write down my thoughts about this topic, I'm starting a series of blog posts called \"Principles of DevOps\". I'm usually very bad at sticking to things, so I'm curious to see if this series will lead anywhere.\r\n\r\nTo collect the posts of this series, I created a tag called [#PrinciplesOfDevOps](/posts?tags=PrinciplesOfDevOps). If you're reading this in the future, be sure to check out this tag to see all installments.\r\n\r\n## What is DevOps?\r\n\r\nLet's kick off the series with a very basic question: What on earth is DevOps?\r\n\r\nDevOps is often used as an inflationary term to describe \"whatever comes after dev\". This can't be further from the truth.\r\n\r\nIn the past, developers, operations, designers, QA and other stakeholders of an applications were often implicitly trained to work in \"silos\". Once designers have finished their job, they pass their mockups to developers. When developers are done writing the application, they pass their code to operations, whose job it is to deploy it.\r\n\r\nDevOps is a set of practices that aims to combine the work of project stakeholders to unite people, process, and technology in application planning, development, delivery, and operations. Although the term DevOps only consists of \"Dev\" and \"Ops\", it has since evolved to include design, quality assurance and security. You may have heard of \"DevSecOps\", which aims to incorporate more roles into the term, but \"DevOps\" seems to stick the best with most people.\r\n\r\n## What does a \"DevOps Engineer\" do?\r\n\r\nI recently wrote a blog post about this: [The role of a DevOps Engineer](/posts/2023-04-22-the-role-of-a-devops-engineer).\r\n\r\nIn short, the job of a DevOps Engineer is to reduce the friction between stakeholders of a project. A collegue of mine explained this in a really good way:\r\n\r\n> A DevOps Engineer doesn't push the button, they enable the developers to push the button themselves.\r\n\r\n## Let's jump in!\r\n\r\nI hope by now you have a vague sense of what DevOps is. Next up, I want to uncover the principles and practices of DevOps. Thanks for reading to the end!\r\n\r\n---\r\n\r\nThis is post 072 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n\r\n","frontmatter":{"title":"Principles of DevOps: Introduction","date":"2023-07-11","tags":"note, practices, devops, PrinciplesOfDevOps, 100DaysToOffload, tech"},"tags":["note","practices","devops","PrinciplesOfDevOps","100DaysToOffload","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-07-12-principles-of-devops--flow.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-07-12-principles-of-devops--flow.json

File diff suppressed because one or more lines are too long

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-08-23-so,-you-want-to-win-the-lottery.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-08-23-so,-you-want-to-win-the-lottery.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-08-23-so,-you-want-to-win-the-lottery","markdownBody":"\nThe lottery is often used as a comparison for something that's far out of reach. But how far out of reach exactly is the lottery?\r\n\r\n## 1 in 302 Million\r\n\r\nApparently, you have a 1 in 302 million chance to win the lottery. Well, that sounds like a lot... but how much is that exactly?\r\n\r\nImagine 66 bathtubs.\r\n\r\nNow, imagine each of these bathtubs is filled to the brim with **rice**.\r\n\r\nOne of the grains of rice inside one of the bathtubs is painted gold. This is our jackpot.\r\n\r\nWhenever you purchase a lottery ticket, imagine grabbing one grain of rice from this sea of bath tubs. Do you think you'd have a chance to find the golden grain?\r\n\r\nSource: [The Scam No One Sees](https://www.youtube.com/watch?v=3Yn_3HqfV1w)\r\n\r\n---\r\n\r\nThis is post 074 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n\n","frontmatter":{"title":"So, you want to win the lottery","date":"2023-08-23","tags":"100DaysToOffload, note, life, til, random"},"tags":["100DaysToOffload","note","life","til","random"]},"recommendedPosts":[{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-01-toil","frontmatter":{"title":"Toil","date":"2024-04-01","tags":"note, life"},"tags":["note","life"]},{"slug":"2024-03-12-dive-log-vietnam","frontmatter":{"title":"Dive Log: Vietnam","date":"2024-03-12","tags":"note, life, diving, divelog"},"tags":["note","life","diving","divelog"]},{"slug":"2024-02-26-dive-log-phuket","frontmatter":{"title":"Dive Log: Phuket","date":"2024-02-26","tags":"note, life, diving, divelog"},"tags":["note","life","diving","divelog"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-08-23-so,-you-want-to-win-the-lottery","markdownBody":"\nThe lottery is often used as a comparison for something that's far out of reach. But how far out of reach exactly is the lottery?\r\n\r\n## 1 in 302 Million\r\n\r\nApparently, you have a 1 in 302 million chance to win the lottery. Well, that sounds like a lot... but how much is that exactly?\r\n\r\nImagine 66 bathtubs.\r\n\r\nNow, imagine each of these bathtubs is filled to the brim with **rice**.\r\n\r\nOne of the grains of rice inside one of the bathtubs is painted gold. This is our jackpot.\r\n\r\nWhenever you purchase a lottery ticket, imagine grabbing one grain of rice from this sea of bath tubs. Do you think you'd have a chance to find the golden grain?\r\n\r\nSource: [The Scam No One Sees](https://www.youtube.com/watch?v=3Yn_3HqfV1w)\r\n\r\n---\r\n\r\nThis is post 074 of [#100DaysToOffload](https://100daystooffload.com/).\r\n\r\n\n","frontmatter":{"title":"So, you want to win the lottery","date":"2023-08-23","tags":"100DaysToOffload, note, life, til, random"},"tags":["100DaysToOffload","note","life","til","random"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-10-beating-elden-ring","frontmatter":{"title":"Beating Elden Ring","date":"2024-04-10","tags":"note, learnings, life, review, gaming"},"tags":["note","learnings","life","review","gaming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-01-toil","frontmatter":{"title":"Toil","date":"2024-04-01","tags":"note, life"},"tags":["note","life"]},{"slug":"2024-03-12-dive-log-vietnam","frontmatter":{"title":"Dive Log: Vietnam","date":"2024-03-12","tags":"note, life, diving, divelog"},"tags":["note","life","diving","divelog"]}]},"__N_SSG":true}

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-09-09-everyday-carry-notebooks.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-09-09-everyday-carry-notebooks.json

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-09-10-short-story-haunted-memories.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-09-10-short-story-haunted-memories.json

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-09-11-linkdump-software-development.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-09-11-linkdump-software-development.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-09-11-linkdump-software-development","markdownBody":"\nToday, my feed is full of super interesting links. Here's a bunch of them, in no particular order. Some of them might be a bit older, but just as interesting:\n\n- [What I Have Changed My Mind About in Software Development](https://henrikwarne.com/2023/09/10/what-i-have-changed-my-mind-about-in-software-development/)\n- [A Senior Engineer's CheckList](https://littleblah.com/post/2019-09-01-senior-engineer-checklist/)\n- [The burnout curve](https://thoughtshrapnel.com/2023/09/11/the-burnout-curve/)\n- [How To Be An Engineer That PMs Don't Hate](https://staysaasy.com/engineering/2023/06/18/how-to-be-an-engineer-pms-down-hate.html)\n- [Building and operating a pretty big storage system called S3](https://www.allthingsdistributed.com/2023/07/building-and-operating-a-pretty-big-storage-system.html)\n- [Tailwind, and the death of web craftsmanship](https://pdx.su/blog/2023-07-26-tailwind-and-the-death-of-craftsmanship/)\n- [Man Spends Entire Career Mastering Crappy Codebase](https://taylor.town/entire-career)\n- [No one actually wants simplicity](https://lukeplant.me.uk/blog/posts/no-one-actually-wants-simplicity/)\n\n---\n\nThis is post 077 of [#100DaysToOffload](https://100daystooffload.com/).","frontmatter":{"title":"🔗 Linkdump: Software Development","date":"2023-09-11","tags":"note, 100DaysToOffload, linkdump, programming, tech"},"tags":["note","100DaysToOffload","linkdump","programming","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-09-11-linkdump-software-development","markdownBody":"\nToday, my feed is full of super interesting links. Here's a bunch of them, in no particular order. Some of them might be a bit older, but just as interesting:\n\n- [What I Have Changed My Mind About in Software Development](https://henrikwarne.com/2023/09/10/what-i-have-changed-my-mind-about-in-software-development/)\n- [A Senior Engineer's CheckList](https://littleblah.com/post/2019-09-01-senior-engineer-checklist/)\n- [The burnout curve](https://thoughtshrapnel.com/2023/09/11/the-burnout-curve/)\n- [How To Be An Engineer That PMs Don't Hate](https://staysaasy.com/engineering/2023/06/18/how-to-be-an-engineer-pms-down-hate.html)\n- [Building and operating a pretty big storage system called S3](https://www.allthingsdistributed.com/2023/07/building-and-operating-a-pretty-big-storage-system.html)\n- [Tailwind, and the death of web craftsmanship](https://pdx.su/blog/2023-07-26-tailwind-and-the-death-of-craftsmanship/)\n- [Man Spends Entire Career Mastering Crappy Codebase](https://taylor.town/entire-career)\n- [No one actually wants simplicity](https://lukeplant.me.uk/blog/posts/no-one-actually-wants-simplicity/)\n\n---\n\nThis is post 077 of [#100DaysToOffload](https://100daystooffload.com/).","frontmatter":{"title":"🔗 Linkdump: Software Development","date":"2023-09-11","tags":"note, 100DaysToOffload, linkdump, programming, tech"},"tags":["note","100DaysToOffload","linkdump","programming","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-09-29-undo-on-mobile-phones.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-09-29-undo-on-mobile-phones.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-09-29-undo-on-mobile-phones","markdownBody":"\nMaybe this is just wishful thinking from someone who grew up in front of a physical keyboard, but I sometimes wish that my phone had a global \"undo\" button.\n\nI'm sure there's a reason why phones have evolved away from having such a feature, but sometimes, especially when editing text, it would be very useful to \"just hit ctrl-z\", or whatever it would be on a phone. Some apps do have such a button, but they explicitly had to place it there and craft a feature around it.\n\nI can imagine that Android and other OSes are capable of exposing an \"undo\" API that apps can implement to make this easier. A gesture well known to the user, similar to the \"back\" button or gesture on Android, would trigger an undo. For text, apps probably won't even have to implement anything. The Textbox element of the UI framework should be capable of undoing changes. For anything more complex, the app decides what to do with this action.\n\nAgain, probably just wishful thinking, but I really want my undos back!\n\n---\n\nThis is post 078 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Undo on mobile phones","date":"2023-09-29","tags":"100DaysToOffload, note, opinion, tech"},"tags":["100DaysToOffload","note","opinion","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]},{"slug":"2024-01-06-a-better-publishing-workflow-for-static-blogs","frontmatter":{"title":"A better publishing workflow for static blogs","date":"2024-01-06","tags":"guide, note, meta, writing, web, github, tech"},"tags":["guide","note","meta","writing","web","github","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-09-29-undo-on-mobile-phones","markdownBody":"\nMaybe this is just wishful thinking from someone who grew up in front of a physical keyboard, but I sometimes wish that my phone had a global \"undo\" button.\n\nI'm sure there's a reason why phones have evolved away from having such a feature, but sometimes, especially when editing text, it would be very useful to \"just hit ctrl-z\", or whatever it would be on a phone. Some apps do have such a button, but they explicitly had to place it there and craft a feature around it.\n\nI can imagine that Android and other OSes are capable of exposing an \"undo\" API that apps can implement to make this easier. A gesture well known to the user, similar to the \"back\" button or gesture on Android, would trigger an undo. For text, apps probably won't even have to implement anything. The Textbox element of the UI framework should be capable of undoing changes. For anything more complex, the app decides what to do with this action.\n\nAgain, probably just wishful thinking, but I really want my undos back!\n\n---\n\nThis is post 078 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Undo on mobile phones","date":"2023-09-29","tags":"100DaysToOffload, note, opinion, tech"},"tags":["100DaysToOffload","note","opinion","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-10-01-the-mind-rope-experiment.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-10-01-the-mind-rope-experiment.json

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-10-03-project-hail-mary.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-10-03-project-hail-mary.json

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-10-09-field-notes-2.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-10-09-field-notes-2.json

0
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-10-10-did-you-try-turning-it-off.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-10-10-did-you-try-turning-it-off.json

2
_next/data/rmckNz7veqFvftdvd7gkL/posts/2023-10-13-organizing-multiple-git-identities.json → _next/data/P6_Tjd_l0BLYM1McFXyK9/posts/2023-10-13-organizing-multiple-git-identities.json

@ -1 +1 @@
{"pageProps":{"post":{"slug":"2023-10-13-organizing-multiple-git-identities","markdownBody":"\nHere's a quick tip on how to manage multiple Git identities (e.g. personal, work, client1, client2).\r\n\r\nI organize my Git repos in three levels. My personal projects live in a `~/sources` directory. All my work projects live in `~/work`. This is the first level.\r\n\r\nLevel 2 is the client, e.g. `~/work/client1`. Naturally, level 3 is the project repository: `~/work/client1/foo-api`.\r\n\r\nThis is how my work directory is organized:\r\n\r\n```\r\n/Users/garrit/work\r\n├── client1\r\n│ ├── foo-api\r\n│ ├── foo-ios\r\n│ └── foo-android\r\n└── client2\r\n ├── bar-ios\r\n └── bar-middleware\r\n```\r\n\r\nNow, say that `client2` demands that we commit with a different identity than our default work email. Besides that, you probably also have a personal email address for your own projects. How do you manage that?\r\n\r\n## .gitconfig includes\r\n\r\nThe global configuration file for Git is `~/.gitconfig`. If you've ever set a parameter like `git config user.name \"Foo Bar\"`: this is where it ended up.\r\n\r\nOne awesome feature of the .gitconfig file is that you can **conditionally include other config files**, and this is what does the trick. Here's my `~/.gitconfig` file:\r\n\r\n```ini\r\n[user]\r\n name = Garrit Franke\r\n email = garrit@slashdev.space\r\n\r\n[includeIf \"gitdir:~/work/\"]\r\n path = ~/.gitconfig-work\r\n\r\n[includeIf \"gitdir:~/work/client2/\"]\r\n path = ~/.gitconfig-client2\r\n\r\n[includeIf \"gitdir:~/sources/\"]\r\n path = ~/.gitconfig-personal\r\n\r\n# ...\r\n```\r\n\r\nBy default, my name and email are always set to my personal identity. I also store some other global settings here, but those are not relevant for this post. If the repository is located inside the `~/work` directory, a file named `~/.gitconfig-work` is included. This is just another gitconfig file. This is what that looks like in my case:\r\n\r\n```ini\r\n[user]\r\n name = Garrit Franke\r\n signingkey = 12345678\r\n email = garrit@work.de\r\n\r\n[commit]\r\n gpgsign = true\r\n```\r\n\r\nI hope you'll see where this is going. For every identity, you keep a separate gitconfig file and include it in the main `~/.gitconfig`. Crucially, this requires you to organize your repositories grouped by client.\r\n\r\nThis trick has simplified my project onboarding quite a bit. No more \"You forgot to update your Email Address\" requests from clients!\r\n\r\n---\r\n\r\nThis is post 083 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Organizing multiple Git identities","date":"2023-10-13","tags":"100DaysToOffload, guide, note, til, git, tech"},"tags":["100DaysToOffload","guide","note","til","git","tech"]},"recommendedPosts":[{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]},{"slug":"2024-01-18-cost-per-request","frontmatter":{"title":"Cost per Request","date":"2024-01-18","tags":"infrastructure, aws, note, opinion, devops, tech"},"tags":["infrastructure","aws","note","opinion","devops","tech"]}]},"__N_SSG":true}
{"pageProps":{"post":{"slug":"2023-10-13-organizing-multiple-git-identities","markdownBody":"\nHere's a quick tip on how to manage multiple Git identities (e.g. personal, work, client1, client2).\r\n\r\nI organize my Git repos in three levels. My personal projects live in a `~/sources` directory. All my work projects live in `~/work`. This is the first level.\r\n\r\nLevel 2 is the client, e.g. `~/work/client1`. Naturally, level 3 is the project repository: `~/work/client1/foo-api`.\r\n\r\nThis is how my work directory is organized:\r\n\r\n```\r\n/Users/garrit/work\r\n├── client1\r\n│ ├── foo-api\r\n│ ├── foo-ios\r\n│ └── foo-android\r\n└── client2\r\n ├── bar-ios\r\n └── bar-middleware\r\n```\r\n\r\nNow, say that `client2` demands that we commit with a different identity than our default work email. Besides that, you probably also have a personal email address for your own projects. How do you manage that?\r\n\r\n## .gitconfig includes\r\n\r\nThe global configuration file for Git is `~/.gitconfig`. If you've ever set a parameter like `git config user.name \"Foo Bar\"`: this is where it ended up.\r\n\r\nOne awesome feature of the .gitconfig file is that you can **conditionally include other config files**, and this is what does the trick. Here's my `~/.gitconfig` file:\r\n\r\n```ini\r\n[user]\r\n name = Garrit Franke\r\n email = garrit@slashdev.space\r\n\r\n[includeIf \"gitdir:~/work/\"]\r\n path = ~/.gitconfig-work\r\n\r\n[includeIf \"gitdir:~/work/client2/\"]\r\n path = ~/.gitconfig-client2\r\n\r\n[includeIf \"gitdir:~/sources/\"]\r\n path = ~/.gitconfig-personal\r\n\r\n# ...\r\n```\r\n\r\nBy default, my name and email are always set to my personal identity. I also store some other global settings here, but those are not relevant for this post. If the repository is located inside the `~/work` directory, a file named `~/.gitconfig-work` is included. This is just another gitconfig file. This is what that looks like in my case:\r\n\r\n```ini\r\n[user]\r\n name = Garrit Franke\r\n signingkey = 12345678\r\n email = garrit@work.de\r\n\r\n[commit]\r\n gpgsign = true\r\n```\r\n\r\nI hope you'll see where this is going. For every identity, you keep a separate gitconfig file and include it in the main `~/.gitconfig`. Crucially, this requires you to organize your repositories grouped by client.\r\n\r\nThis trick has simplified my project onboarding quite a bit. No more \"You forgot to update your Email Address\" requests from clients!\r\n\r\n---\r\n\r\nThis is post 083 of [#100DaysToOffload](https://100daystooffload.com/).\n","frontmatter":{"title":"Organizing multiple Git identities","date":"2023-10-13","tags":"100DaysToOffload, guide, note, til, git, tech"},"tags":["100DaysToOffload","guide","note","til","git","tech"]},"recommendedPosts":[{"slug":"2024-04-15-beware-of-base64-encoded-strings","frontmatter":{"title":"Beware of base64 encoded strings","date":"2024-04-15","tags":"guide, note, learnings, web, til, tech, programming"},"tags":["guide","note","learnings","web","til","tech","programming"]},{"slug":"2024-04-11-a-simple-search-bar","frontmatter":{"title":"A simple search bar","date":"2024-04-11","tags":"guide, note, meta, web, tech, programming"},"tags":["guide","note","meta","web","tech","programming"]},{"slug":"2024-04-04-pandoc-convert-links-to-footnotes-the-easy-way","frontmatter":{"title":"Pandoc: Convert links to footnotes (the easy way)","date":"2024-04-04","tags":"guide, note, writing, til, tech, programming, pandoc"},"tags":["guide","note","writing","til","tech","programming","pandoc"]},{"slug":"2024-04-02-fuck-trees-use-tags","frontmatter":{"title":"Fuck trees, use tags","date":"2024-04-02","tags":"note, opinion, tech"},"tags":["note","opinion","tech"]},{"slug":"2024-01-30-to-prove-something-is-true-try-disproving-it-first","frontmatter":{"title":"To prove something is true, try disproving it first","date":"2024-01-30","tags":"note, quote, practices, til, science"},"tags":["note","quote","practices","til","science"]}]},"__N_SSG":true}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save