{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Today I Learned Archive",
  "home_page_url": "https://waylonwalker.com/til/",
  "feed_url": "https://waylonwalker.com/til/archive/feed.json",
  "description": "Short TIL posts",
  "authors": [
    {
      "name": "Waylon Walker"
    }
  ],
  "items": [
    {
      "id": "https://waylonwalker.com/rsync-delays/",
      "url": "https://waylonwalker.com/rsync-delays/",
      "title": "rsync delays",
      "content_html": "\u003cp\u003eI’ve been deploying my site old school for most of this year, rsync to a volume\nmounted to nginx.  I ran into an issue today where I updated my site and all of\nthe pages updated first, followed by upload.  The issue this created was that\nthe new cache busted css files were not up yet and the site had no styles for a\nbrief period during upload.\u003c/p\u003e\n\u003cp\u003eI found that delaying updates and delaying deletes until the new content exists\nfirst solves this problem pretty well.  Theres still possiblility of jank while\nuploading to a live directory and not doing some sort of hot swap, but I’m good\nwith this low budget option for now.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esync:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\trsync -rlt --delete --omit-dir-times \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t--info\u003cspan class=\"o\"\u003e=\u003c/span\u003eprogress2 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t--delay-updates \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t--delete-delay \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t./output/ \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tserver:/mnt/mysite\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've been deploying my site old school for most of this year, rsync to a volume\nmounted to nginx.  I ran into an issue today where I updated my site and all of\nthe pages updated first, followed by upload.  The issue this created was that\nthe new cache busted css files were not up yet and the site had no styles for a\nbrief period during upload.\n\nI found that delaying updates and delaying deletes until the new content exists\nfirst solves this problem pretty well.  Theres still possiblility of jank while\nuploading to a live directory and not doing some sort of hot swap, but I'm good\nwith this low budget option for now.\n\n``` bash\nsync:\n\trsync -rlt --delete --omit-dir-times \\\n\t--info=progress2 \\\n\t--delay-updates \\\n\t--delete-delay \\\n\t./output/ \\\n\tserver:/mnt/mysite\n```\n",
      "summary": "I've been deploying my site old school for most of this year, rsync to a volume mounted to nginx. I ran into an issue today where I updated my site and all...",
      "date_published": "2026-06-04T17:31:53Z",
      "date_modified": "2026-06-04T17:31:53Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "bash",
        "cli"
      ]
    },
    {
      "id": "https://waylonwalker.com/setopt-hist_ignore_space/",
      "url": "https://waylonwalker.com/setopt-hist_ignore_space/",
      "title": "setopt HIST_IGNORE_SPACE",
      "content_html": "\u003cp\u003eTo ignore commands that start with a space character, use the\n\u003ccode\u003eHIST_IGNORE_SPACE\u003c/code\u003e option in bash or zsh.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esetopt HIST_IGNORE_SPACE\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nTo ignore commands that start with a space character, use the\n`HIST_IGNORE_SPACE` option in bash or zsh.\n\n``` bash\nsetopt HIST_IGNORE_SPACE\n```\n",
      "summary": "To ignore commands that start with a space character, use the option in bash or zsh.",
      "date_published": "2026-05-24T20:15:37Z",
      "date_modified": "2026-05-24T20:15:37Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "bash",
        "cli"
      ]
    },
    {
      "id": "https://waylonwalker.com/forgejo-push-to-create/",
      "url": "https://waylonwalker.com/forgejo-push-to-create/",
      "title": "forgejo push to create",
      "content_html": "\u003cp\u003eI just learned that forgejo has a push to create repo feature and it is a\ngamechanger.  Upon first try it didn’t work, with just a couple of environment\nvariables I was up and running with push to create.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enotify.wayl.one on  main is 📦 v0.1.62  v3.14.4  NO PYTHON VENV SET  USING SYSTEM NVIM\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ git remote add origin https://git.waylonwalker.com/waylon/notify.wayl.one\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enotify.wayl.one on  main is 📦 v0.1.62  v3.14.4  NO PYTHON VENV SET  USING SYSTEM NVIM\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ git push\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Push to create is not enabled \u003cspan class=\"k\"\u003efor\u003c/span\u003e users.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efatal: unable to access \u003cspan class=\"s1\"\u003e\u0026#39;https://git.waylonwalker.com/waylon/notify.wayl.one/\u0026#39;\u003c/span\u003e: The requested URL returned error: \u003cspan class=\"m\"\u003e403\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSo I added the following environment variables.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAuthor: Waylon S. Walker \u0026lt;waylon@waylonwalker.com\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDate:   Wed May 6 21:56:53 2026 -0500\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    enable push to create\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003ediff --git a/k8s/forgejo/deployment.yaml b/k8s/forgejo/deployment.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003eindex d77daab..9346763 100644\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gd\"\u003e--- a/k8s/forgejo/deployment.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+++ b/k8s/forgejo/deployment.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e@@ -91,6 +91,10 @@ spec:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e               value: \u0026#34;0.0.0.0\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             - name: FORGEJO__server__HTTP_PORT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e               value: \u0026#34;3000\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+            - name: FORGEJO__repository__ENABLE_PUSH_CREATE_USER\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+              value: \u0026#34;true\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+            - name: FORGEJO__repository__ENABLE_PUSH_CREATE_ORG\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+              value: \u0026#34;true\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             - name: FORGEJO__database__DB_TYPE\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e               value: postgres\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             - name: FORGEJO__database__HOST\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ca href=\"https://github.com/WaylonWalker/homelab-argo/commit/b2e953bc12\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003ehttps://github.com/WaylonWalker/homelab-argo/commit/b2e953bc12\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eTried again, and it just worked!\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enotify.wayl.one on  main is 📦 v0.1.62  v3.14.4  NO PYTHON VENV SET  USING SYSTEM NVIM\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ git push\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEnumerating objects: 171, \u003cspan class=\"k\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCounting objects: 100% \u003cspan class=\"o\"\u003e(\u003c/span\u003e171/171\u003cspan class=\"o\"\u003e)\u003c/span\u003e, \u003cspan class=\"k\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDelta compression using up to \u003cspan class=\"m\"\u003e12\u003c/span\u003e threads\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCompressing objects: 100% \u003cspan class=\"o\"\u003e(\u003c/span\u003e169/169\u003cspan class=\"o\"\u003e)\u003c/span\u003e, \u003cspan class=\"k\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWriting objects: 100% \u003cspan class=\"o\"\u003e(\u003c/span\u003e171/171\u003cspan class=\"o\"\u003e)\u003c/span\u003e, 176.22 KiB \u003cspan class=\"p\"\u003e|\u003c/span\u003e 16.02 MiB/s, \u003cspan class=\"k\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTotal \u003cspan class=\"m\"\u003e171\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003edelta 99\u003cspan class=\"o\"\u003e)\u003c/span\u003e, reused \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003edelta 0\u003cspan class=\"o\"\u003e)\u003c/span\u003e, pack-reused \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003efrom 0\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Resolving deltas: 100% \u003cspan class=\"o\"\u003e(\u003c/span\u003e99/99\u003cspan class=\"o\"\u003e)\u003c/span\u003e, \u003cspan class=\"k\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTo https://git.waylonwalker.com/waylon/notify.wayl.one\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e * \u003cspan class=\"o\"\u003e[\u003c/span\u003enew branch\u003cspan class=\"o\"\u003e]\u003c/span\u003e      main -\u0026gt; main\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI just learned that forgejo has a push to create repo feature and it is a\ngamechanger.  Upon first try it didn't work, with just a couple of environment\nvariables I was up and running with push to create.\n\n``` bash\nnotify.wayl.one on  main is 📦 v0.1.62  v3.14.4  NO PYTHON VENV SET  USING SYSTEM NVIM\n❯ git remote add origin https://git.waylonwalker.com/waylon/notify.wayl.one\nnotify.wayl.one on  main is 📦 v0.1.62  v3.14.4  NO PYTHON VENV SET  USING SYSTEM NVIM\n❯ git push\nremote: Push to create is not enabled for users.\nfatal: unable to access 'https://git.waylonwalker.com/waylon/notify.wayl.one/': The requested URL returned error: 403\n```\n\nSo I added the following environment variables.\n\n``` diff\nAuthor: Waylon S. Walker \u003cwaylon@waylonwalker.com\u003e\nDate:   Wed May 6 21:56:53 2026 -0500\n\n    enable push to create\n\ndiff --git a/k8s/forgejo/deployment.yaml b/k8s/forgejo/deployment.yaml\nindex d77daab..9346763 100644\n--- a/k8s/forgejo/deployment.yaml\n+++ b/k8s/forgejo/deployment.yaml\n@@ -91,6 +91,10 @@ spec:\n               value: \"0.0.0.0\"\n             - name: FORGEJO__server__HTTP_PORT\n               value: \"3000\"\n+            - name: FORGEJO__repository__ENABLE_PUSH_CREATE_USER\n+              value: \"true\"\n+            - name: FORGEJO__repository__ENABLE_PUSH_CREATE_ORG\n+              value: \"true\"\n             - name: FORGEJO__database__DB_TYPE\n               value: postgres\n             - name: FORGEJO__database__HOST\n```\n\nhttps://github.com/WaylonWalker/homelab-argo/commit/b2e953bc12\n\nTried again, and it just worked!\n\n``` bash\nnotify.wayl.one on  main is 📦 v0.1.62  v3.14.4  NO PYTHON VENV SET  USING SYSTEM NVIM\n❯ git push\nEnumerating objects: 171, done.\nCounting objects: 100% (171/171), done.\nDelta compression using up to 12 threads\nCompressing objects: 100% (169/169), done.\nWriting objects: 100% (171/171), 176.22 KiB | 16.02 MiB/s, done.\nTotal 171 (delta 99), reused 0 (delta 0), pack-reused 0 (from 0)\nremote: Resolving deltas: 100% (99/99), done.\nTo https://git.waylonwalker.com/waylon/notify.wayl.one\n * [new branch]      main -\u003e main\n ```\n",
      "summary": "I just learned that forgejo has a push to create repo feature and it is a gamechanger. Upon first try it didn't work, with just a couple of environment...",
      "date_published": "2026-05-06T21:58:55Z",
      "date_modified": "2026-05-06T21:58:55Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "git"
      ]
    },
    {
      "id": "https://waylonwalker.com/nless/",
      "url": "https://waylonwalker.com/nless/",
      "title": "nless",
      "content_html": "\u003cp\u003enless is a seriously sick tui for exploring streaming data.  It makes it\nseriously simple to pivot (U), drill in (Enter), sort (s).  It leave\nbreadcrumbs as you go and you can press q to back out.\u003c/p\u003e\n\u003cp\u003ePlay with your kubernetes events.  Ya, my \u003ca href=\"/homelab/\" class=\"glossary-term\" title=\"A place to self host applications. For me this is primarily self built web applications, and applications for sharing files with my family. Techno Tim has a...\"\u003ehomelab\u003c/a\u003e is far from perfect, dont judge.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl get events -A -w \u003cspan class=\"p\"\u003e|\u003c/span\u003e uvx --from nothing-less nless\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"http://dropper.wayl.one/file/ceda8873-cb08-4436-a3ac-b5bf4a0b2379.mp4\" class=\"glightbox-link\" aria-label=\"ceda8873-cb08-4436-a3ac-b5bf4a0b2379.mp4\"\u003e\u003cvideo autoplay loop muted playsinline controls preload=\"metadata\" class=\"md-video\" poster=\"https://dropper.wayl.one/file/ceda8873-cb08-4436-a3ac-b5bf4a0b2379.webp?h=675\u0026w=1200\"\u003e\u003csource src=\"http://dropper.wayl.one/file/ceda8873-cb08-4436-a3ac-b5bf4a0b2379.mp4\" type=\"video/mp4\"\u003eceda8873-cb08-4436-a3ac-b5bf4a0b2379.mp4\u003c/video\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nnless is a seriously sick tui for exploring streaming data.  It makes it\nseriously simple to pivot (U), drill in (Enter), sort (s).  It leave\nbreadcrumbs as you go and you can press q to back out.\n\nPlay with your kubernetes events.  Ya, my homelab is far from perfect, dont judge.\n\n``` bash\nkubectl get events -A -w | uvx --from nothing-less nless\n```\n\n![ceda8873-cb08-4436-a3ac-b5bf4a0b2379.mp4](http://dropper.wayl.one/file/ceda8873-cb08-4436-a3ac-b5bf4a0b2379.mp4)\n",
      "summary": "nless is a seriously sick tui for exploring streaming data. It makes it seriously simple to pivot (U), drill in (Enter), sort (s). It leave breadcrumbs as...",
      "date_published": "2026-05-06T20:45:01Z",
      "date_modified": "2026-05-06T20:45:01Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/image-compare-in-markata-go/",
      "url": "https://waylonwalker.com/image-compare-in-markata-go/",
      "title": "image compare in markata go",
      "content_html": "\u003cp\u003e\u003ccode\u003emarkata-go\u003c/code\u003e now has web awesome integration for image compare.  It renders a\nnice web component with a slider to compare two images.\u003c/p\u003e\n\u003cwa-comparison class=\"markata-webawesome-comparison\"\u003e\u003cimg slot=\"after\" src=\"https://dropper.wayl.one/file/d628ffba-de18-4fff-91a8-700f037df119.webp\" alt=\"d628ffba-de18-4fff-91a8-700f037df119.webp\" loading=\"lazy\"\u003e\u003cimg slot=\"before\" src=\"https://dropper.waylonwalker.com/file/ca30665f-1a15-453e-aab8-221901c7df99.webp\" alt=\"\" loading=\"lazy\"\u003e\u003c/wa-comparison\u003e\n\u003cp\u003eIt’s done with a class wrapper around the image components.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-comparison\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003ed628ffba-de18-4fff-91a8-700f037df119.webp\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://dropper.wayl.one/file/d628ffba-de18-4fff-91a8-700f037df119.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![](https://dropper.waylonwalker.com/file/ca30665f-1a15-453e-aab8-221901c7df99.webp)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWithout \u003ccode\u003emarkata-go\u003c/code\u003e’s web awesome integration, the above would look like:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;module\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;https://ka-f.webawesome.com/webawesome@3.6.0/components/comparison/comparison.js\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ewa-comparison\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eslot\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;before\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://dropper.wayl.one/file/d628ffba-de18-4fff-91a8-700f037df119.webp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Grayscale version of kittens in a basket looking around.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eslot\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;after\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://dropper.waylonwalker.com/file/ca30665f-1a15-453e-aab8-221901c7df99.webp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Color version of kittens in a basket looking around.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ewa-comparison\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n`markata-go` now has web awesome integration for image compare.  It renders a\nnice web component with a slider to compare two images.\n\n::: wa-comparison\n![d628ffba-de18-4fff-91a8-700f037df119.webp](https://dropper.wayl.one/file/d628ffba-de18-4fff-91a8-700f037df119.webp)\n![](https://dropper.waylonwalker.com/file/ca30665f-1a15-453e-aab8-221901c7df99.webp)\n:::\n\nIt's done with a class wrapper around the image components.\n\n``` md\n::: wa-comparison\n![d628ffba-de18-4fff-91a8-700f037df119.webp](https://dropper.wayl.one/file/d628ffba-de18-4fff-91a8-700f037df119.webp)\n![](https://dropper.waylonwalker.com/file/ca30665f-1a15-453e-aab8-221901c7df99.webp)\n:::\n```\n\nWithout `markata-go`'s web awesome integration, the above would look like:\n\n``` html\n\u003cscript type=\"module\"\u003e\n  import 'https://ka-f.webawesome.com/webawesome@3.6.0/components/comparison/comparison.js';\n\u003c/script\u003e\n\n\u003cwa-comparison\u003e\n  \u003cimg\n    slot=\"before\"\n    src=\"https://dropper.wayl.one/file/d628ffba-de18-4fff-91a8-700f037df119.webp\"\n    alt=\"Grayscale version of kittens in a basket looking around.\"\n  /\u003e\n  \u003cimg\n    slot=\"after\"\n    src=\"https://dropper.waylonwalker.com/file/ca30665f-1a15-453e-aab8-221901c7df99.webp\"\n    alt=\"Color version of kittens in a basket looking around.\"\n  /\u003e\n\u003c/wa-comparison\u003e\n```\n\n",
      "summary": "now has web awesome integration for image compare. It renders a nice web component with a slider to compare two images.",
      "date_published": "2026-05-01T07:40:44Z",
      "date_modified": "2026-05-01T07:40:44Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/testing-copilot-model-flag/",
      "url": "https://waylonwalker.com/testing-copilot-model-flag/",
      "title": "testing copilot model flag",
      "content_html": "\u003cp\u003eToday I found a way to test model syntax, cause the clankers always get the\nexact model name that copilot wants wrong.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecopilot --model claude-sonnet-4.5 -p \u003cspan class=\"s2\"\u003e\u0026#34;Reply with OK\u0026#34;\u003c/span\u003e --allow-all --no-ask-user -s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecopilot --model gpt-5.4 -p \u003cspan class=\"s2\"\u003e\u0026#34;Reply with OK\u0026#34;\u003c/span\u003e --allow-all --no-ask-user -s\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nToday I found a way to test model syntax, cause the clankers always get the\nexact model name that copilot wants wrong.\n\n``` bash\ncopilot --model claude-sonnet-4.5 -p \"Reply with OK\" --allow-all --no-ask-user -s\ncopilot --model gpt-5.4 -p \"Reply with OK\" --allow-all --no-ask-user -s\n```\n",
      "summary": "Today I found a way to test model syntax, cause the clankers always get the exact model name that copilot wants wrong.",
      "date_published": "2026-04-29T11:05:39Z",
      "date_modified": "2026-04-29T11:05:39Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "cli"
      ]
    },
    {
      "id": "https://waylonwalker.com/stow-local-ignore/",
      "url": "https://waylonwalker.com/stow-local-ignore/",
      "title": "stow local ignore",
      "content_html": "\u003cp\u003eStow comes with a local and global ignore list that you can use to ignore\ncertain files or directories.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you put Perl regular expressions, one per line, in a .stow-local-ignore\nfile within any top level package directory, in which case any file or\ndirectory within that package matching any of these regular expressions will\nbe ignored. In the absence of this package-specific ignore list, Stow will\ninstead use the contents of ~/.stow-global-ignore, if it exists. If neither\nthe package-local or global ignore list exist, Stow will use its own built-in\ndefault ignore list, which serves as a useful example of the format of these\nignore list files:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eExample given from the docs\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRCS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e.+,v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCVS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.\\#.+       # CVS conflict files / emacs lock files\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.cvsignore\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.svn\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e_darcs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.hg\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.gitignore\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.gitmodules\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e.+~          # emacs backup files\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\#.*\\#       # emacs autosave files\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e^/README.*\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e^/LICENSE.*\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e^/COPYING\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"reference\"\u003eReference \u003ca href=\"#reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://www.gnu.org/software/stow/manual/html_node/Types-And-Syntax-Of-Ignore-Lists.html\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/www.gnu.org.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/www.gnu.org.png\" class=\"has-avatar  has-avatar-before\"\u003ehttps://www.gnu.org/software/stow/manual/html_node/Types-And-Syntax-Of-Ignore-Lists.html\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nStow comes with a local and global ignore list that you can use to ignore\ncertain files or directories.\n\n\n\u003e If you put Perl regular expressions, one per line, in a .stow-local-ignore\n\u003e file within any top level package directory, in which case any file or\n\u003e directory within that package matching any of these regular expressions will\n\u003e be ignored. In the absence of this package-specific ignore list, Stow will\n\u003e instead use the contents of ~/.stow-global-ignore, if it exists. If neither\n\u003e the package-local or global ignore list exist, Stow will use its own built-in\n\u003e default ignore list, which serves as a useful example of the format of these\n\u003e ignore list files:\n\nExample given from the docs\n\n``` text\nRCS\n.+,v\n\nCVS\n\\.\\#.+       # CVS conflict files / emacs lock files\n\\.cvsignore\n\n\\.svn\n_darcs\n\\.hg\n\n\\.git\n\\.gitignore\n\\.gitmodules\n\n.+~          # emacs backup files\n\\#.*\\#       # emacs autosave files\n\n^/README.*\n^/LICENSE.*\n^/COPYING\n```\n\n\n## Reference\n\nhttps://www.gnu.org/software/stow/manual/html_node/Types-And-Syntax-Of-Ignore-Lists.html\n",
      "summary": "Stow comes with a local and global ignore list that you can use to ignore certain files or directories.",
      "date_published": "2026-04-18T10:36:00Z",
      "date_modified": "2026-04-18T10:36:00Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/move-zmk-keyboard-to-new-bluetooth-adapter/",
      "url": "https://waylonwalker.com/move-zmk-keyboard-to-new-bluetooth-adapter/",
      "title": "move zmk keyboard to new bluetooth adapter",
      "content_html": "\u003cp\u003eI’ve been having issue with my keyboard disconnecting to my main desktop for\nawhile.  Today I got a cheap bluetooh dongle in and am giving it a run this\nweek to see how things go.  The first step was to move it to the new adapter.\nI’ve never had multiple adapters installed so this was a new to me process.\u003c/p\u003e\n\u003cp\u003eI was able to do it all with the same keyboard, It did require some juggling\nbetween usb and bluetooth modes pluging and unplugging, two keyboards would be\nsimpler to reason about.\u003c/p\u003e\n\u003cp\u003eI can’t be bothered to change my brain to think about this machine on a\ndifferent zmk profile it is of absolute importance for it to remain on the same\nprofile, otherwise this would be a simple bind to another empty profile.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eWhy not use a cable on desktop?\u003c/p\u003e\n\u003cp\u003eI dont mind cable, and have used one on this setup for years, but I have\nactually been picking up and moving this keyboard and using it with\ndifferent devices.\u003c/p\u003e\n\u003cp\u003eI’ve got a big battery and performace cranked up, unless my machine is\nunder load I do not notice any key lag.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eI did it with bluetoothctl, I’m sure it could have been done with a gui like\n\u003ccode\u003eblueberry\u003c/code\u003e or \u003ccode\u003eblueman\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebluetoothctl\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# list adapters\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elist\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eselect\u003c/span\u003e \u0026lt;old-adapter\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edevices\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# fin the MAC address of the device 42BLOCK\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremove \u0026lt;42BLOCK_MAC\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow I plugged into usb. And \u003cstrong\u003eimportantly\u003c/strong\u003e cleared out the zmk profile.  If\nyou do not clear the profile your board does not go into pairing mode.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebluetoothctl\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# switch adapters\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eselect\u003c/span\u003e \u0026lt;new-adapter\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epower on\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eagent on\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edefault-agent\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003escan on\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePut 42Block in pairing mode, \u003cspan class=\"k\"\u003ethen\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epair \u0026lt;42BLOCK_MAC\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etrust \u0026lt;42BLOCK_MAC\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAt this pint I saw this show up in the logs, I think there was some masking\nissues or something in zmk, output kept going out usb no matter what so I\ndisconnected the keyboard and typed the passkey in, and it worked.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003eagent\u003cspan class=\"o\"\u003e]\u003c/span\u003e Passkey: \u003cspan class=\"m\"\u003e540044\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBoom, it just started working right away.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebluetoothctl\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econnect \u0026lt;42BLOCK_MAC\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einfo \u0026lt;42BLOCK_MAC\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003escan off\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've been having issue with my keyboard disconnecting to my main desktop for\nawhile.  Today I got a cheap bluetooh dongle in and am giving it a run this\nweek to see how things go.  The first step was to move it to the new adapter.\nI've never had multiple adapters installed so this was a new to me process.\n\nI was able to do it all with the same keyboard, It did require some juggling\nbetween usb and bluetooth modes pluging and unplugging, two keyboards would be\nsimpler to reason about.\n\nI can't be bothered to change my brain to think about this machine on a\ndifferent zmk profile it is of absolute importance for it to remain on the same\nprofile, otherwise this would be a simple bind to another empty profile.\n\n!!! note \"Why not use a cable on desktop?\"\n\n    I dont mind cable, and have used one on this setup for years, but I have\n    actually been picking up and moving this keyboard and using it with\n    different devices.\n\n    I've got a big battery and performace cranked up, unless my machine is\n    under load I do not notice any key lag.\n\nI did it with bluetoothctl, I'm sure it could have been done with a gui like\n`blueberry` or `blueman`.\n\n``` bash\nbluetoothctl\n# list adapters\nlist\nselect \u003cold-adapter\u003e\ndevices\n# fin the MAC address of the device 42BLOCK\nremove \u003c42BLOCK_MAC\u003e\n```\n\nNow I plugged into usb. And **importantly** cleared out the zmk profile.  If\nyou do not clear the profile your board does not go into pairing mode.\n\n``` bash\nbluetoothctl\n# switch adapters\nselect \u003cnew-adapter\u003e\npower on\nagent on\ndefault-agent\nscan on\nPut 42Block in pairing mode, then:\npair \u003c42BLOCK_MAC\u003e\ntrust \u003c42BLOCK_MAC\u003e\n```\n\nAt this pint I saw this show up in the logs, I think there was some masking\nissues or something in zmk, output kept going out usb no matter what so I\ndisconnected the keyboard and typed the passkey in, and it worked.\n\n``` bash\n[agent] Passkey: 540044\n```\n\nBoom, it just started working right away.\n\n``` bash\nbluetoothctl\nconnect \u003c42BLOCK_MAC\u003e\ninfo \u003c42BLOCK_MAC\u003e\nscan off\nexit\n```\n",
      "summary": "I've been having issue with my keyboard disconnecting to my main desktop for awhile. Today I got a cheap bluetooh dongle in and am giving it a run this week...",
      "date_published": "2026-03-23T17:59:59Z",
      "date_modified": "2026-03-23T17:59:59Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "keeb",
        "zmk"
      ]
    },
    {
      "id": "https://waylonwalker.com/dot-dockerenv/",
      "url": "https://waylonwalker.com/dot-dockerenv/",
      "title": "dot dockerenv",
      "content_html": "\u003cp\u003eToday I learned that docker creates an empty \u003ccode\u003e/.dockerenv\u003c/code\u003e file to indicate that\nyou are running in a docker container.  Other runtimes like podman commonly use\n\u003ccode\u003e/run/.containerenv\u003c/code\u003e.  kubernetes uses neither of these, the most common way to\ndetect if you are running in kubernetes is to check for the presence of the\n\u003ccode\u003eKUBERNETES_SERVICE_HOST\u003c/code\u003e environment variable.  There will also be a directory\nat \u003ccode\u003e/var/run/secrets/kubernetes.io/serviceaccount\u003c/code\u003e that contains the service\naccount credentials if you are running in kubernetes.\u003c/p\u003e\n",
      "content_text": "\nToday I learned that docker creates an empty `/.dockerenv` file to indicate that\nyou are running in a docker container.  Other runtimes like podman commonly use\n`/run/.containerenv`.  kubernetes uses neither of these, the most common way to\ndetect if you are running in kubernetes is to check for the presence of the\n`KUBERNETES_SERVICE_HOST` environment variable.  There will also be a directory\nat `/var/run/secrets/kubernetes.io/serviceaccount` that contains the service\naccount credentials if you are running in kubernetes.\n\n",
      "summary": "Today I learned that docker creates an empty file to indicate that you are running in a docker container. Other runtimes like podman commonly use ....",
      "date_published": "2026-03-18T10:07:16Z",
      "date_modified": "2026-03-18T10:07:16Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "docker",
        "kubernetes"
      ]
    },
    {
      "id": "https://waylonwalker.com/gh-do-i-have-a-pr/",
      "url": "https://waylonwalker.com/gh-do-i-have-a-pr/",
      "title": "gh do I have a pr",
      "content_html": "\u003cp\u003eIn the age of agents sometimes work gets done on so many different worktrees\nand branches its hard to tell if there is already a PR or any of them or not,\nthe great \u003ccode\u003egh\u003c/code\u003e cli has us covered.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egh pr list --head fix/markata-go-connections-graph\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nIn the age of agents sometimes work gets done on so many different worktrees\nand branches its hard to tell if there is already a PR or any of them or not,\nthe great `gh` cli has us covered.\n\n``` bash\ngh pr list --head fix/markata-go-connections-graph\n```\n",
      "summary": "In the age of agents sometimes work gets done on so many different worktrees and branches its hard to tell if there is already a PR or any of them or not,...",
      "date_published": "2026-03-02T08:47:44Z",
      "date_modified": "2026-03-02T08:47:44Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "cli"
      ]
    },
    {
      "id": "https://waylonwalker.com/double-gutter/",
      "url": "https://waylonwalker.com/double-gutter/",
      "title": "double gutter",
      "content_html": "\u003cp\u003eI keep forgetting about the double gutter problem with nested containers.  When\nyou put padding on a parent and the child also has padding, you get twice the\nspacing you wanted.\u003c/p\u003e\n\u003ch2 id=\"the-problem\"\u003eThe Problem \u003ca href=\"#the-problem\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003econtainer\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echild\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow your content is 4rem from the edge.  Not what I meant at all.\u003c/p\u003e\n\u003ch2 id=\"the-fix\"\u003eThe Fix \u003ca href=\"#the-fix\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEither remove padding from the parent or use \u003ccode\u003ebox-sizing: border-box\u003c/code\u003e and plan\nfor it.  I usually just drop the parent padding when I realize what I have done.\u003c/p\u003e\n",
      "content_text": "\nI keep forgetting about the double gutter problem with nested containers.  When\nyou put padding on a parent and the child also has padding, you get twice the\nspacing you wanted.\n\n## The Problem\n\n```css\n.container {\n  padding: 2rem;\n}\n\n.child {\n  padding: 2rem;\n}\n```\n\nNow your content is 4rem from the edge.  Not what I meant at all.\n\n## The Fix\n\nEither remove padding from the parent or use `box-sizing: border-box` and plan\nfor it.  I usually just drop the parent padding when I realize what I have done.",
      "summary": "I keep forgetting about the double gutter problem with nested containers. When you put padding on a parent and the child also has padding, you get twice the...",
      "date_published": "2026-02-14T09:12:42Z",
      "date_modified": "2026-02-14T09:12:42Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/diff-kubernetes-manifest-with-cluster/",
      "url": "https://waylonwalker.com/diff-kubernetes-manifest-with-cluster/",
      "title": "diff kubernetes manifest with cluster",
      "content_html": "\u003cp\u003eLike a dufus this morning I did a hard reset on a \u003ca href=\"/glossary/git/\" class=\"glossary-term\" title=\"Git is a version control system for tracking changes in source code during software development. In the beginning there were many, some were licensed. As...\"\u003egit\u003c/a\u003e repo for getting I was\nworking on a manifest for.  You see I generally use argo, but occasionally I\nhave no idea what I am doing or want yet and I start raw doggin it, fully aware\nthat I’m going to just nuke this namespace before getting it into a proper\nargocd.\u003c/p\u003e\n\u003cp\u003eI was overjoyed when I found out that you can diff your manifests with live\nproduction using the \u003ccode\u003ekubectl diff\u003c/code\u003e command.  It uses standard diff so you can\nbring all your fancy diff viewers you like.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# regular manifest\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl diff -f k8s/shots -n shot\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# kustomize\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl diff -k k8s -n go-waylonwalker-com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# using a fancy diff viewer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl diff -f k8s/shots -n shot \u003cspan class=\"p\"\u003e|\u003c/span\u003e delta\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# using an even fancier diff viewer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# pinkies out for this one\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl diff -f k8s/shots -n shot \u003cspan class=\"p\"\u003e|\u003c/span\u003e delta --diff-so-fancy\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow I can get those changes back that I thought I lost, and apply updates with\nconfidence knowing what is about to change.\u003c/p\u003e\n",
      "content_text": "\nLike a dufus this morning I did a hard reset on a git repo for getting I was\nworking on a manifest for.  You see I generally use argo, but occasionally I\nhave no idea what I am doing or want yet and I start raw doggin it, fully aware\nthat I'm going to just nuke this namespace before getting it into a proper\nargocd.\n\nI was overjoyed when I found out that you can diff your manifests with live\nproduction using the `kubectl diff` command.  It uses standard diff so you can\nbring all your fancy diff viewers you like.\n\n``` bash\n# regular manifest\nkubectl diff -f k8s/shots -n shot\n# kustomize\nkubectl diff -k k8s -n go-waylonwalker-com\n# using a fancy diff viewer\nkubectl diff -f k8s/shots -n shot | delta\n# using an even fancier diff viewer\n# pinkies out for this one\nkubectl diff -f k8s/shots -n shot | delta --diff-so-fancy\n```\n\nNow I can get those changes back that I thought I lost, and apply updates with\nconfidence knowing what is about to change.\n",
      "summary": "Like a dufus this morning I did a hard reset on a git repo for getting I was working on a manifest for. You see I generally use argo, but occasionally I have...",
      "date_published": "2026-02-05T09:37:39Z",
      "date_modified": "2026-02-05T09:37:39Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "kubernetes"
      ]
    },
    {
      "id": "https://waylonwalker.com/format-markdown-with-mdformat/",
      "url": "https://waylonwalker.com/format-markdown-with-mdformat/",
      "title": "format markdown with mdformat",
      "content_html": "\u003cp\u003eI really wish I would have got this right a few years ago. Theres a couple of\nflags I had to use to get mdformat to do hard wraps at 80 characters and not\nwreck tables. This mix of flags and plugins is workign really well for me so\nfar.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emdfmt\u003cspan class=\"o\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    uvx \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-ruff\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-beautysh\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-web\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-config\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-gfm\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-front-matters\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-wikilink\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-simple-breaks\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        mdformat \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --wrap \u003cspan class=\"m\"\u003e80\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --end-of-line lf \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --codeformatters python \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --codeformatters bash \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$@\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd as pre-commmit.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003erepos\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/hukkin/mdformat\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1.0.0\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# pin to the version you want\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emdformat\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- --\u003cspan class=\"l\"\u003ewrap\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;80\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- --\u003cspan class=\"l\"\u003eend-of-line\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003elf\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- --\u003cspan class=\"l\"\u003ecodeformatters\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003epython\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- --\u003cspan class=\"l\"\u003ecodeformatters\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003ebash\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eadditional_dependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-ruff\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-beautysh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-web\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-config\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-gfm\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-front-matters\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-wikilink\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-simple-breaks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI really wish I would have got this right a few years ago. Theres a couple of\nflags I had to use to get mdformat to do hard wraps at 80 characters and not\nwreck tables. This mix of flags and plugins is workign really well for me so\nfar.\n\n```bash\nmdfmt() {\n    uvx \\\n        --with \"mdformat-ruff\" \\\n        --with \"mdformat-beautysh\" \\\n        --with \"mdformat-web\" \\\n        --with \"mdformat-config\" \\\n        --with \"mdformat-gfm\" \\\n        --with \"mdformat-front-matters\" \\\n        --with \"mdformat-wikilink\" \\\n        --with \"mdformat-simple-breaks\" \\\n        mdformat \\\n        --wrap 80 \\\n        --end-of-line lf \\\n        --codeformatters python \\\n        --codeformatters bash \\\n        \"$@\"\n}\n```\n\nAnd as pre-commmit.\n\n```yaml\nrepos\n  - repo: https://github.com/hukkin/mdformat\n    rev: 1.0.0  # pin to the version you want\n    hooks:\n      - id: mdformat\n        args:\n          - --wrap\n          - \"80\"\n          - --end-of-line\n          - lf\n          - --codeformatters\n          - python\n          - --codeformatters\n          - bash\n        additional_dependencies:\n          - mdformat-ruff\n          - mdformat-beautysh\n          - mdformat-web\n          - mdformat-config\n          - mdformat-gfm\n          - mdformat-front-matters\n          - mdformat-wikilink\n          - mdformat-simple-breaks\n```\n",
      "summary": "I really wish I would have got this right a few years ago. Theres a couple of flags I had to use to get mdformat to do hard wraps at 80 characters and not...",
      "date_published": "2026-01-19T20:41:14Z",
      "date_modified": "2026-01-19T20:41:14Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/opencode-variants/",
      "url": "https://waylonwalker.com/opencode-variants/",
      "title": "opencode variants",
      "content_html": "\u003cp\u003eOpencode is changing on the daily right now, today I noticed the word \u003ccode\u003elow\u003c/code\u003e pop\nup in Orange text in my opencode window.  Looking into this they are exposing\n\u003ca href=\"https://opencode.ai/docs/models/#variants\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/opencode.ai.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/opencode.ai.ico\" class=\"has-avatar  has-avatar-before\"\u003evariants\u003c/a\u003e to the user.  This allows\nyou to change between fast or slow and thinking, the later taking more time to\nprepare before doing an action.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/0b6bfe5e-41b0-4e44-8c5a-ff88739a770e.mp4\" class=\"glightbox-link\" aria-label=\"Swapping Variants in opencode\"\u003e\u003cvideo autoplay loop muted playsinline controls preload=\"metadata\" class=\"md-video\" poster=\"https://dropper.waylonwalker.com/file/0b6bfe5e-41b0-4e44-8c5a-ff88739a770e.webp?h=675\u0026w=1200\"\u003e\u003csource src=\"https://dropper.waylonwalker.com/file/0b6bfe5e-41b0-4e44-8c5a-ff88739a770e.mp4\" type=\"video/mp4\"\u003eSwapping Variants in opencode\u003c/video\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eIt looks like this toggle may have been here for awhile and I’m just now\ndiscovering it. Potentially because its a new feature of the free Zen provider.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eVariants\nMany models support multiple variants with different configurations. OpenCode ships with built-in default variants for popular providers.\u003c/p\u003e\n\u003cp\u003eBuilt-in variants\nOpenCode ships with default variants for many providers:\u003c/p\u003e\n\u003cp\u003eAnthropic:\u003c/p\u003e\n\u003cp\u003ehigh - High thinking budget (default)\nmax - Maximum thinking budget\nOpenAI:\u003c/p\u003e\n\u003cp\u003eVaries by model but roughly:\u003c/p\u003e\n\u003cp\u003enone - No reasoning\nminimal - Minimal reasoning effort\nlow - Low reasoning effort\nmedium - Medium reasoning effort\nhigh - High reasoning effort\nxhigh - Extra high reasoning effort\nGoogle:\u003c/p\u003e\n\u003cp\u003elow - Lower effort/token budget\nhigh - Higher effort/token budget\u003c/p\u003e\n\u003c/blockquote\u003e\n",
      "content_text": "\nOpencode is changing on the daily right now, today I noticed the word `low` pop\nup in Orange text in my opencode window.  Looking into this they are exposing\n[variants](https://opencode.ai/docs/models/#variants) to the user.  This allows\nyou to change between fast or slow and thinking, the later taking more time to\nprepare before doing an action.\n\n![Swapping Variants in opencode](https://dropper.waylonwalker.com/file/0b6bfe5e-41b0-4e44-8c5a-ff88739a770e.mp4)\n\nIt looks like this toggle may have been here for awhile and I'm just now\ndiscovering it. Potentially because its a new feature of the free Zen provider.\n\n\u003e Variants\nMany models support multiple variants with different configurations. OpenCode ships with built-in default variants for popular providers.\n\u003e \n\u003e Built-in variants\n\u003e OpenCode ships with default variants for many providers:\n\u003e \n\u003e Anthropic:\n\u003e \n\u003e high - High thinking budget (default)\n\u003e max - Maximum thinking budget\n\u003e OpenAI:\n\u003e \n\u003e Varies by model but roughly:\n\u003e \n\u003e none - No reasoning\n\u003e minimal - Minimal reasoning effort\n\u003e low - Low reasoning effort\n\u003e medium - Medium reasoning effort\n\u003e high - High reasoning effort\n\u003e xhigh - Extra high reasoning effort\n\u003e Google:\n\u003e \n\u003e low - Lower effort/token budget\n\u003e high - Higher effort/token budget\n",
      "summary": "Opencode is changing on the daily right now, today I noticed the word pop up in Orange text in my opencode window. Looking into this they are exposing...",
      "date_published": "2026-01-13T08:53:36Z",
      "date_modified": "2026-01-13T08:53:36Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "ai",
        "llm",
        "opencode"
      ]
    },
    {
      "id": "https://waylonwalker.com/opencode-init-prompt/",
      "url": "https://waylonwalker.com/opencode-init-prompt/",
      "title": "opencode init prompt",
      "content_html": "\u003cp\u003eThis is opencode’s init prompt.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePlease analyze this codebase and create an AGENTS.md file containing:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e1.\u003c/span\u003e Build/lint/test commands - especially for running a single test\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e2.\u003c/span\u003e Code style guidelines including imports, formatting, types, naming conventions, error handling, etc.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThe file you create will be given to agentic coding agents (such as yourself) that operate in this repository. Make it about 150 lines long.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIf there are Cursor rules (in .cursor/rules/ or .cursorrules) or Copilot rules (in .github/copilot-instructions.md), make sure to include them.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIf there\u0026#39;s already an AGENTS.md, improve it if it\u0026#39;s located in \u0026lt;dir\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nThis is opencode's init prompt.\n\n``` markdown\nPlease analyze this codebase and create an AGENTS.md file containing:\n1. Build/lint/test commands - especially for running a single test\n2. Code style guidelines including imports, formatting, types, naming conventions, error handling, etc.\nThe file you create will be given to agentic coding agents (such as yourself) that operate in this repository. Make it about 150 lines long.\nIf there are Cursor rules (in .cursor/rules/ or .cursorrules) or Copilot rules (in .github/copilot-instructions.md), make sure to include them.\nIf there's already an AGENTS.md, improve it if it's located in \u003cdir\u003e\n```\n",
      "summary": "This is opencode's init prompt.",
      "date_published": "2026-01-09T13:32:12Z",
      "date_modified": "2026-01-09T13:32:12Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "ai",
        "llm"
      ]
    },
    {
      "id": "https://waylonwalker.com/til/tpope-vim-speeddating/",
      "url": "https://waylonwalker.com/til/tpope-vim-speeddating/",
      "title": "tpope vim-speeddating",
      "content_html": "\u003cp\u003eToday I discovered \u003ca href=\"https://github.com/tpope/vim-speeddating\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003evim-speeddating\u003c/a\u003e\nby tpope.  I’m sure I’ve seen years ago but it did not click for my workflow\nuntil today.  I often go through pictures from my phone for the past few days\nand make \u003ca class=\"wikilink\" data-description=\"All posts with the tag \u0026#34;shots\u0026#34;\" data-title=\"Posts tagged: shots\" href=\"/tags/shots/\" data-preview=\"All posts with the tag \u0026#34;shots\u0026#34;\"\u003ePosts tagged: shots\u003c/a\u003e posts, but I want to date them to about when the image was\ntaken most of the time.  This allows me to quickly bump days up and down using\n\u003ccode\u003ec-a\u003c/code\u003e and \u003ccode\u003ec-x\u003c/code\u003e even around the new year.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/18c876c3-02ea-4c77-9f62-cdbb1bb759a1.mp4\" class=\"glightbox-link\" aria-label=\"Open image\"\u003e\u003cvideo autoplay loop muted playsinline controls preload=\"metadata\" class=\"md-video\" poster=\"https://dropper.waylonwalker.com/file/18c876c3-02ea-4c77-9f62-cdbb1bb759a1.webp?h=675\u0026w=1200\"\u003e\u003csource src=\"https://dropper.waylonwalker.com/file/18c876c3-02ea-4c77-9f62-cdbb1bb759a1.mp4\" type=\"video/mp4\"\u003eYour browser does not support the video tag.\u003c/video\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\u003cp\u003eSound on, listen to those new switches.\u003c/p\u003e\u003c/figcaption\u003e\u003c/figure\u003e\n",
      "content_text": "\nToday I discovered [vim-speeddating](https://github.com/tpope/vim-speeddating)\nby tpope.  I'm sure I've seen years ago but it did not click for my workflow\nuntil today.  I often go through pictures from my phone for the past few days\nand make \u003ca href=\"/tags/shots/\" class=\"wikilink\" data-title=\"Posts tagged: shots\" data-description=\"All posts with the tag \u0026#34;shots\u0026#34;\"\u003ePosts tagged: shots\u003c/a\u003e posts, but I want to date them to about when the image was\ntaken most of the time.  This allows me to quickly bump days up and down using\n`c-a` and `c-x` even around the new year.\n\n![](https://dropper.waylonwalker.com/file/18c876c3-02ea-4c77-9f62-cdbb1bb759a1.mp4)\n\n\u003e Sound on, listen to those new switches.\n\n\n",
      "summary": "Today I discovered vim-speeddating by tpope. I'm sure I've seen years ago but it did not click for my workflow until today. I often go through pictures from...",
      "date_published": "2026-01-04T16:59:33Z",
      "date_modified": "2026-01-04T16:59:33Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "vim"
      ]
    },
    {
      "id": "https://waylonwalker.com/light-mode-screen-recording-css/",
      "url": "https://waylonwalker.com/light-mode-screen-recording-css/",
      "title": "light mode screen recording css",
      "content_html": "\u003cp\u003eYesterday I wrote about a way to do \u003ca class=\"wikilink\" data-date=\"2026-01-01\" data-description=\"I saw this tip from Cassidoo and had to try it out for myself. I kicked on a screen recording right from where my terminal was, converted it, and it actually...\" data-title=\"light mode screen recording\" href=\"/light-mode-screen-recording/\" data-preview=\"I saw this tip from Cassidoo and had to try it out for myself. I kicked on a screen recording right from where my terminal was, converted it, and it actually...\"\u003elight mode screen recording\u003c/a\u003e to\nconvert to light mode from dark mode with ffmpeg.  I was wondering if it could\nbe done entirely on the front end for web applications.  Turns out you can.\nI’m sure there are limited wikis and site builders that don’t allow adding\nstyle like this, but it works if you can.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003evideo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003econtrols\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;filter: invert(1) hue-rotate(180deg) contrast(1.2) saturate(1.1);\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003evideo\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls=\"\" style=\"filter: invert(1) hue-rotate(0deg) contrast(1.2) saturate(1.1);\"\u003e\u003c/video\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e0 deg hue rotate\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls=\"\" style=\"filter: invert(1) hue-rotate(90deg) contrast(1.2) saturate(1.1);\"\u003e\u003c/video\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e90 deg hue rotate\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls=\"\" style=\"filter: invert(1) hue-rotate(180deg) contrast(1.2) saturate(1.1);\"\u003e\u003c/video\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e180 deg hue rotate\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls=\"\" style=\"filter: invert(1) hue-rotate(270deg) contrast(1.2) saturate(1.1);\"\u003e\u003c/video\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e270 deg hue rotate\u003c/p\u003e\n\u003c/blockquote\u003e\n",
      "content_text": "\nYesterday I wrote about a way to do \u003ca href=\"/light-mode-screen-recording/\" class=\"wikilink\" data-title=\"light mode screen recording\" data-description=\"I saw this tip from Cassidoo and had to try it out for myself. I kicked on a screen recording right from where my terminal was, converted it, and it actually...\" data-date=\"2026-01-01\"\u003elight mode screen recording\u003c/a\u003e to\nconvert to light mode from dark mode with ffmpeg.  I was wondering if it could\nbe done entirely on the front end for web applications.  Turns out you can.\nI'm sure there are limited wikis and site builders that don't allow adding\nstyle like this, but it works if you can.\n\n``` html\n\u003cvideo\n    src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\"\n    controls\n    style=\"filter: invert(1) hue-rotate(180deg) contrast(1.2) saturate(1.1);\"\n    \u003e\n\u003c/video\u003e\n```\n\n\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls style=\"filter: invert(1) hue-rotate(0deg) contrast(1.2) saturate(1.1);\" \u003e\u003c/video\u003e\n\n\u003e 0 deg hue rotate\n\n\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls style=\"filter: invert(1) hue-rotate(90deg) contrast(1.2) saturate(1.1);\" \u003e\u003c/video\u003e\n\n\u003e 90 deg hue rotate\n\n\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls style=\"filter: invert(1) hue-rotate(180deg) contrast(1.2) saturate(1.1);\" \u003e\u003c/video\u003e\n\n\u003e 180 deg hue rotate\n\n\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls style=\"filter: invert(1) hue-rotate(270deg) contrast(1.2) saturate(1.1);\" \u003e\u003c/video\u003e\n\n\u003e 270 deg hue rotate\n\n",
      "summary": "Yesterday I wrote about a way to do light-mode-screen-recording to convert to light mode from dark mode with ffmpeg. I was wondering if it could be done...",
      "date_published": "2026-01-02T10:29:10Z",
      "date_modified": "2026-01-02T10:29:10Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/light-mode-screen-recording/",
      "url": "https://waylonwalker.com/light-mode-screen-recording/",
      "title": "light mode screen recording",
      "content_html": "\u003cp\u003eI saw this tip from\n\u003ca href=\"https://cassidoo.co/post/ffmpeg-dark-light/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/cassidoo.co.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/cassidoo.co.png\" class=\"has-avatar  has-avatar-before\"\u003eCassidoo\u003c/a\u003e\nand had to try it out for myself.  I kicked on a\nscreen recording right from where my terminal\nwas, converted it, and it actually looks pretty\ngood.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003effmpeg \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   -i screenrecording-2026-01-01_10-10-49.mp4 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   -vf \u003cspan class=\"s2\"\u003e\u0026#34;negate,hue=h=180,eq=contrast=1.2:saturation=1.1\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   screenrecording-2026-01-01_10-10-49-light.mp4\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4\" class=\"glightbox-link\" aria-label=\"Open image\"\u003e\u003cvideo autoplay loop muted playsinline controls preload=\"metadata\" class=\"md-video\" poster=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.webp?h=675\u0026w=1200\"\u003e\u003csource src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4\" type=\"video/mp4\"\u003eYour browser does not support the video tag.\u003c/video\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\u003cp\u003eDark Mode\u003c/p\u003e\u003c/figcaption\u003e\u003c/figure\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/de4e3378-6df2-45b1-84d5-0cc773ceb3c5.mp4\" class=\"glightbox-link\" aria-label=\"Open image\"\u003e\u003cvideo autoplay loop muted playsinline controls preload=\"metadata\" class=\"md-video\" poster=\"https://dropper.waylonwalker.com/file/de4e3378-6df2-45b1-84d5-0cc773ceb3c5.webp?h=675\u0026w=1200\"\u003e\u003csource src=\"https://dropper.waylonwalker.com/file/de4e3378-6df2-45b1-84d5-0cc773ceb3c5.mp4\" type=\"video/mp4\"\u003eYour browser does not support the video tag.\u003c/video\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\u003cp\u003eLight Mode\u003c/p\u003e\u003c/figcaption\u003e\u003c/figure\u003e\n\u003cp\u003eThere are a few unsettling things about it, but\noverall I feel like it was a success.\u003c/p\u003e\n",
      "content_text": "\n\n\nI saw this tip from\n[Cassidoo](https://cassidoo.co/post/ffmpeg-dark-light/)\nand had to try it out for myself.  I kicked on a\nscreen recording right from where my terminal\nwas, converted it, and it actually looks pretty\ngood.\n\n\n``` bash\nffmpeg \\\n   -i screenrecording-2026-01-01_10-10-49.mp4 \\\n   -vf \"negate,hue=h=180,eq=contrast=1.2:saturation=1.1\" \\\n   screenrecording-2026-01-01_10-10-49-light.mp4\n```\n\n![](https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4)\n\n\u003e Dark Mode\n\n![](https://dropper.waylonwalker.com/file/de4e3378-6df2-45b1-84d5-0cc773ceb3c5.mp4)\n\n\u003e Light Mode\n\nThere are a few unsettling things about it, but\noverall I feel like it was a success.\n\n",
      "summary": "I saw this tip from Cassidoo and had to try it out for myself. I kicked on a screen recording right from where my terminal was, converted it, and it actually...",
      "date_published": "2026-01-01T10:14:17Z",
      "date_modified": "2026-01-01T10:14:17Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "ffmpeg"
      ]
    },
    {
      "id": "https://waylonwalker.com/youtube-gemini-is-actually-useful/",
      "url": "https://waylonwalker.com/youtube-gemini-is-actually-useful/",
      "title": "YouTube Gemini is Actually Useful",
      "content_html": "\u003cp\u003eI’ve found Gemini to be very useful lately, especially for finding information\nwithin long form content.\u003c/p\u003e\n\u003cp\u003eWhen writing \u003ca href=\"https://thoughts.waylonwalker.com/post/896\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/thoughts.waylonwalker.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/thoughts.waylonwalker.com.ico\" class=\"has-avatar  has-avatar-before\"\u003ethought-896\u003c/a\u003e, I\nwanted to use a direct quote from Jeff Dickey, Gemini popped it out very\nquickly.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egive me a quote from jeff just before the timestamp I\u0026#39;m at the interviewer\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003easked what makes a good cli and he started talking about stdout/stderr\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIn another case, my wife and I are huge Good Eats fans.  Alton Brown taught us\nhow to cook during college and on.  We watched every single good eats episode\nnearly 10 years after they aired.  He is back with some updates to those those\nshows on his Youtube.  Gemini gives very good detailed responses with\ntimestamps.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAlton Brown had a recent YouTube video for cooking turkey. Can you get the\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einstructions from the video?\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've found Gemini to be very useful lately, especially for finding information\nwithin long form content.\n\nWhen writing [thought-896](https://thoughts.waylonwalker.com/post/896), I\nwanted to use a direct quote from Jeff Dickey, Gemini popped it out very\nquickly.\n\n``` md\ngive me a quote from jeff just before the timestamp I'm at the interviewer\nasked what makes a good cli and he started talking about stdout/stderr\n```\n\nIn another case, my wife and I are huge Good Eats fans.  Alton Brown taught us\nhow to cook during college and on.  We watched every single good eats episode\nnearly 10 years after they aired.  He is back with some updates to those those\nshows on his Youtube.  Gemini gives very good detailed responses with\ntimestamps.\n\n``` md\nAlton Brown had a recent YouTube video for cooking turkey. Can you get the\ninstructions from the video?\n```\n\n",
      "summary": "I've found Gemini to be very useful lately, especially for finding information within long form content.",
      "date_published": "2025-12-22T10:09:55Z",
      "date_modified": "2025-12-22T10:09:55Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "ai"
      ]
    },
    {
      "id": "https://waylonwalker.com/numbered-posts-in-obsidian/",
      "url": "https://waylonwalker.com/numbered-posts-in-obsidian/",
      "title": "numbered posts in obsidian",
      "content_html": "\u003cp\u003eI’ve been using this one for awhile now, I have a post type that I only edit\nfrom my phone, but I have all the post numbered.  I set up a template in\nobsidian for using templater, the template goes right in the static site repo,\nI point templater to the templates directory and this has been working pretty\nseamlessly for awhile.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edate: \u0026lt;% tp.date.now(\u0026#34;YYYY-MM-DD HH:mm:ss\u0026#34;) %\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etemplateKey: myposttype\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublished: true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etags:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e myposttype\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;%*\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econst folder = \u0026#34;pages/myposttype\u0026#34;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// get all files in the vault, keep only those inside the folder\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econst files = app.vault.getFiles().filter(f =\u0026gt; f.path.startsWith(folder + \u0026#34;/\u0026#34;));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// extract numeric suffixes from filenames like myposttype-123.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econst nums = files.map(f =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  const m = f.basename.match(/^myposttype-(\\d+)$/);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  return m ? parseInt(m[1], 10) : null;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}).filter(n =\u0026gt; n !== null);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// next number (start at 1 if none exist)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econst next = (nums.length ? Math.max(...nums) : 0) + 1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// include the .md extension when moving\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econst newPath = \u003cspan class=\"sb\"\u003e`${folder}/myposttype-${next}`\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eawait tp.file.move(newPath);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e%\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've been using this one for awhile now, I have a post type that I only edit\nfrom my phone, but I have all the post numbered.  I set up a template in\nobsidian for using templater, the template goes right in the static site repo,\nI point templater to the templates directory and this has been working pretty\nseamlessly for awhile.\n\n``` md\n---\ndate: \u003c% tp.date.now(\"YYYY-MM-DD HH:mm:ss\") %\u003e\ntemplateKey: myposttype\npublished: true\ntags:\n- myposttype\n\u003c%*\nconst folder = \"pages/myposttype\";\n\n// get all files in the vault, keep only those inside the folder\nconst files = app.vault.getFiles().filter(f =\u003e f.path.startsWith(folder + \"/\"));\n\n// extract numeric suffixes from filenames like myposttype-123.md\nconst nums = files.map(f =\u003e {\n  const m = f.basename.match(/^myposttype-(\\d+)$/);\n  return m ? parseInt(m[1], 10) : null;\n}).filter(n =\u003e n !== null);\n\n// next number (start at 1 if none exist)\nconst next = (nums.length ? Math.max(...nums) : 0) + 1;\n\n// include the .md extension when moving\nconst newPath = `${folder}/myposttype-${next}`;\nawait tp.file.move(newPath);\n%\u003e\n---\n```\n",
      "summary": "I've been using this one for awhile now, I have a post type that I only edit from my phone, but I have all the post numbered. I set up a template in obsidian...",
      "date_published": "2025-12-13T22:28:28Z",
      "date_modified": "2025-12-13T22:28:28Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "markdown",
        "obsidian"
      ]
    },
    {
      "id": "https://waylonwalker.com/git-name-status/",
      "url": "https://waylonwalker.com/git-name-status/",
      "title": "git name status",
      "content_html": "\u003cp\u003e\u003ccode\u003e--name-status\u003c/code\u003e is a great way to see what files have changed in a \u003ca href=\"/glossary/git/\" class=\"glossary-term\" title=\"Git is a version control system for tracking changes in source code during software development. In the beginning there were many, some were licensed. As...\"\u003egit\u003c/a\u003e diff\nalongside the status code.  I recently used this in a script to create a report\nof new and modified files during a build.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit diff --name-status\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit diff --name-status origin/main\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit diff --name-status --staged\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit diff --name-status \u003cspan class=\"s1\"\u003e\u0026#39;HEAD@{3 days ago}\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n`--name-status` is a great way to see what files have changed in a git diff\nalongside the status code.  I recently used this in a script to create a report\nof new and modified files during a build.\n\n``` bash\ngit diff --name-status\ngit diff --name-status origin/main\ngit diff --name-status --staged\ngit diff --name-status 'HEAD@{3 days ago}'\n```\n",
      "summary": "is a great way to see what files have changed in a git diff alongside the status code. I recently used this in a script to create a report of new and...",
      "date_published": "2025-12-12T07:53:57Z",
      "date_modified": "2025-12-12T07:53:57Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "git"
      ]
    },
    {
      "id": "https://waylonwalker.com/minecraft-server-memory/",
      "url": "https://waylonwalker.com/minecraft-server-memory/",
      "title": "minecraft server memory",
      "content_html": "\u003cp\u003eI learned to today that setting \u003ccode\u003eMEMORY\u003c/code\u003e on your minecraft server causes the\nJVM to egregiously allocate all of that memory.  Not setting it causes slow\ndowns and potential crashes, but setting \u003ccode\u003eINIT_MEMORY\u003c/code\u003e and \u003ccode\u003eMAX_MEMORY\u003c/code\u003e gives\nus the best of both worlds.  It is allowed to use more, but does not gobble it\nall up on startup.\u003c/p\u003e\n\u003cp\u003eIn this economy we need to save all the memory we can!\u003c/p\u003e\n\u003cp\u003eHere is a non-working snippet for a minecraft server deployment in kubernetes.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003econtainers\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edungeon\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eitzg/minecraft-server\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eEULA\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eINIT_MEMORY\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;512M\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMAX_MEMORY\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;3G\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eand in docker compose\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edungeon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eitzg/minecraft-server\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eEULA\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eINIT_MEMORY\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;512M\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eMAX_MEMORY\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;3G\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI learned to today that setting `MEMORY` on your minecraft server causes the\nJVM to egregiously allocate all of that memory.  Not setting it causes slow\ndowns and potential crashes, but setting `INIT_MEMORY` and `MAX_MEMORY` gives\nus the best of both worlds.  It is allowed to use more, but does not gobble it\nall up on startup.\n\nIn this economy we need to save all the memory we can!\n\nHere is a non-working snippet for a minecraft server deployment in kubernetes.\n\n``` yaml\n      containers:\n        - name: dungeon\n          image: itzg/minecraft-server\n          env:\n            - name: EULA\n              value: \"true\"\n            - name: INIT_MEMORY\n              value: \"512M\"\n            - name: MAX_MEMORY\n              value: \"3G\"\n```\n\nand in docker compose\n\n``` yaml\n  dungeon:\n    image: itzg/minecraft-server\n    environment:\n      EULA: \"true\"\n      INIT_MEMORY: \"512M\"\n      MAX_MEMORY: \"3G\"\n```\n",
      "summary": "I learned to today that setting on your minecraft server causes the JVM to egregiously allocate all of that memory. Not setting it causes slow downs and...",
      "date_published": "2025-12-10T08:46:36Z",
      "date_modified": "2025-12-10T08:46:36Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "compose",
        "containers",
        "docker",
        "gaming",
        "homelab",
        "kubernetes",
        "minecraft"
      ]
    },
    {
      "id": "https://waylonwalker.com/web-snow-fall/",
      "url": "https://waylonwalker.com/web-snow-fall/",
      "title": "web snow fall",
      "content_html": "\u003cp\u003eI found snow-fall component from\n\u003ca href=\"https://www.zachleat.com/web/snow-fall/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/www.zachleat.com.jpg\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/www.zachleat.com.jpg\" class=\"has-avatar  has-avatar-before\"\u003ezachleat\u003c/a\u003e, and its beautiful… to\nme.  I like the way it looks, its simple and whimsical.\u003c/p\u003e\n\u003ch2 id=\"install\"\u003eInstall \u003ca href=\"#install\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere is an npm package \u003ccode\u003e@zachleat/snow-fall\u003c/code\u003e if that’s your thing.  I like\nvendoring in small things like this.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -o static/snow-fall.js https://raw.githubusercontent.com/zachleat/snow-fall/refs/heads/main/snow-fall.js\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI generally save it in my justfile so that I remember how I got it and how to\nupdate…. yaya I could use npm, but I don’t for no build sites.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eget-snowfall:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    curl -o static/snow-fall.js https://raw.githubusercontent.com/zachleat/snow-fall/refs/heads/main/snow-fall.js\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"usage\"\u003eUsage \u003ca href=\"#usage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow add the component to your page.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- This belongs somewhere inside \u0026lt;head\u0026gt; --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;module\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;snow-fall.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"c\"\u003e\u0026lt;!-- Adjust the src to your path --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- This belongs somewhere inside \u0026lt;body\u0026gt; --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Anything before will be below the snow. --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esnow-fall\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esnow-fall\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Anything after will show above the snow. --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI found snow-fall component from\n[zachleat](https://www.zachleat.com/web/snow-fall/), and its beautiful... to\nme.  I like the way it looks, its simple and whimsical.\n\n## Install\n\nThere is an npm package `@zachleat/snow-fall` if that's your thing.  I like\nvendoring in small things like this.\n\n``` bash\ncurl -o static/snow-fall.js https://raw.githubusercontent.com/zachleat/snow-fall/refs/heads/main/snow-fall.js\n```\n\nI generally save it in my justfile so that I remember how I got it and how to\nupdate.... yaya I could use npm, but I don't for no build sites.\n\n``` bash\nget-snowfall:\n    curl -o static/snow-fall.js https://raw.githubusercontent.com/zachleat/snow-fall/refs/heads/main/snow-fall.js\n```\n\n## Usage\n\nNow add the component to your page.\n\n``` html\n\u003c!-- This belongs somewhere inside \u003chead\u003e --\u003e\n\u003cscript type=\"module\" src=\"snow-fall.js\"\u003e\u003c/script\u003e \u003c!-- Adjust the src to your path --\u003e\n\n\u003c!-- This belongs somewhere inside \u003cbody\u003e --\u003e\n\u003c!-- Anything before will be below the snow. --\u003e\n\u003csnow-fall\u003e\u003c/snow-fall\u003e\n\u003c!-- Anything after will show above the snow. --\u003e\n```\n",
      "summary": "I found snow-fall component from zachleat, and its beautiful... to me. I like the way it looks, its simple and whimsical.",
      "date_published": "2025-12-09T10:21:17Z",
      "date_modified": "2025-12-09T10:21:17Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/check-your-kubeconfig-expire-time/",
      "url": "https://waylonwalker.com/check-your-kubeconfig-expire-time/",
      "title": "check your kubeconfig expire time",
      "content_html": "\u003cp\u003eToday I learned an important lesson that you should periodically check on your\nkubeconfigs expiration date.  It’s easy to do.  You can ask for the\nclient-certificate-data from your kubeconfig, decode it, and use openssl to get\nthe expiration date.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl config view --raw -o \u003cspan class=\"nv\"\u003ejsonpath\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;{.users[0].user.client-certificate-data}\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e|\u003c/span\u003e base64 -d 2\u0026gt;/dev/null \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e|\u003c/span\u003e openssl x509 -noout -dates\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cp\u003eThis will only work for the first user, if you have more than one user or\ncontext defined in your kubeconfig you will need to adjust.\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\nToday I learned an important lesson that you should periodically check on your\nkubeconfigs expiration date.  It's easy to do.  You can ask for the\nclient-certificate-data from your kubeconfig, decode it, and use openssl to get\nthe expiration date.\n\n``` bash\nkubectl config view --raw -o jsonpath='{.users[0].user.client-certificate-data}' \\\n  | base64 -d 2\u003e/dev/null \\\n  | openssl x509 -noout -dates\n```\n\n!!! Note\n\n    This will only work for the first user, if you have more than one user or\n    context defined in your kubeconfig you will need to adjust.\n",
      "summary": "Today I learned an important lesson that you should periodically check on your kubeconfigs expiration date. It's easy to do. You can ask for the...",
      "date_published": "2025-12-08T20:59:27Z",
      "date_modified": "2025-12-08T20:59:27Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "kubernetes"
      ]
    },
    {
      "id": "https://waylonwalker.com/gh-auth-switch/",
      "url": "https://waylonwalker.com/gh-auth-switch/",
      "title": "gh auth switch",
      "content_html": "\u003cp\u003eWhen using two GitHub accounts the gh cli gives very easy \u003ccode\u003egh auth switch\u003c/code\u003e workflow from the cli.\u003c/p\u003e\n\u003cdiv class=\"admonition hint\"\u003e\n\u003cp class=\"admonition-title\"\u003efrom the docs\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003egh auth switch –help\nSwitch the active account for a GitHub host.\u003c/p\u003e\n\u003cp\u003eThis command changes the authentication configuration that will\nbe used when running commands targeting the specified GitHub host.\u003c/p\u003e\n\u003cp\u003eIf the specified host has two accounts, the active account will be switched\nautomatically. If there are more than two accounts, disambiguation will be\nrequired either through the \u003ccode\u003e--user\u003c/code\u003e flag or an interactive prompt.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# list accounts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egh auth status\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# switch accounds (interactive if more than 2, i\u0026#39;ve never seen this personally)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egh auth switch\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nWhen using two GitHub accounts the gh cli gives very easy `gh auth switch` workflow from the cli.\n\n!!! hint from the docs\n\n  gh auth switch --help\n  Switch the active account for a GitHub host.\n\n  This command changes the authentication configuration that will\n  be used when running commands targeting the specified GitHub host.\n\n  If the specified host has two accounts, the active account will be switched\n  automatically. If there are more than two accounts, disambiguation will be\n  required either through the `--user` flag or an interactive prompt.\n\n``` bash\n# list accounts\ngh auth status\n# switch accounds (interactive if more than 2, i've never seen this personally)\ngh auth switch\n```\n",
      "summary": "When using two GitHub accounts the gh cli gives very easy workflow from the cli.",
      "date_published": "2025-12-07T10:55:55Z",
      "date_modified": "2025-12-07T10:55:55Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "cli",
        "gh",
        "github"
      ]
    },
    {
      "id": "https://waylonwalker.com/setup-bambu-studio-in-distrobox/",
      "url": "https://waylonwalker.com/setup-bambu-studio-in-distrobox/",
      "title": "setup bambu-studio in distrobox",
      "content_html": "\u003cp\u003e\u003ca class=\"wikilink\" data-date=\"2025-12-03\" data-description=\"GPU\u0026#39;s are awesome. I just added gpu support to my bambu-studio distrobox and its flying! On my wayland based system the native package has never worked,...\" data-title=\"gpus are awesome\" href=\"/gpus-are-awesome/\" data-preview=\"GPU\u0026#39;s are awesome. I just added gpu support to my bambu-studio distrobox and its flying! On my wayland based system the native package has never worked,...\"\u003egpus are awesome\u003c/a\u003e and I need one for Bambu Studio to be usable in a\ndistrobox.  Adding the \u003ccode\u003e--nvidia\u003c/code\u003e flag to \u003ccode\u003edistrobox create\u003c/code\u003e bind mounts the\nnvidia \u003ccode\u003e/dev/\u003c/code\u003e devices and sets up the necessary environment variables.  Once\nwe are in there are a couple of packages to install to make it work.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edistrobox create --name bambu-studio --image archlinux:latest --nvidia\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edistrobox enter bambu-studio\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo pacman -S nvidia-utils lib32-nvidia-utils vulkan-icd-loader\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003envidia-smi\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eglxinfo \u003cspan class=\"p\"\u003e|\u003c/span\u003e gprep OpenGL\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo pacman -Syu --needed base-devel git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone https://aur.archlinux.org/paru-bin.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e paru-bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emakepkg -si\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eparu -S bambustudio-bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebambu-studio\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edistrobox-export --app bambu-studio\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\u003ca href=\"/gpus-are-awesome/\" class=\"wikilink\" data-title=\"gpus are awesome\" data-description=\"GPU\u0026#39;s are awesome. I just added gpu support to my bambu-studio distrobox and its flying! On my wayland based system the native package has never worked,...\" data-date=\"2025-12-03\"\u003egpus are awesome\u003c/a\u003e and I need one for Bambu Studio to be usable in a\ndistrobox.  Adding the `--nvidia` flag to `distrobox create` bind mounts the\nnvidia `/dev/` devices and sets up the necessary environment variables.  Once\nwe are in there are a couple of packages to install to make it work.\n\n``` bash\ndistrobox create --name bambu-studio --image archlinux:latest --nvidia\ndistrobox enter bambu-studio\nsudo pacman -S nvidia-utils lib32-nvidia-utils vulkan-icd-loader\nnvidia-smi\nglxinfo | gprep OpenGL\nsudo pacman -Syu --needed base-devel git\ngit clone https://aur.archlinux.org/paru-bin.git\ncd paru-bin\nmakepkg -si\nparu -S bambustudio-bin\n\nbambu-studio\n\ndistrobox-export --app bambu-studio\n```\n\n",
      "summary": "gpus-are-awesome and I need one for Bambu Studio to be usable in a distrobox. Adding the flag to bind mounts the nvidia devices and sets up the necessary...",
      "date_published": "2025-12-06T21:17:39Z",
      "date_modified": "2025-12-06T21:17:39Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/k3s-system-upgrade-minor-by-minor/",
      "url": "https://waylonwalker.com/k3s-system-upgrade-minor-by-minor/",
      "title": "k3s system-upgrade minor by minor",
      "content_html": "\u003cp\u003eThe k3s system-upgrade controller is a fantastic tool for upgrading k3s\nautomatically.  It has done a fantastic job for me every time I’ve used it.\nToday I ran it on a cluster that needed to upgrade several minors and I\nlearned that the controller does not pick up on changes to the channel url if\nyou change from minor to minor.\u003c/p\u003e\n\u003cp\u003eThe solution I came up with was to name the plan with the version it supports.\nThen on each patch upgrade, change both the plan name and the channel.  I use\ngitops with argocd, it automcatically cleaned up old plans, created new plans,\nand the system-upgrade-controller picked up the plan and started applying\nimmediately.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Server plan\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eupgrade.cattle.io/v1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ePlan\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eserver-plan-v1.33\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# \u0026lt;- This is important if you want to change the channel name\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esystem-upgrade\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econcurrency\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecordon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enodeSelector\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ematchExpressions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enode-role.kubernetes.io/control-plane\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eoperator\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eIn\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eserviceAccountName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esystem-upgrade\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eupgrade\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003erancher/k3s-upgrade\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003echannel\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://update.k3s.io/v1-release/channels/v1.33\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Agent plan\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eupgrade.cattle.io/v1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ePlan\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eagent-plan-v1.33\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# \u0026lt;- This is important if you want to change the channel name\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esystem-upgrade\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econcurrency\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecordon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enodeSelector\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ematchExpressions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enode-role.kubernetes.io/control-plane\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eoperator\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDoesNotExist\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eprepare\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eprepare\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eserver-plan\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003erancher/k3s-upgrade\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eserviceAccountName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esystem-upgrade\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eupgrade\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003erancher/k3s-upgrade\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003echannel\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://update.k3s.io/v1-release/channels/v1.33\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI’d love to see a better way if you have a way to upgrade through minors, or\nmanually control the minor of your cluster let me know.\u003c/p\u003e\n",
      "content_text": "\nThe k3s system-upgrade controller is a fantastic tool for upgrading k3s\nautomatically.  It has done a fantastic job for me every time I've used it.\nToday I ran it on a cluster that needed to upgrade several minors and I\nlearned that the controller does not pick up on changes to the channel url if\nyou change from minor to minor.  \n\nThe solution I came up with was to name the plan with the version it supports.\nThen on each patch upgrade, change both the plan name and the channel.  I use\ngitops with argocd, it automcatically cleaned up old plans, created new plans,\nand the system-upgrade-controller picked up the plan and started applying\nimmediately.\n\n\n``` yaml\n# Server plan\napiVersion: upgrade.cattle.io/v1\nkind: Plan\nmetadata:\n  name: server-plan-v1.33 # \u003c- This is important if you want to change the channel name\n  namespace: system-upgrade\nspec:\n  concurrency: 1\n  cordon: true\n  nodeSelector:\n    matchExpressions:\n    - key: node-role.kubernetes.io/control-plane\n      operator: In\n      values:\n      - \"true\"\n  serviceAccountName: system-upgrade\n  upgrade:\n    image: rancher/k3s-upgrade\n  channel: https://update.k3s.io/v1-release/channels/v1.33\n---\n# Agent plan\napiVersion: upgrade.cattle.io/v1\nkind: Plan\nmetadata:\n  name: agent-plan-v1.33 # \u003c- This is important if you want to change the channel name\n  namespace: system-upgrade\nspec:\n  concurrency: 1\n  cordon: true\n  nodeSelector:\n    matchExpressions:\n    - key: node-role.kubernetes.io/control-plane\n      operator: DoesNotExist\n  prepare:\n    args:\n    - prepare\n    - server-plan\n    image: rancher/k3s-upgrade\n  serviceAccountName: system-upgrade\n  upgrade:\n    image: rancher/k3s-upgrade\n  channel: https://update.k3s.io/v1-release/channels/v1.33\n```\n\nI'd love to see a better way if you have a way to upgrade through minors, or\nmanually control the minor of your cluster let me know.\n",
      "summary": "The k3s system-upgrade controller is a fantastic tool for upgrading k3s automatically. It has done a fantastic job for me every time I've used it. Today I...",
      "date_published": "2025-12-05T09:25:39Z",
      "date_modified": "2025-12-05T09:25:39Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "k3s",
        "kubernetes"
      ]
    },
    {
      "id": "https://waylonwalker.com/columns-env-var/",
      "url": "https://waylonwalker.com/columns-env-var/",
      "title": "COLUMNS env var",
      "content_html": "\u003cp\u003esetting \u003ccode\u003eCOLUMNS\u003c/code\u003e env var to a number greater than 0 will make the terminal resize to that number of columns.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eCOLUMNS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e80\u003c/span\u003e uvx --from rich-cli rich myscript.py\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cp\u003eNot all programs respct the \u003ccode\u003eCOLUMNS\u003c/code\u003e env var, but rich does, and a lot of\nstuff I’m building uses rich.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eI discovered this when I was trying to make a low effort readme generated from\nthe code, but did not depend on the size of terminal it was ran on.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# justfile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ereadme:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;# Workspaces\u0026#34;\u003c/span\u003e \u0026gt; README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;``` bash\u0026#39;\u003c/span\u003e \u0026gt;\u0026gt; README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eCOLUMNS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e80\u003c/span\u003e ./workspaces.py --help \u0026gt;\u0026gt; README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;```\u0026#39;\u003c/span\u003e \u0026gt;\u0026gt; README.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nsetting `COLUMNS` env var to a number greater than 0 will make the terminal resize to that number of columns.\n\n``` bash\nCOLUMNS=80 uvx --from rich-cli rich myscript.py\n```\n\n!!! NOTE\n\n    Not all programs respct the `COLUMNS` env var, but rich does, and a lot of\n    stuff I'm building uses rich.\n\nI discovered this when I was trying to make a low effort readme generated from\nthe code, but did not depend on the size of terminal it was ran on.\n\n``` bash\n# justfile\nreadme:\n    echo \"# Workspaces\" \u003e README.md\n    echo \"\" \u003e\u003e README.md\n    echo '``` bash' \u003e\u003e README.md\n    COLUMNS=80 ./workspaces.py --help \u003e\u003e README.md\n    echo '```' \u003e\u003e README.md\n```\n",
      "summary": "setting env var to a number greater than 0 will make the terminal resize to that number of columns.",
      "date_published": "2025-11-26T13:24:38Z",
      "date_modified": "2025-11-26T13:24:38Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "bash",
        "cli",
        "python",
        "terminal"
      ]
    },
    {
      "id": "https://waylonwalker.com/tea-login-flag/",
      "url": "https://waylonwalker.com/tea-login-flag/",
      "title": "tea login flag",
      "content_html": "\u003cp\u003eThe tea command for gitea (used by forgejo) has a flag for login.  With gitea\nyou can have multiple accounts logged in.  When you try to run a command such\nas \u003ccode\u003erepo create\u003c/code\u003e it will prompt you which login to use, but I learned that you\ncan bake it in to all of them with \u003ccode\u003e--login \u0026lt;login-name\u0026gt;\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ tea repo create --name deleteme --description \u003cspan class=\"s1\"\u003e\u0026#39;for example\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e┃ NOTE: no gitea login detected, whether falling back to login \u003cspan class=\"s1\"\u003e\u0026#39;git.waylonwalker.com\u0026#39;\u003c/span\u003e?\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/11dc820d-1680-414c-9624-cd970b057a74.webp\" class=\"glightbox-link\" aria-label=\"image showing message NOTE: no gitea login detected, whether falling back to login ‘git.waylonwalker.com’?\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/file/11dc820d-1680-414c-9624-cd970b057a74.webp\" alt=\"image showing message NOTE: no gitea login detected, whether falling back to login ‘git.waylonwalker.com’?\"/ data-glightbox=\"description: image showing message NOTE: no gitea login detected, whether falling back to login ‘git.waylonwalker.com’?\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etea repo create --name deleteme --description \u003cspan class=\"s1\"\u003e\u0026#39;for example\u0026#39;\u003c/span\u003e --login git.wayl.one\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nThe tea command for gitea (used by forgejo) has a flag for login.  With gitea\nyou can have multiple accounts logged in.  When you try to run a command such\nas `repo create` it will prompt you which login to use, but I learned that you\ncan bake it in to all of them with `--login \u003clogin-name\u003e`\n\n``` bash\n❯ tea repo create --name deleteme --description 'for example'\n┃ NOTE: no gitea login detected, whether falling back to login 'git.waylonwalker.com'?\n```\n\n![image showing message NOTE: no gitea login detected, whether falling back to login 'git.waylonwalker.com'?](https://dropper.waylonwalker.com/file/11dc820d-1680-414c-9624-cd970b057a74.webp)\n\n``` bash\ntea repo create --name deleteme --description 'for example' --login git.wayl.one\n```\n",
      "summary": "The tea command for gitea (used by forgejo) has a flag for login. With gitea you can have multiple accounts logged in. When you try to run a command such as...",
      "date_published": "2025-11-23T21:09:36Z",
      "date_modified": "2025-11-23T21:09:36Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "cli",
        "forgejo",
        "git",
        "gitea"
      ]
    },
    {
      "id": "https://waylonwalker.com/side-effect-of-just-stars/",
      "url": "https://waylonwalker.com/side-effect-of-just-stars/",
      "title": "side effect of just stars",
      "content_html": "\u003cp\u003eI found an interesting side effect of manually running my script to generate [[\nstars ]] posts is that you get notified when one gets renamed.  Today I noticed\nthat Ned Batchelder created a coveragepy org.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/cf6dd0cc-5a74-40bf-8512-f62471ea1e56.png\" class=\"glightbox-link\" aria-label=\"screenshot-2025-11-12T03-33-12-967Z.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/cf6dd0cc-5a74-40bf-8512-f62471ea1e56.png\" alt=\"screenshot-2025-11-12T03-33-12-967Z.png\"/ data-glightbox=\"description: screenshot-2025-11-12T03-33-12-967Z.png\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nI found an interesting side effect of manually running my script to generate [[\nstars ]] posts is that you get notified when one gets renamed.  Today I noticed\nthat Ned Batchelder created a coveragepy org.\n\n![screenshot-2025-11-12T03-33-12-967Z.png](https://dropper.waylonwalker.com/api/file/cf6dd0cc-5a74-40bf-8512-f62471ea1e56.png)\n",
      "summary": "I found an interesting side effect of manually running my script to generate stars posts is that you get notified when one gets renamed. Today I noticed that...",
      "date_published": "2025-11-11T21:33:33Z",
      "date_modified": "2025-11-11T21:33:33Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/pydantic-settings-alias-choices/",
      "url": "https://waylonwalker.com/pydantic-settings-alias-choices/",
      "title": "pydantic settings alias choices",
      "content_html": "\u003cp\u003eToday I learned how to use AliasChoices with pydantic settings to setup common\naliases for the same field.  I’m bad about remembering these things, and hate\nlooking up the docs.  I like things to be intuitive and just do the thing I\nwant it to do.  Especially when they get configured through something like yaml\nand do not have a direct lsp look up right from my editor.  I figured out how\nto support what might be common aliases for a storage directory.  These can be\nset up as environment variables and used by config.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epathlib\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epydantic\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eField\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epydantic\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eAliasChoices\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epydantic_settings\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eBaseSettings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eSettings\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBaseSettings\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003estorage_dir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eField\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003evalidation_alias\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eAliasChoices\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;STORAGE_DIR\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;STORAGE_DIRECTORY\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;STORAGE_PATH\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;STORAGE_PATHNAME\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;DROPPER_STORAGE_DIR\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;DROPPER_STORAGE_DIRECTORY\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;DROPPER_STORAGE_PATH\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;DROPPER_STORAGE_PATHNAME\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Directory for stored files\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nToday I learned how to use AliasChoices with pydantic settings to setup common\naliases for the same field.  I'm bad about remembering these things, and hate\nlooking up the docs.  I like things to be intuitive and just do the thing I\nwant it to do.  Especially when they get configured through something like yaml\nand do not have a direct lsp look up right from my editor.  I figured out how\nto support what might be common aliases for a storage directory.  These can be\nset up as environment variables and used by config.\n\n``` python\nfrom pathlib import Path\n\nfrom pydantic import Field\nfrom pydantic import AliasChoices\nfrom pydantic_settings import BaseSettings\n\nclass Settings(BaseSettings):\n    storage_dir: Path | None = Field(\n        default=None,\n        validation_alias=AliasChoices(\n            \"STORAGE_DIR\", \"STORAGE_DIRECTORY\", \"STORAGE_PATH\", \"STORAGE_PATHNAME\",\n            \"DROPPER_STORAGE_DIR\", \"DROPPER_STORAGE_DIRECTORY\", \"DROPPER_STORAGE_PATH\", \"DROPPER_STORAGE_PATHNAME\",\n        ),\n        description=\"Directory for stored files\",\n    )\n```\n",
      "summary": "Today I learned how to use AliasChoices with pydantic settings to setup common aliases for the same field. I'm bad about remembering these things, and hate...",
      "date_published": "2025-11-11T21:23:58Z",
      "date_modified": "2025-11-11T21:23:58Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/uv-s3-sync-with-dotenv/",
      "url": "https://waylonwalker.com/uv-s3-sync-with-dotenv/",
      "title": "uv s3 sync with dotenv",
      "content_html": "\u003cp\u003eI often want to run an s3 sync in an isolated environment, I don’t want to set\nany environment variables, I don’t want anything secret in my history, and I\ndon’t want to change my dotenv into something that exports variables, I just\nwant s3 sync to work.  \u003ccode\u003edotenv run\u003c/code\u003e is the tool that I’ve been using for this,\nand this uv one liner lets it run fully isolated from the project.\u003c/p\u003e\n\u003ch2 id=\"one-liner\"\u003eone liner \u003ca href=\"#one-liner\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv tool run --from \u003cspan class=\"s1\"\u003e\u0026#39;python-dotenv[cli]\u0026#39;\u003c/span\u003e dotenv run -- uv tool run --from awscli aws s3 sync s3://bucket data\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"multi-line\"\u003emulti-line \u003ca href=\"#multi-line\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003esame thing formatted for readability\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv tool run \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --from \u003cspan class=\"s1\"\u003e\u0026#39;python-dotenv[cli]\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  dotenv run -- \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv tool run \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --from awscli \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  aws s3 sync s3://dropper data\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThere are probably 10 ways to skin this cat, but this is what I did, if you\nhave a better way let me know, I’ll link you below.\u003c/p\u003e\n",
      "content_text": "\nI often want to run an s3 sync in an isolated environment, I don't want to set\nany environment variables, I don't want anything secret in my history, and I\ndon't want to change my dotenv into something that exports variables, I just\nwant s3 sync to work.  `dotenv run` is the tool that I've been using for this,\nand this uv one liner lets it run fully isolated from the project.\n\n\n## one liner\n\n``` bash\nuv tool run --from 'python-dotenv[cli]' dotenv run -- uv tool run --from awscli aws s3 sync s3://bucket data\n```\n\n\n## multi-line\n\nsame thing formatted for readability\n\n``` bash\nuv tool run \\\n  --from 'python-dotenv[cli]' \\\n  dotenv run -- \\\nuv tool run \\\n  --from awscli \\\n  aws s3 sync s3://dropper data\n```\n\nThere are probably 10 ways to skin this cat, but this is what I did, if you\nhave a better way let me know, I'll link you below.\n",
      "summary": "I often want to run an s3 sync in an isolated environment, I don't want to set any environment variables, I don't want anything secret in my history, and I...",
      "date_published": "2025-10-26T10:16:41Z",
      "date_modified": "2025-10-26T10:16:41Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/starlette-head-request/",
      "url": "https://waylonwalker.com/starlette-head-request/",
      "title": "starlette head request",
      "content_html": "\u003cp\u003e\u003ca href=\"/starlette/\" class=\"glossary-term\" title=\"Starlette is a low level web framework for modern (as of 2025) async python development most famously used by \u003ca href=\"/fastapi/\" class=\"glossary-term\" title=\"FastAPI is a modern and efficient web framework for Python, built on top of the Starlette web framework, and pydantic for data validation and serialization.\"\u003eFastAPI\u003c/a\u003e.\"\u003eStarlette\u003c/a\u003e has a head request that works right along side your get requests.\nThis morning I fiddled around with custom routes for \u003ccode\u003eGET\u003c/code\u003e and \u003ccode\u003eHEAD\u003c/code\u003e, but had\nto manually set some things about the file, and was still missing \u003ccode\u003ee-tag\u003c/code\u003e in\nthe end.  Turns out as a developer you can \u003ca class=\"wikilink\" data-date=\"2025-06-23\" data-description=\"I just never quite understood why the word can send people over the top. I get it when you don\u0026#39;t know someone, you don\u0026#39;t have history with them, and they...\" data-title=\"just\" href=\"/just/\" data-preview=\"I just never quite understood why the word can send people over the top. I get it when you don\u0026#39;t know someone, you don\u0026#39;t have history with them, and they...\"\u003ejust\u003c/a\u003e add a \u003ccode\u003ehead\u003c/code\u003e route to\nyour \u003ccode\u003eget\u003c/code\u003e routes and starlette will strip the content for you, while\npreserving all of those good headers that fastapi \u003ccode\u003eFileResponse\u003c/code\u003e created\nautomatically for you.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eAPIRouter\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi.response\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eFileResponse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epathlib\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAPIRouter\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@router.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/file/\u003c/span\u003e\u003cspan class=\"si\"\u003e{filename}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@router.head\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/file/\u003c/span\u003e\u003cspan class=\"si\"\u003e{filename}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_file\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efilename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e,):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;Cache-Control\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;no-cache, no-store, must-revalidate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epathlib\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efilename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;data/\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003efilename\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"n\"\u003efilename\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexists\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eraise\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTPException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estatus_code\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e404\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edetail\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;File not found\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eFileResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efilename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eHere is an example of the response with curl.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ curl -I -L \u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:8100/api/file/e5523925-1565-454c-bab3-c70c4deabc83.webp?width=250\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHTTP/1.1 \u003cspan class=\"m\"\u003e200\u003c/span\u003e OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edate: Wed, \u003cspan class=\"m\"\u003e22\u003c/span\u003e Oct \u003cspan class=\"m\"\u003e2025\u003c/span\u003e 14:16:03 GMT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eserver: uvicorn\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecache-control: no-cache, no-store, must-revalidate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econtent-type: image/webp\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econtent-length: \u003cspan class=\"m\"\u003e17206\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elast-modified: Tue, \u003cspan class=\"m\"\u003e23\u003c/span\u003e Sep \u003cspan class=\"m\"\u003e2025\u003c/span\u003e 14:03:20 GMT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eetag: f891660c1543feb1af7564f08abdd511\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ curl -I -L \u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:8100/api/file/unknown-file.webp?width=250\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHTTP/1.1 \u003cspan class=\"m\"\u003e404\u003c/span\u003e Not Found\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edate: Wed, \u003cspan class=\"m\"\u003e22\u003c/span\u003e Oct \u003cspan class=\"m\"\u003e2025\u003c/span\u003e 14:16:11 GMT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eserver: uvicorn\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econtent-length: \u003cspan class=\"m\"\u003e27\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econtent-type: application/json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nStarlette has a head request that works right along side your get requests.\nThis morning I fiddled around with custom routes for `GET` and `HEAD`, but had\nto manually set some things about the file, and was still missing `e-tag` in\nthe end.  Turns out as a developer you can \u003ca href=\"/just/\" class=\"wikilink\" data-title=\"just\" data-description=\"I just never quite understood why the word can send people over the top. I get it when you don\u0026#39;t know someone, you don\u0026#39;t have history with them, and they...\" data-date=\"2025-06-23\"\u003ejust\u003c/a\u003e add a `head` route to\nyour `get` routes and starlette will strip the content for you, while\npreserving all of those good headers that fastapi `FileResponse` created\nautomatically for you.\n\n``` python\nfrom fastapi import APIRouter\nfrom fastapi.response import FileResponse\nfrom fastapi import Request\nfrom pathlib import Path\n\nrouter = APIRouter()\n\n@router.get(\"/file/{filename}\")\n@router.head(\"/file/{filename}\")\nasync def get_file(filename: str, request: Request,):\n    headers = {\n      \"Cache-Control\": \"no-cache, no-store, must-revalidate\",\n    }\n    from pathlib import Path\n    filename = Path(f\"data/{filename}\")\n    if not filename.exists():\n        raise HTTPException(status_code=404, detail=\"File not found\")\n    return FileResponse(filename, headers=headers)\n```\n\nHere is an example of the response with curl.\n\n``` bash\n❯ curl -I -L \"http://localhost:8100/api/file/e5523925-1565-454c-bab3-c70c4deabc83.webp?width=250\"\nHTTP/1.1 200 OK\ndate: Wed, 22 Oct 2025 14:16:03 GMT\nserver: uvicorn\ncache-control: no-cache, no-store, must-revalidate\ncontent-type: image/webp\ncontent-length: 17206\nlast-modified: Tue, 23 Sep 2025 14:03:20 GMT\netag: f891660c1543feb1af7564f08abdd511\n\n❯ curl -I -L \"http://localhost:8100/api/file/unknown-file.webp?width=250\"\nHTTP/1.1 404 Not Found\ndate: Wed, 22 Oct 2025 14:16:11 GMT\nserver: uvicorn\ncontent-length: 27\ncontent-type: application/json\n```\n",
      "summary": "Starlette has a head request that works right along side your get requests. This morning I fiddled around with custom routes for and , but had to manually...",
      "date_published": "2025-10-22T09:11:31Z",
      "date_modified": "2025-10-22T09:11:31Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "python",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/dont-copy-your-gitignore-to-stignore/",
      "url": "https://waylonwalker.com/dont-copy-your-gitignore-to-stignore/",
      "title": "Don't copy your gitignore to stignore",
      "content_html": "\u003cp\u003eToday I learned that while \u003ccode\u003e.stignore\u003c/code\u003e and \u003ccode\u003e.gitignore\u003c/code\u003e look very similar they\nare not.  My obsidian directory had been locked up for a few weeks and I had no\nidea why until I logged into the web ui and saw errors.  The errors were some\nconfusing regex validator not matching.  I don’t know what the exact error was,\nbut I went in and only ignored the files I cared about instead of the entire\ngitignore.  Primarily I was getting conflicts in my \u003ccode\u003e.git\u003c/code\u003e directory.\u003c/p\u003e\n",
      "content_text": "\nToday I learned that while `.stignore` and `.gitignore` look very similar they\nare not.  My obsidian directory had been locked up for a few weeks and I had no\nidea why until I logged into the web ui and saw errors.  The errors were some\nconfusing regex validator not matching.  I don't know what the exact error was,\nbut I went in and only ignored the files I cared about instead of the entire\ngitignore.  Primarily I was getting conflicts in my `.git` directory.\n",
      "summary": "Today I learned that while and look very similar they are not. My obsidian directory had been locked up for a few weeks and I had no idea why until I logged...",
      "date_published": "2025-10-21T18:43:00Z",
      "date_modified": "2025-10-21T18:43:00Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "homelab"
      ]
    },
    {
      "id": "https://waylonwalker.com/vanilla-html-hover-text/",
      "url": "https://waylonwalker.com/vanilla-html-hover-text/",
      "title": "vanilla html hover text",
      "content_html": "\u003cp\u003eI needed to display some hover text in a web app that I am using tailwind and\njinja on.  It has no js, and no build other than the tailwind. I want this to\nremain \u003cspan style=\"cursor: help; color:yellow;\" title=\"respective to the\npython developer I am and the team it is used for\"\u003esimple\u003c/span\u003e. Turns out\nthat you can use a span with a title attribute to get hover text in\n\u003ca href=\"/html/\" class=\"glossary-term\" title=\"HTML (HyperText Markup Language) is the standard markup language used to create and design documents on the World Wide Web. It structures web content by...\"\u003eHTML\u003c/a\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eI needed to display some hover text in a web app that I am using tailwind and\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejinja on.  It has no js, and no build other than the tailwind. I want this to\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremain \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;cursor: help; color:yellow;\u0026#39;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;respective to the\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003epython developer I am and the team it is used for\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003esimple\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI needed to display some hover text in a web app that I am using tailwind and\njinja on.  It has no js, and no build other than the tailwind. I want this to\nremain \u003cspan style='cursor: help; color:yellow;' title='respective to the\npython developer I am and the team it is used for'\u003esimple\u003c/span\u003e. Turns out\nthat you can use a span with a title attribute to get hover text in\nHTML.\n\n``` html\n\u003cp\u003e\nI needed to display some hover text in a web app that I am using tailwind and\njinja on.  It has no js, and no build other than the tailwind. I want this to\nremain \u003cspan style='cursor: help; color:yellow;' title='respective to the\npython developer I am and the team it is used for'\u003esimple\u003c/span\u003e.\n\u003c/p\u003e\n```\n",
      "summary": "I needed to display some hover text in a web app that I am using tailwind and jinja on. It has no js, and no build other than the tailwind. I want this to...",
      "date_published": "2025-09-16T11:39:41Z",
      "date_modified": "2025-09-16T11:39:41Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "html",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/tar-over-ssh/",
      "url": "https://waylonwalker.com/tar-over-ssh/",
      "title": "tar over ssh",
      "content_html": "\u003cp\u003eToday I learned how to use tar over ssh to save hours in file transfers.  I\nkeep all of my projects in ~/\u003ca href=\"/glossary/git/\" class=\"glossary-term\" title=\"Git is a version control system for tracking changes in source code during software development. In the beginning there were many, some were licensed. As...\"\u003egit\u003c/a\u003e (very creative I know, I’ve done it for years\nand haven’t changed).  I just swapped out my main desktop from bazzite to\nhyprland, and wanted to get all of my projects back.  Before killing my\nbazzite install I moved everything over (16GB of many small files), it took\nover 14 hours, maybe longer.  I had started in the morning and just let it\nchurn.\u003c/p\u003e\n\u003cp\u003eThis was not going to happen for re-seeding all of my projects on my new\nsystem, I knew there had to be a better way, I looked at rsync, but for seeding\nI ran into this tar over ssh technique and it only took me 6m51s to pull all of\nmy projects off of my remote server.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003essh user@192.168.1.100 \u003cspan class=\"s1\"\u003e\u0026#39;tar -C /tank/git -cpf - .\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e|\u003c/span\u003e tar -C \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$HOME\u003c/span\u003e\u003cspan class=\"s2\"\u003e/git\u0026#34;\u003c/span\u003e -xpf -\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nToday I learned how to use tar over ssh to save hours in file transfers.  I\nkeep all of my projects in ~/git (very creative I know, I've done it for years\nand haven't changed).  I just swapped out my main desktop from bazzite to\nhyprland, and wanted to get all of my projects back.  Before killing my\nbazzite install I moved everything over (16GB of many small files), it took\nover 14 hours, maybe longer.  I had started in the morning and just let it\nchurn.\n\nThis was not going to happen for re-seeding all of my projects on my new\nsystem, I knew there had to be a better way, I looked at rsync, but for seeding\nI ran into this tar over ssh technique and it only took me 6m51s to pull all of\nmy projects off of my remote server.\n\n``` bash\nssh user@192.168.1.100 'tar -C /tank/git -cpf - .' \\\n  | tar -C \"$HOME/git\" -xpf -\n```\n\n\n",
      "summary": "Today I learned how to use tar over ssh to save hours in file transfers. I keep all of my projects in ~/git (very creative I know, I've done it for years and...",
      "date_published": "2025-09-13T10:50:42Z",
      "date_modified": "2025-09-13T10:50:42Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "bash",
        "cli",
        "homelab",
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/uv-script-management/",
      "url": "https://waylonwalker.com/uv-script-management/",
      "title": "uv script management",
      "content_html": "\u003cp\u003eI’ve been leaning on\n\u003ca href=\"https://treyhunner.com/2024/12/lazy-self-installing-python-scripts-with-uv/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/treyhunner.com.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/treyhunner.com.png\" class=\"has-avatar  has-avatar-before\"\u003elazy-self-installing-python-scripts\u003c/a\u003e\nmore and more, but I did not realize how much tooling that\n\u003ca href=\"https://docs.astral.sh/uv/getting-started/installation/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/docs.astral.sh.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/docs.astral.sh.png\" class=\"has-avatar  has-avatar-before\"\u003euv\u003c/a\u003e\ngives you to help manage your scripts.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv init --script up\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv add --script up typer rich\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv remove --script up rich\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esed -i \u003cspan class=\"s1\"\u003e\u0026#39;1i #!/usr/bin/env -S uv run --script\u0026#39;\u003c/span\u003e up\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echmod +x up\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./up\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe result is a script that looks like this, its executable as what looks like\nregular command in your shell.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ch\"\u003e#!/usr/bin/env -S uv run --script\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# /// script\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# requires-python = \u0026#34;\u0026gt;=3.13\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# dependencies = [\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#34;typer\u0026#34;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ///\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Hello from up!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"vm\"\u003e__name__\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;__main__\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nI've been leaning on\n[lazy-self-installing-python-scripts](https://treyhunner.com/2024/12/lazy-self-installing-python-scripts-with-uv/)\nmore and more, but I did not realize how much tooling that\n[uv](https://docs.astral.sh/uv/getting-started/installation/)\ngives you to help manage your scripts.\n\n``` bash\nuv init --script up\nuv add --script up typer rich\nuv remove --script up rich\nsed -i '1i #!/usr/bin/env -S uv run --script' up\nchmod +x up\n./up\n```\n\nThe result is a script that looks like this, its executable as what looks like\nregular command in your shell.\n\n``` python\n#!/usr/bin/env -S uv run --script\n# /// script\n# requires-python = \"\u003e=3.13\"\n# dependencies = [\n#     \"typer\",\n# ]\n# ///\n\n\ndef main() -\u003e None:\n    print(\"Hello from up!\")\n\n\nif __name__ == \"__main__\":\n    main()\n```\n",
      "summary": "I've been leaning on lazy-self-installing-python-scripts more and more, but I did not realize how much tooling that uv gives you to help manage your scripts.",
      "date_published": "2025-09-07T20:22:56Z",
      "date_modified": "2025-09-07T20:22:56Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/nvim-delete-current-file/",
      "url": "https://waylonwalker.com/nvim-delete-current-file/",
      "title": "nvim delete current file",
      "content_html": "\u003cp\u003eThis one is one that I’ve been using quite often, I did’t have a hotkey for it,\nI just used the \u003ccode\u003erm\u003c/code\u003e shell command.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e!!\u003c/span\u003e\u003cspan class=\"nx\"\u003erm\u003c/span\u003e %\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nx\"\u003eTAB\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nx\"\u003eCR\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen you type \u003ccode\u003e!!\u003c/code\u003e from normal mode it will automatically put you in command\nmode with \u003ccode\u003e.!\u003c/code\u003e pre-filled, then you just type \u003ccode\u003erm \u003c/code\u003e and \u003ccode\u003e\u0026lt;TAB\u0026gt;\u003c/code\u003e to\nauto-complete the current file name, and \u003ccode\u003e\u0026lt;CR\u0026gt;\u003c/code\u003e to execute the command.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e.\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003erm\u003c/span\u003e %\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nx\"\u003eTAB\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nx\"\u003eCR\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"making-it-better\"\u003eMaking it better \u003ca href=\"#making-it-better\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe one quirk that I don’t like about this is that the buffer remains open\nafter deleting, and sometimes I forget to close it and end up re-creating it by\nmistake when running \u003ccode\u003e:wall\u003c/code\u003e or \u003ccode\u003e:xall\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eCreate a \u003ccode\u003eDeleteFile\u003c/code\u003e command with vim command.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003ecommand\u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e \u003cspan class=\"nx\"\u003eDeleteFile\u003c/span\u003e \u003cspan class=\"k\"\u003eexecute\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;!rm %\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nx\"\u003ebdelete\u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCreate a \u003ccode\u003eDeleteFile\u003c/code\u003e command with lua.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evim.api\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003envim_create_user_command\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;DeleteFile\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e-- Delete the current file from disk\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003evim.cmd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;!rm %\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e-- Close the buffer without saving\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003evim.cmd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;bdelete!\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003eend\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e{}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nThis one is one that I've been using quite often, I did't have a hotkey for it,\nI just used the `rm` shell command.\n\n``` vim\n!!rm %\u003cTAB\u003e\u003cCR\u003e\n```\n\nWhen you type `!!` from normal mode it will automatically put you in command\nmode with `.!` pre-filled, then you just type `rm ` and `\u003cTAB\u003e` to\nauto-complete the current file name, and `\u003cCR\u003e` to execute the command.\n\n``` vim\n:.!rm %\u003cTAB\u003e\u003cCR\u003e\n\n```\n\n## Making it better\n\nThe one quirk that I don't like about this is that the buffer remains open\nafter deleting, and sometimes I forget to close it and end up re-creating it by\nmistake when running `:wall` or `:xall`.\n\n\nCreate a `DeleteFile` command with vim command.\n\n``` vim\n:command! DeleteFile execute \"!rm %\" | bdelete!\n```\n\nCreate a `DeleteFile` command with lua.\n``` lua\nvim.api.nvim_create_user_command(\n  'DeleteFile',\n  function()\n    -- Delete the current file from disk\n    vim.cmd('!rm %')\n    -- Close the buffer without saving\n    vim.cmd('bdelete!')\n  end,\n  {}\n)\n```\n",
      "summary": "This one is one that I've been using quite often, I did't have a hotkey for it, I just used the shell command.",
      "date_published": "2025-09-02T13:23:21Z",
      "date_modified": "2025-09-02T13:23:21Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "neovim"
      ]
    },
    {
      "id": "https://waylonwalker.com/vim-noa/",
      "url": "https://waylonwalker.com/vim-noa/",
      "title": "vim noa",
      "content_html": "\u003cp\u003eVim \u003ccode\u003e:noa\u003c/code\u003e is a command that runs what you call without autocommands on.  This\nis typically used when you have some \u003ccode\u003eBufWritePre\u003c/code\u003e commands for formatting,\nmost auto formatters are implemented this way in vim.  It can be super useful\nif you have something like a yaml/json file that you have crafted perfectly how\nyou want it, maybe it has some source code for a small script or sql embeded\nand your formatter wants to turn it into one line.  You could get a better\nformatter, but for these one off cases that aren’t a big bother to me I run\n\u003ccode\u003e:noa w\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003enoa\u003c/span\u003e \u003cspan class=\"nx\"\u003ew\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nVim `:noa` is a command that runs what you call without autocommands on.  This\nis typically used when you have some `BufWritePre` commands for formatting,\nmost auto formatters are implemented this way in vim.  It can be super useful\nif you have something like a yaml/json file that you have crafted perfectly how\nyou want it, maybe it has some source code for a small script or sql embeded\nand your formatter wants to turn it into one line.  You could get a better\nformatter, but for these one off cases that aren't a big bother to me I run\n`:noa w`.\n\n``` vim\n:noa w\n```\n",
      "summary": "Vim is a command that runs what you call without autocommands on. This is typically used when you have some commands for formatting, most auto formatters are...",
      "date_published": "2025-08-29T08:32:44Z",
      "date_modified": "2025-08-29T08:32:44Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "vim"
      ]
    },
    {
      "id": "https://waylonwalker.com/modd/",
      "url": "https://waylonwalker.com/modd/",
      "title": "modd",
      "content_html": "\u003cp\u003eToday I gave \u003ca href=\"https://github.com/cortesi/modd\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003emodd\u003c/a\u003e a try, and it seems like a\ngood file watcher executor.  I tried using libnotify to send desktop\nnotifications, but all I got was modd, I might not have notifications setup\nright on the awesomewm machine.\u003c/p\u003e\n\u003cp\u003econfig goes in \u003ccode\u003emodd.conf\u003c/code\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-config\"\u003e**/*.py {\n  # check formatting via ruff\n  prep: ruff format --check .\n\n  # check docstring formatting\n  prep: pydocstyle .\n  #\n  # # check type hints via ty\n  prep: ty check .\n  #\n  # # run linter via ruff\n  prep: ruff check .\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI installed it using installer from jpillora, pulling pre-built binaries right\nout of the github repo.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://i.jpillora.com/cortesi/modd \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen you can install it, and on file change it will run the commands you\nconfigured.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emodd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nToday I gave [modd](https://github.com/cortesi/modd) a try, and it seems like a\ngood file watcher executor.  I tried using libnotify to send desktop\nnotifications, but all I got was modd, I might not have notifications setup\nright on the awesomewm machine.\n\nconfig goes in `modd.conf`\n\n``` config\n**/*.py {\n  # check formatting via ruff\n  prep: ruff format --check .\n\n  # check docstring formatting\n  prep: pydocstyle .\n  #\n  # # check type hints via ty\n  prep: ty check .\n  #\n  # # run linter via ruff\n  prep: ruff check .\n}\n```\n\nI installed it using installer from jpillora, pulling pre-built binaries right\nout of the github repo.\n\n``` bash\ncurl https://i.jpillora.com/cortesi/modd | bash\n```\n\nThen you can install it, and on file change it will run the commands you\nconfigured.\n\n``` bash\nmodd\n```\n",
      "summary": "Today I gave modd a try, and it seems like a good file watcher executor. I tried using libnotify to send desktop notifications, but all I got was modd, I...",
      "date_published": "2025-08-25T10:48:01Z",
      "date_modified": "2025-08-25T10:48:01Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev"
      ]
    },
    {
      "id": "https://waylonwalker.com/bash-timestamp/",
      "url": "https://waylonwalker.com/bash-timestamp/",
      "title": "bash timestamp",
      "content_html": "\u003cp\u003eToday I needed to make a backup of some config.  I wanted to add a timestamp so\nthat I knew when the backup was made.  This would make unique backups easy, and\nI could tell when they were made.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecp configfile configfile.backup.\u003cspan class=\"k\"\u003e$(\u003c/span\u003edate %s\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you want to decrypt the timestamp into something more human readable.  You\ncan list backup files, strip out the timestamp, and then convert it to a human\nreadable date.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/bin/ls \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep backup \u003cspan class=\"p\"\u003e|\u003c/span\u003e sed \u003cspan class=\"s1\"\u003e\u0026#39;s/configfile.backup.//\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e xargs -I \u003cspan class=\"o\"\u003e{}\u003c/span\u003e date -d @\u003cspan class=\"o\"\u003e{}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eor just throw it to the date command by hand.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edate -d @1755895402\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nToday I needed to make a backup of some config.  I wanted to add a timestamp so\nthat I knew when the backup was made.  This would make unique backups easy, and\nI could tell when they were made.\n\n``` bash\ncp configfile configfile.backup.$(date %s)\n```\n\nIf you want to decrypt the timestamp into something more human readable.  You\ncan list backup files, strip out the timestamp, and then convert it to a human\nreadable date.\n\n``` bash\n/bin/ls | grep backup | sed 's/configfile.backup.//' | xargs -I {} date -d @{}\n```\n\nor just throw it to the date command by hand.\n\n``` bash\ndate -d @1755895402\n```\n\n",
      "summary": "Today I needed to make a backup of some config. I wanted to add a timestamp so that I knew when the backup was made. This would make unique backups easy, and...",
      "date_published": "2025-08-22T15:35:36Z",
      "date_modified": "2025-08-22T15:35:36Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/qr-codes-in-python/",
      "url": "https://waylonwalker.com/qr-codes-in-python/",
      "title": "qr codes in python",
      "content_html": "\u003cp\u003eI have a couple of use cases for simple qr codes in python coming up.  One is\nfor blog posts, the other is for auth into a new server application logged to a\nterminal.  I tried the \u003ca href=\"https://pypi.org/project/qrcode/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/pypi.org.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/pypi.org.ico\" class=\"has-avatar  has-avatar-before\"\u003e\u003ccode\u003eqrcode\u003c/code\u003e\u003c/a\u003e library\nand it does not look as nice to me and I found\n\u003ca href=\"https://pypi.org/project/pyqrcode/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/pypi.org.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/pypi.org.ico\" class=\"has-avatar  has-avatar-before\"\u003e\u003ccode\u003epyqrcode\u003c/code\u003e\u003c/a\u003e to be quite nice.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eimport pyqrcode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eurl\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e pyqrcode.create\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;https://waylonwalker.com/qr-codes-in-python\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eurl.svg\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;qr-codes-in-python.svg\u0026#39;\u003c/span\u003e, \u003cspan class=\"nv\"\u003escale\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e8\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprint\u003cspan class=\"o\"\u003e(\u003c/span\u003eurl.terminal\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003equiet_zone\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e1\u003cspan class=\"o\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eurl.svg\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;qr-codes-in-python.svg\u0026#39;\u003c/span\u003e, \u003cspan class=\"nv\"\u003escale\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e12\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eurl.svg\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;qr-codes-in-python.svg\u0026#39;\u003c/span\u003e, \u003cspan class=\"nv\"\u003eomithw\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eTrue\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"c1\"\u003e# width is controlled by the container\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eurl.svg\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;qr-codes-in-python.svg\u0026#39;\u003c/span\u003e, \u003cspan class=\"nv\"\u003eomithw\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eTrue, \u003cspan class=\"nv\"\u003emodule_color\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;#ffd119\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eurl.svg\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;qr-codes-in-python.svg\u0026#39;\u003c/span\u003e, \u003cspan class=\"nv\"\u003eomithw\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eTrue, \u003cspan class=\"nv\"\u003emodule_color\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;#ff69b4\u0026#39;\u003c/span\u003e, \u003cspan class=\"nv\"\u003ebackground\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;#2b034c\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"result\"\u003eresult \u003ca href=\"#result\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere is the final svg result.\u003c/p\u003e\n\u003c!--?xml version=\"1.0\" encoding=\"UTF-8\"?--\u003e\n\u003cp\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 45 45\" class=\"pyqrcode\"\u003e\u003cpath fill=\"#2b034c\" d=\"M0 0h45v45h-45z\"\u003e\u003c/path\u003e\u003cpath stroke=\"#ff69b4\" class=\"pyqrline\" d=\"M4 4.5h7m2 0h1m1 0h3m3 0h3m5 0h2m3 0h7m-37 1h1m5 0h1m1 0h2m3 0h1m3 0h1m2 0h2m2 0h2m2 0h1m1 0h1m5 0h1m-37 1h1m1 0h3m1 0h1m1 0h1m2 0h2m1 0h2m1 0h1m1 0h1m1 0h1m2 0h2m2 0h1m1 0h1m1 0h3m1 0h1m-37 1h1m1 0h3m1 0h1m1 0h1m1 0h1m2 0h1m1 0h2m1 0h1m3 0h6m2 0h1m1 0h3m1 0h1m-37 1h1m1 0h3m1 0h1m1 0h1m1 0h1m1 0h2m1 0h1m2 0h1m1 0h2m1 0h1m2 0h1m1 0h1m1 0h1m1 0h3m1 0h1m-37 1h1m5 0h1m1 0h5m2 0h1m2 0h1m3 0h1m1 0h1m3 0h1m1 0h1m5 0h1m-37 1h7m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h7m-27 1h2m1 0h1m1 0h1m4 0h3m4 0h2m-27 1h1m2 0h5m2 0h2m1 0h4m1 0h5m3 0h2m1 0h5m-36 1h1m7 0h2m2 0h1m1 0h5m4 0h3m1 0h5m1 0h2m1 0h1m-37 1h2m1 0h1m2 0h6m1 0h7m1 0h1m1 0h2m2 0h4m1 0h1m1 0h1m1 0h1m-37 1h1m1 0h1m2 0h1m1 0h1m2 0h3m1 0h1m2 0h2m1 0h1m1 0h2m2 0h1m1 0h1m2 0h3m1 0h2m-34 1h1m2 0h1m2 0h1m1 0h1m3 0h1m1 0h1m1 0h2m3 0h1m2 0h2m1 0h1m2 0h1m1 0h2m-33 1h1m3 0h2m1 0h2m1 0h4m2 0h3m1 0h1m1 0h6m2 0h1m1 0h1m-37 1h1m1 0h1m1 0h6m1 0h1m1 0h1m1 0h2m1 0h4m3 0h1m1 0h1m2 0h1m2 0h2m1 0h1m-35 1h1m1 0h2m1 0h3m1 0h2m1 0h1m1 0h1m1 0h3m3 0h1m1 0h1m1 0h6m1 0h1m-36 1h1m3 0h1m1 0h1m4 0h2m6 0h1m1 0h2m5 0h1m1 0h1m4 0h1m-36 1h4m3 0h3m2 0h1m1 0h3m3 0h1m1 0h1m1 0h5m1 0h2m1 0h2m1 0h1m-35 1h1m2 0h2m1 0h2m2 0h3m8 0h2m2 0h5m1 0h2m1 0h1m-35 1h4m1 0h1m1 0h1m1 0h1m1 0h1m7 0h2m1 0h1m1 0h1m1 0h2m1 0h3m1 0h2m-37 1h3m1 0h3m1 0h1m1 0h2m3 0h1m1 0h3m2 0h1m1 0h1m3 0h1m1 0h1m2 0h1m1 0h1m-36 1h1m1 0h2m1 0h1m4 0h1m2 0h1m1 0h2m1 0h1m2 0h1m1 0h1m1 0h1m1 0h1m1 0h3m1 0h2m1 0h1m-37 1h1m1 0h1m1 0h1m1 0h1m2 0h2m1 0h4m1 0h3m1 0h3m3 0h6m2 0h2m-35 1h2m1 0h1m1 0h2m1 0h2m3 0h3m4 0h1m3 0h2m3 0h1m1 0h1m1 0h2m-37 1h4m1 0h2m4 0h2m1 0h4m1 0h1m4 0h1m5 0h2m1 0h1m1 0h2m-36 1h3m3 0h5m1 0h1m1 0h1m1 0h1m1 0h2m1 0h1m1 0h1m2 0h4m3 0h1m1 0h1m-37 1h4m1 0h2m1 0h3m1 0h1m3 0h3m2 0h1m2 0h1m2 0h1m1 0h3m2 0h1m1 0h1m-33 1h1m6 0h1m2 0h6m2 0h3m1 0h1m2 0h5m2 0h1m-37 1h5m1 0h6m1 0h1m6 0h1m1 0h1m5 0h6m-26 1h1m1 0h1m1 0h1m1 0h1m2 0h2m2 0h1m1 0h2m3 0h1m3 0h2m1 0h2m-37 1h7m1 0h1m1 0h5m2 0h2m1 0h1m1 0h2m2 0h1m1 0h1m1 0h1m1 0h3m1 0h1m-37 1h1m5 0h1m1 0h2m1 0h1m1 0h1m1 0h2m2 0h2m3 0h1m3 0h1m3 0h2m1 0h1m-36 1h1m1 0h3m1 0h1m3 0h1m2 0h1m2 0h2m1 0h3m1 0h2m1 0h7m2 0h2m-37 1h1m1 0h3m1 0h1m4 0h1m2 0h2m1 0h1m1 0h1m1 0h1m6 0h1m3 0h3m1 0h1m-37 1h1m1 0h3m1 0h1m1 0h1m1 0h1m1 0h4m1 0h1m1 0h7m1 0h2m2 0h2m2 0h2m-37 1h1m5 0h1m3 0h4m1 0h2m2 0h2m1 0h3m3 0h1m2 0h1m1 0h1m-34 1h7m4 0h2m1 0h1m3 0h2m4 0h1m3 0h1m1 0h1m2 0h1m2 0h1\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/p\u003e\n\u003cp\u003eHere is what it looks like in the terminal.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/c644bd34-b5da-48a3-b6cf-c89efb546114.png\" class=\"glightbox-link\" aria-label=\"screenshot-2025-08-05T13-53-17-368Z.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/c644bd34-b5da-48a3-b6cf-c89efb546114.png\" alt=\"screenshot-2025-08-05T13-53-17-368Z.png\"/ data-glightbox=\"description: screenshot-2025-08-05T13-53-17-368Z.png\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eIf you want fancier qrcodes check out \u003ca href=\"https://mydigitalharbor.com/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/mydigitalharbor.com.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/mydigitalharbor.com.png\" class=\"has-avatar  has-avatar-before\"\u003ehttps://mydigitalharbor.com/\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI have a couple of use cases for simple qr codes in python coming up.  One is\nfor blog posts, the other is for auth into a new server application logged to a\nterminal.  I tried the [`qrcode`](https://pypi.org/project/qrcode/) library\nand it does not look as nice to me and I found\n[`pyqrcode`](https://pypi.org/project/pyqrcode/) to be quite nice.\n\n``` bash\nimport pyqrcode\nurl = pyqrcode.create('https://waylonwalker.com/qr-codes-in-python')\nurl.svg('qr-codes-in-python.svg', scale=8)\nprint(url.terminal(quiet_zone=1))\nurl.svg('qr-codes-in-python.svg', scale=12)\nurl.svg('qr-codes-in-python.svg', omithw=True) # width is controlled by the container\n\nurl.svg('qr-codes-in-python.svg', omithw=True, module_color='#ffd119')\nurl.svg('qr-codes-in-python.svg', omithw=True, module_color='#ff69b4', background='#2b034c')\n```\n\n## result\n\nHere is the final svg result.\n\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 45 45\" class=\"pyqrcode\"\u003e\u003cpath fill=\"#2b034c\" d=\"M0 0h45v45h-45z\"/\u003e\u003cpath stroke=\"#ff69b4\" class=\"pyqrline\" d=\"M4 4.5h7m2 0h1m1 0h3m3 0h3m5 0h2m3 0h7m-37 1h1m5 0h1m1 0h2m3 0h1m3 0h1m2 0h2m2 0h2m2 0h1m1 0h1m5 0h1m-37 1h1m1 0h3m1 0h1m1 0h1m2 0h2m1 0h2m1 0h1m1 0h1m1 0h1m2 0h2m2 0h1m1 0h1m1 0h3m1 0h1m-37 1h1m1 0h3m1 0h1m1 0h1m1 0h1m2 0h1m1 0h2m1 0h1m3 0h6m2 0h1m1 0h3m1 0h1m-37 1h1m1 0h3m1 0h1m1 0h1m1 0h1m1 0h2m1 0h1m2 0h1m1 0h2m1 0h1m2 0h1m1 0h1m1 0h1m1 0h3m1 0h1m-37 1h1m5 0h1m1 0h5m2 0h1m2 0h1m3 0h1m1 0h1m3 0h1m1 0h1m5 0h1m-37 1h7m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h7m-27 1h2m1 0h1m1 0h1m4 0h3m4 0h2m-27 1h1m2 0h5m2 0h2m1 0h4m1 0h5m3 0h2m1 0h5m-36 1h1m7 0h2m2 0h1m1 0h5m4 0h3m1 0h5m1 0h2m1 0h1m-37 1h2m1 0h1m2 0h6m1 0h7m1 0h1m1 0h2m2 0h4m1 0h1m1 0h1m1 0h1m-37 1h1m1 0h1m2 0h1m1 0h1m2 0h3m1 0h1m2 0h2m1 0h1m1 0h2m2 0h1m1 0h1m2 0h3m1 0h2m-34 1h1m2 0h1m2 0h1m1 0h1m3 0h1m1 0h1m1 0h2m3 0h1m2 0h2m1 0h1m2 0h1m1 0h2m-33 1h1m3 0h2m1 0h2m1 0h4m2 0h3m1 0h1m1 0h6m2 0h1m1 0h1m-37 1h1m1 0h1m1 0h6m1 0h1m1 0h1m1 0h2m1 0h4m3 0h1m1 0h1m2 0h1m2 0h2m1 0h1m-35 1h1m1 0h2m1 0h3m1 0h2m1 0h1m1 0h1m1 0h3m3 0h1m1 0h1m1 0h6m1 0h1m-36 1h1m3 0h1m1 0h1m4 0h2m6 0h1m1 0h2m5 0h1m1 0h1m4 0h1m-36 1h4m3 0h3m2 0h1m1 0h3m3 0h1m1 0h1m1 0h5m1 0h2m1 0h2m1 0h1m-35 1h1m2 0h2m1 0h2m2 0h3m8 0h2m2 0h5m1 0h2m1 0h1m-35 1h4m1 0h1m1 0h1m1 0h1m1 0h1m7 0h2m1 0h1m1 0h1m1 0h2m1 0h3m1 0h2m-37 1h3m1 0h3m1 0h1m1 0h2m3 0h1m1 0h3m2 0h1m1 0h1m3 0h1m1 0h1m2 0h1m1 0h1m-36 1h1m1 0h2m1 0h1m4 0h1m2 0h1m1 0h2m1 0h1m2 0h1m1 0h1m1 0h1m1 0h1m1 0h3m1 0h2m1 0h1m-37 1h1m1 0h1m1 0h1m1 0h1m2 0h2m1 0h4m1 0h3m1 0h3m3 0h6m2 0h2m-35 1h2m1 0h1m1 0h2m1 0h2m3 0h3m4 0h1m3 0h2m3 0h1m1 0h1m1 0h2m-37 1h4m1 0h2m4 0h2m1 0h4m1 0h1m4 0h1m5 0h2m1 0h1m1 0h2m-36 1h3m3 0h5m1 0h1m1 0h1m1 0h1m1 0h2m1 0h1m1 0h1m2 0h4m3 0h1m1 0h1m-37 1h4m1 0h2m1 0h3m1 0h1m3 0h3m2 0h1m2 0h1m2 0h1m1 0h3m2 0h1m1 0h1m-33 1h1m6 0h1m2 0h6m2 0h3m1 0h1m2 0h5m2 0h1m-37 1h5m1 0h6m1 0h1m6 0h1m1 0h1m5 0h6m-26 1h1m1 0h1m1 0h1m1 0h1m2 0h2m2 0h1m1 0h2m3 0h1m3 0h2m1 0h2m-37 1h7m1 0h1m1 0h5m2 0h2m1 0h1m1 0h2m2 0h1m1 0h1m1 0h1m1 0h3m1 0h1m-37 1h1m5 0h1m1 0h2m1 0h1m1 0h1m1 0h2m2 0h2m3 0h1m3 0h1m3 0h2m1 0h1m-36 1h1m1 0h3m1 0h1m3 0h1m2 0h1m2 0h2m1 0h3m1 0h2m1 0h7m2 0h2m-37 1h1m1 0h3m1 0h1m4 0h1m2 0h2m1 0h1m1 0h1m1 0h1m6 0h1m3 0h3m1 0h1m-37 1h1m1 0h3m1 0h1m1 0h1m1 0h1m1 0h4m1 0h1m1 0h7m1 0h2m2 0h2m2 0h2m-37 1h1m5 0h1m3 0h4m1 0h2m2 0h2m1 0h3m3 0h1m2 0h1m1 0h1m-34 1h7m4 0h2m1 0h1m3 0h2m4 0h1m3 0h1m1 0h1m2 0h1m2 0h1\"/\u003e\u003c/svg\u003e\n\nHere is what it looks like in the terminal.\n\n![screenshot-2025-08-05T13-53-17-368Z.png](https://dropper.waylonwalker.com/api/file/c644bd34-b5da-48a3-b6cf-c89efb546114.png)\n\nIf you want fancier qrcodes check out \u003chttps://mydigitalharbor.com/\u003e\n",
      "summary": "I have a couple of use cases for simple qr codes in python coming up. One is for blog posts, the other is for auth into a new server application logged to a...",
      "date_published": "2025-08-05T08:32:12Z",
      "date_modified": "2025-08-05T08:32:12Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/dolphin-remote-storage-previews/",
      "url": "https://waylonwalker.com/dolphin-remote-storage-previews/",
      "title": "Dolphin Remote Storage Previews",
      "content_html": "\u003cp\u003eI’ve got a few samba shares going in my \u003ca href=\"/homelab/\" class=\"glossary-term\" title=\"A place to self host applications. For me this is primarily self built web applications, and applications for sharing files with my family. Techno Tim has a...\"\u003ehomelab\u003c/a\u003e, and I’m struggling finding a\ngreat app to scroll through vacation photos with my wife.  I want something\nintuitive, non intimidating, and just works.  Turns out that the default file\nbrowser application for hyprland works great, but you need to enable previews\nfor remote storage for it to work for my use case here.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/3940267e-3727-4e7b-8f7f-aebb49d79326.png\" class=\"glightbox-link\" aria-label=\"3940267e-3727-4e7b-8f7f-aebb49d79326.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/3940267e-3727-4e7b-8f7f-aebb49d79326.png\" alt=\"3940267e-3727-4e7b-8f7f-aebb49d79326.png\"/ data-glightbox=\"description: 3940267e-3727-4e7b-8f7f-aebb49d79326.png\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nI've got a few samba shares going in my homelab, and I'm struggling finding a\ngreat app to scroll through vacation photos with my wife.  I want something\nintuitive, non intimidating, and just works.  Turns out that the default file\nbrowser application for hyprland works great, but you need to enable previews\nfor remote storage for it to work for my use case here.\n\n![3940267e-3727-4e7b-8f7f-aebb49d79326.png](https://dropper.waylonwalker.com/api/file/3940267e-3727-4e7b-8f7f-aebb49d79326.png)\n",
      "summary": "I've got a few samba shares going in my homelab, and I'm struggling finding a great app to scroll through vacation photos with my wife. I want something...",
      "date_published": "2025-08-02T14:58:09Z",
      "date_modified": "2025-08-02T14:58:09Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "hyprland",
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/fc/",
      "url": "https://waylonwalker.com/fc/",
      "title": "fc",
      "content_html": "\u003cp\u003eI am a linux user through and through.  Desktop, server, vms, containers,\neverything except my phone is linux.  With this I spend a lot of time in the\nterminal, and have been a long time user of \u003ccode\u003e!!\u003c/code\u003e to rerun the last command, but\nwith the ability to tack something on at the beginning or end.\u003c/p\u003e\n\u003cp\u003eTIL about \u003ccode\u003efc\u003c/code\u003e, which opens the last command in your shell history in your\n\u003ccode\u003e$EDITOR\u003c/code\u003e or pass in your editor \u003ccode\u003e-e nvim\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://manned.org/fc\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/manned.org.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/manned.org.ico\" class=\"has-avatar  has-avatar-before\"\u003eman fc\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"rcap-of-how--works\"\u003eRcap of how !! works \u003ca href=\"#rcap-of-how--works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003e!!\u003c/code\u003e pronounces \u003ccode\u003ebang bang\u003c/code\u003e and will run the last command in your history.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -l\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!! \u003cspan class=\"p\"\u003e|\u003c/span\u003e wc -l\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ls -l | wc -l\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo !!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# sudo ls -l | wc -l\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!:s/-l/-l \u003cspan class=\"se\"\u003e\\/\u003c/span\u003etmp\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# sudo ls -l /tmp | wc -l\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"fc-enters-the-chat\"\u003e\u003ccode\u003efc\u003c/code\u003e enters the chat \u003ca href=\"#fc-enters-the-chat\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow making complex edits in your shell can be a bit of a chore, so \u003ccode\u003efc\u003c/code\u003e moves\nthis work to your \u003ccode\u003e$EDITOR\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003efc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis pops open your $EDITOR with the last command in your history.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esudo\u003c/span\u003e \u003cspan class=\"nx\"\u003els\u003c/span\u003e \u003cspan class=\"p\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003el\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nx\"\u003ewc\u003c/span\u003e \u003cspan class=\"p\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003el\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/9d624d65-de40-459b-9566-6e5c833cabcc.png\" class=\"glightbox-link\" aria-label=\"screenshot-2025-07-18T13-21-46-775Z.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/9d624d65-de40-459b-9566-6e5c833cabcc.png\" alt=\"screenshot-2025-07-18T13-21-46-775Z.png\"/ data-glightbox=\"description: screenshot-2025-07-18T13-21-46-775Z.png\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"shell-history\"\u003eShell History \u003ca href=\"#shell-history\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003efc\u003c/code\u003e shows up in shell history, but \u003ccode\u003e!!\u003c/code\u003e does not, \u003ccode\u003e!!\u003c/code\u003e gets replaced by the\ncommand that it becomes.\u003c/p\u003e\n\u003ch2 id=\"up-arrow\"\u003eUp Arrow \u003ca href=\"#up-arrow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eyaya yaya, I know you can also \u003ccode\u003eup-arrow c-e\u003c/code\u003e, but what fun is that, it’s barely a\nflex.  \u003ccode\u003efc\u003c/code\u003e just looks big brained and like you really know what you are doing.\u003c/p\u003e\n",
      "content_text": "\nI am a linux user through and through.  Desktop, server, vms, containers,\neverything except my phone is linux.  With this I spend a lot of time in the\nterminal, and have been a long time user of `!!` to rerun the last command, but\nwith the ability to tack something on at the beginning or end.\n\nTIL about `fc`, which opens the last command in your shell history in your\n`$EDITOR` or pass in your editor `-e nvim`.\n\n[man fc](https://manned.org/fc)\n\n## Rcap of how !! works\n\n`!!` pronounces `bang bang` and will run the last command in your history.\n\n``` bash\nls -l\n\n!! | wc -l\n# ls -l | wc -l\n\nsudo !!\n# sudo ls -l | wc -l\n\n!!:s/-l/-l \\/tmp\n# sudo ls -l /tmp | wc -l\n```\n\n## `fc` enters the chat\n\nNow making complex edits in your shell can be a bit of a chore, so `fc` moves\nthis work to your `$EDITOR`.\n\n``` bash\nfc\n```\n\nThis pops open your $EDITOR with the last command in your history.\n\n``` vim\nsudo ls -l | wc -l\n```\n\n![screenshot-2025-07-18T13-21-46-775Z.png](https://dropper.waylonwalker.com/api/file/9d624d65-de40-459b-9566-6e5c833cabcc.png)\n\n## Shell History\n\n`fc` shows up in shell history, but `!!` does not, `!!` gets replaced by the\ncommand that it becomes.\n\n## Up Arrow\n\nyaya yaya, I know you can also `up-arrow c-e`, but what fun is that, it's barely a\nflex.  `fc` just looks big brained and like you really know what you are doing.\n",
      "summary": "I am a linux user through and through. Desktop, server, vms, containers, everything except my phone is linux. With this I spend a lot of time in the...",
      "date_published": "2025-07-18T07:52:53Z",
      "date_modified": "2025-07-18T07:52:53Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "bash",
        "cli",
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/pygments-htmlformatter/",
      "url": "https://waylonwalker.com/pygments-htmlformatter/",
      "title": "pygments htmlformatter",
      "content_html": "\u003cp\u003eI’ve been a long user of pygments, it’s been the thing that injects \u003ccode\u003e\u0026lt;spans\u0026gt;\u003c/code\u003e\nwith funny little class names like \u003ccode\u003esc\u003c/code\u003e and \u003ccode\u003esi\u003c/code\u003e into the code blocks of my\nwebsite.  I’ve even gone as far as implementing a \u003ca href=\"https://github.com/WaylonWalker/markata/blob/main/markata/plugins/md_it_highlight_code.py\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003eplugin for\nmd-it\u003c/a\u003e,\nbut I had no idea how to re-style it.  I long ago got a theme that looked good\nenough from somewhere and just used it, maybe I pulled something from their\ndocs site and forgot.  Today I learned you can list all the themes easily from\nthe library itself, and render out new css.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epygments.styles\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eget_all_styles\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003elist\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eget_all_styles\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# [\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;abap\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;algol_nu\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;algol\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;arduino\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;autumn\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;borland\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;bw\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;colorful\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;default\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;dracula\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;emacs\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;friendly_grayscale\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;friendly\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;fruity\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;github-dark\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;gruvbox-dark\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;gruvbox-light\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;igor\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;inkpot\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;lightbulb\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;lilypond\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;lovelace\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;manni\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;material\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;monokai\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;murphy\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;native\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;nord-darker\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;nord\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;one-dark\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;paraiso-dark\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;paraiso-light\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;pastie\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;perldoc\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;rainbow_dash\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;rrt\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;sas\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;solarized-dark\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;solarized-light\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;staroffice\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;stata-dark\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;stata-light\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;stata\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;tango\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;trac\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;vim\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;vs\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;xcode\u0026#39;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#     \u0026#39;zenburn\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epygments.formatters\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eHtmlFormatter\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epygments.styles\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eget_style_by_name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003estyle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eget_style_by_name\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;monokai\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eformatter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eHtmlFormatter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eformatter\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget_style_defs\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.highlight\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd now you get styles that you can add to your css and be any theme from the\nlist above.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epre\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eline-height\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e125\u003c/span\u003e\u003cspan class=\"kt\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003elinenos\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003enormal\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003einherit\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding-right\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003elinenos\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003einherit\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding-right\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003elinenos\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003especial\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#000000\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ffffc0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding-right\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003elinenos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003especial\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#000000\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ffffc0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding-right\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehll\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#49483e\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#272822\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ec\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#959077\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Comment */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eerr\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ed007e\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#1e0010\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Error */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eesc\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Escape */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eg\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Generic */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ek\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#66d9ef\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Keyword */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003el\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ae81ff\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003en\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eo\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ff4689\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Operator */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ex\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Other */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ep\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Punctuation */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ech\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#959077\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Comment.Hashbang */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecm\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#959077\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Comment.Multiline */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecp\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#959077\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Comment.Preproc */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecpf\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#959077\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Comment.PreprocFile */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ec1\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#959077\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Comment.Single */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecs\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#959077\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Comment.Special */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003egd\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ff4689\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Generic.Deleted */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ege\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003efont-style\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eitalic\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Generic.Emph */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eges\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ebold\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003efont-style\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eitalic\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Generic.EmphStrong */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003egr\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Generic.Error */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003egh\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Generic.Heading */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003egi\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#a6e22e\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Generic.Inserted */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ego\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#66d9ef\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Generic.Output */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003egp\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ff4689\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ebold\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Generic.Prompt */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003egs\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ebold\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Generic.Strong */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003egu\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#959077\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Generic.Subheading */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003egt\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Generic.Traceback */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ekc\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#66d9ef\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Keyword.Constant */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ekd\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#66d9ef\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Keyword.Declaration */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ekn\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ff4689\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Keyword.Namespace */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ekp\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#66d9ef\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Keyword.Pseudo */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ekr\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#66d9ef\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Keyword.Reserved */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ekt\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#66d9ef\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Keyword.Type */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eld\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.Date */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003em\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ae81ff\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.Number */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003es\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ena\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#a6e22e\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Attribute */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003enb\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Builtin */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003enc\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#a6e22e\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Class */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eno\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#66d9ef\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Constant */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003end\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#a6e22e\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Decorator */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eni\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Entity */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ene\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#a6e22e\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Exception */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003enf\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#a6e22e\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Function */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003enl\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Label */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003enn\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Namespace */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003enx\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#a6e22e\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Other */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003epy\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Property */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ent\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ff4689\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Tag */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003env\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Variable */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eow\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ff4689\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Operator.Word */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003epm\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Punctuation.Marker */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ew\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Text.Whitespace */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003emb\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ae81ff\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.Number.Bin */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003emf\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ae81ff\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.Number.Float */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003emh\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ae81ff\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.Number.Hex */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003emi\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ae81ff\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.Number.Integer */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003emo\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ae81ff\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.Number.Oct */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003esa\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String.Affix */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003esb\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String.Backtick */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003esc\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String.Char */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003edl\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String.Delimiter */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003esd\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String.Doc */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003es2\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String.Double */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ese\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ae81ff\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String.Escape */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003esh\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String.Heredoc */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003esi\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String.Interpol */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003esx\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String.Other */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003esr\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String.Regex */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003es1\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String.Single */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ess\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6db74\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.String.Symbol */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ebp\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Builtin.Pseudo */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003efm\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#a6e22e\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Function.Magic */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003evc\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Variable.Class */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003evg\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Variable.Global */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003evi\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Variable.Instance */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003evm\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f8f8f2\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Name.Variable.Magic */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eil\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ae81ff\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Literal.Number.Integer.Long */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've been a long user of pygments, it's been the thing that injects `\u003cspans\u003e`\nwith funny little class names like `sc` and `si` into the code blocks of my\nwebsite.  I've even gone as far as implementing a [plugin for\nmd-it](https://github.com/WaylonWalker/markata/blob/main/markata/plugins/md_it_highlight_code.py),\nbut I had no idea how to re-style it.  I long ago got a theme that looked good\nenough from somewhere and just used it, maybe I pulled something from their\ndocs site and forgot.  Today I learned you can list all the themes easily from\nthe library itself, and render out new css.\n\n``` python\nfrom pygments.styles import get_all_styles\nlist(get_all_styles())\n# [\n#     'abap',\n#     'algol_nu',\n#     'algol',\n#     'arduino',\n#     'autumn',\n#     'borland',\n#     'bw',\n#     'colorful',\n#     'default',\n#     'dracula',\n#     'emacs',\n#     'friendly_grayscale',\n#     'friendly',\n#     'fruity',\n#     'github-dark',\n#     'gruvbox-dark',\n#     'gruvbox-light',\n#     'igor',\n#     'inkpot',\n#     'lightbulb',\n#     'lilypond',\n#     'lovelace',\n#     'manni',\n#     'material',\n#     'monokai',\n#     'murphy',\n#     'native',\n#     'nord-darker',\n#     'nord',\n#     'one-dark',\n#     'paraiso-dark',\n#     'paraiso-light',\n#     'pastie',\n#     'perldoc',\n#     'rainbow_dash',\n#     'rrt',\n#     'sas',\n#     'solarized-dark',\n#     'solarized-light',\n#     'staroffice',\n#     'stata-dark',\n#     'stata-light',\n#     'stata',\n#     'tango',\n#     'trac',\n#     'vim',\n#     'vs',\n#     'xcode',\n#     'zenburn'\n# ]\n```\n\n``` python\nfrom pygments.formatters import HtmlFormatter\nfrom pygments.styles import get_style_by_name\nstyle = get_style_by_name(\"monokai\")\nformatter = HtmlFormatter(style=style)\nprint(formatter.get_style_defs('.highlight'))\n```\n\nAnd now you get styles that you can add to your css and be any theme from the\nlist above.\n\n``` css\npre { line-height: 125%; }\ntd.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\nspan.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\ntd.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\nspan.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n.highlight .hll { background-color: #49483e }\n.highlight { background: #272822; color: #f8f8f2 }\n.highlight .c { color: #959077 } /* Comment */\n.highlight .err { color: #ed007e; background-color: #1e0010 } /* Error */\n.highlight .esc { color: #f8f8f2 } /* Escape */\n.highlight .g { color: #f8f8f2 } /* Generic */\n.highlight .k { color: #66d9ef } /* Keyword */\n.highlight .l { color: #ae81ff } /* Literal */\n.highlight .n { color: #f8f8f2 } /* Name */\n.highlight .o { color: #ff4689 } /* Operator */\n.highlight .x { color: #f8f8f2 } /* Other */\n.highlight .p { color: #f8f8f2 } /* Punctuation */\n.highlight .ch { color: #959077 } /* Comment.Hashbang */\n.highlight .cm { color: #959077 } /* Comment.Multiline */\n.highlight .cp { color: #959077 } /* Comment.Preproc */\n.highlight .cpf { color: #959077 } /* Comment.PreprocFile */\n.highlight .c1 { color: #959077 } /* Comment.Single */\n.highlight .cs { color: #959077 } /* Comment.Special */\n.highlight .gd { color: #ff4689 } /* Generic.Deleted */\n.highlight .ge { color: #f8f8f2; font-style: italic } /* Generic.Emph */\n.highlight .ges { color: #f8f8f2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */\n.highlight .gr { color: #f8f8f2 } /* Generic.Error */\n.highlight .gh { color: #f8f8f2 } /* Generic.Heading */\n.highlight .gi { color: #a6e22e } /* Generic.Inserted */\n.highlight .go { color: #66d9ef } /* Generic.Output */\n.highlight .gp { color: #ff4689; font-weight: bold } /* Generic.Prompt */\n.highlight .gs { color: #f8f8f2; font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #959077 } /* Generic.Subheading */\n.highlight .gt { color: #f8f8f2 } /* Generic.Traceback */\n.highlight .kc { color: #66d9ef } /* Keyword.Constant */\n.highlight .kd { color: #66d9ef } /* Keyword.Declaration */\n.highlight .kn { color: #ff4689 } /* Keyword.Namespace */\n.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */\n.highlight .kr { color: #66d9ef } /* Keyword.Reserved */\n.highlight .kt { color: #66d9ef } /* Keyword.Type */\n.highlight .ld { color: #e6db74 } /* Literal.Date */\n.highlight .m { color: #ae81ff } /* Literal.Number */\n.highlight .s { color: #e6db74 } /* Literal.String */\n.highlight .na { color: #a6e22e } /* Name.Attribute */\n.highlight .nb { color: #f8f8f2 } /* Name.Builtin */\n.highlight .nc { color: #a6e22e } /* Name.Class */\n.highlight .no { color: #66d9ef } /* Name.Constant */\n.highlight .nd { color: #a6e22e } /* Name.Decorator */\n.highlight .ni { color: #f8f8f2 } /* Name.Entity */\n.highlight .ne { color: #a6e22e } /* Name.Exception */\n.highlight .nf { color: #a6e22e } /* Name.Function */\n.highlight .nl { color: #f8f8f2 } /* Name.Label */\n.highlight .nn { color: #f8f8f2 } /* Name.Namespace */\n.highlight .nx { color: #a6e22e } /* Name.Other */\n.highlight .py { color: #f8f8f2 } /* Name.Property */\n.highlight .nt { color: #ff4689 } /* Name.Tag */\n.highlight .nv { color: #f8f8f2 } /* Name.Variable */\n.highlight .ow { color: #ff4689 } /* Operator.Word */\n.highlight .pm { color: #f8f8f2 } /* Punctuation.Marker */\n.highlight .w { color: #f8f8f2 } /* Text.Whitespace */\n.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */\n.highlight .mf { color: #ae81ff } /* Literal.Number.Float */\n.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */\n.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */\n.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */\n.highlight .sa { color: #e6db74 } /* Literal.String.Affix */\n.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */\n.highlight .sc { color: #e6db74 } /* Literal.String.Char */\n.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */\n.highlight .sd { color: #e6db74 } /* Literal.String.Doc */\n.highlight .s2 { color: #e6db74 } /* Literal.String.Double */\n.highlight .se { color: #ae81ff } /* Literal.String.Escape */\n.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */\n.highlight .si { color: #e6db74 } /* Literal.String.Interpol */\n.highlight .sx { color: #e6db74 } /* Literal.String.Other */\n.highlight .sr { color: #e6db74 } /* Literal.String.Regex */\n.highlight .s1 { color: #e6db74 } /* Literal.String.Single */\n.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */\n.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #a6e22e } /* Name.Function.Magic */\n.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */\n.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */\n.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */\n.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */\n.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */\n```\n",
      "summary": "I've been a long user of pygments, it's been the thing that injects with funny little class names like and into the code blocks of my website. I've even gone...",
      "date_published": "2025-07-17T19:45:19Z",
      "date_modified": "2025-07-17T19:45:19Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/tmux-clipboard-on-hyprland/",
      "url": "https://waylonwalker.com/tmux-clipboard-on-hyprland/",
      "title": "tmux clipboard on hyprland",
      "content_html": "\u003cp\u003eSmooth clipboard settings for tmux is critical for my workflow.  I’m often\ngrabbing snippets of terminal output to paste into team chats, blog posts, or\nllm prompts.  Admittedly, I’m often doing this with the mouse, unless it’s\ncoming from neovim, which I generally do with motions.  Moving from an \u003ccode\u003exorg\u003c/code\u003e\nbased setup to hyprland has required me to reconfigure my tmux clipboard\nsettings.  This is what I did.\u003c/p\u003e\n\u003cp\u003eFirst install wl-clipboard with \u003ca href=\"/paru/\" class=\"glossary-term\" title=\"paru is a package manager for archlinux that installs packages from the \u003ca href=\"/aur/\" class=\"glossary-term\" title=\"Arch User Repository, a collection of community maintained packages for archlinux.\"\u003eAUR\u003c/a\u003e.\"\u003eparu\u003c/a\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eparu -S wl-clipboard\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNext add this to your tmux config.  I’ve long had this config, but with only\nthe \u003ccode\u003exorg\u003c/code\u003e/\u003ccode\u003exclip\u003c/code\u003e setup, now this checks for wl-copy, uses it, or falls back to\nmy old \u003ccode\u003exclip\u003c/code\u003e setup.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ebind\u003c/span\u003e -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel \u003cspan class=\"s2\"\u003e\u0026#34;bash -c \u0026#39;command -v wl-copy \u0026gt;/dev/null \u0026amp;\u0026amp; wl-copy || xclip -i -f -selection primary | xclip -i -selection clipboard\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eset-option -s set-clipboard off\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel \u003cspan class=\"s2\"\u003e\u0026#34;bash -c \u0026#39;command -v wl-copy \u0026gt;/dev/null \u0026amp;\u0026amp; wl-copy || xclip -i -f -selection primary | xclip -i -selection clipboard\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nSmooth clipboard settings for tmux is critical for my workflow.  I'm often\ngrabbing snippets of terminal output to paste into team chats, blog posts, or\nllm prompts.  Admittedly, I'm often doing this with the mouse, unless it's\ncoming from neovim, which I generally do with motions.  Moving from an `xorg`\nbased setup to hyprland has required me to reconfigure my tmux clipboard\nsettings.  This is what I did.\n\nFirst install wl-clipboard with paru.\n\n``` bash\nparu -S wl-clipboard\n```\n\nNext add this to your tmux config.  I've long had this config, but with only\nthe `xorg`/`xclip` setup, now this checks for wl-copy, uses it, or falls back to\nmy old `xclip` setup.\n\n``` bash\nbind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel \"bash -c 'command -v wl-copy \u003e/dev/null \u0026\u0026 wl-copy || xclip -i -f -selection primary | xclip -i -selection clipboard'\"\nset-option -s set-clipboard off\nbind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel \"bash -c 'command -v wl-copy \u003e/dev/null \u0026\u0026 wl-copy || xclip -i -f -selection primary | xclip -i -selection clipboard'\"\n```\n",
      "summary": "Smooth clipboard settings for tmux is critical for my workflow. I'm often grabbing snippets of terminal output to paste into team chats, blog posts, or llm...",
      "date_published": "2025-07-06T20:45:47Z",
      "date_modified": "2025-07-06T20:45:47Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "archlinux",
        "hyprland"
      ]
    },
    {
      "id": "https://waylonwalker.com/virt-manager-on-bazzite/",
      "url": "https://waylonwalker.com/virt-manager-on-bazzite/",
      "title": "virt manager on bazzite",
      "content_html": "\u003cp\u003eI got virtual machine manager running on two Bazzite machines today.  It was a\nbit tricky, more than I thought actually.  I ran into all sorts of\nvirtualisation not setup issues when I tried the flatpak.  Then I found that\nBazzite comes with a \u003ccode\u003eujust setup-virtualization\u003c/code\u003e command that does all the\nwork for me.  I tried that and again virtual machine manager was here, but not\nworking, this time it feels like flatpak issues.\u003c/p\u003e\n\u003cp\u003eIn a Hail Mary attempt I got it working by using an ubuntu distrobox container\nto run the UI.  And it worked!\u003c/p\u003e\n\u003ch2 id=\"from-the-host\"\u003efrom the host \u003ca href=\"#from-the-host\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFrom the host we create the container to use from distrobox.  This is an ubuntu\nmachine, it can be any os of your choosing, preferably one that you are\nfamiliar with and contains virt-manager in its package repos.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edistrobox create -i ubuntu\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edistrobox enter ubuntu\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"from-inside-the-distrobox-container\"\u003efrom inside the distrobox container \u003ca href=\"#from-inside-the-distrobox-container\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow that we are in the distrobox we are no longer in an immutable distro and we\ncan easily install anything we want.  I actually like this process.  I might\nhave shit like this that I use for a month or a few months, on a normal distro,\nthis is fully installed on the os, raises the potential of package conflicts\nand lengthens the update time.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt upgrade\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install virtinst virt-manager\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evirt-manager\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"along-the-way\"\u003eAlong the way \u003ca href=\"#along-the-way\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI tried adding myself to the libvirt group, and expicitly setting the socket\npath. After setting up another machine I realized these steps were unnecessary.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo usermod -aG libvirt \u003cspan class=\"nv\"\u003e$USER\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eLIBVIRT_DEFAULT_URI\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;qemu+unix:///system\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -l /run/libvirt/libvirt-sock\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evirt-install --version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eAfter fully reading through `ujust setup-virtualization` I realized that it\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eadds me to the libvirt group, so that’s why it is not needed.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"an-even-better-guide\"\u003eAn even Better Guide \u003ca href=\"#an-even-better-guide\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI later found [[ thoughts-723 ]] there is documentation for setting up virtual\nmachine manager in distrobox in the distrobox docs.  It even calls out running\non an immutable distro like bazzite like it knew I was coming.\u003c/p\u003e\n\u003ch2 id=\"full-log\"\u003efull log \u003ca href=\"#full-log\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewaylon@razorcrest:~$ distrobox create -i ubuntu\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eImage ubuntu not found.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDo you want to pull the image now? \u003cspan class=\"o\"\u003e[\u003c/span\u003eY/n\u003cspan class=\"o\"\u003e]\u003c/span\u003e: y\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eResolved \u003cspan class=\"s2\"\u003e\u0026#34;ubuntu\u0026#34;\u003c/span\u003e as an \u003cspan class=\"nb\"\u003ealias\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003e/etc/containers/registries.conf.d/000-shortnames.conf\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTrying to pull docker.io/library/ubuntu:latest...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGetting image \u003cspan class=\"nb\"\u003esource\u003c/span\u003e signatures\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCopying blob d9d352c11bbd \u003cspan class=\"k\"\u003edone\u003c/span\u003e   \u003cspan class=\"p\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCopying config bf16bdcff9 \u003cspan class=\"k\"\u003edone\u003c/span\u003e   \u003cspan class=\"p\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWriting manifest to image destination\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebf16bdcff9c96b76a6d417bd8f0a3abe0e55c0ed9bdb3549e906834e2592fd5f\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreating \u003cspan class=\"s1\"\u003e\u0026#39;ubuntu\u0026#39;\u003c/span\u003e using image ubuntu  \u003cspan class=\"o\"\u003e[\u003c/span\u003e OK \u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDistrobox \u003cspan class=\"s1\"\u003e\u0026#39;ubuntu\u0026#39;\u003c/span\u003e successfully created.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTo enter, run:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edistrobox enter ubuntu\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewaylon@razorcrest:~$ distrobox enter ubuntu\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eStarting container...                     \u003cspan class=\"o\"\u003e[\u003c/span\u003e OK \u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eInstalling basic packages...              \u003cspan class=\"o\"\u003e[\u003c/span\u003e OK \u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up devpts mounts...               \u003cspan class=\"o\"\u003e[\u003c/span\u003e OK \u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up read-only mounts...            \u003cspan class=\"o\"\u003e[\u003c/span\u003e OK \u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up read-write mounts...           \u003cspan class=\"o\"\u003e[\u003c/span\u003e OK \u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up host\u003cspan class=\"s1\"\u003e\u0026#39;s sockets integration...  [ OK ]\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003eIntegrating host\u0026#39;\u003c/span\u003es themes, icons, fonts...  \u003cspan class=\"o\"\u003e[\u003c/span\u003e OK \u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up distrobox profile...           \u003cspan class=\"o\"\u003e[\u003c/span\u003e OK \u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up sudo...                        \u003cspan class=\"o\"\u003e[\u003c/span\u003e OK \u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up user groups...                 \u003cspan class=\"o\"\u003e[\u003c/span\u003e OK \u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up user\u003cspan class=\"s1\"\u003e\u0026#39;s group list...           [ OK ]\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003eSetting up existing user...               [ OK ]\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003eEnsuring user\u0026#39;\u003c/span\u003es access...                 \u003cspan class=\"o\"\u003e[\u003c/span\u003e OK \u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContainer Setup Complete!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e📦\u003cspan class=\"o\"\u003e[\u003c/span\u003ewaylon@ubuntu ~\u003cspan class=\"o\"\u003e]\u003c/span\u003e$ sudo apt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install virtinst\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHit:1 http://security.ubuntu.com/ubuntu noble-security InRelease\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHit:2 http://archive.ubuntu.com/ubuntu noble InRelease\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHit:3 http://archive.ubuntu.com/ubuntu noble-updates InRelease\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHit:4 http://archive.ubuntu.com/ubuntu noble-backports InRelease\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReading package lists... Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBuilding dependency tree... Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReading state information... Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e4\u003c/span\u003e packages can be upgraded. Run \u003cspan class=\"s1\"\u003e\u0026#39;apt list --upgradable\u0026#39;\u003c/span\u003e to see them.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReading package lists... Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBuilding dependency tree... Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReading state information... Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThe following additional packages will be installed:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gir1.2-freedesktop gir1.2-libosinfo-1.0 glib-networking glib-networking-common glib-networking-services\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gstreamer1.0-plugins-base i965-va-driver intel-media-va-driver iso-codes libaio1t64 libasyncns0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libboost-iostreams1.83.0 libboost-thread1.83.0 libburn4t64 libcacard0 libcdparanoia0 libcurl3t64-gnutls\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libdaxctl1 libduktape207 libdw1t64 libflac12t64 libfuse3-3 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libgtk-vnc-2.0-0 libgvnc-1.0-0 libigdgmm12 libiscsi7 libisoburn1t64 libisofs6t64 libjson-glib-1.0-0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libjson-glib-1.0-common libmp3lame0 libmpg123-0t64 libndctl6 libnfs14 libnspr4 libnss3 libnuma1 libogg0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libopus0 liborc-0.4-0t64 libosinfo-1.0-0 libosinfo-l10n libpcsclite1 libphodav-3.0-0 libphodav-3.0-common\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libpmem1 libpmemobj1 libpolkit-gobject-1-0 libproxy1v5 libpulse0 librados2 librbd1 librdmacm1t64 libsndfile1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libsoup-3.0-0 libsoup-3.0-common libspice-client-glib-2.0-8 libspice-client-gtk-3.0-5 libtheora0 libunwind8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  liburing2 libusb-1.0-0 libusbredirhost1t64 libusbredirparser1t64 libva-x11-2 libva2 libvirt-clients\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libvirt-glib-1.0-0 libvirt-glib-1.0-data libvirt-l10n libvirt0 libvisual-0.4-0 libvorbis0a libvorbisenc2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libvte-2.91-0 libxslt1.1 libyajl2 mesa-va-drivers osinfo-db pci.ids python3-certifi python3-chardet\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  python3-idna python3-libvirt python3-libxml2 python3-pkg-resources python3-requests python3-urllib3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  qemu-block-extra qemu-utils spice-client-glib-usb-acl-helper usb.ids va-driver-all virt-viewer xorriso\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSuggested packages:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gvfs i965-va-driver-shaders isoquery fuse3 libvisual-0.4-plugins gstreamer1.0-tools opus-tools pcscd pulseaudio\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gstreamer1.0-libav gstreamer1.0-plugins-bad gstreamer1.0-plugins-good libvirt-clients-qemu libvirt-daemon\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libvirt-login-shell python3-setuptools python3-cryptography python3-openssl python3-socks python-requests-doc\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  python3-brotli netcat python3-argcomplete xorriso-tcltk jigit cdck\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThe following NEW packages will be installed:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gir1.2-freedesktop gir1.2-libosinfo-1.0 glib-networking glib-networking-common glib-networking-services\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gstreamer1.0-plugins-base i965-va-driver intel-media-va-driver iso-codes libaio1t64 libasyncns0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libboost-iostreams1.83.0 libboost-thread1.83.0 libburn4t64 libcacard0 libcdparanoia0 libcurl3t64-gnutls\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libdaxctl1 libduktape207 libdw1t64 libflac12t64 libfuse3-3 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libgtk-vnc-2.0-0 libgvnc-1.0-0 libigdgmm12 libiscsi7 libisoburn1t64 libisofs6t64 libjson-glib-1.0-0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libjson-glib-1.0-common libmp3lame0 libmpg123-0t64 libndctl6 libnfs14 libnspr4 libnss3 libnuma1 libogg0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libopus0 liborc-0.4-0t64 libosinfo-1.0-0 libosinfo-l10n libpcsclite1 libphodav-3.0-0 libphodav-3.0-common\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libpmem1 libpmemobj1 libpolkit-gobject-1-0 libproxy1v5 libpulse0 librados2 librbd1 librdmacm1t64 libsndfile1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libsoup-3.0-0 libsoup-3.0-common libspice-client-glib-2.0-8 libspice-client-gtk-3.0-5 libtheora0 libunwind8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  liburing2 libusb-1.0-0 libusbredirhost1t64 libusbredirparser1t64 libva-x11-2 libva2 libvirt-clients\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libvirt-glib-1.0-0 libvirt-glib-1.0-data libvirt-l10n libvirt0 libvisual-0.4-0 libvorbis0a libvorbisenc2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libvte-2.91-0 libxslt1.1 libyajl2 mesa-va-drivers osinfo-db pci.ids python3-certifi python3-chardet\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  python3-idna python3-libvirt python3-libxml2 python3-pkg-resources python3-requests python3-urllib3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  qemu-block-extra qemu-utils spice-client-glib-usb-acl-helper usb.ids va-driver-all virt-viewer virtinst xorriso\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e upgraded, \u003cspan class=\"m\"\u003e98\u003c/span\u003e newly installed, \u003cspan class=\"m\"\u003e0\u003c/span\u003e to remove and \u003cspan class=\"m\"\u003e4\u003c/span\u003e not upgraded.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNeed to get 34.2 MB of archives.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAfter this operation, \u003cspan class=\"m\"\u003e143\u003c/span\u003e MB of additional disk space will be used.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDo you want to \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e? \u003cspan class=\"o\"\u003e[\u003c/span\u003eY/n\u003cspan class=\"o\"\u003e]\u003c/span\u003e y\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:1 http://archive.ubuntu.com/ubuntu noble/main amd64 iso-codes all 4.16.0-1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e3,492 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:2 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-pkg-resources all 68.1.2-2ubuntu1.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e168\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:3 http://archive.ubuntu.com/ubuntu noble/main amd64 libfuse3-3 amd64 3.14.0-5build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e83.1 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:4 http://archive.ubuntu.com/ubuntu noble/main amd64 libnuma1 amd64 2.0.18-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e23.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:5 http://archive.ubuntu.com/ubuntu noble/main amd64 libusb-1.0-0 amd64 2:1.0.27-1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e54.0 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:6 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 pci.ids all 0.0~2024.03.31-1ubuntu0.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e275\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:7 http://archive.ubuntu.com/ubuntu noble/main amd64 usb.ids all 2024.03.18-1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e223\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:8 http://archive.ubuntu.com/ubuntu noble/main amd64 gir1.2-freedesktop amd64 1.80.1-1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e49.7 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:9 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libcurl3t64-gnutls amd64 8.5.0-2ubuntu10.6 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e333\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:10 http://archive.ubuntu.com/ubuntu noble/main amd64 libduktape207 amd64 2.7.0+tests-0ubuntu3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e143\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:11 http://archive.ubuntu.com/ubuntu noble/main amd64 libproxy1v5 amd64 0.5.4-4build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e26.5 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:12 http://archive.ubuntu.com/ubuntu noble/main amd64 glib-networking-common all 2.80.0-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e6,702 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:13 http://archive.ubuntu.com/ubuntu noble/main amd64 glib-networking-services amd64 2.80.0-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e12.8 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:14 http://archive.ubuntu.com/ubuntu noble/main amd64 glib-networking amd64 2.80.0-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e64.1 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:15 http://archive.ubuntu.com/ubuntu noble/main amd64 libcdparanoia0 amd64 3.10.2+debian-14build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e48.5 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:16 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdw1t64 amd64 0.190-1.1ubuntu0.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e261\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:17 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libunwind8 amd64 1.6.2-3build1.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e55.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:18 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgstreamer1.0-0 amd64 1.24.2-1ubuntu0.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e1,165 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:19 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 liborc-0.4-0t64 amd64 1:0.4.38-1ubuntu0.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e207\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:20 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgstreamer-plugins-base1.0-0 amd64 1.24.2-1ubuntu0.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e862\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:21 http://archive.ubuntu.com/ubuntu noble/main amd64 libogg0 amd64 1.3.5-3build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e22.7 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:22 http://archive.ubuntu.com/ubuntu noble/main amd64 libopus0 amd64 1.4-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e208\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:23 http://archive.ubuntu.com/ubuntu noble/main amd64 libtheora0 amd64 1.1.1+dfsg.1-16.1build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e211\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:24 http://archive.ubuntu.com/ubuntu noble/main amd64 libvisual-0.4-0 amd64 0.4.2-2build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e115\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:25 http://archive.ubuntu.com/ubuntu noble/main amd64 libvorbis0a amd64 1.3.7-1build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e97.6 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:26 http://archive.ubuntu.com/ubuntu noble/main amd64 libvorbisenc2 amd64 1.3.7-1build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e80.8 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:27 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gstreamer1.0-plugins-base amd64 1.24.2-1ubuntu0.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e721\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:28 http://archive.ubuntu.com/ubuntu noble/universe amd64 libva2 amd64 2.20.0-2build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e66.2 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:29 http://archive.ubuntu.com/ubuntu noble/universe amd64 libigdgmm12 amd64 22.3.17+ds1-1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e145\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:30 http://archive.ubuntu.com/ubuntu noble/universe amd64 intel-media-va-driver amd64 24.1.0+dfsg1-1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e4,022 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:31 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libaio1t64 amd64 0.3.113-6build1.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e7,210 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:32 http://archive.ubuntu.com/ubuntu noble/main amd64 libasyncns0 amd64 0.8-6build4 \u003cspan class=\"o\"\u003e[\u003c/span\u003e11.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:33 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libboost-iostreams1.83.0 amd64 1.83.0-2.1ubuntu3.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e259\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:34 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libboost-thread1.83.0 amd64 1.83.0-2.1ubuntu3.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e276\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:35 http://archive.ubuntu.com/ubuntu noble/main amd64 libburn4t64 amd64 1.5.6-1.1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e158\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:36 http://archive.ubuntu.com/ubuntu noble/main amd64 libnspr4 amd64 2:4.35-1.1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e117\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:37 http://archive.ubuntu.com/ubuntu noble/main amd64 libnss3 amd64 2:3.98-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e1,445 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:38 http://archive.ubuntu.com/ubuntu noble/main amd64 libpcsclite1 amd64 2.0.3-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e21.4 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:39 http://archive.ubuntu.com/ubuntu noble/main amd64 libcacard0 amd64 1:2.8.0-3build4 \u003cspan class=\"o\"\u003e[\u003c/span\u003e36.5 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:40 http://archive.ubuntu.com/ubuntu noble/main amd64 libdaxctl1 amd64 77-2ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e21.4 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:41 http://archive.ubuntu.com/ubuntu noble/main amd64 libflac12t64 amd64 1.4.3+ds-2.1ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e197\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:42 http://archive.ubuntu.com/ubuntu noble/main amd64 libmp3lame0 amd64 3.100-6build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e142\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:43 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libmpg123-0t64 amd64 1.32.5-1ubuntu1.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e169\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:44 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsndfile1 amd64 1.2.2-1ubuntu5.24.04.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e209\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:45 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpulse0 amd64 1:16.1+dfsg1-2ubuntu10.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e292\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:46 http://archive.ubuntu.com/ubuntu noble/universe amd64 libgvnc-1.0-0 amd64 1.3.1-1build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e67.1 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:47 http://archive.ubuntu.com/ubuntu noble/universe amd64 libgtk-vnc-2.0-0 amd64 1.3.1-1build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e28.9 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:48 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 librdmacm1t64 amd64 50.0-2ubuntu0.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e70.7 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:49 http://archive.ubuntu.com/ubuntu noble/main amd64 libiscsi7 amd64 1.19.0-3build4 \u003cspan class=\"o\"\u003e[\u003c/span\u003e68.7 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:50 http://archive.ubuntu.com/ubuntu noble/main amd64 libisofs6t64 amd64 1.5.6.pl01-1.1ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e220\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:51 http://archive.ubuntu.com/ubuntu noble/main amd64 libisoburn1t64 amd64 1:1.5.6-1.1ubuntu3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e405\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:52 http://archive.ubuntu.com/ubuntu noble/main amd64 libjson-glib-1.0-common all 1.8.0-2build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e4,244 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:53 http://archive.ubuntu.com/ubuntu noble/main amd64 libjson-glib-1.0-0 amd64 1.8.0-2build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e68.0 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:54 http://archive.ubuntu.com/ubuntu noble/main amd64 libndctl6 amd64 77-2ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e62.8 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:55 http://archive.ubuntu.com/ubuntu noble/main amd64 libnfs14 amd64 5.0.2-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e109\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:56 http://archive.ubuntu.com/ubuntu noble/universe amd64 libphodav-3.0-common all 3.0-8build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e14.9 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:57 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsoup-3.0-common all 3.4.4-5ubuntu0.4 \u003cspan class=\"o\"\u003e[\u003c/span\u003e11.1 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:58 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsoup-3.0-0 amd64 3.4.4-5ubuntu0.4 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e290\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:59 http://archive.ubuntu.com/ubuntu noble/universe amd64 libphodav-3.0-0 amd64 3.0-8build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e29.9 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:60 http://archive.ubuntu.com/ubuntu noble/main amd64 libpmem1 amd64 1.13.1-1.1ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e84.8 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:61 http://archive.ubuntu.com/ubuntu noble/main amd64 libpmemobj1 amd64 1.13.1-1.1ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e116\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:62 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpolkit-gobject-1-0 amd64 124-2ubuntu1.24.04.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e49.1 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:63 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 librados2 amd64 19.2.0-0ubuntu0.24.04.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e3,972 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:64 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 librbd1 amd64 19.2.0-0ubuntu0.24.04.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e3,351 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:65 http://archive.ubuntu.com/ubuntu noble/universe amd64 spice-client-glib-usb-acl-helper amd64 0.42-2ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e12.5 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:66 http://archive.ubuntu.com/ubuntu noble/main amd64 libusbredirparser1t64 amd64 0.13.0-2.1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e16.5 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:67 http://archive.ubuntu.com/ubuntu noble/main amd64 libusbredirhost1t64 amd64 0.13.0-2.1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e20.0 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:68 http://archive.ubuntu.com/ubuntu noble/universe amd64 libspice-client-glib-2.0-8 amd64 0.42-2ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e314\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:69 http://archive.ubuntu.com/ubuntu noble/universe amd64 libva-x11-2 amd64 2.20.0-2build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e12.0 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:70 http://archive.ubuntu.com/ubuntu noble/universe amd64 libspice-client-gtk-3.0-5 amd64 0.42-2ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e56.6 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:71 http://archive.ubuntu.com/ubuntu noble/main amd64 liburing2 amd64 2.5-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e21.1 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:72 http://archive.ubuntu.com/ubuntu noble/main amd64 libyajl2 amd64 2.1.0-5build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e20.2 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:73 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt0 amd64 10.0.0-2ubuntu8.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e1,826 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:74 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-clients amd64 10.0.0-2ubuntu8.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e438\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:75 http://archive.ubuntu.com/ubuntu noble/universe amd64 libvirt-glib-1.0-data all 5.0.0-2build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e17.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:76 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-l10n all 10.0.0-2ubuntu8.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e1,150 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:77 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvte-2.91-0 amd64 0.76.0-1ubuntu0.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e230\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:78 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libxslt1.1 amd64 1.1.39-0exp1ubuntu0.24.04.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e167\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:79 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 mesa-va-drivers amd64 24.2.8-1ubuntu1~24.04.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e19.5 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:80 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 osinfo-db all 0.20250124-0ubuntu0.24.04.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e176\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:81 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-certifi all 2023.11.17-1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e165\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:82 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-chardet all 5.2.0+dfsg-1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e117\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:83 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-idna all 3.6-2ubuntu0.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e49.0 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:84 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-libvirt amd64 10.0.0-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e164\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:85 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 python3-libxml2 amd64 2.9.14+dfsg-1.3ubuntu3.3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e140\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:86 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-urllib3 all 2.0.7-1ubuntu0.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e93.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:87 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-requests all 2.31.0+dfsg-1ubuntu1.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e50.8 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:88 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-utils amd64 1:8.2.2+ds-0ubuntu1.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e2,220 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:89 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-block-extra amd64 1:8.2.2+ds-0ubuntu1.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e111\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:90 http://archive.ubuntu.com/ubuntu noble/universe amd64 i965-va-driver amd64 2.4.1+dfsg1-1build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e332\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:91 http://archive.ubuntu.com/ubuntu noble/universe amd64 va-driver-all amd64 2.20.0-2build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e4,844 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:92 http://archive.ubuntu.com/ubuntu noble/universe amd64 libvirt-glib-1.0-0 amd64 5.0.0-2build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e121\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:93 http://archive.ubuntu.com/ubuntu noble/universe amd64 virt-viewer amd64 11.0-3build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e285\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:94 http://archive.ubuntu.com/ubuntu noble/main amd64 xorriso amd64 1:1.5.6-1.1ubuntu3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e297\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:95 http://archive.ubuntu.com/ubuntu noble/universe amd64 libosinfo-l10n all 1.11.0-2build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e50.6 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:96 http://archive.ubuntu.com/ubuntu noble/universe amd64 libosinfo-1.0-0 amd64 1.11.0-2build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e91.5 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:97 http://archive.ubuntu.com/ubuntu noble/universe amd64 gir1.2-libosinfo-1.0 amd64 1.11.0-2build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e18.6 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:98 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 virtinst all 1:4.1.0-3ubuntu0.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e891\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFetched 34.2 MB in 3s \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.8 MB/s\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExtracting templates from packages: 100%\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package iso-codes.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003eReading database ... \u003cspan class=\"m\"\u003e26588\u003c/span\u003e files and directories currently installed.\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../00-iso-codes_4.16.0-1_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking iso-codes \u003cspan class=\"o\"\u003e(\u003c/span\u003e4.16.0-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package python3-pkg-resources.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../01-python3-pkg-resources_68.1.2-2ubuntu1.2_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking python3-pkg-resources \u003cspan class=\"o\"\u003e(\u003c/span\u003e68.1.2-2ubuntu1.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libfuse3-3:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../02-libfuse3-3_3.14.0-5build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libfuse3-3:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.14.0-5build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libnuma1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../03-libnuma1_2.0.18-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libnuma1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.0.18-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libusb-1.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../04-libusb-1.0-0_2%3a1.0.27-1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libusb-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2:1.0.27-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package pci.ids.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../05-pci.ids_0.0~2024.03.31-1ubuntu0.1_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking pci.ids \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.0~2024.03.31-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package usb.ids.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../06-usb.ids_2024.03.18-1_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking usb.ids \u003cspan class=\"o\"\u003e(\u003c/span\u003e2024.03.18-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-freedesktop:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../07-gir1.2-freedesktop_1.80.1-1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-freedesktop:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.80.1-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libcurl3t64-gnutls:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../08-libcurl3t64-gnutls_8.5.0-2ubuntu10.6_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libcurl3t64-gnutls:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e8.5.0-2ubuntu10.6\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libduktape207:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../09-libduktape207_2.7.0+tests-0ubuntu3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libduktape207:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.7.0+tests-0ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libproxy1v5:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../10-libproxy1v5_0.5.4-4build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libproxy1v5:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.5.4-4build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package glib-networking-common.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../11-glib-networking-common_2.80.0-1build1_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking glib-networking-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.80.0-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package glib-networking-services.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../12-glib-networking-services_2.80.0-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking glib-networking-services \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.80.0-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package glib-networking:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../13-glib-networking_2.80.0-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking glib-networking:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.80.0-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libcdparanoia0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../14-libcdparanoia0_3.10.2+debian-14build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libcdparanoia0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.10.2+debian-14build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libdw1t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../15-libdw1t64_0.190-1.1ubuntu0.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libdw1t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.190-1.1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libunwind8:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../16-libunwind8_1.6.2-3build1.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libunwind8:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.6.2-3build1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libgstreamer1.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../17-libgstreamer1.0-0_1.24.2-1ubuntu0.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libgstreamer1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package liborc-0.4-0t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../18-liborc-0.4-0t64_1%3a0.4.38-1ubuntu0.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking liborc-0.4-0t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:0.4.38-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libgstreamer-plugins-base1.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../19-libgstreamer-plugins-base1.0-0_1.24.2-1ubuntu0.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libgstreamer-plugins-base1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu0.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libogg0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../20-libogg0_1.3.5-3build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libogg0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.5-3build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libopus0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../21-libopus0_1.4-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libopus0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.4-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libtheora0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../22-libtheora0_1.1.1+dfsg.1-16.1build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libtheora0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.1.1+dfsg.1-16.1build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvisual-0.4-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../23-libvisual-0.4-0_0.4.2-2build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvisual-0.4-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.4.2-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvorbis0a:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../24-libvorbis0a_1.3.7-1build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvorbis0a:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.7-1build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvorbisenc2:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../25-libvorbisenc2_1.3.7-1build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvorbisenc2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.7-1build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gstreamer1.0-plugins-base:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../26-gstreamer1.0-plugins-base_1.24.2-1ubuntu0.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gstreamer1.0-plugins-base:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu0.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libva2:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../27-libva2_2.20.0-2build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libva2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.20.0-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libigdgmm12:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../28-libigdgmm12_22.3.17+ds1-1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libigdgmm12:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e22.3.17+ds1-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package intel-media-va-driver:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../29-intel-media-va-driver_24.1.0+dfsg1-1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking intel-media-va-driver:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e24.1.0+dfsg1-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libaio1t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../30-libaio1t64_0.3.113-6build1.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libaio1t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.3.113-6build1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libasyncns0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../31-libasyncns0_0.8-6build4_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libasyncns0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.8-6build4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libboost-iostreams1.83.0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../32-libboost-iostreams1.83.0_1.83.0-2.1ubuntu3.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libboost-iostreams1.83.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.83.0-2.1ubuntu3.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libboost-thread1.83.0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../33-libboost-thread1.83.0_1.83.0-2.1ubuntu3.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libboost-thread1.83.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.83.0-2.1ubuntu3.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libburn4t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../34-libburn4t64_1.5.6-1.1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libburn4t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.5.6-1.1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libnspr4:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../35-libnspr4_2%3a4.35-1.1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libnspr4:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2:4.35-1.1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libnss3:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../36-libnss3_2%3a3.98-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libnss3:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2:3.98-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libpcsclite1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../37-libpcsclite1_2.0.3-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libpcsclite1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.0.3-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libcacard0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../38-libcacard0_1%3a2.8.0-3build4_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libcacard0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:2.8.0-3build4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libdaxctl1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../39-libdaxctl1_77-2ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libdaxctl1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e77-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libflac12t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../40-libflac12t64_1.4.3+ds-2.1ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libflac12t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.4.3+ds-2.1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libmp3lame0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../41-libmp3lame0_3.100-6build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libmp3lame0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.100-6build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libmpg123-0t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../42-libmpg123-0t64_1.32.5-1ubuntu1.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libmpg123-0t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.32.5-1ubuntu1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libsndfile1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../43-libsndfile1_1.2.2-1ubuntu5.24.04.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libsndfile1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.2-1ubuntu5.24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libpulse0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../44-libpulse0_1%3a16.1+dfsg1-2ubuntu10.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libpulse0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:16.1+dfsg1-2ubuntu10.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libgvnc-1.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../45-libgvnc-1.0-0_1.3.1-1build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libgvnc-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.1-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libgtk-vnc-2.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../46-libgtk-vnc-2.0-0_1.3.1-1build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libgtk-vnc-2.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.1-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package librdmacm1t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../47-librdmacm1t64_50.0-2ubuntu0.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking librdmacm1t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e50.0-2ubuntu0.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libiscsi7:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../48-libiscsi7_1.19.0-3build4_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libiscsi7:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.19.0-3build4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libisofs6t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../49-libisofs6t64_1.5.6.pl01-1.1ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libisofs6t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.5.6.pl01-1.1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libisoburn1t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../50-libisoburn1t64_1%3a1.5.6-1.1ubuntu3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libisoburn1t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:1.5.6-1.1ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libjson-glib-1.0-common.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../51-libjson-glib-1.0-common_1.8.0-2build2_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libjson-glib-1.0-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.8.0-2build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libjson-glib-1.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../52-libjson-glib-1.0-0_1.8.0-2build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libjson-glib-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.8.0-2build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libndctl6:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../53-libndctl6_77-2ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libndctl6:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e77-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libnfs14:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../54-libnfs14_5.0.2-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libnfs14:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.0.2-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libphodav-3.0-common.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../55-libphodav-3.0-common_3.0-8build3_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libphodav-3.0-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.0-8build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libsoup-3.0-common.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../56-libsoup-3.0-common_3.4.4-5ubuntu0.4_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libsoup-3.0-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.4.4-5ubuntu0.4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libsoup-3.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../57-libsoup-3.0-0_3.4.4-5ubuntu0.4_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libsoup-3.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.4.4-5ubuntu0.4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libphodav-3.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../58-libphodav-3.0-0_3.0-8build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libphodav-3.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.0-8build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libpmem1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../59-libpmem1_1.13.1-1.1ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libpmem1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.13.1-1.1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libpmemobj1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../60-libpmemobj1_1.13.1-1.1ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libpmemobj1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.13.1-1.1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libpolkit-gobject-1-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../61-libpolkit-gobject-1-0_124-2ubuntu1.24.04.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libpolkit-gobject-1-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e124-2ubuntu1.24.04.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package librados2.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../62-librados2_19.2.0-0ubuntu0.24.04.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking librados2 \u003cspan class=\"o\"\u003e(\u003c/span\u003e19.2.0-0ubuntu0.24.04.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package librbd1.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../63-librbd1_19.2.0-0ubuntu0.24.04.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking librbd1 \u003cspan class=\"o\"\u003e(\u003c/span\u003e19.2.0-0ubuntu0.24.04.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package spice-client-glib-usb-acl-helper.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../64-spice-client-glib-usb-acl-helper_0.42-2ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking spice-client-glib-usb-acl-helper \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.42-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libusbredirparser1t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../65-libusbredirparser1t64_0.13.0-2.1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libusbredirparser1t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.13.0-2.1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libusbredirhost1t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../66-libusbredirhost1t64_0.13.0-2.1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libusbredirhost1t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.13.0-2.1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libspice-client-glib-2.0-8:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../67-libspice-client-glib-2.0-8_0.42-2ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libspice-client-glib-2.0-8:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.42-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libva-x11-2:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../68-libva-x11-2_2.20.0-2build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libva-x11-2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.20.0-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libspice-client-gtk-3.0-5:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../69-libspice-client-gtk-3.0-5_0.42-2ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libspice-client-gtk-3.0-5:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.42-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package liburing2:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../70-liburing2_2.5-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking liburing2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.5-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libyajl2:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../71-libyajl2_2.1.0-5build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libyajl2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.1.0-5build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvirt0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../72-libvirt0_10.0.0-2ubuntu8.7_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvirt0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvirt-clients.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../73-libvirt-clients_10.0.0-2ubuntu8.7_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvirt-clients \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvirt-glib-1.0-data.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../74-libvirt-glib-1.0-data_5.0.0-2build3_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvirt-glib-1.0-data \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.0.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvirt-l10n.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../75-libvirt-l10n_10.0.0-2ubuntu8.7_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvirt-l10n \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvte-2.91-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../76-libvte-2.91-0_0.76.0-1ubuntu0.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvte-2.91-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.76.0-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libxslt1.1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../77-libxslt1.1_1.1.39-0exp1ubuntu0.24.04.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libxslt1.1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.1.39-0exp1ubuntu0.24.04.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package mesa-va-drivers:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../78-mesa-va-drivers_24.2.8-1ubuntu1~24.04.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking mesa-va-drivers:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e24.2.8-1ubuntu1~24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package osinfo-db.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../79-osinfo-db_0.20250124-0ubuntu0.24.04.1_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking osinfo-db \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.20250124-0ubuntu0.24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package python3-certifi.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../80-python3-certifi_2023.11.17-1_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking python3-certifi \u003cspan class=\"o\"\u003e(\u003c/span\u003e2023.11.17-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package python3-chardet.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../81-python3-chardet_5.2.0+dfsg-1_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking python3-chardet \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.2.0+dfsg-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package python3-idna.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../82-python3-idna_3.6-2ubuntu0.1_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking python3-idna \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.6-2ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package python3-libvirt.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../83-python3-libvirt_10.0.0-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking python3-libvirt \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package python3-libxml2:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../84-python3-libxml2_2.9.14+dfsg-1.3ubuntu3.3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking python3-libxml2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.9.14+dfsg-1.3ubuntu3.3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package python3-urllib3.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../85-python3-urllib3_2.0.7-1ubuntu0.2_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking python3-urllib3 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.0.7-1ubuntu0.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package python3-requests.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../86-python3-requests_2.31.0+dfsg-1ubuntu1.1_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking python3-requests \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.31.0+dfsg-1ubuntu1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package qemu-utils.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../87-qemu-utils_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking qemu-utils \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package qemu-block-extra.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../88-qemu-block-extra_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking qemu-block-extra \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package i965-va-driver:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../89-i965-va-driver_2.4.1+dfsg1-1build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking i965-va-driver:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.4.1+dfsg1-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package va-driver-all:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../90-va-driver-all_2.20.0-2build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking va-driver-all:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.20.0-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvirt-glib-1.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../91-libvirt-glib-1.0-0_5.0.0-2build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvirt-glib-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.0.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package virt-viewer.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../92-virt-viewer_11.0-3build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking virt-viewer \u003cspan class=\"o\"\u003e(\u003c/span\u003e11.0-3build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package xorriso.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../93-xorriso_1%3a1.5.6-1.1ubuntu3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking xorriso \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:1.5.6-1.1ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libosinfo-l10n.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../94-libosinfo-l10n_1.11.0-2build3_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libosinfo-l10n \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.11.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libosinfo-1.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../95-libosinfo-1.0-0_1.11.0-2build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libosinfo-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.11.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-libosinfo-1.0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../96-gir1.2-libosinfo-1.0_1.11.0-2build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-libosinfo-1.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.11.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package virtinst.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../97-virtinst_1%3a4.1.0-3ubuntu0.1_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking virtinst \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:4.1.0-3ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up python3-pkg-resources \u003cspan class=\"o\"\u003e(\u003c/span\u003e68.1.2-2ubuntu1.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libcdparanoia0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.10.2+debian-14build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up pci.ids \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.0~2024.03.31-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-freedesktop:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.80.1-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libogg0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.5-3build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libphodav-3.0-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.0-8build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvisual-0.4-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.4.2-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libyajl2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.1.0-5build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libcurl3t64-gnutls:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e8.5.0-2ubuntu10.6\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libboost-thread1.83.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.83.0-2.1ubuntu3.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libigdgmm12:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e22.3.17+ds1-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libsoup-3.0-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.4.4-5ubuntu0.4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libmpg123-0t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.32.5-1ubuntu1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvte-2.91-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.76.0-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libunwind8:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.6.2-3build1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libnfs14:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.0.2-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up liborc-0.4-0t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:0.4.38-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libdw1t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.190-1.1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up python3-libxml2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.9.14+dfsg-1.3ubuntu3.3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up python3-chardet \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.2.0+dfsg-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvirt-glib-1.0-data \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.0.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libva2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.20.0-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up python3-certifi \u003cspan class=\"o\"\u003e(\u003c/span\u003e2023.11.17-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libnspr4:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2:4.35-1.1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libboost-iostreams1.83.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.83.0-2.1ubuntu3.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libopus0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.4-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up intel-media-va-driver:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e24.1.0+dfsg1-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvorbis0a:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.7-1build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up python3-idna \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.6-2ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up usb.ids \u003cspan class=\"o\"\u003e(\u003c/span\u003e2024.03.18-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up osinfo-db \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.20250124-0ubuntu0.24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libpcsclite1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.0.3-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libfuse3-3:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.14.0-5build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libdaxctl1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e77-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up python3-urllib3 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.0.7-1ubuntu0.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libnuma1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.0.18-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvirt0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libaio1t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.3.113-6build1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvirt-glib-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.0.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libisofs6t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.5.6.pl01-1.1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libduktape207:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.7.0+tests-0ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libasyncns0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.8-6build4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libusbredirparser1t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.13.0-2.1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libtheora0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.1.1+dfsg.1-16.1build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libxslt1.1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.1.39-0exp1ubuntu0.24.04.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libburn4t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.5.6-1.1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libndctl6:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e77-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up librdmacm1t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e50.0-2ubuntu0.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libjson-glib-1.0-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.8.0-2build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libflac12t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.4.3+ds-2.1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libusb-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2:1.0.27-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up mesa-va-drivers:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e24.2.8-1ubuntu1~24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up glib-networking-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.80.0-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up liburing2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.5-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libiscsi7:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.19.0-3build4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libisoburn1t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:1.5.6-1.1ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up xorriso \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:1.5.6-1.1ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libpmem1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.13.1-1.1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libva-x11-2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.20.0-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up iso-codes \u003cspan class=\"o\"\u003e(\u003c/span\u003e4.16.0-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libpolkit-gobject-1-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e124-2ubuntu1.24.04.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libgstreamer1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetcap worked! gst-ptp-helper is not suid!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libmp3lame0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.100-6build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up i965-va-driver:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.4.1+dfsg1-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libosinfo-l10n \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.11.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvorbisenc2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.7-1build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up librados2 \u003cspan class=\"o\"\u003e(\u003c/span\u003e19.2.0-0ubuntu0.24.04.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libproxy1v5:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.5.4-4build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up python3-libvirt \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvirt-clients \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up spice-client-glib-usb-acl-helper \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.42-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libgstreamer-plugins-base1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu0.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libnss3:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2:3.98-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libcacard0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:2.8.0-3build4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libusbredirhost1t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.13.0-2.1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libjson-glib-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.8.0-2build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gstreamer1.0-plugins-base:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu0.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvirt-l10n \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up va-driver-all:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.20.0-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up python3-requests \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.31.0+dfsg-1ubuntu1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libpmemobj1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.13.1-1.1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up librbd1 \u003cspan class=\"o\"\u003e(\u003c/span\u003e19.2.0-0ubuntu0.24.04.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libsndfile1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.2-1ubuntu5.24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up qemu-utils \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up qemu-block-extra \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreated symlink /etc/systemd/system/multi-user.target.wants/run-qemu.mount → /usr/lib/systemd/system/run-qemu.mount\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up glib-networking-services \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.80.0-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libpulse0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:16.1+dfsg1-2ubuntu10.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libgvnc-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.1-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up glib-networking:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.80.0-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libgtk-vnc-2.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.1-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libsoup-3.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.4.4-5ubuntu0.4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libphodav-3.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.0-8build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libosinfo-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.11.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-libosinfo-1.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.11.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libspice-client-glib-2.0-8:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.42-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up virtinst \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:4.1.0-3ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libspice-client-gtk-3.0-5:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.42-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up virt-viewer \u003cspan class=\"o\"\u003e(\u003c/span\u003e11.0-3build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcessing triggers \u003cspan class=\"k\"\u003efor\u003c/span\u003e libc-bin \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.39-0ubuntu8.4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcessing triggers \u003cspan class=\"k\"\u003efor\u003c/span\u003e man-db \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.12.0-4build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcessing triggers \u003cspan class=\"k\"\u003efor\u003c/span\u003e libglib2.0-0t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.80.0-6ubuntu3.4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcessing triggers \u003cspan class=\"k\"\u003efor\u003c/span\u003e shared-mime-info \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.4-4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcessing triggers \u003cspan class=\"k\"\u003efor\u003c/span\u003e hicolor-icon-theme \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.17-2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e📦\u003cspan class=\"o\"\u003e[\u003c/span\u003ewaylon@ubuntu ~\u003cspan class=\"o\"\u003e]\u003c/span\u003e$ virt-install --version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evirsh list --all\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e4.1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eerror: failed to connect to the hypervisor\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eerror: binary \u003cspan class=\"s1\"\u003e\u0026#39;/usr/sbin/libvirtd\u0026#39;\u003c/span\u003e does not exist in \u003cspan class=\"nv\"\u003e$PATH\u003c/span\u003e: No such file or directory\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e📦\u003cspan class=\"o\"\u003e[\u003c/span\u003ewaylon@ubuntu ~\u003cspan class=\"o\"\u003e]\u003c/span\u003e$ \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003elogout\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewaylon@razorcrest:~$ distrobox enter --additional-flags \u003cspan class=\"s2\"\u003e\u0026#34;--device /dev/kvm\u0026#34;\u003c/span\u003e ubuntu\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eError: unknown flag: --device\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSee \u003cspan class=\"s1\"\u003e\u0026#39;podman exec --help\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewaylon@razorcrest:~$ distrobox enter ubuntu\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e📦\u003cspan class=\"o\"\u003e[\u003c/span\u003ewaylon@ubuntu ~\u003cspan class=\"o\"\u003e]\u003c/span\u003e$ ls -l /run/libvirt/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecommon/               libvirt-sock          nodedev/              secrets/              virtlogd-admin-sock\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehostdevmgr/           libvirt-sock-ro       nwfilter/             storage/              virtlogd-sock\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einterface/            lxc/                  nwfilter-binding/     virtlockd-admin-sock\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elibvirt-admin-sock    network/              qemu/                 virtlockd-sock\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e📦\u003cspan class=\"o\"\u003e[\u003c/span\u003ewaylon@ubuntu ~\u003cspan class=\"o\"\u003e]\u003c/span\u003e$ ls -l /run/libvirt/libvirt-sock\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esrw-rw-rw-. \u003cspan class=\"m\"\u003e1\u003c/span\u003e nobody nogroup \u003cspan class=\"m\"\u003e0\u003c/span\u003e Jun \u003cspan class=\"m\"\u003e27\u003c/span\u003e 11:09 /run/libvirt/libvirt-sock\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e📦\u003cspan class=\"o\"\u003e[\u003c/span\u003ewaylon@ubuntu ~\u003cspan class=\"o\"\u003e]\u003c/span\u003e$ sudo usermod -aG libvirt \u003cspan class=\"nv\"\u003e$USER\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eusermod: group \u003cspan class=\"s1\"\u003e\u0026#39;libvirt\u0026#39;\u003c/span\u003e does not exist\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e📦\u003cspan class=\"o\"\u003e[\u003c/span\u003ewaylon@ubuntu ~\u003cspan class=\"o\"\u003e]\u003c/span\u003e$ \u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eLIBVIRT_DEFAULT_URI\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;qemu+unix:///system\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evirsh list --all\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Id   Name   State\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e--------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e📦\u003cspan class=\"o\"\u003e[\u003c/span\u003ewaylon@ubuntu ~\u003cspan class=\"o\"\u003e]\u003c/span\u003e$ ls -l /run/libvirt/libvirt-sock\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esrw-rw-rw-. \u003cspan class=\"m\"\u003e1\u003c/span\u003e nobody nogroup \u003cspan class=\"m\"\u003e0\u003c/span\u003e Jun \u003cspan class=\"m\"\u003e27\u003c/span\u003e 11:09 /run/libvirt/libvirt-sock\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e📦\u003cspan class=\"o\"\u003e[\u003c/span\u003ewaylon@ubuntu ~\u003cspan class=\"o\"\u003e]\u003c/span\u003e$ virt-install --version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evirsh list --all\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e4.1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Id   Name   State\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e--------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e📦\u003cspan class=\"o\"\u003e[\u003c/span\u003ewaylon@ubuntu ~\u003cspan class=\"o\"\u003e]\u003c/span\u003e$ sudo apt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install virt-manager -y\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHit:1 http://security.ubuntu.com/ubuntu noble-security InRelease\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHit:2 http://archive.ubuntu.com/ubuntu noble InRelease\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHit:3 http://archive.ubuntu.com/ubuntu noble-updates InRelease\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHit:4 http://archive.ubuntu.com/ubuntu noble-backports InRelease\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReading package lists... Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBuilding dependency tree... Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReading state information... Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e4\u003c/span\u003e packages can be upgraded. Run \u003cspan class=\"s1\"\u003e\u0026#39;apt list --upgradable\u0026#39;\u003c/span\u003e to see them.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReading package lists... Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBuilding dependency tree... Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReading state information... Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThe following additional packages will be installed:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  acl alsa-topology-conf alsa-ucm-conf cpu-checker dmeventd dmidecode dns-root-data dnsmasq-base gettext-base\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gir1.2-atk-1.0 gir1.2-ayatanaappindicator3-0.1 gir1.2-gdkpixbuf-2.0 gir1.2-gstreamer-1.0 gir1.2-gtk-3.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gir1.2-gtk-vnc-2.0 gir1.2-gtksource-4 gir1.2-harfbuzz-0.0 gir1.2-libvirt-glib-1.0 gir1.2-pango-1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gir1.2-spiceclientglib-2.0 gir1.2-spiceclientgtk-3.0 gir1.2-vte-2.91 gstreamer1.0-plugins-good gstreamer1.0-x\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  iptables ipxe-qemu ipxe-qemu-256k-compat-efi-roms libaa1 libasound2-data libasound2t64 libavc1394-0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libayatana-appindicator3-1 libayatana-ido3-0.4-0 libayatana-indicator3-7 libbrlapi0.8 libcaca0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libdbusmenu-glib4 libdbusmenu-gtk3-4 libdecor-0-0 libdecor-0-plugin-1-gtk libdevmapper-event1.02.1 libdv4t64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libfdt1 libgstreamer-plugins-good1.0-0 libgtksourceview-4-0 libgtksourceview-4-common libgudev-1.0-0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libharfbuzz-gobject0 libiec61883-0 libip4tc2 libip6tc2 libjack-jackd2-0 liblvm2cmd2.03 libnetfilter-conntrack3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libnfnetlink0 libnftables1 libnftnl11 libnss-mymachines libpangoxft-1.0-0 libparted2t64 libpipewire-0.3-0t64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libpipewire-0.3-common libpolkit-agent-1-0 libraw1394-11 libsamplerate0 libsdl2-2.0-0 libshout3 libslang2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libslirp0 libspa-0.2-modules libspeex1 libspice-server1 libtag1v5 libtag1v5-vanilla libtpms0 libtwolame0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libv4l-0t64 libv4lconvert0t64 libvirglrenderer1 libvirt-daemon libvirt-daemon-config-network\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libvirt-daemon-config-nwfilter libvirt-daemon-driver-qemu libvirt-daemon-system libvirt-daemon-system-systemd\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libvpx9 libwavpack1 libwebrtc-audio-processing1 libxft2 libxml2-utils libxss1 libxv1 logrotate lvm2 mdevctl\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  msr-tools netcat-openbsd nftables ovmf parted polkitd python3-cairo python3-gi-cairo qemu-system-common\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  qemu-system-data qemu-system-gui qemu-system-modules-opengl qemu-system-modules-spice qemu-system-x86 seabios\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  sgml-base swtpm swtpm-tools systemd-container systemd-hwe-hwdb thin-provisioning-tools udev xml-core\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSuggested packages:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  firewalld kmod alsa-utils libasound2-plugins libdv-bin oss-compat jackd2 libparted-dev libparted-i18n pipewire\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libraw1394-doc xdg-utils speex gstreamer1.0-libav gstreamer1.0-plugins-ugly\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libvirt-daemon-driver-storage-gluster libvirt-daemon-driver-storage-iscsi-direct\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libvirt-daemon-driver-storage-rbd libvirt-daemon-driver-storage-zfs libvirt-daemon-driver-lxc\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libvirt-daemon-driver-vbox libvirt-daemon-driver-xen numad passt apparmor auditd nfs-common open-iscsi pm-utils\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  systemtap zfsutils bsd-mailx \u003cspan class=\"p\"\u003e|\u003c/span\u003e mailx parted-doc polkitd-pkla samba vde2 sgml-base-doc trousers gir1.2-secret-1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gnome-keyring python3-guestfs ssh-askpass debhelper\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThe following NEW packages will be installed:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  acl alsa-topology-conf alsa-ucm-conf cpu-checker dmeventd dmidecode dns-root-data dnsmasq-base gettext-base\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gir1.2-atk-1.0 gir1.2-ayatanaappindicator3-0.1 gir1.2-gdkpixbuf-2.0 gir1.2-gstreamer-1.0 gir1.2-gtk-3.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gir1.2-gtk-vnc-2.0 gir1.2-gtksource-4 gir1.2-harfbuzz-0.0 gir1.2-libvirt-glib-1.0 gir1.2-pango-1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gir1.2-spiceclientglib-2.0 gir1.2-spiceclientgtk-3.0 gir1.2-vte-2.91 gstreamer1.0-plugins-good gstreamer1.0-x\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  iptables ipxe-qemu ipxe-qemu-256k-compat-efi-roms libaa1 libasound2-data libasound2t64 libavc1394-0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libayatana-appindicator3-1 libayatana-ido3-0.4-0 libayatana-indicator3-7 libbrlapi0.8 libcaca0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libdbusmenu-glib4 libdbusmenu-gtk3-4 libdecor-0-0 libdecor-0-plugin-1-gtk libdevmapper-event1.02.1 libdv4t64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libfdt1 libgstreamer-plugins-good1.0-0 libgtksourceview-4-0 libgtksourceview-4-common libgudev-1.0-0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libharfbuzz-gobject0 libiec61883-0 libip4tc2 libip6tc2 libjack-jackd2-0 liblvm2cmd2.03 libnetfilter-conntrack3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libnfnetlink0 libnftables1 libnftnl11 libnss-mymachines libpangoxft-1.0-0 libparted2t64 libpipewire-0.3-0t64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libpipewire-0.3-common libpolkit-agent-1-0 libraw1394-11 libsamplerate0 libsdl2-2.0-0 libshout3 libslang2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libslirp0 libspa-0.2-modules libspeex1 libspice-server1 libtag1v5 libtag1v5-vanilla libtpms0 libtwolame0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libv4l-0t64 libv4lconvert0t64 libvirglrenderer1 libvirt-daemon libvirt-daemon-config-network\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libvirt-daemon-config-nwfilter libvirt-daemon-driver-qemu libvirt-daemon-system libvirt-daemon-system-systemd\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  libvpx9 libwavpack1 libwebrtc-audio-processing1 libxft2 libxml2-utils libxss1 libxv1 logrotate lvm2 mdevctl\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  msr-tools netcat-openbsd nftables ovmf parted polkitd python3-cairo python3-gi-cairo qemu-system-common\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  qemu-system-data qemu-system-gui qemu-system-modules-opengl qemu-system-modules-spice qemu-system-x86 seabios\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  sgml-base swtpm swtpm-tools systemd-container systemd-hwe-hwdb thin-provisioning-tools udev virt-manager\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  xml-core\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e upgraded, \u003cspan class=\"m\"\u003e119\u003c/span\u003e newly installed, \u003cspan class=\"m\"\u003e0\u003c/span\u003e to remove and \u003cspan class=\"m\"\u003e4\u003c/span\u003e not upgraded.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNeed to get 43.2 MB of archives.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAfter this operation, \u003cspan class=\"m\"\u003e180\u003c/span\u003e MB of additional disk space will be used.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:1 http://archive.ubuntu.com/ubuntu noble/main amd64 sgml-base all 1.31 \u003cspan class=\"o\"\u003e[\u003c/span\u003e11.4 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:2 http://archive.ubuntu.com/ubuntu noble/main amd64 libslang2 amd64 2.3.3-3build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e506\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:3 http://archive.ubuntu.com/ubuntu noble/main amd64 logrotate amd64 3.21.0-2build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e52.2 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:4 http://archive.ubuntu.com/ubuntu noble/main amd64 netcat-openbsd amd64 1.226-1ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e44.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:5 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 udev amd64 255.4-1ubuntu8.8 \u003cspan class=\"o\"\u003e[\u003c/span\u003e1,874 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:6 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 systemd-hwe-hwdb all 255.1.4 \u003cspan class=\"o\"\u003e[\u003c/span\u003e3,200 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:7 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 dmidecode amd64 3.5-3ubuntu0.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e73.0 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:8 http://archive.ubuntu.com/ubuntu noble/main amd64 gettext-base amd64 0.21-14ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e38.4 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:9 http://archive.ubuntu.com/ubuntu noble/main amd64 libip4tc2 amd64 1.8.10-3ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e23.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:10 http://archive.ubuntu.com/ubuntu noble/main amd64 libip6tc2 amd64 1.8.10-3ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e23.7 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:11 http://archive.ubuntu.com/ubuntu noble/main amd64 libnfnetlink0 amd64 1.0.2-2build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e14.8 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:12 http://archive.ubuntu.com/ubuntu noble/main amd64 libnetfilter-conntrack3 amd64 1.0.9-6build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e45.2 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:13 http://archive.ubuntu.com/ubuntu noble/main amd64 libnftnl11 amd64 1.2.6-2build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e66.0 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:14 http://archive.ubuntu.com/ubuntu noble/main amd64 iptables amd64 1.8.10-3ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e381\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:15 http://archive.ubuntu.com/ubuntu noble/main amd64 libnftables1 amd64 1.0.9-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e358\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:16 http://archive.ubuntu.com/ubuntu noble/main amd64 libparted2t64 amd64 3.6-4build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e152\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:17 http://archive.ubuntu.com/ubuntu noble/main amd64 nftables amd64 1.0.9-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e69.8 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:18 http://archive.ubuntu.com/ubuntu noble/main amd64 parted amd64 3.6-4build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e43.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:19 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 acl amd64 2.3.2-1build1.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e39.4 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:20 http://archive.ubuntu.com/ubuntu noble/main amd64 alsa-topology-conf all 1.2.5.1-2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e15.5 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:21 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libasound2-data all 1.2.11-1ubuntu0.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e21.1 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:22 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libasound2t64 amd64 1.2.11-1ubuntu0.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e399\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:23 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 alsa-ucm-conf all 1.2.10-1ubuntu5.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e66.4 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:24 http://archive.ubuntu.com/ubuntu noble/main amd64 msr-tools amd64 1.3-5build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e9,610 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:25 http://archive.ubuntu.com/ubuntu noble/main amd64 cpu-checker amd64 0.7-1.3build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e6,148 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:26 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdevmapper-event1.02.1 amd64 2:1.02.185-3ubuntu3.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e12.6 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:27 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 liblvm2cmd2.03 amd64 2.03.16-3ubuntu3.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e797\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:28 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 dmeventd amd64 2:1.02.185-3ubuntu3.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e38.0 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:29 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 dns-root-data all 2024071801~ubuntu0.24.04.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e5,918 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:30 http://archive.ubuntu.com/ubuntu noble/main amd64 dnsmasq-base amd64 2.90-2build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e375\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:31 http://archive.ubuntu.com/ubuntu noble/main amd64 gir1.2-atk-1.0 amd64 2.52.0-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e23.1 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:32 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gir1.2-gdkpixbuf-2.0 amd64 2.42.10+dfsg-3ubuntu3.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e9,486 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:33 http://archive.ubuntu.com/ubuntu noble/main amd64 libharfbuzz-gobject0 amd64 8.3.0-2build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e34.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:34 http://archive.ubuntu.com/ubuntu noble/main amd64 gir1.2-harfbuzz-0.0 amd64 8.3.0-2build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e44.5 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:35 http://archive.ubuntu.com/ubuntu noble/main amd64 libxft2 amd64 2.3.6-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e45.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:36 http://archive.ubuntu.com/ubuntu noble/main amd64 libpangoxft-1.0-0 amd64 1.52.1+ds-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e20.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:37 http://archive.ubuntu.com/ubuntu noble/main amd64 gir1.2-pango-1.0 amd64 1.52.1+ds-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e34.8 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:38 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gir1.2-gtk-3.0 amd64 3.24.41-4ubuntu1.3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e245\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:39 http://archive.ubuntu.com/ubuntu noble/main amd64 libayatana-ido3-0.4-0 amd64 0.10.1-1build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e56.6 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:40 http://archive.ubuntu.com/ubuntu noble/main amd64 libayatana-indicator3-7 amd64 0.9.4-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e31.7 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:41 http://archive.ubuntu.com/ubuntu noble/main amd64 libdbusmenu-glib4 amd64 18.10.20180917~bzr492+repack1-3.1ubuntu5 \u003cspan class=\"o\"\u003e[\u003c/span\u003e43.0 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:42 http://archive.ubuntu.com/ubuntu noble/main amd64 libdbusmenu-gtk3-4 amd64 18.10.20180917~bzr492+repack1-3.1ubuntu5 \u003cspan class=\"o\"\u003e[\u003c/span\u003e27.6 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:43 http://archive.ubuntu.com/ubuntu noble/main amd64 libayatana-appindicator3-1 amd64 0.5.93-1build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e24.7 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:44 http://archive.ubuntu.com/ubuntu noble/main amd64 gir1.2-ayatanaappindicator3-0.1 amd64 0.5.93-1build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e5,838 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:45 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gir1.2-gstreamer-1.0 amd64 1.24.2-1ubuntu0.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e88.4 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:46 http://archive.ubuntu.com/ubuntu noble/universe amd64 gir1.2-gtk-vnc-2.0 amd64 1.3.1-1build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e12.1 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:47 http://archive.ubuntu.com/ubuntu noble/universe amd64 libgtksourceview-4-common all 4.8.4-5build4 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e590\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:48 http://archive.ubuntu.com/ubuntu noble/universe amd64 libgtksourceview-4-0 amd64 4.8.4-5build4 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e233\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:49 http://archive.ubuntu.com/ubuntu noble/universe amd64 gir1.2-gtksource-4 amd64 4.8.4-5build4 \u003cspan class=\"o\"\u003e[\u003c/span\u003e20.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:50 http://archive.ubuntu.com/ubuntu noble/universe amd64 gir1.2-spiceclientglib-2.0 amd64 0.42-2ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e14.4 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:51 http://archive.ubuntu.com/ubuntu noble/universe amd64 gir1.2-spiceclientgtk-3.0 amd64 0.42-2ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e5,610 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:52 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gir1.2-vte-2.91 amd64 0.76.0-1ubuntu0.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e11.5 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:53 http://archive.ubuntu.com/ubuntu noble/main amd64 libaa1 amd64 1.4p5-51.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e49.9 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:54 http://archive.ubuntu.com/ubuntu noble/main amd64 libraw1394-11 amd64 2.1.2-2build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e26.2 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:55 http://archive.ubuntu.com/ubuntu noble/main amd64 libavc1394-0 amd64 0.5.4-5build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e15.4 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:56 http://archive.ubuntu.com/ubuntu noble/main amd64 libcaca0 amd64 0.99.beta20-4build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e208\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:57 http://archive.ubuntu.com/ubuntu noble/main amd64 libdv4t64 amd64 1.0.0-17.1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e63.2 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:58 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgstreamer-plugins-good1.0-0 amd64 1.24.2-1ubuntu1.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e32.9 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:59 http://archive.ubuntu.com/ubuntu noble/main amd64 libgudev-1.0-0 amd64 1:238-5ubuntu1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e15.9 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:60 http://archive.ubuntu.com/ubuntu noble/main amd64 libiec61883-0 amd64 1.2.0-6build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e24.5 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:61 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libspeex1 amd64 1.2.1-2ubuntu2.24.04.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e59.6 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:62 http://archive.ubuntu.com/ubuntu noble/main amd64 libshout3 amd64 2.4.6-1build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e50.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:63 http://archive.ubuntu.com/ubuntu noble/main amd64 libtag1v5-vanilla amd64 1.13.1-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e326\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:64 http://archive.ubuntu.com/ubuntu noble/main amd64 libtag1v5 amd64 1.13.1-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e11.7 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:65 http://archive.ubuntu.com/ubuntu noble/main amd64 libtwolame0 amd64 0.4.0-2build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e52.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:66 http://archive.ubuntu.com/ubuntu noble/main amd64 libv4lconvert0t64 amd64 1.26.1-4build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e87.6 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:67 http://archive.ubuntu.com/ubuntu noble/main amd64 libv4l-0t64 amd64 1.26.1-4build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e46.9 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:68 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvpx9 amd64 1.14.0-1ubuntu2.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e1,143 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:69 http://archive.ubuntu.com/ubuntu noble/main amd64 libwavpack1 amd64 5.6.0-1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e84.6 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:70 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gstreamer1.0-plugins-good amd64 1.24.2-1ubuntu1.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e2,238 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:71 http://archive.ubuntu.com/ubuntu noble/main amd64 libxv1 amd64 2:1.0.11-1.1build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e10.7 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:72 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gstreamer1.0-x amd64 1.24.2-1ubuntu0.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e85.0 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:73 http://archive.ubuntu.com/ubuntu noble/main amd64 ipxe-qemu all 1.21.1+git-20220113.fbbdc3926-0ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e1,565 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:74 http://archive.ubuntu.com/ubuntu noble/main amd64 ipxe-qemu-256k-compat-efi-roms all 1.0.0+git-20150424.a25a16d-0ubuntu5 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e548\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:75 http://archive.ubuntu.com/ubuntu noble/main amd64 libbrlapi0.8 amd64 6.6-4ubuntu5 \u003cspan class=\"o\"\u003e[\u003c/span\u003e31.4 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:76 http://archive.ubuntu.com/ubuntu noble/main amd64 libdecor-0-0 amd64 0.2.2-1build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e16.5 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:77 http://archive.ubuntu.com/ubuntu noble/main amd64 libdecor-0-plugin-1-gtk amd64 0.2.2-1build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e22.2 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:78 http://archive.ubuntu.com/ubuntu noble/main amd64 libsamplerate0 amd64 0.2.2-4build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e1,344 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:79 http://archive.ubuntu.com/ubuntu noble/main amd64 libjack-jackd2-0 amd64 1.9.21~dfsg-3ubuntu3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e289\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:80 http://archive.ubuntu.com/ubuntu noble/main amd64 libwebrtc-audio-processing1 amd64 0.3.1-0ubuntu6 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e290\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:81 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libspa-0.2-modules amd64 1.0.5-1ubuntu3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e626\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:82 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpipewire-0.3-0t64 amd64 1.0.5-1ubuntu3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e252\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:83 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpipewire-0.3-common all 1.0.5-1ubuntu3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e18.8 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:84 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpolkit-agent-1-0 amd64 124-2ubuntu1.24.04.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e17.4 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:85 http://archive.ubuntu.com/ubuntu noble/main amd64 libxss1 amd64 1:1.2.3-1build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e7,204 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:86 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsdl2-2.0-0 amd64 2.30.0+dfsg-1ubuntu3.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e686\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:87 http://archive.ubuntu.com/ubuntu noble/main amd64 libslirp0 amd64 4.7.0-1ubuntu3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e63.8 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:88 http://archive.ubuntu.com/ubuntu noble/main amd64 libspice-server1 amd64 0.15.1-1build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e349\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:89 http://archive.ubuntu.com/ubuntu noble/main amd64 libtpms0 amd64 0.9.3-0ubuntu4 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e373\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:90 http://archive.ubuntu.com/ubuntu noble/main amd64 libvirglrenderer1 amd64 1.0.0-1ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e226\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:91 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-daemon-driver-qemu amd64 10.0.0-2ubuntu8.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e740\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:92 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-daemon amd64 10.0.0-2ubuntu8.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e431\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:93 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-daemon-config-network all 10.0.0-2ubuntu8.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e3,120 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:94 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-daemon-config-nwfilter all 10.0.0-2ubuntu8.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e6,042 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:95 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 systemd-container amd64 255.4-1ubuntu8.8 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e417\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:96 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-daemon-system-systemd all 10.0.0-2ubuntu8.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e1,376 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:97 http://archive.ubuntu.com/ubuntu noble/main amd64 xml-core all 0.19 \u003cspan class=\"o\"\u003e[\u003c/span\u003e20.3 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:98 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 polkitd amd64 124-2ubuntu1.24.04.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e95.2 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:99 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-daemon-system amd64 10.0.0-2ubuntu8.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e49.6 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:100 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libxml2-utils amd64 2.9.14+dfsg-1.3ubuntu3.3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e39.4 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:101 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 lvm2 amd64 2.03.16-3ubuntu3.2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e1,186 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:102 http://archive.ubuntu.com/ubuntu noble/main amd64 mdevctl amd64 1.3.0-1ubuntu2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e936\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:103 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-cairo amd64 1.25.1-2build2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e119\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:104 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-gi-cairo amd64 3.48.2-1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e8,132 B\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:105 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-system-common amd64 1:8.2.2+ds-0ubuntu1.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e1,253 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:106 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-system-data all 1:8.2.2+ds-0ubuntu1.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e1,793 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:107 http://archive.ubuntu.com/ubuntu noble/main amd64 libfdt1 amd64 1.7.0-2build1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e20.1 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:108 http://archive.ubuntu.com/ubuntu noble/main amd64 seabios all 1.16.3-2 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e175\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:109 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-system-x86 amd64 1:8.2.2+ds-0ubuntu1.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e11.2 MB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:110 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-system-modules-opengl amd64 1:8.2.2+ds-0ubuntu1.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e184\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:111 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-system-gui amd64 1:8.2.2+ds-0ubuntu1.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e314\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:112 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-system-modules-spice amd64 1:8.2.2+ds-0ubuntu1.7 \u003cspan class=\"o\"\u003e[\u003c/span\u003e70.2 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:113 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 swtpm amd64 0.7.3-0ubuntu5.24.04.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e53.1 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:114 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 swtpm-tools amd64 0.7.3-0ubuntu5.24.04.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e92.9 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:115 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 thin-provisioning-tools amd64 0.9.0-2ubuntu5.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e436\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:116 http://archive.ubuntu.com/ubuntu noble/universe amd64 gir1.2-libvirt-glib-1.0 amd64 5.0.0-2build3 \u003cspan class=\"o\"\u003e[\u003c/span\u003e32.6 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:117 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 virt-manager all 1:4.1.0-3ubuntu0.1 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e263\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:118 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libnss-mymachines amd64 255.4-1ubuntu8.8 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e153\u003c/span\u003e kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:119 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 ovmf all 2024.02-2ubuntu0.4 \u003cspan class=\"o\"\u003e[\u003c/span\u003e4,571 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFetched 43.2 MB in 5s \u003cspan class=\"o\"\u003e(\u003c/span\u003e9,539 kB/s\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExtracting templates from packages: 100%\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreconfiguring packages ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package sgml-base.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003eReading database ... \u003cspan class=\"m\"\u003e30439\u003c/span\u003e files and directories currently installed.\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../000-sgml-base_1.31_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking sgml-base \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.31\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libslang2:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../001-libslang2_2.3.3-3build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libslang2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.3.3-3build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package logrotate.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../002-logrotate_3.21.0-2build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking logrotate \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.21.0-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package netcat-openbsd.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../003-netcat-openbsd_1.226-1ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking netcat-openbsd \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.226-1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package udev.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../004-udev_255.4-1ubuntu8.8_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking udev \u003cspan class=\"o\"\u003e(\u003c/span\u003e255.4-1ubuntu8.8\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package systemd-hwe-hwdb.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../005-systemd-hwe-hwdb_255.1.4_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking systemd-hwe-hwdb \u003cspan class=\"o\"\u003e(\u003c/span\u003e255.1.4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package dmidecode.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../006-dmidecode_3.5-3ubuntu0.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking dmidecode \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.5-3ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gettext-base.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../007-gettext-base_0.21-14ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gettext-base \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.21-14ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libip4tc2:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../008-libip4tc2_1.8.10-3ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libip4tc2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.8.10-3ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libip6tc2:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../009-libip6tc2_1.8.10-3ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libip6tc2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.8.10-3ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libnfnetlink0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../010-libnfnetlink0_1.0.2-2build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libnfnetlink0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.2-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libnetfilter-conntrack3:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../011-libnetfilter-conntrack3_1.0.9-6build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libnetfilter-conntrack3:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.9-6build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libnftnl11:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../012-libnftnl11_1.2.6-2build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libnftnl11:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.6-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package iptables.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../013-iptables_1.8.10-3ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking iptables \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.8.10-3ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libnftables1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../014-libnftables1_1.0.9-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libnftables1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.9-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libparted2t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../015-libparted2t64_3.6-4build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAdding \u003cspan class=\"s1\"\u003e\u0026#39;diversion of /lib/x86_64-linux-gnu/libparted.so.2 to /lib/x86_64-linux-gnu/libparted.so.2.usr-is-merged by\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003elibparted2t64\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAdding \u003cspan class=\"s1\"\u003e\u0026#39;diversion of /lib/x86_64-linux-gnu/libparted.so.2.0.5 to /lib/x86_64-linux-gnu/libparted.so.2.0.5.usr-is-me\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003erged by libparted2t64\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libparted2t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.6-4build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package nftables.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../016-nftables_1.0.9-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking nftables \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.9-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package parted.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../017-parted_3.6-4build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking parted \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.6-4build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package acl.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../018-acl_2.3.2-1build1.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking acl \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.3.2-1build1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package alsa-topology-conf.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../019-alsa-topology-conf_1.2.5.1-2_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking alsa-topology-conf \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.5.1-2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libasound2-data.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../020-libasound2-data_1.2.11-1ubuntu0.1_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libasound2-data \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.11-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libasound2t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../021-libasound2t64_1.2.11-1ubuntu0.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libasound2t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.11-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package alsa-ucm-conf.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../022-alsa-ucm-conf_1.2.10-1ubuntu5.7_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking alsa-ucm-conf \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.10-1ubuntu5.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package msr-tools.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../023-msr-tools_1.3-5build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking msr-tools \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3-5build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package cpu-checker.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../024-cpu-checker_0.7-1.3build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking cpu-checker \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.7-1.3build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libdevmapper-event1.02.1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../025-libdevmapper-event1.02.1_2%3a1.02.185-3ubuntu3.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libdevmapper-event1.02.1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2:1.02.185-3ubuntu3.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package liblvm2cmd2.03:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../026-liblvm2cmd2.03_2.03.16-3ubuntu3.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking liblvm2cmd2.03:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.03.16-3ubuntu3.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package dmeventd.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../027-dmeventd_2%3a1.02.185-3ubuntu3.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking dmeventd \u003cspan class=\"o\"\u003e(\u003c/span\u003e2:1.02.185-3ubuntu3.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package dns-root-data.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../028-dns-root-data_2024071801~ubuntu0.24.04.1_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking dns-root-data \u003cspan class=\"o\"\u003e(\u003c/span\u003e2024071801~ubuntu0.24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package dnsmasq-base.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../029-dnsmasq-base_2.90-2build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking dnsmasq-base \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.90-2build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-atk-1.0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../030-gir1.2-atk-1.0_2.52.0-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-atk-1.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.52.0-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-gdkpixbuf-2.0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../031-gir1.2-gdkpixbuf-2.0_2.42.10+dfsg-3ubuntu3.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-gdkpixbuf-2.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.42.10+dfsg-3ubuntu3.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libharfbuzz-gobject0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../032-libharfbuzz-gobject0_8.3.0-2build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libharfbuzz-gobject0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e8.3.0-2build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-harfbuzz-0.0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../033-gir1.2-harfbuzz-0.0_8.3.0-2build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-harfbuzz-0.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e8.3.0-2build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libxft2:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../034-libxft2_2.3.6-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libxft2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.3.6-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libpangoxft-1.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../035-libpangoxft-1.0-0_1.52.1+ds-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libpangoxft-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.52.1+ds-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-pango-1.0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../036-gir1.2-pango-1.0_1.52.1+ds-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-pango-1.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.52.1+ds-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-gtk-3.0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../037-gir1.2-gtk-3.0_3.24.41-4ubuntu1.3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-gtk-3.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.24.41-4ubuntu1.3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libayatana-ido3-0.4-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../038-libayatana-ido3-0.4-0_0.10.1-1build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libayatana-ido3-0.4-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.10.1-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libayatana-indicator3-7:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../039-libayatana-indicator3-7_0.9.4-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libayatana-indicator3-7:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.9.4-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libdbusmenu-glib4:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../040-libdbusmenu-glib4_18.10.20180917~bzr492+repack1-3.1ubuntu5_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libdbusmenu-glib4:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e18.10.20180917~bzr492+repack1-3.1ubuntu5\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libdbusmenu-gtk3-4:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../041-libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-3.1ubuntu5_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libdbusmenu-gtk3-4:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e18.10.20180917~bzr492+repack1-3.1ubuntu5\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libayatana-appindicator3-1.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../042-libayatana-appindicator3-1_0.5.93-1build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libayatana-appindicator3-1 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.5.93-1build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-ayatanaappindicator3-0.1.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../043-gir1.2-ayatanaappindicator3-0.1_0.5.93-1build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-ayatanaappindicator3-0.1 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.5.93-1build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-gstreamer-1.0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../044-gir1.2-gstreamer-1.0_1.24.2-1ubuntu0.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-gstreamer-1.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-gtk-vnc-2.0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../045-gir1.2-gtk-vnc-2.0_1.3.1-1build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-gtk-vnc-2.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.1-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libgtksourceview-4-common.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../046-libgtksourceview-4-common_4.8.4-5build4_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libgtksourceview-4-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e4.8.4-5build4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libgtksourceview-4-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../047-libgtksourceview-4-0_4.8.4-5build4_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libgtksourceview-4-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e4.8.4-5build4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-gtksource-4:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../048-gir1.2-gtksource-4_4.8.4-5build4_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-gtksource-4:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e4.8.4-5build4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-spiceclientglib-2.0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../049-gir1.2-spiceclientglib-2.0_0.42-2ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-spiceclientglib-2.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.42-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-spiceclientgtk-3.0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../050-gir1.2-spiceclientgtk-3.0_0.42-2ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-spiceclientgtk-3.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.42-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-vte-2.91:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../051-gir1.2-vte-2.91_0.76.0-1ubuntu0.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-vte-2.91:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.76.0-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libaa1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../052-libaa1_1.4p5-51.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libaa1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.4p5-51.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libraw1394-11:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../053-libraw1394-11_2.1.2-2build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libraw1394-11:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.1.2-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libavc1394-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../054-libavc1394-0_0.5.4-5build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libavc1394-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.5.4-5build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libcaca0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../055-libcaca0_0.99.beta20-4build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libcaca0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.99.beta20-4build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libdv4t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../056-libdv4t64_1.0.0-17.1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libdv4t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.0-17.1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libgstreamer-plugins-good1.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../057-libgstreamer-plugins-good1.0-0_1.24.2-1ubuntu1.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libgstreamer-plugins-good1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libgudev-1.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../058-libgudev-1.0-0_1%3a238-5ubuntu1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libgudev-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:238-5ubuntu1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libiec61883-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../059-libiec61883-0_1.2.0-6build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libiec61883-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.0-6build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libspeex1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../060-libspeex1_1.2.1-2ubuntu2.24.04.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libspeex1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.1-2ubuntu2.24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libshout3:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../061-libshout3_2.4.6-1build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libshout3:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.4.6-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libtag1v5-vanilla:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../062-libtag1v5-vanilla_1.13.1-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libtag1v5-vanilla:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.13.1-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libtag1v5:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../063-libtag1v5_1.13.1-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libtag1v5:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.13.1-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libtwolame0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../064-libtwolame0_0.4.0-2build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libtwolame0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.4.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libv4lconvert0t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../065-libv4lconvert0t64_1.26.1-4build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libv4lconvert0t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.26.1-4build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libv4l-0t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../066-libv4l-0t64_1.26.1-4build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libv4l-0t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.26.1-4build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvpx9:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../067-libvpx9_1.14.0-1ubuntu2.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvpx9:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.14.0-1ubuntu2.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libwavpack1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../068-libwavpack1_5.6.0-1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libwavpack1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.6.0-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gstreamer1.0-plugins-good:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../069-gstreamer1.0-plugins-good_1.24.2-1ubuntu1.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gstreamer1.0-plugins-good:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libxv1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../070-libxv1_2%3a1.0.11-1.1build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libxv1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2:1.0.11-1.1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gstreamer1.0-x:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../071-gstreamer1.0-x_1.24.2-1ubuntu0.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gstreamer1.0-x:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu0.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package ipxe-qemu.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../072-ipxe-qemu_1.21.1+git-20220113.fbbdc3926-0ubuntu2_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking ipxe-qemu \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.21.1+git-20220113.fbbdc3926-0ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package ipxe-qemu-256k-compat-efi-roms.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../073-ipxe-qemu-256k-compat-efi-roms_1.0.0+git-20150424.a25a16d-0ubuntu5_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking ipxe-qemu-256k-compat-efi-roms \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.0+git-20150424.a25a16d-0ubuntu5\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libbrlapi0.8:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../074-libbrlapi0.8_6.6-4ubuntu5_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libbrlapi0.8:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e6.6-4ubuntu5\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libdecor-0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../075-libdecor-0-0_0.2.2-1build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libdecor-0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.2.2-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libdecor-0-plugin-1-gtk:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../076-libdecor-0-plugin-1-gtk_0.2.2-1build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libdecor-0-plugin-1-gtk:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.2.2-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libsamplerate0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../077-libsamplerate0_0.2.2-4build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libsamplerate0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.2.2-4build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libjack-jackd2-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../078-libjack-jackd2-0_1.9.21~dfsg-3ubuntu3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libjack-jackd2-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.9.21~dfsg-3ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libwebrtc-audio-processing1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../079-libwebrtc-audio-processing1_0.3.1-0ubuntu6_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libwebrtc-audio-processing1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.3.1-0ubuntu6\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libspa-0.2-modules:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../080-libspa-0.2-modules_1.0.5-1ubuntu3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libspa-0.2-modules:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.5-1ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libpipewire-0.3-0t64:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../081-libpipewire-0.3-0t64_1.0.5-1ubuntu3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libpipewire-0.3-0t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.5-1ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libpipewire-0.3-common.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../082-libpipewire-0.3-common_1.0.5-1ubuntu3_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libpipewire-0.3-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.5-1ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libpolkit-agent-1-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../083-libpolkit-agent-1-0_124-2ubuntu1.24.04.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libpolkit-agent-1-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e124-2ubuntu1.24.04.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libxss1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../084-libxss1_1%3a1.2.3-1build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libxss1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:1.2.3-1build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libsdl2-2.0-0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../085-libsdl2-2.0-0_2.30.0+dfsg-1ubuntu3.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libsdl2-2.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.30.0+dfsg-1ubuntu3.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libslirp0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../086-libslirp0_4.7.0-1ubuntu3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libslirp0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e4.7.0-1ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libspice-server1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../087-libspice-server1_0.15.1-1build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libspice-server1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.15.1-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libtpms0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../088-libtpms0_0.9.3-0ubuntu4_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libtpms0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.9.3-0ubuntu4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvirglrenderer1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../089-libvirglrenderer1_1.0.0-1ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvirglrenderer1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.0-1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvirt-daemon-driver-qemu.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../090-libvirt-daemon-driver-qemu_10.0.0-2ubuntu8.7_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvirt-daemon-driver-qemu \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvirt-daemon.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../091-libvirt-daemon_10.0.0-2ubuntu8.7_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvirt-daemon \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvirt-daemon-config-network.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../092-libvirt-daemon-config-network_10.0.0-2ubuntu8.7_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvirt-daemon-config-network \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvirt-daemon-config-nwfilter.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../093-libvirt-daemon-config-nwfilter_10.0.0-2ubuntu8.7_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvirt-daemon-config-nwfilter \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package systemd-container.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../094-systemd-container_255.4-1ubuntu8.8_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking systemd-container \u003cspan class=\"o\"\u003e(\u003c/span\u003e255.4-1ubuntu8.8\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvirt-daemon-system-systemd.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../095-libvirt-daemon-system-systemd_10.0.0-2ubuntu8.7_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvirt-daemon-system-systemd \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package xml-core.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../096-xml-core_0.19_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking xml-core \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.19\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package polkitd.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../097-polkitd_124-2ubuntu1.24.04.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking polkitd \u003cspan class=\"o\"\u003e(\u003c/span\u003e124-2ubuntu1.24.04.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libvirt-daemon-system.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../098-libvirt-daemon-system_10.0.0-2ubuntu8.7_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libvirt-daemon-system \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libxml2-utils.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../099-libxml2-utils_2.9.14+dfsg-1.3ubuntu3.3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libxml2-utils \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.9.14+dfsg-1.3ubuntu3.3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package lvm2.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../100-lvm2_2.03.16-3ubuntu3.2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking lvm2 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.03.16-3ubuntu3.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package mdevctl.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../101-mdevctl_1.3.0-1ubuntu2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking mdevctl \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.0-1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package python3-cairo.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../102-python3-cairo_1.25.1-2build2_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking python3-cairo \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.25.1-2build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package python3-gi-cairo.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../103-python3-gi-cairo_3.48.2-1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking python3-gi-cairo \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.48.2-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package qemu-system-common.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../104-qemu-system-common_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking qemu-system-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package qemu-system-data.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../105-qemu-system-data_1%3a8.2.2+ds-0ubuntu1.7_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking qemu-system-data \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libfdt1:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../106-libfdt1_1.7.0-2build1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libfdt1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.7.0-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package seabios.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../107-seabios_1.16.3-2_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking seabios \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.16.3-2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package qemu-system-x86.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../108-qemu-system-x86_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking qemu-system-x86 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package qemu-system-modules-opengl.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../109-qemu-system-modules-opengl_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking qemu-system-modules-opengl \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package qemu-system-gui.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../110-qemu-system-gui_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking qemu-system-gui \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package qemu-system-modules-spice.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../111-qemu-system-modules-spice_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking qemu-system-modules-spice \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package swtpm.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../112-swtpm_0.7.3-0ubuntu5.24.04.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking swtpm \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.7.3-0ubuntu5.24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package swtpm-tools.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../113-swtpm-tools_0.7.3-0ubuntu5.24.04.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking swtpm-tools \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.7.3-0ubuntu5.24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package thin-provisioning-tools.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../114-thin-provisioning-tools_0.9.0-2ubuntu5.1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking thin-provisioning-tools \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.9.0-2ubuntu5.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package gir1.2-libvirt-glib-1.0:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../115-gir1.2-libvirt-glib-1.0_5.0.0-2build3_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking gir1.2-libvirt-glib-1.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.0.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package virt-manager.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../116-virt-manager_1%3a4.1.0-3ubuntu0.1_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking virt-manager \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:4.1.0-3ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package libnss-mymachines:amd64.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../117-libnss-mymachines_255.4-1ubuntu8.8_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking libnss-mymachines:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e255.4-1ubuntu8.8\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelecting previously unselected package ovmf.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreparing to unpack .../118-ovmf_2024.02-2ubuntu0.4_all.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUnpacking ovmf \u003cspan class=\"o\"\u003e(\u003c/span\u003e2024.02-2ubuntu0.4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libip4tc2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.8.10-3ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libpipewire-0.3-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.5-1ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up logrotate \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.21.0-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreated symlink /etc/systemd/system/timers.target.wants/logrotate.timer → /usr/lib/systemd/system/logrotate.timer.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvirt-daemon-config-network \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-gstreamer-1.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libraw1394-11:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.1.2-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libxft2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.3.6-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libtag1v5-vanilla:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.13.1-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up python3-cairo \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.25.1-2build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libspeex1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.1-2ubuntu2.24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libdevmapper-event1.02.1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2:1.02.185-3ubuntu3.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libv4lconvert0t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.26.1-4build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libpangoxft-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.52.1+ds-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libtwolame0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.4.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-gdkpixbuf-2.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.42.10+dfsg-3ubuntu3.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-spiceclientglib-2.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.42-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-atk-1.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.52.0-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libip6tc2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.8.10-3ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libdbusmenu-glib4:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e18.10.20180917~bzr492+repack1-3.1ubuntu5\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libspice-server1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.15.1-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up netcat-openbsd \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.226-1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eupdate-alternatives: using /bin/nc.openbsd to provide /bin/nc \u003cspan class=\"o\"\u003e(\u003c/span\u003enc\u003cspan class=\"o\"\u003e)\u003c/span\u003e in auto mode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-libvirt-glib-1.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.0.0-2build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up msr-tools \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3-5build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libwebrtc-audio-processing1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.3.1-0ubuntu6\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gettext-base \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.21-14ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libnftnl11:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.6-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libharfbuzz-gobject0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e8.3.0-2build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libfdt1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.7.0-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libayatana-ido3-0.4-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.10.1-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-harfbuzz-0.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e8.3.0-2build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up acl \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.3.2-1build1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up ovmf \u003cspan class=\"o\"\u003e(\u003c/span\u003e2024.02-2ubuntu0.4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up dns-root-data \u003cspan class=\"o\"\u003e(\u003c/span\u003e2024071801~ubuntu0.24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libasound2-data \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.11-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-pango-1.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.52.1+ds-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libgstreamer-plugins-good1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libasound2t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.11-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libslang2:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.3.3-3build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvirglrenderer1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.0-1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libspa-0.2-modules:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.5-1ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libxv1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2:1.0.11-1.1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libshout3:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.4.6-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up thin-provisioning-tools \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.9.0-2ubuntu5.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up udev \u003cspan class=\"o\"\u003e(\u003c/span\u003e255.4-1ubuntu8.8\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreating group \u003cspan class=\"s1\"\u003e\u0026#39;input\u0026#39;\u003c/span\u003e with GID 995.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreating group \u003cspan class=\"s1\"\u003e\u0026#39;sgx\u0026#39;\u003c/span\u003e with GID 994.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreating group \u003cspan class=\"s1\"\u003e\u0026#39;kvm\u0026#39;\u003c/span\u003e with GID 993.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreating group \u003cspan class=\"s1\"\u003e\u0026#39;render\u0026#39;\u003c/span\u003e with GID 992.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efchownat\u003cspan class=\"o\"\u003e()\u003c/span\u003e of /dev/snd/seq failed: Operation not permitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efchownat\u003cspan class=\"o\"\u003e()\u003c/span\u003e of /dev/snd/timer failed: Operation not permitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efchownat\u003cspan class=\"o\"\u003e()\u003c/span\u003e of /dev/loop-control failed: Operation not permitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efchmod\u003cspan class=\"o\"\u003e()\u003c/span\u003e of /dev/kvm failed: Operation not permitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efchmod\u003cspan class=\"o\"\u003e()\u003c/span\u003e of /dev/vhost-net failed: Operation not permitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efchmod\u003cspan class=\"o\"\u003e()\u003c/span\u003e of /dev/vhost-vsock failed: Operation not permitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvirt-daemon-driver-qemu \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libdv4t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.0-17.1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up qemu-system-data \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up seabios \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.16.3-2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up systemd-hwe-hwdb \u003cspan class=\"o\"\u003e(\u003c/span\u003e255.1.4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libv4l-0t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.26.1-4build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up systemd-container \u003cspan class=\"o\"\u003e(\u003c/span\u003e255.4-1ubuntu8.8\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreated symlink /etc/systemd/system/multi-user.target.wants/machines.target → /usr/lib/systemd/system/machines.targ\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eet.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvpx9:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.14.0-1ubuntu2.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libslirp0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e4.7.0-1ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up alsa-topology-conf \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.5.1-2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libtag1v5:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.13.1-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up cpu-checker \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.7-1.3build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libwavpack1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.6.0-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libnfnetlink0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.2-2build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up ipxe-qemu \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.21.1+git-20220113.fbbdc3926-0ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libdecor-0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.2.2-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libpolkit-agent-1-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e124-2ubuntu1.24.04.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up ipxe-qemu-256k-compat-efi-roms \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.0+git-20150424.a25a16d-0ubuntu5\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up sgml-base \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.31\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libbrlapi0.8:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e6.6-4ubuntu5\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libxss1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:1.2.3-1build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libtpms0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.9.3-0ubuntu4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up dmidecode \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.5-3ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libxml2-utils \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.9.14+dfsg-1.3ubuntu3.3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvirt-daemon-config-nwfilter \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libsamplerate0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.2.2-4build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libayatana-indicator3-7:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.9.4-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up python3-gi-cairo \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.48.2-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libgtksourceview-4-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e4.8.4-5build4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libpipewire-0.3-0t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.5-1ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libdecor-0-plugin-1-gtk:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.2.2-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libgudev-1.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:238-5ubuntu1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libaa1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.4p5-51.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libiec61883-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.0-6build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up mdevctl \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.0-1ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libavc1394-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.5.4-5build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libdbusmenu-gtk3-4:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e18.10.20180917~bzr492+repack1-3.1ubuntu5\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libnftables1:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.9-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gstreamer1.0-x:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu0.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up nftables \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.9-1build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up qemu-system-common \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreated symlink /etc/systemd/system/multi-user.target.wants/qemu-kvm.service → /usr/lib/systemd/system/qemu-kvm.ser\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evice.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libcaca0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.99.beta20-4build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up alsa-ucm-conf \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.2.10-1ubuntu5.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gstreamer1.0-plugins-good:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.24.2-1ubuntu1.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up qemu-system-x86 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-gtk-3.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.24.41-4ubuntu1.3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libparted2t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.6-4build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRemoving \u003cspan class=\"s1\"\u003e\u0026#39;diversion of /lib/x86_64-linux-gnu/libparted.so.2 to /lib/x86_64-linux-gnu/libparted.so.2.usr-is-merged b\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003ey libparted2t64\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRemoving \u003cspan class=\"s1\"\u003e\u0026#39;diversion of /lib/x86_64-linux-gnu/libparted.so.2.0.5 to /lib/x86_64-linux-gnu/libparted.so.2.0.5.usr-is-\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003emerged by libparted2t64\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libgtksourceview-4-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e4.8.4-5build4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libnss-mymachines:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e255.4-1ubuntu8.8\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libayatana-appindicator3-1 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.5.93-1build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up swtpm \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.7.3-0ubuntu5.24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-gtk-vnc-2.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.3.1-1build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvirt-daemon-system-systemd \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-spiceclientgtk-3.0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.42-2ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libjack-jackd2-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.9.21~dfsg-3ubuntu3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libnetfilter-conntrack3:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.0.9-6build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up xml-core \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.19\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-vte-2.91:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.76.0-1ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvirt-daemon \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libsdl2-2.0-0:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.30.0+dfsg-1ubuntu3.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-ayatanaappindicator3-0.1 \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.5.93-1build3\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up gir1.2-gtksource-4:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e4.8.4-5build4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up qemu-system-modules-opengl \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up iptables \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.8.10-3ubuntu2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eupdate-alternatives: using /usr/sbin/iptables-legacy to provide /usr/sbin/iptables \u003cspan class=\"o\"\u003e(\u003c/span\u003eiptables\u003cspan class=\"o\"\u003e)\u003c/span\u003e in auto mode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eupdate-alternatives: using /usr/sbin/ip6tables-legacy to provide /usr/sbin/ip6tables \u003cspan class=\"o\"\u003e(\u003c/span\u003eip6tables\u003cspan class=\"o\"\u003e)\u003c/span\u003e in auto mode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eupdate-alternatives: using /usr/sbin/iptables-nft to provide /usr/sbin/iptables \u003cspan class=\"o\"\u003e(\u003c/span\u003eiptables\u003cspan class=\"o\"\u003e)\u003c/span\u003e in auto mode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eupdate-alternatives: using /usr/sbin/ip6tables-nft to provide /usr/sbin/ip6tables \u003cspan class=\"o\"\u003e(\u003c/span\u003eip6tables\u003cspan class=\"o\"\u003e)\u003c/span\u003e in auto mode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eupdate-alternatives: using /usr/sbin/arptables-nft to provide /usr/sbin/arptables \u003cspan class=\"o\"\u003e(\u003c/span\u003earptables\u003cspan class=\"o\"\u003e)\u003c/span\u003e in auto mode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eupdate-alternatives: using /usr/sbin/ebtables-nft to provide /usr/sbin/ebtables \u003cspan class=\"o\"\u003e(\u003c/span\u003eebtables\u003cspan class=\"o\"\u003e)\u003c/span\u003e in auto mode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up qemu-system-gui \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up parted \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.6-4build1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up dnsmasq-base \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.90-2build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up swtpm-tools \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.7.3-0ubuntu5.24.04.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einfo: Selecting GID from range \u003cspan class=\"m\"\u003e100\u003c/span\u003e to \u003cspan class=\"m\"\u003e999\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einfo: Adding group \u003cspan class=\"sb\"\u003e`\u003c/span\u003eswtpm\u003cspan class=\"s1\"\u003e\u0026#39; (GID 107) ...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003einfo: The home dir /var/lib/swtpm you specified can\u0026#39;\u003c/span\u003et be accessed: No such file or directory\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einfo: Selecting UID from range \u003cspan class=\"m\"\u003e100\u003c/span\u003e to \u003cspan class=\"m\"\u003e999\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einfo: Adding system user \u003cspan class=\"sb\"\u003e`\u003c/span\u003eswtpm\u003cspan class=\"s1\"\u003e\u0026#39; (UID 103) ...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003einfo: Adding new user `swtpm\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eUID 103\u003cspan class=\"o\"\u003e)\u003c/span\u003e with group \u003cspan class=\"sb\"\u003e`\u003c/span\u003eswtpm\u003cspan class=\"s1\"\u003e\u0026#39; ...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003einfo: Not creating home directory `/var/lib/swtpm\u0026#39;\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up virt-manager \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:4.1.0-3ubuntu0.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up qemu-system-modules-spice \u003cspan class=\"o\"\u003e(\u003c/span\u003e1:8.2.2+ds-0ubuntu1.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up liblvm2cmd2.03:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.03.16-3ubuntu3.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up dmeventd \u003cspan class=\"o\"\u003e(\u003c/span\u003e2:1.02.185-3ubuntu3.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreated symlink /etc/systemd/system/sockets.target.wants/dm-event.socket → /usr/lib/systemd/system/dm-event.socket.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up lvm2 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.03.16-3ubuntu3.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreated symlink /etc/systemd/system/sysinit.target.wants/blk-availability.service → /usr/lib/systemd/system/blk-ava\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eilability.service.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreated symlink /etc/systemd/system/sysinit.target.wants/lvm2-monitor.service → /usr/lib/systemd/system/lvm2-monito\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003er.service.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreated symlink /etc/systemd/system/sysinit.target.wants/lvm2-lvmpolld.socket → /usr/lib/systemd/system/lvm2-lvmpol\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eld.socket.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcessing triggers \u003cspan class=\"k\"\u003efor\u003c/span\u003e libglib2.0-0t64:amd64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.80.0-6ubuntu3.4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcessing triggers \u003cspan class=\"k\"\u003efor\u003c/span\u003e dbus \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.14.10-4ubuntu4.1\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcessing triggers \u003cspan class=\"k\"\u003efor\u003c/span\u003e hicolor-icon-theme \u003cspan class=\"o\"\u003e(\u003c/span\u003e0.17-2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcessing triggers \u003cspan class=\"k\"\u003efor\u003c/span\u003e libc-bin \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.39-0ubuntu8.4\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcessing triggers \u003cspan class=\"k\"\u003efor\u003c/span\u003e man-db \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.12.0-4build2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcessing triggers \u003cspan class=\"k\"\u003efor\u003c/span\u003e sgml-base \u003cspan class=\"o\"\u003e(\u003c/span\u003e1.31\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up polkitd \u003cspan class=\"o\"\u003e(\u003c/span\u003e124-2ubuntu1.24.04.2\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreating group \u003cspan class=\"s1\"\u003e\u0026#39;polkitd\u0026#39;\u003c/span\u003e with GID 991.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCreating user \u003cspan class=\"s1\"\u003e\u0026#39;polkitd\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eUser \u003cspan class=\"k\"\u003efor\u003c/span\u003e polkitd\u003cspan class=\"o\"\u003e)\u003c/span\u003e with UID \u003cspan class=\"m\"\u003e991\u003c/span\u003e and GID 991.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einvoke-rc.d: could not determine current runlevel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einvoke-rc.d: policy-rc.d denied execution of reload.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003estart-stop-daemon: unable to stat /usr/libexec/polkitd \u003cspan class=\"o\"\u003e(\u003c/span\u003eNo such file or directory\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting up libvirt-daemon-system \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0.0-2ubuntu8.7\u003cspan class=\"o\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euseradd warning: libvirt-qemu\u003cspan class=\"s1\"\u003e\u0026#39;s uid 64055 is greater than SYS_UID_MAX 999\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003echown: changing ownership of \u0026#39;\u003c/span\u003e/var/lib/libvirt/qemu/\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e: Operation not permitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edpkg: error processing package libvirt-daemon-system \u003cspan class=\"o\"\u003e(\u003c/span\u003e--configure\u003cspan class=\"o\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e installed libvirt-daemon-system package post-installation script subprocess returned error \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e status \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eErrors were encountered \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e processing:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e libvirt-daemon-system\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eE: Sub-process /usr/bin/dpkg returned an error code \u003cspan class=\"o\"\u003e(\u003c/span\u003e1\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e📦\u003cspan class=\"o\"\u003e[\u003c/span\u003ewaylon@ubuntu ~\u003cspan class=\"o\"\u003e]\u003c/span\u003e$ virt-manager\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI got virtual machine manager running on two Bazzite machines today.  It was a\nbit tricky, more than I thought actually.  I ran into all sorts of\nvirtualisation not setup issues when I tried the flatpak.  Then I found that\nBazzite comes with a `ujust setup-virtualization` command that does all the\nwork for me.  I tried that and again virtual machine manager was here, but not\nworking, this time it feels like flatpak issues.\n\nIn a Hail Mary attempt I got it working by using an ubuntu distrobox container\nto run the UI.  And it worked!\n\n## from the host\n\nFrom the host we create the container to use from distrobox.  This is an ubuntu\nmachine, it can be any os of your choosing, preferably one that you are\nfamiliar with and contains virt-manager in its package repos.\n\n``` bash\ndistrobox create -i ubuntu\ndistrobox enter ubuntu\n```\n\n## from inside the distrobox container\n\nNow that we are in the distrobox we are no longer in an immutable distro and we\ncan easily install anything we want.  I actually like this process.  I might\nhave shit like this that I use for a month or a few months, on a normal distro,\nthis is fully installed on the os, raises the potential of package conflicts\nand lengthens the update time.\n\n``` bash\nsudo apt update\nsudo apt upgrade\nsudo apt install virtinst virt-manager\nvirt-manager\n```\n\n## Along the way\n\nI tried adding myself to the libvirt group, and expicitly setting the socket\npath. After setting up another machine I realized these steps were unnecessary.\n\n``` bash\nsudo usermod -aG libvirt $USER\nexport LIBVIRT_DEFAULT_URI=\"qemu+unix:///system\"\nls -l /run/libvirt/libvirt-sock\nvirt-install --version\n```\n\n!!! Note\n    After fully reading through `ujust setup-virtualization` I realized that it\n    adds me to the libvirt group, so that's why it is not needed.\n\n## An even Better Guide\n\nI later found [[ thoughts-723 ]] there is documentation for setting up virtual\nmachine manager in distrobox in the distrobox docs.  It even calls out running\non an immutable distro like bazzite like it knew I was coming.\n\n## full log\n\n``` bash\nwaylon@razorcrest:~$ distrobox create -i ubuntu\nImage ubuntu not found.\nDo you want to pull the image now? [Y/n]: y\nResolved \"ubuntu\" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)\nTrying to pull docker.io/library/ubuntu:latest...\nGetting image source signatures\nCopying blob d9d352c11bbd done   |\nCopying config bf16bdcff9 done   |\nWriting manifest to image destination\nbf16bdcff9c96b76a6d417bd8f0a3abe0e55c0ed9bdb3549e906834e2592fd5f\nCreating 'ubuntu' using image ubuntu  [ OK ]\nDistrobox 'ubuntu' successfully created.\nTo enter, run:\n\ndistrobox enter ubuntu\n\nwaylon@razorcrest:~$ distrobox enter ubuntu\nStarting container...                     [ OK ]\nInstalling basic packages...              [ OK ]\nSetting up devpts mounts...               [ OK ]\nSetting up read-only mounts...            [ OK ]\nSetting up read-write mounts...           [ OK ]\nSetting up host's sockets integration...  [ OK ]\nIntegrating host's themes, icons, fonts...  [ OK ]\nSetting up distrobox profile...           [ OK ]\nSetting up sudo...                        [ OK ]\nSetting up user groups...                 [ OK ]\nSetting up user's group list...           [ OK ]\nSetting up existing user...               [ OK ]\nEnsuring user's access...                 [ OK ]\n\nContainer Setup Complete!\n📦[waylon@ubuntu ~]$ sudo apt update\nsudo apt install virtinst\nHit:1 http://security.ubuntu.com/ubuntu noble-security InRelease\nHit:2 http://archive.ubuntu.com/ubuntu noble InRelease\nHit:3 http://archive.ubuntu.com/ubuntu noble-updates InRelease\nHit:4 http://archive.ubuntu.com/ubuntu noble-backports InRelease\nReading package lists... Done\nBuilding dependency tree... Done\nReading state information... Done\n4 packages can be upgraded. Run 'apt list --upgradable' to see them.\nReading package lists... Done\nBuilding dependency tree... Done\nReading state information... Done\nThe following additional packages will be installed:\n  gir1.2-freedesktop gir1.2-libosinfo-1.0 glib-networking glib-networking-common glib-networking-services\n  gstreamer1.0-plugins-base i965-va-driver intel-media-va-driver iso-codes libaio1t64 libasyncns0\n  libboost-iostreams1.83.0 libboost-thread1.83.0 libburn4t64 libcacard0 libcdparanoia0 libcurl3t64-gnutls\n  libdaxctl1 libduktape207 libdw1t64 libflac12t64 libfuse3-3 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0\n  libgtk-vnc-2.0-0 libgvnc-1.0-0 libigdgmm12 libiscsi7 libisoburn1t64 libisofs6t64 libjson-glib-1.0-0\n  libjson-glib-1.0-common libmp3lame0 libmpg123-0t64 libndctl6 libnfs14 libnspr4 libnss3 libnuma1 libogg0\n  libopus0 liborc-0.4-0t64 libosinfo-1.0-0 libosinfo-l10n libpcsclite1 libphodav-3.0-0 libphodav-3.0-common\n  libpmem1 libpmemobj1 libpolkit-gobject-1-0 libproxy1v5 libpulse0 librados2 librbd1 librdmacm1t64 libsndfile1\n  libsoup-3.0-0 libsoup-3.0-common libspice-client-glib-2.0-8 libspice-client-gtk-3.0-5 libtheora0 libunwind8\n  liburing2 libusb-1.0-0 libusbredirhost1t64 libusbredirparser1t64 libva-x11-2 libva2 libvirt-clients\n  libvirt-glib-1.0-0 libvirt-glib-1.0-data libvirt-l10n libvirt0 libvisual-0.4-0 libvorbis0a libvorbisenc2\n  libvte-2.91-0 libxslt1.1 libyajl2 mesa-va-drivers osinfo-db pci.ids python3-certifi python3-chardet\n  python3-idna python3-libvirt python3-libxml2 python3-pkg-resources python3-requests python3-urllib3\n  qemu-block-extra qemu-utils spice-client-glib-usb-acl-helper usb.ids va-driver-all virt-viewer xorriso\nSuggested packages:\n  gvfs i965-va-driver-shaders isoquery fuse3 libvisual-0.4-plugins gstreamer1.0-tools opus-tools pcscd pulseaudio\n  gstreamer1.0-libav gstreamer1.0-plugins-bad gstreamer1.0-plugins-good libvirt-clients-qemu libvirt-daemon\n  libvirt-login-shell python3-setuptools python3-cryptography python3-openssl python3-socks python-requests-doc\n  python3-brotli netcat python3-argcomplete xorriso-tcltk jigit cdck\nThe following NEW packages will be installed:\n  gir1.2-freedesktop gir1.2-libosinfo-1.0 glib-networking glib-networking-common glib-networking-services\n  gstreamer1.0-plugins-base i965-va-driver intel-media-va-driver iso-codes libaio1t64 libasyncns0\n  libboost-iostreams1.83.0 libboost-thread1.83.0 libburn4t64 libcacard0 libcdparanoia0 libcurl3t64-gnutls\n  libdaxctl1 libduktape207 libdw1t64 libflac12t64 libfuse3-3 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0\n  libgtk-vnc-2.0-0 libgvnc-1.0-0 libigdgmm12 libiscsi7 libisoburn1t64 libisofs6t64 libjson-glib-1.0-0\n  libjson-glib-1.0-common libmp3lame0 libmpg123-0t64 libndctl6 libnfs14 libnspr4 libnss3 libnuma1 libogg0\n  libopus0 liborc-0.4-0t64 libosinfo-1.0-0 libosinfo-l10n libpcsclite1 libphodav-3.0-0 libphodav-3.0-common\n  libpmem1 libpmemobj1 libpolkit-gobject-1-0 libproxy1v5 libpulse0 librados2 librbd1 librdmacm1t64 libsndfile1\n  libsoup-3.0-0 libsoup-3.0-common libspice-client-glib-2.0-8 libspice-client-gtk-3.0-5 libtheora0 libunwind8\n  liburing2 libusb-1.0-0 libusbredirhost1t64 libusbredirparser1t64 libva-x11-2 libva2 libvirt-clients\n  libvirt-glib-1.0-0 libvirt-glib-1.0-data libvirt-l10n libvirt0 libvisual-0.4-0 libvorbis0a libvorbisenc2\n  libvte-2.91-0 libxslt1.1 libyajl2 mesa-va-drivers osinfo-db pci.ids python3-certifi python3-chardet\n  python3-idna python3-libvirt python3-libxml2 python3-pkg-resources python3-requests python3-urllib3\n  qemu-block-extra qemu-utils spice-client-glib-usb-acl-helper usb.ids va-driver-all virt-viewer virtinst xorriso\n0 upgraded, 98 newly installed, 0 to remove and 4 not upgraded.\nNeed to get 34.2 MB of archives.\nAfter this operation, 143 MB of additional disk space will be used.\nDo you want to continue? [Y/n] y\nGet:1 http://archive.ubuntu.com/ubuntu noble/main amd64 iso-codes all 4.16.0-1 [3,492 kB]\nGet:2 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-pkg-resources all 68.1.2-2ubuntu1.2 [168 kB]\nGet:3 http://archive.ubuntu.com/ubuntu noble/main amd64 libfuse3-3 amd64 3.14.0-5build1 [83.1 kB]\nGet:4 http://archive.ubuntu.com/ubuntu noble/main amd64 libnuma1 amd64 2.0.18-1build1 [23.3 kB]\nGet:5 http://archive.ubuntu.com/ubuntu noble/main amd64 libusb-1.0-0 amd64 2:1.0.27-1 [54.0 kB]\nGet:6 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 pci.ids all 0.0~2024.03.31-1ubuntu0.1 [275 kB]\nGet:7 http://archive.ubuntu.com/ubuntu noble/main amd64 usb.ids all 2024.03.18-1 [223 kB]\nGet:8 http://archive.ubuntu.com/ubuntu noble/main amd64 gir1.2-freedesktop amd64 1.80.1-1 [49.7 kB]\nGet:9 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libcurl3t64-gnutls amd64 8.5.0-2ubuntu10.6 [333 kB]\nGet:10 http://archive.ubuntu.com/ubuntu noble/main amd64 libduktape207 amd64 2.7.0+tests-0ubuntu3 [143 kB]\nGet:11 http://archive.ubuntu.com/ubuntu noble/main amd64 libproxy1v5 amd64 0.5.4-4build1 [26.5 kB]\nGet:12 http://archive.ubuntu.com/ubuntu noble/main amd64 glib-networking-common all 2.80.0-1build1 [6,702 B]\nGet:13 http://archive.ubuntu.com/ubuntu noble/main amd64 glib-networking-services amd64 2.80.0-1build1 [12.8 kB]\nGet:14 http://archive.ubuntu.com/ubuntu noble/main amd64 glib-networking amd64 2.80.0-1build1 [64.1 kB]\nGet:15 http://archive.ubuntu.com/ubuntu noble/main amd64 libcdparanoia0 amd64 3.10.2+debian-14build3 [48.5 kB]\nGet:16 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdw1t64 amd64 0.190-1.1ubuntu0.1 [261 kB]\nGet:17 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libunwind8 amd64 1.6.2-3build1.1 [55.3 kB]\nGet:18 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgstreamer1.0-0 amd64 1.24.2-1ubuntu0.1 [1,165 kB]\nGet:19 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 liborc-0.4-0t64 amd64 1:0.4.38-1ubuntu0.1 [207 kB]\nGet:20 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgstreamer-plugins-base1.0-0 amd64 1.24.2-1ubuntu0.2 [862 kB]\nGet:21 http://archive.ubuntu.com/ubuntu noble/main amd64 libogg0 amd64 1.3.5-3build1 [22.7 kB]\nGet:22 http://archive.ubuntu.com/ubuntu noble/main amd64 libopus0 amd64 1.4-1build1 [208 kB]\nGet:23 http://archive.ubuntu.com/ubuntu noble/main amd64 libtheora0 amd64 1.1.1+dfsg.1-16.1build3 [211 kB]\nGet:24 http://archive.ubuntu.com/ubuntu noble/main amd64 libvisual-0.4-0 amd64 0.4.2-2build1 [115 kB]\nGet:25 http://archive.ubuntu.com/ubuntu noble/main amd64 libvorbis0a amd64 1.3.7-1build3 [97.6 kB]\nGet:26 http://archive.ubuntu.com/ubuntu noble/main amd64 libvorbisenc2 amd64 1.3.7-1build3 [80.8 kB]\nGet:27 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gstreamer1.0-plugins-base amd64 1.24.2-1ubuntu0.2 [721 kB]\nGet:28 http://archive.ubuntu.com/ubuntu noble/universe amd64 libva2 amd64 2.20.0-2build1 [66.2 kB]\nGet:29 http://archive.ubuntu.com/ubuntu noble/universe amd64 libigdgmm12 amd64 22.3.17+ds1-1 [145 kB]\nGet:30 http://archive.ubuntu.com/ubuntu noble/universe amd64 intel-media-va-driver amd64 24.1.0+dfsg1-1 [4,022 kB]\nGet:31 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libaio1t64 amd64 0.3.113-6build1.1 [7,210 B]\nGet:32 http://archive.ubuntu.com/ubuntu noble/main amd64 libasyncns0 amd64 0.8-6build4 [11.3 kB]\nGet:33 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libboost-iostreams1.83.0 amd64 1.83.0-2.1ubuntu3.1 [259 kB]\nGet:34 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libboost-thread1.83.0 amd64 1.83.0-2.1ubuntu3.1 [276 kB]\nGet:35 http://archive.ubuntu.com/ubuntu noble/main amd64 libburn4t64 amd64 1.5.6-1.1build1 [158 kB]\nGet:36 http://archive.ubuntu.com/ubuntu noble/main amd64 libnspr4 amd64 2:4.35-1.1build1 [117 kB]\nGet:37 http://archive.ubuntu.com/ubuntu noble/main amd64 libnss3 amd64 2:3.98-1build1 [1,445 kB]\nGet:38 http://archive.ubuntu.com/ubuntu noble/main amd64 libpcsclite1 amd64 2.0.3-1build1 [21.4 kB]\nGet:39 http://archive.ubuntu.com/ubuntu noble/main amd64 libcacard0 amd64 1:2.8.0-3build4 [36.5 kB]\nGet:40 http://archive.ubuntu.com/ubuntu noble/main amd64 libdaxctl1 amd64 77-2ubuntu2 [21.4 kB]\nGet:41 http://archive.ubuntu.com/ubuntu noble/main amd64 libflac12t64 amd64 1.4.3+ds-2.1ubuntu2 [197 kB]\nGet:42 http://archive.ubuntu.com/ubuntu noble/main amd64 libmp3lame0 amd64 3.100-6build1 [142 kB]\nGet:43 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libmpg123-0t64 amd64 1.32.5-1ubuntu1.1 [169 kB]\nGet:44 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsndfile1 amd64 1.2.2-1ubuntu5.24.04.1 [209 kB]\nGet:45 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpulse0 amd64 1:16.1+dfsg1-2ubuntu10.1 [292 kB]\nGet:46 http://archive.ubuntu.com/ubuntu noble/universe amd64 libgvnc-1.0-0 amd64 1.3.1-1build2 [67.1 kB]\nGet:47 http://archive.ubuntu.com/ubuntu noble/universe amd64 libgtk-vnc-2.0-0 amd64 1.3.1-1build2 [28.9 kB]\nGet:48 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 librdmacm1t64 amd64 50.0-2ubuntu0.2 [70.7 kB]\nGet:49 http://archive.ubuntu.com/ubuntu noble/main amd64 libiscsi7 amd64 1.19.0-3build4 [68.7 kB]\nGet:50 http://archive.ubuntu.com/ubuntu noble/main amd64 libisofs6t64 amd64 1.5.6.pl01-1.1ubuntu2 [220 kB]\nGet:51 http://archive.ubuntu.com/ubuntu noble/main amd64 libisoburn1t64 amd64 1:1.5.6-1.1ubuntu3 [405 kB]\nGet:52 http://archive.ubuntu.com/ubuntu noble/main amd64 libjson-glib-1.0-common all 1.8.0-2build2 [4,244 B]\nGet:53 http://archive.ubuntu.com/ubuntu noble/main amd64 libjson-glib-1.0-0 amd64 1.8.0-2build2 [68.0 kB]\nGet:54 http://archive.ubuntu.com/ubuntu noble/main amd64 libndctl6 amd64 77-2ubuntu2 [62.8 kB]\nGet:55 http://archive.ubuntu.com/ubuntu noble/main amd64 libnfs14 amd64 5.0.2-1build1 [109 kB]\nGet:56 http://archive.ubuntu.com/ubuntu noble/universe amd64 libphodav-3.0-common all 3.0-8build3 [14.9 kB]\nGet:57 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsoup-3.0-common all 3.4.4-5ubuntu0.4 [11.1 kB]\nGet:58 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsoup-3.0-0 amd64 3.4.4-5ubuntu0.4 [290 kB]\nGet:59 http://archive.ubuntu.com/ubuntu noble/universe amd64 libphodav-3.0-0 amd64 3.0-8build3 [29.9 kB]\nGet:60 http://archive.ubuntu.com/ubuntu noble/main amd64 libpmem1 amd64 1.13.1-1.1ubuntu2 [84.8 kB]\nGet:61 http://archive.ubuntu.com/ubuntu noble/main amd64 libpmemobj1 amd64 1.13.1-1.1ubuntu2 [116 kB]\nGet:62 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpolkit-gobject-1-0 amd64 124-2ubuntu1.24.04.2 [49.1 kB]\nGet:63 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 librados2 amd64 19.2.0-0ubuntu0.24.04.2 [3,972 kB]\nGet:64 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 librbd1 amd64 19.2.0-0ubuntu0.24.04.2 [3,351 kB]\nGet:65 http://archive.ubuntu.com/ubuntu noble/universe amd64 spice-client-glib-usb-acl-helper amd64 0.42-2ubuntu2 [12.5 kB]\nGet:66 http://archive.ubuntu.com/ubuntu noble/main amd64 libusbredirparser1t64 amd64 0.13.0-2.1build1 [16.5 kB]\nGet:67 http://archive.ubuntu.com/ubuntu noble/main amd64 libusbredirhost1t64 amd64 0.13.0-2.1build1 [20.0 kB]\nGet:68 http://archive.ubuntu.com/ubuntu noble/universe amd64 libspice-client-glib-2.0-8 amd64 0.42-2ubuntu2 [314 kB]\nGet:69 http://archive.ubuntu.com/ubuntu noble/universe amd64 libva-x11-2 amd64 2.20.0-2build1 [12.0 kB]\nGet:70 http://archive.ubuntu.com/ubuntu noble/universe amd64 libspice-client-gtk-3.0-5 amd64 0.42-2ubuntu2 [56.6 kB]\nGet:71 http://archive.ubuntu.com/ubuntu noble/main amd64 liburing2 amd64 2.5-1build1 [21.1 kB]\nGet:72 http://archive.ubuntu.com/ubuntu noble/main amd64 libyajl2 amd64 2.1.0-5build1 [20.2 kB]\nGet:73 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt0 amd64 10.0.0-2ubuntu8.7 [1,826 kB]\nGet:74 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-clients amd64 10.0.0-2ubuntu8.7 [438 kB]\nGet:75 http://archive.ubuntu.com/ubuntu noble/universe amd64 libvirt-glib-1.0-data all 5.0.0-2build3 [17.3 kB]\nGet:76 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-l10n all 10.0.0-2ubuntu8.7 [1,150 B]\nGet:77 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvte-2.91-0 amd64 0.76.0-1ubuntu0.1 [230 kB]\nGet:78 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libxslt1.1 amd64 1.1.39-0exp1ubuntu0.24.04.2 [167 kB]\nGet:79 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 mesa-va-drivers amd64 24.2.8-1ubuntu1~24.04.1 [19.5 kB]\nGet:80 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 osinfo-db all 0.20250124-0ubuntu0.24.04.1 [176 kB]\nGet:81 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-certifi all 2023.11.17-1 [165 kB]\nGet:82 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-chardet all 5.2.0+dfsg-1 [117 kB]\nGet:83 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-idna all 3.6-2ubuntu0.1 [49.0 kB]\nGet:84 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-libvirt amd64 10.0.0-1build1 [164 kB]\nGet:85 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 python3-libxml2 amd64 2.9.14+dfsg-1.3ubuntu3.3 [140 kB]\nGet:86 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-urllib3 all 2.0.7-1ubuntu0.2 [93.3 kB]\nGet:87 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-requests all 2.31.0+dfsg-1ubuntu1.1 [50.8 kB]\nGet:88 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-utils amd64 1:8.2.2+ds-0ubuntu1.7 [2,220 kB]\nGet:89 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-block-extra amd64 1:8.2.2+ds-0ubuntu1.7 [111 kB]\nGet:90 http://archive.ubuntu.com/ubuntu noble/universe amd64 i965-va-driver amd64 2.4.1+dfsg1-1build2 [332 kB]\nGet:91 http://archive.ubuntu.com/ubuntu noble/universe amd64 va-driver-all amd64 2.20.0-2build1 [4,844 B]\nGet:92 http://archive.ubuntu.com/ubuntu noble/universe amd64 libvirt-glib-1.0-0 amd64 5.0.0-2build3 [121 kB]\nGet:93 http://archive.ubuntu.com/ubuntu noble/universe amd64 virt-viewer amd64 11.0-3build2 [285 kB]\nGet:94 http://archive.ubuntu.com/ubuntu noble/main amd64 xorriso amd64 1:1.5.6-1.1ubuntu3 [297 kB]\nGet:95 http://archive.ubuntu.com/ubuntu noble/universe amd64 libosinfo-l10n all 1.11.0-2build3 [50.6 kB]\nGet:96 http://archive.ubuntu.com/ubuntu noble/universe amd64 libosinfo-1.0-0 amd64 1.11.0-2build3 [91.5 kB]\nGet:97 http://archive.ubuntu.com/ubuntu noble/universe amd64 gir1.2-libosinfo-1.0 amd64 1.11.0-2build3 [18.6 kB]\nGet:98 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 virtinst all 1:4.1.0-3ubuntu0.1 [891 kB]\nFetched 34.2 MB in 3s (10.8 MB/s)\nExtracting templates from packages: 100%\nSelecting previously unselected package iso-codes.\n(Reading database ... 26588 files and directories currently installed.)\nPreparing to unpack .../00-iso-codes_4.16.0-1_all.deb ...\nUnpacking iso-codes (4.16.0-1) ...\nSelecting previously unselected package python3-pkg-resources.\nPreparing to unpack .../01-python3-pkg-resources_68.1.2-2ubuntu1.2_all.deb ...\nUnpacking python3-pkg-resources (68.1.2-2ubuntu1.2) ...\nSelecting previously unselected package libfuse3-3:amd64.\nPreparing to unpack .../02-libfuse3-3_3.14.0-5build1_amd64.deb ...\nUnpacking libfuse3-3:amd64 (3.14.0-5build1) ...\nSelecting previously unselected package libnuma1:amd64.\nPreparing to unpack .../03-libnuma1_2.0.18-1build1_amd64.deb ...\nUnpacking libnuma1:amd64 (2.0.18-1build1) ...\nSelecting previously unselected package libusb-1.0-0:amd64.\nPreparing to unpack .../04-libusb-1.0-0_2%3a1.0.27-1_amd64.deb ...\nUnpacking libusb-1.0-0:amd64 (2:1.0.27-1) ...\nSelecting previously unselected package pci.ids.\nPreparing to unpack .../05-pci.ids_0.0~2024.03.31-1ubuntu0.1_all.deb ...\nUnpacking pci.ids (0.0~2024.03.31-1ubuntu0.1) ...\nSelecting previously unselected package usb.ids.\nPreparing to unpack .../06-usb.ids_2024.03.18-1_all.deb ...\nUnpacking usb.ids (2024.03.18-1) ...\nSelecting previously unselected package gir1.2-freedesktop:amd64.\nPreparing to unpack .../07-gir1.2-freedesktop_1.80.1-1_amd64.deb ...\nUnpacking gir1.2-freedesktop:amd64 (1.80.1-1) ...\nSelecting previously unselected package libcurl3t64-gnutls:amd64.\nPreparing to unpack .../08-libcurl3t64-gnutls_8.5.0-2ubuntu10.6_amd64.deb ...\nUnpacking libcurl3t64-gnutls:amd64 (8.5.0-2ubuntu10.6) ...\nSelecting previously unselected package libduktape207:amd64.\nPreparing to unpack .../09-libduktape207_2.7.0+tests-0ubuntu3_amd64.deb ...\nUnpacking libduktape207:amd64 (2.7.0+tests-0ubuntu3) ...\nSelecting previously unselected package libproxy1v5:amd64.\nPreparing to unpack .../10-libproxy1v5_0.5.4-4build1_amd64.deb ...\nUnpacking libproxy1v5:amd64 (0.5.4-4build1) ...\nSelecting previously unselected package glib-networking-common.\nPreparing to unpack .../11-glib-networking-common_2.80.0-1build1_all.deb ...\nUnpacking glib-networking-common (2.80.0-1build1) ...\nSelecting previously unselected package glib-networking-services.\nPreparing to unpack .../12-glib-networking-services_2.80.0-1build1_amd64.deb ...\nUnpacking glib-networking-services (2.80.0-1build1) ...\nSelecting previously unselected package glib-networking:amd64.\nPreparing to unpack .../13-glib-networking_2.80.0-1build1_amd64.deb ...\nUnpacking glib-networking:amd64 (2.80.0-1build1) ...\nSelecting previously unselected package libcdparanoia0:amd64.\nPreparing to unpack .../14-libcdparanoia0_3.10.2+debian-14build3_amd64.deb ...\nUnpacking libcdparanoia0:amd64 (3.10.2+debian-14build3) ...\nSelecting previously unselected package libdw1t64:amd64.\nPreparing to unpack .../15-libdw1t64_0.190-1.1ubuntu0.1_amd64.deb ...\nUnpacking libdw1t64:amd64 (0.190-1.1ubuntu0.1) ...\nSelecting previously unselected package libunwind8:amd64.\nPreparing to unpack .../16-libunwind8_1.6.2-3build1.1_amd64.deb ...\nUnpacking libunwind8:amd64 (1.6.2-3build1.1) ...\nSelecting previously unselected package libgstreamer1.0-0:amd64.\nPreparing to unpack .../17-libgstreamer1.0-0_1.24.2-1ubuntu0.1_amd64.deb ...\nUnpacking libgstreamer1.0-0:amd64 (1.24.2-1ubuntu0.1) ...\nSelecting previously unselected package liborc-0.4-0t64:amd64.\nPreparing to unpack .../18-liborc-0.4-0t64_1%3a0.4.38-1ubuntu0.1_amd64.deb ...\nUnpacking liborc-0.4-0t64:amd64 (1:0.4.38-1ubuntu0.1) ...\nSelecting previously unselected package libgstreamer-plugins-base1.0-0:amd64.\nPreparing to unpack .../19-libgstreamer-plugins-base1.0-0_1.24.2-1ubuntu0.2_amd64.deb ...\nUnpacking libgstreamer-plugins-base1.0-0:amd64 (1.24.2-1ubuntu0.2) ...\nSelecting previously unselected package libogg0:amd64.\nPreparing to unpack .../20-libogg0_1.3.5-3build1_amd64.deb ...\nUnpacking libogg0:amd64 (1.3.5-3build1) ...\nSelecting previously unselected package libopus0:amd64.\nPreparing to unpack .../21-libopus0_1.4-1build1_amd64.deb ...\nUnpacking libopus0:amd64 (1.4-1build1) ...\nSelecting previously unselected package libtheora0:amd64.\nPreparing to unpack .../22-libtheora0_1.1.1+dfsg.1-16.1build3_amd64.deb ...\nUnpacking libtheora0:amd64 (1.1.1+dfsg.1-16.1build3) ...\nSelecting previously unselected package libvisual-0.4-0:amd64.\nPreparing to unpack .../23-libvisual-0.4-0_0.4.2-2build1_amd64.deb ...\nUnpacking libvisual-0.4-0:amd64 (0.4.2-2build1) ...\nSelecting previously unselected package libvorbis0a:amd64.\nPreparing to unpack .../24-libvorbis0a_1.3.7-1build3_amd64.deb ...\nUnpacking libvorbis0a:amd64 (1.3.7-1build3) ...\nSelecting previously unselected package libvorbisenc2:amd64.\nPreparing to unpack .../25-libvorbisenc2_1.3.7-1build3_amd64.deb ...\nUnpacking libvorbisenc2:amd64 (1.3.7-1build3) ...\nSelecting previously unselected package gstreamer1.0-plugins-base:amd64.\nPreparing to unpack .../26-gstreamer1.0-plugins-base_1.24.2-1ubuntu0.2_amd64.deb ...\nUnpacking gstreamer1.0-plugins-base:amd64 (1.24.2-1ubuntu0.2) ...\nSelecting previously unselected package libva2:amd64.\nPreparing to unpack .../27-libva2_2.20.0-2build1_amd64.deb ...\nUnpacking libva2:amd64 (2.20.0-2build1) ...\nSelecting previously unselected package libigdgmm12:amd64.\nPreparing to unpack .../28-libigdgmm12_22.3.17+ds1-1_amd64.deb ...\nUnpacking libigdgmm12:amd64 (22.3.17+ds1-1) ...\nSelecting previously unselected package intel-media-va-driver:amd64.\nPreparing to unpack .../29-intel-media-va-driver_24.1.0+dfsg1-1_amd64.deb ...\nUnpacking intel-media-va-driver:amd64 (24.1.0+dfsg1-1) ...\nSelecting previously unselected package libaio1t64:amd64.\nPreparing to unpack .../30-libaio1t64_0.3.113-6build1.1_amd64.deb ...\nUnpacking libaio1t64:amd64 (0.3.113-6build1.1) ...\nSelecting previously unselected package libasyncns0:amd64.\nPreparing to unpack .../31-libasyncns0_0.8-6build4_amd64.deb ...\nUnpacking libasyncns0:amd64 (0.8-6build4) ...\nSelecting previously unselected package libboost-iostreams1.83.0:amd64.\nPreparing to unpack .../32-libboost-iostreams1.83.0_1.83.0-2.1ubuntu3.1_amd64.deb ...\nUnpacking libboost-iostreams1.83.0:amd64 (1.83.0-2.1ubuntu3.1) ...\nSelecting previously unselected package libboost-thread1.83.0:amd64.\nPreparing to unpack .../33-libboost-thread1.83.0_1.83.0-2.1ubuntu3.1_amd64.deb ...\nUnpacking libboost-thread1.83.0:amd64 (1.83.0-2.1ubuntu3.1) ...\nSelecting previously unselected package libburn4t64:amd64.\nPreparing to unpack .../34-libburn4t64_1.5.6-1.1build1_amd64.deb ...\nUnpacking libburn4t64:amd64 (1.5.6-1.1build1) ...\nSelecting previously unselected package libnspr4:amd64.\nPreparing to unpack .../35-libnspr4_2%3a4.35-1.1build1_amd64.deb ...\nUnpacking libnspr4:amd64 (2:4.35-1.1build1) ...\nSelecting previously unselected package libnss3:amd64.\nPreparing to unpack .../36-libnss3_2%3a3.98-1build1_amd64.deb ...\nUnpacking libnss3:amd64 (2:3.98-1build1) ...\nSelecting previously unselected package libpcsclite1:amd64.\nPreparing to unpack .../37-libpcsclite1_2.0.3-1build1_amd64.deb ...\nUnpacking libpcsclite1:amd64 (2.0.3-1build1) ...\nSelecting previously unselected package libcacard0:amd64.\nPreparing to unpack .../38-libcacard0_1%3a2.8.0-3build4_amd64.deb ...\nUnpacking libcacard0:amd64 (1:2.8.0-3build4) ...\nSelecting previously unselected package libdaxctl1:amd64.\nPreparing to unpack .../39-libdaxctl1_77-2ubuntu2_amd64.deb ...\nUnpacking libdaxctl1:amd64 (77-2ubuntu2) ...\nSelecting previously unselected package libflac12t64:amd64.\nPreparing to unpack .../40-libflac12t64_1.4.3+ds-2.1ubuntu2_amd64.deb ...\nUnpacking libflac12t64:amd64 (1.4.3+ds-2.1ubuntu2) ...\nSelecting previously unselected package libmp3lame0:amd64.\nPreparing to unpack .../41-libmp3lame0_3.100-6build1_amd64.deb ...\nUnpacking libmp3lame0:amd64 (3.100-6build1) ...\nSelecting previously unselected package libmpg123-0t64:amd64.\nPreparing to unpack .../42-libmpg123-0t64_1.32.5-1ubuntu1.1_amd64.deb ...\nUnpacking libmpg123-0t64:amd64 (1.32.5-1ubuntu1.1) ...\nSelecting previously unselected package libsndfile1:amd64.\nPreparing to unpack .../43-libsndfile1_1.2.2-1ubuntu5.24.04.1_amd64.deb ...\nUnpacking libsndfile1:amd64 (1.2.2-1ubuntu5.24.04.1) ...\nSelecting previously unselected package libpulse0:amd64.\nPreparing to unpack .../44-libpulse0_1%3a16.1+dfsg1-2ubuntu10.1_amd64.deb ...\nUnpacking libpulse0:amd64 (1:16.1+dfsg1-2ubuntu10.1) ...\nSelecting previously unselected package libgvnc-1.0-0:amd64.\nPreparing to unpack .../45-libgvnc-1.0-0_1.3.1-1build2_amd64.deb ...\nUnpacking libgvnc-1.0-0:amd64 (1.3.1-1build2) ...\nSelecting previously unselected package libgtk-vnc-2.0-0:amd64.\nPreparing to unpack .../46-libgtk-vnc-2.0-0_1.3.1-1build2_amd64.deb ...\nUnpacking libgtk-vnc-2.0-0:amd64 (1.3.1-1build2) ...\nSelecting previously unselected package librdmacm1t64:amd64.\nPreparing to unpack .../47-librdmacm1t64_50.0-2ubuntu0.2_amd64.deb ...\nUnpacking librdmacm1t64:amd64 (50.0-2ubuntu0.2) ...\nSelecting previously unselected package libiscsi7:amd64.\nPreparing to unpack .../48-libiscsi7_1.19.0-3build4_amd64.deb ...\nUnpacking libiscsi7:amd64 (1.19.0-3build4) ...\nSelecting previously unselected package libisofs6t64:amd64.\nPreparing to unpack .../49-libisofs6t64_1.5.6.pl01-1.1ubuntu2_amd64.deb ...\nUnpacking libisofs6t64:amd64 (1.5.6.pl01-1.1ubuntu2) ...\nSelecting previously unselected package libisoburn1t64:amd64.\nPreparing to unpack .../50-libisoburn1t64_1%3a1.5.6-1.1ubuntu3_amd64.deb ...\nUnpacking libisoburn1t64:amd64 (1:1.5.6-1.1ubuntu3) ...\nSelecting previously unselected package libjson-glib-1.0-common.\nPreparing to unpack .../51-libjson-glib-1.0-common_1.8.0-2build2_all.deb ...\nUnpacking libjson-glib-1.0-common (1.8.0-2build2) ...\nSelecting previously unselected package libjson-glib-1.0-0:amd64.\nPreparing to unpack .../52-libjson-glib-1.0-0_1.8.0-2build2_amd64.deb ...\nUnpacking libjson-glib-1.0-0:amd64 (1.8.0-2build2) ...\nSelecting previously unselected package libndctl6:amd64.\nPreparing to unpack .../53-libndctl6_77-2ubuntu2_amd64.deb ...\nUnpacking libndctl6:amd64 (77-2ubuntu2) ...\nSelecting previously unselected package libnfs14:amd64.\nPreparing to unpack .../54-libnfs14_5.0.2-1build1_amd64.deb ...\nUnpacking libnfs14:amd64 (5.0.2-1build1) ...\nSelecting previously unselected package libphodav-3.0-common.\nPreparing to unpack .../55-libphodav-3.0-common_3.0-8build3_all.deb ...\nUnpacking libphodav-3.0-common (3.0-8build3) ...\nSelecting previously unselected package libsoup-3.0-common.\nPreparing to unpack .../56-libsoup-3.0-common_3.4.4-5ubuntu0.4_all.deb ...\nUnpacking libsoup-3.0-common (3.4.4-5ubuntu0.4) ...\nSelecting previously unselected package libsoup-3.0-0:amd64.\nPreparing to unpack .../57-libsoup-3.0-0_3.4.4-5ubuntu0.4_amd64.deb ...\nUnpacking libsoup-3.0-0:amd64 (3.4.4-5ubuntu0.4) ...\nSelecting previously unselected package libphodav-3.0-0:amd64.\nPreparing to unpack .../58-libphodav-3.0-0_3.0-8build3_amd64.deb ...\nUnpacking libphodav-3.0-0:amd64 (3.0-8build3) ...\nSelecting previously unselected package libpmem1:amd64.\nPreparing to unpack .../59-libpmem1_1.13.1-1.1ubuntu2_amd64.deb ...\nUnpacking libpmem1:amd64 (1.13.1-1.1ubuntu2) ...\nSelecting previously unselected package libpmemobj1:amd64.\nPreparing to unpack .../60-libpmemobj1_1.13.1-1.1ubuntu2_amd64.deb ...\nUnpacking libpmemobj1:amd64 (1.13.1-1.1ubuntu2) ...\nSelecting previously unselected package libpolkit-gobject-1-0:amd64.\nPreparing to unpack .../61-libpolkit-gobject-1-0_124-2ubuntu1.24.04.2_amd64.deb ...\nUnpacking libpolkit-gobject-1-0:amd64 (124-2ubuntu1.24.04.2) ...\nSelecting previously unselected package librados2.\nPreparing to unpack .../62-librados2_19.2.0-0ubuntu0.24.04.2_amd64.deb ...\nUnpacking librados2 (19.2.0-0ubuntu0.24.04.2) ...\nSelecting previously unselected package librbd1.\nPreparing to unpack .../63-librbd1_19.2.0-0ubuntu0.24.04.2_amd64.deb ...\nUnpacking librbd1 (19.2.0-0ubuntu0.24.04.2) ...\nSelecting previously unselected package spice-client-glib-usb-acl-helper.\nPreparing to unpack .../64-spice-client-glib-usb-acl-helper_0.42-2ubuntu2_amd64.deb ...\nUnpacking spice-client-glib-usb-acl-helper (0.42-2ubuntu2) ...\nSelecting previously unselected package libusbredirparser1t64:amd64.\nPreparing to unpack .../65-libusbredirparser1t64_0.13.0-2.1build1_amd64.deb ...\nUnpacking libusbredirparser1t64:amd64 (0.13.0-2.1build1) ...\nSelecting previously unselected package libusbredirhost1t64:amd64.\nPreparing to unpack .../66-libusbredirhost1t64_0.13.0-2.1build1_amd64.deb ...\nUnpacking libusbredirhost1t64:amd64 (0.13.0-2.1build1) ...\nSelecting previously unselected package libspice-client-glib-2.0-8:amd64.\nPreparing to unpack .../67-libspice-client-glib-2.0-8_0.42-2ubuntu2_amd64.deb ...\nUnpacking libspice-client-glib-2.0-8:amd64 (0.42-2ubuntu2) ...\nSelecting previously unselected package libva-x11-2:amd64.\nPreparing to unpack .../68-libva-x11-2_2.20.0-2build1_amd64.deb ...\nUnpacking libva-x11-2:amd64 (2.20.0-2build1) ...\nSelecting previously unselected package libspice-client-gtk-3.0-5:amd64.\nPreparing to unpack .../69-libspice-client-gtk-3.0-5_0.42-2ubuntu2_amd64.deb ...\nUnpacking libspice-client-gtk-3.0-5:amd64 (0.42-2ubuntu2) ...\nSelecting previously unselected package liburing2:amd64.\nPreparing to unpack .../70-liburing2_2.5-1build1_amd64.deb ...\nUnpacking liburing2:amd64 (2.5-1build1) ...\nSelecting previously unselected package libyajl2:amd64.\nPreparing to unpack .../71-libyajl2_2.1.0-5build1_amd64.deb ...\nUnpacking libyajl2:amd64 (2.1.0-5build1) ...\nSelecting previously unselected package libvirt0:amd64.\nPreparing to unpack .../72-libvirt0_10.0.0-2ubuntu8.7_amd64.deb ...\nUnpacking libvirt0:amd64 (10.0.0-2ubuntu8.7) ...\nSelecting previously unselected package libvirt-clients.\nPreparing to unpack .../73-libvirt-clients_10.0.0-2ubuntu8.7_amd64.deb ...\nUnpacking libvirt-clients (10.0.0-2ubuntu8.7) ...\nSelecting previously unselected package libvirt-glib-1.0-data.\nPreparing to unpack .../74-libvirt-glib-1.0-data_5.0.0-2build3_all.deb ...\nUnpacking libvirt-glib-1.0-data (5.0.0-2build3) ...\nSelecting previously unselected package libvirt-l10n.\nPreparing to unpack .../75-libvirt-l10n_10.0.0-2ubuntu8.7_all.deb ...\nUnpacking libvirt-l10n (10.0.0-2ubuntu8.7) ...\nSelecting previously unselected package libvte-2.91-0:amd64.\nPreparing to unpack .../76-libvte-2.91-0_0.76.0-1ubuntu0.1_amd64.deb ...\nUnpacking libvte-2.91-0:amd64 (0.76.0-1ubuntu0.1) ...\nSelecting previously unselected package libxslt1.1:amd64.\nPreparing to unpack .../77-libxslt1.1_1.1.39-0exp1ubuntu0.24.04.2_amd64.deb ...\nUnpacking libxslt1.1:amd64 (1.1.39-0exp1ubuntu0.24.04.2) ...\nSelecting previously unselected package mesa-va-drivers:amd64.\nPreparing to unpack .../78-mesa-va-drivers_24.2.8-1ubuntu1~24.04.1_amd64.deb ...\nUnpacking mesa-va-drivers:amd64 (24.2.8-1ubuntu1~24.04.1) ...\nSelecting previously unselected package osinfo-db.\nPreparing to unpack .../79-osinfo-db_0.20250124-0ubuntu0.24.04.1_all.deb ...\nUnpacking osinfo-db (0.20250124-0ubuntu0.24.04.1) ...\nSelecting previously unselected package python3-certifi.\nPreparing to unpack .../80-python3-certifi_2023.11.17-1_all.deb ...\nUnpacking python3-certifi (2023.11.17-1) ...\nSelecting previously unselected package python3-chardet.\nPreparing to unpack .../81-python3-chardet_5.2.0+dfsg-1_all.deb ...\nUnpacking python3-chardet (5.2.0+dfsg-1) ...\nSelecting previously unselected package python3-idna.\nPreparing to unpack .../82-python3-idna_3.6-2ubuntu0.1_all.deb ...\nUnpacking python3-idna (3.6-2ubuntu0.1) ...\nSelecting previously unselected package python3-libvirt.\nPreparing to unpack .../83-python3-libvirt_10.0.0-1build1_amd64.deb ...\nUnpacking python3-libvirt (10.0.0-1build1) ...\nSelecting previously unselected package python3-libxml2:amd64.\nPreparing to unpack .../84-python3-libxml2_2.9.14+dfsg-1.3ubuntu3.3_amd64.deb ...\nUnpacking python3-libxml2:amd64 (2.9.14+dfsg-1.3ubuntu3.3) ...\nSelecting previously unselected package python3-urllib3.\nPreparing to unpack .../85-python3-urllib3_2.0.7-1ubuntu0.2_all.deb ...\nUnpacking python3-urllib3 (2.0.7-1ubuntu0.2) ...\nSelecting previously unselected package python3-requests.\nPreparing to unpack .../86-python3-requests_2.31.0+dfsg-1ubuntu1.1_all.deb ...\nUnpacking python3-requests (2.31.0+dfsg-1ubuntu1.1) ...\nSelecting previously unselected package qemu-utils.\nPreparing to unpack .../87-qemu-utils_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\nUnpacking qemu-utils (1:8.2.2+ds-0ubuntu1.7) ...\nSelecting previously unselected package qemu-block-extra.\nPreparing to unpack .../88-qemu-block-extra_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\nUnpacking qemu-block-extra (1:8.2.2+ds-0ubuntu1.7) ...\nSelecting previously unselected package i965-va-driver:amd64.\nPreparing to unpack .../89-i965-va-driver_2.4.1+dfsg1-1build2_amd64.deb ...\nUnpacking i965-va-driver:amd64 (2.4.1+dfsg1-1build2) ...\nSelecting previously unselected package va-driver-all:amd64.\nPreparing to unpack .../90-va-driver-all_2.20.0-2build1_amd64.deb ...\nUnpacking va-driver-all:amd64 (2.20.0-2build1) ...\nSelecting previously unselected package libvirt-glib-1.0-0:amd64.\nPreparing to unpack .../91-libvirt-glib-1.0-0_5.0.0-2build3_amd64.deb ...\nUnpacking libvirt-glib-1.0-0:amd64 (5.0.0-2build3) ...\nSelecting previously unselected package virt-viewer.\nPreparing to unpack .../92-virt-viewer_11.0-3build2_amd64.deb ...\nUnpacking virt-viewer (11.0-3build2) ...\nSelecting previously unselected package xorriso.\nPreparing to unpack .../93-xorriso_1%3a1.5.6-1.1ubuntu3_amd64.deb ...\nUnpacking xorriso (1:1.5.6-1.1ubuntu3) ...\nSelecting previously unselected package libosinfo-l10n.\nPreparing to unpack .../94-libosinfo-l10n_1.11.0-2build3_all.deb ...\nUnpacking libosinfo-l10n (1.11.0-2build3) ...\nSelecting previously unselected package libosinfo-1.0-0:amd64.\nPreparing to unpack .../95-libosinfo-1.0-0_1.11.0-2build3_amd64.deb ...\nUnpacking libosinfo-1.0-0:amd64 (1.11.0-2build3) ...\nSelecting previously unselected package gir1.2-libosinfo-1.0:amd64.\nPreparing to unpack .../96-gir1.2-libosinfo-1.0_1.11.0-2build3_amd64.deb ...\nUnpacking gir1.2-libosinfo-1.0:amd64 (1.11.0-2build3) ...\nSelecting previously unselected package virtinst.\nPreparing to unpack .../97-virtinst_1%3a4.1.0-3ubuntu0.1_all.deb ...\nUnpacking virtinst (1:4.1.0-3ubuntu0.1) ...\nSetting up python3-pkg-resources (68.1.2-2ubuntu1.2) ...\nSetting up libcdparanoia0:amd64 (3.10.2+debian-14build3) ...\nSetting up pci.ids (0.0~2024.03.31-1ubuntu0.1) ...\nSetting up gir1.2-freedesktop:amd64 (1.80.1-1) ...\nSetting up libogg0:amd64 (1.3.5-3build1) ...\nSetting up libphodav-3.0-common (3.0-8build3) ...\nSetting up libvisual-0.4-0:amd64 (0.4.2-2build1) ...\nSetting up libyajl2:amd64 (2.1.0-5build1) ...\nSetting up libcurl3t64-gnutls:amd64 (8.5.0-2ubuntu10.6) ...\nSetting up libboost-thread1.83.0:amd64 (1.83.0-2.1ubuntu3.1) ...\nSetting up libigdgmm12:amd64 (22.3.17+ds1-1) ...\nSetting up libsoup-3.0-common (3.4.4-5ubuntu0.4) ...\nSetting up libmpg123-0t64:amd64 (1.32.5-1ubuntu1.1) ...\nSetting up libvte-2.91-0:amd64 (0.76.0-1ubuntu0.1) ...\nSetting up libunwind8:amd64 (1.6.2-3build1.1) ...\nSetting up libnfs14:amd64 (5.0.2-1build1) ...\nSetting up liborc-0.4-0t64:amd64 (1:0.4.38-1ubuntu0.1) ...\nSetting up libdw1t64:amd64 (0.190-1.1ubuntu0.1) ...\nSetting up python3-libxml2:amd64 (2.9.14+dfsg-1.3ubuntu3.3) ...\nSetting up python3-chardet (5.2.0+dfsg-1) ...\nSetting up libvirt-glib-1.0-data (5.0.0-2build3) ...\nSetting up libva2:amd64 (2.20.0-2build1) ...\nSetting up python3-certifi (2023.11.17-1) ...\nSetting up libnspr4:amd64 (2:4.35-1.1build1) ...\nSetting up libboost-iostreams1.83.0:amd64 (1.83.0-2.1ubuntu3.1) ...\nSetting up libopus0:amd64 (1.4-1build1) ...\nSetting up intel-media-va-driver:amd64 (24.1.0+dfsg1-1) ...\nSetting up libvorbis0a:amd64 (1.3.7-1build3) ...\nSetting up python3-idna (3.6-2ubuntu0.1) ...\nSetting up usb.ids (2024.03.18-1) ...\nSetting up osinfo-db (0.20250124-0ubuntu0.24.04.1) ...\nSetting up libpcsclite1:amd64 (2.0.3-1build1) ...\nSetting up libfuse3-3:amd64 (3.14.0-5build1) ...\nSetting up libdaxctl1:amd64 (77-2ubuntu2) ...\nSetting up python3-urllib3 (2.0.7-1ubuntu0.2) ...\nSetting up libnuma1:amd64 (2.0.18-1build1) ...\nSetting up libvirt0:amd64 (10.0.0-2ubuntu8.7) ...\nSetting up libaio1t64:amd64 (0.3.113-6build1.1) ...\nSetting up libvirt-glib-1.0-0:amd64 (5.0.0-2build3) ...\nSetting up libisofs6t64:amd64 (1.5.6.pl01-1.1ubuntu2) ...\nSetting up libduktape207:amd64 (2.7.0+tests-0ubuntu3) ...\nSetting up libasyncns0:amd64 (0.8-6build4) ...\nSetting up libusbredirparser1t64:amd64 (0.13.0-2.1build1) ...\nSetting up libtheora0:amd64 (1.1.1+dfsg.1-16.1build3) ...\nSetting up libxslt1.1:amd64 (1.1.39-0exp1ubuntu0.24.04.2) ...\nSetting up libburn4t64:amd64 (1.5.6-1.1build1) ...\nSetting up libndctl6:amd64 (77-2ubuntu2) ...\nSetting up librdmacm1t64:amd64 (50.0-2ubuntu0.2) ...\nSetting up libjson-glib-1.0-common (1.8.0-2build2) ...\nSetting up libflac12t64:amd64 (1.4.3+ds-2.1ubuntu2) ...\nSetting up libusb-1.0-0:amd64 (2:1.0.27-1) ...\nSetting up mesa-va-drivers:amd64 (24.2.8-1ubuntu1~24.04.1) ...\nSetting up glib-networking-common (2.80.0-1build1) ...\nSetting up liburing2:amd64 (2.5-1build1) ...\nSetting up libiscsi7:amd64 (1.19.0-3build4) ...\nSetting up libisoburn1t64:amd64 (1:1.5.6-1.1ubuntu3) ...\nSetting up xorriso (1:1.5.6-1.1ubuntu3) ...\nSetting up libpmem1:amd64 (1.13.1-1.1ubuntu2) ...\nSetting up libva-x11-2:amd64 (2.20.0-2build1) ...\nSetting up iso-codes (4.16.0-1) ...\nSetting up libpolkit-gobject-1-0:amd64 (124-2ubuntu1.24.04.2) ...\nSetting up libgstreamer1.0-0:amd64 (1.24.2-1ubuntu0.1) ...\nSetcap worked! gst-ptp-helper is not suid!\nSetting up libmp3lame0:amd64 (3.100-6build1) ...\nSetting up i965-va-driver:amd64 (2.4.1+dfsg1-1build2) ...\nSetting up libosinfo-l10n (1.11.0-2build3) ...\nSetting up libvorbisenc2:amd64 (1.3.7-1build3) ...\nSetting up librados2 (19.2.0-0ubuntu0.24.04.2) ...\nSetting up libproxy1v5:amd64 (0.5.4-4build1) ...\nSetting up python3-libvirt (10.0.0-1build1) ...\nSetting up libvirt-clients (10.0.0-2ubuntu8.7) ...\nSetting up spice-client-glib-usb-acl-helper (0.42-2ubuntu2) ...\nSetting up libgstreamer-plugins-base1.0-0:amd64 (1.24.2-1ubuntu0.2) ...\nSetting up libnss3:amd64 (2:3.98-1build1) ...\nSetting up libcacard0:amd64 (1:2.8.0-3build4) ...\nSetting up libusbredirhost1t64:amd64 (0.13.0-2.1build1) ...\nSetting up libjson-glib-1.0-0:amd64 (1.8.0-2build2) ...\nSetting up gstreamer1.0-plugins-base:amd64 (1.24.2-1ubuntu0.2) ...\nSetting up libvirt-l10n (10.0.0-2ubuntu8.7) ...\nSetting up va-driver-all:amd64 (2.20.0-2build1) ...\nSetting up python3-requests (2.31.0+dfsg-1ubuntu1.1) ...\nSetting up libpmemobj1:amd64 (1.13.1-1.1ubuntu2) ...\nSetting up librbd1 (19.2.0-0ubuntu0.24.04.2) ...\nSetting up libsndfile1:amd64 (1.2.2-1ubuntu5.24.04.1) ...\nSetting up qemu-utils (1:8.2.2+ds-0ubuntu1.7) ...\nSetting up qemu-block-extra (1:8.2.2+ds-0ubuntu1.7) ...\nCreated symlink /etc/systemd/system/multi-user.target.wants/run-qemu.mount → /usr/lib/systemd/system/run-qemu.mount\n.\nSetting up glib-networking-services (2.80.0-1build1) ...\nSetting up libpulse0:amd64 (1:16.1+dfsg1-2ubuntu10.1) ...\nSetting up libgvnc-1.0-0:amd64 (1.3.1-1build2) ...\nSetting up glib-networking:amd64 (2.80.0-1build1) ...\nSetting up libgtk-vnc-2.0-0:amd64 (1.3.1-1build2) ...\nSetting up libsoup-3.0-0:amd64 (3.4.4-5ubuntu0.4) ...\nSetting up libphodav-3.0-0:amd64 (3.0-8build3) ...\nSetting up libosinfo-1.0-0:amd64 (1.11.0-2build3) ...\nSetting up gir1.2-libosinfo-1.0:amd64 (1.11.0-2build3) ...\nSetting up libspice-client-glib-2.0-8:amd64 (0.42-2ubuntu2) ...\nSetting up virtinst (1:4.1.0-3ubuntu0.1) ...\nSetting up libspice-client-gtk-3.0-5:amd64 (0.42-2ubuntu2) ...\nSetting up virt-viewer (11.0-3build2) ...\nProcessing triggers for libc-bin (2.39-0ubuntu8.4) ...\nProcessing triggers for man-db (2.12.0-4build2) ...\nProcessing triggers for libglib2.0-0t64:amd64 (2.80.0-6ubuntu3.4) ...\nProcessing triggers for shared-mime-info (2.4-4) ...\nProcessing triggers for hicolor-icon-theme (0.17-2) ...\n📦[waylon@ubuntu ~]$ virt-install --version\nvirsh list --all\n4.1.0\nerror: failed to connect to the hypervisor\nerror: binary '/usr/sbin/libvirtd' does not exist in $PATH: No such file or directory\n\n📦[waylon@ubuntu ~]$ exit\nlogout\nwaylon@razorcrest:~$ distrobox enter --additional-flags \"--device /dev/kvm\" ubuntu\nError: unknown flag: --device\nSee 'podman exec --help'\nwaylon@razorcrest:~$ distrobox enter ubuntu\n📦[waylon@ubuntu ~]$ ls -l /run/libvirt/\ncommon/               libvirt-sock          nodedev/              secrets/              virtlogd-admin-sock\nhostdevmgr/           libvirt-sock-ro       nwfilter/             storage/              virtlogd-sock\ninterface/            lxc/                  nwfilter-binding/     virtlockd-admin-sock\nlibvirt-admin-sock    network/              qemu/                 virtlockd-sock\n📦[waylon@ubuntu ~]$ ls -l /run/libvirt/libvirt-sock\nsrw-rw-rw-. 1 nobody nogroup 0 Jun 27 11:09 /run/libvirt/libvirt-sock\n📦[waylon@ubuntu ~]$ sudo usermod -aG libvirt $USER\nusermod: group 'libvirt' does not exist\n📦[waylon@ubuntu ~]$ export LIBVIRT_DEFAULT_URI=\"qemu+unix:///system\"\nvirsh list --all\n Id   Name   State\n--------------------\n\n📦[waylon@ubuntu ~]$ ls -l /run/libvirt/libvirt-sock\nsrw-rw-rw-. 1 nobody nogroup 0 Jun 27 11:09 /run/libvirt/libvirt-sock\n📦[waylon@ubuntu ~]$ virt-install --version\nvirsh list --all\n4.1.0\n Id   Name   State\n--------------------\n\n📦[waylon@ubuntu ~]$ sudo apt update\nsudo apt install virt-manager -y\nHit:1 http://security.ubuntu.com/ubuntu noble-security InRelease\nHit:2 http://archive.ubuntu.com/ubuntu noble InRelease\nHit:3 http://archive.ubuntu.com/ubuntu noble-updates InRelease\nHit:4 http://archive.ubuntu.com/ubuntu noble-backports InRelease\nReading package lists... Done\nBuilding dependency tree... Done\nReading state information... Done\n4 packages can be upgraded. Run 'apt list --upgradable' to see them.\nReading package lists... Done\nBuilding dependency tree... Done\nReading state information... Done\nThe following additional packages will be installed:\n  acl alsa-topology-conf alsa-ucm-conf cpu-checker dmeventd dmidecode dns-root-data dnsmasq-base gettext-base\n  gir1.2-atk-1.0 gir1.2-ayatanaappindicator3-0.1 gir1.2-gdkpixbuf-2.0 gir1.2-gstreamer-1.0 gir1.2-gtk-3.0\n  gir1.2-gtk-vnc-2.0 gir1.2-gtksource-4 gir1.2-harfbuzz-0.0 gir1.2-libvirt-glib-1.0 gir1.2-pango-1.0\n  gir1.2-spiceclientglib-2.0 gir1.2-spiceclientgtk-3.0 gir1.2-vte-2.91 gstreamer1.0-plugins-good gstreamer1.0-x\n  iptables ipxe-qemu ipxe-qemu-256k-compat-efi-roms libaa1 libasound2-data libasound2t64 libavc1394-0\n  libayatana-appindicator3-1 libayatana-ido3-0.4-0 libayatana-indicator3-7 libbrlapi0.8 libcaca0\n  libdbusmenu-glib4 libdbusmenu-gtk3-4 libdecor-0-0 libdecor-0-plugin-1-gtk libdevmapper-event1.02.1 libdv4t64\n  libfdt1 libgstreamer-plugins-good1.0-0 libgtksourceview-4-0 libgtksourceview-4-common libgudev-1.0-0\n  libharfbuzz-gobject0 libiec61883-0 libip4tc2 libip6tc2 libjack-jackd2-0 liblvm2cmd2.03 libnetfilter-conntrack3\n  libnfnetlink0 libnftables1 libnftnl11 libnss-mymachines libpangoxft-1.0-0 libparted2t64 libpipewire-0.3-0t64\n  libpipewire-0.3-common libpolkit-agent-1-0 libraw1394-11 libsamplerate0 libsdl2-2.0-0 libshout3 libslang2\n  libslirp0 libspa-0.2-modules libspeex1 libspice-server1 libtag1v5 libtag1v5-vanilla libtpms0 libtwolame0\n  libv4l-0t64 libv4lconvert0t64 libvirglrenderer1 libvirt-daemon libvirt-daemon-config-network\n  libvirt-daemon-config-nwfilter libvirt-daemon-driver-qemu libvirt-daemon-system libvirt-daemon-system-systemd\n  libvpx9 libwavpack1 libwebrtc-audio-processing1 libxft2 libxml2-utils libxss1 libxv1 logrotate lvm2 mdevctl\n  msr-tools netcat-openbsd nftables ovmf parted polkitd python3-cairo python3-gi-cairo qemu-system-common\n  qemu-system-data qemu-system-gui qemu-system-modules-opengl qemu-system-modules-spice qemu-system-x86 seabios\n  sgml-base swtpm swtpm-tools systemd-container systemd-hwe-hwdb thin-provisioning-tools udev xml-core\nSuggested packages:\n  firewalld kmod alsa-utils libasound2-plugins libdv-bin oss-compat jackd2 libparted-dev libparted-i18n pipewire\n  libraw1394-doc xdg-utils speex gstreamer1.0-libav gstreamer1.0-plugins-ugly\n  libvirt-daemon-driver-storage-gluster libvirt-daemon-driver-storage-iscsi-direct\n  libvirt-daemon-driver-storage-rbd libvirt-daemon-driver-storage-zfs libvirt-daemon-driver-lxc\n  libvirt-daemon-driver-vbox libvirt-daemon-driver-xen numad passt apparmor auditd nfs-common open-iscsi pm-utils\n  systemtap zfsutils bsd-mailx | mailx parted-doc polkitd-pkla samba vde2 sgml-base-doc trousers gir1.2-secret-1\n  gnome-keyring python3-guestfs ssh-askpass debhelper\nThe following NEW packages will be installed:\n  acl alsa-topology-conf alsa-ucm-conf cpu-checker dmeventd dmidecode dns-root-data dnsmasq-base gettext-base\n  gir1.2-atk-1.0 gir1.2-ayatanaappindicator3-0.1 gir1.2-gdkpixbuf-2.0 gir1.2-gstreamer-1.0 gir1.2-gtk-3.0\n  gir1.2-gtk-vnc-2.0 gir1.2-gtksource-4 gir1.2-harfbuzz-0.0 gir1.2-libvirt-glib-1.0 gir1.2-pango-1.0\n  gir1.2-spiceclientglib-2.0 gir1.2-spiceclientgtk-3.0 gir1.2-vte-2.91 gstreamer1.0-plugins-good gstreamer1.0-x\n  iptables ipxe-qemu ipxe-qemu-256k-compat-efi-roms libaa1 libasound2-data libasound2t64 libavc1394-0\n  libayatana-appindicator3-1 libayatana-ido3-0.4-0 libayatana-indicator3-7 libbrlapi0.8 libcaca0\n  libdbusmenu-glib4 libdbusmenu-gtk3-4 libdecor-0-0 libdecor-0-plugin-1-gtk libdevmapper-event1.02.1 libdv4t64\n  libfdt1 libgstreamer-plugins-good1.0-0 libgtksourceview-4-0 libgtksourceview-4-common libgudev-1.0-0\n  libharfbuzz-gobject0 libiec61883-0 libip4tc2 libip6tc2 libjack-jackd2-0 liblvm2cmd2.03 libnetfilter-conntrack3\n  libnfnetlink0 libnftables1 libnftnl11 libnss-mymachines libpangoxft-1.0-0 libparted2t64 libpipewire-0.3-0t64\n  libpipewire-0.3-common libpolkit-agent-1-0 libraw1394-11 libsamplerate0 libsdl2-2.0-0 libshout3 libslang2\n  libslirp0 libspa-0.2-modules libspeex1 libspice-server1 libtag1v5 libtag1v5-vanilla libtpms0 libtwolame0\n  libv4l-0t64 libv4lconvert0t64 libvirglrenderer1 libvirt-daemon libvirt-daemon-config-network\n  libvirt-daemon-config-nwfilter libvirt-daemon-driver-qemu libvirt-daemon-system libvirt-daemon-system-systemd\n  libvpx9 libwavpack1 libwebrtc-audio-processing1 libxft2 libxml2-utils libxss1 libxv1 logrotate lvm2 mdevctl\n  msr-tools netcat-openbsd nftables ovmf parted polkitd python3-cairo python3-gi-cairo qemu-system-common\n  qemu-system-data qemu-system-gui qemu-system-modules-opengl qemu-system-modules-spice qemu-system-x86 seabios\n  sgml-base swtpm swtpm-tools systemd-container systemd-hwe-hwdb thin-provisioning-tools udev virt-manager\n  xml-core\n0 upgraded, 119 newly installed, 0 to remove and 4 not upgraded.\nNeed to get 43.2 MB of archives.\nAfter this operation, 180 MB of additional disk space will be used.\nGet:1 http://archive.ubuntu.com/ubuntu noble/main amd64 sgml-base all 1.31 [11.4 kB]\nGet:2 http://archive.ubuntu.com/ubuntu noble/main amd64 libslang2 amd64 2.3.3-3build2 [506 kB]\nGet:3 http://archive.ubuntu.com/ubuntu noble/main amd64 logrotate amd64 3.21.0-2build1 [52.2 kB]\nGet:4 http://archive.ubuntu.com/ubuntu noble/main amd64 netcat-openbsd amd64 1.226-1ubuntu2 [44.3 kB]\nGet:5 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 udev amd64 255.4-1ubuntu8.8 [1,874 kB]\nGet:6 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 systemd-hwe-hwdb all 255.1.4 [3,200 B]\nGet:7 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 dmidecode amd64 3.5-3ubuntu0.1 [73.0 kB]\nGet:8 http://archive.ubuntu.com/ubuntu noble/main amd64 gettext-base amd64 0.21-14ubuntu2 [38.4 kB]\nGet:9 http://archive.ubuntu.com/ubuntu noble/main amd64 libip4tc2 amd64 1.8.10-3ubuntu2 [23.3 kB]\nGet:10 http://archive.ubuntu.com/ubuntu noble/main amd64 libip6tc2 amd64 1.8.10-3ubuntu2 [23.7 kB]\nGet:11 http://archive.ubuntu.com/ubuntu noble/main amd64 libnfnetlink0 amd64 1.0.2-2build1 [14.8 kB]\nGet:12 http://archive.ubuntu.com/ubuntu noble/main amd64 libnetfilter-conntrack3 amd64 1.0.9-6build1 [45.2 kB]\nGet:13 http://archive.ubuntu.com/ubuntu noble/main amd64 libnftnl11 amd64 1.2.6-2build1 [66.0 kB]\nGet:14 http://archive.ubuntu.com/ubuntu noble/main amd64 iptables amd64 1.8.10-3ubuntu2 [381 kB]\nGet:15 http://archive.ubuntu.com/ubuntu noble/main amd64 libnftables1 amd64 1.0.9-1build1 [358 kB]\nGet:16 http://archive.ubuntu.com/ubuntu noble/main amd64 libparted2t64 amd64 3.6-4build1 [152 kB]\nGet:17 http://archive.ubuntu.com/ubuntu noble/main amd64 nftables amd64 1.0.9-1build1 [69.8 kB]\nGet:18 http://archive.ubuntu.com/ubuntu noble/main amd64 parted amd64 3.6-4build1 [43.3 kB]\nGet:19 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 acl amd64 2.3.2-1build1.1 [39.4 kB]\nGet:20 http://archive.ubuntu.com/ubuntu noble/main amd64 alsa-topology-conf all 1.2.5.1-2 [15.5 kB]\nGet:21 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libasound2-data all 1.2.11-1ubuntu0.1 [21.1 kB]\nGet:22 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libasound2t64 amd64 1.2.11-1ubuntu0.1 [399 kB]\nGet:23 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 alsa-ucm-conf all 1.2.10-1ubuntu5.7 [66.4 kB]\nGet:24 http://archive.ubuntu.com/ubuntu noble/main amd64 msr-tools amd64 1.3-5build1 [9,610 B]\nGet:25 http://archive.ubuntu.com/ubuntu noble/main amd64 cpu-checker amd64 0.7-1.3build2 [6,148 B]\nGet:26 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdevmapper-event1.02.1 amd64 2:1.02.185-3ubuntu3.2 [12.6 kB]\nGet:27 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 liblvm2cmd2.03 amd64 2.03.16-3ubuntu3.2 [797 kB]\nGet:28 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 dmeventd amd64 2:1.02.185-3ubuntu3.2 [38.0 kB]\nGet:29 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 dns-root-data all 2024071801~ubuntu0.24.04.1 [5,918 B]\nGet:30 http://archive.ubuntu.com/ubuntu noble/main amd64 dnsmasq-base amd64 2.90-2build2 [375 kB]\nGet:31 http://archive.ubuntu.com/ubuntu noble/main amd64 gir1.2-atk-1.0 amd64 2.52.0-1build1 [23.1 kB]\nGet:32 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gir1.2-gdkpixbuf-2.0 amd64 2.42.10+dfsg-3ubuntu3.1 [9,486 B]\nGet:33 http://archive.ubuntu.com/ubuntu noble/main amd64 libharfbuzz-gobject0 amd64 8.3.0-2build2 [34.3 kB]\nGet:34 http://archive.ubuntu.com/ubuntu noble/main amd64 gir1.2-harfbuzz-0.0 amd64 8.3.0-2build2 [44.5 kB]\nGet:35 http://archive.ubuntu.com/ubuntu noble/main amd64 libxft2 amd64 2.3.6-1build1 [45.3 kB]\nGet:36 http://archive.ubuntu.com/ubuntu noble/main amd64 libpangoxft-1.0-0 amd64 1.52.1+ds-1build1 [20.3 kB]\nGet:37 http://archive.ubuntu.com/ubuntu noble/main amd64 gir1.2-pango-1.0 amd64 1.52.1+ds-1build1 [34.8 kB]\nGet:38 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gir1.2-gtk-3.0 amd64 3.24.41-4ubuntu1.3 [245 kB]\nGet:39 http://archive.ubuntu.com/ubuntu noble/main amd64 libayatana-ido3-0.4-0 amd64 0.10.1-1build2 [56.6 kB]\nGet:40 http://archive.ubuntu.com/ubuntu noble/main amd64 libayatana-indicator3-7 amd64 0.9.4-1build1 [31.7 kB]\nGet:41 http://archive.ubuntu.com/ubuntu noble/main amd64 libdbusmenu-glib4 amd64 18.10.20180917~bzr492+repack1-3.1ubuntu5 [43.0 kB]\nGet:42 http://archive.ubuntu.com/ubuntu noble/main amd64 libdbusmenu-gtk3-4 amd64 18.10.20180917~bzr492+repack1-3.1ubuntu5 [27.6 kB]\nGet:43 http://archive.ubuntu.com/ubuntu noble/main amd64 libayatana-appindicator3-1 amd64 0.5.93-1build3 [24.7 kB]\nGet:44 http://archive.ubuntu.com/ubuntu noble/main amd64 gir1.2-ayatanaappindicator3-0.1 amd64 0.5.93-1build3 [5,838 B]\nGet:45 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gir1.2-gstreamer-1.0 amd64 1.24.2-1ubuntu0.1 [88.4 kB]\nGet:46 http://archive.ubuntu.com/ubuntu noble/universe amd64 gir1.2-gtk-vnc-2.0 amd64 1.3.1-1build2 [12.1 kB]\nGet:47 http://archive.ubuntu.com/ubuntu noble/universe amd64 libgtksourceview-4-common all 4.8.4-5build4 [590 kB]\nGet:48 http://archive.ubuntu.com/ubuntu noble/universe amd64 libgtksourceview-4-0 amd64 4.8.4-5build4 [233 kB]\nGet:49 http://archive.ubuntu.com/ubuntu noble/universe amd64 gir1.2-gtksource-4 amd64 4.8.4-5build4 [20.3 kB]\nGet:50 http://archive.ubuntu.com/ubuntu noble/universe amd64 gir1.2-spiceclientglib-2.0 amd64 0.42-2ubuntu2 [14.4 kB]\nGet:51 http://archive.ubuntu.com/ubuntu noble/universe amd64 gir1.2-spiceclientgtk-3.0 amd64 0.42-2ubuntu2 [5,610 B]\nGet:52 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gir1.2-vte-2.91 amd64 0.76.0-1ubuntu0.1 [11.5 kB]\nGet:53 http://archive.ubuntu.com/ubuntu noble/main amd64 libaa1 amd64 1.4p5-51.1 [49.9 kB]\nGet:54 http://archive.ubuntu.com/ubuntu noble/main amd64 libraw1394-11 amd64 2.1.2-2build3 [26.2 kB]\nGet:55 http://archive.ubuntu.com/ubuntu noble/main amd64 libavc1394-0 amd64 0.5.4-5build3 [15.4 kB]\nGet:56 http://archive.ubuntu.com/ubuntu noble/main amd64 libcaca0 amd64 0.99.beta20-4build2 [208 kB]\nGet:57 http://archive.ubuntu.com/ubuntu noble/main amd64 libdv4t64 amd64 1.0.0-17.1build1 [63.2 kB]\nGet:58 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgstreamer-plugins-good1.0-0 amd64 1.24.2-1ubuntu1.1 [32.9 kB]\nGet:59 http://archive.ubuntu.com/ubuntu noble/main amd64 libgudev-1.0-0 amd64 1:238-5ubuntu1 [15.9 kB]\nGet:60 http://archive.ubuntu.com/ubuntu noble/main amd64 libiec61883-0 amd64 1.2.0-6build1 [24.5 kB]\nGet:61 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libspeex1 amd64 1.2.1-2ubuntu2.24.04.1 [59.6 kB]\nGet:62 http://archive.ubuntu.com/ubuntu noble/main amd64 libshout3 amd64 2.4.6-1build2 [50.3 kB]\nGet:63 http://archive.ubuntu.com/ubuntu noble/main amd64 libtag1v5-vanilla amd64 1.13.1-1build1 [326 kB]\nGet:64 http://archive.ubuntu.com/ubuntu noble/main amd64 libtag1v5 amd64 1.13.1-1build1 [11.7 kB]\nGet:65 http://archive.ubuntu.com/ubuntu noble/main amd64 libtwolame0 amd64 0.4.0-2build3 [52.3 kB]\nGet:66 http://archive.ubuntu.com/ubuntu noble/main amd64 libv4lconvert0t64 amd64 1.26.1-4build3 [87.6 kB]\nGet:67 http://archive.ubuntu.com/ubuntu noble/main amd64 libv4l-0t64 amd64 1.26.1-4build3 [46.9 kB]\nGet:68 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvpx9 amd64 1.14.0-1ubuntu2.2 [1,143 kB]\nGet:69 http://archive.ubuntu.com/ubuntu noble/main amd64 libwavpack1 amd64 5.6.0-1build1 [84.6 kB]\nGet:70 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gstreamer1.0-plugins-good amd64 1.24.2-1ubuntu1.1 [2,238 kB]\nGet:71 http://archive.ubuntu.com/ubuntu noble/main amd64 libxv1 amd64 2:1.0.11-1.1build1 [10.7 kB]\nGet:72 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 gstreamer1.0-x amd64 1.24.2-1ubuntu0.2 [85.0 kB]\nGet:73 http://archive.ubuntu.com/ubuntu noble/main amd64 ipxe-qemu all 1.21.1+git-20220113.fbbdc3926-0ubuntu2 [1,565 kB]\nGet:74 http://archive.ubuntu.com/ubuntu noble/main amd64 ipxe-qemu-256k-compat-efi-roms all 1.0.0+git-20150424.a25a16d-0ubuntu5 [548 kB]\nGet:75 http://archive.ubuntu.com/ubuntu noble/main amd64 libbrlapi0.8 amd64 6.6-4ubuntu5 [31.4 kB]\nGet:76 http://archive.ubuntu.com/ubuntu noble/main amd64 libdecor-0-0 amd64 0.2.2-1build2 [16.5 kB]\nGet:77 http://archive.ubuntu.com/ubuntu noble/main amd64 libdecor-0-plugin-1-gtk amd64 0.2.2-1build2 [22.2 kB]\nGet:78 http://archive.ubuntu.com/ubuntu noble/main amd64 libsamplerate0 amd64 0.2.2-4build1 [1,344 kB]\nGet:79 http://archive.ubuntu.com/ubuntu noble/main amd64 libjack-jackd2-0 amd64 1.9.21~dfsg-3ubuntu3 [289 kB]\nGet:80 http://archive.ubuntu.com/ubuntu noble/main amd64 libwebrtc-audio-processing1 amd64 0.3.1-0ubuntu6 [290 kB]\nGet:81 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libspa-0.2-modules amd64 1.0.5-1ubuntu3 [626 kB]\nGet:82 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpipewire-0.3-0t64 amd64 1.0.5-1ubuntu3 [252 kB]\nGet:83 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpipewire-0.3-common all 1.0.5-1ubuntu3 [18.8 kB]\nGet:84 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpolkit-agent-1-0 amd64 124-2ubuntu1.24.04.2 [17.4 kB]\nGet:85 http://archive.ubuntu.com/ubuntu noble/main amd64 libxss1 amd64 1:1.2.3-1build3 [7,204 B]\nGet:86 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsdl2-2.0-0 amd64 2.30.0+dfsg-1ubuntu3.1 [686 kB]\nGet:87 http://archive.ubuntu.com/ubuntu noble/main amd64 libslirp0 amd64 4.7.0-1ubuntu3 [63.8 kB]\nGet:88 http://archive.ubuntu.com/ubuntu noble/main amd64 libspice-server1 amd64 0.15.1-1build2 [349 kB]\nGet:89 http://archive.ubuntu.com/ubuntu noble/main amd64 libtpms0 amd64 0.9.3-0ubuntu4 [373 kB]\nGet:90 http://archive.ubuntu.com/ubuntu noble/main amd64 libvirglrenderer1 amd64 1.0.0-1ubuntu2 [226 kB]\nGet:91 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-daemon-driver-qemu amd64 10.0.0-2ubuntu8.7 [740 kB]\nGet:92 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-daemon amd64 10.0.0-2ubuntu8.7 [431 kB]\nGet:93 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-daemon-config-network all 10.0.0-2ubuntu8.7 [3,120 B]\nGet:94 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-daemon-config-nwfilter all 10.0.0-2ubuntu8.7 [6,042 B]\nGet:95 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 systemd-container amd64 255.4-1ubuntu8.8 [417 kB]\nGet:96 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-daemon-system-systemd all 10.0.0-2ubuntu8.7 [1,376 B]\nGet:97 http://archive.ubuntu.com/ubuntu noble/main amd64 xml-core all 0.19 [20.3 kB]\nGet:98 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 polkitd amd64 124-2ubuntu1.24.04.2 [95.2 kB]\nGet:99 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libvirt-daemon-system amd64 10.0.0-2ubuntu8.7 [49.6 kB]\nGet:100 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libxml2-utils amd64 2.9.14+dfsg-1.3ubuntu3.3 [39.4 kB]\nGet:101 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 lvm2 amd64 2.03.16-3ubuntu3.2 [1,186 kB]\nGet:102 http://archive.ubuntu.com/ubuntu noble/main amd64 mdevctl amd64 1.3.0-1ubuntu2 [936 kB]\nGet:103 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-cairo amd64 1.25.1-2build2 [119 kB]\nGet:104 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-gi-cairo amd64 3.48.2-1 [8,132 B]\nGet:105 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-system-common amd64 1:8.2.2+ds-0ubuntu1.7 [1,253 kB]\nGet:106 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-system-data all 1:8.2.2+ds-0ubuntu1.7 [1,793 kB]\nGet:107 http://archive.ubuntu.com/ubuntu noble/main amd64 libfdt1 amd64 1.7.0-2build1 [20.1 kB]\nGet:108 http://archive.ubuntu.com/ubuntu noble/main amd64 seabios all 1.16.3-2 [175 kB]\nGet:109 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-system-x86 amd64 1:8.2.2+ds-0ubuntu1.7 [11.2 MB]\nGet:110 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-system-modules-opengl amd64 1:8.2.2+ds-0ubuntu1.7 [184 kB]\nGet:111 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-system-gui amd64 1:8.2.2+ds-0ubuntu1.7 [314 kB]\nGet:112 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 qemu-system-modules-spice amd64 1:8.2.2+ds-0ubuntu1.7 [70.2 kB]\nGet:113 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 swtpm amd64 0.7.3-0ubuntu5.24.04.1 [53.1 kB]\nGet:114 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 swtpm-tools amd64 0.7.3-0ubuntu5.24.04.1 [92.9 kB]\nGet:115 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 thin-provisioning-tools amd64 0.9.0-2ubuntu5.1 [436 kB]\nGet:116 http://archive.ubuntu.com/ubuntu noble/universe amd64 gir1.2-libvirt-glib-1.0 amd64 5.0.0-2build3 [32.6 kB]\nGet:117 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 virt-manager all 1:4.1.0-3ubuntu0.1 [263 kB]\nGet:118 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libnss-mymachines amd64 255.4-1ubuntu8.8 [153 kB]\nGet:119 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 ovmf all 2024.02-2ubuntu0.4 [4,571 kB]\nFetched 43.2 MB in 5s (9,539 kB/s)\nExtracting templates from packages: 100%\nPreconfiguring packages ...\nSelecting previously unselected package sgml-base.\n(Reading database ... 30439 files and directories currently installed.)\nPreparing to unpack .../000-sgml-base_1.31_all.deb ...\nUnpacking sgml-base (1.31) ...\nSelecting previously unselected package libslang2:amd64.\nPreparing to unpack .../001-libslang2_2.3.3-3build2_amd64.deb ...\nUnpacking libslang2:amd64 (2.3.3-3build2) ...\nSelecting previously unselected package logrotate.\nPreparing to unpack .../002-logrotate_3.21.0-2build1_amd64.deb ...\nUnpacking logrotate (3.21.0-2build1) ...\nSelecting previously unselected package netcat-openbsd.\nPreparing to unpack .../003-netcat-openbsd_1.226-1ubuntu2_amd64.deb ...\nUnpacking netcat-openbsd (1.226-1ubuntu2) ...\nSelecting previously unselected package udev.\nPreparing to unpack .../004-udev_255.4-1ubuntu8.8_amd64.deb ...\nUnpacking udev (255.4-1ubuntu8.8) ...\nSelecting previously unselected package systemd-hwe-hwdb.\nPreparing to unpack .../005-systemd-hwe-hwdb_255.1.4_all.deb ...\nUnpacking systemd-hwe-hwdb (255.1.4) ...\nSelecting previously unselected package dmidecode.\nPreparing to unpack .../006-dmidecode_3.5-3ubuntu0.1_amd64.deb ...\nUnpacking dmidecode (3.5-3ubuntu0.1) ...\nSelecting previously unselected package gettext-base.\nPreparing to unpack .../007-gettext-base_0.21-14ubuntu2_amd64.deb ...\nUnpacking gettext-base (0.21-14ubuntu2) ...\nSelecting previously unselected package libip4tc2:amd64.\nPreparing to unpack .../008-libip4tc2_1.8.10-3ubuntu2_amd64.deb ...\nUnpacking libip4tc2:amd64 (1.8.10-3ubuntu2) ...\nSelecting previously unselected package libip6tc2:amd64.\nPreparing to unpack .../009-libip6tc2_1.8.10-3ubuntu2_amd64.deb ...\nUnpacking libip6tc2:amd64 (1.8.10-3ubuntu2) ...\nSelecting previously unselected package libnfnetlink0:amd64.\nPreparing to unpack .../010-libnfnetlink0_1.0.2-2build1_amd64.deb ...\nUnpacking libnfnetlink0:amd64 (1.0.2-2build1) ...\nSelecting previously unselected package libnetfilter-conntrack3:amd64.\nPreparing to unpack .../011-libnetfilter-conntrack3_1.0.9-6build1_amd64.deb ...\nUnpacking libnetfilter-conntrack3:amd64 (1.0.9-6build1) ...\nSelecting previously unselected package libnftnl11:amd64.\nPreparing to unpack .../012-libnftnl11_1.2.6-2build1_amd64.deb ...\nUnpacking libnftnl11:amd64 (1.2.6-2build1) ...\nSelecting previously unselected package iptables.\nPreparing to unpack .../013-iptables_1.8.10-3ubuntu2_amd64.deb ...\nUnpacking iptables (1.8.10-3ubuntu2) ...\nSelecting previously unselected package libnftables1:amd64.\nPreparing to unpack .../014-libnftables1_1.0.9-1build1_amd64.deb ...\nUnpacking libnftables1:amd64 (1.0.9-1build1) ...\nSelecting previously unselected package libparted2t64:amd64.\nPreparing to unpack .../015-libparted2t64_3.6-4build1_amd64.deb ...\nAdding 'diversion of /lib/x86_64-linux-gnu/libparted.so.2 to /lib/x86_64-linux-gnu/libparted.so.2.usr-is-merged by\nlibparted2t64'\nAdding 'diversion of /lib/x86_64-linux-gnu/libparted.so.2.0.5 to /lib/x86_64-linux-gnu/libparted.so.2.0.5.usr-is-me\nrged by libparted2t64'\nUnpacking libparted2t64:amd64 (3.6-4build1) ...\nSelecting previously unselected package nftables.\nPreparing to unpack .../016-nftables_1.0.9-1build1_amd64.deb ...\nUnpacking nftables (1.0.9-1build1) ...\nSelecting previously unselected package parted.\nPreparing to unpack .../017-parted_3.6-4build1_amd64.deb ...\nUnpacking parted (3.6-4build1) ...\nSelecting previously unselected package acl.\nPreparing to unpack .../018-acl_2.3.2-1build1.1_amd64.deb ...\nUnpacking acl (2.3.2-1build1.1) ...\nSelecting previously unselected package alsa-topology-conf.\nPreparing to unpack .../019-alsa-topology-conf_1.2.5.1-2_all.deb ...\nUnpacking alsa-topology-conf (1.2.5.1-2) ...\nSelecting previously unselected package libasound2-data.\nPreparing to unpack .../020-libasound2-data_1.2.11-1ubuntu0.1_all.deb ...\nUnpacking libasound2-data (1.2.11-1ubuntu0.1) ...\nSelecting previously unselected package libasound2t64:amd64.\nPreparing to unpack .../021-libasound2t64_1.2.11-1ubuntu0.1_amd64.deb ...\nUnpacking libasound2t64:amd64 (1.2.11-1ubuntu0.1) ...\nSelecting previously unselected package alsa-ucm-conf.\nPreparing to unpack .../022-alsa-ucm-conf_1.2.10-1ubuntu5.7_all.deb ...\nUnpacking alsa-ucm-conf (1.2.10-1ubuntu5.7) ...\nSelecting previously unselected package msr-tools.\nPreparing to unpack .../023-msr-tools_1.3-5build1_amd64.deb ...\nUnpacking msr-tools (1.3-5build1) ...\nSelecting previously unselected package cpu-checker.\nPreparing to unpack .../024-cpu-checker_0.7-1.3build2_amd64.deb ...\nUnpacking cpu-checker (0.7-1.3build2) ...\nSelecting previously unselected package libdevmapper-event1.02.1:amd64.\nPreparing to unpack .../025-libdevmapper-event1.02.1_2%3a1.02.185-3ubuntu3.2_amd64.deb ...\nUnpacking libdevmapper-event1.02.1:amd64 (2:1.02.185-3ubuntu3.2) ...\nSelecting previously unselected package liblvm2cmd2.03:amd64.\nPreparing to unpack .../026-liblvm2cmd2.03_2.03.16-3ubuntu3.2_amd64.deb ...\nUnpacking liblvm2cmd2.03:amd64 (2.03.16-3ubuntu3.2) ...\nSelecting previously unselected package dmeventd.\nPreparing to unpack .../027-dmeventd_2%3a1.02.185-3ubuntu3.2_amd64.deb ...\nUnpacking dmeventd (2:1.02.185-3ubuntu3.2) ...\nSelecting previously unselected package dns-root-data.\nPreparing to unpack .../028-dns-root-data_2024071801~ubuntu0.24.04.1_all.deb ...\nUnpacking dns-root-data (2024071801~ubuntu0.24.04.1) ...\nSelecting previously unselected package dnsmasq-base.\nPreparing to unpack .../029-dnsmasq-base_2.90-2build2_amd64.deb ...\nUnpacking dnsmasq-base (2.90-2build2) ...\nSelecting previously unselected package gir1.2-atk-1.0:amd64.\nPreparing to unpack .../030-gir1.2-atk-1.0_2.52.0-1build1_amd64.deb ...\nUnpacking gir1.2-atk-1.0:amd64 (2.52.0-1build1) ...\nSelecting previously unselected package gir1.2-gdkpixbuf-2.0:amd64.\nPreparing to unpack .../031-gir1.2-gdkpixbuf-2.0_2.42.10+dfsg-3ubuntu3.1_amd64.deb ...\nUnpacking gir1.2-gdkpixbuf-2.0:amd64 (2.42.10+dfsg-3ubuntu3.1) ...\nSelecting previously unselected package libharfbuzz-gobject0:amd64.\nPreparing to unpack .../032-libharfbuzz-gobject0_8.3.0-2build2_amd64.deb ...\nUnpacking libharfbuzz-gobject0:amd64 (8.3.0-2build2) ...\nSelecting previously unselected package gir1.2-harfbuzz-0.0:amd64.\nPreparing to unpack .../033-gir1.2-harfbuzz-0.0_8.3.0-2build2_amd64.deb ...\nUnpacking gir1.2-harfbuzz-0.0:amd64 (8.3.0-2build2) ...\nSelecting previously unselected package libxft2:amd64.\nPreparing to unpack .../034-libxft2_2.3.6-1build1_amd64.deb ...\nUnpacking libxft2:amd64 (2.3.6-1build1) ...\nSelecting previously unselected package libpangoxft-1.0-0:amd64.\nPreparing to unpack .../035-libpangoxft-1.0-0_1.52.1+ds-1build1_amd64.deb ...\nUnpacking libpangoxft-1.0-0:amd64 (1.52.1+ds-1build1) ...\nSelecting previously unselected package gir1.2-pango-1.0:amd64.\nPreparing to unpack .../036-gir1.2-pango-1.0_1.52.1+ds-1build1_amd64.deb ...\nUnpacking gir1.2-pango-1.0:amd64 (1.52.1+ds-1build1) ...\nSelecting previously unselected package gir1.2-gtk-3.0:amd64.\nPreparing to unpack .../037-gir1.2-gtk-3.0_3.24.41-4ubuntu1.3_amd64.deb ...\nUnpacking gir1.2-gtk-3.0:amd64 (3.24.41-4ubuntu1.3) ...\nSelecting previously unselected package libayatana-ido3-0.4-0:amd64.\nPreparing to unpack .../038-libayatana-ido3-0.4-0_0.10.1-1build2_amd64.deb ...\nUnpacking libayatana-ido3-0.4-0:amd64 (0.10.1-1build2) ...\nSelecting previously unselected package libayatana-indicator3-7:amd64.\nPreparing to unpack .../039-libayatana-indicator3-7_0.9.4-1build1_amd64.deb ...\nUnpacking libayatana-indicator3-7:amd64 (0.9.4-1build1) ...\nSelecting previously unselected package libdbusmenu-glib4:amd64.\nPreparing to unpack .../040-libdbusmenu-glib4_18.10.20180917~bzr492+repack1-3.1ubuntu5_amd64.deb ...\nUnpacking libdbusmenu-glib4:amd64 (18.10.20180917~bzr492+repack1-3.1ubuntu5) ...\nSelecting previously unselected package libdbusmenu-gtk3-4:amd64.\nPreparing to unpack .../041-libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-3.1ubuntu5_amd64.deb ...\nUnpacking libdbusmenu-gtk3-4:amd64 (18.10.20180917~bzr492+repack1-3.1ubuntu5) ...\nSelecting previously unselected package libayatana-appindicator3-1.\nPreparing to unpack .../042-libayatana-appindicator3-1_0.5.93-1build3_amd64.deb ...\nUnpacking libayatana-appindicator3-1 (0.5.93-1build3) ...\nSelecting previously unselected package gir1.2-ayatanaappindicator3-0.1.\nPreparing to unpack .../043-gir1.2-ayatanaappindicator3-0.1_0.5.93-1build3_amd64.deb ...\nUnpacking gir1.2-ayatanaappindicator3-0.1 (0.5.93-1build3) ...\nSelecting previously unselected package gir1.2-gstreamer-1.0:amd64.\nPreparing to unpack .../044-gir1.2-gstreamer-1.0_1.24.2-1ubuntu0.1_amd64.deb ...\nUnpacking gir1.2-gstreamer-1.0:amd64 (1.24.2-1ubuntu0.1) ...\nSelecting previously unselected package gir1.2-gtk-vnc-2.0:amd64.\nPreparing to unpack .../045-gir1.2-gtk-vnc-2.0_1.3.1-1build2_amd64.deb ...\nUnpacking gir1.2-gtk-vnc-2.0:amd64 (1.3.1-1build2) ...\nSelecting previously unselected package libgtksourceview-4-common.\nPreparing to unpack .../046-libgtksourceview-4-common_4.8.4-5build4_all.deb ...\nUnpacking libgtksourceview-4-common (4.8.4-5build4) ...\nSelecting previously unselected package libgtksourceview-4-0:amd64.\nPreparing to unpack .../047-libgtksourceview-4-0_4.8.4-5build4_amd64.deb ...\nUnpacking libgtksourceview-4-0:amd64 (4.8.4-5build4) ...\nSelecting previously unselected package gir1.2-gtksource-4:amd64.\nPreparing to unpack .../048-gir1.2-gtksource-4_4.8.4-5build4_amd64.deb ...\nUnpacking gir1.2-gtksource-4:amd64 (4.8.4-5build4) ...\nSelecting previously unselected package gir1.2-spiceclientglib-2.0:amd64.\nPreparing to unpack .../049-gir1.2-spiceclientglib-2.0_0.42-2ubuntu2_amd64.deb ...\nUnpacking gir1.2-spiceclientglib-2.0:amd64 (0.42-2ubuntu2) ...\nSelecting previously unselected package gir1.2-spiceclientgtk-3.0:amd64.\nPreparing to unpack .../050-gir1.2-spiceclientgtk-3.0_0.42-2ubuntu2_amd64.deb ...\nUnpacking gir1.2-spiceclientgtk-3.0:amd64 (0.42-2ubuntu2) ...\nSelecting previously unselected package gir1.2-vte-2.91:amd64.\nPreparing to unpack .../051-gir1.2-vte-2.91_0.76.0-1ubuntu0.1_amd64.deb ...\nUnpacking gir1.2-vte-2.91:amd64 (0.76.0-1ubuntu0.1) ...\nSelecting previously unselected package libaa1:amd64.\nPreparing to unpack .../052-libaa1_1.4p5-51.1_amd64.deb ...\nUnpacking libaa1:amd64 (1.4p5-51.1) ...\nSelecting previously unselected package libraw1394-11:amd64.\nPreparing to unpack .../053-libraw1394-11_2.1.2-2build3_amd64.deb ...\nUnpacking libraw1394-11:amd64 (2.1.2-2build3) ...\nSelecting previously unselected package libavc1394-0:amd64.\nPreparing to unpack .../054-libavc1394-0_0.5.4-5build3_amd64.deb ...\nUnpacking libavc1394-0:amd64 (0.5.4-5build3) ...\nSelecting previously unselected package libcaca0:amd64.\nPreparing to unpack .../055-libcaca0_0.99.beta20-4build2_amd64.deb ...\nUnpacking libcaca0:amd64 (0.99.beta20-4build2) ...\nSelecting previously unselected package libdv4t64:amd64.\nPreparing to unpack .../056-libdv4t64_1.0.0-17.1build1_amd64.deb ...\nUnpacking libdv4t64:amd64 (1.0.0-17.1build1) ...\nSelecting previously unselected package libgstreamer-plugins-good1.0-0:amd64.\nPreparing to unpack .../057-libgstreamer-plugins-good1.0-0_1.24.2-1ubuntu1.1_amd64.deb ...\nUnpacking libgstreamer-plugins-good1.0-0:amd64 (1.24.2-1ubuntu1.1) ...\nSelecting previously unselected package libgudev-1.0-0:amd64.\nPreparing to unpack .../058-libgudev-1.0-0_1%3a238-5ubuntu1_amd64.deb ...\nUnpacking libgudev-1.0-0:amd64 (1:238-5ubuntu1) ...\nSelecting previously unselected package libiec61883-0:amd64.\nPreparing to unpack .../059-libiec61883-0_1.2.0-6build1_amd64.deb ...\nUnpacking libiec61883-0:amd64 (1.2.0-6build1) ...\nSelecting previously unselected package libspeex1:amd64.\nPreparing to unpack .../060-libspeex1_1.2.1-2ubuntu2.24.04.1_amd64.deb ...\nUnpacking libspeex1:amd64 (1.2.1-2ubuntu2.24.04.1) ...\nSelecting previously unselected package libshout3:amd64.\nPreparing to unpack .../061-libshout3_2.4.6-1build2_amd64.deb ...\nUnpacking libshout3:amd64 (2.4.6-1build2) ...\nSelecting previously unselected package libtag1v5-vanilla:amd64.\nPreparing to unpack .../062-libtag1v5-vanilla_1.13.1-1build1_amd64.deb ...\nUnpacking libtag1v5-vanilla:amd64 (1.13.1-1build1) ...\nSelecting previously unselected package libtag1v5:amd64.\nPreparing to unpack .../063-libtag1v5_1.13.1-1build1_amd64.deb ...\nUnpacking libtag1v5:amd64 (1.13.1-1build1) ...\nSelecting previously unselected package libtwolame0:amd64.\nPreparing to unpack .../064-libtwolame0_0.4.0-2build3_amd64.deb ...\nUnpacking libtwolame0:amd64 (0.4.0-2build3) ...\nSelecting previously unselected package libv4lconvert0t64:amd64.\nPreparing to unpack .../065-libv4lconvert0t64_1.26.1-4build3_amd64.deb ...\nUnpacking libv4lconvert0t64:amd64 (1.26.1-4build3) ...\nSelecting previously unselected package libv4l-0t64:amd64.\nPreparing to unpack .../066-libv4l-0t64_1.26.1-4build3_amd64.deb ...\nUnpacking libv4l-0t64:amd64 (1.26.1-4build3) ...\nSelecting previously unselected package libvpx9:amd64.\nPreparing to unpack .../067-libvpx9_1.14.0-1ubuntu2.2_amd64.deb ...\nUnpacking libvpx9:amd64 (1.14.0-1ubuntu2.2) ...\nSelecting previously unselected package libwavpack1:amd64.\nPreparing to unpack .../068-libwavpack1_5.6.0-1build1_amd64.deb ...\nUnpacking libwavpack1:amd64 (5.6.0-1build1) ...\nSelecting previously unselected package gstreamer1.0-plugins-good:amd64.\nPreparing to unpack .../069-gstreamer1.0-plugins-good_1.24.2-1ubuntu1.1_amd64.deb ...\nUnpacking gstreamer1.0-plugins-good:amd64 (1.24.2-1ubuntu1.1) ...\nSelecting previously unselected package libxv1:amd64.\nPreparing to unpack .../070-libxv1_2%3a1.0.11-1.1build1_amd64.deb ...\nUnpacking libxv1:amd64 (2:1.0.11-1.1build1) ...\nSelecting previously unselected package gstreamer1.0-x:amd64.\nPreparing to unpack .../071-gstreamer1.0-x_1.24.2-1ubuntu0.2_amd64.deb ...\nUnpacking gstreamer1.0-x:amd64 (1.24.2-1ubuntu0.2) ...\nSelecting previously unselected package ipxe-qemu.\nPreparing to unpack .../072-ipxe-qemu_1.21.1+git-20220113.fbbdc3926-0ubuntu2_all.deb ...\nUnpacking ipxe-qemu (1.21.1+git-20220113.fbbdc3926-0ubuntu2) ...\nSelecting previously unselected package ipxe-qemu-256k-compat-efi-roms.\nPreparing to unpack .../073-ipxe-qemu-256k-compat-efi-roms_1.0.0+git-20150424.a25a16d-0ubuntu5_all.deb ...\nUnpacking ipxe-qemu-256k-compat-efi-roms (1.0.0+git-20150424.a25a16d-0ubuntu5) ...\nSelecting previously unselected package libbrlapi0.8:amd64.\nPreparing to unpack .../074-libbrlapi0.8_6.6-4ubuntu5_amd64.deb ...\nUnpacking libbrlapi0.8:amd64 (6.6-4ubuntu5) ...\nSelecting previously unselected package libdecor-0-0:amd64.\nPreparing to unpack .../075-libdecor-0-0_0.2.2-1build2_amd64.deb ...\nUnpacking libdecor-0-0:amd64 (0.2.2-1build2) ...\nSelecting previously unselected package libdecor-0-plugin-1-gtk:amd64.\nPreparing to unpack .../076-libdecor-0-plugin-1-gtk_0.2.2-1build2_amd64.deb ...\nUnpacking libdecor-0-plugin-1-gtk:amd64 (0.2.2-1build2) ...\nSelecting previously unselected package libsamplerate0:amd64.\nPreparing to unpack .../077-libsamplerate0_0.2.2-4build1_amd64.deb ...\nUnpacking libsamplerate0:amd64 (0.2.2-4build1) ...\nSelecting previously unselected package libjack-jackd2-0:amd64.\nPreparing to unpack .../078-libjack-jackd2-0_1.9.21~dfsg-3ubuntu3_amd64.deb ...\nUnpacking libjack-jackd2-0:amd64 (1.9.21~dfsg-3ubuntu3) ...\nSelecting previously unselected package libwebrtc-audio-processing1:amd64.\nPreparing to unpack .../079-libwebrtc-audio-processing1_0.3.1-0ubuntu6_amd64.deb ...\nUnpacking libwebrtc-audio-processing1:amd64 (0.3.1-0ubuntu6) ...\nSelecting previously unselected package libspa-0.2-modules:amd64.\nPreparing to unpack .../080-libspa-0.2-modules_1.0.5-1ubuntu3_amd64.deb ...\nUnpacking libspa-0.2-modules:amd64 (1.0.5-1ubuntu3) ...\nSelecting previously unselected package libpipewire-0.3-0t64:amd64.\nPreparing to unpack .../081-libpipewire-0.3-0t64_1.0.5-1ubuntu3_amd64.deb ...\nUnpacking libpipewire-0.3-0t64:amd64 (1.0.5-1ubuntu3) ...\nSelecting previously unselected package libpipewire-0.3-common.\nPreparing to unpack .../082-libpipewire-0.3-common_1.0.5-1ubuntu3_all.deb ...\nUnpacking libpipewire-0.3-common (1.0.5-1ubuntu3) ...\nSelecting previously unselected package libpolkit-agent-1-0:amd64.\nPreparing to unpack .../083-libpolkit-agent-1-0_124-2ubuntu1.24.04.2_amd64.deb ...\nUnpacking libpolkit-agent-1-0:amd64 (124-2ubuntu1.24.04.2) ...\nSelecting previously unselected package libxss1:amd64.\nPreparing to unpack .../084-libxss1_1%3a1.2.3-1build3_amd64.deb ...\nUnpacking libxss1:amd64 (1:1.2.3-1build3) ...\nSelecting previously unselected package libsdl2-2.0-0:amd64.\nPreparing to unpack .../085-libsdl2-2.0-0_2.30.0+dfsg-1ubuntu3.1_amd64.deb ...\nUnpacking libsdl2-2.0-0:amd64 (2.30.0+dfsg-1ubuntu3.1) ...\nSelecting previously unselected package libslirp0:amd64.\nPreparing to unpack .../086-libslirp0_4.7.0-1ubuntu3_amd64.deb ...\nUnpacking libslirp0:amd64 (4.7.0-1ubuntu3) ...\nSelecting previously unselected package libspice-server1:amd64.\nPreparing to unpack .../087-libspice-server1_0.15.1-1build2_amd64.deb ...\nUnpacking libspice-server1:amd64 (0.15.1-1build2) ...\nSelecting previously unselected package libtpms0:amd64.\nPreparing to unpack .../088-libtpms0_0.9.3-0ubuntu4_amd64.deb ...\nUnpacking libtpms0:amd64 (0.9.3-0ubuntu4) ...\nSelecting previously unselected package libvirglrenderer1:amd64.\nPreparing to unpack .../089-libvirglrenderer1_1.0.0-1ubuntu2_amd64.deb ...\nUnpacking libvirglrenderer1:amd64 (1.0.0-1ubuntu2) ...\nSelecting previously unselected package libvirt-daemon-driver-qemu.\nPreparing to unpack .../090-libvirt-daemon-driver-qemu_10.0.0-2ubuntu8.7_amd64.deb ...\nUnpacking libvirt-daemon-driver-qemu (10.0.0-2ubuntu8.7) ...\nSelecting previously unselected package libvirt-daemon.\nPreparing to unpack .../091-libvirt-daemon_10.0.0-2ubuntu8.7_amd64.deb ...\nUnpacking libvirt-daemon (10.0.0-2ubuntu8.7) ...\nSelecting previously unselected package libvirt-daemon-config-network.\nPreparing to unpack .../092-libvirt-daemon-config-network_10.0.0-2ubuntu8.7_all.deb ...\nUnpacking libvirt-daemon-config-network (10.0.0-2ubuntu8.7) ...\nSelecting previously unselected package libvirt-daemon-config-nwfilter.\nPreparing to unpack .../093-libvirt-daemon-config-nwfilter_10.0.0-2ubuntu8.7_all.deb ...\nUnpacking libvirt-daemon-config-nwfilter (10.0.0-2ubuntu8.7) ...\nSelecting previously unselected package systemd-container.\nPreparing to unpack .../094-systemd-container_255.4-1ubuntu8.8_amd64.deb ...\nUnpacking systemd-container (255.4-1ubuntu8.8) ...\nSelecting previously unselected package libvirt-daemon-system-systemd.\nPreparing to unpack .../095-libvirt-daemon-system-systemd_10.0.0-2ubuntu8.7_all.deb ...\nUnpacking libvirt-daemon-system-systemd (10.0.0-2ubuntu8.7) ...\nSelecting previously unselected package xml-core.\nPreparing to unpack .../096-xml-core_0.19_all.deb ...\nUnpacking xml-core (0.19) ...\nSelecting previously unselected package polkitd.\nPreparing to unpack .../097-polkitd_124-2ubuntu1.24.04.2_amd64.deb ...\nUnpacking polkitd (124-2ubuntu1.24.04.2) ...\nSelecting previously unselected package libvirt-daemon-system.\nPreparing to unpack .../098-libvirt-daemon-system_10.0.0-2ubuntu8.7_amd64.deb ...\nUnpacking libvirt-daemon-system (10.0.0-2ubuntu8.7) ...\nSelecting previously unselected package libxml2-utils.\nPreparing to unpack .../099-libxml2-utils_2.9.14+dfsg-1.3ubuntu3.3_amd64.deb ...\nUnpacking libxml2-utils (2.9.14+dfsg-1.3ubuntu3.3) ...\nSelecting previously unselected package lvm2.\nPreparing to unpack .../100-lvm2_2.03.16-3ubuntu3.2_amd64.deb ...\nUnpacking lvm2 (2.03.16-3ubuntu3.2) ...\nSelecting previously unselected package mdevctl.\nPreparing to unpack .../101-mdevctl_1.3.0-1ubuntu2_amd64.deb ...\nUnpacking mdevctl (1.3.0-1ubuntu2) ...\nSelecting previously unselected package python3-cairo.\nPreparing to unpack .../102-python3-cairo_1.25.1-2build2_amd64.deb ...\nUnpacking python3-cairo (1.25.1-2build2) ...\nSelecting previously unselected package python3-gi-cairo.\nPreparing to unpack .../103-python3-gi-cairo_3.48.2-1_amd64.deb ...\nUnpacking python3-gi-cairo (3.48.2-1) ...\nSelecting previously unselected package qemu-system-common.\nPreparing to unpack .../104-qemu-system-common_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\nUnpacking qemu-system-common (1:8.2.2+ds-0ubuntu1.7) ...\nSelecting previously unselected package qemu-system-data.\nPreparing to unpack .../105-qemu-system-data_1%3a8.2.2+ds-0ubuntu1.7_all.deb ...\nUnpacking qemu-system-data (1:8.2.2+ds-0ubuntu1.7) ...\nSelecting previously unselected package libfdt1:amd64.\nPreparing to unpack .../106-libfdt1_1.7.0-2build1_amd64.deb ...\nUnpacking libfdt1:amd64 (1.7.0-2build1) ...\nSelecting previously unselected package seabios.\nPreparing to unpack .../107-seabios_1.16.3-2_all.deb ...\nUnpacking seabios (1.16.3-2) ...\nSelecting previously unselected package qemu-system-x86.\nPreparing to unpack .../108-qemu-system-x86_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\nUnpacking qemu-system-x86 (1:8.2.2+ds-0ubuntu1.7) ...\nSelecting previously unselected package qemu-system-modules-opengl.\nPreparing to unpack .../109-qemu-system-modules-opengl_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\nUnpacking qemu-system-modules-opengl (1:8.2.2+ds-0ubuntu1.7) ...\nSelecting previously unselected package qemu-system-gui.\nPreparing to unpack .../110-qemu-system-gui_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\nUnpacking qemu-system-gui (1:8.2.2+ds-0ubuntu1.7) ...\nSelecting previously unselected package qemu-system-modules-spice.\nPreparing to unpack .../111-qemu-system-modules-spice_1%3a8.2.2+ds-0ubuntu1.7_amd64.deb ...\nUnpacking qemu-system-modules-spice (1:8.2.2+ds-0ubuntu1.7) ...\nSelecting previously unselected package swtpm.\nPreparing to unpack .../112-swtpm_0.7.3-0ubuntu5.24.04.1_amd64.deb ...\nUnpacking swtpm (0.7.3-0ubuntu5.24.04.1) ...\nSelecting previously unselected package swtpm-tools.\nPreparing to unpack .../113-swtpm-tools_0.7.3-0ubuntu5.24.04.1_amd64.deb ...\nUnpacking swtpm-tools (0.7.3-0ubuntu5.24.04.1) ...\nSelecting previously unselected package thin-provisioning-tools.\nPreparing to unpack .../114-thin-provisioning-tools_0.9.0-2ubuntu5.1_amd64.deb ...\nUnpacking thin-provisioning-tools (0.9.0-2ubuntu5.1) ...\nSelecting previously unselected package gir1.2-libvirt-glib-1.0:amd64.\nPreparing to unpack .../115-gir1.2-libvirt-glib-1.0_5.0.0-2build3_amd64.deb ...\nUnpacking gir1.2-libvirt-glib-1.0:amd64 (5.0.0-2build3) ...\nSelecting previously unselected package virt-manager.\nPreparing to unpack .../116-virt-manager_1%3a4.1.0-3ubuntu0.1_all.deb ...\nUnpacking virt-manager (1:4.1.0-3ubuntu0.1) ...\nSelecting previously unselected package libnss-mymachines:amd64.\nPreparing to unpack .../117-libnss-mymachines_255.4-1ubuntu8.8_amd64.deb ...\nUnpacking libnss-mymachines:amd64 (255.4-1ubuntu8.8) ...\nSelecting previously unselected package ovmf.\nPreparing to unpack .../118-ovmf_2024.02-2ubuntu0.4_all.deb ...\nUnpacking ovmf (2024.02-2ubuntu0.4) ...\nSetting up libip4tc2:amd64 (1.8.10-3ubuntu2) ...\nSetting up libpipewire-0.3-common (1.0.5-1ubuntu3) ...\nSetting up logrotate (3.21.0-2build1) ...\nCreated symlink /etc/systemd/system/timers.target.wants/logrotate.timer → /usr/lib/systemd/system/logrotate.timer.\nSetting up libvirt-daemon-config-network (10.0.0-2ubuntu8.7) ...\nSetting up gir1.2-gstreamer-1.0:amd64 (1.24.2-1ubuntu0.1) ...\nSetting up libraw1394-11:amd64 (2.1.2-2build3) ...\nSetting up libxft2:amd64 (2.3.6-1build1) ...\nSetting up libtag1v5-vanilla:amd64 (1.13.1-1build1) ...\nSetting up python3-cairo (1.25.1-2build2) ...\nSetting up libspeex1:amd64 (1.2.1-2ubuntu2.24.04.1) ...\nSetting up libdevmapper-event1.02.1:amd64 (2:1.02.185-3ubuntu3.2) ...\nSetting up libv4lconvert0t64:amd64 (1.26.1-4build3) ...\nSetting up libpangoxft-1.0-0:amd64 (1.52.1+ds-1build1) ...\nSetting up libtwolame0:amd64 (0.4.0-2build3) ...\nSetting up gir1.2-gdkpixbuf-2.0:amd64 (2.42.10+dfsg-3ubuntu3.1) ...\nSetting up gir1.2-spiceclientglib-2.0:amd64 (0.42-2ubuntu2) ...\nSetting up gir1.2-atk-1.0:amd64 (2.52.0-1build1) ...\nSetting up libip6tc2:amd64 (1.8.10-3ubuntu2) ...\nSetting up libdbusmenu-glib4:amd64 (18.10.20180917~bzr492+repack1-3.1ubuntu5) ...\nSetting up libspice-server1:amd64 (0.15.1-1build2) ...\nSetting up netcat-openbsd (1.226-1ubuntu2) ...\nupdate-alternatives: using /bin/nc.openbsd to provide /bin/nc (nc) in auto mode\nSetting up gir1.2-libvirt-glib-1.0:amd64 (5.0.0-2build3) ...\nSetting up msr-tools (1.3-5build1) ...\nSetting up libwebrtc-audio-processing1:amd64 (0.3.1-0ubuntu6) ...\nSetting up gettext-base (0.21-14ubuntu2) ...\nSetting up libnftnl11:amd64 (1.2.6-2build1) ...\nSetting up libharfbuzz-gobject0:amd64 (8.3.0-2build2) ...\nSetting up libfdt1:amd64 (1.7.0-2build1) ...\nSetting up libayatana-ido3-0.4-0:amd64 (0.10.1-1build2) ...\nSetting up gir1.2-harfbuzz-0.0:amd64 (8.3.0-2build2) ...\nSetting up acl (2.3.2-1build1.1) ...\nSetting up ovmf (2024.02-2ubuntu0.4) ...\nSetting up dns-root-data (2024071801~ubuntu0.24.04.1) ...\nSetting up libasound2-data (1.2.11-1ubuntu0.1) ...\nSetting up gir1.2-pango-1.0:amd64 (1.52.1+ds-1build1) ...\nSetting up libgstreamer-plugins-good1.0-0:amd64 (1.24.2-1ubuntu1.1) ...\nSetting up libasound2t64:amd64 (1.2.11-1ubuntu0.1) ...\nSetting up libslang2:amd64 (2.3.3-3build2) ...\nSetting up libvirglrenderer1:amd64 (1.0.0-1ubuntu2) ...\nSetting up libspa-0.2-modules:amd64 (1.0.5-1ubuntu3) ...\nSetting up libxv1:amd64 (2:1.0.11-1.1build1) ...\nSetting up libshout3:amd64 (2.4.6-1build2) ...\nSetting up thin-provisioning-tools (0.9.0-2ubuntu5.1) ...\nSetting up udev (255.4-1ubuntu8.8) ...\nCreating group 'input' with GID 995.\nCreating group 'sgx' with GID 994.\nCreating group 'kvm' with GID 993.\nCreating group 'render' with GID 992.\nfchownat() of /dev/snd/seq failed: Operation not permitted\nfchownat() of /dev/snd/timer failed: Operation not permitted\nfchownat() of /dev/loop-control failed: Operation not permitted\nfchmod() of /dev/kvm failed: Operation not permitted\nfchmod() of /dev/vhost-net failed: Operation not permitted\nfchmod() of /dev/vhost-vsock failed: Operation not permitted\nSetting up libvirt-daemon-driver-qemu (10.0.0-2ubuntu8.7) ...\nSetting up libdv4t64:amd64 (1.0.0-17.1build1) ...\nSetting up qemu-system-data (1:8.2.2+ds-0ubuntu1.7) ...\nSetting up seabios (1.16.3-2) ...\nSetting up systemd-hwe-hwdb (255.1.4) ...\nSetting up libv4l-0t64:amd64 (1.26.1-4build3) ...\nSetting up systemd-container (255.4-1ubuntu8.8) ...\nCreated symlink /etc/systemd/system/multi-user.target.wants/machines.target → /usr/lib/systemd/system/machines.targ\net.\nSetting up libvpx9:amd64 (1.14.0-1ubuntu2.2) ...\nSetting up libslirp0:amd64 (4.7.0-1ubuntu3) ...\nSetting up alsa-topology-conf (1.2.5.1-2) ...\nSetting up libtag1v5:amd64 (1.13.1-1build1) ...\nSetting up cpu-checker (0.7-1.3build2) ...\nSetting up libwavpack1:amd64 (5.6.0-1build1) ...\nSetting up libnfnetlink0:amd64 (1.0.2-2build1) ...\nSetting up ipxe-qemu (1.21.1+git-20220113.fbbdc3926-0ubuntu2) ...\nSetting up libdecor-0-0:amd64 (0.2.2-1build2) ...\nSetting up libpolkit-agent-1-0:amd64 (124-2ubuntu1.24.04.2) ...\nSetting up ipxe-qemu-256k-compat-efi-roms (1.0.0+git-20150424.a25a16d-0ubuntu5) ...\nSetting up sgml-base (1.31) ...\nSetting up libbrlapi0.8:amd64 (6.6-4ubuntu5) ...\nSetting up libxss1:amd64 (1:1.2.3-1build3) ...\nSetting up libtpms0:amd64 (0.9.3-0ubuntu4) ...\nSetting up dmidecode (3.5-3ubuntu0.1) ...\nSetting up libxml2-utils (2.9.14+dfsg-1.3ubuntu3.3) ...\nSetting up libvirt-daemon-config-nwfilter (10.0.0-2ubuntu8.7) ...\nSetting up libsamplerate0:amd64 (0.2.2-4build1) ...\nSetting up libayatana-indicator3-7:amd64 (0.9.4-1build1) ...\nSetting up python3-gi-cairo (3.48.2-1) ...\nSetting up libgtksourceview-4-common (4.8.4-5build4) ...\nSetting up libpipewire-0.3-0t64:amd64 (1.0.5-1ubuntu3) ...\nSetting up libdecor-0-plugin-1-gtk:amd64 (0.2.2-1build2) ...\nSetting up libgudev-1.0-0:amd64 (1:238-5ubuntu1) ...\nSetting up libaa1:amd64 (1.4p5-51.1) ...\nSetting up libiec61883-0:amd64 (1.2.0-6build1) ...\nSetting up mdevctl (1.3.0-1ubuntu2) ...\nSetting up libavc1394-0:amd64 (0.5.4-5build3) ...\nSetting up libdbusmenu-gtk3-4:amd64 (18.10.20180917~bzr492+repack1-3.1ubuntu5) ...\nSetting up libnftables1:amd64 (1.0.9-1build1) ...\nSetting up gstreamer1.0-x:amd64 (1.24.2-1ubuntu0.2) ...\nSetting up nftables (1.0.9-1build1) ...\nSetting up qemu-system-common (1:8.2.2+ds-0ubuntu1.7) ...\nCreated symlink /etc/systemd/system/multi-user.target.wants/qemu-kvm.service → /usr/lib/systemd/system/qemu-kvm.ser\nvice.\nSetting up libcaca0:amd64 (0.99.beta20-4build2) ...\nSetting up alsa-ucm-conf (1.2.10-1ubuntu5.7) ...\nSetting up gstreamer1.0-plugins-good:amd64 (1.24.2-1ubuntu1.1) ...\nSetting up qemu-system-x86 (1:8.2.2+ds-0ubuntu1.7) ...\nSetting up gir1.2-gtk-3.0:amd64 (3.24.41-4ubuntu1.3) ...\nSetting up libparted2t64:amd64 (3.6-4build1) ...\nRemoving 'diversion of /lib/x86_64-linux-gnu/libparted.so.2 to /lib/x86_64-linux-gnu/libparted.so.2.usr-is-merged b\ny libparted2t64'\nRemoving 'diversion of /lib/x86_64-linux-gnu/libparted.so.2.0.5 to /lib/x86_64-linux-gnu/libparted.so.2.0.5.usr-is-\nmerged by libparted2t64'\nSetting up libgtksourceview-4-0:amd64 (4.8.4-5build4) ...\nSetting up libnss-mymachines:amd64 (255.4-1ubuntu8.8) ...\nSetting up libayatana-appindicator3-1 (0.5.93-1build3) ...\nSetting up swtpm (0.7.3-0ubuntu5.24.04.1) ...\nSetting up gir1.2-gtk-vnc-2.0:amd64 (1.3.1-1build2) ...\nSetting up libvirt-daemon-system-systemd (10.0.0-2ubuntu8.7) ...\nSetting up gir1.2-spiceclientgtk-3.0:amd64 (0.42-2ubuntu2) ...\nSetting up libjack-jackd2-0:amd64 (1.9.21~dfsg-3ubuntu3) ...\nSetting up libnetfilter-conntrack3:amd64 (1.0.9-6build1) ...\nSetting up xml-core (0.19) ...\nSetting up gir1.2-vte-2.91:amd64 (0.76.0-1ubuntu0.1) ...\nSetting up libvirt-daemon (10.0.0-2ubuntu8.7) ...\nSetting up libsdl2-2.0-0:amd64 (2.30.0+dfsg-1ubuntu3.1) ...\nSetting up gir1.2-ayatanaappindicator3-0.1 (0.5.93-1build3) ...\nSetting up gir1.2-gtksource-4:amd64 (4.8.4-5build4) ...\nSetting up qemu-system-modules-opengl (1:8.2.2+ds-0ubuntu1.7) ...\nSetting up iptables (1.8.10-3ubuntu2) ...\nupdate-alternatives: using /usr/sbin/iptables-legacy to provide /usr/sbin/iptables (iptables) in auto mode\nupdate-alternatives: using /usr/sbin/ip6tables-legacy to provide /usr/sbin/ip6tables (ip6tables) in auto mode\nupdate-alternatives: using /usr/sbin/iptables-nft to provide /usr/sbin/iptables (iptables) in auto mode\nupdate-alternatives: using /usr/sbin/ip6tables-nft to provide /usr/sbin/ip6tables (ip6tables) in auto mode\nupdate-alternatives: using /usr/sbin/arptables-nft to provide /usr/sbin/arptables (arptables) in auto mode\nupdate-alternatives: using /usr/sbin/ebtables-nft to provide /usr/sbin/ebtables (ebtables) in auto mode\nSetting up qemu-system-gui (1:8.2.2+ds-0ubuntu1.7) ...\nSetting up parted (3.6-4build1) ...\nSetting up dnsmasq-base (2.90-2build2) ...\nSetting up swtpm-tools (0.7.3-0ubuntu5.24.04.1) ...\ninfo: Selecting GID from range 100 to 999 ...\ninfo: Adding group `swtpm' (GID 107) ...\ninfo: The home dir /var/lib/swtpm you specified can't be accessed: No such file or directory\n\ninfo: Selecting UID from range 100 to 999 ...\n\ninfo: Adding system user `swtpm' (UID 103) ...\ninfo: Adding new user `swtpm' (UID 103) with group `swtpm' ...\ninfo: Not creating home directory `/var/lib/swtpm'.\nSetting up virt-manager (1:4.1.0-3ubuntu0.1) ...\nSetting up qemu-system-modules-spice (1:8.2.2+ds-0ubuntu1.7) ...\nSetting up liblvm2cmd2.03:amd64 (2.03.16-3ubuntu3.2) ...\nSetting up dmeventd (2:1.02.185-3ubuntu3.2) ...\nCreated symlink /etc/systemd/system/sockets.target.wants/dm-event.socket → /usr/lib/systemd/system/dm-event.socket.\nSetting up lvm2 (2.03.16-3ubuntu3.2) ...\nCreated symlink /etc/systemd/system/sysinit.target.wants/blk-availability.service → /usr/lib/systemd/system/blk-ava\nilability.service.\nCreated symlink /etc/systemd/system/sysinit.target.wants/lvm2-monitor.service → /usr/lib/systemd/system/lvm2-monito\nr.service.\nCreated symlink /etc/systemd/system/sysinit.target.wants/lvm2-lvmpolld.socket → /usr/lib/systemd/system/lvm2-lvmpol\nld.socket.\nProcessing triggers for libglib2.0-0t64:amd64 (2.80.0-6ubuntu3.4) ...\nProcessing triggers for dbus (1.14.10-4ubuntu4.1) ...\nProcessing triggers for hicolor-icon-theme (0.17-2) ...\nProcessing triggers for libc-bin (2.39-0ubuntu8.4) ...\nProcessing triggers for man-db (2.12.0-4build2) ...\nProcessing triggers for sgml-base (1.31) ...\nSetting up polkitd (124-2ubuntu1.24.04.2) ...\nCreating group 'polkitd' with GID 991.\nCreating user 'polkitd' (User for polkitd) with UID 991 and GID 991.\ninvoke-rc.d: could not determine current runlevel\ninvoke-rc.d: policy-rc.d denied execution of reload.\nstart-stop-daemon: unable to stat /usr/libexec/polkitd (No such file or directory)\nSetting up libvirt-daemon-system (10.0.0-2ubuntu8.7) ...\nuseradd warning: libvirt-qemu's uid 64055 is greater than SYS_UID_MAX 999\nchown: changing ownership of '/var/lib/libvirt/qemu/': Operation not permitted\ndpkg: error processing package libvirt-daemon-system (--configure):\n installed libvirt-daemon-system package post-installation script subprocess returned error exit status 1\nErrors were encountered while processing:\n libvirt-daemon-system\nE: Sub-process /usr/bin/dpkg returned an error code (1)\n📦[waylon@ubuntu ~]$ virt-manager\n```\n",
      "summary": "I got virtual machine manager running on two Bazzite machines today. It was a bit tricky, more than I thought actually. I ran into all sorts of...",
      "date_published": "2025-06-27T21:09:05Z",
      "date_modified": "2025-06-27T21:09:05Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "bazzite"
      ]
    },
    {
      "id": "https://waylonwalker.com/copier-vcs-quirks/",
      "url": "https://waylonwalker.com/copier-vcs-quirks/",
      "title": "copier vcs quirks",
      "content_html": "\u003cp\u003eCopier has a few quirks with vcs that I just discovered by trying to test out\nsome changes.  I may have some config that I have long forgotten about\nsomewhere deep in my dotfiles, I don’t think so, but id love to be wrong and\ncorrected, please reach out.\u003c/p\u003e\n\u003ch2 id=\"what-doesnt-work\"\u003eWhat Doesn’t Work \u003ca href=\"#what-doesnt-work\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI tried throwing everything at this template to make it work.  I tried a bunch\nof flags that did not work. I tried making commits to the local repo to get rid\nof the dirty warning. I really wanted to test new changes locally without\ncommitting and pushing untested and potentially broken changes.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euvx copier copy ../markata-blog-starter .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euvx copier copy gh:waylonwalker/markata-blog-starter@develop .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euvx copier copy ../markata-blog-starter . -wlg --trust\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"what-works-----vcs-ref\"\u003eWhat Works - –vcs-ref \u003ca href=\"#what-works-----vcs-ref\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFinally after trying everything to get the local copy to work, and my guess of\n@branch not working I found this to work.  It does require me to go to the repo\non my develop branch.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euvx copier copy gh:waylonwalker/markata-blog-starter --vcs-ref develop .\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"what-works---delete-\u003ca href=\"/glossary/git/\" class=\"glossary-term\" title=\"Git is a version control system for tracking changes in source code during software development. In the beginning there were many, some were licensed. As...\"\u003egit\u003c/a\u003e\"\u003eWhat Works - delete .git \u003ca href=\"#what-works---delete-git\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eReally this might be my best option to make quick changes and test them locally\nwithout going through a version control system.  It is not ideal, but makes it\neasy to quickly iterate on.  I might be renaming .git, or copying to /tmp for\nquick iteration.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm -rf .git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euvx copier copy ../markata-blog-starter .\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"copier-i-love\"\u003eCopier I love \u003ca href=\"#copier-i-love\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCopier is a great templating tool.  I really love it.  I use it every single\nday to create posts on this blog using \u003ca class=\"wikilink\" data-date=\"2022-01-24\" data-description=\"I have added a hotkey to my copier template setup to quickly access all my templates at any time from tmux. At any point I can hit , thats holding control...\" data-title=\"Tmux hotkey for copier templates\" href=\"/tmux-copier-templates/\" data-preview=\"I have added a hotkey to my copier template setup to quickly access all my templates at any time from tmux. At any point I can hit , thats holding control...\"\u003eTmux hotkey for copier templates\u003c/a\u003e.  This is\nthe first time this quirk has got me and it had me puzzled for 45 minutes as I\ndid not expect this behavior whatsoever.\u003c/p\u003e\n",
      "content_text": "\nCopier has a few quirks with vcs that I just discovered by trying to test out\nsome changes.  I may have some config that I have long forgotten about\nsomewhere deep in my dotfiles, I don't think so, but id love to be wrong and\ncorrected, please reach out.\n\n## What Doesn't Work\n\nI tried throwing everything at this template to make it work.  I tried a bunch\nof flags that did not work. I tried making commits to the local repo to get rid\nof the dirty warning. I really wanted to test new changes locally without\ncommitting and pushing untested and potentially broken changes.\n\n``` bash\nuvx copier copy ../markata-blog-starter .\nuvx copier copy gh:waylonwalker/markata-blog-starter@develop .\nuvx copier copy ../markata-blog-starter . -wlg --trust\n```\n\n## What Works - --vcs-ref\n\nFinally after trying everything to get the local copy to work, and my guess of\n@branch not working I found this to work.  It does require me to go to the repo\non my develop branch.\n\n``` bash\nuvx copier copy gh:waylonwalker/markata-blog-starter --vcs-ref develop .\n```\n\n## What Works - delete .git\n\nReally this might be my best option to make quick changes and test them locally\nwithout going through a version control system.  It is not ideal, but makes it\neasy to quickly iterate on.  I might be renaming .git, or copying to /tmp for\nquick iteration.\n\n``` bash\nrm -rf .git\nuvx copier copy ../markata-blog-starter .\n```\n\n## Copier I love\n\nCopier is a great templating tool.  I really love it.  I use it every single\nday to create posts on this blog using \u003ca href=\"/tmux-copier-templates/\" class=\"wikilink\" data-title=\"Tmux hotkey for copier templates\" data-description=\"I have added a hotkey to my copier template setup to quickly access all my templates at any time from tmux. At any point I can hit , thats holding control...\" data-date=\"2022-01-24\"\u003eTmux hotkey for copier templates\u003c/a\u003e.  This is\nthe first time this quirk has got me and it had me puzzled for 45 minutes as I\ndid not expect this behavior whatsoever.\n\n\n",
      "summary": "Copier has a few quirks with vcs that I just discovered by trying to test out some changes. I may have some config that I have long forgotten about somewhere...",
      "date_published": "2025-06-19T08:04:51Z",
      "date_modified": "2025-06-19T08:04:51Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "copier",
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/using-yek/",
      "url": "https://waylonwalker.com/using-yek/",
      "title": "using yek to serialize text files into llm friendly file",
      "content_html": "\u003cp\u003eI’ve been using \u003ca href=\"https://gitingest.com/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/gitingest.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/gitingest.com.ico\" class=\"has-avatar  has-avatar-before\"\u003egitingest\u003c/a\u003e web ui [[ thoughts-516 ]]\nfor quite awhile to serialize \u003ca href=\"/glossary/git/\" class=\"glossary-term\" title=\"Git is a version control system for tracking changes in source code during software development. In the beginning there were many, some were licensed. As...\"\u003egit\u003c/a\u003e repo into llm friendly text files.  This\ngives tools context about repos that are not in the training data so that it\nknows about it and how to use the code in the repo.  gitingest also has a\npython library [[ thoughts-517 ]]\u003c/p\u003e\n\u003cp\u003eI had a use case for a project not yet on git, and found yek.\u003c/p\u003e\n\u003ch2 id=\"installing-yek\"\u003eInstalling yek \u003ca href=\"#installing-yek\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTheir instructions tell you to curl to bash.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fsSL https://bodo.run/yek.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI don’t like curl to bash from random sites, so I have my own \u003ca href=\"/self-host/\" class=\"glossary-term\" title=\"Self hosting is the act of hosting your own applications and services without using a SAS provider. This is typically done with your own hardware, but there...\"\u003eself hosted\u003c/a\u003e\nversion of i.jpillora.com.  I like using this because it pulls from github and\nI trust github as a source for artifacts as good as the repo I am pulling\nfrom.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://i.jpillora.com/bodo-run/yek \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"using-yek\"\u003eUsing yek \u003ca href=\"#using-yek\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eyek\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003e/tmp/yek-output/yek-output-bb01e621.txt\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis will give you a link to a text file that you can add to many llm tools.\nThis happened so fast for me that I didn’t even believe that it worked\nproperly.\u003c/p\u003e\n\u003ch2 id=\"more-options\"\u003emore options \u003ca href=\"#more-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAs with most clis, you can run \u003ccode\u003eyek --help\u003c/code\u003e to see the options available.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eyek --help\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've been using [gitingest](https://gitingest.com/) web ui [[ thoughts-516 ]]\nfor quite awhile to serialize git repo into llm friendly text files.  This\ngives tools context about repos that are not in the training data so that it\nknows about it and how to use the code in the repo.  gitingest also has a\npython library [[ thoughts-517 ]]\n\nI had a use case for a project not yet on git, and found yek.\n\n## Installing yek\n\nTheir instructions tell you to curl to bash.\n\n``` bash\ncurl -fsSL https://bodo.run/yek.sh | bash\n```\n\nI don't like curl to bash from random sites, so I have my own self hosted\nversion of i.jpillora.com.  I like using this because it pulls from github and\nI trust github as a source for artifacts as good as the repo I am pulling\nfrom.\n\n``` bash\ncurl https://i.jpillora.com/bodo-run/yek | bash\n```\n\n## Using yek\n\n``` bash\nyek\n```\n\n\u003e /tmp/yek-output/yek-output-bb01e621.txt\n\nThis will give you a link to a text file that you can add to many llm tools.\nThis happened so fast for me that I didn't even believe that it worked\nproperly.\n\n## more options\n\nAs with most clis, you can run `yek --help` to see the options available.\n\n``` bash\nyek --help\n```\n",
      "summary": "I've been using gitingest web ui thoughts-516 for quite awhile to serialize git repo into llm friendly text files. This gives tools context about repos that...",
      "date_published": "2025-06-11T11:01:34Z",
      "date_modified": "2025-06-11T11:01:34Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "ai",
        "llm"
      ]
    },
    {
      "id": "https://waylonwalker.com/brightnessctl-adjust-screen-brightness/",
      "url": "https://waylonwalker.com/brightnessctl-adjust-screen-brightness/",
      "title": "brightnessctl adjust screen brightness",
      "content_html": "\u003cp\u003eToday I discovered \u003ccode\u003ebrightnessctl\u003c/code\u003e to adjust the screen brightness on my\nAwesomeWM machine.  Its a command line utility that you can use to adjust the\nbrightness of your screen.  A command line interface like this gives you the\nability to bind keys with something like [[xbindkeys]] or your window manager\nconfiguration.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install brightnessctl\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# or \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eparu -S brightnessctl\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow that you have it installed you can use it to adjust the brightness of your\nscreen, this worked particularly well for my laptop screen, I don’t think this\nworks for monitors, in my experience they are usually controlled by the built\nin osd.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Increase brightness by 10%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrightnessctl \u003cspan class=\"nb\"\u003eset\u003c/span\u003e +10%\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Decrease brightness by 10%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrightnessctl \u003cspan class=\"nb\"\u003eset\u003c/span\u003e 10%-\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Set brightness to 50%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrightnessctl \u003cspan class=\"nb\"\u003eset\u003c/span\u003e 50%\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Set brightness to 100%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrightnessctl \u003cspan class=\"nb\"\u003eset\u003c/span\u003e 100%\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eon my machine I had to use `sudo` to run the command, otherwise I got the following error:\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCan\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003et modify brightness: Permission denied\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eYou should run this program with root privileges.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAlternatively, get write permissions \u003cspan class=\"k\"\u003efor\u003c/span\u003e device files.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n",
      "content_text": "\nToday I discovered `brightnessctl` to adjust the screen brightness on my\nAwesomeWM machine.  Its a command line utility that you can use to adjust the\nbrightness of your screen.  A command line interface like this gives you the\nability to bind keys with something like [[xbindkeys]] or your window manager\nconfiguration.\n\n\n``` bash\nsudo apt install brightnessctl\n# or \nparu -S brightnessctl\n```\n\nNow that you have it installed you can use it to adjust the brightness of your\nscreen, this worked particularly well for my laptop screen, I don't think this\nworks for monitors, in my experience they are usually controlled by the built\nin osd.\n\n``` bash\n# Increase brightness by 10%\nbrightnessctl set +10%\n# Decrease brightness by 10%\nbrightnessctl set 10%-\n# Set brightness to 50%\nbrightnessctl set 50%\n# Set brightness to 100%\nbrightnessctl set 100%\n```\n\n!!! note\n    on my machine I had to use `sudo` to run the command, otherwise I got the following error:\n\n    ``` bash\n    Can't modify brightness: Permission denied\n\n    You should run this program with root privileges.\n    Alternatively, get write permissions for device files.\n    ```\n",
      "summary": "Today I discovered to adjust the screen brightness on my AwesomeWM machine. Its a command line utility that you can use to adjust the brightness of your...",
      "date_published": "2025-06-11T08:42:36Z",
      "date_modified": "2025-06-11T08:42:36Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/rich-theme/",
      "url": "https://waylonwalker.com/rich-theme/",
      "title": "rich theme",
      "content_html": "\u003cp\u003eThe rich console is themeable, I’ve been a long time user of rich and had no\nIdea.  You can define your own theme keywords and use them just like you use\nnormal rich keywords in square brackets like\u003ccode\u003e\u0026#39;[bold red]\u0026#39;\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003erich.console\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eConsole\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003erich.theme\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eTheme\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecustom_theme\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eTheme\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;info\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dim cyan\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;warning\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;magenta\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;danger\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;bold red\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econsole\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eConsole\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etheme\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ecustom_theme\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econsole\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;This is information\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;info\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econsole\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;[warning]The pod bay doors are locked[/warning]\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econsole\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Something terrible happened!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;danger\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nThe rich console is themeable, I've been a long time user of rich and had no\nIdea.  You can define your own theme keywords and use them just like you use\nnormal rich keywords in square brackets like`'[bold red]'`.\n\n``` python\nfrom rich.console import Console\nfrom rich.theme import Theme\ncustom_theme = Theme({\n    \"info\": \"dim cyan\",\n    \"warning\": \"magenta\",\n    \"danger\": \"bold red\"\n})\nconsole = Console(theme=custom_theme)\nconsole.print(\"This is information\", style=\"info\")\nconsole.print(\"[warning]The pod bay doors are locked[/warning]\")\nconsole.print(\"Something terrible happened!\", style=\"danger\")\n```\n",
      "summary": "The rich console is themeable, I've been a long time user of rich and had no Idea. You can define your own theme keywords and use them just like you use...",
      "date_published": "2025-06-05T20:37:10Z",
      "date_modified": "2025-06-05T20:37:10Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/unset-multiple-environment-variables/",
      "url": "https://waylonwalker.com/unset-multiple-environment-variables/",
      "title": "unset multiple environment variables",
      "content_html": "\u003cp\u003eYou can unset multiple environment variables at once. I did not know this was a\nthing, its something that ended up happening organically on a call and asking\nsomeone to run \u003ccode\u003eunset\u003c/code\u003e.  They had never done it before and did not know how it\nworks, but did exactly as I said instead of what I meant.  I like this handy\nshortcut doing it in one line rather than each one individually, I will be\nusing this in the future. You might need this for something like\n\u003ca class=\"wikilink\" data-date=\"2022-10-17\" data-description=\"Upon first running an cli command using localstack you might end up with the following error.\" data-title=\"running aws cli commands with localstack\" href=\"/running-aws-cli-commands-with-localstack/\" data-preview=\"Upon first running an cli command using localstack you might end up with the following error.\"\u003erunning aws cli commands with localstack\u003c/a\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eunset\u003c/span\u003e AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nYou can unset multiple environment variables at once. I did not know this was a\nthing, its something that ended up happening organically on a call and asking\nsomeone to run `unset`.  They had never done it before and did not know how it\nworks, but did exactly as I said instead of what I meant.  I like this handy\nshortcut doing it in one line rather than each one individually, I will be\nusing this in the future. You might need this for something like\n\u003ca href=\"/running-aws-cli-commands-with-localstack/\" class=\"wikilink\" data-title=\"running aws cli commands with localstack\" data-description=\"Upon first running an cli command using localstack you might end up with the following error.\" data-date=\"2022-10-17\"\u003erunning aws cli commands with localstack\u003c/a\u003e.\n\n``` bash\nunset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION\n```\n",
      "summary": "You can unset multiple environment variables at once. I did not know this was a thing, its something that ended up happening organically on a call and asking...",
      "date_published": "2025-06-03T11:21:11Z",
      "date_modified": "2025-06-03T11:21:11Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "bash",
        "cli",
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/i3lock-on-awesomewm/",
      "url": "https://waylonwalker.com/i3lock-on-awesomewm/",
      "title": "i3lock on AwesomeWM",
      "content_html": "\u003cp\u003e\u003ccode\u003ei3lock\u003c/code\u003e is a fantastic lockscreen for tiling window managers.\u003c/p\u003e\n\u003cp\u003eIf you are using a tiling window manager within a public space you need to add\na lockscreen.  I have one machine that I take with me to a public space.  Its\nsecure enough that I can leave it, but not secure enough that I want to leave\nit unlocked.  So when I need to leave it behind for the restroom I need to lock\nit up.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://man.archlinux.org/man/extra/i3lock/i3lock.1.en\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/man.archlinux.org.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/man.archlinux.org.ico\" class=\"has-avatar  has-avatar-before\"\u003earch wiki\u003c/a\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eparu -S i3lock\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# or\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt install i3lock\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow that you have \u003ccode\u003ei3lock\u003c/code\u003e installed lets lock that screen.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# lock it with a pure white flashbang\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei3lock\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# lock it with a black background\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei3lock -c \u003cspan class=\"m\"\u003e000000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# lock it with a custom color\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei3lock -c 2e1330\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# lock it with a wallpaper\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei3lock -c \u003cspan class=\"m\"\u003e000000\u003c/span\u003e ~/Pictures/Wallpapers/mywallpaper.png\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can use your window manager or something more generic like xbindkeys to set\na hotkey. This way you don’t have to open a terminal and type out the command\nevery time you leave your desk.  You can just press something like \u003ccode\u003eSUPER+L\u003c/code\u003e\nlike you would on other OS’s.\u003c/p\u003e\n\u003ch2 id=\"fancy\"\u003eFancy \u003ca href=\"#fancy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you like it a bit fancier, you can use \u003ccode\u003ei3lock-fancy\u003c/code\u003e, it can blur,\npixelate, and greyscale your current screen.  I did not really like this\nbecause you can still tell what is going on the screen.  It’s probably secure\nenough and looks better, but I went with regular \u003ccode\u003ei3lock\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eparu -S i3lock-fancy-git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# or\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt install i3lock-fancy\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n`i3lock` is a fantastic lockscreen for tiling window managers.\n\nIf you are using a tiling window manager within a public space you need to add\na lockscreen.  I have one machine that I take with me to a public space.  Its\nsecure enough that I can leave it, but not secure enough that I want to leave\nit unlocked.  So when I need to leave it behind for the restroom I need to lock\nit up.\n\n[arch wiki](https://man.archlinux.org/man/extra/i3lock/i3lock.1.en)\n\n``` bash\nparu -S i3lock\n# or\napt install i3lock\n```\n\nNow that you have `i3lock` installed lets lock that screen.\n\n``` bash\n# lock it with a pure white flashbang\ni3lock\n\n# lock it with a black background\ni3lock -c 000000\n\n# lock it with a custom color\ni3lock -c 2e1330\n\n# lock it with a wallpaper\ni3lock -c 000000 ~/Pictures/Wallpapers/mywallpaper.png\n```\n\nYou can use your window manager or something more generic like xbindkeys to set\na hotkey. This way you don't have to open a terminal and type out the command\nevery time you leave your desk.  You can just press something like `SUPER+L`\nlike you would on other OS's.\n\n## Fancy\n\nIf you like it a bit fancier, you can use `i3lock-fancy`, it can blur,\npixelate, and greyscale your current screen.  I did not really like this\nbecause you can still tell what is going on the screen.  It's probably secure\nenough and looks better, but I went with regular `i3lock`.\n\n``` bash\nparu -S i3lock-fancy-git\n# or\napt install i3lock-fancy\n```\n",
      "summary": "is a fantastic lockscreen for tiling window managers.",
      "date_published": "2025-06-02T14:40:56Z",
      "date_modified": "2025-06-02T14:40:56Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "awesomewm",
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/kubernetes-node-labels/",
      "url": "https://waylonwalker.com/kubernetes-node-labels/",
      "title": "kubernetes node labels",
      "content_html": "\u003cp\u003eIf you need to target a specific k8s node in the cluster, you can use labels.\nYou want to treat your nodes as much like cattle as you can, but sometimes\nbudgets get in the way.  You might be like me and just run any free hardware\nyou can get in your cluster, or you might have some large storage or gpu needs\nthat you can’t afford to put on every node in the cluster.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl get nodes --show-labels\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# add the bigpool label\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl label node k8s-1 \u003cspan class=\"nv\"\u003ebigpool\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl get nodes --show-labels\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# remove the bigpool label\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl label node k8s-1 bigpool-\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo use the label in a pod set \u003ccode\u003espec.nodeSelector\u003c/code\u003e to the label that you\napplied.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ePod\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebusybox\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econtainers\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebusybox\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebusybox\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enodeSelector\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebigpool\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nIf you need to target a specific k8s node in the cluster, you can use labels.\nYou want to treat your nodes as much like cattle as you can, but sometimes\nbudgets get in the way.  You might be like me and just run any free hardware\nyou can get in your cluster, or you might have some large storage or gpu needs\nthat you can't afford to put on every node in the cluster.\n\n``` bash\nkubectl get nodes --show-labels\n\n# add the bigpool label\nkubectl label node k8s-1 bigpool=true\nkubectl get nodes --show-labels\n\n# remove the bigpool label\nkubectl label node k8s-1 bigpool-\n```\n\nTo use the label in a pod set `spec.nodeSelector` to the label that you\napplied.\n\n``` yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: busybox\nspec:\n  containers:\n  - name: busybox\n    image: busybox\n  nodeSelector:\n    bigpool: \"true\"\n```\n",
      "summary": "If you need to target a specific k8s node in the cluster, you can use labels. You want to treat your nodes as much like cattle as you can, but sometimes...",
      "date_published": "2025-05-28T18:49:19Z",
      "date_modified": "2025-05-28T18:49:19Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "kubernetes"
      ]
    },
    {
      "id": "https://waylonwalker.com/javascript-b64/",
      "url": "https://waylonwalker.com/javascript-b64/",
      "title": "javascript b64",
      "content_html": "\u003cp\u003eI’m currently [[replacing-google-search-apps-with-self-hosted-web-apps]] and\ndecided to create a simple b64 encoder/decoder, just start typing to enter\ntext, escape to deselect, then e/d to encode/decode.\u003c/p\u003e\n\u003cp\u003eI’m trying to make these apps super simple, \u003ca href=\"/self-host/\" class=\"glossary-term\" title=\"Self hosting is the act of hosting your own applications and services without using a SAS provider. This is typically done with your own hardware, but there...\"\u003eself hosted\u003c/a\u003e out of minio, static\n\u003ca href=\"/html/\" class=\"glossary-term\" title=\"HTML (HyperText Markup Language) is the standard markup language used to create and design documents on the World Wide Web. It structures web content by...\"\u003ehtml\u003c/a\u003e, and javascript.  It’s been fun to get back to some simple interactive web\ndevelopment like this. No build just a website that does something.  No broken\nbuilds, no containers to deploy, just push to minio.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eencoded\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ebtoa\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edecoded\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eatob\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eencoded\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eHere is the result.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://b64.wayl.one\"\u003e\u003cimg class=\"glightbox\" src=\"https://shots.waylonwalker.com/shot/?url=https://b64.wayl.one\u0026amp;height=450\u0026amp;width=800\u0026amp;scaled_width=800\u0026amp;scaled_height=450\u0026amp;selectors=\" alt=\"screenshot of https://b64.wayl.one\"/ data-glightbox=\"description: screenshot of https://b64.wayl.one\"\u003e\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI'm currently [[replacing-google-search-apps-with-self-hosted-web-apps]] and\ndecided to create a simple b64 encoder/decoder, just start typing to enter\ntext, escape to deselect, then e/d to encode/decode.\n\nI'm trying to make these apps super simple, self hosted out of minio, static\nhtml, and javascript.  It's been fun to get back to some simple interactive web\ndevelopment like this. No build just a website that does something.  No broken\nbuilds, no containers to deploy, just push to minio.\n\n``` javascript\nencoded = btoa(content);\ndecoded = atob(encoded);\n```\n\nHere is the result.\n\n[![screenshot of https://b64.wayl.one](https://shots.waylonwalker.com/shot/?url=https://b64.wayl.one\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=)](https://b64.wayl.one)\n",
      "summary": "I'm currently replacing-google-search-apps-with-self-hosted-web-apps and decided to create a simple b64 encoder/decoder, just start typing to enter text,...",
      "date_published": "2025-05-25T21:01:04Z",
      "date_modified": "2025-05-25T21:01:04Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "javascript",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/web-wakelock/",
      "url": "https://waylonwalker.com/web-wakelock/",
      "title": "web wakelock",
      "content_html": "\u003cp\u003eI’m trying to replace my usage of google inline search apps with real apps,\ntoday I used a stopwatch to time some things out at work by opening stopwatch.\nThis was something I just wanted running in a tab on another screen, it was not\ntiming running code or anything, I was using it as a reminder to check browser\ncaches every 5 minutes or so for some testing.\u003c/p\u003e\n\u003cp\u003eSo tonight I whipped up a \u003ca href=\"https://stopwatch.wayl.one\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/stopwatch.wayl.one.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/stopwatch.wayl.one.ico\" class=\"has-avatar  has-avatar-before\"\u003estopwatch\u003c/a\u003e,\n\u003ca href=\"https://clock.wayl.one\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/clock.wayl.one.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/clock.wayl.one.ico\" class=\"has-avatar  has-avatar-before\"\u003eclock\u003c/a\u003e and \u003ca href=\"https://timer.wayl.one\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/timer.wayl.one.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/timer.wayl.one.ico\" class=\"has-avatar  has-avatar-before\"\u003etimer\u003c/a\u003e, all of\nwhich are using the wakelock API to keep the screen on while the app is\nrunning.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e// Wake Lock support\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003ewakeLock\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003easync\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003erequestWakeLock\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"k\"\u003etry\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;wakeLock\u0026#39;\u003c/span\u003e \u003cspan class=\"k\"\u003ein\u003c/span\u003e \u003cspan class=\"nx\"\u003enavigator\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nx\"\u003ewakeLock\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kr\"\u003eawait\u003c/span\u003e \u003cspan class=\"nx\"\u003enavigator\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewakeLock\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;screen\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Wake lock acquired\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003ecatch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Wake lock error:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;visibilitychange\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ewakeLock\u003c/span\u003e \u003cspan class=\"o\"\u003e!==\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evisibilityState\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;visible\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nx\"\u003erequestWakeLock\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003erequestWakeLock\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI'm trying to replace my usage of google inline search apps with real apps,\ntoday I used a stopwatch to time some things out at work by opening stopwatch.\nThis was something I just wanted running in a tab on another screen, it was not\ntiming running code or anything, I was using it as a reminder to check browser\ncaches every 5 minutes or so for some testing.\n\nSo tonight I whipped up a [stopwatch](https://stopwatch.wayl.one),\n[clock](https://clock.wayl.one) and [timer](https://timer.wayl.one), all of\nwhich are using the wakelock API to keep the screen on while the app is\nrunning.\n\n``` js\n    // Wake Lock support\n    let wakeLock = null;\n    async function requestWakeLock() {\n      try {\n        if ('wakeLock' in navigator) {\n          wakeLock = await navigator.wakeLock.request('screen');\n          console.log(\"Wake lock acquired\");\n        }\n      } catch (err) {\n        console.error(\"Wake lock error:\", err);\n      }\n    }\n\n    document.addEventListener(\"visibilitychange\", () =\u003e {\n      if (wakeLock !== null \u0026\u0026 document.visibilityState === \"visible\") {\n        requestWakeLock();\n      }\n    });\n\n    requestWakeLock();\n```\n",
      "summary": "I'm trying to replace my usage of google inline search apps with real apps, today I used a stopwatch to time some things out at work by opening stopwatch....",
      "date_published": "2025-05-21T20:50:22Z",
      "date_modified": "2025-05-21T20:50:22Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/vhs-themes/",
      "url": "https://waylonwalker.com/vhs-themes/",
      "title": "vhs themes",
      "content_html": "\u003cp\u003eI’ve been working on\n\u003ca href=\"https://github.com/WaylonWalker/ninesui/blob/main/README.md\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003eninesui\u003c/a\u003e,\ninspired by k9s see \u003ca href=\"https://thoughts.waylonwalker.com/post/633\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/thoughts.waylonwalker.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/thoughts.waylonwalker.com.ico\" class=\"has-avatar  has-avatar-before\"\u003ethoughts-633\u003c/a\u003e.\nI want a good flow for making video for the readme and I am using \u003ca href=\"https://charm.sh/apps/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/charm.sh.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/charm.sh.ico\" class=\"has-avatar  has-avatar-before\"\u003echarm.sh\u003c/a\u003e’s \u003ca href=\"https://github.com/charmbracelet/vhs\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003evhs\u003c/a\u003e for this.\nIts running in an archBTW distrobox and looks gawdaweful.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/e86047ed-6881-43f7-8e3a-30411d51afaf.mp4\" class=\"glightbox-link\" aria-label=\"sort.mp4\"\u003e\u003cvideo autoplay loop muted playsinline controls preload=\"metadata\" class=\"md-video\" poster=\"https://dropper.waylonwalker.com/api/file/e86047ed-6881-43f7-8e3a-30411d51afaf.webp?h=675\u0026w=1200\"\u003e\u003csource src=\"https://dropper.waylonwalker.com/api/file/e86047ed-6881-43f7-8e3a-30411d51afaf.mp4\" type=\"video/mp4\"\u003esort.mp4\u003c/video\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eThe over saturated colors give it a really retro look, seems fine, but not my\ncup of tea.  I tried to change the textual theme to \u003ccode\u003etokyo-night\u003c/code\u003e and it might\nhave made it a bit better, but still over-saturated.\u003c/p\u003e\n\u003ch2 id=\"after\"\u003eAfter \u003ca href=\"#after\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhat I found is that vhs has themes, setting it to \u003ccode\u003edracula\u003c/code\u003e made everything much better.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# sort.tape\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOutput assets/sort.mp4\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOutput assets/sort.gif\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRequire echo\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSet Shell \u0026#34;bash\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSet FontSize 32\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSet Width 1920\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSet Height 1080\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+ Set Theme \u0026#39;Dracula\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/ada8f04d-88ac-41c3-9983-d9e849cc13ad.mp4\" class=\"glightbox-link\" aria-label=\"sort.mp4\"\u003e\u003cvideo autoplay loop muted playsinline controls preload=\"metadata\" class=\"md-video\" poster=\"https://dropper.waylonwalker.com/api/file/ada8f04d-88ac-41c3-9983-d9e849cc13ad.webp?h=675\u0026w=1200\"\u003e\u003csource src=\"https://dropper.waylonwalker.com/api/file/ada8f04d-88ac-41c3-9983-d9e849cc13ad.mp4\" type=\"video/mp4\"\u003esort.mp4\u003c/video\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"ninesui\"\u003eNinesUI \u003ca href=\"#ninesui\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI’m using these in my \u003ca href=\"https://github.com/WaylonWalker/ninesui\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003eninesui\u003c/a\u003e\nproject, right now they are in the readme, but maybe some docs will grow\neventually.  Right now its hardcore explore phase.\u003c/p\u003e\n",
      "content_text": "\n\nI've been working on\n[ninesui](https://github.com/WaylonWalker/ninesui/blob/main/README.md),\ninspired by k9s see [thoughts-633](https://thoughts.waylonwalker.com/post/633).\nI want a good flow for making video for the readme and I am using [charm.sh](https://charm.sh/apps/)'s [vhs](https://github.com/charmbracelet/vhs) for this.\nIts running in an archBTW distrobox and looks gawdaweful.\n\n![sort.mp4](https://dropper.waylonwalker.com/api/file/e86047ed-6881-43f7-8e3a-30411d51afaf.mp4)\n\nThe over saturated colors give it a really retro look, seems fine, but not my\ncup of tea.  I tried to change the textual theme to `tokyo-night` and it might\nhave made it a bit better, but still over-saturated.\n\n## After\n\nWhat I found is that vhs has themes, setting it to `dracula` made everything much better.\n\n``` diff\n# sort.tape\nOutput assets/sort.mp4\nOutput assets/sort.gif\n\nRequire echo\n\nSet Shell \"bash\"\nSet FontSize 32\nSet Width 1920\nSet Height 1080\n+ Set Theme 'Dracula'\n```\n\n![sort.mp4](https://dropper.waylonwalker.com/api/file/ada8f04d-88ac-41c3-9983-d9e849cc13ad.mp4)\n\n## NinesUI\n\nI'm using these in my [ninesui](https://github.com/WaylonWalker/ninesui)\nproject, right now they are in the readme, but maybe some docs will grow\neventually.  Right now its hardcore explore phase.\n",
      "summary": "I've been working on ninesui, inspired by k9s see thoughts-633. I want a good flow for making video for the readme and I am using charm.sh's vhs for this....",
      "date_published": "2025-05-16T08:24:51Z",
      "date_modified": "2025-05-16T08:24:51Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "terminal",
        "tui",
        "vhs"
      ]
    },
    {
      "id": "https://waylonwalker.com/grafana-dashboards-as-k8s-configmap/",
      "url": "https://waylonwalker.com/grafana-dashboards-as-k8s-configmap/",
      "title": "grafana dashboards as k8s configmap",
      "content_html": "\u003cp\u003eI’m trying to learn proper logs, monitoring, otel, and grafana.  Today I\nimported a bunch of pre-made k8s dashboards and made a few of my own for\nspecific apps, and it made me want to know how I can turn my own custom\ndashboards into infrastructure as code.  Turns out grafana makes it pretty easy\nto do this, if you have the grafana dashboard sidecar running.  It will pick up\nany ConfigMap with the grafana_dashboard label and import it.\u003c/p\u003e\n\u003cp\u003eGo to Dashboards -\u0026gt; Pick a Dashboard -\u0026gt; Export -\u0026gt; JSON.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/530e8515-a72a-4341-82d7-37f6f985e327.webp\" class=\"glightbox-link\" aria-label=\"image\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/530e8515-a72a-4341-82d7-37f6f985e327.webp\" alt=\"image\"/ data-glightbox=\"description: image\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/d792b2db-2dcf-465f-a400-e84f199ec22d.webp\" class=\"glightbox-link\" aria-label=\"image\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/d792b2db-2dcf-465f-a400-e84f199ec22d.webp\" alt=\"image\"/ data-glightbox=\"description: image\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/684701cc-efec-4e2b-9630-c8aea7ff5b14.webp\" class=\"glightbox-link\" aria-label=\"image\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/684701cc-efec-4e2b-9630-c8aea7ff5b14.webp\" alt=\"image\"/ data-glightbox=\"description: image\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eConfigMap\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emy-dashboard\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emeta\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003elabels\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003egrafana_dashboard\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003emy-dashboard.json\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      \u0026#34;annotations\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        \u0026#34;list\u0026#34;: [\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      ...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      \u0026#34;uid\u0026#34;: \u0026#34;fel2uhjhepg5ce\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      \u0026#34;version\u0026#34;: 3\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    }\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI'm trying to learn proper logs, monitoring, otel, and grafana.  Today I\nimported a bunch of pre-made k8s dashboards and made a few of my own for\nspecific apps, and it made me want to know how I can turn my own custom\ndashboards into infrastructure as code.  Turns out grafana makes it pretty easy\nto do this, if you have the grafana dashboard sidecar running.  It will pick up\nany ConfigMap with the grafana_dashboard label and import it.\n\nGo to Dashboards -\u003e Pick a Dashboard -\u003e Export -\u003e JSON.\n\n![image](https://dropper.waylonwalker.com/api/file/530e8515-a72a-4341-82d7-37f6f985e327.webp)\n\n![image](https://dropper.waylonwalker.com/api/file/d792b2db-2dcf-465f-a400-e84f199ec22d.webp)\n\n![image](https://dropper.waylonwalker.com/api/file/684701cc-efec-4e2b-9630-c8aea7ff5b14.webp)\n\n``` yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: my-dashboard\n  namespace: meta\n  labels:\n    grafana_dashboard: \"1\"\ndata:\n  my-dashboard.json: |\n    {\n      \"annotations\": {\n        \"list\": [\n      ...\n      \"uid\": \"fel2uhjhepg5ce\",\n      \"version\": 3\n    }\n```\n",
      "summary": "I'm trying to learn proper logs, monitoring, otel, and grafana. Today I imported a bunch of pre-made k8s dashboards and made a few of my own for specific...",
      "date_published": "2025-05-06T20:24:35Z",
      "date_modified": "2025-05-06T20:24:35Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "grafana",
        "kubernetes",
        "otel"
      ]
    },
    {
      "id": "https://waylonwalker.com/ruff-single-line-import/",
      "url": "https://waylonwalker.com/ruff-single-line-import/",
      "title": "ruff single line import",
      "content_html": "\u003cp\u003eI’ve been using ruff to lint my python code for quite awhile now, I was pretty\nearly to jump on it after release.  Some of my projects have had a nice\nforce-single-line setting and some have not.  I dug into the docs and it was\nnot clear what I needed to make it work.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eruff\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eselect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;I\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"c\"\u003e# you probably want others as well\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eruff\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eisort\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eforce-single-line\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTurns out I was missing \u003cstrong\u003eI\u003c/strong\u003esort in the select list.\u003c/p\u003e\n",
      "content_text": "\nI've been using ruff to lint my python code for quite awhile now, I was pretty\nearly to jump on it after release.  Some of my projects have had a nice\nforce-single-line setting and some have not.  I dug into the docs and it was\nnot clear what I needed to make it work.\n\n``` toml\n[tool.ruff]\nselect = ['I'] # you probably want others as well\n\n[tool.ruff.isort]\nforce-single-line = true\n```\n\nTurns out I was missing **I**sort in the select list.\n",
      "summary": "I've been using ruff to lint my python code for quite awhile now, I was pretty early to jump on it after release. Some of my projects have had a nice...",
      "date_published": "2025-05-04T14:23:41Z",
      "date_modified": "2025-05-04T14:23:41Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linting",
        "python",
        "ruff"
      ]
    },
    {
      "id": "https://waylonwalker.com/markata-list-posts-by-year/",
      "url": "https://waylonwalker.com/markata-list-posts-by-year/",
      "title": "Markata list posts by year",
      "content_html": "\u003cp\u003eI was looking back at my \u003ca class=\"wikilink\" data-date=\"2025-01-22\" data-description=\"I\u0026#39;ve been posting on this site since 2016, when layoffs were rolling through the company I worked for at the time. Starting a personal blog and a pile of...\" data-title=\"analytics\" href=\"/analytics/\" data-preview=\"I\u0026#39;ve been posting on this site since 2016, when layoffs were rolling through the company I worked for at the time. Starting a personal blog and a pile of...\"\u003eanalytics\u003c/a\u003e page today and wondered what were my\nposts about back at the beginning.  My blog is managed by \u003ca class=\"wikilink\" data-date=\"2024-05-30\" data-description=\"This post is a work in progress.\" data-title=\"markata\" href=\"/markata/\" data-preview=\"This post is a work in progress.\"\u003emarkata\u003c/a\u003e so I\nlooked at a few ways you could pull those posts up.  Turns out it’s pretty\nsimple to do, use the markata map with a filter.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003emarkata\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eMarkata\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003em\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;title, slug, date\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003efilter\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;date.year==2016\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003esort\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;date\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ethe filter is python eval that should evaluate to a boolean, all of the\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eattributes of the post are available to filter on.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch3 id=\"result\"\u003eResult \u003ca href=\"#result\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;⭐ jupyterlab jupyterlab\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;jupyterlab-jupyterlab\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e2016\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e12\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e13\u003c/span\u003e\u003cspan class=\"p\"\u003e)),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;⭐ nickhould tidy-data-python\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;nickhould-tidy-data-python\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e2016\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e12\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e9\u003c/span\u003e\u003cspan class=\"p\"\u003e)),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;⭐ mikeckennedy write-pythonic-code-demos\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;mikeckennedy-write-pythonic-code-demos\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e2016\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e11\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e22\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;⭐ mikeckennedy write-pythonic-code-for-better-data-science-webcast\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;mikeckennedy-write-pythonic-code-for-better-data-science-webcast\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e2016\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e11\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e22\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;⭐ rajshah4 dlgroup\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;rajshah4-dlgroup\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e2016\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e11\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e18\u003c/span\u003e\u003cspan class=\"p\"\u003e)),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;⭐ pandas-dev pandas\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;pandas-dev-pandas\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e2016\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou could use the \u003ccode\u003elist\u003c/code\u003e command as well right within your shell and the same\nmap and filters work.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e⬢ \u003cspan class=\"o\"\u003e[\u003c/span\u003edevtainer-0.1.3\u003cspan class=\"o\"\u003e]\u003c/span\u003e ❯ markata list --map title --filter\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;date.year==2016\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003e22:35:06\u003cspan class=\"o\"\u003e]\u003c/span\u003e 2088/2145 posts skipped                                                                       skip.py:36\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           57/2145 posts not skipped                                                                     skip.py:37\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e⭐ pandas-dev pandas\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e⭐ rajshah4 dlgroup\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e⭐ mikeckennedy write-pythonic-code-for-better-data-science-webcast\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e⭐ mikeckennedy write-pythonic-code-demos\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e⭐ nickhould tidy-data-python\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e⭐ jupyterlab jupyterlab\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou could also do it with jin right inside of a markdown post using the\n\u003ca href=\"https://markata.dev/markata/plugins/jinja-md/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/markata.dev.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/markata.dev.ico\" class=\"has-avatar  has-avatar-before\"\u003ejinja_md\u003c/a\u003e plugin.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% raw %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for title, slug, date in markata.map(\u0026#39;title, slug, date\u0026#39;, filter=\u0026#39;date.year==2016\u0026#39;, sort=\u0026#39;date\u0026#39;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{title}}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{slug}}\u003c/span\u003e) - {{date}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endraw %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eYou do have to `jinja: true` in the frontmatter of the post.\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/div\u003e\n\u003ch3 id=\"result-1\"\u003eResult \u003ca href=\"#result-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e{% for title, slug, date in markata.map(’title, slug, date’, filter=‘date.year==2016’, sort=‘date’) %}\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"%7B%7Bslug%7D%7D\"\u003e{{title}}\u003c/a\u003e - {{date}}\n{% endfor %}\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nI was looking back at my \u003ca href=\"/analytics/\" class=\"wikilink\" data-title=\"analytics\" data-description=\"I\u0026#39;ve been posting on this site since 2016, when layoffs were rolling through the company I worked for at the time. Starting a personal blog and a pile of...\" data-date=\"2025-01-22\"\u003eanalytics\u003c/a\u003e page today and wondered what were my\nposts about back at the beginning.  My blog is managed by \u003ca href=\"/markata/\" class=\"wikilink\" data-title=\"markata\" data-description=\"This post is a work in progress.\" data-date=\"2024-05-30\"\u003emarkata\u003c/a\u003e so I\nlooked at a few ways you could pull those posts up.  Turns out it's pretty\nsimple to do, use the markata map with a filter.\n\n\n``` python\nfrom markata import Markata\n\nm.map('title, slug, date', filter='date.year==2016', sort='date')\n```\n\n!!! Note\n    the filter is python eval that should evaluate to a boolean, all of the\n    attributes of the post are available to filter on.\n\n### Result\n\n``` python\n[\n    ('⭐ jupyterlab jupyterlab', 'jupyterlab-jupyterlab', datetime.date(2016, 12, 13)),\n    ('⭐ nickhould tidy-data-python', 'nickhould-tidy-data-python', datetime.date(2016, 12, 9)),\n    (\n        '⭐ mikeckennedy write-pythonic-code-demos',\n        'mikeckennedy-write-pythonic-code-demos',\n        datetime.date(2016, 11, 22)\n    ),\n    (\n        '⭐ mikeckennedy write-pythonic-code-for-better-data-science-webcast',\n        'mikeckennedy-write-pythonic-code-for-better-data-science-webcast',\n        datetime.date(2016, 11, 22)\n    ),\n    ('⭐ rajshah4 dlgroup', 'rajshah4-dlgroup', datetime.date(2016, 11, 18)),\n    ('⭐ pandas-dev pandas', 'pandas-dev-pandas', datetime.date(2016, 10, 5))\n]\n```\n\nYou could use the `list` command as well right within your shell and the same\nmap and filters work.\n\n``` bash\n⬢ [devtainer-0.1.3] ❯ markata list --map title --filter='date.year==2016'\n[22:35:06] 2088/2145 posts skipped                                                                       skip.py:36\n           57/2145 posts not skipped                                                                     skip.py:37\n\n⭐ pandas-dev pandas\n⭐ rajshah4 dlgroup\n⭐ mikeckennedy write-pythonic-code-for-better-data-science-webcast\n⭐ mikeckennedy write-pythonic-code-demos\n⭐ nickhould tidy-data-python\n⭐ jupyterlab jupyterlab\n```\n\nYou could also do it with jin right inside of a markdown post using the\n[jinja_md](https://markata.dev/markata/plugins/jinja-md/) plugin.\n\n``` md\n{% raw %}\n{% for title, slug, date in markata.map('title, slug, date', filter='date.year==2016', sort='date') %}\n* [{{title}}]({{slug}}) - {{date}}\n{% endfor %}\n{% endraw %}\n```\n\n!!! Note\n    You do have to `jinja: true` in the frontmatter of the post.\n\n### Result\n\n{% for title, slug, date in markata.map('title, slug, date', filter='date.year==2016', sort='date') %}\n* [{{title}}]({{slug}}) - {{date}}\n{% endfor %}\n",
      "summary": "I was looking back at my analytics page today and wondered what were my posts about back at the beginning. My blog is managed by markata so I looked at a few...",
      "date_published": "2025-05-01T22:35:47Z",
      "date_modified": "2025-05-01T22:35:47Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "markata",
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/use-pbpaste-for-clean-shell-history/",
      "url": "https://waylonwalker.com/use-pbpaste-for-clean-shell-history/",
      "title": "Use pbpaste for clean shell history",
      "content_html": "\u003cp\u003eUsing \u003ccode\u003epbpaste\u003c/code\u003e for command substitution keeps sensitive or long URLs out of\nyour shell history. Instead of typing \u003ccode\u003egit clone https://github.com/user/repo-with-long-name.git\u003c/code\u003e, copy the URL to clipboard and\nrun \u003ccode\u003egit clone \u0026#34;$(pbpaste)\u0026#34;\u003c/code\u003e. This prevents the URL from appearing in\n\u003ccode\u003e~/.bash_history\u003c/code\u003e or \u003ccode\u003e~/.zsh_history\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eTo get pbpaste working on both Xorg and Wayland, add this to your shell config:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003ecommand\u003c/span\u003e -v wl-copy\u003cspan class=\"k\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003ealias\u003c/span\u003e \u003cspan class=\"nv\"\u003epbcopy\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;wl-copy\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pbpaste\u003cspan class=\"o\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e{\u003c/span\u003e wl-paste\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eelif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003ecommand\u003c/span\u003e -v xclip\u003cspan class=\"k\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003ealias\u003c/span\u003e \u003cspan class=\"nv\"\u003epbcopy\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;xclip -selection clipboard\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pbpaste\u003cspan class=\"o\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e{\u003c/span\u003e xclip -selection clipboard -o\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe function approach (instead of alias) enables command substitution, while\nthe quotes around \u003ccode\u003e$(pbpaste)\u003c/code\u003e handle spaces and special characters safely.\u003c/p\u003e\n\u003cp\u003eNow you can use it.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003epbpaste\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eMore importantly secrets can stay out of your history.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eGITHUB_TOKEN\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003epbpaste\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eAWS_ACCESS_KEY_ID\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003epbpaste\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eAWS_SECRET_ACCESS_KEY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003epbpaste\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eDATABASE_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003epbpaste\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nUsing `pbpaste` for command substitution keeps sensitive or long URLs out of\nyour shell history. Instead of typing `git clone\nhttps://github.com/user/repo-with-long-name.git`, copy the URL to clipboard and\nrun `git clone \"$(pbpaste)\"`. This prevents the URL from appearing in\n`~/.bash_history` or `~/.zsh_history`.\n\nTo get pbpaste working on both Xorg and Wayland, add this to your shell config:\n\n```bash\nif [[ $(command -v wl-copy) ]]; then\n    alias pbcopy='wl-copy'\n    pbpaste() { wl-paste; }\nelif [[ $(command -v xclip) ]]; then\n    alias pbcopy='xclip -selection clipboard'\n    pbpaste() { xclip -selection clipboard -o; }\nfi\n```\n\nThe function approach (instead of alias) enables command substitution, while\nthe quotes around `$(pbpaste)` handle spaces and special characters safely.\n\nNow you can use it.\n\n``` bash\ngit clone \"$(pbpaste)\"\n```\n\nMore importantly secrets can stay out of your history.\n\n``` bash\nexport GITHUB_TOKEN=\"$(pbpaste)\"\nexport AWS_ACCESS_KEY_ID=\"$(pbpaste)\"\nexport AWS_SECRET_ACCESS_KEY=\"$(pbpaste)\"\nexport DATABASE_URL=\"$(pbpaste)\"\n```\n",
      "summary": "Using for command substitution keeps sensitive or long URLs out of your shell history. Instead of typing , copy the URL to clipboard and run . This prevents...",
      "date_published": "2025-03-17T12:00:00Z",
      "date_modified": "2025-03-17T12:00:00Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "cli",
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/pre-commit-exclude/",
      "url": "https://waylonwalker.com/pre-commit-exclude/",
      "title": "pre-commit exclude",
      "content_html": "\u003cp\u003eI run tailwind for my personal blog, whenever I update it, pre-commit goes in\nand fixes end of file.  I’m sick of these things fighting each other, since it\nis a generated app it is going to et ignored from pre-commit from now on.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eexclude\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e^static/app.*\\.css$\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erepos\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/pre-commit/pre-commit-hooks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev2.4.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etrailing-whitespace\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eend-of-file-fixer\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck-yaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck-added-large-files\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nI run tailwind for my personal blog, whenever I update it, pre-commit goes in\nand fixes end of file.  I'm sick of these things fighting each other, since it\nis a generated app it is going to et ignored from pre-commit from now on.\n\n``` yaml\nexclude: ^static/app.*\\.css$\nrepos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v2.4.0\n    hooks:\n      - id: trailing-whitespace\n      - id: end-of-file-fixer\n      - id: check-yaml\n      - id: check-added-large-files\n```\n",
      "summary": "I run tailwind for my personal blog, whenever I update it, pre-commit goes in and fixes end of file. I'm sick of these things fighting each other, since it...",
      "date_published": "2025-02-20T08:11:35Z",
      "date_modified": "2025-02-20T08:11:35Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/newlines-in-css-before/",
      "url": "https://waylonwalker.com/newlines-in-css-before/",
      "title": "newlines in css before",
      "content_html": "\u003cp\u003eI’m building in a [[ fragmentions ]] implementation into my blog, I wanted to\nadd some text before the fragment to indidate that it was the highlighted\nfragment that someone may have intended to share with you.\u003c/p\u003e\n\u003cp\u003eTo get a newline in a \u003ccode\u003e:before\u003c/code\u003e I need to use \u003ccode\u003e\\A\u003c/code\u003e and \u003ccode\u003ewhite-space: pre-line\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003etarget\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003ebefore\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"nt\"\u003efragmention\u003c/span\u003e\u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003ebefore\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Highlighted Fragment:\\A\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ewhite-space\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003epre-line\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003efont-bold\u003c/span\u003e \u003cspan class=\"err\"\u003etext-yellow-600\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eHere is what it looks like on my not yet live implementation of fragmentions.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/fb693b92-3744-45a5-9220-bd914162f435.png\" class=\"glightbox-link\" aria-label=\"screenshot-2025-02-15T15-43-06-372Z.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/fb693b92-3744-45a5-9220-bd914162f435.png\" alt=\"screenshot-2025-02-15T15-43-06-372Z.png\"/ data-glightbox=\"description: screenshot-2025-02-15T15-43-06-372Z.png\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nI'm building in a [[ fragmentions ]] implementation into my blog, I wanted to\nadd some text before the fragment to indidate that it was the highlighted\nfragment that someone may have intended to share with you.\n\nTo get a newline in a `:before` I need to use `\\A` and `white-space: pre-line`.\n\n``` css\nbody :target::before,\nbody [fragmention]::before {\n    content: \"Highlighted Fragment:\\A\";\n    white-space: pre-line;\n    @apply font-bold text-yellow-600;\n}\n```\n\nHere is what it looks like on my not yet live implementation of fragmentions.\n\n![screenshot-2025-02-15T15-43-06-372Z.png](https://dropper.waylonwalker.com/api/file/fb693b92-3744-45a5-9220-bd914162f435.png)\n",
      "summary": "I'm building in a fragmentions implementation into my blog, I wanted to add some text before the fragment to indidate that it was the highlighted fragment...",
      "date_published": "2025-02-15T09:28:48Z",
      "date_modified": "2025-02-15T09:28:48Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/testing-nvim-installs/",
      "url": "https://waylonwalker.com/testing-nvim-installs/",
      "title": "testing nvim installs",
      "content_html": "\u003cp\u003eTesting fresh nvim installs can be a pain, and hard to di without borking your\nknown good install.  I’ve been using \u003ccode\u003eNVIM_APPNAME\u003c/code\u003e to run a test nvim in a\nsandbox that wont bork my main install.  This usually runs for me in under a\nminute, can be down under 15s if I remove some of the TreeSitter installs at\nthe end.  This beats a full docker build of my full devtainer to test out nvim\npackaging woes.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm ~/.cache/wwtest -rf\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm ~/.local/share/wwtest -rf\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm ~/.config/wwtest -rf\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecp -r nvim/.config/nvim/ ~/.config/wwtest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eNVIM_APPNAME\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ewwtest nvim --headless \u003cspan class=\"s2\"\u003e\u0026#34;+Lazy sync\u0026#34;\u003c/span\u003e +qa\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eNVIM_APPNAME\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ewwtest nvim --headless \u003cspan class=\"s2\"\u003e\u0026#34;+TSUpdateSync\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;+sleep 5000m\u0026#34;\u003c/span\u003e +qa\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eNVIM_APPNAME\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ewwtest nvim --headless \u003cspan class=\"s2\"\u003e\u0026#34;+MasonUpdate\u0026#34;\u003c/span\u003e +qa\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eNVIM_APPNAME\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ewwtest nvim --headless \u003cspan class=\"s2\"\u003e\u0026#34;+TSInstallSync! c cpp go lua python rust tsx javascript typescript vimdoc vim bash yaml toml vue just\u0026#34;\u003c/span\u003e +qa\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eNVIM_APPNAME\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ewwtest nvim --headless \u003cspan class=\"s2\"\u003e\u0026#34;+MasonInstall lua-language-server rustywind ruff ruff-lsp html-lsp typescript-language-server beautysh fixjson isort markdownlint stylua yamlfmt python-lsp-server\u0026#34;\u003c/span\u003e +qa\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eNVIM_APPNAME\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ewwtest nvim\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI’ve started to use this as a \u003ccode\u003ejust\u003c/code\u003e recipe to run before deploying a new\nversion of my dotfiles. So far its pairing nicely with \u003ca class=\"wikilink\" data-date=\"2025-01-12\" data-description=\"I recently built a cli application as a nearly-one-shot-app called nvim-manager. It manages your nvim dotfiles install.\" data-title=\"nvim-manager\" href=\"/nvim-manager/\" data-preview=\"I recently built a cli application as a nearly-one-shot-app called nvim-manager. It manages your nvim dotfiles install.\"\u003envim-manager\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nTesting fresh nvim installs can be a pain, and hard to di without borking your\nknown good install.  I've been using `NVIM_APPNAME` to run a test nvim in a\nsandbox that wont bork my main install.  This usually runs for me in under a\nminute, can be down under 15s if I remove some of the TreeSitter installs at\nthe end.  This beats a full docker build of my full devtainer to test out nvim\npackaging woes.\n\n``` bash\nrm ~/.cache/wwtest -rf\nrm ~/.local/share/wwtest -rf\nrm ~/.config/wwtest -rf\ncp -r nvim/.config/nvim/ ~/.config/wwtest\nNVIM_APPNAME=wwtest nvim --headless \"+Lazy sync\" +qa\nNVIM_APPNAME=wwtest nvim --headless \"+TSUpdateSync\" \"+sleep 5000m\" +qa\nNVIM_APPNAME=wwtest nvim --headless \"+MasonUpdate\" +qa\nNVIM_APPNAME=wwtest nvim --headless \"+TSInstallSync! c cpp go lua python rust tsx javascript typescript vimdoc vim bash yaml toml vue just\" +qa\nNVIM_APPNAME=wwtest nvim --headless \"+MasonInstall lua-language-server rustywind ruff ruff-lsp html-lsp typescript-language-server beautysh fixjson isort markdownlint stylua yamlfmt python-lsp-server\" +qa\nNVIM_APPNAME=wwtest nvim\n```\n\nI've started to use this as a `just` recipe to run before deploying a new\nversion of my dotfiles. So far its pairing nicely with \u003ca href=\"/nvim-manager/\" class=\"wikilink\" data-title=\"nvim-manager\" data-description=\"I recently built a cli application as a nearly-one-shot-app called nvim-manager. It manages your nvim dotfiles install.\" data-date=\"2025-01-12\"\u003envim-manager\u003c/a\u003e\n",
      "summary": "Testing fresh nvim installs can be a pain, and hard to di without borking your known good install. I've been using to run a test nvim in a sandbox that wont...",
      "date_published": "2025-02-12T21:02:03Z",
      "date_modified": "2025-02-12T21:02:03Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "just",
        "neovim"
      ]
    },
    {
      "id": "https://waylonwalker.com/vim-date/",
      "url": "https://waylonwalker.com/vim-date/",
      "title": "vim date",
      "content_html": "\u003cp\u003eWhen I want to put a date in a document like a blog post from vim I use !!date\nfrom insert mode.  Note that entering \u003ccode\u003e!!\u003c/code\u003e from normal mode puts you in command\nmode with \u003ccode\u003e:.!\u003c/code\u003e filled out.  This runs a shell command, i.e. \u003ccode\u003edate\u003c/code\u003e for this\nexample.\u003c/p\u003e\n\u003cp\u003eIt outputs the following\u003c/p\u003e\n\u003cp\u003eFri Jan 31 08:46:11 PM CST 2025\u003c/p\u003e\n\u003cp\u003eYou can also pass in a date such as tommorrow by pasdding in the -d \u003ccode\u003edate -d tomorrow\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIt outputs the following\u003c/p\u003e\n\u003cp\u003eSat Feb  1 08:53:20 PM CST 2025\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecodeium just taught me this one with autocomplete\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003eput\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"nx\"\u003estrftime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;%Y-%m-%d\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis outputs the following\u003c/p\u003e\n\u003cp\u003e2025-01-31\u003c/p\u003e\n\u003cp\u003eWhat I like about the \u003ccode\u003e:put =strftime(\u003c/code\u003e method is that you can add a format,\nbut that is a lot more for me to remember than \u003ccode\u003e!!date\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"a-few-weeks-later\"\u003eA few weeks later \u003ca href=\"#a-few-weeks-later\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI’m going through a bunch of blog posts and dont want my date formats to change\nto the Wed Feb format so I broke down and made these keybindings.  I think I’m\nstill going to be using \u003ccode\u003e.!date\u003c/code\u003e a lot, but these keybindings will be nice for\nediting blog post frontmatter.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;n\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;leader\u0026gt;dd\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;cmd\u0026gt;put =strftime(\u0026#39;%Y-%m-%d\u0026#39;)\u0026lt;cr\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003enoremap\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003esilent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;n\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;leader\u0026gt;dt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;cmd\u0026gt;put =strftime(\u0026#39;%Y-%m-%d %H:%M:%S\u0026#39;)\u0026lt;cr\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003enoremap\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003esilent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u003cleader\u003edd 2025-02-12\u003c/leader\u003e\u003c/li\u003e\n\u003cli\u003e\u003cleader\u003edt 2025-02-12 12:53:47\u003c/leader\u003e\u003c/li\u003e\n\u003cli\u003e:.!date    Wed Feb 12 12:53:47 PM CST 2025\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nWhen I want to put a date in a document like a blog post from vim I use !!date\nfrom insert mode.  Note that entering `!!` from normal mode puts you in command\nmode with `:.!` filled out.  This runs a shell command, i.e. `date` for this\nexample.\n\nIt outputs the following\n\nFri Jan 31 08:46:11 PM CST 2025\n\nYou can also pass in a date such as tommorrow by pasdding in the -d `date -d tomorrow`.\n\nIt outputs the following\n\nSat Feb  1 08:53:20 PM CST 2025\n\n\u003e codeium just taught me this one with autocomplete\n\n``` vim\n:put =strftime('%Y-%m-%d')\n```\n\nThis outputs the following\n\n2025-01-31\n\nWhat I like about the `:put =strftime(` method is that you can add a format,\nbut that is a lot more for me to remember than `!!date`\n\n## A few weeks later\n\nI'm going through a bunch of blog posts and dont want my date formats to change\nto the Wed Feb format so I broke down and made these keybindings.  I think I'm\nstill going to be using `.!date` a lot, but these keybindings will be nice for\nediting blog post frontmatter.\n\n``` lua\nset(\"n\", \"\u003cleader\u003edd\", \"\u003ccmd\u003eput =strftime('%Y-%m-%d')\u003ccr\u003e\", { noremap = true, silent = true })\nset(\"n\", \"\u003cleader\u003edt\", \"\u003ccmd\u003eput =strftime('%Y-%m-%d %H:%M:%S')\u003ccr\u003e\", { noremap = true, silent = true })\n```\n\n* \u003cleader\u003edd 2025-02-12\n* \u003cleader\u003edt 2025-02-12 12:53:47\n* :.!date    Wed Feb 12 12:53:47 PM CST 2025\n",
      "summary": "When I want to put a date in a document like a blog post from vim I use !!date from insert mode. Note that entering from normal mode puts you in command mode...",
      "date_published": "2025-02-12T12:51:00Z",
      "date_modified": "2025-02-12T12:51:00Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "neovim",
        "vim"
      ]
    },
    {
      "id": "https://waylonwalker.com/aptitude-why/",
      "url": "https://waylonwalker.com/aptitude-why/",
      "title": "aptitude why",
      "content_html": "\u003cp\u003eToday I ran into an interesting question, why am I being asked to configure\ntzdata while installing npm.  Turns out that the \u003ccode\u003eaptitude\u003c/code\u003e cli has a why\ncommand that very handily nails down why you have something installed on a\ndebian based system.\u003c/p\u003e\n\u003ch2 id=\"install-aptitude\"\u003eInstall aptitude \u003ca href=\"#install-aptitude\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt install aptitude\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"why-tzdata\"\u003eWhy tzdata \u003ca href=\"#why-tzdata\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow we can query why we need tzdata and see the full chain with the root\npackage being \u003ccode\u003enpm\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eroot@47685221fb82:/# aptitude why tzdata\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei   npm        Depends  node-gyp\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei A node-gyp   Depends  gyp \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u0026gt;\u003cspan class=\"o\"\u003e=\u003c/span\u003e 0.1+20200513gitcaa6002\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei A gyp        Depends  python3:any\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei A python3    Provides python3:any\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei A python3    Depends  python3.12 \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u0026gt;\u003cspan class=\"o\"\u003e=\u003c/span\u003e 3.12.3-0~\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei A python3.12 Depends  tzdata\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nToday I ran into an interesting question, why am I being asked to configure\ntzdata while installing npm.  Turns out that the `aptitude` cli has a why\ncommand that very handily nails down why you have something installed on a\ndebian based system.\n\n## Install aptitude\n\n``` bash\napt install aptitude\n```\n\n## Why tzdata\n\nNow we can query why we need tzdata and see the full chain with the root\npackage being `npm`.\n\n``` bash\nroot@47685221fb82:/# aptitude why tzdata\ni   npm        Depends  node-gyp\ni A node-gyp   Depends  gyp (\u003e= 0.1+20200513gitcaa6002)\ni A gyp        Depends  python3:any\ni A python3    Provides python3:any\ni A python3    Depends  python3.12 (\u003e= 3.12.3-0~)\ni A python3.12 Depends  tzdata\n```\n",
      "summary": "Today I ran into an interesting question, why am I being asked to configure tzdata while installing npm. Turns out that the cli has a why command that very...",
      "date_published": "2025-02-11T13:55:04Z",
      "date_modified": "2025-02-11T13:55:04Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/configure-tz/",
      "url": "https://waylonwalker.com/configure-tz/",
      "title": "configure timezone",
      "content_html": "\u003cp\u003eToday I ran into this interactive prompt on ubuntu while installing node and\nnpm, and I do not want to manually configure this interactively every time I\nrun an install, moreso in docker I do not have the interactive terminal to do\nso.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eConfiguring tzdata\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePlease \u003cspan class=\"k\"\u003eselect\u003c/span\u003e the geographic area in which you live. Subsequent configuration questions will narrow this down by presenting a list of cities, representing the \u003cspan class=\"nb\"\u003etime\u003c/span\u003e zones in which they are located.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  1. Africa  2. America  3. Antarctica  4. Arctic  5. Asia  6. Atlantic  7. Australia  8. Europe  9. Indian  10. Pacific  11. Etc  12. Legacy\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGeographic area:\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"why-tzdata\"\u003eWhy tzdata \u003ca href=\"#why-tzdata\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eChecking aptitude why tzdata it shows that the chain goes back through npm.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eroot@47685221fb82:/# aptitude why tzdata\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei   npm        Depends  node-gyp\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei A node-gyp   Depends  gyp \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u0026gt;\u003cspan class=\"o\"\u003e=\u003c/span\u003e 0.1+20200513gitcaa6002\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei A gyp        Depends  python3:any\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei A python3    Provides python3:any\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei A python3    Depends  python3.12 \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u0026gt;\u003cspan class=\"o\"\u003e=\u003c/span\u003e 3.12.3-0~\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ei A python3.12 Depends  tzdata\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"the-solution-configure-tzdata\"\u003eThe solution, configure tzdata \u003ca href=\"#the-solution-configure-tzdata\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eTZ\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;America/Chicago\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eDEBIAN_FRONTEND\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003enoninteractive\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt install tzdata -y\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eln -fs /usr/share/zoneinfo/\u003cspan class=\"nv\"\u003e$TZ\u003c/span\u003e /etc/localtime\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edpkg-reconfigure -f noninteractive tzdata\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition tip\"\u003e\n\u003cp class=\"admonition-title\"\u003eDEBIAN_FRONTEND=noninteractive\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eThis is required, because apt installing tzdata will trigger the\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003einteractive prompt.  You will manually configure it in the next two steps.\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n\nToday I ran into this interactive prompt on ubuntu while installing node and\nnpm, and I do not want to manually configure this interactively every time I\nrun an install, moreso in docker I do not have the interactive terminal to do\nso.\n\n``` bash\nConfiguring tzdata\n------------------\n\nPlease select the geographic area in which you live. Subsequent configuration questions will narrow this down by presenting a list of cities, representing the time zones in which they are located.\n\n  1. Africa  2. America  3. Antarctica  4. Arctic  5. Asia  6. Atlantic  7. Australia  8. Europe  9. Indian  10. Pacific  11. Etc  12. Legacy\nGeographic area:\n```\n\n## Why tzdata\n\nChecking aptitude why tzdata it shows that the chain goes back through npm.\n\n``` bash\nroot@47685221fb82:/# aptitude why tzdata\ni   npm        Depends  node-gyp\ni A node-gyp   Depends  gyp (\u003e= 0.1+20200513gitcaa6002)\ni A gyp        Depends  python3:any\ni A python3    Provides python3:any\ni A python3    Depends  python3.12 (\u003e= 3.12.3-0~)\ni A python3.12 Depends  tzdata\n```\n\n## The solution, configure tzdata\n\n``` bash\nexport TZ=\"America/Chicago\"\nexport DEBIAN_FRONTEND=noninteractive\napt update\napt install tzdata -y\nln -fs /usr/share/zoneinfo/$TZ /etc/localtime\ndpkg-reconfigure -f noninteractive tzdata\n```\n\n!!! TIP DEBIAN_FRONTEND=noninteractive\n    This is required, because apt installing tzdata will trigger the\n    interactive prompt.  You will manually configure it in the next two steps.\n",
      "summary": "Today I ran into this interactive prompt on ubuntu while installing node and npm, and I do not want to manually configure this interactively every time I run...",
      "date_published": "2025-02-10T13:35:24Z",
      "date_modified": "2025-02-10T13:35:24Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/bc/",
      "url": "https://waylonwalker.com/bc/",
      "title": "bc",
      "content_html": "\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=03KsS09YS4E\u0026amp;t=610s\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/www.youtube.com.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/www.youtube.com.png\" class=\"has-avatar  has-avatar-before\"\u003ehttps://www.youtube.com/watch?v=03KsS09YS4E\u0026amp;t=610s\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eToday I learned about the basic calculator, bc.  At the very end of this video\nprime uses it to add numbers in vim.\u003c/p\u003e\n\u003ch2 id=\"repl\"\u003eREPL \u003ca href=\"#repl\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou can start a calculator repl at the command line, by running bc.\u003c/p\u003e\n\u003ch2 id=\"vim\"\u003eVim \u003ca href=\"#vim\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSince bc supports standard unix pipes you can easily pipe data from vim into bc\nand back out using \u003ccode\u003e!!bc\u003c/code\u003e.  All you need is a string of math on the line you\nwant to calculate, go to normal mode and run \u003ccode\u003e!!bc\u003c/code\u003e to get the answer.\u003c/p\u003e\n\u003cp\u003eTraditionally I will open my system calculator or ipython to do something like\nthis.\u003c/p\u003e\n\u003cp\u003eTo keep the equation and the result in the same line you can send the equation\nto stderr and the result to stdout using tee.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:.!tee \u0026gt;\u003cspan class=\"o\"\u003e(\u003c/span\u003ecat \u0026gt;\u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e2\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e bc\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\u003chttps://www.youtube.com/watch?v=03KsS09YS4E\u0026t=610s\u003e\n\nToday I learned about the basic calculator, bc.  At the very end of this video\nprime uses it to add numbers in vim.\n\n## REPL\n\nYou can start a calculator repl at the command line, by running bc.\n\n## Vim\n\nSince bc supports standard unix pipes you can easily pipe data from vim into bc\nand back out using `!!bc`.  All you need is a string of math on the line you\nwant to calculate, go to normal mode and run `!!bc` to get the answer.\n\nTraditionally I will open my system calculator or ipython to do something like\nthis.\n\nTo keep the equation and the result in the same line you can send the equation\nto stderr and the result to stdout using tee.\n\n``` bash\n:.!tee \u003e(cat \u003e\u00262) | bc\n```\n",
      "date_published": "2025-02-08T09:30:08Z",
      "date_modified": "2025-02-08T09:30:08Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/tailwind-aspect/",
      "url": "https://waylonwalker.com/tailwind-aspect/",
      "title": "tailwind aspect",
      "content_html": "\u003cp\u003eI’ve been back to putting some images on my blog lately and thinking about\nmaking them a bit thinner through the use of aspect ratio for simplicity.  I’m\nleaning pretty heavy on tailwindcss these days due to some weird quirks of\nmarkdown-it-attrs I cannot have slashes in classes from markdown so I made a\n\u003ccode\u003e.cinematic\u003c/code\u003e class to achieve this.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecinematic\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003easpect-[2.39/1]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eExample\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png\" class=\"glightbox-link\" aria-label=\"screenshot-2025-01-31T14-50-00-094Z.png\"\u003e\u003cimg src=\"https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png\" alt=\"screenshot-2025-01-31T14-50-00-094Z.png\" class=\"cinematic glightbox\"/ data-glightbox=\"description: screenshot-2025-01-31T14-50-00-094Z.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI've been back to putting some images on my blog lately and thinking about\nmaking them a bit thinner through the use of aspect ratio for simplicity.  I'm\nleaning pretty heavy on tailwindcss these days due to some weird quirks of\nmarkdown-it-attrs I cannot have slashes in classes from markdown so I made a\n`.cinematic` class to achieve this.\n\n``` css\n.cinematic {\n  @apply aspect-[2.39/1];\n}\n```\n\nExample\n\n![screenshot-2025-01-31T14-50-00-094Z.png](https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png){.cinematic}\n",
      "summary": "I've been back to putting some images on my blog lately and thinking about making them a bit thinner through the use of aspect ratio for simplicity. I'm...",
      "date_published": "2025-02-02T14:35:02Z",
      "date_modified": "2025-02-02T14:35:02Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "tailwindcss",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/markdown-it-attrs-with-slashes-dont-work/",
      "url": "https://waylonwalker.com/markdown-it-attrs-with-slashes-dont-work/",
      "title": "markdown it attrs with slashes dont work",
      "content_html": "\u003cp\u003eAttrs does not like ‘/’ characters in its classes, so to use some tailwind\nclasses with custom values we must make new classes in our tailwind input css.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecinematic\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003easpect-[2.39/1]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eGiven the following markdown with attrs added to the image and to the paragraph\nblock.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003escreenshot-2025-01-31T14-50-00-094Z.png\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png\u003c/span\u003e){.aspect-[2.39/1]}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003escreenshot-2025-01-31T14-50-00-094Z.png\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png\u003c/span\u003e){.cinematic}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{.cinematic}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003escreenshot-2025-01-31T14-50-00-094Z.png\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWe get the following output with only the middle one working correctly.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png\" class=\"glightbox-link\" aria-label=\"screenshot-2025-01-31T14-50-00-094Z.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png\" alt=\"screenshot-2025-01-31T14-50-00-094Z.png\"/ data-glightbox=\"description: screenshot-2025-01-31T14-50-00-094Z.png\"\u003e\u003c/a\u003e{.aspect-[2.39/1]}\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png\" class=\"glightbox-link\" aria-label=\"screenshot-2025-01-31T14-50-00-094Z.png\"\u003e\u003cimg src=\"https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png\" alt=\"screenshot-2025-01-31T14-50-00-094Z.png\" class=\"cinematic glightbox\"/ data-glightbox=\"description: screenshot-2025-01-31T14-50-00-094Z.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp class=\"cinematic\"\u003e\u003ca href=\"https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png\" class=\"glightbox-link\" aria-label=\"screenshot-2025-01-31T14-50-00-094Z.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png\" alt=\"screenshot-2025-01-31T14-50-00-094Z.png\"/ data-glightbox=\"description: screenshot-2025-01-31T14-50-00-094Z.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eThe inline version of `.cinematic` works, but `.aspect-[2.39/1]` does not,\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eit turns into text after the image.  The block version with the class\nbefore the image applies to the paragraph, not the image.\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n\nAttrs does not like '/' characters in its classes, so to use some tailwind\nclasses with custom values we must make new classes in our tailwind input css.\n\n``` css\n.cinematic {\n  @apply aspect-[2.39/1];\n}\n```\n\nGiven the following markdown with attrs added to the image and to the paragraph\nblock.\n\n``` markdown\n![screenshot-2025-01-31T14-50-00-094Z.png](https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png){.aspect-[2.39/1]}\n\n![screenshot-2025-01-31T14-50-00-094Z.png](https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png){.cinematic}\n\n{.cinematic}\n![screenshot-2025-01-31T14-50-00-094Z.png](https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png)\n```\n\nWe get the following output with only the middle one working correctly.\n\n![screenshot-2025-01-31T14-50-00-094Z.png](https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png){.aspect-[2.39/1]}\n\n![screenshot-2025-01-31T14-50-00-094Z.png](https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png){.cinematic}\n\n{.cinematic}\n![screenshot-2025-01-31T14-50-00-094Z.png](https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png)\n\n!!! Note\n    The inline version of `.cinematic` works, but `.aspect-[2.39/1]` does not,\n    it turns into text after the image.  The block version with the class\n    before the image applies to the paragraph, not the image.\n",
      "summary": "Attrs does not like '/' characters in its classes, so to use some tailwind classes with custom values we must make new classes in our tailwind input css.",
      "date_published": "2025-02-01T11:21:10Z",
      "date_modified": "2025-02-01T11:21:10Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "blog",
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/setting-up-nvim-manager-starship-prompt/",
      "url": "https://waylonwalker.com/setting-up-nvim-manager-starship-prompt/",
      "title": "setting up nvim-manager starship prompt",
      "content_html": "\u003cp\u003eI built out a tool for myself to manage my nvim configuration, and I wanted to\nquickly see which one I am running in my starship prompt. Here’s the config I\nended up with.  It warns if the \u003ccode\u003eNVIM_APPNAME\u003c/code\u003e environment variable is not set, and\nit shows which nvim I am using if it is set.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ecustom\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003envim-manager-system\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewhen\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;[[ ! -n \u0026#34;${NVIM_APPNAME}\u0026#34; ]]\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;bold yellow\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esymbol\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;[ ](fg:#15AABF)\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;$symbol[USING SYSTEM NVIM]($style)\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eenv_var\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eNVIM_APPNAME\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;green\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esymbol\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;[ ](fg:#15AABF)\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;[$symbol${env_value}]($style)\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003evariable\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;NVIM_APPNAME\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI built out a tool for myself to manage my nvim configuration, and I wanted to\nquickly see which one I am running in my starship prompt. Here's the config I\nended up with.  It warns if the `NVIM_APPNAME` environment variable is not set, and\nit shows which nvim I am using if it is set.\n\n``` toml\n[custom.nvim-manager-system]\nwhen = '[[ ! -n \"${NVIM_APPNAME}\" ]]'\nstyle = \"bold yellow\"\nsymbol = '[ ](fg:#15AABF)'\nformat = '$symbol[USING SYSTEM NVIM]($style)'\n\n[env_var.NVIM_APPNAME]\nstyle = \"green\"\nsymbol = '[ ](fg:#15AABF)'\nformat = '[$symbol${env_value}]($style)'\nvariable = \"NVIM_APPNAME\"\n```\n",
      "summary": "I built out a tool for myself to manage my nvim configuration, and I wanted to quickly see which one I am running in my starship prompt. Here's the config I...",
      "date_published": "2025-01-21T16:03:46Z",
      "date_modified": "2025-01-21T16:03:46Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "neovim",
        "nvim-manager",
        "starship"
      ]
    },
    {
      "id": "https://waylonwalker.com/emoji-in-headless-chrome-in-docker/",
      "url": "https://waylonwalker.com/emoji-in-headless-chrome-in-docker/",
      "title": "emoji in headless chrome in docker",
      "content_html": "\u003cp\u003eI recently noticed that my \u003ca href=\"/og/\" class=\"glossary-term\" title=\"OG is short for open graph, a set of standard meta tags that are used for social media sharing. This is what tells other websites how to describe and display...\"\u003eog\u003c/a\u003e images were missing emoji.  They were taken using\nheadless chrome in a container.  I fixed it by adding an emoji font in the\ncontainerfile / dockerfile.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e apt-get update \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e apt-get install -y \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Add fonts with emoji support\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    fonts-noto-color-emoji \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e rm -rf /var/lib/apt/lists/*\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"before\"\u003eBefore \u003ca href=\"#before\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere’s what they were looking like with broken emoji fonts.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/6e9060f2-0e15-4f22-88b6-b6ec5ddb34de.webp\" class=\"glightbox-link\" aria-label=\"image\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/6e9060f2-0e15-4f22-88b6-b6ec5ddb34de.webp\" alt=\"image\"/ data-glightbox=\"description: image\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"after\"\u003eAfter \u003ca href=\"#after\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAnd now with the fixed emoji font.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/8ed5e338-50c2-4130-8cce-549ecc802f01.webp\" class=\"glightbox-link\" aria-label=\"image\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/8ed5e338-50c2-4130-8cce-549ecc802f01.webp\" alt=\"image\"/ data-glightbox=\"description: image\"\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\u003cp\u003eI put thought bubbles on my thoughts posts and stars on my github stars posts\u003c/p\u003e\u003c/figcaption\u003e\u003c/figure\u003e\n",
      "content_text": "\nI recently noticed that my og images were missing emoji.  They were taken using\nheadless chrome in a container.  I fixed it by adding an emoji font in the\ncontainerfile / dockerfile.\n\n``` Dockerfile\nRUN apt-get update \u0026\u0026 apt-get install -y \\\n    # Add fonts with emoji support\n    fonts-noto-color-emoji \\\n    \u0026\u0026 rm -rf /var/lib/apt/lists/*\n```\n\n## Before\n\nHere's what they were looking like with broken emoji fonts.\n\n![image](https://dropper.waylonwalker.com/api/file/6e9060f2-0e15-4f22-88b6-b6ec5ddb34de.webp)\n\n## After\n\nAnd now with the fixed emoji font.\n\n![image](https://dropper.waylonwalker.com/api/file/8ed5e338-50c2-4130-8cce-549ecc802f01.webp)\n\n\u003e I put thought bubbles on my thoughts posts and stars on my github stars posts\n",
      "summary": "I recently noticed that my og images were missing emoji. They were taken using headless chrome in a container. I fixed it by adding an emoji font in the...",
      "date_published": "2025-01-20T13:55:37Z",
      "date_modified": "2025-01-20T13:55:37Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "docker"
      ]
    },
    {
      "id": "https://waylonwalker.com/postiz-file-upload/",
      "url": "https://waylonwalker.com/postiz-file-upload/",
      "title": "postiz-file-upload",
      "content_html": "\u003cp\u003eToday I learned that the docs in postiz are a bit behind, (fantastic docs btw,\nthey are to the point, and cover almost all of what you need).  The docs state\nthat you need to include an R2 bucket to handle uploads.\u003c/p\u003e\n\u003cp\u003eThis \u003ca href=\"https://github.com/gitroomhq/postiz-app/issues/322\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003eissue\u003c/a\u003e shows that\nmore work has been done, one of which is local storage.  The \u003ca href=\"https://docs.postiz.com/installation/docker-compose\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/docs.postiz.com.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/docs.postiz.com.png\" class=\"has-avatar  has-avatar-before\"\u003ecompose\nfile\u003c/a\u003e they use in the\nquick start has the required env variables to set this up.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eSTORAGE_PROVIDER\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;local\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eUPLOAD_DIRECTORY\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/uploads\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eNEXT_PUBLIC_UPLOAD_DIRECTORY\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/uploads\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003elooking into my running instance I can see my images there.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e⬢ \u003cspan class=\"o\"\u003e[\u003c/span\u003edevtainer\u003cspan class=\"o\"\u003e]\u003c/span\u003e ❯ podman \u003cspan class=\"nb\"\u003eexec\u003c/span\u003e postiz ls /uploads/2025/01/09\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e811747b3f703f5d9a7f10aff5103412ff0.jpeg\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ea221db10a76f0c414171ab417379b09ec.jpeg\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nToday I learned that the docs in postiz are a bit behind, (fantastic docs btw,\nthey are to the point, and cover almost all of what you need).  The docs state\nthat you need to include an R2 bucket to handle uploads.\n\nThis [issue](https://github.com/gitroomhq/postiz-app/issues/322) shows that\nmore work has been done, one of which is local storage.  The [compose\nfile](https://docs.postiz.com/installation/docker-compose) they use in the\nquick start has the required env variables to set this up.\n\n```yaml\n      STORAGE_PROVIDER: \"local\"\n      UPLOAD_DIRECTORY: \"/uploads\"\n      NEXT_PUBLIC_UPLOAD_DIRECTORY: \"/uploads\"\n```\n\nlooking into my running instance I can see my images there.\n\n``` bash\n⬢ [devtainer] ❯ podman exec postiz ls /uploads/2025/01/09\n811747b3f703f5d9a7f10aff5103412ff0.jpeg\na221db10a76f0c414171ab417379b09ec.jpeg\n```\n",
      "summary": "Today I learned that the docs in postiz are a bit behind, (fantastic docs btw, they are to the point, and cover almost all of what you need). The docs state...",
      "date_published": "2025-01-10T20:35:39Z",
      "date_modified": "2025-01-10T20:35:39Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "compose",
        "containers",
        "docker",
        "postiz",
        "social"
      ]
    },
    {
      "id": "https://waylonwalker.com/links-rely-on-color-to-be-distiniquishable/",
      "url": "https://waylonwalker.com/links-rely-on-color-to-be-distiniquishable/",
      "title": "Links rely on color to be distiniquishable",
      "content_html": "\u003cp\u003eToday i got hit by this accessibility issue on my site.  Low contrast links are\nnot distiniquishable.  I had not seen this error title before it was new to me,\nmaybe I have bad memory or maybe it’s new to me.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/24b4e31f-60db-47b8-b67c-07c4d4b6fb71.webp\" class=\"glightbox-link\" aria-label=\"screenshot-2024-12-18T02-25-53-014Z.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/24b4e31f-60db-47b8-b67c-07c4d4b6fb71.webp\" alt=\"screenshot-2024-12-18T02-25-53-014Z.png\"/ data-glightbox=\"description: screenshot-2024-12-18T02-25-53-014Z.png\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eI ended up dropping the background color of the site down a notch as I didn’t\nreally care for the semi-dark brown anyways.  I’m liking the near black\n\u003ccode\u003ebg-zinc-950\u003c/code\u003e much better now.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/8b4f2087-3f24-4212-ad00-74f294aff114.webp\" class=\"glightbox-link\" aria-label=\"screenshot-2024-12-18T02-45-53-807Z.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/8b4f2087-3f24-4212-ad00-74f294aff114.webp\" alt=\"screenshot-2024-12-18T02-45-53-807Z.png\"/ data-glightbox=\"description: screenshot-2024-12-18T02-45-53-807Z.png\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eNow I got that 100 A11y score in lighthouse.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/17497676-3730-4875-9e10-c6d121ba537a.webp\" class=\"glightbox-link\" aria-label=\"screenshot-2024-12-18T03-02-18-934Z.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/17497676-3730-4875-9e10-c6d121ba537a.webp\" alt=\"screenshot-2024-12-18T03-02-18-934Z.png\"/ data-glightbox=\"description: screenshot-2024-12-18T03-02-18-934Z.png\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nToday i got hit by this accessibility issue on my site.  Low contrast links are\nnot distiniquishable.  I had not seen this error title before it was new to me,\nmaybe I have bad memory or maybe it's new to me.\n\n![screenshot-2024-12-18T02-25-53-014Z.png](https://dropper.waylonwalker.com/api/file/24b4e31f-60db-47b8-b67c-07c4d4b6fb71.webp)\n\nI ended up dropping the background color of the site down a notch as I didn't\nreally care for the semi-dark brown anyways.  I'm liking the near black\n`bg-zinc-950` much better now.\n\n![screenshot-2024-12-18T02-45-53-807Z.png](https://dropper.waylonwalker.com/api/file/8b4f2087-3f24-4212-ad00-74f294aff114.webp)\n\nNow I got that 100 A11y score in lighthouse.\n\n![screenshot-2024-12-18T03-02-18-934Z.png](https://dropper.waylonwalker.com/api/file/17497676-3730-4875-9e10-c6d121ba537a.webp)\n",
      "summary": "Today i got hit by this accessibility issue on my site. Low contrast links are not distiniquishable. I had not seen this error title before it was new to me,...",
      "date_published": "2024-12-17T20:25:12Z",
      "date_modified": "2024-12-17T20:25:12Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/urllink/",
      "url": "https://waylonwalker.com/urllink/",
      "title": "urllink",
      "content_html": "\u003cp\u003eToday I discovered the \u003ccode\u003eUrllink\u003c/code\u003e function in bash from the ujust tool from\n\u003ca href=\"https://ublue.it\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/ublue.it.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/ublue.it.png\" class=\"has-avatar  has-avatar-before\"\u003eublue.it\u003c/a\u003e.  Seems like a cool trick, but might not work\neverywhere.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e########\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e### Special text formating\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e########\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## Function to generate a clickable link, you can call this using\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# url=$(Urllink \u0026#34;https://ublue.it\u0026#34; \u0026#34;Visit the ublue website\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# echo \u0026#34;${url}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efunction\u003c/span\u003e Urllink \u003cspan class=\"o\"\u003e(){\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eURL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003e$1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eTEXT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003e$2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Generate a clickable hyperlink\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\\e]8;;%s\\e\\\\%s\\e]8;;\\e\\\\\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$URL\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$TEXT\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003en\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e```\u003c/span\u003ej\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nToday I discovered the `Urllink` function in bash from the ujust tool from\n[ublue.it](https://ublue.it).  Seems like a cool trick, but might not work\neverywhere.\n\n``` bash\n########\n### Special text formating\n########\n## Function to generate a clickable link, you can call this using\n# url=$(Urllink \"https://ublue.it\" \"Visit the ublue website\")\n# echo \"${url}\"\nfunction Urllink (){\n    URL=$1\n    TEXT=$2\n\n    # Generate a clickable hyperlink\n    printf \"\\e]8;;%s\\e\\\\%s\\e]8;;\\e\\\\\" \"$URL\" \"$TEXT${n}\"\n}\n```j\n",
      "summary": "Today I discovered the function in bash from the ujust tool from ublue.it. Seems like a cool trick, but might not work everywhere.",
      "date_published": "2024-12-14T11:11:52Z",
      "date_modified": "2024-12-14T11:11:52Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "bash",
        "cli"
      ]
    },
    {
      "id": "https://waylonwalker.com/debug-cloudflared-tunnel/",
      "url": "https://waylonwalker.com/debug-cloudflared-tunnel/",
      "title": "debug cloudflared tunnel",
      "content_html": "\u003cp\u003eI’ve been debugging a cloudflared tunnel issue in my \u003ca href=\"/homelab/\" class=\"glossary-term\" title=\"A place to self host applications. For me this is primarily self built web applications, and applications for sharing files with my family. Techno Tim has a...\"\u003ehomelab\u003c/a\u003e all day today, and\ngetting really frustrated.  My issue ended up being that it was running twice,\nonce without the correct config file and another with it.  I believe that\ncacheing may have compounded the issue.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn yesterday’s post I setup a cloudflared tunnel on my ubuntu server to\nexpose applications running on the server to the internet.  I’m setting up a\nnew server and running cloudflared in its own vm.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca class=\"wikilink\" data-date=\"2024-12-02\" data-description=\"I run a cloudflared tunnel on my ubuntu server to expose applications running on the server to the internet. I\u0026#39;m setting up a new server and running...\" data-title=\"setup cloudflared tunnel on ubuntu\" href=\"/setup-cloudflared-tunnel-on-ubuntu/\" data-preview=\"I run a cloudflared tunnel on my ubuntu server to expose applications running on the server to the internet. I\u0026#39;m setting up a new server and running...\"\u003esetup cloudflared tunnel on ubuntu\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"check-that-dns-is-pointing-to-the-correct-tunnel\"\u003eCheck that dns is pointing to the correct tunnel \u003ca href=\"#check-that-dns-is-pointing-to-the-correct-tunnel\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edig subdomain.example.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etraceroute subdomain.example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"check-that-the-tunnel-is-running\"\u003eCheck that the tunnel is running \u003ca href=\"#check-that-the-tunnel-is-running\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eCLOUDFLARED_TUNNEL_ID\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;my-tunnel-id\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecloudflared tunnel list\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecloudflared tunnel info \u003cspan class=\"nv\"\u003e$CLOUDFLARED_TUNNEL_ID\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've been debugging a cloudflared tunnel issue in my homelab all day today, and\ngetting really frustrated.  My issue ended up being that it was running twice,\nonce without the correct config file and another with it.  I believe that\ncacheing may have compounded the issue.\n\n\u003e In yesterday's post I setup a cloudflared tunnel on my ubuntu server to\n\u003e expose applications running on the server to the internet.  I'm setting up a\n\u003e new server and running cloudflared in its own vm.\n\n\u003ca href=\"/setup-cloudflared-tunnel-on-ubuntu/\" class=\"wikilink\" data-title=\"setup cloudflared tunnel on ubuntu\" data-description=\"I run a cloudflared tunnel on my ubuntu server to expose applications running on the server to the internet. I\u0026#39;m setting up a new server and running...\" data-date=\"2024-12-02\"\u003esetup cloudflared tunnel on ubuntu\u003c/a\u003e\n\n## Check that dns is pointing to the correct tunnel\n\n``` bash\ndig subdomain.example.com\ntraceroute subdomain.example.com\n```\n\n## Check that the tunnel is running\n\n``` bash\nexport CLOUDFLARED_TUNNEL_ID = \"my-tunnel-id\"\n\ncloudflared tunnel list\ncloudflared tunnel info $CLOUDFLARED_TUNNEL_ID\n```\n",
      "summary": "I've been debugging a cloudflared tunnel issue in my homelab all day today, and getting really frustrated. My issue ended up being that it was running twice,...",
      "date_published": "2024-12-03T15:36:37Z",
      "date_modified": "2024-12-03T15:36:37Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "homelab",
        "networking"
      ]
    },
    {
      "id": "https://waylonwalker.com/setup-cloudflared-tunnel-on-ubuntu/",
      "url": "https://waylonwalker.com/setup-cloudflared-tunnel-on-ubuntu/",
      "title": "setup cloudflared tunnel on ubuntu",
      "content_html": "\u003cp\u003eI run a cloudflared tunnel on my ubuntu server to expose applications running\non the server to the internet.  I’m setting up a new server and running\ncloudflared in its own vm.\u003c/p\u003e\n\u003ch2 id=\"get-the-cloudflared-binary\"\u003eGet the cloudflared binary \u003ca href=\"#get-the-cloudflared-binary\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -O /usr/local/bin/cloudflared\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo chmod +x /usr/local/bin/cloudflared\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"heading\"\u003e \u003ca href=\"#heading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow setup the config directory.  For the systemd service to work, the config\nfile needs to be in /etc/cloudflared.  I like to give my user rights to edit\nthe config file without being sudo, we will do that here by creating a group\n\u003ccode\u003ecloudflared\u003c/code\u003e, add ourselves to the group, give ownership of \u003ccode\u003e/etc/cloudflared\u003c/code\u003e\nto the group, give group write access to the directory, and refresh groups.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo mkdir -p /etc/cloudflared\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo groupadd cloudflared\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo usermod -aG cloudflared \u003cspan class=\"nv\"\u003e$USER\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo chown -R root:cloudflared /etc/cloudflared\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo chmod g+w /etc/cloudflared\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enewgrp cloudflared\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"login\"\u003elogin \u003ca href=\"#login\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow we can log into the domain zone with cloudflared.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecloudflared tunnel login\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis will give a url, follow it in a browser to log in.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecloudflared tunnel create \u0026lt;NAME\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emv ~/.cloudflared/cert.pem /etc/cloudflared/cert.pem\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emv ~/.cloudflared/\u0026lt;tunnel-id\u0026gt;.json /etc/cloudflared/\u0026lt;tunnel-id\u0026gt;.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"config\"\u003econfig \u003ca href=\"#config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow setup config.  For the systemd service to work, the config file needs to be\nin /etc/cloudflared.  The config that I have provided below will expose\nlocalhost:8000 to tester.example.com\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eCLOUDFLARED_TUNNEL_ID\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003els /etc/cloudflared/*.json \u003cspan class=\"p\"\u003e|\u003c/span\u003e xargs -n \u003cspan class=\"m\"\u003e1\u003c/span\u003e basename \u003cspan class=\"p\"\u003e|\u003c/span\u003e sed \u003cspan class=\"s1\"\u003e\u0026#39;s/\\.json$//\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emv ~/.cloudflared/\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eCLOUDFLARED_TUNNEL_ID\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e.json /etc/cloudflared/\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eCLOUDFLARED_TUNNEL_ID\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e.json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emv ~/.cloudflared/cert.pem /etc/cloudflared/cert.pem\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003etunnel: \u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003eCLOUDFLARED_TUNNEL_ID\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003ecredentials-file: /etc/cloudflared/\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003eCLOUDFLARED_TUNNEL_ID\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e.json\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003eingress:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  - hostname: tester.example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    service: http://localhost:8000\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  - service: \u0026#39;http_status:404\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; /etc/cloudflared/config.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"dns\"\u003edns \u003ca href=\"#dns\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow to get a dns record for tester.example.com to point to the cloudflared\ntunnel.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecloudflared tunnel route dns \u003cspan class=\"k\"\u003e$(\u003c/span\u003eCLOUDFLARED_TUNNEL_ID\u003cspan class=\"k\"\u003e)\u003c/span\u003e tester.example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"systemd\"\u003esystemd \u003ca href=\"#systemd\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow install the systemd service.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo cloudflared service install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl status cloudflared.service\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# if its not running\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl start cloudflared.service\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI run a cloudflared tunnel on my ubuntu server to expose applications running\non the server to the internet.  I'm setting up a new server and running\ncloudflared in its own vm.\n\n## Get the cloudflared binary\n\n```bash\nsudo wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -O /usr/local/bin/cloudflared\n\nsudo chmod +x /usr/local/bin/cloudflared\n```\n\n##\n\nNow setup the config directory.  For the systemd service to work, the config\nfile needs to be in /etc/cloudflared.  I like to give my user rights to edit\nthe config file without being sudo, we will do that here by creating a group\n`cloudflared`, add ourselves to the group, give ownership of `/etc/cloudflared`\nto the group, give group write access to the directory, and refresh groups.\n\n``` bash\nsudo mkdir -p /etc/cloudflared\nsudo groupadd cloudflared\nsudo usermod -aG cloudflared $USER\nsudo chown -R root:cloudflared /etc/cloudflared\nsudo chmod g+w /etc/cloudflared\nnewgrp cloudflared\n```\n\n## login\n\nNow we can log into the domain zone with cloudflared.\n\n```bash\ncloudflared tunnel login\n```\n\nThis will give a url, follow it in a browser to log in.\n\n``` bash\ncloudflared tunnel create \u003cNAME\u003e\nmv ~/.cloudflared/cert.pem /etc/cloudflared/cert.pem\nmv ~/.cloudflared/\u003ctunnel-id\u003e.json /etc/cloudflared/\u003ctunnel-id\u003e.json\n```\n\n## config\n\nNow setup config.  For the systemd service to work, the config file needs to be\nin /etc/cloudflared.  The config that I have provided below will expose\nlocalhost:8000 to tester.example.com\n\n``` bash\nexport CLOUDFLARED_TUNNEL_ID=$(ls /etc/cloudflared/*.json | xargs -n 1 basename | sed 's/\\.json$//')\nmv ~/.cloudflared/${CLOUDFLARED_TUNNEL_ID}.json /etc/cloudflared/${CLOUDFLARED_TUNNEL_ID}.json\nmv ~/.cloudflared/cert.pem /etc/cloudflared/cert.pem\necho \"\ntunnel: $(CLOUDFLARED_TUNNEL_ID)\ncredentials-file: /etc/cloudflared/$(CLOUDFLARED_TUNNEL_ID).json\ningress:\n  - hostname: tester.example.com\n    service: http://localhost:8000\n  - service: 'http_status:404'\n\" \u003e\u003e /etc/cloudflared/config.yaml\n```\n\n## dns\n\nNow to get a dns record for tester.example.com to point to the cloudflared\ntunnel.\n\n```bash\ncloudflared tunnel route dns $(CLOUDFLARED_TUNNEL_ID) tester.example.com\n```\n\n## systemd\n\nNow install the systemd service.\n\n``` bash\nsudo cloudflared service install\n```\n\n```bash\nsudo systemctl status cloudflared.service\n# if its not running\nsudo systemctl start cloudflared.service\n```\n",
      "summary": "I run a cloudflared tunnel on my ubuntu server to expose applications running on the server to the internet. I'm setting up a new server and running...",
      "date_published": "2024-12-02T15:43:45Z",
      "date_modified": "2024-12-02T15:43:45Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "homelab",
        "networking"
      ]
    },
    {
      "id": "https://waylonwalker.com/price-an-stl-print-on-slant3d/",
      "url": "https://waylonwalker.com/price-an-stl-print-on-slant3d/",
      "title": "price an stl print on slant3d",
      "content_html": "\u003cp\u003eI’ve been playing with 3d printing some items through the slant3d api.  I’ve\nbeen pricing out different prints by running a slice request through their api.\u003c/p\u003e\n\u003ch2 id=\"make-a-project\"\u003emake a project \u003ca href=\"#make-a-project\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI’ve been using uv for project management. It’s been working well for quick\nprojects like this while making it reproducible, I’m still all in on hatch for\nlibraries.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir slantproject\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e slantproject\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv venv\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e. ./.venv/bin/activate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv add httpx rich python-dotenv\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"get-an-api-key\"\u003eGet an api key \u003ca href=\"#get-an-api-key\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou will need an api key from the slant api, which currently requires a google\naccount and a credit card to create.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# .env\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#  replace with your api key from https://api-fe-two.vercel.app/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eSLANT_API_KEY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003esl-**\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"slicing-an-stl-with-teh-slant-api\"\u003eslicing an stl with teh slant api \u003ca href=\"#slicing-an-stl-with-teh-slant-api\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThen you can run the python script to price out your print.  I’m not exactly\nsure how this compares to an order, especially when you add in different\nmaterials.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003edotenv\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eload_dotenv\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003ehttpx\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003eos\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eload_dotenv\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003estl_url\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapi_key\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;SLANT_API_KEY\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapi\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ehttpx\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eClient\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ebase_url\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://www.slant3dapi.com/api/slicer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eres\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ehttpx\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;https://www.slant3dapi.com/api/slicer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ejson\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;fileURL\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003estl_url\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;api-key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eapi_key\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Content-Type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;application/json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etimeout\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e60\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've been playing with 3d printing some items through the slant3d api.  I've\nbeen pricing out different prints by running a slice request through their api.\n\n## make a project\n\nI've been using uv for project management. It's been working well for quick\nprojects like this while making it reproducible, I'm still all in on hatch for\nlibraries.\n\n``` bash\nmkdir slantproject\ncd slantproject\nuv init\nuv venv\n. ./.venv/bin/activate\nuv add httpx rich python-dotenv\n```\n\n## Get an api key\n\nYou will need an api key from the slant api, which currently requires a google\naccount and a credit card to create.\n\n``` env\n# .env\n#  replace with your api key from https://api-fe-two.vercel.app/\nSLANT_API_KEY=sl-**\n```\n\n## slicing an stl with teh slant api\n\nThen you can run the python script to price out your print.  I'm not exactly\nsure how this compares to an order, especially when you add in different\nmaterials.\n\n``` python\nfrom dotenv import load_dotenv\nimport httpx\nimport os\n\nload_dotenv()\n\nstl_url = ''\napi_key = os.environ[\"SLANT_API_KEY\"]\n\napi = httpx.Client(base_url=\"https://www.slant3dapi.com/api/slicer\")\n\nres = httpx.post(\n    \"https://www.slant3dapi.com/api/slicer\",\n    json={\"fileURL\": stl_url},\n    headers={\"api-key\": api_key, \"Content-Type\": \"application/json\"},\n    timeout=60,\n)\n\n\nprint(res.json())\n```\n",
      "summary": "I've been playing with 3d printing some items through the slant3d api. I've been pricing out different prints by running a slice request through their api.",
      "date_published": "2024-11-18T15:29:30Z",
      "date_modified": "2024-11-18T15:29:30Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/k3s-config-after-first-install/",
      "url": "https://waylonwalker.com/k3s-config-after-first-install/",
      "title": "k3s config after first install",
      "content_html": "\u003cp\u003eAfter first setting up a new k3s instance your kubeconfig file will be located\nin /etc/rancher/k3s/k3s.yaml.\u003c/p\u003e\n\u003cp\u003eYou cans use it from here by setting $KUBECONFIG to that file.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eKUBECONFIG\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e/etc/rancher/k3s/k3s.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr you can copy it to \u003ccode\u003e~/.kube/config\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecp /etc/rancher/k3s/k3s.yaml ~/.kube/config\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you have installed k3s on a remote server and need the config on your local\nmachine then you will need to modify the server address to reflect the remote\nserver.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003escp user@\u0026lt;server-ip\u0026gt;:/etc/rancher/k3s/k3s.yaml ~/.kube/config\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eWarning\u003c/p\u003e\n\u003cp\u003eonly do this if you don’t already have a ~/.kube/config file, otherwise copy\nit to a new file and set your $KUBECONFIG env variable to use it.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eNow you will need to open that file and change the server address, making sure\nto keep the port number.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eclusters\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003ecluster\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ecertificate-authority-data\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e****\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eserver\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://\u0026lt;server-ip\u0026gt;:6443\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edefault\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nAfter first setting up a new k3s instance your kubeconfig file will be located\nin /etc/rancher/k3s/k3s.yaml.\n\nYou cans use it from here by setting $KUBECONFIG to that file.\n\n```bash\nexport KUBECONFIG=/etc/rancher/k3s/k3s.yaml\n```\n\nOr you can copy it to `~/.kube/config`\n\n``` bash\ncp /etc/rancher/k3s/k3s.yaml ~/.kube/config\n```\n\nIf you have installed k3s on a remote server and need the config on your local\nmachine then you will need to modify the server address to reflect the remote\nserver.\n\n``` bash\nscp user@\u003cserver-ip\u003e:/etc/rancher/k3s/k3s.yaml ~/.kube/config\n```\n\n!!! warning\n  only do this if you don't already have a ~/.kube/config file, otherwise copy\n  it to a new file and set your $KUBECONFIG env variable to use it.\n\nNow you will need to open that file and change the server address, making sure\nto keep the port number.\n\n``` yaml\napiVersion: v1\nclusters:\n  - cluster:\n      certificate-authority-data: ****\n      server: https://\u003cserver-ip\u003e:6443\n    name: default\n```\n",
      "summary": "After first setting up a new k3s instance your kubeconfig file will be located in /etc/rancher/k3s/k3s.yaml.",
      "date_published": "2024-09-15T16:57:41Z",
      "date_modified": "2024-09-15T16:57:41Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "k3s",
        "kubernetes"
      ]
    },
    {
      "id": "https://waylonwalker.com/vim-gq/",
      "url": "https://waylonwalker.com/vim-gq/",
      "title": "Vim-gq",
      "content_html": "\u003cp\u003eVim has a handy feature to format text with \u003ccode\u003egq\u003c/code\u003e.  You can use it in visual\nmode, give it a motion, or if you give it \u003ccode\u003egqq\u003c/code\u003e it will format the current line.\nI use this quite often while writing in markdown, I do not use softwraps in vim,\nso \u003ccode\u003egqq\u003c/code\u003e quickly formats my current line into a paragraph.    Once I have done\nthis for a single line one time I typically switch to the motion for around\nparagraph \u003ccode\u003egqap\u003c/code\u003e to format the whole paragraph and not just the current line.\u003c/p\u003e\n\u003ch2 id=\"before-formatting\"\u003ebefore formatting \u003ca href=\"#before-formatting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/01c19159-c0b5-4920-b73c-774284b09940.webp\" class=\"glightbox-link\" aria-label=\"vim-gq-20240805122634078.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/01c19159-c0b5-4920-b73c-774284b09940.webp\" alt=\"vim-gq-20240805122634078.webp\"/ data-glightbox=\"description: vim-gq-20240805122634078.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"after-formattting\"\u003eafter formattting \u003ca href=\"#after-formattting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/e068e445-43e0-4e27-ac30-ac11e9cb9088.webp\" class=\"glightbox-link\" aria-label=\"vim-gq-20240805122700026.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/e068e445-43e0-4e27-ac30-ac11e9cb9088.webp\" alt=\"vim-gq-20240805122700026.webp\"/ data-glightbox=\"description: vim-gq-20240805122700026.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\n\nVim has a handy feature to format text with `gq`.  You can use it in visual\nmode, give it a motion, or if you give it `gqq` it will format the current line.\nI use this quite often while writing in markdown, I do not use softwraps in vim,\nso `gqq` quickly formats my current line into a paragraph.    Once I have done\nthis for a single line one time I typically switch to the motion for around\nparagraph `gqap` to format the whole paragraph and not just the current line.\n\n## before formatting\n\n![vim-gq-20240805122634078.webp](https://dropper.waylonwalker.com/api/file/01c19159-c0b5-4920-b73c-774284b09940.webp)\n\n## after formattting\n\n![vim-gq-20240805122700026.webp](https://dropper.waylonwalker.com/api/file/e068e445-43e0-4e27-ac30-ac11e9cb9088.webp)\n",
      "summary": "Vim has a handy feature to format text with . You can use it in visual mode, give it a motion, or if you give it it will format the current line. I use this...",
      "date_published": "2024-08-05T12:22:00Z",
      "date_modified": "2024-08-05T12:22:00Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "neovim",
        "vim"
      ]
    },
    {
      "id": "https://waylonwalker.com/slug/",
      "url": "https://waylonwalker.com/slug/",
      "title": "Slug",
      "content_html": "\u003cp\u003eA slug is the part of the url that comes after the domain.  Commonly matches the file name of a markdown file many blogging systems.  These are typically human readable, unique identifiers for pages within the site.\u003c/p\u003e\n",
      "content_text": "\nA slug is the part of the url that comes after the domain.  Commonly matches the file name of a markdown file many blogging systems.  These are typically human readable, unique identifiers for pages within the site.\n",
      "summary": "A slug is the part of the url that comes after the domain. Commonly matches the file name of a markdown file many blogging systems. These are typically human...",
      "date_published": "2024-08-05T11:45:00Z",
      "date_modified": "2024-08-05T11:45:00Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/obsidian-new-file/",
      "url": "https://waylonwalker.com/obsidian-new-file/",
      "title": "Obsidian-new-file",
      "content_html": "\u003cp\u003eWikilinks are a core concept within obsidian to link to documents by \u003ca class=\"wikilink\" data-date=\"2024-08-05\" data-description=\"A slug is the part of the url that comes after the domain. Commonly matches the file name of a markdown file many blogging systems. These are typically human...\" data-title=\"Slug\" href=\"/slug/\" data-preview=\"A slug is the part of the url that comes after the domain. Commonly matches the file name of a markdown file many blogging systems. These are typically human...\"\u003eSlug\u003c/a\u003e wrapped in double square brackets.  These are commonly used within wiki site generators.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[[slug]]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eObsidian gives you a keybinding \u003ccode\u003ealt+enter\u003c/code\u003e to go to that file, but if it does not exist it will create the file for you in the root of the project.  It’s a nice way to quickly make new documents.\u003c/p\u003e\n",
      "content_text": "Wikilinks are a core concept within obsidian to link to documents by \u003ca href=\"/slug/\" class=\"wikilink\" data-title=\"Slug\" data-description=\"A slug is the part of the url that comes after the domain. Commonly matches the file name of a markdown file many blogging systems. These are typically human...\" data-date=\"2024-08-05\"\u003eSlug\u003c/a\u003e wrapped in double square brackets.  These are commonly used within wiki site generators.\n\n``` markdown\n[[slug]]\n```\n\nObsidian gives you a keybinding `alt+enter` to go to that file, but if it does not exist it will create the file for you in the root of the project.  It's a nice way to quickly make new documents.\n",
      "summary": "Wikilinks are a core concept within obsidian to link to documents by slug wrapped in double square brackets. These are commonly used within wiki site...",
      "date_published": "2024-08-05T11:44:00Z",
      "date_modified": "2024-08-05T11:44:00Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "markdown",
        "obsidian"
      ]
    },
    {
      "id": "https://waylonwalker.com/obsidian-go-to-definition/",
      "url": "https://waylonwalker.com/obsidian-go-to-definition/",
      "title": "Obsidian-go-to-definition",
      "content_html": "\u003cp\u003eIt was not obvious to me, but if you have a wikilink such as \u003ca class=\"wikilink\" data-date=\"2024-07-31\" data-description=\"I am giving obsidian a try, this is a test post to learn the flow. Something that has been really hard for me for a long time is images, I don\u0026#39;t include a...\" data-title=\"Trying Obsidian\" href=\"/trying-obsidian/\" data-preview=\"I am giving obsidian a try, this is a test post to learn the flow. Something that has been really hard for me for a long time is images, I don\u0026#39;t include a...\"\u003eTrying Obsidian\u003c/a\u003e, you can jump to the file in obsidian, just like you can with lsp go to definition, the keybinding is alt + enter.\u003c/p\u003e\n",
      "content_text": "\nIt was not obvious to me, but if you have a wikilink such as \u003ca href=\"/trying-obsidian/\" class=\"wikilink\" data-title=\"Trying Obsidian\" data-description=\"I am giving obsidian a try, this is a test post to learn the flow. Something that has been really hard for me for a long time is images, I don\u0026#39;t include a...\" data-date=\"2024-07-31\"\u003eTrying Obsidian\u003c/a\u003e, you can jump to the file in obsidian, just like you can with lsp go to definition, the keybinding is alt + enter.\n",
      "summary": "It was not obvious to me, but if you have a wikilink such as trying-obsidian, you can jump to the file in obsidian, just like you can with lsp go to...",
      "date_published": "2024-08-04T20:35:00Z",
      "date_modified": "2024-08-04T20:35:00Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "markdown",
        "obsidian"
      ]
    },
    {
      "id": "https://waylonwalker.com/obsidian-using-templater-like-copier/",
      "url": "https://waylonwalker.com/obsidian-using-templater-like-copier/",
      "title": "Obsidian Using Templater Like Copier",
      "content_html": "\u003cp\u003eI’ve long used copier to create all of my posts for my blog, and it works\nreally well for my workflow.  I think of a title, call a template, and give it\na title.  out of the box obsidian did not seem to work this way.  It seems like\nit wants me to right click a file tree and make a new file using the tree, this\nis not my jam.\u003c/p\u003e\n\u003cp\u003eHere is what I came up with to replace my til template.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e---\ndate: \u0026lt;% tp.file.creation_date() %\u0026gt;\ntemplateKey: til\ntitle: \u0026lt;%*\n  const originalFileName = await tp.system.prompt(\u0026#34;Enter file name\u0026#34;);\n  const toTitleCase = str =\u0026gt; str.replace(\n    /\\w\\S*/g,\n    txt =\u0026gt; txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()\n  );\n  const title = toTitleCase(originalFileName);\n  tR += title + \u0026#39;\\n\u0026#39;; // Add the title to the template result\n-%\u0026gt;\npublished: true\ntags:\n  -\n---\n\u0026lt;%*\nconst fileName = originalFileName.toLowerCase().replace(/\\s+/g, \u0026#39;-\u0026#39;);\nconst newFilePath = `pages/til/${fileName}`;\nawait tp.file.move(newFilePath);\n-%\u0026gt;\n\n\u0026lt;% tp.file.cursor() %\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etR\u003c/code\u003e is a return value, and it gets placed directly into the place it is in the file\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eto.file.cursor()\u003c/code\u003e creates a tab-index point so I can tab into the content\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nI've long used copier to create all of my posts for my blog, and it works\nreally well for my workflow.  I think of a title, call a template, and give it\na title.  out of the box obsidian did not seem to work this way.  It seems like\nit wants me to right click a file tree and make a new file using the tree, this\nis not my jam.\n\nHere is what I came up with to replace my til template.\n\n```\n---\ndate: \u003c% tp.file.creation_date() %\u003e\ntemplateKey: til\ntitle: \u003c%*\n  const originalFileName = await tp.system.prompt(\"Enter file name\");\n  const toTitleCase = str =\u003e str.replace(\n    /\\w\\S*/g,\n    txt =\u003e txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()\n  );\n  const title = toTitleCase(originalFileName);\n  tR += title + '\\n'; // Add the title to the template result\n-%\u003e\npublished: true\ntags:\n  -\n---\n\u003c%*\nconst fileName = originalFileName.toLowerCase().replace(/\\s+/g, '-');\nconst newFilePath = `pages/til/${fileName}`;\nawait tp.file.move(newFilePath);\n-%\u003e\n\n\u003c% tp.file.cursor() %\u003e\n```\n\n* `tR` is a return value, and it gets placed directly into the place it is in the file\n* `to.file.cursor()` creates a tab-index point so I can tab into the content\n",
      "summary": "I've long used copier to create all of my posts for my blog, and it works really well for my workflow. I think of a title, call a template, and give it a...",
      "date_published": "2024-07-31T13:34:00Z",
      "date_modified": "2024-07-31T13:34:00Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "copier",
        "dev",
        "markdown",
        "obsidian"
      ]
    },
    {
      "id": "https://waylonwalker.com/obsidian-image-converter/",
      "url": "https://waylonwalker.com/obsidian-image-converter/",
      "title": "Obsidian Image Converter",
      "content_html": "\u003cp\u003eI’m giving obsidian a go as an editor for my blog and one of the main things I\nwant to fix in my workflow is the ability to quickly drop in images.  on first\nlook through the community plugins I found Image Converter.  I set it up to\nconvert to webp and drop them in a \u003ca href=\"/glossary/git/\" class=\"glossary-term\" title=\"Git is a version control system for tracking changes in source code during software development. In the beginning there were many, some were licensed. As...\"\u003egit\u003c/a\u003e submodule.  I may make it something\nother than a git repo in the future, but I’ve learned that adding images to my\nblog repo quickly makes it heavy and hard to clone on other machines.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/626d85b1-5588-45c4-a4f4-c372dc7c8ff3.webp\" class=\"glightbox-link\" aria-label=\"obsidian-image-converter-20240731211310793.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/626d85b1-5588-45c4-a4f4-c372dc7c8ff3.webp\" alt=\"obsidian-image-converter-20240731211310793.webp\"/ data-glightbox=\"description: obsidian-image-converter-20240731211310793.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eOnce the images are there they are pushed and deployed as their own site to\ncloudflare pages.  I made a quick edit to my \u003ca class=\"wikilink\" data-date=\"2024-05-30\" data-description=\"Today I set up some sick wikilink hover effects using tailwind see a-case-for-tailwindcss. When you hover over them they show an image preview of the link...\" data-title=\"sick wikilink hover\" href=\"/sick-wikilink-hover/\" data-preview=\"Today I set up some sick wikilink hover effects using tailwind see a-case-for-tailwindcss. When you hover over them they show an image preview of the link...\"\u003esick wikilink hover\u003c/a\u003e plugin for\nmy blog.  if it sees a wikilink ending in webp, convert the domain over to\nobsidian-assets.waylonwalker.com, and clean up the remaining \u003ccode\u003e\u0026#34;!  \u0026#34;\u003c/code\u003e that the\npython md-it library leaves behind.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eafter first try I needed to increase the width from 600 to 1400, the image in this post was unreadable.\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/div\u003e\n\u003cp\u003eThis is part of me getting set up and \u003ca class=\"wikilink\" data-date=\"2024-07-31\" data-description=\"I am giving obsidian a try, this is a test post to learn the flow. Something that has been really hard for me for a long time is images, I don\u0026#39;t include a...\" data-title=\"Trying Obsidian\" href=\"/trying-obsidian/\" data-preview=\"I am giving obsidian a try, this is a test post to learn the flow. Something that has been really hard for me for a long time is images, I don\u0026#39;t include a...\"\u003eTrying Obsidian\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI'm giving obsidian a go as an editor for my blog and one of the main things I\nwant to fix in my workflow is the ability to quickly drop in images.  on first\nlook through the community plugins I found Image Converter.  I set it up to\nconvert to webp and drop them in a git submodule.  I may make it something\nother than a git repo in the future, but I've learned that adding images to my\nblog repo quickly makes it heavy and hard to clone on other machines.\n\n![obsidian-image-converter-20240731211310793.webp](https://dropper.waylonwalker.com/api/file/626d85b1-5588-45c4-a4f4-c372dc7c8ff3.webp)\n\nOnce the images are there they are pushed and deployed as their own site to\ncloudflare pages.  I made a quick edit to my \u003ca href=\"/sick-wikilink-hover/\" class=\"wikilink\" data-title=\"sick wikilink hover\" data-description=\"Today I set up some sick wikilink hover effects using tailwind see a-case-for-tailwindcss. When you hover over them they show an image preview of the link...\" data-date=\"2024-05-30\"\u003esick wikilink hover\u003c/a\u003e plugin for\nmy blog.  if it sees a wikilink ending in webp, convert the domain over to\nobsidian-assets.waylonwalker.com, and clean up the remaining `\"!  \"` that the\npython md-it library leaves behind.\n\n!!! note\n    after first try I needed to increase the width from 600 to 1400, the image in this post was unreadable.\n\nThis is part of me getting set up and \u003ca href=\"/trying-obsidian/\" class=\"wikilink\" data-title=\"Trying Obsidian\" data-description=\"I am giving obsidian a try, this is a test post to learn the flow. Something that has been really hard for me for a long time is images, I don\u0026#39;t include a...\" data-date=\"2024-07-31\"\u003eTrying Obsidian\u003c/a\u003e\n",
      "summary": "I'm giving obsidian a go as an editor for my blog and one of the main things I want to fix in my workflow is the ability to quickly drop in images. on first...",
      "date_published": "2024-07-30T21:09:35Z",
      "date_modified": "2024-07-30T21:09:35Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "blog",
        "dev",
        "markdown",
        "obsidian"
      ]
    },
    {
      "id": "https://waylonwalker.com/convert-mp4-for-twitter-with-ffmpeg/",
      "url": "https://waylonwalker.com/convert-mp4-for-twitter-with-ffmpeg/",
      "title": "convert mp4 for twitter with ffmpeg",
      "content_html": "\u003cp\u003eI’ve had a couple of uploads to twitter fail recently and has been a pain.  I\ntried some online converters for convenience, but none of them worked.  I\nreached out to chatgpt and found succeess with this ffmpeg command.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003effmpeg -i input.mp4 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -vf \u003cspan class=\"s2\"\u003e\u0026#34;scale=trunc(oh*a/2)*2:min(720\\,trunc(ih*a/2)*2)\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -c:v libx264 -profile:v high -level:v 4.1 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -b:v 3500k -maxrate 3500k -bufsize 7000k \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -pix_fmt yuv420p \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -c:a aac -b:a 128k -ar \u003cspan class=\"m\"\u003e44100\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -movflags +faststart \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  output.mp4\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've had a couple of uploads to twitter fail recently and has been a pain.  I\ntried some online converters for convenience, but none of them worked.  I\nreached out to chatgpt and found succeess with this ffmpeg command.\n\n``` bash\nffmpeg -i input.mp4 \\\n  -vf \"scale=trunc(oh*a/2)*2:min(720\\,trunc(ih*a/2)*2)\" \\\n  -c:v libx264 -profile:v high -level:v 4.1 \\\n  -b:v 3500k -maxrate 3500k -bufsize 7000k \\\n  -pix_fmt yuv420p \\\n  -c:a aac -b:a 128k -ar 44100 \\\n  -movflags +faststart \\\n  output.mp4\n```\n",
      "summary": "I've had a couple of uploads to twitter fail recently and has been a pain. I tried some online converters for convenience, but none of them worked. I reached...",
      "date_published": "2024-07-25T12:51:29Z",
      "date_modified": "2024-07-25T12:51:29Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "bash",
        "cli"
      ]
    },
    {
      "id": "https://waylonwalker.com/arch-remove-orphaned-packages/",
      "url": "https://waylonwalker.com/arch-remove-orphaned-packages/",
      "title": "arch remove orphaned packages",
      "content_text": "\n",
      "date_published": "2024-07-06T11:34:31Z",
      "date_modified": "2024-07-06T11:34:31Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/kubebernetes-kustomize-diff/",
      "url": "https://waylonwalker.com/kubebernetes-kustomize-diff/",
      "title": "k8s kustomize diff",
      "content_html": "\u003cp\u003eI’ve started leaning in on kubernetes kustomize to customize my manifests per\ndeployment per environment.  Today I learned that it comes with a diff command.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl diff -k k8s/overlays/local\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can enable color diffs by using an external diff provider like colordiff.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eKUBECTL_EXTERNAL_DIFF\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;colordiff -N -u\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou might need to install colordiff if you don’t already have it.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo pacman -S colordiff\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install colordiff\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow I can try out kustomize changes and see the change with kustomize diff.\u003c/p\u003e\n",
      "content_text": "\nI've started leaning in on kubernetes kustomize to customize my manifests per\ndeployment per environment.  Today I learned that it comes with a diff command.\n\n``` bash\nkubectl diff -k k8s/overlays/local\n```\n\nYou can enable color diffs by using an external diff provider like colordiff.\n\n``` bash\nexport KUBECTL_EXTERNAL_DIFF=\"colordiff -N -u\"\n```\n\nYou might need to install colordiff if you don't already have it.\n\n``` bash\nsudo pacman -S colordiff\n\nsudo apt install colordiff\n```\n\nNow I can try out kustomize changes and see the change with kustomize diff.\n",
      "summary": "I've started leaning in on kubernetes kustomize to customize my manifests per deployment per environment. Today I learned that it comes with a diff command.",
      "date_published": "2024-07-06T09:42:42Z",
      "date_modified": "2024-07-06T09:42:42Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "kubernetes"
      ]
    },
    {
      "id": "https://waylonwalker.com/kubectl-dash-k/",
      "url": "https://waylonwalker.com/kubectl-dash-k/",
      "title": "kubectl dash k",
      "content_html": "\u003cp\u003eKubernetes ships with a feature called kustomize that allows you to customize\nyour manifests in a declarative way.  It’s a bit like helm, but easier to use.\nI found this useful.\u003c/p\u003e\n\u003ch2 id=\"kustomizationyaml\"\u003ekustomization.yaml \u003ca href=\"#kustomizationyaml\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn order to use kustomize you need to have a kustomization.yaml,\nkustomization.yml, or Kustomization file in the directory you are applying.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl apply -k .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eerror: unable to find one of \u003cspan class=\"s1\"\u003e\u0026#39;kustomization.yaml\u0026#39;\u003c/span\u003e, \u003cspan class=\"s1\"\u003e\u0026#39;kustomization.yml\u0026#39;\u003c/span\u003e or \u003cspan class=\"s1\"\u003e\u0026#39;Kustomization\u0026#39;\u003c/span\u003e in directory \u003cspan class=\"s1\"\u003e\u0026#39;/tank/git/kustomize-playground\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe kustomization.yaml file cannot be empty.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ kubectl apply -k pod\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eerror: kustomization.yaml is empty\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"lets-make-an-mvp\"\u003elets make an mvp \u003ca href=\"#lets-make-an-mvp\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir pod\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etouch pod/pod.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etouch pod/kustomization.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# pod.yaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# kustomization.yaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"overlays\"\u003eOverlays \u003ca href=\"#overlays\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOverlays must point to yaml or a directory with a kustomization.yaml file, and\ncannot reside inside the same directory causing a circular reference.\u003c/p\u003e\n\u003chr/\u003e\n\u003ch2 id=\"layout\"\u003eLayout \u003ca href=\"#layout\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ek8s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── base\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── deployment.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   └── kustomization.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── overlays\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── \u003cspan class=\"nb\"\u003elocal\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   │   └── kustomization.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── dev\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   │   └── kustomization.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   └── prod\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│       ├── special-prod.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│       └── kustomization.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"base\"\u003ebase \u003ca href=\"#base\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePlace all of the common k8s manifests here in the base directory along with\nkustomization.yaml.  You can split them up into separate files or just one\nfile, I’m keeping it to one for simiplicity.\u003c/p\u003e\n\u003ch2 id=\"base---kustomizationyaml\"\u003ebase - kustomization.yaml \u003ca href=\"#base---kustomizationyaml\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn the base kustomization.yaml file add all of the manifests that you want to\nuse as a resource.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eresources\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003edeployment.yaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"overlays-1\"\u003eoverlays \u003ca href=\"#overlays-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow for each separate environment that you want to have create a directory in\noverlays with a kustomization.yaml file, and any special manifests that only\napply to a particular environment.\u003c/p\u003e\n\u003ch2 id=\"overlays---kustomizationyaml\"\u003eoverlays - kustomization.yaml \u003ca href=\"#overlays---kustomizationyaml\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"resoures\"\u003eresoures \u003ca href=\"#resoures\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eresources\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003e../../base\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# any other specific resources, maybe special ones for prod here\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003esealed-dotenv.yaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"images\"\u003eimages \u003ca href=\"#images\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emy-image\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003enewName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edocker.io/myrepo/myimage\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003enewTag\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1.0.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nKubernetes ships with a feature called kustomize that allows you to customize\nyour manifests in a declarative way.  It's a bit like helm, but easier to use.\nI found this useful.\n\n## kustomization.yaml\n\nIn order to use kustomize you need to have a kustomization.yaml,\nkustomization.yml, or Kustomization file in the directory you are applying.\n\n``` bash\nkubectl apply -k .\nerror: unable to find one of 'kustomization.yaml', 'kustomization.yml' or 'Kustomization' in directory '/tank/git/kustomize-playground'\n```\n\nThe kustomization.yaml file cannot be empty.\n\n``` bash\n❯ kubectl apply -k pod\nerror: kustomization.yaml is empty\n```\n\n## lets make an mvp\n\n``` bash\nmkdir pod\ntouch pod/pod.yaml\ntouch pod/kustomization.yaml\n```\n\n``` yaml\n# pod.yaml\n```\n\n``` yaml\n# kustomization.yaml\n```\n\n## Overlays\n\nOverlays must point to yaml or a directory with a kustomization.yaml file, and\ncannot reside inside the same directory causing a circular reference.\n\n---\n\n## Layout\n\n``` bash\nk8s\n├── base\n│   ├── deployment.yaml\n│   └── kustomization.yaml\n├── overlays\n│   ├── local\n│   │   └── kustomization.yaml\n│   ├── dev\n│   │   └── kustomization.yaml\n│   └── prod\n│       ├── special-prod.yaml\n│       └── kustomization.yaml\n```\n\n## base\n\nPlace all of the common k8s manifests here in the base directory along with\nkustomization.yaml.  You can split them up into separate files or just one\nfile, I'm keeping it to one for simiplicity.\n\n## base - kustomization.yaml\n\nIn the base kustomization.yaml file add all of the manifests that you want to\nuse as a resource.\n\n``` yaml\nresources:\n  - deployment.yaml\n```\n\n## overlays\n\nNow for each separate environment that you want to have create a directory in\noverlays with a kustomization.yaml file, and any special manifests that only\napply to a particular environment.\n\n## overlays - kustomization.yaml\n\n### resoures\n\n``` yaml\nresources:\n  - ../../base\n# any other specific resources, maybe special ones for prod here\n  - sealed-dotenv.yaml\n```\n\n### images\n\n``` yaml\nimages:\n  - name: my-image\n    newName: docker.io/myrepo/myimage\n    newTag: 1.0.0\n```\n",
      "summary": "Kubernetes ships with a feature called kustomize that allows you to customize your manifests in a declarative way. It's a bit like helm, but easier to use. I...",
      "date_published": "2024-07-05T20:15:11Z",
      "date_modified": "2024-07-05T20:15:11Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "kubernetes"
      ]
    },
    {
      "id": "https://waylonwalker.com/animal-well-keyboard/",
      "url": "https://waylonwalker.com/animal-well-keyboard/",
      "title": "animal well keyboard",
      "content_html": "\u003cp\u003eAnimal well does not let you remap keys, and really doesn’t even inform you\nthat it is keyboard compatible.  I had to play around and discover the keymap,\nwhich can be a bit tricky on a 40% board.  This is what I found.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ewasd - move\u003c/li\u003e\n\u003cli\u003espace - jump / a\u003c/li\u003e\n\u003cli\u003eenter - interact / b\u003c/li\u003e\n\u003cli\u003ex - throw\u003c/li\u003e\n\u003cli\u003ec - inventory\u003c/li\u003e\n\u003cli\u003e1 - left item / rb\u003c/li\u003e\n\u003cli\u003e2 - open item menu / triangle\u003c/li\u003e\n\u003cli\u003e3 - right item / lb\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nAnimal well does not let you remap keys, and really doesn't even inform you\nthat it is keyboard compatible.  I had to play around and discover the keymap,\nwhich can be a bit tricky on a 40% board.  This is what I found.\n\n* wasd - move\n* space - jump / a\n* enter - interact / b\n* x - throw\n* c - inventory\n* 1 - left item / rb\n* 2 - open item menu / triangle\n* 3 - right item / lb\n",
      "summary": "Animal well does not let you remap keys, and really doesn't even inform you that it is keyboard compatible. I had to play around and discover the keymap,...",
      "date_published": "2024-07-04T21:58:41Z",
      "date_modified": "2024-07-04T21:58:41Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "animal-well",
        "game",
        "gaming"
      ]
    },
    {
      "id": "https://waylonwalker.com/diskcache-as-debounce/",
      "url": "https://waylonwalker.com/diskcache-as-debounce/",
      "title": "diskcache as debounce",
      "content_html": "\u003cp\u003eI’ve been using \u003ca href=\"/fastapi/\" class=\"glossary-term\" title=\"FastAPI is a modern and efficient web framework for Python, built on top of the Starlette web framework, and pydantic for data validation and serialization.\"\u003efastapi\u003c/a\u003e more and more lately and one feature I just started\nusing is background tasks [[ thoughts-333 ]].\u003c/p\u003e\n\u003cdiv class=\"admonition seealso\"\u003e\n\u003cp class=\"admonition-title\"\u003eSeealso\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ebasic diskcache example \u0026lt;a href=\u0026#34;/python-diskcache/\u0026#34; class=\u0026#34;wikilink\u0026#34; data-title=\u0026#34;How I setup a sqlite cache in python\u0026#34; data-description=\u0026#34;When I need to cache some data between runs or share a cache accross multiple processes my go to library in python is . It\u0026amp;#39;s built on sqlite with just enough...\u0026#34; data-date=\u0026#34;2022-03-29\u0026#34;\u0026gt;How I setup a sqlite cache in python\u0026lt;/a\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/div\u003e\n\u003ch2 id=\"one-background-task-per-db-entry\"\u003eOne Background Task per db entry \u003ca href=\"#one-background-task-per-db-entry\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI am using it for longer running tasks and I don’t want to give users the\nability to spam these long running tasks with many duplicates running at the\nsame time. And each fastapi worker will be running in a different process so I\ncannot keep track of work in memory, I have to do it in a distributed fashion.\nSince they are all running on the same machine with access to the same disk,\ndiskcache is a good choice\u003c/p\u003e\n\u003ch2 id=\"what-i-need\"\u003eWhat I need \u003ca href=\"#what-i-need\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003echeck if a job is running\u003c/li\u003e\n\u003cli\u003eautomatically expire jobs\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"less-infrastructure-complexity\"\u003eLess infrastructure complexity \u003ca href=\"#less-infrastructure-complexity\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMy brain first went to thinking I needed another service like redis running\nalongside fastapi for this, then it hit me that I can use diskcache.\u003c/p\u003e\n\u003ch2 id=\"how-i-used-diskcache\"\u003eHow I used diskcache \u003ca href=\"#how-i-used-diskcache\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere is how I used diskcache to debounce taking screenshots for a unique shot\nevery 60 seconds.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003ediskcache\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eCache\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ejobs_cache\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eCache\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;jobs-cache\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@shots_router.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/shot/\u003c/span\u003e\u003cspan class=\"si\"\u003e{shot_id}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eresponses\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{}}}})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@shots_router.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/shot/\u003c/span\u003e\u003cspan class=\"si\"\u003e{shot_id}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eresponses\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{}}}})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_shot_by_id\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ebackground_tasks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eBackgroundTasks\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eshot_id\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eshot\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eShot\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eshot_id\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# check if the shot exists and return it or continue to create it.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eis_running\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejobs_cache\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eshot_id\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eis_running\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eexpire_time\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efromtimestamp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ejobs_cache\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epeekitem\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eexpire_time\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003econsole\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;[red]Already running store_shot: \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eshot_id\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003econsole\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;[red]Can retry in \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eexpire_time\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eseconds\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003es\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ejobs_cache\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eshot_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e60\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ebackground_tasks\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd_task\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003estore_shot\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eshot_id\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eshot_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've been using fastapi more and more lately and one feature I just started\nusing is background tasks [[ thoughts-333 ]].\n\n!!! seealso\n    basic diskcache example \u003ca href=\"/python-diskcache/\" class=\"wikilink\" data-title=\"How I setup a sqlite cache in python\" data-description=\"When I need to cache some data between runs or share a cache accross multiple processes my go to library in python is . It\u0026#39;s built on sqlite with just enough...\" data-date=\"2022-03-29\"\u003eHow I setup a sqlite cache in python\u003c/a\u003e\n\n## One Background Task per db entry\n\nI am using it for longer running tasks and I don't want to give users the\nability to spam these long running tasks with many duplicates running at the\nsame time. And each fastapi worker will be running in a different process so I\ncannot keep track of work in memory, I have to do it in a distributed fashion.\nSince they are all running on the same machine with access to the same disk,\ndiskcache is a good choice\n\n## What I need\n\n* check if a job is running\n* automatically expire jobs\n\n## Less infrastructure complexity\n\nMy brain first went to thinking I needed another service like redis running\nalongside fastapi for this, then it hit me that I can use diskcache.\n\n## How I used diskcache\n\nHere is how I used diskcache to debounce taking screenshots for a unique shot\nevery 60 seconds.\n\n``` python\nfrom diskcache import Cache\n\njobs_cache = Cache(\"jobs-cache\")\n\n@shots_router.get(\"/shot/{shot_id}\", responses={200: {\"content\": {\"image/webp\": {}}}})\n@shots_router.get(\"/shot/{shot_id}/\", responses={200: {\"content\": {\"image/webp\": {}}}})\nasync def get_shot_by_id(\n    background_tasks: BackgroundTasks,\n    request: Request,\n    shot_id: int,\n):\n    shot = Shot.get(shot_id)\n    # check if the shot exists and return it or continue to create it.\n\n\n\n    is_running = jobs_cache.get(shot_id)\n\n    if is_running:\n        expire_time = datetime.fromtimestamp(jobs_cache.peekitem(expire_time=True)[1]) - datetime.now()\n        console.print(\"[red]Already running store_shot: \", shot_id)\n        console.print(f\"[red]Can retry in {expire_time.seconds}s\")\n    else:\n        jobs_cache.set(shot_id, True, 60)\n        background_tasks.add_task(\n            store_shot,\n            shot_id=shot_id,\n        )\n```\n",
      "summary": "I've been using fastapi more and more lately and one feature I just started using is background tasks thoughts-333.",
      "date_published": "2024-07-03T11:14:11Z",
      "date_modified": "2024-07-03T11:14:11Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/install-sealed-secreats-via-manifest/",
      "url": "https://waylonwalker.com/install-sealed-secreats-via-manifest/",
      "title": "Install sealed-secreats via manifest",
      "content_html": "\u003cp\u003eYesterday I realized that I have overlooked the default installation method of\nthe sealed secrets controller for \u003ca class=\"wikilink\" data-date=\"2024-03-27\" data-description=\"In my homelab kubernetes cluster I am using kubeseal to encrypt secrets. I have been using it successfully for a few months now wtih great success. It allows...\" data-title=\"kubernetes kubeseal\" href=\"/kubernetes-kubeseal/\" data-preview=\"In my homelab kubernetes cluster I am using kubeseal to encrypt secrets. I have been using it successfully for a few months now wtih great success. It allows...\"\u003ekubernetes kubeseal\u003c/a\u003e this whole time an\njumped straight to the helm section.  I spun up a quick \u003ca class=\"wikilink\" data-date=\"2024-07-02\" data-description=\"kind is a very useful tool to quickly standup and teardown kubernetes clusters. I use it to run clusters locally. Generally they are short lived clusters for...\" data-title=\"kind cluster\" href=\"/kind-cluster/\" data-preview=\"kind is a very useful tool to quickly standup and teardown kubernetes clusters. I use it to run clusters locally. Generally they are short lived clusters for...\"\u003ekind cluster\u003c/a\u003e and\nhad it up quickly.  I can’t say this is any better or worse than helm as I have\nnever needed to customize the install.  According to the docs you can customize\nit with [[ kustomize ]] or helm.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# option if you don\u0026#39;t have a cluster try with kind\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekind create cluster\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -L https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.27.0/controller.yaml \u0026gt; controller.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl apply -f controller.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nYesterday I realized that I have overlooked the default installation method of\nthe sealed secrets controller for \u003ca href=\"/kubernetes-kubeseal/\" class=\"wikilink\" data-title=\"kubernetes kubeseal\" data-description=\"In my homelab kubernetes cluster I am using kubeseal to encrypt secrets. I have been using it successfully for a few months now wtih great success. It allows...\" data-date=\"2024-03-27\"\u003ekubernetes kubeseal\u003c/a\u003e this whole time an\njumped straight to the helm section.  I spun up a quick \u003ca href=\"/kind-cluster/\" class=\"wikilink\" data-title=\"kind cluster\" data-description=\"kind is a very useful tool to quickly standup and teardown kubernetes clusters. I use it to run clusters locally. Generally they are short lived clusters for...\" data-date=\"2024-07-02\"\u003ekind cluster\u003c/a\u003e and\nhad it up quickly.  I can't say this is any better or worse than helm as I have\nnever needed to customize the install.  According to the docs you can customize\nit with [[ kustomize ]] or helm.\n\n``` bash\n# option if you don't have a cluster try with kind\n\nkind create cluster\n\ncurl -L https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.27.0/controller.yaml \u003e controller.yaml\n\nkubectl apply -f controller.yaml\n```\n",
      "summary": "Yesterday I realized that I have overlooked the default installation method of the sealed secrets controller for kubernetes-kubeseal this whole time an...",
      "date_published": "2024-07-02T07:54:01Z",
      "date_modified": "2024-07-02T07:54:01Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "kubernetes"
      ]
    },
    {
      "id": "https://waylonwalker.com/playerctl-fixes-arch/",
      "url": "https://waylonwalker.com/playerctl-fixes-arch/",
      "title": "playerctl fixes arch media keys",
      "content_html": "\u003cp\u003eI’ve long had issues with my qmk keyboard media keys on my arch install, I\nalways thought it was on the keyboard end.  Today I learned that playerctl\nfixes this.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eparu -S playerctl\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOnce it is installed all of my media keys started working right away.\u003c/p\u003e\n\u003cp\u003eI played around with it a bit more and came up with a way to display the\ncurrent playing title in my notifictations.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enotify-send \u003cspan class=\"s2\"\u003e\u0026#34;`playerctl metadata --format \u0026#39;{{lc(status)}}:{{artist}}-{{album}}-{{title}}\u0026#39;`\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've long had issues with my qmk keyboard media keys on my arch install, I\nalways thought it was on the keyboard end.  Today I learned that playerctl\nfixes this.\n\n``` bash\nparu -S playerctl\n```\n\nOnce it is installed all of my media keys started working right away.\n\nI played around with it a bit more and came up with a way to display the\ncurrent playing title in my notifictations.\n\n```bash\nnotify-send \"`playerctl metadata --format '{{lc(status)}}:{{artist}}-{{album}}-{{title}}'`\"\n```\n",
      "summary": "I've long had issues with my qmk keyboard media keys on my arch install, I always thought it was on the keyboard end. Today I learned that playerctl fixes this.",
      "date_published": "2024-06-25T18:23:41Z",
      "date_modified": "2024-06-25T18:23:41Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/tailwind-post-template/",
      "url": "https://waylonwalker.com/tailwind-post-template/",
      "title": "tailwind post template",
      "content_html": "\u003cp\u003eToday I am playing around with tailwind, flexing the css muscle and learning\nhow to build new and different layouts with it.\u003c/p\u003e\n\u003cp\u003eI created a new post template that mimics a terminal look in css where I could\ninject the post title, description, and other frontmatter elements.\u003c/p\u003e\n\u003ciframe src=\"/playground/tailwind-post-template\" width=\"100%\" height=\"800px\" class=\"overflow-hidden\" scrolling=\"no\"\u003e\n\u003cp\u003eI think this is a pretty cool layout, I could make a\n\u003ca href=\"https://carbon.now.sh\"\u003ecarbon.now.sh\u003c/a\u003e{.hoverlink} clone or more realistically I could\nmake it into a template for blog pages and this could become \u003ca href=\"/og/\" class=\"glossary-term\" title=\"OG is short for open graph, a set of standard meta tags that are used for social media sharing. This is what tells other websites how to describe and display...\"\u003eog\u003c/a\u003e images.\u003c/p\u003e\n\u003cp class=\"mx-auto block w-fit mb-0\"\u003e\u003c/p\u003e\n\u003cp class=\"mx-auto block w-fit mt-0\"\u003e\u003ca href=\"/still-loving-tailwind/\" class=\"wikilink\" data-title=\"Still Loving Tailwind\" data-description=\"I\u0026#39;ve been using tailwind for a few months now and I can still say I\u0026#39;m loving it. I\u0026#39;ve been using it to create some rapid prototypes that may or may not ever...\" data-date=\"2023-11-30\" data-preview=\"I\u0026#39;ve been using tailwind for a few months now and I can still say I\u0026#39;m loving it. I\u0026#39;ve been using it to create some rapid prototypes that may or may not ever...\"\u003eStill Loving Tailwind\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\u003c/iframe\u003e",
      "content_text": "\nToday I am playing around with tailwind, flexing the css muscle and learning\nhow to build new and different layouts with it.\n\nI created a new post template that mimics a terminal look in css where I could\ninject the post title, description, and other frontmatter elements.\n\n\u003ciframe src='/playground/tailwind-post-template' width='100%' height='800px' class='overflow-hidden' scrolling='no'/\u003e\n\nI think this is a pretty cool layout, I could make a\n[carbon.now.sh](https://carbon.now.sh){.hoverlink} clone or more realistically I could\nmake it into a template for blog pages and this could become og images.\n\n{.mx-auto .block .w-fit .mb-0}\nCheck out this post\n\n{.mx-auto .block .w-fit .mt-0}\n\u003ca href=\"/still-loving-tailwind/\" class=\"wikilink\" data-title=\"Still Loving Tailwind\" data-description=\"I\u0026#39;ve been using tailwind for a few months now and I can still say I\u0026#39;m loving it. I\u0026#39;ve been using it to create some rapid prototypes that may or may not ever...\" data-date=\"2023-11-30\"\u003eStill Loving Tailwind\u003c/a\u003e\n",
      "summary": "Today I am playing around with tailwind, flexing the css muscle and learning how to build new and different layouts with it.",
      "date_published": "2024-06-08T14:47:42Z",
      "date_modified": "2024-06-08T14:47:42Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/tailscale-ssh/",
      "url": "https://waylonwalker.com/tailscale-ssh/",
      "title": "tailscale ssh",
      "content_html": "\u003cp\u003eTailscale allows you to ssh into all of your tailscale machines, it busts\nthrough firewalls and accross networks without complex setup.  If you have used\ntailscale before this is an obvious no brainer.  What is not obvious is that\nyou can configure tailscale to allow ssh connections from devices within your\ntailnet without even a ssh daemon process running right through the tailscale\ndaemon.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etailscale status\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etailscale \u003cspan class=\"nb\"\u003eset\u003c/span\u003e --ssh\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI picked this up from the tailscale youtube channel.\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"youtube-embed  has-avatar has-avatar-before\" href=\"https://www.youtube.com/watch?v=08clF9srJ2k\u0026amp;t=35s\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/www.youtube.com.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/www.youtube.com.png\"\u003eTailscale\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nTailscale allows you to ssh into all of your tailscale machines, it busts\nthrough firewalls and accross networks without complex setup.  If you have used\ntailscale before this is an obvious no brainer.  What is not obvious is that\nyou can configure tailscale to allow ssh connections from devices within your\ntailnet without even a ssh daemon process running right through the tailscale\ndaemon.\n\n``` bash\ntailscale status\ntailscale set --ssh\n```\n\nI picked this up from the tailscale youtube channel.\n\n[Tailscale](https://www.youtube.com/watch?v=08clF9srJ2k\u0026t=35s){.youtube-embed}\n",
      "summary": "Tailscale allows you to ssh into all of your tailscale machines, it busts through firewalls and accross networks without complex setup. If you have used...",
      "date_published": "2024-06-03T16:40:18Z",
      "date_modified": "2024-06-03T16:40:18Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/latest-page-in-markata/",
      "url": "https://waylonwalker.com/latest-page-in-markata/",
      "title": "Latest Page in Markata",
      "content_html": "\u003cp\u003eI just implemented a latest blog post link in Markata by asking for the first\npost slug from the blog feed.  The implementation uses the jinja_md plugin to\nrender jinja against the markdown and a \u003cmeta/\u003e tag to redirect.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMy latest blog post is [[ {{ markata.feeds.blog.posts[0].slug }} ]].  Click the\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elink if you are not automatically redirected.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;meta http-equiv=\u0026#34;Refresh\u0026#34; content=\u0026#34;0; url=\u0026#39;/{{ markata.feeds.blog.posts[0].slug }}\u0026#39;\u0026#34; /\u0026gt;  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"setting-up-the-feed\"\u003eSetting up the feed \u003ca href=\"#setting-up-the-feed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFeeds are setup in \u003ccode\u003emarkata.toml\u003c/code\u003e configuration.  They provide a handy way to\ncreate an \u003ca href=\"/html/\" class=\"glossary-term\" title=\"HTML (HyperText Markup Language) is the standard markup language used to create and design documents on the World Wide Web. It structures web content by...\"\u003ehtml\u003c/a\u003e feed, rss feed, and quickly reference a filtered set of posts\nlike this.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# you will need to enable the jinja_md plugin along with the defaults\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;markata.plugins.jinja_md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# set up the blog feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;blog\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026lt;=today and templateKey in [\u0026#39;blog-post\u0026#39;] and published\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor more information on markata check out the full \u003ca class=\"wikilink\" data-date=\"2024-05-30\" data-description=\"This post is a work in progress.\" data-title=\"markata\" href=\"/markata/\" data-preview=\"This post is a work in progress.\"\u003emarkata\u003c/a\u003e post.\u003c/p\u003e\n",
      "content_text": "\n\nI just implemented a latest blog post link in Markata by asking for the first\npost slug from the blog feed.  The implementation uses the jinja_md plugin to\nrender jinja against the markdown and a \u003cmeta\u003e tag to redirect.\n\n``` markdown\nMy latest blog post is [[ {{ markata.feeds.blog.posts[0].slug }} ]].  Click the\nlink if you are not automatically redirected.\n\n\u003cmeta http-equiv=\"Refresh\" content=\"0; url='/{{ markata.feeds.blog.posts[0].slug }}'\" /\u003e  \n```\n\n## Setting up the feed\n\nFeeds are setup in `markata.toml` configuration.  They provide a handy way to\ncreate an html feed, rss feed, and quickly reference a filtered set of posts\nlike this.\n\n``` toml\n# you will need to enable the jinja_md plugin along with the defaults\n[markata]\nhooks = [\n    \"markata.plugins.jinja_md\",\n    \"default\",\n    ]\n\n# set up the blog feed\n[[markata.feeds]]\nslug = 'blog'\ntemplate = \"feed.html\"\nfilter = \"date\u003c=today and templateKey in ['blog-post'] and published\"\nsort = \"date\"\nreverse = true\n```\n\nFor more information on markata check out the full \u003ca href=\"/markata/\" class=\"wikilink\" data-title=\"markata\" data-description=\"This post is a work in progress.\" data-date=\"2024-05-30\"\u003emarkata\u003c/a\u003e post.\n",
      "summary": "I just implemented a latest blog post link in Markata by asking for the first post slug from the blog feed. The implementation uses the jinja_md plugin to...",
      "date_published": "2024-06-01T21:01:26Z",
      "date_modified": "2024-06-01T21:01:26Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "markata",
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/just-picker/",
      "url": "https://waylonwalker.com/just-picker/",
      "title": "just picker",
      "content_html": "\u003cp\u003e\u003ca href=\"https://github.com/casey/just\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003e\u003ccode\u003ejust\u003c/code\u003e\u003c/a\u003e has been by go to tool for saving\ncommands in a way that I can replay them and have team members replay them\nwithout relying on the shell history of any given machine.  This is my go to\ndefault step, it lets you pick a just command to run with a fuzzy picker.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edefault:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  @just --list\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n[`just`](https://github.com/casey/just) has been by go to tool for saving\ncommands in a way that I can replay them and have team members replay them\nwithout relying on the shell history of any given machine.  This is my go to\ndefault step, it lets you pick a just command to run with a fuzzy picker.\n\n``` bash\ndefault:\n  @just --list\n```\n",
      "summary": "has been by go to tool for saving commands in a way that I can replay them and have team members replay them without relying on the shell history of any...",
      "date_published": "2024-05-08T20:48:23Z",
      "date_modified": "2024-05-08T20:48:23Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/showmount-e/",
      "url": "https://waylonwalker.com/showmount-e/",
      "title": "showmount-e",
      "content_html": "\u003cp\u003eTIL how to display the list of nfs mounts on your network.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eshowmount -e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can even look for mounts of other machines on your network.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eshowmount -e \u0026lt;hostname\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nTIL how to display the list of nfs mounts on your network.\n\n``` bash\nshowmount -e\n```\n\nYou can even look for mounts of other machines on your network.\n\n``` bash\nshowmount -e \u003chostname\u003e\n```\n",
      "summary": "TIL how to display the list of nfs mounts on your network.",
      "date_published": "2024-04-25T20:15:29Z",
      "date_modified": "2024-04-25T20:15:29Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/control-minio-token-access/",
      "url": "https://waylonwalker.com/control-minio-token-access/",
      "title": "control minio token access",
      "content_html": "\u003cp\u003eTo allow access only to the \u003cbucket\u003e, you can pass add the Resource field  to\nthe User Policy when you create a new token.\u003c/bucket\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;Version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2012-10-17\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;Statement\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Effect\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Allow\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Action\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;admin:*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Effect\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Allow\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Action\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;kms:*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Effect\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Allow\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Action\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;s3:*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Resource\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;arn:aws:s3:::\u0026lt;bucket\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;arn:aws:s3:::\u0026lt;bucket\u0026gt;/*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nTo allow access only to the \u003cbucket\u003e, you can pass add the Resource field  to\nthe User Policy when you create a new token.\n\n``` json\n{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"admin:*\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"kms:*\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"s3:*\"\n      ],\n      \"Resource\": [\n        \"arn:aws:s3:::\u003cbucket\u003e\",\n        \"arn:aws:s3:::\u003cbucket\u003e/*\"\n      ]\n    }\n  ]\n}\n```\n",
      "summary": "To allow access only to the , you can pass add the Resource field to the User Policy when you create a new token.",
      "date_published": "2024-04-24T17:03:34Z",
      "date_modified": "2024-04-24T17:03:34Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/how-to-list-sqlite-tables/",
      "url": "https://waylonwalker.com/how-to-list-sqlite-tables/",
      "title": "How to List Sqlite tables",
      "content_html": "\u003cp\u003eYou can inspect sqlite tables with the sqlite shell.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003enote that you get into the shell with \u003ccode\u003esqlite3 database.db\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etables\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI also learned that \u003ccode\u003e.tables\u003c/code\u003e, \u003ccode\u003e.index\u003c/code\u003e and \u003ccode\u003e.schema\u003c/code\u003e are helper functions that\nquery the \u003ccode\u003esqlite_master\u003c/code\u003e table on the \u003ccode\u003emain\u003c/code\u003e database.\u003c/p\u003e\n\u003cp\u003eHere is an output from my redka database.  The sqlite_master table contains all\nthe sqlite objects type, name, tbl_name, rootpage, and sql to create them.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ sqlite3 database.db \u003cspan class=\"s2\"\u003e\u0026#34;SELECT * from sqlite_master;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etable\u003cspan class=\"p\"\u003e|\u003c/span\u003erkey\u003cspan class=\"p\"\u003e|\u003c/span\u003erkey\u003cspan class=\"p\"\u003e|\u003c/span\u003e2\u003cspan class=\"p\"\u003e|\u003c/span\u003eCREATE TABLE rkey \u003cspan class=\"o\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    id       integer primary key,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    key      text not null,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003etype\u003c/span\u003e     integer not null,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        version  integer not null,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    etime    integer,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        mtime    integer not null\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eindex\u003cspan class=\"p\"\u003e|\u003c/span\u003erkey_key_idx\u003cspan class=\"p\"\u003e|\u003c/span\u003erkey\u003cspan class=\"p\"\u003e|\u003c/span\u003e3\u003cspan class=\"p\"\u003e|\u003c/span\u003eCREATE UNIQUE INDEX rkey_key_idx on rkey \u003cspan class=\"o\"\u003e(\u003c/span\u003ekey\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eindex\u003cspan class=\"p\"\u003e|\u003c/span\u003erkey_etime_idx\u003cspan class=\"p\"\u003e|\u003c/span\u003erkey\u003cspan class=\"p\"\u003e|\u003c/span\u003e4\u003cspan class=\"p\"\u003e|\u003c/span\u003eCREATE INDEX rkey_etime_idx on rkey \u003cspan class=\"o\"\u003e(\u003c/span\u003eetime\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewhere etime is not null\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etrigger\u003cspan class=\"p\"\u003e|\u003c/span\u003erkey_on_type_update\u003cspan class=\"p\"\u003e|\u003c/span\u003erkey\u003cspan class=\"p\"\u003e|\u003c/span\u003e0\u003cspan class=\"p\"\u003e|\u003c/span\u003eCREATE TRIGGER rkey_on_type_update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebefore update of \u003cspan class=\"nb\"\u003etype\u003c/span\u003e on rkey\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e each row\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewhen old.type is not new.type\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebegin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eselect\u003c/span\u003e raise\u003cspan class=\"o\"\u003e(\u003c/span\u003eabort, \u003cspan class=\"s1\"\u003e\u0026#39;key type mismatch\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eend\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etable\u003cspan class=\"p\"\u003e|\u003c/span\u003erstring\u003cspan class=\"p\"\u003e|\u003c/span\u003erstring\u003cspan class=\"p\"\u003e|\u003c/span\u003e5\u003cspan class=\"p\"\u003e|\u003c/span\u003eCREATE TABLE rstring \u003cspan class=\"o\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    key_id integer not null,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    value  blob not null,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    foreign key \u003cspan class=\"o\"\u003e(\u003c/span\u003ekey_id\u003cspan class=\"o\"\u003e)\u003c/span\u003e references rkey \u003cspan class=\"o\"\u003e(\u003c/span\u003eid\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          on delete cascade\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eindex\u003cspan class=\"p\"\u003e|\u003c/span\u003erstring_pk_idx\u003cspan class=\"p\"\u003e|\u003c/span\u003erstring\u003cspan class=\"p\"\u003e|\u003c/span\u003e6\u003cspan class=\"p\"\u003e|\u003c/span\u003eCREATE UNIQUE INDEX rstring_pk_idx on rstring \u003cspan class=\"o\"\u003e(\u003c/span\u003ekey_id\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eview\u003cspan class=\"p\"\u003e|\u003c/span\u003evstring\u003cspan class=\"p\"\u003e|\u003c/span\u003evstring\u003cspan class=\"p\"\u003e|\u003c/span\u003e0\u003cspan class=\"p\"\u003e|\u003c/span\u003eCREATE VIEW vstring as\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eselect\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    rkey.id as key_id, rkey.key, rstring.value,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        datetime\u003cspan class=\"o\"\u003e(\u003c/span\u003eetime/1000, \u003cspan class=\"s1\"\u003e\u0026#39;unixepoch\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e as etime,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        datetime\u003cspan class=\"o\"\u003e(\u003c/span\u003emtime/1000, \u003cspan class=\"s1\"\u003e\u0026#39;unixepoch\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e as mtime\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  from rkey join rstring on rkey.id \u003cspan class=\"o\"\u003e=\u003c/span\u003e rstring.key_id\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  where rkey.type \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    and \u003cspan class=\"o\"\u003e(\u003c/span\u003erkey.etime is null or rkey.etime \u0026gt; unixepoch\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;subsec\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etable\u003cspan class=\"p\"\u003e|\u003c/span\u003erhash\u003cspan class=\"p\"\u003e|\u003c/span\u003erhash\u003cspan class=\"p\"\u003e|\u003c/span\u003e7\u003cspan class=\"p\"\u003e|\u003c/span\u003eCREATE TABLE rhash \u003cspan class=\"o\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    key_id integer not null,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    field text not null,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    value blob not null,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    foreign key \u003cspan class=\"o\"\u003e(\u003c/span\u003ekey_id\u003cspan class=\"o\"\u003e)\u003c/span\u003e references rkey \u003cspan class=\"o\"\u003e(\u003c/span\u003eid\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      on delete cascade\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eindex\u003cspan class=\"p\"\u003e|\u003c/span\u003erhash_pk_idx\u003cspan class=\"p\"\u003e|\u003c/span\u003erhash\u003cspan class=\"p\"\u003e|\u003c/span\u003e8\u003cspan class=\"p\"\u003e|\u003c/span\u003eCREATE UNIQUE INDEX rhash_pk_idx on rhash \u003cspan class=\"o\"\u003e(\u003c/span\u003ekey_id, field\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eindex\u003cspan class=\"p\"\u003e|\u003c/span\u003erhash_key_id_idx\u003cspan class=\"p\"\u003e|\u003c/span\u003erhash\u003cspan class=\"p\"\u003e|\u003c/span\u003e9\u003cspan class=\"p\"\u003e|\u003c/span\u003eCREATE INDEX rhash_key_id_idx on rhash \u003cspan class=\"o\"\u003e(\u003c/span\u003ekey_id\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eview\u003cspan class=\"p\"\u003e|\u003c/span\u003evhash\u003cspan class=\"p\"\u003e|\u003c/span\u003evhash\u003cspan class=\"p\"\u003e|\u003c/span\u003e0\u003cspan class=\"p\"\u003e|\u003c/span\u003eCREATE VIEW vhash as\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eselect\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    rkey.id as key_id, rkey.key, rhash.field, rhash.value,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        datetime\u003cspan class=\"o\"\u003e(\u003c/span\u003eetime/1000, \u003cspan class=\"s1\"\u003e\u0026#39;unixepoch\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e as etime,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        datetime\u003cspan class=\"o\"\u003e(\u003c/span\u003emtime/1000, \u003cspan class=\"s1\"\u003e\u0026#39;unixepoch\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e as mtime\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  from rkey join rhash on rkey.id \u003cspan class=\"o\"\u003e=\u003c/span\u003e rhash.key_id\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  where rkey.type \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    and \u003cspan class=\"o\"\u003e(\u003c/span\u003erkey.etime is null or rkey.etime \u0026gt; unixepoch\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;subsec\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nYou can inspect sqlite tables with the sqlite shell.\n\n\u003e note that you get into the shell with `sqlite3 database.db`\n\n``` sql\n.tables\n```\n\nI also learned that `.tables`, `.index` and `.schema` are helper functions that\nquery the `sqlite_master` table on the `main` database.\n\nHere is an output from my redka database.  The sqlite_master table contains all\nthe sqlite objects type, name, tbl_name, rootpage, and sql to create them.\n\n``` bash\n❯ sqlite3 database.db \"SELECT * from sqlite_master;\"\ntable|rkey|rkey|2|CREATE TABLE rkey (\n    id       integer primary key,\n    key      text not null,\n    type     integer not null,\n        version  integer not null,\n    etime    integer,\n        mtime    integer not null\n)\nindex|rkey_key_idx|rkey|3|CREATE UNIQUE INDEX rkey_key_idx on rkey (key)\nindex|rkey_etime_idx|rkey|4|CREATE INDEX rkey_etime_idx on rkey (etime)\nwhere etime is not null\ntrigger|rkey_on_type_update|rkey|0|CREATE TRIGGER rkey_on_type_update\nbefore update of type on rkey\nfor each row\nwhen old.type is not new.type\nbegin\n    select raise(abort, 'key type mismatch');\nend\ntable|rstring|rstring|5|CREATE TABLE rstring (\n    key_id integer not null,\n    value  blob not null,\n\n    foreign key (key_id) references rkey (id)\n          on delete cascade\n)\nindex|rstring_pk_idx|rstring|6|CREATE UNIQUE INDEX rstring_pk_idx on rstring (key_id)\nview|vstring|vstring|0|CREATE VIEW vstring as\n  select\n    rkey.id as key_id, rkey.key, rstring.value,\n        datetime(etime/1000, 'unixepoch') as etime,\n        datetime(mtime/1000, 'unixepoch') as mtime\n  from rkey join rstring on rkey.id = rstring.key_id\n  where rkey.type = 1\n    and (rkey.etime is null or rkey.etime \u003e unixepoch('subsec'))\ntable|rhash|rhash|7|CREATE TABLE rhash (\n    key_id integer not null,\n    field text not null,\n    value blob not null,\n\n    foreign key (key_id) references rkey (id)\n      on delete cascade\n)\nindex|rhash_pk_idx|rhash|8|CREATE UNIQUE INDEX rhash_pk_idx on rhash (key_id, field)\nindex|rhash_key_id_idx|rhash|9|CREATE INDEX rhash_key_id_idx on rhash (key_id)\nview|vhash|vhash|0|CREATE VIEW vhash as\n  select\n    rkey.id as key_id, rkey.key, rhash.field, rhash.value,\n        datetime(etime/1000, 'unixepoch') as etime,\n        datetime(mtime/1000, 'unixepoch') as mtime\n  from rkey join rhash on rkey.id = rhash.key_id\n  where rkey.type = 4\n    and (rkey.etime is null or rkey.etime \u003e unixepoch('subsec'))\n```\n",
      "summary": "You can inspect sqlite tables with the sqlite shell.",
      "date_published": "2024-04-23T20:03:27Z",
      "date_modified": "2024-04-23T20:03:27Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/redka-runs-on-sqlite/",
      "url": "https://waylonwalker.com/redka-runs-on-sqlite/",
      "title": "Redka Runs on SQLite",
      "content_html": "\u003cp\u003eWith the liscense changes to redis there are several new forks out there.  One\nthat I am particularly interested in is\n\u003ca href=\"https://github.com/nalgeon/redka\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003eredka\u003c/a\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://i.jpillora.com/nalgeon/redka \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echmod +x redka\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./redka database.db\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWe now have redis running on port 6379 that we can connect to with a redis\nclient. And we have a sqlite database that we can inspect.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ sqlite3 database.db \u003cspan class=\"s2\"\u003e\u0026#34;SELECT name FROM sqlite_master;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erkey\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erkey_key_idx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erkey_etime_idx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erkey_on_type_update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erstring\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erstring_pk_idx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evstring\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erhash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erhash_pk_idx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erhash_key_id_idx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evhash\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWe can look at the values in the vstring table.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esqlite3 database.db \u003cspan class=\"s2\"\u003e\u0026#34;SELECT * from vstring;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e1\u003cspan class=\"p\"\u003e|\u003c/span\u003ehi\u003cspan class=\"p\"\u003e|\u003c/span\u003ehello there you\u003cspan class=\"o\"\u003e||\u003c/span\u003e2024-04-17 01:46:26\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nWith the liscense changes to redis there are several new forks out there.  One\nthat I am particularly interested in is\n[redka](https://github.com/nalgeon/redka).\n\n``` bash\ncurl https://i.jpillora.com/nalgeon/redka | bash\nchmod +x redka\n./redka database.db\n```\n\nWe now have redis running on port 6379 that we can connect to with a redis\nclient. And we have a sqlite database that we can inspect.\n\n``` bash\n❯ sqlite3 database.db \"SELECT name FROM sqlite_master;\"\nrkey\nrkey_key_idx\nrkey_etime_idx\nrkey_on_type_update\nrstring\nrstring_pk_idx\nvstring\nrhash\nrhash_pk_idx\nrhash_key_id_idx\nvhash\n```\n\nWe can look at the values in the vstring table.\n\n``` bash\nsqlite3 database.db \"SELECT * from vstring;\"\n1|hi|hello there you||2024-04-17 01:46:26\n```\n",
      "summary": "With the liscense changes to redis there are several new forks out there. One that I am particularly interested in is redka.",
      "date_published": "2024-04-22T19:54:24Z",
      "date_modified": "2024-04-22T19:54:24Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "infrastructure",
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/am-i-vulnerable-to-the-xz-backdoor/",
      "url": "https://waylonwalker.com/am-i-vulnerable-to-the-xz-backdoor/",
      "title": "Am I vulnerable to the xz backdoor?",
      "content_html": "\u003cp\u003eThe main system that I am concerned about is my arch BTW machine. I found a\ngreat \u003ca href=\"https://archlinux.org/news/the-xz-package-has-been-backdoored/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/archlinux.org.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/archlinux.org.png\" class=\"has-avatar  has-avatar-before\"\u003earticle\u003c/a\u003e\nfrom the official archlinux site covering it.\u003c/p\u003e\n\u003cp\u003eFor my machine I am concerned with this line.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe xz packages prior to version 5.6.1-2 (specifically 5.6.0-1 and 5.6.1-1)\ncontain this backdoor.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI checked my xz package with \u003ca href=\"/paru/\" class=\"glossary-term\" title=\"paru is a package manager for archlinux that installs packages from the \u003ca href=\"/aur/\" class=\"glossary-term\" title=\"Arch User Repository, a collection of community maintained packages for archlinux.\"\u003eAUR\u003c/a\u003e.\"\u003eparu\u003c/a\u003e, and I am good.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eparu -Qii zx\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nThe main system that I am concerned about is my arch BTW machine. I found a\ngreat [article](https://archlinux.org/news/the-xz-package-has-been-backdoored/)\nfrom the official archlinux site covering it.\n\nFor my machine I am concerned with this line.\n\n\u003e The xz packages prior to version 5.6.1-2 (specifically 5.6.0-1 and 5.6.1-1)\n\u003e contain this backdoor.\n\nI checked my xz package with paru, and I am good.\n\n``` bash\nparu -Qii zx\n```\n",
      "summary": "The main system that I am concerned about is my arch BTW machine. I found a great article from the official archlinux site covering it.",
      "date_published": "2024-04-21T07:53:54Z",
      "date_modified": "2024-04-21T07:53:54Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/arch-dependencies/",
      "url": "https://waylonwalker.com/arch-dependencies/",
      "title": "arch dependencies",
      "content_html": "\u003cp\u003e\u003ca href=\"/paru/\" class=\"glossary-term\" title=\"paru is a package manager for archlinux that installs packages from the \u003ca href=\"/aur/\" class=\"glossary-term\" title=\"Arch User Repository, a collection of community maintained packages for archlinux.\"\u003eAUR\u003c/a\u003e.\"\u003eparu\u003c/a\u003e has some nice features that I rarely use, and hav to look up when I need\nthem.  Here are two commands to help with dependency management.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ paru -Qii nodejs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eName            : nodejs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eVersion         : 21.7.2-1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDescription     : Evented I/O \u003cspan class=\"k\"\u003efor\u003c/span\u003e V8 javascript\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eArchitecture    : x86_64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eURL             : https://nodejs.org/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLicenses        : MIT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGroups          : None\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProvides        : None\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDepends On      : icu  libuv  libnghttp2  libnghttp3  libngtcp2  openssl  zlib  brotli  c-ares\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOptional Deps   : npm: nodejs package manager \u003cspan class=\"o\"\u003e[\u003c/span\u003einstalled\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRequired By     : node-gyp  nodejs-nopt  npm  semver\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOptional For    : None\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eConflicts With  : None\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReplaces        : None\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eInstalled Size  : 46.86 MiB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePackager        : Felix Yan \u0026lt;felixonmars@archlinux.org\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBuild Date      : Thu \u003cspan class=\"m\"\u003e04\u003c/span\u003e Apr \u003cspan class=\"m\"\u003e2024\u003c/span\u003e 05:11:09 AM CDT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eInstall Date    : Mon \u003cspan class=\"m\"\u003e15\u003c/span\u003e Apr \u003cspan class=\"m\"\u003e2024\u003c/span\u003e 07:27:02 AM CDT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eInstall Reason  : Installed as a dependency \u003cspan class=\"k\"\u003efor\u003c/span\u003e another package\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eInstall Script  : No\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eValidated By    : Signature\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBackup Files    : None\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExtended Data   : \u003cspan class=\"nv\"\u003epkgtype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003epkg\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can check all the packages depended on by nodejs by running the following.\nThis is everything from all of the repos you have configured, not what you have\ninstalled.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ pactree --reverse --sync --depth \u003cspan class=\"m\"\u003e1\u003c/span\u003e nodejs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enodejs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─acorn\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─ansible-language-server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─asar\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─babel-cli\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─babel-core\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─bash-language-server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─blinksocks\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─bower\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─browserify\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─coffeescript\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─dot-language-server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─emscripten\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─eslint\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─eslint-language-server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─eslint_d\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─gitlab\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─gnomon\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─grunt-cli\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─gtop\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─gulp\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─hedgedoc\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─jake\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─markdownlint-cli2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─marked\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─marked-man\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─matrix-appservice-irc\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─modclean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─node-gyp\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─nodejs-emojione\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─nodejs-material-design-icons\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─nodejs-nopt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─nodejs-source-map\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─nodejs-yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─npm\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─openui5\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─pm2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─prettier\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─pyright\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─rapydscript-ng\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─s3rver\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─semver\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─serverless\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─stylelint\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─stylus\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─svelte-language-server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─tailwindcss-language-server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─ts-node\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─typescript\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─typescript-svelte-plugin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─uglify-js\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─vscode-css-languageserver\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─vscode-html-languageserver\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─vscode-json-languageserver\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─vue-language-server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─vue-typescript-plugin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─wasm-bindgen\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─web-ext\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─wrangler\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─yaml-language-server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├─yarn\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nparu has some nice features that I rarely use, and hav to look up when I need\nthem.  Here are two commands to help with dependency management.\n\n``` bash\n❯ paru -Qii nodejs\nName            : nodejs\nVersion         : 21.7.2-1\nDescription     : Evented I/O for V8 javascript\nArchitecture    : x86_64\nURL             : https://nodejs.org/\nLicenses        : MIT\nGroups          : None\nProvides        : None\nDepends On      : icu  libuv  libnghttp2  libnghttp3  libngtcp2  openssl  zlib  brotli  c-ares\nOptional Deps   : npm: nodejs package manager [installed]\nRequired By     : node-gyp  nodejs-nopt  npm  semver\nOptional For    : None\nConflicts With  : None\nReplaces        : None\nInstalled Size  : 46.86 MiB\nPackager        : Felix Yan \u003cfelixonmars@archlinux.org\u003e\nBuild Date      : Thu 04 Apr 2024 05:11:09 AM CDT\nInstall Date    : Mon 15 Apr 2024 07:27:02 AM CDT\nInstall Reason  : Installed as a dependency for another package\nInstall Script  : No\nValidated By    : Signature\nBackup Files    : None\nExtended Data   : pkgtype=pkg\n```\n\nYou can check all the packages depended on by nodejs by running the following.\nThis is everything from all of the repos you have configured, not what you have\ninstalled.\n\n``` bash\n❯ pactree --reverse --sync --depth 1 nodejs\n\nnodejs\n├─acorn\n├─ansible-language-server\n├─asar\n├─babel-cli\n├─babel-core\n├─bash-language-server\n├─blinksocks\n├─bower\n├─browserify\n├─coffeescript\n├─dot-language-server\n├─emscripten\n├─eslint\n├─eslint-language-server\n├─eslint_d\n├─gitlab\n├─gnomon\n├─grunt-cli\n├─gtop\n├─gulp\n├─hedgedoc\n├─jake\n├─markdownlint-cli2\n├─marked\n├─marked-man\n├─matrix-appservice-irc\n├─modclean\n├─node-gyp\n├─nodejs-emojione\n├─nodejs-material-design-icons\n├─nodejs-nopt\n├─nodejs-source-map\n├─nodejs-yaml\n├─npm\n├─openui5\n├─pm2\n├─prettier\n├─pyright\n├─rapydscript-ng\n├─s3rver\n├─semver\n├─serverless\n├─stylelint\n├─stylus\n├─svelte-language-server\n├─tailwindcss-language-server\n├─ts-node\n├─typescript\n├─typescript-svelte-plugin\n├─uglify-js\n├─vscode-css-languageserver\n├─vscode-html-languageserver\n├─vscode-json-languageserver\n├─vue-language-server\n├─vue-typescript-plugin\n├─wasm-bindgen\n├─web-ext\n├─wrangler\n├─yaml-language-server\n├─yarn\n```\n",
      "summary": "paru has some nice features that I rarely use, and hav to look up when I need them. Here are two commands to help with dependency management.",
      "date_published": "2024-04-20T07:42:21Z",
      "date_modified": "2024-04-20T07:42:21Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "arch",
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/copier-trust/",
      "url": "https://waylonwalker.com/copier-trust/",
      "title": "copier trust",
      "content_html": "\u003cp\u003eI recently had to update my copier-gallery command to trust my own templates\nbecause some of them have shell scripts that run afterwards.  Be warned that\nthis could be a dangerous feature to run on random templates you get off the\ninternet, but these are all mine, so if I wreck it its my own fault.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecopier copy --trust \u0026lt;template\u0026gt; \u0026lt;destination\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAll the the copier copy api can be found with help.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ copier copy --help\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecopier copy 8.3.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCopy from a template \u003cspan class=\"nb\"\u003esource\u003c/span\u003e to a destination.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUsage:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    copier copy \u003cspan class=\"o\"\u003e[\u003c/span\u003eSWITCHES\u003cspan class=\"o\"\u003e]\u003c/span\u003e template_src destination_path\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHidden-switches:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -h, --help                         Prints this \u003cspan class=\"nb\"\u003ehelp\u003c/span\u003e message and quits\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --help-all                         Prints \u003cspan class=\"nb\"\u003ehelp\u003c/span\u003e messages of all sub-commands and quits\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -v, --version                      Prints the program\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003es version and quits\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSwitches:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -C, --no-cleanup                   On error, \u003cspan class=\"k\"\u003edo\u003c/span\u003e not delete destination \u003cspan class=\"k\"\u003eif\u003c/span\u003e it was\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                       created by Copier.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --UNSAFE, --trust                  Allow templates with unsafe features \u003cspan class=\"o\"\u003e(\u003c/span\u003eJinja\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                       extensions, migrations, tasks\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -a, --answers-file VALUE:str       Update using this path \u003cspan class=\"o\"\u003e(\u003c/span\u003erelative to\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                       \u003cspan class=\"sb\"\u003e`\u003c/span\u003edestination_path\u003cspan class=\"sb\"\u003e`\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e to find the answers file\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -d, --data \u003cspan class=\"nv\"\u003eVARIABLE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eVALUE:str      Make VARIABLE available as VALUE when rendering the\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                       template\u003cspan class=\"p\"\u003e;\u003c/span\u003e may be given multiple \u003cspan class=\"nb\"\u003etimes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -f, --force                        Same as \u003cspan class=\"sb\"\u003e`\u003c/span\u003e--defaults --overwrite\u003cspan class=\"sb\"\u003e`\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -g, --prereleases                  Use prereleases to compare template VCS tags.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -l, --defaults                     Use default answers to questions, which might be\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                       null \u003cspan class=\"k\"\u003eif\u003c/span\u003e not specified.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -n, --pretend                      Run but \u003cspan class=\"k\"\u003edo\u003c/span\u003e not make any changes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -q, --quiet                        Suppress status output\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -r, --vcs-ref VALUE:str            Git reference to checkout in \u003cspan class=\"sb\"\u003e`\u003c/span\u003etemplate_src\u003cspan class=\"sb\"\u003e`\u003c/span\u003e. If you\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                       \u003cspan class=\"k\"\u003edo\u003c/span\u003e not specify it, it will try to checkout the\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                       latest git tag, as sorted using the PEP \u003cspan class=\"m\"\u003e440\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                       algorithm. If you want to checkout always the\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                       latest version, use \u003cspan class=\"sb\"\u003e`\u003c/span\u003e--vcs-ref\u003cspan class=\"o\"\u003e=\u003c/span\u003eHEAD\u003cspan class=\"sb\"\u003e`\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -s, --skip VALUE:str               Skip specified files \u003cspan class=\"k\"\u003eif\u003c/span\u003e they exist already\u003cspan class=\"p\"\u003e;\u003c/span\u003e may be\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                       given multiple \u003cspan class=\"nb\"\u003etimes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -w, --overwrite                    Overwrite files that already exist, without asking.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -x, --exclude VALUE:str            A name or shell-style pattern matching files or\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                       folders that must not be copied\u003cspan class=\"p\"\u003e;\u003c/span\u003e may be given\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                       multiple \u003cspan class=\"nb\"\u003etimes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI recently had to update my copier-gallery command to trust my own templates\nbecause some of them have shell scripts that run afterwards.  Be warned that\nthis could be a dangerous feature to run on random templates you get off the\ninternet, but these are all mine, so if I wreck it its my own fault.\n\n``` bash\ncopier copy --trust \u003ctemplate\u003e \u003cdestination\u003e\n```\n\nAll the the copier copy api can be found with help.\n\n``` bash\n❯ copier copy --help\ncopier copy 8.3.0\n\nCopy from a template source to a destination.\n\nUsage:\n    copier copy [SWITCHES] template_src destination_path\n\nHidden-switches:\n    -h, --help                         Prints this help message and quits\n    --help-all                         Prints help messages of all sub-commands and quits\n    -v, --version                      Prints the program's version and quits\n\nSwitches:\n    -C, --no-cleanup                   On error, do not delete destination if it was\n                                       created by Copier.\n    --UNSAFE, --trust                  Allow templates with unsafe features (Jinja\n                                       extensions, migrations, tasks)\n    -a, --answers-file VALUE:str       Update using this path (relative to\n                                       `destination_path`) to find the answers file\n    -d, --data VARIABLE=VALUE:str      Make VARIABLE available as VALUE when rendering the\n                                       template; may be given multiple times\n    -f, --force                        Same as `--defaults --overwrite`.\n    -g, --prereleases                  Use prereleases to compare template VCS tags.\n    -l, --defaults                     Use default answers to questions, which might be\n                                       null if not specified.\n    -n, --pretend                      Run but do not make any changes\n    -q, --quiet                        Suppress status output\n    -r, --vcs-ref VALUE:str            Git reference to checkout in `template_src`. If you\n                                       do not specify it, it will try to checkout the\n                                       latest git tag, as sorted using the PEP 440\n                                       algorithm. If you want to checkout always the\n                                       latest version, use `--vcs-ref=HEAD`.\n    -s, --skip VALUE:str               Skip specified files if they exist already; may be\n                                       given multiple times\n    -w, --overwrite                    Overwrite files that already exist, without asking.\n    -x, --exclude VALUE:str            A name or shell-style pattern matching files or\n                                       folders that must not be copied; may be given\n                                       multiple times\n```\n",
      "summary": "I recently had to update my copier-gallery command to trust my own templates because some of them have shell scripts that run afterwards. Be warned that this...",
      "date_published": "2024-04-19T20:41:06Z",
      "date_modified": "2024-04-19T20:41:06Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "copier",
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/ipython-f2/",
      "url": "https://waylonwalker.com/ipython-f2/",
      "title": "ipython f2",
      "content_html": "\u003cp\u003eToday I accidentally ran f2 in ipython to discover that it opens your $EDITOR!\nI use this feature quite often in zsh, it is bound to \u003ccode\u003e\u0026lt;c-e\u0026gt;\u003c/code\u003e for me, and since\nI have my environment variable \u003ccode\u003eEDITOR\u003c/code\u003e set to \u003ccode\u003envim\u003c/code\u003e it opens nvim when I hit\n\u003ccode\u003e\u0026lt;c-e\u0026gt;\u003c/code\u003e.  Today I discovered that Ipython has this bound to \u003ccode\u003eF2\u003c/code\u003e.  If you know\nhow to set it to \u003ccode\u003e\u0026lt;c-e\u0026gt;\u003c/code\u003e let me know I’ve tried, a lot.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eEDITOR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003envim\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eipython\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;F2\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ebetter yet add \u003ccode\u003eexport EDITOR=nvim\u003c/code\u003e to your .zshrc\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ~/.zshrc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eEDITOR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003envim\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nToday I accidentally ran f2 in ipython to discover that it opens your $EDITOR!\nI use this feature quite often in zsh, it is bound to `\u003cc-e\u003e` for me, and since\nI have my environment variable `EDITOR` set to `nvim` it opens nvim when I hit\n`\u003cc-e\u003e`.  Today I discovered that Ipython has this bound to `F2`.  If you know\nhow to set it to `\u003cc-e\u003e` let me know I've tried, a lot.\n\n``` bash\nexport EDITOR=nvim\nipython\n\u003cF2\u003e\n```\n\nbetter yet add `export EDITOR=nvim` to your .zshrc\n\n``` bash\n# ~/.zshrc\nexport EDITOR=nvim\n```\n",
      "summary": "Today I accidentally ran f2 in ipython to discover that it opens your $EDITOR! I use this feature quite often in zsh, it is bound to for me, and since I have...",
      "date_published": "2024-04-18T20:40:41Z",
      "date_modified": "2024-04-18T20:40:41Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/sqlmodel-indexes/",
      "url": "https://waylonwalker.com/sqlmodel-indexes/",
      "title": "sqlmodel indexes",
      "content_html": "\u003cp\u003eI’ve really been enjoying using sqlmodel for my projects that need a database.\nOne thing that I definitely lacked on for too long was indexing my database.  I\nhit a point with one database where it was taking 7s for pretty simple\npaginated queries to return 10 records.\u003c/p\u003e\n\u003cp\u003eFor every field that you will be querying on, you can create an index, by\nsetting it equal to \u003ccode\u003eField(index=True)\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eHero\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSQLModel\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etable\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eint\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eField\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eprimary_key\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eField\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esecret_name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eint\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eField\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cem\u003eexample courtesy of the docs\u003c/em\u003e\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e primary keys are indexed by default.\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe docs cover this pretty well, and in quite depth - \u003ca href=\"https://sqlmodel.tiangolo.com/tutorial/indexes/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/sqlmodel.tiangolo.com.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/sqlmodel.tiangolo.com.png\" class=\"has-avatar  has-avatar-before\"\u003eOptimizing Queries\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n",
      "content_text": "\nI've really been enjoying using sqlmodel for my projects that need a database.\nOne thing that I definitely lacked on for too long was indexing my database.  I\nhit a point with one database where it was taking 7s for pretty simple\npaginated queries to return 10 records.\n\nFor every field that you will be querying on, you can create an index, by\nsetting it equal to `Field(index=True)`\n\n``` python\nclass Hero(SQLModel, table=True):\n    id: int | None = Field(default=None, primary_key=True)\n    name: str = Field(index=True)\n    secret_name: str\n    age: int | None = Field(default=None, index=True)\n```\n\n_example courtesy of the docs_\n\n!!! Note\n     primary keys are indexed by default.\n\n\u003e The docs cover this pretty well, and in quite depth - [Optimizing Queries](https://sqlmodel.tiangolo.com/tutorial/indexes/)\n",
      "summary": "I've really been enjoying using sqlmodel for my projects that need a database. One thing that I definitely lacked on for too long was indexing my database. I...",
      "date_published": "2024-04-17T21:55:25Z",
      "date_modified": "2024-04-17T21:55:25Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/python-inline-snapshot/",
      "url": "https://waylonwalker.com/python-inline-snapshot/",
      "title": "python inline snapshot",
      "content_html": "\u003cp\u003e\u003ccode\u003einline-snapshot\u003c/code\u003e is a new tool that I am trying out for python testing.  It\ntakes snapshots of your outputs and places them inline with the test.\u003c/p\u003e\n\u003cp\u003eHere is the most basic starter.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003einline_snapshot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003etest_one\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eassert\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003esnapshot\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow when I run \u003ccode\u003epytest\u003c/code\u003e my tests will \u003cstrong\u003efail\u003c/strong\u003e because my assert has no value, but if I\nrun \u003ccode\u003epytest --inline-snapshot=create\u003c/code\u003e it will fill out my snapshot values and the\nfile will then look like this.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003einline_snapshot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003etest_one\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eassert\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003esnapshot\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIt also works with pydantic models.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eMyModel\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBaseModel\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003enickname\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003etest_my_model_instance\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eassert\u003c/span\u003e \u003cspan class=\"n\"\u003eMyModel\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Waylon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eage\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003esnapshot\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMyModel\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Waylon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eage\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003etest_my_model_fields\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eme\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eMyModel\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Waylon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eage\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003enickname\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Waylon\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eassert\u003c/span\u003e \u003cspan class=\"n\"\u003eme\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003esnapshot\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Waylon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eassert\u003c/span\u003e \u003cspan class=\"n\"\u003eme\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eage\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003esnapshot\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eassert\u003c/span\u003e \u003cspan class=\"n\"\u003eme\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enickname\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003esnapshot\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Waylon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n`inline-snapshot` is a new tool that I am trying out for python testing.  It\ntakes snapshots of your outputs and places them inline with the test.\n\nHere is the most basic starter.\n\n``` python\nimport inline_snapshot\n\ndef test_one():\n    assert 1 == snapshot()\n```\n\nNow when I run `pytest` my tests will **fail** because my assert has no value, but if I\nrun `pytest --inline-snapshot=create` it will fill out my snapshot values and the\nfile will then look like this.\n\n``` python\nimport inline_snapshot\n\ndef test_one():\n    assert 1 == snapshot(1)\n```\n\nIt also works with pydantic models.\n\n``` python\nclass MyModel(BaseModel):\n    name: str\n    age: int\n    nickname: str | None = None\n\n\ndef test_my_model_instance():\n    assert MyModel(name=\"Waylon\", age=1) == snapshot(MyModel(name=\"Waylon\", age=1))\n\n\ndef test_my_model_fields():\n    me = MyModel(name=\"Waylon\", age=1, nickname='Waylon')\n    assert me.name == snapshot(\"Waylon\")\n    assert me.age == snapshot(1)\n    assert me.nickname == snapshot(\"Waylon\")\n```\n",
      "summary": "is a new tool that I am trying out for python testing. It takes snapshots of your outputs and places them inline with the test.",
      "date_published": "2024-04-17T13:32:53Z",
      "date_modified": "2024-04-17T13:32:53Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/sqlite-vacuum/",
      "url": "https://waylonwalker.com/sqlite-vacuum/",
      "title": "sqlite vacuum",
      "content_html": "\u003cp\u003eToday I learned how to VACUUM a sqlite database and cut its size in about half.\nIt’s a database that I have had running for quite awhile and has some decent\ntraffic on it.\u003c/p\u003e\n\u003cp\u003eWhy is it important to do a VACUUM? In short its becuase the file system gets\nfragmented with as data is updated. On delete the files are removed from the\ndatabase and marked as available for reuse in the filesystem, but the space is\nnot reclaimed.\u003c/p\u003e\n\u003cp\u003eTo VACUUM a database, run the following sql command.  You can do it right form\nthe sqlite shell by running \u003ccode\u003esqlite3\u003c/code\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYou will need about double the current size of the database as free space to\ndo the VACUUM, you need space for a full copy, journaling or write ahead\nlogs, and the existing database.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eVACUUM\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe docs are fantastic for \u003ca href=\"https://www.sqlite.org/lang_vacuum.html\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/www.sqlite.org.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/www.sqlite.org.ico\" class=\"has-avatar  has-avatar-before\"\u003evacuum\u003c/a\u003e.\u003c/p\u003e\n",
      "content_text": "\nToday I learned how to VACUUM a sqlite database and cut its size in about half.\nIt's a database that I have had running for quite awhile and has some decent\ntraffic on it.\n\nWhy is it important to do a VACUUM? In short its becuase the file system gets\nfragmented with as data is updated. On delete the files are removed from the\ndatabase and marked as available for reuse in the filesystem, but the space is\nnot reclaimed.\n\nTo VACUUM a database, run the following sql command.  You can do it right form\nthe sqlite shell by running `sqlite3`.\n\n\u003e You will need about double the current size of the database as free space to\n\u003e do the VACUUM, you need space for a full copy, journaling or write ahead\n\u003e logs, and the existing database.\n\n``` sql\nVACUUM;\n```\n\nThe docs are fantastic for [vacuum](https://www.sqlite.org/lang_vacuum.html).\n",
      "summary": "Today I learned how to VACUUM a sqlite database and cut its size in about half. It's a database that I have had running for quite awhile and has some decent...",
      "date_published": "2024-04-16T21:31:24Z",
      "date_modified": "2024-04-16T21:31:24Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "data",
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/tailwind-animations/",
      "url": "https://waylonwalker.com/tailwind-animations/",
      "title": "Tailwind Animations",
      "content_html": "\u003cp\u003eI learned that tailwind animations are pretty easy to add only needing a few\nclasses.  For some reason though my brain broke, thinking that I could\ndynamically change the number and you can’t cause there are only so many pre\ncompiled classes without using an arbitrary value with brackets.\u003c/p\u003e\n\u003cp\u003eHere are the classes that I used to transition my colors very slowly.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;square\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;transition-colors ease-in-out duration-700\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd the entire square element.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;square\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;w-16 h-16 bg-rose-500 rounded border border-4 border-rose-800 hover:bg-indigo-600 hover:border-yellow-500 transition-colors ease-in-out duration-700\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI learned that tailwind animations are pretty easy to add only needing a few\nclasses.  For some reason though my brain broke, thinking that I could\ndynamically change the number and you can't cause there are only so many pre\ncompiled classes without using an arbitrary value with brackets.\n\nHere are the classes that I used to transition my colors very slowly.\n\n``` html\n\u003cdiv id=\"square\"\n      class=\"transition-colors ease-in-out duration-700\"\u003e\n\u003c/div\u003e\n```\n\nAnd the entire square element.\n\n``` html\n\u003cdiv id=\"square\"\n      class=\"w-16 h-16 bg-rose-500 rounded border border-4 border-rose-800 hover:bg-indigo-600 hover:border-yellow-500 transition-colors ease-in-out duration-700\"\u003e\n\u003c/div\u003e\n```\n",
      "summary": "I learned that tailwind animations are pretty easy to add only needing a few classes. For some reason though my brain broke, thinking that I could...",
      "date_published": "2024-04-15T21:19:21Z",
      "date_modified": "2024-04-15T21:19:21Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/how-to-kill-ollama-server/",
      "url": "https://waylonwalker.com/how-to-kill-ollama-server/",
      "title": "How to kill ollama server",
      "content_html": "\u003cp\u003eI recently updated \u003ca href=\"https://ollama.com/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/ollama.com.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/ollama.com.png\" class=\"has-avatar  has-avatar-before\"\u003eollama\u003c/a\u003e, and it now installs a systemd\nservice that I was not expecting.  Seems like a great option, but I hadn’t\nexpeted this and I was able to kill it previously.  It was using up gpu, and I\ndo other things on my machine with a gpu.  I tried pkill, kill, and everything,\nit was still coming back.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNo matter what it comes back\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# stop it\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esystemctl stop ollama.service\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# disable it if you want\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esystemctl disable ollama.service\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# confirm its status\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esystemctl status ollama.service\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can confirm this with the following command.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# checking running processes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eps aux \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep ollama\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epgrep ollama\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# checking gpu processes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egpustat --show-cmd --show-pid\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNext time you want to start you can do it as before with \u003ccode\u003eollama serve\u003c/code\u003e.\u003c/p\u003e\n",
      "content_text": "\nI recently updated [ollama](https://ollama.com/), and it now installs a systemd\nservice that I was not expecting.  Seems like a great option, but I hadn't\nexpeted this and I was able to kill it previously.  It was using up gpu, and I\ndo other things on my machine with a gpu.  I tried pkill, kill, and everything,\nit was still coming back.\n\n\u003e No matter what it comes back\n\n``` bash\n# stop it\nsystemctl stop ollama.service\n\n# disable it if you want\nsystemctl disable ollama.service\n\n# confirm its status\nsystemctl status ollama.service\n```\n\nYou can confirm this with the following command.\n\n``` bash\n# checking running processes\nps aux | grep ollama\npgrep ollama\n\n# checking gpu processes\ngpustat --show-cmd --show-pid\n```\n\nNext time you want to start you can do it as before with `ollama serve`.\n",
      "summary": "I recently updated ollama, and it now installs a systemd service that I was not expecting. Seems like a great option, but I hadn't expeted this and I was...",
      "date_published": "2024-04-14T18:31:36Z",
      "date_modified": "2024-04-14T18:31:36Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "ai",
        "linux",
        "llm"
      ]
    },
    {
      "id": "https://waylonwalker.com/composing-typer-clis/",
      "url": "https://waylonwalker.com/composing-typer-clis/",
      "title": "Composing Typer clis",
      "content_html": "\u003cp\u003eTyper makes it easy to compose your cli applications, like you might with a web\nrouter if you are more familiar with that.  This allows you to build smaller\napplications that compose into a larger application.\u003c/p\u003e\n\u003cp\u003eYou will see similar patterns in the wild, namely the \u003ccode\u003eaws\u003c/code\u003e cli which always\nhas the \u003ccode\u003eaws \u0026lt;command\u0026gt; \u0026lt;subcommand\u0026gt;\u003c/code\u003e pattern.\u003c/p\u003e\n\u003cp\u003eLets setup the cli app itself first.  You can put it in \u003ccode\u003eproject/cli/cli.py\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003etyper\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003eproject.cli.api\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eapi_app\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003eproject.cli.config\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003econfig_app\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003eproject.cli.user\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003euser_app\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003eproject.cli.run\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003erun_app\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etyper\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTyper\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd_typer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eapi_app\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;api\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd_typer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econfig_app\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;config\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd_typer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003euser_app\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;user\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd_typer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erun_app\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;run\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCreating an app that will become a command is the same as creating a regular\napp in Typer.  We need to create a callback that will become our command, and a\ncommand that will become our subcommand in the parent app.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003etyper\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003erich.console\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eConsole\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003eproject.config\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eget_config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econfig_app\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etyper\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTyper\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@config_app.callback\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;model cli\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@config_app.command\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eshow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eproject_config\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eget_config\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eConsole\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efokais_config\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSetting up the entrypoint in pyproject.toml.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eproject\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003escripts\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"c\"\u003e# \u0026lt;- this project is part of the config DO NOT change it\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eproject\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;project.cli.cli:app\u0026#34;\u003c/span\u003e \u003cspan class=\"c\"\u003e# \u0026lt;- This project is the project name, DO change it\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow you can see each cli application as a sub command.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ project --help\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Usage: project \u003cspan class=\"o\"\u003e[\u003c/span\u003eOPTIONS\u003cspan class=\"o\"\u003e]\u003c/span\u003e COMMAND \u003cspan class=\"o\"\u003e[\u003c/span\u003eARGS\u003cspan class=\"o\"\u003e]\u003c/span\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e╭─ Options ─────────────────────────────────────────────────────────────────────────────────────────╮\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ --install-completion  \u003cspan class=\"o\"\u003e[\u003c/span\u003ebash\u003cspan class=\"p\"\u003e|\u003c/span\u003ezsh\u003cspan class=\"p\"\u003e|\u003c/span\u003efish\u003cspan class=\"p\"\u003e|\u003c/span\u003epowershell\u003cspan class=\"p\"\u003e|\u003c/span\u003epwsh\u003cspan class=\"o\"\u003e]\u003c/span\u003e  Install completion \u003cspan class=\"k\"\u003efor\u003c/span\u003e the specified shell.│\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│                                                        \u003cspan class=\"o\"\u003e[\u003c/span\u003edefault: None\u003cspan class=\"o\"\u003e]\u003c/span\u003e                            │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ --show-completion     \u003cspan class=\"o\"\u003e[\u003c/span\u003ebash\u003cspan class=\"p\"\u003e|\u003c/span\u003ezsh\u003cspan class=\"p\"\u003e|\u003c/span\u003efish\u003cspan class=\"p\"\u003e|\u003c/span\u003epowershell\u003cspan class=\"p\"\u003e|\u003c/span\u003epwsh\u003cspan class=\"o\"\u003e]\u003c/span\u003e  Show completion \u003cspan class=\"k\"\u003efor\u003c/span\u003e the specified shell,   │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│                                                        to copy it or customize the installation.  │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│                                                        \u003cspan class=\"o\"\u003e[\u003c/span\u003edefault: None\u003cspan class=\"o\"\u003e]\u003c/span\u003e                            │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ --help                                                 Show this message and exit.                │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e╰───────────────────────────────────────────────────────────────────────────────────────────────────╯\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e╭─ Commands ────────────────────────────────────────────────────────────────────────────────────────╮\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ api                        model cli                                                              │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ config                     config cli                                                             │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ user                       user cli                                                               │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ run                        run cli                                                                │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e╰───────────────────────────────────────────────────────────────────────────────────────────────────╯\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIn the example above we can run the command \u003ccode\u003eproject config show\u003c/code\u003e to see the\ncurrent configuration of our project.\u003c/p\u003e\n",
      "content_text": "\nTyper makes it easy to compose your cli applications, like you might with a web\nrouter if you are more familiar with that.  This allows you to build smaller\napplications that compose into a larger application.\n\nYou will see similar patterns in the wild, namely the `aws` cli which always\nhas the `aws \u003ccommand\u003e \u003csubcommand\u003e` pattern.\n\nLets setup the cli app itself first.  You can put it in `project/cli/cli.py`.\n\n``` python\nimport typer\n\nfrom project.cli.api import api_app\nfrom project.cli.config import config_app\nfrom project.cli.user import user_app\nfrom project.cli.run import run_app\n\napp = typer.Typer()\n\napp.add_typer(api_app, name=\"api\")\napp.add_typer(config_app, name=\"config\")\napp.add_typer(user_app, name=\"user\")\napp.add_typer(run_app, name=\"run\")\n```\n\nCreating an app that will become a command is the same as creating a regular\napp in Typer.  We need to create a callback that will become our command, and a\ncommand that will become our subcommand in the parent app.\n\n``` python\nimport typer\nfrom rich.console import Console\n\nfrom project.config import get_config\n\nconfig_app = typer.Typer()\n\n@config_app.callback()\ndef config():\n    \"model cli\"\n\n\n@config_app.command()\ndef show(\n):\n    project_config = get_config(env)\n    Console().print(fokais_config)\n```\n\nSetting up the entrypoint in pyproject.toml.\n\n``` toml\n[project.scripts] # \u003c- this project is part of the config DO NOT change it\nproject = \"project.cli.cli:app\" # \u003c- This project is the project name, DO change it\n```\n\nNow you can see each cli application as a sub command.\n\n``` bash\n❯ project --help\n\n Usage: project [OPTIONS] COMMAND [ARGS]...\n\n╭─ Options ─────────────────────────────────────────────────────────────────────────────────────────╮\n│ --install-completion  [bash|zsh|fish|powershell|pwsh]  Install completion for the specified shell.│\n│                                                        [default: None]                            │\n│ --show-completion     [bash|zsh|fish|powershell|pwsh]  Show completion for the specified shell,   │\n│                                                        to copy it or customize the installation.  │\n│                                                        [default: None]                            │\n│ --help                                                 Show this message and exit.                │\n╰───────────────────────────────────────────────────────────────────────────────────────────────────╯\n╭─ Commands ────────────────────────────────────────────────────────────────────────────────────────╮\n│ api                        model cli                                                              │\n│ config                     config cli                                                             │\n│ user                       user cli                                                               │\n│ run                        run cli                                                                │\n╰───────────────────────────────────────────────────────────────────────────────────────────────────╯\n```\n\nIn the example above we can run the command `project config show` to see the\ncurrent configuration of our project.\n",
      "summary": "Typer makes it easy to compose your cli applications, like you might with a web router if you are more familiar with that. This allows you to build smaller...",
      "date_published": "2024-04-13T08:27:26Z",
      "date_modified": "2024-04-13T08:27:26Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/tailwind-custom-size/",
      "url": "https://waylonwalker.com/tailwind-custom-size/",
      "title": "tailwind arbitrary values",
      "content_html": "\u003cp\u003eI learned not to fear the arbitrary size feature of tailwind.  While building\nout \u003ca href=\"https://reader.waylonwalker.com\"\u003ereader.waylonwalker.com\u003c/a\u003e I kept getting\ncontent flowing off the screen, and struggling to keep it on the screen.  I\nreally felt that I should be able to do this with vanilla tailwind, but after\nsome encouragement from Twitter I decided to lean on arbitrary values and it\nworked.\u003c/p\u003e\n\u003cp\u003eDon’t fear the arbitrary values.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;max-w-[100vw]\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLearn more about using-arbitrary-values from their docs\n\u003ca href=\"https://tailwindcss.com/docs/adding-custom-styles#using-arbitrary-values\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/tailwindcss.com.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/tailwindcss.com.png\" class=\"has-avatar  has-avatar-before\"\u003edocs\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI learned not to fear the arbitrary size feature of tailwind.  While building\nout [reader.waylonwalker.com](https://reader.waylonwalker.com) I kept getting\ncontent flowing off the screen, and struggling to keep it on the screen.  I\nreally felt that I should be able to do this with vanilla tailwind, but after\nsome encouragement from Twitter I decided to lean on arbitrary values and it\nworked.\n\nDon't fear the arbitrary values.\n\n``` html\n\u003cli class=\"max-w-[100vw]\"\u003e\n\u003c/li\u003e\n```\n\nLearn more about using-arbitrary-values from their docs\n[docs](https://tailwindcss.com/docs/adding-custom-styles#using-arbitrary-values)\n",
      "summary": "I learned not to fear the arbitrary size feature of tailwind. While building out reader.waylonwalker.com I kept getting content flowing off the screen, and...",
      "date_published": "2024-04-12T21:21:42Z",
      "date_modified": "2024-04-12T21:21:42Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/fix-npm-global-install-needs-sudo/",
      "url": "https://waylonwalker.com/fix-npm-global-install-needs-sudo/",
      "title": "fix npm global install needs sudo",
      "content_html": "\u003cp\u003eEach time I go to set up npm I am frustrated by the errors saying that I don’t\nhave permission to \u003ccode\u003enpm i -g \u0026lt;package\u0026gt;\u003c/code\u003e, and it’s frustrating.  And I forget\nwhat I need to do to tell npm to install packages in a directory I own, and my\nshell to look there so that I can use the executables.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir ~/.npm-global\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eNPM_CONFIG_PREFIX\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e~/.npm-global\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003ePATH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003e$PATH\u003c/span\u003e:~/.npm-global/bin\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor the fix to remain persistent you need to put these two lines in your shell\nprofile like \u003ccode\u003e~/.bashrc\u003c/code\u003e or \u003ccode\u003e~/.zshrc\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eNPM_CONFIG_PREFIX\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e~/.npm-global\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003ePATH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003e$PATH\u003c/span\u003e:~/.npm-global/bin\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nEach time I go to set up npm I am frustrated by the errors saying that I don't\nhave permission to `npm i -g \u003cpackage\u003e`, and it's frustrating.  And I forget\nwhat I need to do to tell npm to install packages in a directory I own, and my\nshell to look there so that I can use the executables.\n\n``` bash\nmkdir ~/.npm-global\nexport NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=$PATH:~/.npm-global/bin\n```\n\nFor the fix to remain persistent you need to put these two lines in your shell\nprofile like `~/.bashrc` or `~/.zshrc`.\n\n``` bash\nexport NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=$PATH:~/.npm-global/bin\n```\n",
      "summary": "Each time I go to set up npm I am frustrated by the errors saying that I don't have permission to , and it's frustrating. And I forget what I need to do to...",
      "date_published": "2024-04-11T13:28:17Z",
      "date_modified": "2024-04-11T13:28:17Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/darkmode-scrollbars/",
      "url": "https://waylonwalker.com/darkmode-scrollbars/",
      "title": "darkmode scrollbars",
      "content_html": "\u003cp\u003eIf you are designing a website in dark mode the scrollbars can be finicky to\nmatch the theme.  Here is a pretty sane default that looks nice without being\nobnoxiously contrast to the rest of the site.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003e-webkit-scrollbar\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003e-webkit-scrollbar-track\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ergb\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e24\u003c/span\u003e \u003cspan class=\"mi\"\u003e24\u003c/span\u003e \u003cspan class=\"mi\"\u003e27\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003e-webkit-scrollbar-track\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ergb\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e39\u003c/span\u003e \u003cspan class=\"mi\"\u003e39\u003c/span\u003e \u003cspan class=\"mi\"\u003e42\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003e-webkit-scrollbar-thumb\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ergb\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e82\u003c/span\u003e \u003cspan class=\"mi\"\u003e82\u003c/span\u003e \u003cspan class=\"mi\"\u003e91\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003e-webkit-scrollbar-thumb\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ergb\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e113\u003c/span\u003e \u003cspan class=\"mi\"\u003e113\u003c/span\u003e \u003cspan class=\"mi\"\u003e122\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003e-webkit-scrollbar-thumb\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ergb\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e82\u003c/span\u003e \u003cspan class=\"mi\"\u003e82\u003c/span\u003e \u003cspan class=\"mi\"\u003e91\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003e-webkit-scrollbar-thumb\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ergb\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e113\u003c/span\u003e \u003cspan class=\"mi\"\u003e113\u003c/span\u003e \u003cspan class=\"mi\"\u003e122\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003e-webkit-scrollbar-corner\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ergb\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e39\u003c/span\u003e \u003cspan class=\"mi\"\u003e39\u003c/span\u003e \u003cspan class=\"mi\"\u003e42\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWant a rounded scrollbar thumb? add these styles.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003e-webkit-scrollbar-thumb\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.25\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e9999\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003e-webkit-scrollbar-thumb\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.25\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e9999\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis makes a very nice looking default darkmode scrollbar.\u003c/p\u003e\n",
      "content_text": "\nIf you are designing a website in dark mode the scrollbars can be finicky to\nmatch the theme.  Here is a pretty sane default that looks nice without being\nobnoxiously contrast to the rest of the site.\n\n``` html\n    \u003cstyle\u003e\n        ::-webkit-scrollbar {\n            height: 1rem;\n            width: 1rem;\n        }\n\n        ::-webkit-scrollbar-track {\n            background-color: rgb(24 24 27);\n        }\n\n        body::-webkit-scrollbar-track {\n            background-color: rgb(39 39 42);\n        }\n\n        ::-webkit-scrollbar-thumb {\n            background-color: rgb(82 82 91);\n        }\n\n        ::-webkit-scrollbar-thumb:hover {\n            background-color: rgb(113 113 122);\n        }\n\n        body::-webkit-scrollbar-thumb {\n            background-color: rgb(82 82 91);\n        }\n\n        body::-webkit-scrollbar-thumb:hover {\n            background-color: rgb(113 113 122);\n        }\n\n        ::-webkit-scrollbar-corner {\n            background-color: rgb(39 39 42);\n        }\n    \u003c/style\u003e\n```\n\nWant a rounded scrollbar thumb? add these styles.\n\n``` css\n::-webkit-scrollbar-thumb {\n    border-radius: 0.25rem;\n    border-radius: 9999px;\n}\n\nbody::-webkit-scrollbar-thumb {\n    border-radius: 0.25rem;\n    border-radius: 9999px;\n}\n```\n\nThis makes a very nice looking default darkmode scrollbar.\n",
      "summary": "If you are designing a website in dark mode the scrollbars can be finicky to match the theme. Here is a pretty sane default that looks nice without being...",
      "date_published": "2024-04-10T11:56:38Z",
      "date_modified": "2024-04-10T11:56:38Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/updating-cloudflare-pages-using-the-wrangler-cli/",
      "url": "https://waylonwalker.com/updating-cloudflare-pages-using-the-wrangler-cli/",
      "title": "Udating Cloudflare Pages using the Wrangler cli",
      "content_html": "\u003cp\u003eBefore deploying to cloudflare pages with wrangler you need a cloudflare api\ntoken.  You can get one at\n\u003ca href=\"https://dash.cloudflare.com/profile/api-tokens\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/dash.cloudflare.com.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/dash.cloudflare.com.png\" class=\"has-avatar  has-avatar-before\"\u003edash.cloudflare.com/profile/api-tokens\u003c/a\u003e.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/7b566e55-98ff-4d96-b0bc-3c4e5b619d68.png\" class=\"glightbox-link\" aria-label=\"cloudflare-pages-api-token.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/7b566e55-98ff-4d96-b0bc-3c4e5b619d68.png\" alt=\"cloudflare-pages-api-token.png\"/ data-glightbox=\"description: cloudflare-pages-api-token.png\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"install-wrangler\"\u003eInstall Wrangler \u003ca href=\"#install-wrangler\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNext install wrangler using npm.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm i -g wrangler\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"create-a-project\"\u003eCreate a Project \u003ca href=\"#create-a-project\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBefore you deploy to cloudflare pages you need to create a project.  You might\nalready have one, or you might want to create one in the webui, but you have\nthe option to create it at the command line with wrangler.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpx wrangler pages deploy markout --project-name reader-waylonwalker-com --branch markout\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"deploy\"\u003eDeploy \u003ca href=\"#deploy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow you can deploy your static application using wrangler to cloudflare pages.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn this example I have my application built into the markout directory, and\nsince the production branch is named \u003ccode\u003emarkout\u003c/code\u003e I need to pass that in here as\nwell.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewrangler pages deploy markout --project-name reader-waylonwalker-com --branch markout\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nBefore deploying to cloudflare pages with wrangler you need a cloudflare api\ntoken.  You can get one at\n[dash.cloudflare.com/profile/api-tokens](https://dash.cloudflare.com/profile/api-tokens).\n\n![cloudflare-pages-api-token.png](https://dropper.waylonwalker.com/api/file/7b566e55-98ff-4d96-b0bc-3c4e5b619d68.png)\n\n## Install Wrangler\n\nNext install wrangler using npm.\n\n``` bash\nnpm i -g wrangler\n```\n\n## Create a Project\n\nBefore you deploy to cloudflare pages you need to create a project.  You might\nalready have one, or you might want to create one in the webui, but you have\nthe option to create it at the command line with wrangler.\n\n``` bash\nnpx wrangler pages deploy markout --project-name reader-waylonwalker-com --branch markout\n```\n\n## Deploy\n\nNow you can deploy your static application using wrangler to cloudflare pages.\n\n\u003e In this example I have my application built into the markout directory, and\n\u003e since the production branch is named `markout` I need to pass that in here as\n\u003e well.\n\n``` bash\nwrangler pages deploy markout --project-name reader-waylonwalker-com --branch markout\n```\n",
      "summary": "Before deploying to cloudflare pages with wrangler you need a cloudflare api token. You can get one at dash.cloudflare.com/profile/api-tokens.",
      "date_published": "2024-04-09T17:03:51Z",
      "date_modified": "2024-04-09T17:03:51Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "cloud",
        "cloudflare",
        "deployment",
        "infra",
        "infrastructure"
      ]
    },
    {
      "id": "https://waylonwalker.com/scheduling-cron-jobs-in-kubernetes/",
      "url": "https://waylonwalker.com/scheduling-cron-jobs-in-kubernetes/",
      "title": "scheduling cron jobs in kubernetes",
      "content_html": "\u003cp\u003eFor my reader app I am using cronjobs to schedule my a new build and upload to\ncloudflare pages every hour.  In this example I have built a docker image\n\u003ccode\u003edocker.io/waylonwalker/reader-waylonwalker-com\u003c/code\u003e and pushed it to dockerhub.\nIt uses a \u003ccode\u003eCLOUDFLARE_API_TOKEN\u003c/code\u003e secret to access cloudflare, and the\nentrypoint itself does the build and upload.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eNamespace\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecreationTimestamp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereader\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereader\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebatch/v1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCronJob\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereader-cronjob\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereader\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eschedule\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;0 * * * *\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003esuccessfulJobsHistoryLimit\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e6\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efailedJobsHistoryLimit\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e6\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ejobTemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003econtainers\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereader-container\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edocker.io/waylonwalker/reader-waylonwalker-com:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCLOUDFLARE_API_TOKEN\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                  \u003c/span\u003e\u003cspan class=\"nt\"\u003evalueFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"nt\"\u003esecretKeyRef\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                      \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecloudflare-secret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                      \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecloudflare-secret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003erestartPolicy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eOnFailure\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nFor my reader app I am using cronjobs to schedule my a new build and upload to\ncloudflare pages every hour.  In this example I have built a docker image\n`docker.io/waylonwalker/reader-waylonwalker-com` and pushed it to dockerhub.\nIt uses a `CLOUDFLARE_API_TOKEN` secret to access cloudflare, and the\nentrypoint itself does the build and upload.\n\n``` yaml\napiVersion: v1\nkind: Namespace\nmetadata:\n  creationTimestamp: null\n  name: reader\n  namespace: reader\n\n---\napiVersion: batch/v1\nkind: CronJob\nmetadata:\n  name: reader-cronjob\n  namespace: reader\nspec:\n  schedule: \"0 * * * *\"\n  successfulJobsHistoryLimit: 6\n  failedJobsHistoryLimit: 6\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          containers:\n            - name: reader-container\n              image: docker.io/waylonwalker/reader-waylonwalker-com:latest\n              env:\n                - name: CLOUDFLARE_API_TOKEN\n                  valueFrom:\n                    secretKeyRef:\n                      name: cloudflare-secret\n                      key: cloudflare-secret\n          restartPolicy: OnFailure\n```\n",
      "summary": "For my reader app I am using cronjobs to schedule my a new build and upload to cloudflare pages every hour. In this example I have built a docker image and...",
      "date_published": "2024-04-08T16:56:46Z",
      "date_modified": "2024-04-08T16:56:46Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "kubernetes"
      ]
    },
    {
      "id": "https://waylonwalker.com/jinja-macros/",
      "url": "https://waylonwalker.com/jinja-macros/",
      "title": "jinja macros",
      "content_html": "\u003cp\u003eI am working on a page for\n\u003ca href=\"https://htmx-patterns.waylonwalker.com\"\u003ehtmx-patterns\u003c/a\u003e and I ran into a\nsituation with lots of duplication.  Especially when i am using tailwind I run\ninto situations where the duplication can get tedious to maintiain.  The\nsolution I found is macros.\u003c/p\u003e\n\u003cp\u003eNow I can use the same code for all of my links, and call the macro to use it.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% macro link(id, text, boosted=false) -%}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e    {% if id is none %}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e      pointer-events-none bg-terminal-950 text-terminal-900 ring-terminal-900\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e    {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e      bg-terminal-950 hover:bg-terminal-900 hover:text-terminal-400 text-terminal-500 shadow-lg shadow-terminal-300/20 hover:shadow-terminal-300/30 ring-terminal-300\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e      cursor-pointer block text-center font-bold py-2 px-4 rounded w-full ring-1\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e    \u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"err\"\u003e{%\u003c/span\u003e \u003cspan class=\"na\"\u003eif\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e \u003cspan class=\"na\"\u003eis\u003c/span\u003e \u003cspan class=\"na\"\u003enot\u003c/span\u003e \u003cspan class=\"na\"\u003enone\u003c/span\u003e \u003cspan class=\"err\"\u003e%}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ url_for(\u0026#39;boosted\u0026#39;, id=id) }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"err\"\u003e{%\u003c/span\u003e \u003cspan class=\"na\"\u003eendif\u003c/span\u003e \u003cspan class=\"err\"\u003e%}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"err\"\u003e{%\u003c/span\u003e \u003cspan class=\"na\"\u003eif\u003c/span\u003e \u003cspan class=\"na\"\u003eboosted\u003c/span\u003e \u003cspan class=\"err\"\u003e%}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003ehx-boost\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"err\"\u003e{%\u003c/span\u003e \u003cspan class=\"na\"\u003eendif\u003c/span\u003e \u003cspan class=\"err\"\u003e%}\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{ text }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{%- endmacro %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;text-3xl font-light mt-0 max-w-xl text-center prose-xl mt-8 text-terminal-500\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Boosted Links\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;flex flex-row gap-4\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{ link(prev_id, \u0026#39;Previous\u0026#39;, boosted=True) }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{ link(next_id, \u0026#39;Next\u0026#39;, boosted=True) }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;text-3xl font-light mt-0 max-w-xl text-center prose-xl mt-8 text-terminal-500\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Normal Links\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;flex flex-row gap-4\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{ link(prev_id, \u0026#39;Previous\u0026#39;, boosted=False) }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{ link(next_id, \u0026#39;Next\u0026#39;, boosted=False) }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI am working on a page for\n[htmx-patterns](https://htmx-patterns.waylonwalker.com) and I ran into a\nsituation with lots of duplication.  Especially when i am using tailwind I run\ninto situations where the duplication can get tedious to maintiain.  The\nsolution I found is macros.\n\nNow I can use the same code for all of my links, and call the macro to use it.\n\n``` html\n{% macro link(id, text, boosted=false) -%}\n\u003ca\n    class=\"\n    {% if id is none %}\n      pointer-events-none bg-terminal-950 text-terminal-900 ring-terminal-900\n    {% else %}\n      bg-terminal-950 hover:bg-terminal-900 hover:text-terminal-400 text-terminal-500 shadow-lg shadow-terminal-300/20 hover:shadow-terminal-300/30 ring-terminal-300\n    {% endif %}\n      cursor-pointer block text-center font-bold py-2 px-4 rounded w-full ring-1\n    \"\n    {% if id is not none %}\n    href=\"{{ url_for('boosted', id=id) }}\"\n    {% endif %}\n    {% if boosted %}\n    hx-boost=\"true\"\n    {% endif %}\u003e\n    {{ text }}\n\u003c/a\u003e\n{%- endmacro %}\n\n\u003ch2 class='text-3xl font-light mt-0 max-w-xl text-center prose-xl mt-8 text-terminal-500'\u003e\n    Boosted Links\n\u003c/h2\u003e\n\n\u003cdiv class='flex flex-row gap-4'\u003e\n    {{ link(prev_id, 'Previous', boosted=True) }}\n    {{ link(next_id, 'Next', boosted=True) }}\n\u003c/div\u003e\n\n\u003ch2 class='text-3xl font-light mt-0 max-w-xl text-center prose-xl mt-8 text-terminal-500'\u003e\n    Normal Links\n\u003c/h2\u003e\n\n\u003cdiv class='flex flex-row gap-4'\u003e\n    {{ link(prev_id, 'Previous', boosted=False) }}\n    {{ link(next_id, 'Next', boosted=False) }}\n\u003c/div\u003e\n```\n",
      "summary": "I am working on a page for htmx-patterns and I ran into a situation with lots of duplication. Especially when i am using tailwind I run into situations where...",
      "date_published": "2024-04-07T14:54:08Z",
      "date_modified": "2024-04-07T14:54:08Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/jinja-loop-variable-and-htmx/",
      "url": "https://waylonwalker.com/jinja-loop-variable-and-htmx/",
      "title": "jinja loop variable and htmx",
      "content_html": "\u003cp\u003ejinja has a loop variable that is very handy to use with \u003ca href=\"/htmx/\" class=\"glossary-term\" title=\"htmx is a frontend javascript library for creating dynamic web applications.\"\u003ehtmx\u003c/a\u003e.  Whether you\nwant to implement a click to load more or an infinite scroll this loop variable\nis very handy.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for person in persons %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e{%\u003c/span\u003e \u003cspan class=\"na\"\u003eif\u003c/span\u003e \u003cspan class=\"na\"\u003eloop\u003c/span\u003e\u003cspan class=\"err\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003elast\u003c/span\u003e \u003cspan class=\"err\"\u003e%}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003ehx-get\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ url_for(\u0026#39;infinite\u0026#39;, page=next_page) }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003ehx-trigger\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;intersect once\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003ehx-target\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#persons\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003ehx-swap\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;beforeend\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003ehx-indicator\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#persons-loading\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e{%\u003c/span\u003e \u003cspan class=\"na\"\u003eendif\u003c/span\u003e \u003cspan class=\"err\"\u003e%}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"err\"\u003e{{\u003c/span\u003e \u003cspan class=\"na\"\u003eperson\u003c/span\u003e\u003cspan class=\"err\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"err\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eupper\u003c/span\u003e\u003cspan class=\"err\"\u003e()\u003c/span\u003e \u003cspan class=\"err\"\u003e}}\u003c/span\u003e \u003cspan class=\"na\"\u003e-\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"err\"\u003e{{\u003c/span\u003e \u003cspan class=\"na\"\u003eperson\u003c/span\u003e\u003cspan class=\"err\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ephone_number\u003c/span\u003e \u003cspan class=\"err\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"na\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow for every chunk of contacts that we load we will trigger the infinite\nscroll by loading more once the last one has intersected the screen.\u003c/p\u003e\n",
      "content_text": "\njinja has a loop variable that is very handy to use with htmx.  Whether you\nwant to implement a click to load more or an infinite scroll this loop variable\nis very handy.\n\n``` html\n{% for person in persons %}\n\u003cli\n{% if loop.last %}\n    hx-get=\"{{ url_for('infinite', page=next_page) }}\"\n    hx-trigger=\"intersect once\"\n    hx-target=\"#persons\"\n    hx-swap='beforeend'\n    hx-indicator=\"#persons-loading\"\n{% endif %}\n    {{ person.name.upper() }} -\n    {{ person.phone_number }}\n\u003c/li\u003e\n{% endfor %}\n```\n\nNow for every chunk of contacts that we load we will trigger the infinite\nscroll by loading more once the last one has intersected the screen.\n",
      "summary": "jinja has a loop variable that is very handy to use with htmx. Whether you want to implement a click to load more or an infinite scroll this loop variable is...",
      "date_published": "2024-04-06T20:47:13Z",
      "date_modified": "2024-04-06T20:47:13Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "htmx",
        "python",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/fastapi-jinja-url_for-with-query-params/",
      "url": "https://waylonwalker.com/fastapi-jinja-url_for-with-query-params/",
      "title": "fastapi jinja url_for with query params",
      "content_html": "\u003cp\u003eOut of the box \u003ca href=\"/starlette/\" class=\"glossary-term\" title=\"Starlette is a low level web framework for modern (as of 2025) async python development most famously used by \u003ca href=\"/fastapi/\" class=\"glossary-term\" title=\"FastAPI is a modern and efficient web framework for Python, built on top of the Starlette web framework, and pydantic for data validation and serialization.\"\u003eFastAPI\u003c/a\u003e.\"\u003eStarlette\u003c/a\u003e does not support url_for with query params.  When\ntrying to use url_for with query params it throws the following error.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003estarlette\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erouting\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eNoMatchFound\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eNo\u003c/span\u003e \u003cspan class=\"n\"\u003eroute\u003c/span\u003e \u003cspan class=\"n\"\u003eexists\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;infinite\u0026#34;\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003eparams\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;page\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIn my searching for this I found \u003ca href=\"https://github.com/encode/starlette/issues/560\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003estarlette issue #560\u003c/a\u003e quite helpful, but not complete, as it did not work for me.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003ejinja2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nb\"\u003ehasattr\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ejinja2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pass_context\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epass_context\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejinja2\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epass_context\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epass_context\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejinja2\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econtextfunction\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@pass_context\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eurl_for_query\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erequest\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;request\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eurl_for\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eparams\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"p\"\u003e{}:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eurl\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003eurllib.parse\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eparse_qs\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eurlencode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eurlparse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eurlunparse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Parse the URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eparsed_url\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eurlparse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Parse the query parameters\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003equery_params\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eparse_qs\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eparsed_url\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Update the query parameters with the new ones\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003equery_params\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eupdate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Rebuild the query string\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eupdated_query_string\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eurlencode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003equery_params\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edoseq\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Rebuild the URL with the updated query string\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eupdated_url\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eurlunparse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eparsed_url\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003escheme\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eparsed_url\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enetloc\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eparsed_url\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eparsed_url\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eupdated_query_string\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eparsed_url\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efragment\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ENV\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;dev\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;qa\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;prod\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eupdated_url\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eupdated_url\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;http\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eupdated_url\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_templates\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etemplates\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eJinja2Templates\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edirectory\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;templates\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etemplates\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenv\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eglobals\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;url_for\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eurl_for_query\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003etemplates\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ehttps\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e If you want url_for to work in production you need some way to convert http\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eto https.  Here is how I make it work, for local development I \u003ccode\u003eexport ENV=local\u003c/code\u003e then for each environment that I am running on a server I include\nit in the list and update \u003ccode\u003eENV\u003c/code\u003e appropriately.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ENV\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;dev\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;qa\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;prod\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eupdated_url\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eupdated_url\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;http\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003eThe route might look something like this.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@infinite_router.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ehome\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003epage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eint\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eint\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo access the home route using url_for in a jinja template you can use the\nfollowing, once you have applied the \u003ccode\u003eurl_for_query\u003c/code\u003e function as your default\n\u003ccode\u003eurl_for\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ url_for(\u0026#39;home\u0026#39;, page=1) }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eHome\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nOut of the box Starlette does not support url_for with query params.  When\ntrying to use url_for with query params it throws the following error.\n\n``` python\nstarlette.routing.NoMatchFound: No route exists for name \"infinite\" and params \"page\"\n```\n\nIn my searching for this I found [starlette issue #560](https://github.com/encode/starlette/issues/560) quite helpful, but not complete, as it did not work for me.\n\n``` python\nimport jinja2\n\nif hasattr(jinja2, \"pass_context\"):\n    pass_context = jinja2.pass_context\nelse:\n    pass_context = jinja2.contextfunction\n\n@pass_context\ndef url_for_query(context: dict, name: str, **params: dict) -\u003e str:\n    request = context[\"request\"]\n    url = str(request.url_for(name))\n    if params == {}:\n        return url\n    from urllib.parse import parse_qs, urlencode, urlparse, urlunparse\n\n    # Parse the URL\n    parsed_url = urlparse(url)\n\n    # Parse the query parameters\n    query_params = parse_qs(parsed_url.query)\n\n    # Update the query parameters with the new ones\n    query_params.update(params)\n\n    # Rebuild the query string\n    updated_query_string = urlencode(query_params, doseq=True)\n\n    # Rebuild the URL with the updated query string\n    updated_url = urlunparse(\n        (\n            parsed_url.scheme,\n            parsed_url.netloc,\n            parsed_url.path,\n            parsed_url.params,\n            updated_query_string,\n            parsed_url.fragment,\n        )\n    )\n\n    if os.environ.get(\"ENV\") in [\"dev\", \"qa\", \"prod\"]:\n        updated_url = updated_url.replace(\"http\", \"https\", 1)\n\n    return updated_url\n\ndef get_templates():\n    templates = Jinja2Templates(directory=\"templates\")\n    templates.env.globals[\"url_for\"] = url_for_query\n    return templates\n```\n\n!!! Note \"https\"\n     If you want url_for to work in production you need some way to convert http\n     to https.  Here is how I make it work, for local development I `export\n     ENV=local` then for each environment that I am running on a server I include\n     it in the list and update `ENV` appropriately.\n\n     ``` python\n         if os.environ.get(\"ENV\") in [\"dev\", \"qa\", \"prod\"]:\n             updated_url = updated_url.replace(\"http\", \"https\", 1)\n     ```\n\nThe route might look something like this.\n\n``` python\n@infinite_router.get(\"/\")\nasync def home(request: Request, page: int = 1, n: int = 10):\n  ...\n```\n\nTo access the home route using url_for in a jinja template you can use the\nfollowing, once you have applied the `url_for_query` function as your default\n`url_for`\n\n``` html\n\u003ca href=\"{{ url_for('home', page=1) }}\"\u003eHome\u003c/a\u003e\n```\n",
      "summary": "Out of the box Starlette does not support url_for with query params it throws the following error.",
      "date_published": "2024-04-05T20:43:32Z",
      "date_modified": "2024-04-05T20:43:32Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/kind-cluster-with-argo/",
      "url": "https://waylonwalker.com/kind-cluster-with-argo/",
      "title": "setting up a kind cluster with argocd installed",
      "content_html": "\u003cp\u003eKind (Kubernetes in Docker) is a tool that makes it easy to create and tear\ndown local clusters quickly.  I like to use it to test out new workflows.\u003c/p\u003e\n\u003cp\u003eArgocd is a continuous delivery tool that makes it easy to setup gitops\nworkflows in kubernetes.\u003c/p\u003e\n\u003cp\u003eHere is how you can setup a new kind cluster and install argocd into it using\nhelm, the kubernetes package manager.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekind create cluster --name argocd\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# your first time through you need to add the argocd repo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehelm repo add argo https://argoproj.github.io/argo-helm\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehelm repo update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# install argocd into the cluster\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehelm install argo argo/argo-cd --namespace argocd --create-namespace\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# deploy the app of apps\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl apply -f apps/apps.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you want to add repos and apps to your cluster you can use the argo cli to\ndo that, but first you will need forward the argocd port and login.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Wait until Argo CD API server is available\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Waiting for Argo CD API server to be available...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003ewhile\u003c/span\u003e ! kubectl \u003cspan class=\"nb\"\u003ewait\u003c/span\u003e --for\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003econdition\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eavailable --timeout\u003cspan class=\"o\"\u003e=\u003c/span\u003e60s deployment/argo-argocd-server -n argocd\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Waiting for Argo CD API server to be ready...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  sleep \u003cspan class=\"m\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl port-forward svc/argo-argocd-server -n argocd 8080:443 \u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eargocd_admin_password\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003ekubectl get secret argocd-initial-admin-secret -n argocd -o \u003cspan class=\"nv\"\u003ejsonpath\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{.data.password}\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e base64 -d\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eargocd login localhost:8080 --insecure --username admin --password \u003cspan class=\"nv\"\u003e$argocd_admin_password\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eargocd repo add https://github.com/fokais-com/app.fokais.git --username waylonwalker --password \u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eGH_ARGO_PAT\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eargocd app create app-fokais-local --repo https://github.com/fokais-com/app.fokais.git --path k8s/overlays/local --dest-server https://kubernetes.default.svc --sync-policy automated --sync-option \u003cspan class=\"nv\"\u003ePrune\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nKind (Kubernetes in Docker) is a tool that makes it easy to create and tear\ndown local clusters quickly.  I like to use it to test out new workflows.\n\nArgocd is a continuous delivery tool that makes it easy to setup gitops\nworkflows in kubernetes.\n\nHere is how you can setup a new kind cluster and install argocd into it using\nhelm, the kubernetes package manager.\n\n``` bash\nkind create cluster --name argocd\n\n# your first time through you need to add the argocd repo\nhelm repo add argo https://argoproj.github.io/argo-helm\nhelm repo update\n\n# install argocd into the cluster\nhelm install argo argo/argo-cd --namespace argocd --create-namespace\n\n# deploy the app of apps\nkubectl apply -f apps/apps.yaml\n```\n\nIf you want to add repos and apps to your cluster you can use the argo cli to\ndo that, but first you will need forward the argocd port and login.\n\n``` bash\n# Wait until Argo CD API server is available\necho \"Waiting for Argo CD API server to be available...\"\nwhile ! kubectl wait --for=condition=available --timeout=60s deployment/argo-argocd-server -n argocd; do\n  echo \"Waiting for Argo CD API server to be ready...\"\n  sleep 10\ndone\n\n\nkubectl port-forward svc/argo-argocd-server -n argocd 8080:443 \u0026\nargocd_admin_password=$(kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath=\"{.data.password}\" | base64 -d)\nargocd login localhost:8080 --insecure --username admin --password $argocd_admin_password\nargocd repo add https://github.com/fokais-com/app.fokais.git --username waylonwalker --password ${GH_ARGO_PAT}\nargocd app create app-fokais-local --repo https://github.com/fokais-com/app.fokais.git --path k8s/overlays/local --dest-server https://kubernetes.default.svc --sync-policy automated --sync-option Prune=true\n```\n",
      "summary": "Kind (Kubernetes in Docker) is a tool that makes it easy to create and tear down local clusters quickly. I like to use it to test out new workflows.",
      "date_published": "2024-04-04T18:42:18Z",
      "date_modified": "2024-04-04T18:42:18Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/kubernetes-kubeseal/",
      "url": "https://waylonwalker.com/kubernetes-kubeseal/",
      "title": "kubernetes kubeseal",
      "content_html": "\u003cp\u003eIn my \u003ca href=\"/homelab/\" class=\"glossary-term\" title=\"A place to self host applications. For me this is primarily self built web applications, and applications for sharing files with my family. Techno Tim has a...\"\u003ehomelab\u003c/a\u003e kubernetes cluster I am using kubeseal to encrypt secrets.  I\nhave been using it successfully for a few months now wtih great success. It\nallows me to commit all of my secrets manifests to \u003ca href=\"/glossary/git/\" class=\"glossary-term\" title=\"Git is a version control system for tracking changes in source code during software development. In the beginning there were many, some were licensed. As...\"\u003egit\u003c/a\u003e with out risk of leaking\nsecrets.\u003c/p\u003e\n\u003cp\u003eYou see kubeseal encrypts your secrets with a private key only stored in your\ncluster, so only the cluster itself can decrypt them using the kubeseal\ncontroller.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/833e8681-8220-4096-b211-80c33eb10c1c.png\" class=\"glightbox-link\" aria-label=\"kubeseal-post.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/833e8681-8220-4096-b211-80c33eb10c1c.png\" alt=\"kubeseal-post.png\"/ data-glightbox=\"description: kubeseal-post.png\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"kubeseal\"\u003eKubeSeal \u003ca href=\"#kubeseal\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"hoverlink\" href=\"https://sealed-secrets.netlify.app/\"\u003ehttps://sealed-secrets.netlify.app/\u003c/a\u003e\u003c/p\u003e\n\u003ca href=\"https://sealed-secrets.netlify.app/\"\u003e\n\u003cimg class=\"glightbox\" src=\"https://shots.waylonwalker.com/shot/?url=https://sealed-secrets.netlify.app/\u0026amp;height=450\u0026amp;width=800\u0026amp;scaled_width=800\u0026amp;scaled_height=450\u0026amp;selectors=\" alt=\"screenshot of https://sealed-secrets.netlify.app/\" height=\"450\" width=\"800\"/ data-glightbox=\"description: screenshot of https://sealed-secrets.netlify.app/\"\u003e\n\u003c/a\u003e\n\u003ch2 id=\"installation\"\u003einstallation \u003ca href=\"#installation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eInstallation happens in two steps.  You need the kubernetes controller and the\nclient side cli to create a sealed secret.\u003c/p\u003e\n\u003cp\u003eFor a more complete instruction see the\n[docs#installation](\u003ca href=\"https://github.com/bitnami-labs/sealed-secrets?tab=readme-ov-file#installation\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003ehttps://github.com/bitnami-labs/sealed-secrets?tab=readme-ov-file#installation\u003c/a\u003e]\u003c/p\u003e\n\u003ch2 id=\"installation---controller\"\u003einstallation - controller \u003ca href=\"#installation---controller\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eWarning\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e **context**\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eMake sure that you are in the right context before running any kubectl commands.\u003c/p\u003e\n\u003c/div\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl config current-context\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003esealed-secrets is installed using the helm package manager.  To install\nsealed-secrets run the following command.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehelm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehelm install sealed-secrets -n kube-system --set-string \u003cspan class=\"nv\"\u003efullnameOverride\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003esealed-secrets-controller sealed-secrets/sealed-secrets\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"installation---client\"\u003einstallation - client \u003ca href=\"#installation---client\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor the client you can check your OS package manager, brew, or the\n\u003ca href=\"https://github.com/bitnami-labs/sealed-secrets/releases/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003egithub-releases\u003c/a\u003e.\nFor me I found it in the main arch repos.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eparu -S kubeseal\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# or\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo pacman -S kubeseal\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# or\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install kubeseal\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e You will need to install kubeseal on every device that you will want to\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003ecreate sealed secrets on.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"example\"\u003eExample \u003ca href=\"#example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMost of these commands come straight from the docs.  From my experience I have\nalways specified the namespace, my projects go per namespace and I don’t have\nany reason that other namepsaces should see the secret, and if they do I deploy\nanother secret in that namespace.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create a json/yaml-encoded Secret somehow:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# (note use of `--dry-run` - this is just a local file!)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e -n bar \u003cspan class=\"p\"\u003e|\u003c/span\u003e kubectl create secret generic mysecret --dry-run\u003cspan class=\"o\"\u003e=\u003c/span\u003eclient --from-file\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003efoo\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e/dev/stdin -o yaml -n thenamespace \u0026gt; mysecret.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003enote that the key of the secret is \u003ccode\u003efoo\u003c/code\u003e and the value is \u003ccode\u003ebar\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eresults\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efoo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eYmFy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecreationTimestamp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ethenamespace\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e The data is base64 encoded.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e -n bar \u003cspan class=\"p\"\u003e|\u003c/span\u003e base64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# YmFy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# This is the important bit:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubeseal -f mysecret.yaml -w mysealedsecret.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# At this point mysealedsecret.json is safe to upload to Github,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# post on Twitter, etc.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Eventually:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl create -f mysealedsecret.yaml -n thenamespace\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# sealedsecret.bitnami.com/mysecret created\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Profit!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl get secret mysecret\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl get secret mysecret -n thenamespace\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# NAME       TYPE     DATA   AGE\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# mysecret   Opaque   1      27s\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecat mysealedsecret.yaml \u003cspan class=\"p\"\u003e|\u003c/span\u003e kubeseal --validate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e -n bar \u003cspan class=\"p\"\u003e|\u003c/span\u003e kubectl create secret generic mysecret --dry-run\u003cspan class=\"o\"\u003e=\u003c/span\u003eclient --from-file\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003efoo\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e/dev/stdin -o yaml \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e|\u003c/span\u003e kubeseal -o yaml -n thenamespace \u0026gt; mysealedsecret.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e -n baz \u003cspan class=\"p\"\u003e|\u003c/span\u003e kubectl create secret generic mysecret --dry-run\u003cspan class=\"o\"\u003e=\u003c/span\u003eclient --from-file\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003ebar\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e/dev/stdin -o yaml \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e|\u003c/span\u003e kubeseal -o yaml -n thenamespace --merge-into mysealedsecret.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eResults\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebitnami.com/v1alpha1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSealedSecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecreationTimestamp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ethenamespace\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eencryptedData\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebar\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eAgBLkamltcLfH1dC1JxQ3qd8lJ8aBZF2ARoq3uo055hnzXOy8g2T5liTx5UPvyPV8yyWqABU8eOnwjNhDtzSATvYeBB3fGkucdOZziWEoiNsWTR9ZtFEkod7Ya6uGkzZOJwi3IkrHFVIT9oWZQUxxJZ6vFhPiFcx9Dorr8TNSzG4KOug25+PhWPPiHDgSup5N3CkWCZaYOF7dbZRVSA4nGP1fZxjFByHP4AsdjLCHptyVbkpLRKeiXTkLxfLX4K+JLZGM41S1On5bSP56mCfv1daTJx619kDXkRLw9l21Ot283/L0NMNAiw781AefYMVoO3aHmYgcT6wAtsQAKje9fyL7DQRHt8a5NZOWukp/P6XjdXRz/nfQasQlbSTrRkDpplKIM5/WdPcBoKi+yyoOL0rZ8x1X7YzUI3BggZmzWyEPD01BK1YAHGZnYIZbbCy1JSm8JCBvP+xWMg+i0Z/DCD8nclAhH1GX2Q7/NrNHF//589AJfuriymd2+mk7uaLA4RRsY0l5QeZD6HVAqSv5jWsVQQtSftWmI9vn9oL/Pno7sEUjSDpXPfF4nnsULhxsPEe2DFAMm1kZAjdF06ueF4/x2Fdy80ZQNyycaDx2CWm4z3b14A75WGyOXl2wJZQqxrFCz8el4hD2nH3zQFEzd6AIh49myqVAGuu2qGlYP4p94LJghVa+mQjztLD/2ZUZjY+anQ=\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003efoo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eAgAducXW6iUCY900cPDdmRfuj7tKnh2hY4C1+2hFoAtjyvjepsKNWsiPJ81t8anaMfFPat4ta060l5VtTrceFE8oS/rViz1tvNWGPBjL+GwL/QjkGl6H8ju87vKERKQn5qw7B/V5j24VM8AxOd+/vJNt/IeRIHLubvFft4hyMq4b0xmIxaemBSTxchQX/5364T3VJH2kHaqpqd+JJgQnTbiTQe/XnyZokDX8GSxw4rAbJUJSRUtY9DB9ZDu2zC5VngX+GJjbwHGbv9EKs8LShJIPrD8xHqrDmlSXGkkP01D4A6268Qoi3x5S0H5aqDgtrgBiWsNkzdKwjfrTNx7pKecOi41lyFdffHOGUew4aPPMqjzWR2TEms9WNNQXwnBdDHKMkFsisocF52BolEkcjF8g/u5h2Af92abMu6k16VybJrB7TV1set5A9W7rqG1iXI4+1W6XQfFnpja8xL/zJBvZcyHgeYMNaxa3C3s6PANhPzAUVaXV9eedAkptGJLN13IZj4LujpoAxRKo6bEdydv/5P23R3fx5PgTOpVI7riECAOIg2PThFsEoVCUwStmKCvIx1I2+YixIlv/OiaUWo4lrI/3ve5WGp4ZnuiJPk34JoYAlRbR6+sX14d8Ek6viq/pJUUIfVpNIkNMboUL4u+KpT47eyQ/mWih/KFduQyX9II/vQ+/IJGzEEHIipxAhdmV+K4=\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ecreationTimestamp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003enamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ethenamespace\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"backing-up-your-sealing-key\"\u003ebacking up your sealing key \u003ca href=\"#backing-up-your-sealing-key\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml \u0026gt;main.key\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"converting-env-files-to-a-secret\"\u003econverting .env files to a secret \u003ca href=\"#converting-env-files-to-a-secret\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWorking with web applications .env is a common way to store credentials.  Let’s\nlook at how we can convert these to secrets.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl create secret generic mysecret --from-env-file\u003cspan class=\"o\"\u003e=\u003c/span\u003e.env -n thenamespace --dry-run\u003cspan class=\"o\"\u003e=\u003c/span\u003eclient -o yaml \u0026gt; mysecret.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow you have a secret that looks like this.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efoo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eYmFy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecreationTimestamp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ethenamespace\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSeal it up just like before.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubeseal -f mysecret.yaml -w mysealedsecret.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"using-the-secrets\"\u003eUsing the secrets \u003ca href=\"#using-the-secrets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI typically use the secrets in the container spec.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003econtainers\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emyapp\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003esecretRef\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# You can still have other env vars\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003efoo\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebar\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSometimes I want to mount the secret as a volume.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003econtainers\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emyapp\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003evolumeMounts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003emountPath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/mysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esecret\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003esecretName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"image-pull-secrets\"\u003eImage Pull Secrets \u003ca href=\"#image-pull-secrets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI also need to use imagePullSecrets.  Let’s walk through the whole process.  Starting with the secret.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl create secret docker-registry regcred --docker-server\u003cspan class=\"o\"\u003e=\u003c/span\u003emyprivateregistry.example.com --docker-username\u003cspan class=\"o\"\u003e=\u003c/span\u003efoo --docker-password\u003cspan class=\"o\"\u003e=\u003c/span\u003ebar --dry-run\u003cspan class=\"o\"\u003e=\u003c/span\u003eclient -o yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eGenerates the following secret.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003e.dockerconfigjson\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eeyJhdXRocyI6eyJteXByaXZhdGVyZWdpc3RyeS5leGFtcGxlLmNvbSI6eyJ1c2VybmFtZSI6ImZvbyIsInBhc3N3b3JkIjoiYmFyIiwiYXV0aCI6IlptOXZPbUpoY2c9PSJ9fX0=\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecreationTimestamp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eregcred\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ekubernetes.io/dockerconfigjson\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003ethe secret\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNow we we can seal that secret.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubeseal -f regcred.yaml -w regcred-sealed.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd that gives us the following sealed secret that we can deploy into our cluster.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebitnami.com/v1alpha1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSealedSecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecreationTimestamp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eregcred\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edefault\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eencryptedData\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003e.dockerconfigjson\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eAgATYVEywkyYEaoErQbJo6xEZfOnRn1ydNTLkO3Jt/NF/UH+0o9lHpDecRpN0XnVu8xJUcdjkgD9q2XkwP8e6qQDS2mMPTiTNIN+8gbJx97WrD1YQDT0lXBuoyi9I/iwlXxx6MgH/6GY6CeGTz5SRlvoU0Xhlt4d11s7/xapdE8QMLsAReqPEv8oZHEyAxDRrjXX0V+tO8dV+G+GXjUDMBBceLael9rvGzSKIwDVXACVqQhLkB6FoP98M+yyBE46RBNnSnS0ShQM5PprL24HKpRZ43x4RM53KBrQ7R/MxeshafY+B6vUvrolmVox4sud8xngMOcjTO28LLOrck5V8ZiDabhN7ajHEf03IESr1o/ADGf5k9988Vv1txJtsZW0K2mpRu0D7/BLVL9KzbZ5ywULqIoD/Ur2GIGnZqMAKOq4laGp/GJtMKLrhmEvekT397wC/Gf/xdDKVhHf2p4ocsPu7LKFuS5H/Auel/Q5grdn8L5wwrO4VWRv3eJroKh/Hux7Qd7f64O7qdi0XthDocf+gmtjys+Gy72M7tyf8f/O+3oKbS4CWQVTj4ZThMc9znrFnHqt2q/7pAyytTQCpk51wlzOsNvOhCueJM/jmeahaL0LuBrqngqISpnd65sgVzBcZpwK9i2Fckyt0DrZLH+NoIuvaqNhzlF+OMbAft/ylWWKCH4WUP+FKG+1LXM7ud7AA3MMbGSBxHL0/WK/INa7MB56xZKMqqyvvLLQHFTQUROJjkgkzsumdOgwZTRgIFnAZ4+vOX3/1Rtt3mAs3vdoJhL4GuKUYCnEHt908eKkWEVEs7eMk5SdSRtIsbaXO2s0dtADwg==\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ecreationTimestamp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eregcred\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003enamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edefault\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ekubernetes.io/dockerconfigjson\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow that we have our sealed registry secret, we can deploy it into our cluster.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl apply -f regcred-sealed.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow we can use it to pull images from our private registry.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003econtainers\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimagePullSecrets\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eregcred\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"full-example\"\u003eFull example \u003ca href=\"#full-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere is a full deployment example using all the secrets we have created.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eregcred\u003c/li\u003e\n\u003cli\u003emounting a secret\u003c/li\u003e\n\u003cli\u003eenvFrom secret\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eapps/v1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeployment\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecreationTimestamp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003elabels\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eservice\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emyservice\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emyservice\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emynamespace\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ereplicas\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eselector\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ematchLabels\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eservice\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emyservice\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estrategy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eRecreate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ecreationTimestamp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003elabels\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eservice\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emyservice\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003econtainers\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"nt\"\u003eenvFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003esecretRef\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003efoo\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebar\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eprivate-registry.io/myimage:1.0.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emyimage\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003econtainerPort\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e5000\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003eprotocol\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eTCP\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eresources\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e{}\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003evolumeMounts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003emountPath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/mysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003erestartPolicy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eAlways\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003esecret\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nt\"\u003esecretName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emysecret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eimagePullSecrets\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eregcred\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"downside\"\u003eDownside \u003ca href=\"#downside\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow the main downside I see with kubeseal is that it does not provide a way to\nstore your secrets in a way that you can access outside of your cluster.  So\nyou need to make sure that you have another solution in place to store your\nsecrets so that you still have them if you ever were to take the cluster down\nor move from k8s to something else.\u003c/p\u003e\n\u003cp\u003eOverall the likelyhood of you loosing a production cluster is pretty low, so\nmaybe it’s ok to just trust it depending on what the secrets are.  Especially\nfor things you control and can rotate anyways its fine.\u003c/p\u003e\n",
      "content_text": "\n\nIn my homelab kubernetes cluster I am using kubeseal to encrypt secrets.  I\nhave been using it successfully for a few months now wtih great success. It\nallows me to commit all of my secrets manifests to git with out risk of leaking\nsecrets.\n\nYou see kubeseal encrypts your secrets with a private key only stored in your\ncluster, so only the cluster itself can decrypt them using the kubeseal\ncontroller.\n\n![kubeseal-post.png](https://dropper.waylonwalker.com/api/file/833e8681-8220-4096-b211-80c33eb10c1c.png)\n\n## KubeSeal\n\n[https://sealed-secrets.netlify.app/](https://sealed-secrets.netlify.app/){.hoverlink}\n\n\u003ca href='https://sealed-secrets.netlify.app/' \u003e\n\u003cimg\n    src='https://shots.waylonwalker.com/shot/?url=https://sealed-secrets.netlify.app/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors='\n    alt='screenshot of https://sealed-secrets.netlify.app/'\n    height='450'\n    width='800'\n/\u003e\n\u003c/a\u003e\n\n## installation\n\nInstallation happens in two steps.  You need the kubernetes controller and the\nclient side cli to create a sealed secret.\n\nFor a more complete instruction see the\n[docs#installation](\u003chttps://github.com/bitnami-labs/sealed-secrets?tab=readme-ov-file#installation\u003e]\n\n## installation - controller\n\n!!! warning\n     **context**\n     Make sure that you are in the right context before running any kubectl commands.\n\n``` bash\nkubectl config current-context\n```\n\nsealed-secrets is installed using the helm package manager.  To install\nsealed-secrets run the following command.\n\n``` bash\nhelm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets\nhelm install sealed-secrets -n kube-system --set-string fullnameOverride=sealed-secrets-controller sealed-secrets/sealed-secrets\n```\n\n## installation - client\n\nFor the client you can check your OS package manager, brew, or the\n[github-releases](https://github.com/bitnami-labs/sealed-secrets/releases/).\nFor me I found it in the main arch repos.\n\n``` bash\nparu -S kubeseal\n# or\nsudo pacman -S kubeseal\n# or\nbrew install kubeseal\n```\n\n!!! note\n     You will need to install kubeseal on every device that you will want to\n     create sealed secrets on.\n\n## Example\n\nMost of these commands come straight from the docs.  From my experience I have\nalways specified the namespace, my projects go per namespace and I don't have\nany reason that other namepsaces should see the secret, and if they do I deploy\nanother secret in that namespace.\n\n``` bash\n# Create a json/yaml-encoded Secret somehow:\n# (note use of `--dry-run` - this is just a local file!)\necho -n bar | kubectl create secret generic mysecret --dry-run=client --from-file=foo=/dev/stdin -o yaml -n thenamespace \u003e mysecret.yaml\n```\n\n\u003e note that the key of the secret is `foo` and the value is `bar`\n\nresults\n\n``` yaml\napiVersion: v1\ndata:\n  foo: YmFy\nkind: Secret\nmetadata:\n  creationTimestamp: null\n  name: mysecret\n  namespace: thenamespace\n```\n\n!!! note\n     The data is base64 encoded.\n\n     ``` bash\n     echo -n bar | base64\n     # YmFy\n     ```\n\n``` bash\n# This is the important bit:\nkubeseal -f mysecret.yaml -w mysealedsecret.yaml\n\n# At this point mysealedsecret.json is safe to upload to Github,\n# post on Twitter, etc.\n\n# Eventually:\nkubectl create -f mysealedsecret.yaml -n thenamespace\n# sealedsecret.bitnami.com/mysecret created\n\n# Profit!\nkubectl get secret mysecret\nkubectl get secret mysecret -n thenamespace\n# NAME       TYPE     DATA   AGE\n# mysecret   Opaque   1      27s\n\ncat mysealedsecret.yaml | kubeseal --validate\n\n```\n\n``` bash\necho -n bar | kubectl create secret generic mysecret --dry-run=client --from-file=foo=/dev/stdin -o yaml \\\n  | kubeseal -o yaml -n thenamespace \u003e mysealedsecret.yaml\necho -n baz | kubectl create secret generic mysecret --dry-run=client --from-file=bar=/dev/stdin -o yaml \\\n  | kubeseal -o yaml -n thenamespace --merge-into mysealedsecret.yaml\n```\n\nResults\n\n``` yaml\n---\napiVersion: bitnami.com/v1alpha1\nkind: SealedSecret\nmetadata:\n  creationTimestamp: null\n  name: mysecret\n  namespace: thenamespace\nspec:\n  encryptedData:\n    bar: AgBLkamltcLfH1dC1JxQ3qd8lJ8aBZF2ARoq3uo055hnzXOy8g2T5liTx5UPvyPV8yyWqABU8eOnwjNhDtzSATvYeBB3fGkucdOZziWEoiNsWTR9ZtFEkod7Ya6uGkzZOJwi3IkrHFVIT9oWZQUxxJZ6vFhPiFcx9Dorr8TNSzG4KOug25+PhWPPiHDgSup5N3CkWCZaYOF7dbZRVSA4nGP1fZxjFByHP4AsdjLCHptyVbkpLRKeiXTkLxfLX4K+JLZGM41S1On5bSP56mCfv1daTJx619kDXkRLw9l21Ot283/L0NMNAiw781AefYMVoO3aHmYgcT6wAtsQAKje9fyL7DQRHt8a5NZOWukp/P6XjdXRz/nfQasQlbSTrRkDpplKIM5/WdPcBoKi+yyoOL0rZ8x1X7YzUI3BggZmzWyEPD01BK1YAHGZnYIZbbCy1JSm8JCBvP+xWMg+i0Z/DCD8nclAhH1GX2Q7/NrNHF//589AJfuriymd2+mk7uaLA4RRsY0l5QeZD6HVAqSv5jWsVQQtSftWmI9vn9oL/Pno7sEUjSDpXPfF4nnsULhxsPEe2DFAMm1kZAjdF06ueF4/x2Fdy80ZQNyycaDx2CWm4z3b14A75WGyOXl2wJZQqxrFCz8el4hD2nH3zQFEzd6AIh49myqVAGuu2qGlYP4p94LJghVa+mQjztLD/2ZUZjY+anQ=\n    foo: AgAducXW6iUCY900cPDdmRfuj7tKnh2hY4C1+2hFoAtjyvjepsKNWsiPJ81t8anaMfFPat4ta060l5VtTrceFE8oS/rViz1tvNWGPBjL+GwL/QjkGl6H8ju87vKERKQn5qw7B/V5j24VM8AxOd+/vJNt/IeRIHLubvFft4hyMq4b0xmIxaemBSTxchQX/5364T3VJH2kHaqpqd+JJgQnTbiTQe/XnyZokDX8GSxw4rAbJUJSRUtY9DB9ZDu2zC5VngX+GJjbwHGbv9EKs8LShJIPrD8xHqrDmlSXGkkP01D4A6268Qoi3x5S0H5aqDgtrgBiWsNkzdKwjfrTNx7pKecOi41lyFdffHOGUew4aPPMqjzWR2TEms9WNNQXwnBdDHKMkFsisocF52BolEkcjF8g/u5h2Af92abMu6k16VybJrB7TV1set5A9W7rqG1iXI4+1W6XQfFnpja8xL/zJBvZcyHgeYMNaxa3C3s6PANhPzAUVaXV9eedAkptGJLN13IZj4LujpoAxRKo6bEdydv/5P23R3fx5PgTOpVI7riECAOIg2PThFsEoVCUwStmKCvIx1I2+YixIlv/OiaUWo4lrI/3ve5WGp4ZnuiJPk34JoYAlRbR6+sX14d8Ek6viq/pJUUIfVpNIkNMboUL4u+KpT47eyQ/mWih/KFduQyX9II/vQ+/IJGzEEHIipxAhdmV+K4=\n  template:\n    metadata:\n      creationTimestamp: null\n      name: mysecret\n      namespace: thenamespace\n```\n\n## backing up your sealing key\n\n``` bash\nkubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml \u003emain.key\n```\n\n## converting .env files to a secret\n\nWorking with web applications .env is a common way to store credentials.  Let's\nlook at how we can convert these to secrets.\n\n``` bash\nkubectl create secret generic mysecret --from-env-file=.env -n thenamespace --dry-run=client -o yaml \u003e mysecret.yaml\n```\n\nNow you have a secret that looks like this.\n\n``` yaml\napiVersion: v1\ndata:\n  foo: YmFy\nkind: Secret\nmetadata:\n  creationTimestamp: null\n  name: mysecret\n  namespace: thenamespace\n```\n\nSeal it up just like before.\n\n``` bash\nkubeseal -f mysecret.yaml -w mysealedsecret.yaml\n```\n\n## Using the secrets\n\nI typically use the secrets in the container spec.\n\n``` yaml\ncontainers:\n  - name: myapp\n    envFrom:\n      - secretRef:\n          name: mysecret\n    # You can still have other env vars\n    env:\n      - name: foo\n        value: bar\n```\n\nSometimes I want to mount the secret as a volume.\n\n``` yaml\ncontainers:\n  - name: myapp\n    volumeMounts:\n      - name: mysecret\n        mountPath: /mysecret\nvolumes:\n  - name: mysecret\n    secret:\n      secretName: mysecret\n```\n\n## Image Pull Secrets\n\nI also need to use imagePullSecrets.  Let's walk through the whole process.  Starting with the secret.\n\n``` bash\nkubectl create secret docker-registry regcred --docker-server=myprivateregistry.example.com --docker-username=foo --docker-password=bar --dry-run=client -o yaml\n```\n\nGenerates the following secret.\n\n``` yaml\napiVersion: v1\ndata:\n  .dockerconfigjson: eyJhdXRocyI6eyJteXByaXZhdGVyZWdpc3RyeS5leGFtcGxlLmNvbSI6eyJ1c2VybmFtZSI6ImZvbyIsInBhc3N3b3JkIjoiYmFyIiwiYXV0aCI6IlptOXZPbUpoY2c9PSJ9fX0=\nkind: Secret\nmetadata:\n  creationTimestamp: null\n  name: regcred\ntype: kubernetes.io/dockerconfigjson\n\n---\n```\n\n\u003e the secret\n\nNow we we can seal that secret.\n\n``` bash\nkubeseal -f regcred.yaml -w regcred-sealed.yaml\n```\n\nAnd that gives us the following sealed secret that we can deploy into our cluster.\n\n``` yaml\n---\napiVersion: bitnami.com/v1alpha1\nkind: SealedSecret\nmetadata:\n  creationTimestamp: null\n  name: regcred\n  namespace: default\nspec:\n  encryptedData:\n    .dockerconfigjson: AgATYVEywkyYEaoErQbJo6xEZfOnRn1ydNTLkO3Jt/NF/UH+0o9lHpDecRpN0XnVu8xJUcdjkgD9q2XkwP8e6qQDS2mMPTiTNIN+8gbJx97WrD1YQDT0lXBuoyi9I/iwlXxx6MgH/6GY6CeGTz5SRlvoU0Xhlt4d11s7/xapdE8QMLsAReqPEv8oZHEyAxDRrjXX0V+tO8dV+G+GXjUDMBBceLael9rvGzSKIwDVXACVqQhLkB6FoP98M+yyBE46RBNnSnS0ShQM5PprL24HKpRZ43x4RM53KBrQ7R/MxeshafY+B6vUvrolmVox4sud8xngMOcjTO28LLOrck5V8ZiDabhN7ajHEf03IESr1o/ADGf5k9988Vv1txJtsZW0K2mpRu0D7/BLVL9KzbZ5ywULqIoD/Ur2GIGnZqMAKOq4laGp/GJtMKLrhmEvekT397wC/Gf/xdDKVhHf2p4ocsPu7LKFuS5H/Auel/Q5grdn8L5wwrO4VWRv3eJroKh/Hux7Qd7f64O7qdi0XthDocf+gmtjys+Gy72M7tyf8f/O+3oKbS4CWQVTj4ZThMc9znrFnHqt2q/7pAyytTQCpk51wlzOsNvOhCueJM/jmeahaL0LuBrqngqISpnd65sgVzBcZpwK9i2Fckyt0DrZLH+NoIuvaqNhzlF+OMbAft/ylWWKCH4WUP+FKG+1LXM7ud7AA3MMbGSBxHL0/WK/INa7MB56xZKMqqyvvLLQHFTQUROJjkgkzsumdOgwZTRgIFnAZ4+vOX3/1Rtt3mAs3vdoJhL4GuKUYCnEHt908eKkWEVEs7eMk5SdSRtIsbaXO2s0dtADwg==\n  template:\n    metadata:\n      creationTimestamp: null\n      name: regcred\n      namespace: default\n    type: kubernetes.io/dockerconfigjson\n```\n\nNow that we have our sealed registry secret, we can deploy it into our cluster.\n\n``` bash\nkubectl apply -f regcred-sealed.yaml\n```\n\nNow we can use it to pull images from our private registry.\n\n``` yaml\ncontainers:\n  imagePullSecrets:\n    - name: regcred\n```\n\n## Full example\n\nHere is a full deployment example using all the secrets we have created.\n\n* regcred\n* mounting a secret\n* envFrom secret\n\n``` yaml\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  creationTimestamp: null\n  labels:\n    service: myservice\n  name: myservice\n  namespace: mynamespace\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      service: myservice\n  strategy:\n    type: Recreate\n  template:\n    metadata:\n      creationTimestamp: null\n      labels:\n        service: myservice\n    spec:\n      containers:\n        - envFrom:\n            - secretRef:\n                name: mysecret\n          env:\n            - name: foo\n              value: bar\n          image: private-registry.io/myimage:1.0.0\n          name: myimage\n          ports:\n            - containerPort: 5000\n              protocol: TCP\n          resources: {}\n          volumeMounts:\n            - mountPath: /mysecret\n              name: mysecret\n      restartPolicy: Always\n      volumes:\n        - name: mysecret\n          secret:\n            secretName: mysecret\n      imagePullSecrets:\n        - name: regcred\n```\n\n## Downside\n\nNow the main downside I see with kubeseal is that it does not provide a way to\nstore your secrets in a way that you can access outside of your cluster.  So\nyou need to make sure that you have another solution in place to store your\nsecrets so that you still have them if you ever were to take the cluster down\nor move from k8s to something else.\n\nOverall the likelyhood of you loosing a production cluster is pretty low, so\nmaybe it's ok to just trust it depending on what the secrets are.  Especially\nfor things you control and can rotate anyways its fine.\n",
      "summary": "In my homelab kubernetes cluster I am using kubeseal to encrypt secrets. I have been using it successfully for a few months now wtih great success. It allows...",
      "date_published": "2024-03-27T20:02:57Z",
      "date_modified": "2024-03-27T20:02:57Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "kubernetes"
      ]
    },
    {
      "id": "https://waylonwalker.com/nvim-stupid-gf-bind/",
      "url": "https://waylonwalker.com/nvim-stupid-gf-bind/",
      "title": "nvim stupid gf bind",
      "content_html": "\u003cp\u003eSo after months of fighting with gf not going to template files, I finally\ndecided to put in some effort to make it work.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis was the dumbest keybind in my config, that I copied from someone else\nwithout understanding it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"what-i-am-trying-to-do\"\u003eWhat I am trying to do \u003ca href=\"#what-i-am-trying-to-do\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI have jinja templates in a directory called \u003ccode\u003etemplates\u003c/code\u003e.  I want to bind gf to\nopen a template file, but it is trying to open a new file \u003ccode\u003e./base.html\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if request.state.user %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block title %}Fokais - {{ request.state.user.full_name }} {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block title %}Fokais {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if request.state.user %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;inline-block mx-auto text-5xl font-black leading-loose\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e            text-transparent bg-clip-text bg-gradient-to-r from-red-600\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e            via-pink-500 to-yellow-400 ring-red-500 text-shadow-xl\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e            text-shadow-zinc-950 ring-5\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{ request.state.user.full_name }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% include \u0026#34;me_partial.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"what-did-not-work\"\u003eWhat did not work \u003ca href=\"#what-did-not-work\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI tried all sorts of changes to my path, but it still didn’t work.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evim.api\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003envim_command\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;set path+=templates/**\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"what-i-found\"\u003eWhat I found \u003ca href=\"#what-i-found\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eafter digging into my keymap I found that I had remaped \u003ccode\u003egf\u003c/code\u003e to \u003ccode\u003eedit\u003c/code\u003e years\nago.  This works great if the file is in your current directory, and if it’s not\nit makes the file.  This bind completely breaks vim’s ability to \u003ccode\u003e:find\u003c/code\u003e files\nand was a terrible keybind that I added probably from someone else years ago\nand have literally never used this feature.  If \u003ccode\u003egf\u003c/code\u003e opens an empty file I\nalways close it and assume that vim failed to \u003ccode\u003e:find\u003c/code\u003e the file.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e-- Allow gf to open non-existent files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;gf\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;:edit \u0026lt;cfile\u0026gt;\u0026lt;CR\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"yes-after-that-fix-i-still-needed-to-adjust-my-path\"\u003eYes, after that fix I still needed to adjust my path \u003ca href=\"#yes-after-that-fix-i-still-needed-to-adjust-my-path\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI ended up with the following in my options.lua.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e-- look for jinja templates in the templates directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evim.opt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;templates/**\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nSo after months of fighting with gf not going to template files, I finally\ndecided to put in some effort to make it work.\n\n\u003e This was the dumbest keybind in my config, that I copied from someone else\n\u003e without understanding it.\n\n## What I am trying to do\n\nI have jinja templates in a directory called `templates`.  I want to bind gf to\nopen a template file, but it is trying to open a new file `./base.html`\n\n``` html\n{% extends \"base.html\" %}\n{% if request.state.user %}\n    {% block title %}Fokais - {{ request.state.user.full_name }} {% endblock %}\n{% else %}\n    {% block title %}Fokais {% endblock %}\n{% endif %}\n{% block content %}\n    {% if request.state.user %}\n        \u003ch1 id=\"title\"\n            class=\"inline-block mx-auto text-5xl font-black leading-loose\n            text-transparent bg-clip-text bg-gradient-to-r from-red-600\n            via-pink-500 to-yellow-400 ring-red-500 text-shadow-xl\n            text-shadow-zinc-950 ring-5\"\u003e\n            {{ request.state.user.full_name }}\n        \u003c/h1\u003e\n    {% endif %}\n    {% include \"me_partial.html\" %}\n{% endblock %}\n```\n\n## What did not work\n\nI tried all sorts of changes to my path, but it still didn't work.\n\n``` lua\nvim.api.nvim_command(\"set path+=templates/**\")\n\n```\n\n## What I found\n\nafter digging into my keymap I found that I had remaped `gf` to `edit` years\nago.  This works great if the file is in your current directory, and if it's not\nit makes the file.  This bind completely breaks vim's ability to `:find` files\nand was a terrible keybind that I added probably from someone else years ago\nand have literally never used this feature.  If `gf` opens an empty file I\nalways close it and assume that vim failed to `:find` the file.\n\n``` lua\n-- Allow gf to open non-existent files\nset(\"\", \"gf\", \":edit \u003ccfile\u003e\u003cCR\u003e\")\n```\n\n## Yes, after that fix I still needed to adjust my path\n\nI ended up with the following in my options.lua.\n\n``` lua\n-- look for jinja templates in the templates directory\nvim.opt.path:append(\"templates/**\")\n```\n",
      "summary": "So after months of fighting with gf not going to template files, I finally decided to put in some effort to make it work.",
      "date_published": "2023-12-28T10:04:57Z",
      "date_modified": "2023-12-28T10:04:57Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "vim"
      ]
    },
    {
      "id": "https://waylonwalker.com/cli-auth/",
      "url": "https://waylonwalker.com/cli-auth/",
      "title": "cli auth",
      "content_html": "\u003cp\u003eAuthentication from cli tools can be a bit of a bear, and I have to look it up\nevery time. This is my reference guide for future me to remember how to easily\ndo it.\u003c/p\u003e\n\u003cp\u003eI set up a \u003ca href=\"/fastapi/\" class=\"glossary-term\" title=\"FastAPI is a modern and efficient web framework for Python, built on top of the Starlette web framework, and pydantic for data validation and serialization.\"\u003efastapi\u003c/a\u003e server running on port 8000, it uses a basic auth with\n\u003ccode\u003ewaylonwalker\u003c/code\u003e as the username and \u003ccode\u003easdf\u003c/code\u003e as the password. The server follows\nalong with what comes out of the docs. I have it setup to take basic auth,\nform username and password, or a bearer token for authentication.\u003c/p\u003e\n\u003ch2 id=\"curl\"\u003ecurl \u003ca href=\"#curl\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ca href=\"/og/\" class=\"glossary-term\" title=\"OG is short for open graph, a set of standard meta tags that are used for social media sharing. This is what tells other websites how to describe and display...\"\u003eog\u003c/a\u003e of command line url tools.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# basic auth\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -u \u003cspan class=\"s1\"\u003e\u0026#39;waylonwalker:asdf\u0026#39;\u003c/span\u003e -X POST localhost:8000/token\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# basic auth with password prompt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -u \u003cspan class=\"s1\"\u003e\u0026#39;waylonwalker\u0026#39;\u003c/span\u003e -X POST localhost:8000/token\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# token\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -H \u003cspan class=\"s1\"\u003e\u0026#39;Authorization: bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ3YXlsb253YWxrZXIiLCJleHAiOjE3MDI5NTI2MDJ9.GeYNt7DNal6LTiPoavJnqypaMt4vYeriXdq5lqu1ILg\u0026#39;\u003c/span\u003e -X POST localhost:8000/token\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"wget\"\u003ewget \u003ca href=\"#wget\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMy go to if I want the result to go into a file.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# basic auth\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget -q -O - --auth-no-challenge --http-user\u003cspan class=\"o\"\u003e=\u003c/span\u003ewaylonwalker --http-password\u003cspan class=\"o\"\u003e=\u003c/span\u003easdf --post-data \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e localhost:8000/token\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# token\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget -q -O - --header\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Authorization: bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ3YXlsb253YWxrZXIiLCJleHAiOjE3MDI5NTI2MDJ9.GeYNt7DNal6LTiPoavJnqypaMt4vYeriXdq5lqu1ILg\u0026#34;\u003c/span\u003e -O - --post-data \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e localhost:8000/token\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"httpx\"\u003ehttpx \u003ca href=\"#httpx\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAn http client written in python, primarilty used with the python api, but has a nice cli.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# install\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 -m pip install httpx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# basic auth\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttpx -m POST --auth waylonwalker asdf http://localhost:8000/token\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# basic auth with password prompt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttpx -m POST --auth waylonwalker - http://localhost:8000/token\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# token\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttpx -m POST --headers\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Authorization\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ3YXlsb253YWxrZXIiLCJleHAiOjE3MDI5NTI2MDJ9.GeYNt7DNal6LTiPoavJnqypaMt4vYeriXdq5lqu1ILg\u0026#34;\u003c/span\u003e http://localhost:8000/token\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"httpie\"\u003ehttpie \u003ca href=\"#httpie\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA modern http client written in python.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# install\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 -m pip install httpie\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# basic auth\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttp POST localhost:8000/token -a waylonwalker:asdf\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# basic auth with password prompt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttp POST localhost:8000/token -a waylonwalker\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# token\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttp POST localhost:8000/token -A bearer -a eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ3YXlsb253YWxrZXIiLCJleHAiOjE3MDI5NTI2MDJ9.GeYNt7DNal6LTiPoavJnqypaMt4vYeriXdq5lqu1ILg\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"httpie-with-plugin\"\u003ehttpie with plugin \u003ca href=\"#httpie-with-plugin\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# install\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 -m pip install httpie-credential-store\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# usage\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttp POST localhost:8000/token -A creds\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"httpie-prompt\"\u003ehttpie prompt \u003ca href=\"#httpie-prompt\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003ehttp-prompt\u003c/code\u003e comes from the httpie org, and has an interactive cli interface\ninto apis. You can even specify a spec file to autocomplete on api methods.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttp-prompt localhost:8000 --auth waylonwalker:asdf --spec openapi.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nAuthentication from cli tools can be a bit of a bear, and I have to look it up\nevery time. This is my reference guide for future me to remember how to easily\ndo it.\n\nI set up a fastapi server running on port 8000, it uses a basic auth with\n`waylonwalker` as the username and `asdf` as the password. The server follows\nalong with what comes out of the docs. I have it setup to take basic auth,\nform username and password, or a bearer token for authentication.\n\n## curl\n\nThe og of command line url tools.\n\n```bash\n# basic auth\ncurl -u 'waylonwalker:asdf' -X POST localhost:8000/token\n# basic auth with password prompt\ncurl -u 'waylonwalker' -X POST localhost:8000/token\n# token\ncurl -H 'Authorization: bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ3YXlsb253YWxrZXIiLCJleHAiOjE3MDI5NTI2MDJ9.GeYNt7DNal6LTiPoavJnqypaMt4vYeriXdq5lqu1ILg' -X POST localhost:8000/token\n```\n\n## wget\n\nMy go to if I want the result to go into a file.\n\n```bash\n# basic auth\nwget -q -O - --auth-no-challenge --http-user=waylonwalker --http-password=asdf --post-data '' localhost:8000/token\n\n# token\nwget -q -O - --header=\"Authorization: bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ3YXlsb253YWxrZXIiLCJleHAiOjE3MDI5NTI2MDJ9.GeYNt7DNal6LTiPoavJnqypaMt4vYeriXdq5lqu1ILg\" -O - --post-data '' localhost:8000/token\n```\n\n## httpx\n\nAn http client written in python, primarilty used with the python api, but has a nice cli.\n\n```bash\n# install\npython3 -m pip install httpx\n\n# basic auth\nhttpx -m POST --auth waylonwalker asdf http://localhost:8000/token\n\n# basic auth with password prompt\nhttpx -m POST --auth waylonwalker - http://localhost:8000/token\n\n# token\nhttpx -m POST --headers=\"Authorization\" \"bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ3YXlsb253YWxrZXIiLCJleHAiOjE3MDI5NTI2MDJ9.GeYNt7DNal6LTiPoavJnqypaMt4vYeriXdq5lqu1ILg\" http://localhost:8000/token\n```\n\n## httpie\n\nA modern http client written in python.\n\n```bash\n# install\npython3 -m pip install httpie\n\n# basic auth\nhttp POST localhost:8000/token -a waylonwalker:asdf\n\n# basic auth with password prompt\nhttp POST localhost:8000/token -a waylonwalker\n\n# token\nhttp POST localhost:8000/token -A bearer -a eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ3YXlsb253YWxrZXIiLCJleHAiOjE3MDI5NTI2MDJ9.GeYNt7DNal6LTiPoavJnqypaMt4vYeriXdq5lqu1ILg\n```\n\n## httpie with plugin\n\n```bash\n# install\npython3 -m pip install httpie-credential-store\n# usage\nhttp POST localhost:8000/token -A creds\n```\n\n## httpie prompt\n\n`http-prompt` comes from the httpie org, and has an interactive cli interface\ninto apis. You can even specify a spec file to autocomplete on api methods.\n\n```bash\nhttp-prompt localhost:8000 --auth waylonwalker:asdf --spec openapi.json\n```\n",
      "summary": "Authentication from cli tools can be a bit of a bear, and I have to look it up every time. This is my reference guide for future me to remember how to easily...",
      "date_published": "2023-12-17T20:09:03Z",
      "date_modified": "2023-12-17T20:09:03Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "bash",
        "cli"
      ]
    },
    {
      "id": "https://waylonwalker.com/htmx-request-hide-input/",
      "url": "https://waylonwalker.com/htmx-request-hide-input/",
      "title": "Hiding Form input During htmx Request",
      "content_html": "\u003cp\u003eI am working on fokais.com’s signup page, and I want to hide the form input during\nan \u003ca href=\"/htmx/\" class=\"glossary-term\" title=\"htmx is a frontend javascript library for creating dynamic web applications.\"\u003ehtmx\u003c/a\u003e request. I was seeing some issues where I was able to prevent spamming\nthe submit button, but was still able to get one extra hit on it.\u003c/p\u003e\n\u003cp\u003eIt also felt like nothing was happening while sending the email to the user for\nverification. Now I get the form to disappear and a spinner to show during the\nrequest.\u003c/p\u003e\n\u003ch2 id=\"\u003ca href=\"/html/\" class=\"glossary-term\" title=\"HTML (HyperText Markup Language) is the standard markup language used to create and design documents on the World Wide Web. It structures web content by...\"\u003ehtml\u003c/a\u003e\"\u003eHTML \u003ca href=\"#html\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eLet’s start off with the form. It uses htmx to submit a post request to the\n\u003ccode\u003epost_request\u003c/code\u003e route. Note that there is a spinner in the \u003ccode\u003epost_request\u003c/code\u003e with the\n\u003ccode\u003ehtmx-indicator\u003c/code\u003e class.\u003c/p\u003e\n\u003cp\u003eThe intent is to hide the spinner until the request is running, and hide all of\nthe form input during the request.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eform\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;signup-form\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"na\"\u003ehx-swap-oob\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;outerHTML\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;m-4 mx-auto mb-6 flex w-80 flex-col rounded-lg b p-4 shadow-xlc shadow-cyan-500/10\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"na\"\u003emethod\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;POST\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"na\"\u003eaction\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ url_for(\u0026#39;post_signup\u0026#39;) }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"na\"\u003ehx-post\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ url_for(\u0026#39;post_signup\u0026#39;) }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003einput\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mx-8 mt-6 mb-4 border border-black bg-zinc-900 p-1 text-center focus:bg-zinc-800\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u0026lt;!\u003c/span\u003e\u003cspan class=\"na\"\u003e--markata-attribution--\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    type=\u0026#34;text\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    value=\u0026#34;{{ full_name }}\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    name=\u0026#34;full_name\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    placeholder=\u0026#34;Full Name\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if full_name_error %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elabel\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;-mt-6 mb-6 mx-8 text-red-500 p-1 text-center\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{ full_name_error }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003elabel\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003einput\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mx-8 mb-4 border border-black bg-zinc-900 p-1 text-center focus:bg-zinc-800\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u0026lt;!\u003c/span\u003e\u003cspan class=\"na\"\u003e--markata-attribution--\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    type=\u0026#34;text\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    value=\u0026#34;{{ username }}\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    name=\u0026#34;username\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    placeholder=\u0026#34;username\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if username_error %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elabel\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;-mt-6 mb-6 mx-8 text-red-500 p-1 text-center\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{ username_error }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003elabel\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003einput\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mx-8 mb-4 border border-black bg-zinc-900 p-1 text-center focus:bg-zinc-800\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u0026lt;!\u003c/span\u003e\u003cspan class=\"na\"\u003e--markata-attribution--\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    type=\u0026#34;email\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    name=\u0026#34;email\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    value=\u0026#34;{{ email }}\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    placeholder=\u0026#34;email\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if email_error %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elabel\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;-mt-6 mb-6 mx-8 text-red-500 p-1 text-center\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{ email_error }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003elabel\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003einput\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mx-auto w-32 mb-4 border border-black bg-purple-900 p-1 text-center focus:bg-zinc-800\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u0026lt;!\u003c/span\u003e\u003cspan class=\"na\"\u003e--markata-attribution--\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    type=\u0026#34;submit\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    value=\u0026#34;sign up\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003erole\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;status\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mx-auto htmx-indicator\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esvg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u0026lt;!\u003c/span\u003e\u003cspan class=\"na\"\u003e--markata-attribution--\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      class=\u0026#34;mx-auto animate-spin h-5 w-5 text-white\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      xmlns=\u0026#34;https://www.w3.org/2000/svg\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      fill=\u0026#34;none\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      viewBox=\u0026#34;0 0 24 24\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ecircle\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u0026lt;!\u003c/span\u003e\u003cspan class=\"na\"\u003e--markata-attribution--\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        class=\u0026#34;opacity-25\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        cx=\u0026#34;12\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        cy=\u0026#34;12\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        r=\u0026#34;10\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        stroke=\u0026#34;currentColor\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        stroke-width=\u0026#34;4\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026gt;\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ecircle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u0026lt;!\u003c/span\u003e\u003cspan class=\"na\"\u003e--markata-attribution--\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        class=\u0026#34;opacity-75\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        fill=\u0026#34;currentColor\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        d=\u0026#34;M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026gt;\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esvg\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSigning up...\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eform\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYes this is styled using tailwindcss.\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"hoverlink\" href=\"https://waylonwalker.com/still-loving-tailwind/\"\u003ehttps://waylonwalker.com/still-loving-tailwind/\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"css\"\u003eCSS \u003ca href=\"#css\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eLet’s take a look at how we achieve switching between only spinner an only form\ninputs using css.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehtmx-indicator\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003ehidden\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003etransition\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e \u003cspan class=\"mi\"\u003e500\u003c/span\u003e\u003cspan class=\"kt\"\u003ems\u003c/span\u003e \u003cspan class=\"kc\"\u003eease-in\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehtmx-request\u003c/span\u003e \u003cspan class=\"nt\"\u003ebutton\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehtmx-request\u003c/span\u003e \u003cspan class=\"nt\"\u003einput\u003c/span\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"nt\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;submit\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehtmx-request\u003c/span\u003e \u003cspan class=\"nt\"\u003einput\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehtmx-request\u003c/span\u003e \u003cspan class=\"nt\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003ehidden\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehtmx-request\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehtmx-indicator\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003eblock\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehtmx-request\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehtmx-indicator\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003eblock\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"final-result\"\u003eFinal Result \u003ca href=\"#final-result\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere is the final result of me signing up for a new account in fokais.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/b6576386-d314-402c-b253-6467192d73f0.mp4\" class=\"glightbox-link\" aria-label=\"Final Result\"\u003e\u003cvideo autoplay loop muted playsinline controls preload=\"metadata\" class=\"md-video\" poster=\"https://dropper.waylonwalker.com/file/b6576386-d314-402c-b253-6467192d73f0.webp?h=675\u0026w=1200\"\u003e\u003csource src=\"https://dropper.waylonwalker.com/file/b6576386-d314-402c-b253-6467192d73f0.mp4\" type=\"video/mp4\"\u003eFinal Result\u003c/video\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nI am working on fokais.com's signup page, and I want to hide the form input during\nan htmx request. I was seeing some issues where I was able to prevent spamming\nthe submit button, but was still able to get one extra hit on it.\n\nIt also felt like nothing was happening while sending the email to the user for\nverification. Now I get the form to disappear and a spinner to show during the\nrequest.\n\n## HTML\n\nLet's start off with the form. It uses htmx to submit a post request to the\n`post_request` route. Note that there is a spinner in the `post_request` with the\n`htmx-indicator` class.\n\nThe intent is to hide the spinner until the request is running, and hide all of\nthe form input during the request.\n\n```html\n\u003cform\n  id=\"signup-form\"\n  hx-swap-oob=\"outerHTML\"\n  class=\"m-4 mx-auto mb-6 flex w-80 flex-col rounded-lg b p-4 shadow-xlc shadow-cyan-500/10\"\n  method=\"POST\"\n  action=\"{{ url_for('post_signup') }}\"\n  hx-post=\"{{ url_for('post_signup') }}\"\n\u003e\n  \u003cinput\n    class=\"mx-8 mt-6 mb-4 border border-black bg-zinc-900 p-1 text-center focus:bg-zinc-800\"\n    type=\"text\"\n    value=\"{{ full_name }}\"\n    name=\"full_name\"\n    placeholder=\"Full Name\"\n  /\u003e\n  {% if full_name_error %}\n  \u003clabel class=\"-mt-6 mb-6 mx-8 text-red-500 p-1 text-center\"\u003e\n    {{ full_name_error }}\n  \u003c/label\u003e\n  {% endif %}\n  \u003cinput\n    class=\"mx-8 mb-4 border border-black bg-zinc-900 p-1 text-center focus:bg-zinc-800\"\n    type=\"text\"\n    value=\"{{ username }}\"\n    name=\"username\"\n    placeholder=\"username\"\n  /\u003e\n  {% if username_error %}\n  \u003clabel class=\"-mt-6 mb-6 mx-8 text-red-500 p-1 text-center\"\u003e\n    {{ username_error }}\n  \u003c/label\u003e\n  {% endif %}\n  \u003cinput\n    class=\"mx-8 mb-4 border border-black bg-zinc-900 p-1 text-center focus:bg-zinc-800\"\n    type=\"email\"\n    name=\"email\"\n    value=\"{{ email }}\"\n    placeholder=\"email\"\n  /\u003e\n  {% if email_error %}\n  \u003clabel class=\"-mt-6 mb-6 mx-8 text-red-500 p-1 text-center\"\u003e\n    {{ email_error }}\n  \u003c/label\u003e\n  {% endif %}\n  \u003cinput\n    class=\"mx-auto w-32 mb-4 border border-black bg-purple-900 p-1 text-center focus:bg-zinc-800\"\n    type=\"submit\"\n    value=\"sign up\"\n  /\u003e\n  \u003cdiv role=\"status\" class=\"mx-auto htmx-indicator\"\u003e\n    \u003csvg\n      class=\"mx-auto animate-spin h-5 w-5 text-white\"\n      xmlns=\"https://www.w3.org/2000/svg\"\n      fill=\"none\"\n      viewBox=\"0 0 24 24\"\n    \u003e\n      \u003ccircle\n        class=\"opacity-25\"\n        cx=\"12\"\n        cy=\"12\"\n        r=\"10\"\n        stroke=\"currentColor\"\n        stroke-width=\"4\"\n      \u003e\u003c/circle\u003e\n      \u003cpath\n        class=\"opacity-75\"\n        fill=\"currentColor\"\n        d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n      \u003e\u003c/path\u003e\n    \u003c/svg\u003e\n    \u003cp\u003eSigning up...\u003c/p\u003e\n  \u003c/div\u003e\n\u003c/form\u003e\n```\n\nYes this is styled using tailwindcss.\n\n[https://waylonwalker.com/still-loving-tailwind/](https://waylonwalker.com/still-loving-tailwind/){.hoverlink}\n\n## CSS\n\nLet's take a look at how we achieve switching between only spinner an only form\ninputs using css.\n\n```css\n.htmx-indicator {\n  @apply hidden;\n  opacity: 0;\n  transition: opacity 500ms ease-in;\n}\n.htmx-request button,\n.htmx-request input[type=\"submit\"],\n.htmx-request input,\n.htmx-request label {\n  @apply hidden;\n}\n.htmx-request .htmx-indicator {\n  opacity: 1;\n  @apply block;\n}\n.htmx-request.htmx-indicator {\n  opacity: 1;\n  @apply block;\n}\n```\n\n## Final Result\n\nHere is the final result of me signing up for a new account in fokais.\n\n![Final Result](https://dropper.waylonwalker.com/file/b6576386-d314-402c-b253-6467192d73f0.mp4)\n",
      "summary": "I am working on fokais.com's signup page, and I want to hide the form input during an htmx request. I was seeing some issues where I was able to prevent...",
      "date_published": "2023-12-14T07:56:27Z",
      "date_modified": "2023-12-14T07:56:27Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/stripe-cancellations/",
      "url": "https://waylonwalker.com/stripe-cancellations/",
      "title": "Stripe Cancellations in FastAPI and SQLModel",
      "content_html": "\u003cp\u003eToday I am working on fokais.com, trying to get to a point where I can launch\nby workig through stripe integrations. This is my first time using stripe, so\nthere has been quite a bit to learn, and I am probably building in more than I\nneed to before launching, but I am learning, and not in a rush to launch.\u003c/p\u003e\n\u003cp\u003eI am building the fokais backent in python primarilyt with \u003ca href=\"/fastapi/\" class=\"glossary-term\" title=\"FastAPI is a modern and efficient web framework for Python, built on top of the Starlette web framework, and pydantic for data validation and serialization.\"\u003efastapi\u003c/a\u003e and sqlmodel\non sqlite. My billing integration is going to be all Stripe.\u003c/p\u003e\n\u003ch2 id=\"stripe-subscription-cancellations-docs\"\u003eStripe Subscription Cancellations Docs \u003ca href=\"#stripe-subscription-cancellations-docs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere is a link to the stripe docs for your refrence, especially if you want to\nsee how to cancel subscriptions in other languages. They include code samples\nfor many popular languages.\u003c/p\u003e\n\u003ca href=\"https://stripe.com/docs/billing/subscriptions/cancel#canceling\" title=\"Cancel subscriptions | Stripe Documentation\"\u003e\n    \u003cimg class=\"object-fit aspect-[800/450] w-full rounded-lg border border-black bg-neutral-900 shadow-lg shadow-neutral-900 glightbox\" src=\"https://shots.waylonwalker.com/shot/?url=https%3A%2F%2Fstripe.com%2Fdocs%2Fbilling%2Fsubscriptions%2Fcancel%23canceling\u0026amp;height=450\u0026amp;width=800\u0026amp;scaled_width=800\u0026amp;scaled_height=450\u0026amp;selectors=\" alt=\"Cancel subscriptions | Stripe Documentation\" title=\"Cancel subscriptions | Stripe Documentation\"/ data-glightbox=\"description: Cancel subscriptions | Stripe Documentation\"\u003e\n\u003c/a\u003e\n\u003ch2 id=\"user-model\"\u003eUser Model \u003ca href=\"#user-model\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis is the part of the user model that includes the cancel and reactivate\nmethods. It pretty much follows the stripe guide.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eUserBase\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSQLModel\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etable\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# type: ignore[call-arg]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eField\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eunique\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efull_name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eemail\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eemail_verified\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ebool\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edisabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ebool\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esignup_date\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eOptional\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eField\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edefault_factory\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eutcnow\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003estripe_customer_id\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eOptional\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ecancel_subscription\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003esubscription\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003estripe\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emodify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003esubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ecancel_at_period_end\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erefresh\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ereactivate_subscription\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003esubscription\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003estripe\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emodify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003esubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ecancel_at_period_end\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erefresh\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"cancellations-api\"\u003eCancellations api \u003ca href=\"#cancellations-api\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere is the cancellations api. I created an are you sure form that I can link\nto from the accounts page with a normal anchor tag. Note that I am doing a\n\u003ccode\u003ePOST\u003c/code\u003e request to do the cancellation from a form. I want this to work for any\nuser whether there is js or not. This is an operation that will change the\nusers data, and I want to make sure that it avoids all browser and cdn caching.\nAs a scrappy startup we are running light on infrastructure and are caching\nhard at the CDN to avoid excessive server hits.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e I am doing a `POST` request to do the cancellation from a form.\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/div\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@pricing_router.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/cancel\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@pricing_router.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/cancel/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_cancel\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecurrent_user\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotated\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eDepends\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eget_current_user_if_logged_in\u003c/span\u003e\u003cspan class=\"p\"\u003e)],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etemplates\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTemplateResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;cancel.html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;request\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;prices\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprices\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;products\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;current_user\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ecurrent_user\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@pricing_router.post\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/cancel\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@pricing_router.post\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/cancel/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003epost_cancel\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecurrent_user\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotated\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eDepends\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eget_current_user_if_logged_in\u003c/span\u003e\u003cspan class=\"p\"\u003e)],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecurrent_user\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecancel_subscription\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eHTMLResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;p id=\u0026#34;cancel\u0026#34; hx-swap-oob=\u0026#34;outerHTML\u0026#34;\u0026gt;Your Subscription has been Cancelled\u0026lt;/p\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"reactivations\"\u003eReactivations \u003ca href=\"#reactivations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eReactivating accounts looks just about the same as cancelling, only flippng \u003ccode\u003eTrue\u003c/code\u003e to \u003ccode\u003eFalse\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@pricing_router.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/reactivate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@pricing_router.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/reactivate/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_reactivate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecurrent_user\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotated\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eDepends\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eget_current_user_if_logged_in\u003c/span\u003e\u003cspan class=\"p\"\u003e)],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etemplates\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTemplateResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;reactivate.html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;request\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;prices\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprices\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;products\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;current_user\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ecurrent_user\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@pricing_router.post\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/reactivate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@pricing_router.post\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/reactivate/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003epost_reactivate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecurrent_user\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotated\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eDepends\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eget_current_user_if_logged_in\u003c/span\u003e\u003cspan class=\"p\"\u003e)],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecurrent_user\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereactivate_subscription\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eHTMLResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;p id=\u0026#34;reactivate\u0026#34; hx-swap-oob=\u0026#34;outerHTML\u0026#34;\u0026gt;Your Subscription has been reactivated\u0026lt;/p\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"full-user-model\"\u003eFull User Model \u003ca href=\"#full-user-model\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis is the full user model, completely subject to change in the future, but it\nincludes the cancel and reactivate methods.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eUserBase\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSQLModel\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etable\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# type: ignore[call-arg]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eField\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eunique\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efull_name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eemail\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eemail_verified\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ebool\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edisabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ebool\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esignup_date\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eOptional\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eField\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edefault_factory\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eutcnow\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003estripe_customer_id\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eOptional\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@property\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003esession\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003enext\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eget_session\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@classmethod\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_by_id\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003ecls\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003enext\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eget_session\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003ecls\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003erefresh\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ecache\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;active_subscriptions_\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e3600\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ecache\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;active_products_\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e3600\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_checkout_sessions\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003estripe\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003echeckout\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSession\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eretrieve\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estripe_checkout_session_id\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esession\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexec\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eselect\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCheckoutSession\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewhere\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCheckoutSession\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003euser_id\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estripe_checkout_session_id\u003c/span\u003e \u003cspan class=\"ow\"\u003eis\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_active_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003esubscriptions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esubscription\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003estripe\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003echeckout\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSession\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eretrieve\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estripe_checkout_session_id\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esession\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexec\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eselect\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCheckoutSession\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewhere\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCheckoutSession\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003euser_id\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estripe_checkout_session_id\u003c/span\u003e \u003cspan class=\"ow\"\u003eis\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estatus\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;complete\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003estripe\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eretrieve\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esubscription\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003esubscription\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003esubscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ehas_active_subscription\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@property\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eactive_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecache\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;active_subscriptions_\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e \u003cspan class=\"ow\"\u003eis\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget_active_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ecache\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;active_subscriptions_\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e3600\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@property\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eactive_plans\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003esubscriptions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eplans\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003esubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eplan\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003esubscription\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003esubscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eplans\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@property\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003esubscription_to_plan\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003esubscriptions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eplans\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003esubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003esubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eplan\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003esubscription\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003esubscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eplans\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@property\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eplan_to_subscription\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eplans\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ek\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ek\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esubscription_to_plan\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eitems\u003c/span\u003e\u003cspan class=\"p\"\u003e()}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eplans\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_active_products\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eplans\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eactive_plans\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003estripe\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eProduct\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eretrieve\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eplan\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eproduct\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003eplan\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eplans\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@property\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eplan_to_product\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eplans\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eactive_plans\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eplan\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003estripe\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eProduct\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eretrieve\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eplan\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eproduct\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003eplan\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eplans\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@property\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eprodct_to_plan\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eplans\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eactive_plans\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003estripe\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eProduct\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eretrieve\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eplan\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eproduct\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eplan\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003eplan\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eplans\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@property\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eactive_products\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecache\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;active_products_\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e \u003cspan class=\"ow\"\u003eis\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget_active_products\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ecache\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;active_products_\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e3600\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@property\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ebest_active_subscription\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003esubscriptions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003esubscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@property\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ebest_active_product\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eactive_products\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esort\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003elambda\u003c/span\u003e \u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emetadata\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;level\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@property\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ebest_active_subscription\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003esubscription_id\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eplan_to_subscription\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprodct_to_plan\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebest_active_product\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003estripe\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eretrieve\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esubscription_id\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@property\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproduct\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebest_active_product\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eproduct\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emetadata\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003esubscription_status\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003esubscriptions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ecancel_subscription\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003esubscription\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003estripe\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emodify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003esubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ecancel_at_period_end\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erefresh\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ereactivate_subscription\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003esubscription\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eactive_subscriptions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003estripe\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emodify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003esubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ecancel_at_period_end\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erefresh\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nToday I am working on fokais.com, trying to get to a point where I can launch\nby workig through stripe integrations. This is my first time using stripe, so\nthere has been quite a bit to learn, and I am probably building in more than I\nneed to before launching, but I am learning, and not in a rush to launch.\n\nI am building the fokais backent in python primarilyt with fastapi and sqlmodel\non sqlite. My billing integration is going to be all Stripe.\n\n## Stripe Subscription Cancellations Docs\n\nHere is a link to the stripe docs for your refrence, especially if you want to\nsee how to cancel subscriptions in other languages. They include code samples\nfor many popular languages.\n\n\u003ca href=\"https://stripe.com/docs/billing/subscriptions/cancel#canceling\" title=\"Cancel subscriptions | Stripe Documentation\"\u003e\n    \u003cimg class=\"object-fit aspect-[800/450] w-full rounded-lg border border-black bg-neutral-900 shadow-lg shadow-neutral-900\" src=\"https://shots.waylonwalker.com/shot/?url=https%3A%2F%2Fstripe.com%2Fdocs%2Fbilling%2Fsubscriptions%2Fcancel%23canceling\u0026amp;height=450\u0026amp;width=800\u0026amp;scaled_width=800\u0026amp;scaled_height=450\u0026amp;selectors=\" alt=\"Cancel subscriptions | Stripe Documentation\" title=\"Cancel subscriptions | Stripe Documentation\"\u003e\n\u003c/a\u003e\n\n## User Model\n\nThis is the part of the user model that includes the cancel and reactivate\nmethods. It pretty much follows the stripe guide.\n\n```python\nclass UserBase(SQLModel, table=False):  # type: ignore[call-arg]\n    username: str = Field(unique=True)\n    full_name: str\n    email: str\n    email_verified: bool = False\n    disabled: bool = False\n    signup_date: Optional[datetime] = Field(default_factory=datetime.utcnow)\n    stripe_customer_id: Optional[str]\n\n    def cancel_subscription(self):\n        for subscription in self.active_subscriptions:\n            stripe.Subscription.modify(\n                subscription.id,\n                cancel_at_period_end=True,\n            )\n        self.refresh()\n\n    def reactivate_subscription(self):\n        for subscription in self.active_subscriptions:\n            stripe.Subscription.modify(\n                subscription.id,\n                cancel_at_period_end=False,\n            )\n        self.refresh()\n```\n\n## Cancellations api\n\nHere is the cancellations api. I created an are you sure form that I can link\nto from the accounts page with a normal anchor tag. Note that I am doing a\n`POST` request to do the cancellation from a form. I want this to work for any\nuser whether there is js or not. This is an operation that will change the\nusers data, and I want to make sure that it avoids all browser and cdn caching.\nAs a scrappy startup we are running light on infrastructure and are caching\nhard at the CDN to avoid excessive server hits.\n\n!!! Note\n     I am doing a `POST` request to do the cancellation from a form.\n\n```python\n@pricing_router.get(\"/cancel\")\n@pricing_router.get(\"/cancel/\")\ndef get_cancel(\n    request: Request,\n    current_user: Annotated[User, Depends(get_current_user_if_logged_in)],\n):\n    return config.templates.TemplateResponse(\n        \"cancel.html\",\n        {\n            \"request\": request,\n            \"prices\": products.prices,\n            \"products\": products.products,\n            \"current_user\": current_user,\n        },\n    )\n\n\n@pricing_router.post(\"/cancel\")\n@pricing_router.post(\"/cancel/\")\ndef post_cancel(\n    request: Request,\n    current_user: Annotated[User, Depends(get_current_user_if_logged_in)],\n):\n    current_user.cancel_subscription()\n    return HTMLResponse('\u003cp id=\"cancel\" hx-swap-oob=\"outerHTML\"\u003eYour Subscription has been Cancelled\u003c/p\u003e')\n\n```\n\n## Reactivations\n\nReactivating accounts looks just about the same as cancelling, only flippng `True` to `False`.\n\n```python\n\n@pricing_router.get(\"/reactivate\")\n@pricing_router.get(\"/reactivate/\")\ndef get_reactivate(\n    request: Request,\n    current_user: Annotated[User, Depends(get_current_user_if_logged_in)],\n):\n    return config.templates.TemplateResponse(\n        \"reactivate.html\",\n        {\n            \"request\": request,\n            \"prices\": products.prices,\n            \"products\": products.products,\n            \"current_user\": current_user,\n        },\n    )\n\n\n@pricing_router.post(\"/reactivate\")\n@pricing_router.post(\"/reactivate/\")\ndef post_reactivate(\n    request: Request,\n    current_user: Annotated[User, Depends(get_current_user_if_logged_in)],\n):\n    current_user.reactivate_subscription()\n    return HTMLResponse('\u003cp id=\"reactivate\" hx-swap-oob=\"outerHTML\"\u003eYour Subscription has been reactivated\u003c/p\u003e')\n\n```\n\n## Full User Model\n\nThis is the full user model, completely subject to change in the future, but it\nincludes the cancel and reactivate methods.\n\n```python\nclass UserBase(SQLModel, table=False):  # type: ignore[call-arg]\n    username: str = Field(unique=True)\n    full_name: str\n    email: str\n    email_verified: bool = False\n    disabled: bool = False\n    signup_date: Optional[datetime] = Field(default_factory=datetime.utcnow)\n    stripe_customer_id: Optional[str]\n\n    @property\n    def session(self):\n        return next(get_session())\n\n    @classmethod\n    def get_by_id(cls, id):\n        return next(get_session()).get(cls, id)\n\n    def refresh(self):\n        cache.set(f\"active_subscriptions_{self.id}\", None, 3600)\n        cache.set(f\"active_products_{self.id}\", None, 3600)\n\n    def get_checkout_sessions(self):\n        return [\n            stripe.checkout.Session.retrieve(s.stripe_checkout_session_id)\n            for s in self.session.exec(select(CheckoutSession).where(CheckoutSession.user_id == self.id)).all()\n            if s.stripe_checkout_session_id is not None\n        ]\n\n    def get_active_subscriptions(self):\n        subscriptions = [\n            s.subscription\n            for s in [\n                stripe.checkout.Session.retrieve(s.stripe_checkout_session_id)\n                for s in self.session.exec(select(CheckoutSession).where(CheckoutSession.user_id == self.id)).all()\n                if s.stripe_checkout_session_id is not None\n            ]\n            if s.status == \"complete\"\n        ]\n        active_subscriptions = [stripe.Subscription.retrieve(subscription) for subscription in subscriptions]\n        return active_subscriptions\n\n    def has_active_subscription(self):\n        return len(self.active_subscriptions) \u003e 0\n\n    @property\n    def active_subscriptions(self):\n        active_subscriptions = cache.get(f\"active_subscriptions_{self.id}\")\n        if active_subscriptions is not None:\n            return active_subscriptions\n        active_subscriptions = self.get_active_subscriptions()\n        cache.set(f\"active_subscriptions_{self.id}\", active_subscriptions, 3600)\n\n        return active_subscriptions\n\n    @property\n    def active_plans(self):\n        subscriptions = self.active_subscriptions\n        plans = [subscription.plan for subscription in subscriptions]\n        return plans\n\n    @property\n    def subscription_to_plan(self):\n        subscriptions = self.active_subscriptions\n        plans = {subscription.id: subscription.plan.id for subscription in subscriptions}\n        return plans\n\n    @property\n    def plan_to_subscription(self):\n        plans = {v: k for k, v in self.subscription_to_plan.items()}\n\n        return plans\n\n    def get_active_products(self):\n        plans = self.active_plans\n        products = [stripe.Product.retrieve(plan.product) for plan in plans]\n        return products\n\n    @property\n    def plan_to_product(self):\n        plans = self.active_plans\n        products = {plan.id: stripe.Product.retrieve(plan.product).id for plan in plans}\n        return products\n\n    @property\n    def prodct_to_plan(self):\n        plans = self.active_plans\n        products = {stripe.Product.retrieve(plan.product).id: plan.id for plan in plans}\n        return products\n\n    @property\n    def active_products(self):\n        products = cache.get(f\"active_products_{self.id}\")\n        if products is not None:\n            return products\n        products = self.get_active_products()\n        cache.set(f\"active_products_{self.id}\", products, 3600)\n\n        return products\n\n    @property\n    def best_active_subscription(self):\n        subscriptions = self.active_subscriptions\n        return subscriptions[0]\n\n    @property\n    def best_active_product(self):\n        products = self.active_products\n        products.sort(key=lambda p: p.metadata.get('level', 0))\n        return products[0]\n\n    @property\n    def best_active_subscription(self):\n        subscription_id = self.plan_to_subscription[self.prodct_to_plan[self.best_active_product.id]]\n        return stripe.Subscription.retrieve(subscription_id)\n\n    @property\n    def config(self):\n        product = self.best_active_product\n        return product.metadata\n\n    def subscription_status(self):\n        subscriptions = self.active_subscriptions()\n\n    def cancel_subscription(self):\n        for subscription in self.active_subscriptions:\n            stripe.Subscription.modify(\n                subscription.id,\n                cancel_at_period_end=True,\n            )\n        self.refresh()\n\n    def reactivate_subscription(self):\n        for subscription in self.active_subscriptions:\n            stripe.Subscription.modify(\n                subscription.id,\n                cancel_at_period_end=False,\n            )\n        self.refresh()\n```\n",
      "summary": "Today I am working on fokais.com, trying to get to a point where I can launch by workig through stripe integrations. This is my first time using stripe, so...",
      "date_published": "2023-12-09T22:29:15Z",
      "date_modified": "2023-12-09T22:29:15Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/still-loving-tailwind/",
      "url": "https://waylonwalker.com/still-loving-tailwind/",
      "title": "Still Loving Tailwind",
      "content_html": "\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/b3fb31d3-a359-40f8-968c-2c9c42f6714a.webp\" class=\"glightbox-link\" aria-label=\"Open image\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/file/b3fb31d3-a359-40f8-968c-2c9c42f6714a.webp\" alt=\"\"/ data-glightbox=\"description: \"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eI’ve been using tailwind for a few months now and I can still say I’m loving\nit. I’ve been using it to create some rapid prototypes that may or may not\never become something, a document that is likely to go to print (a resume), and some quick\ndashboards.\u003c/p\u003e\n\u003ch2 id=\"i-started-using-tailwind-a-few-month-back\"\u003eI started using Tailwind a few month back \u003ca href=\"#i-started-using-tailwind-a-few-month-back\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA few months back in september of 2023 I made \u003ca href=\"https://waylonwalker.com/a-case-for-tailwindcss/\"\u003ea case for\ntailwindcss\u003c/a\u003e. And have been\nusing it on quite a few projects since.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003evalues are well thought out\u003c/li\u003e\n\u003cli\u003eit’s really easy to use\u003c/li\u003e\n\u003cli\u003eclasses that make sense\u003c/li\u003e\n\u003cli\u003etree shakable\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"fokaiscom\"\u003efokais.com \u003ca href=\"#fokaiscom\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI started working on fokais.com only a few weeks ago, It’s going to be a SAS to\nmake blogging easier. I’ve started hosting some tools for this blog that I\nreally like that I think I can turn into a service. It’s been fantastic to\nquickly pump out new pages with tailwind.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://fokais.com\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/file/dca75157-3770-49c0-bbd2-ddcb2138ad1f.bin\" alt=\"screenshot of https://fokais.com\"/ data-glightbox=\"description: screenshot of https://fokais.com\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"\u003ca href=\"/htmx/\" class=\"glossary-term\" title=\"htmx is a frontend javascript library for creating dynamic web applications.\"\u003ehtmx\u003c/a\u003e\"\u003eHTMX \u003ca href=\"#htmx\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003etailwind and htmx are a match made in heaven. They both really lean on\nLocation of Behavior over Separation of concerns. They do really well at\nmaking small components that you can throw on and endpoint and stack into any\npage. With tailwind I just configure it to look at all my templates, and I can\nguarantee that the styles will be in app.css, and all I need to do is add\nclasses to my component.\u003c/p\u003e\n\u003cp\u003eHeres a sample component for a user widget that will go on every page. It has\neverything it needs right in the template.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"na\"\u003ehx-swap-oob\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;outerHTML\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;user-header\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;absolute top-0 right-0 mt-8 mr-4\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if current_user %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u0026lt;!\u003c/span\u003e\u003cspan class=\"na\"\u003e--markata-attribution--\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    id=\u0026#34;user-header-details\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    open\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    class=\u0026#34;group list-none px-4 py-2 self-center justify-self-center bg-neutral-600/10 shadow-lg shadow-zinc-950/20 ring-2 ring-zinc-950/5 rounded-xl flex justify-center align-center flex-col\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esummary\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;list-style-type: none\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ current_user.username }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esummary\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hidden group-hover:block my-4\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mt-6 px-4 py-2 rounded bg-purple-950/5 ring-2 ring-cyan-500/30 text-cyan-500 font-bold\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u0026lt;!\u003c/span\u003e\u003cspan class=\"na\"\u003e--markata-attribution--\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        href=\u0026#34;{{ url_for(\u0026#39;get_logout\u0026#39;) }}\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        Logout\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ url_for(\u0026#39;post_login\u0026#39;) }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mt-5 text-xl text-white font-bold text-shadow-xl text-shadow-zinc-950\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    login\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"internal-apps\"\u003einternal apps \u003ca href=\"#internal-apps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI’ve built several interal apps, and tailwind has been really great for this.\nIts super quick to pop classes on components and get things to look decent\nquickly, or put some real polish into making them look nice.\u003c/p\u003e\n\u003ch2 id=\"my-website-waylonwalkercom\"\u003eMy Website waylonwalker.com \u003ca href=\"#my-website-waylonwalkercom\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI’ve dropped my old decrepid css for some tailwind on my main site. My css was\nmuch smaller, but did not work quite as well on all devices, and most\nimportantly was becoming a house of cards. Every time I fixed one thing several\nother things would fail. Colors were a bit muddy, and not as nicely configured\nas tailwind.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMost importantly was becoming a house of cards. Every time I fixed one thing\nseveral other things would fail.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eOne rough side of styling a blog in tailwind is that you don’t necessarily have\ncontrol over granular details of how your pages get rendered without getting\nreally deep into the markdown renderer, or writing your posts in \u003ca href=\"/html/\" class=\"glossary-term\" title=\"HTML (HyperText Markup Language) is the standard markup language used to create and design documents on the World Wide Web. It structures web content by...\"\u003ehtml\u003c/a\u003e. It ends\nup looking a bit ugly, and is against the tailwind best practices, but it seems\nlike the best way for a site like this.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003etailwind\u003c/span\u003e \u003cspan class=\"nt\"\u003ebase\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003etailwind\u003c/span\u003e \u003cspan class=\"nt\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003etailwind\u003c/span\u003e \u003cspan class=\"nt\"\u003eutilities\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003eimport\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;./highlight.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003esocial\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003efont-bold\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003eflex\u003c/span\u003e \u003cspan class=\"err\"\u003eflex-row\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003egap-4\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003ejustify-center\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003epy-8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e#\u003c/span\u003e\u003cspan class=\"nn\"\u003eposts\u003c/span\u003e \u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003ebackdrop-blur-sm\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003eflex\u003c/span\u003e \u003cspan class=\"err\"\u003eflex-col\u003c/span\u003e \u003cspan class=\"n\"\u003esm\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"k\"\u003egrid\u003c/span\u003e \u003cspan class=\"k\"\u003egrid\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"k\"\u003eflow\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"kc\"\u003erow\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edense\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003egap-4\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003egrid-template-columns\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003erepeat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003eauto\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efit\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nf\"\u003eminmax\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e300\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"n\"\u003efr\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"err\"\u003e@apply\u003c/span\u003e \u003cspan class=\"err\"\u003ep-4\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"grid\"\u003egrid \u003ca href=\"#grid\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI’ve struggled to use grid on my projects, and I’ve tried a few different times\nwith no real success or adoption, but started using it on my resume, to have a\nmain middle column, with two outer full bleed columns where I can make some\nelements full bleed to the edge. tailwind made this easy, once done, I had an\nadmonition that was beautiful full bleed with a touch of color.\u003c/p\u003e\n",
      "content_text": "\n![](https://dropper.waylonwalker.com/file/b3fb31d3-a359-40f8-968c-2c9c42f6714a.webp)\n\nI've been using tailwind for a few months now and I can still say I'm loving\nit. I've been using it to create some rapid prototypes that may or may not\never become something, a document that is likely to go to print (a resume), and some quick\ndashboards.\n\n## I started using Tailwind a few month back\n\nA few months back in september of 2023 I made [a case for\ntailwindcss](https://waylonwalker.com/a-case-for-tailwindcss/). And have been\nusing it on quite a few projects since.\n\n- values are well thought out\n- it's really easy to use\n- classes that make sense\n- tree shakable\n\n## fokais.com\n\nI started working on fokais.com only a few weeks ago, It's going to be a SAS to\nmake blogging easier. I've started hosting some tools for this blog that I\nreally like that I think I can turn into a service. It's been fantastic to\nquickly pump out new pages with tailwind.\n\n[![screenshot of https://fokais.com](https://dropper.waylonwalker.com/file/dca75157-3770-49c0-bbd2-ddcb2138ad1f.bin)](https://fokais.com)\n\n## HTMX\n\ntailwind and htmx are a match made in heaven. They both really lean on\nLocation of Behavior over Separation of concerns. They do really well at\nmaking small components that you can throw on and endpoint and stack into any\npage. With tailwind I just configure it to look at all my templates, and I can\nguarantee that the styles will be in app.css, and all I need to do is add\nclasses to my component.\n\nHeres a sample component for a user widget that will go on every page. It has\neverything it needs right in the template.\n\n```html\n\u003cdiv\n  hx-swap-oob=\"outerHTML\"\n  id=\"user-header\"\n  class=\"absolute top-0 right-0 mt-8 mr-4\"\n\u003e\n  {% if current_user %}\n  \u003cdetails\n    id=\"user-header-details\"\n    open\n    class=\"group list-none px-4 py-2 self-center justify-self-center bg-neutral-600/10 shadow-lg shadow-zinc-950/20 ring-2 ring-zinc-950/5 rounded-xl flex justify-center align-center flex-col\"\n  \u003e\n    \u003csummary style=\"list-style-type: none\"\u003e{{ current_user.username }}\u003c/summary\u003e\n    \u003cdiv class=\"hidden group-hover:block my-4\"\u003e\n      \u003ca\n        class=\"mt-6 px-4 py-2 rounded bg-purple-950/5 ring-2 ring-cyan-500/30 text-cyan-500 font-bold\"\n        href=\"{{ url_for('get_logout') }}\"\n      \u003e\n        Logout\n      \u003c/a\u003e\n    \u003c/div\u003e\n  \u003c/details\u003e\n\n  {% else %}\n  \u003ca\n    href=\"{{ url_for('post_login') }}\"\n    class=\"mt-5 text-xl text-white font-bold text-shadow-xl text-shadow-zinc-950\"\n  \u003e\n    login\n  \u003c/a\u003e\n  {% endif %}\n\u003c/div\u003e\n```\n\n## internal apps\n\nI've built several interal apps, and tailwind has been really great for this.\nIts super quick to pop classes on components and get things to look decent\nquickly, or put some real polish into making them look nice.\n\n## My Website waylonwalker.com\n\nI've dropped my old decrepid css for some tailwind on my main site. My css was\nmuch smaller, but did not work quite as well on all devices, and most\nimportantly was becoming a house of cards. Every time I fixed one thing several\nother things would fail. Colors were a bit muddy, and not as nicely configured\nas tailwind.\n\n\u003e Most importantly was becoming a house of cards. Every time I fixed one thing\n\u003e several other things would fail.\n\nOne rough side of styling a blog in tailwind is that you don't necessarily have\ncontrol over granular details of how your pages get rendered without getting\nreally deep into the markdown renderer, or writing your posts in html. It ends\nup looking a bit ugly, and is against the tailwind best practices, but it seems\nlike the best way for a site like this.\n\n```css\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n@import \"./highlight.css\";\n\n.social {\n  @apply font-bold;\n  @apply flex flex-row;\n  @apply gap-4;\n  @apply justify-center;\n  @apply py-8;\n}\n\n#posts ul ul {\n  @apply backdrop-blur-sm;\n  @apply flex flex-col sm:grid grid-flow-row-dense;\n  @apply gap-4;\n  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n  @apply p-4;\n}\n```\n\n## grid\n\nI've struggled to use grid on my projects, and I've tried a few different times\nwith no real success or adoption, but started using it on my resume, to have a\nmain middle column, with two outer full bleed columns where I can make some\nelements full bleed to the edge. tailwind made this easy, once done, I had an\nadmonition that was beautiful full bleed with a touch of color.\n",
      "summary": "I've been using tailwind for a few months now and I can still say I'm loving it. I've been using it to create some rapid prototypes that may or may not ever...",
      "date_published": "2023-11-30T11:54:52Z",
      "date_modified": "2023-11-30T11:54:52Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/jpillora-installer-til/",
      "url": "https://waylonwalker.com/jpillora-installer-til/",
      "title": "jpillora-installer",
      "content_html": "\u003cp\u003ejpillora/installer is the install script generator I have been looking for. It\ndownloads binaries for your machine from GitHub releases and unzips them for\nyou. It grabs the latest release, so you can easily update them. I have\ntried scripting these installs in the past and struggled to consistently get\nthe latest version for every package and unpack it correctly.\u003c/p\u003e\n\u003cp\u003eAlso these pre-compiled binaries install rediculously fast compared to building\nthem from source.\u003c/p\u003e\n\u003cp\u003eCheck out some example links.\u003c/p\u003e\n\u003cp\u003eopening in a browser will show metadata\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"hoverlink  has-avatar has-avatar-before\" href=\"https://i.jpillora.com/serve\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/i.jpillora.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/i.jpillora.com.ico\"\u003ehttps://i.jpillora.com/serve\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIf you pass in script=true it will instead return the install script as it\nwould by default through curl.\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"hoverlink  has-avatar has-avatar-before\" href=\"https://i.jpillora.com/serve?script=true\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/i.jpillora.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/i.jpillora.com.ico\"\u003ehttps://i.jpillora.com/serve?script=true\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"use-it-to-install-neovim\"\u003eUse it to install neovim \u003ca href=\"#use-it-to-install-neovim\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAll you need to do to generate an install script is to pass in the GitHub repo\nslug with the org.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://i.jpillora.com/neovim/neovim \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe shell script that it generates for neovim looks like this.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$DEBUG\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eset\u003c/span\u003e -x\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eTMP_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003emktemp -d -t jpillora-installer-XXXXXXXXXX\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efunction\u003c/span\u003e cleanup \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    rm -rf \u003cspan class=\"nv\"\u003e$TMP_DIR\u003c/span\u003e \u0026gt; /dev/null\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efunction\u003c/span\u003e fail \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    cleanup\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003emsg\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003e$1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;============\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Error: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$msg\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e 1\u0026gt;\u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efunction\u003c/span\u003e install \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eUSER\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;neovim\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003ePROG\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;neovim\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eASPROG\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eMOVE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;false\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eRELEASE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;stable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eINSECURE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;false\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eOUT_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003epwd\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eGH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://github.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#bash check\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e[\u003c/span\u003e ! \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$BASH_VERSION\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;Please use bash instead\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e[\u003c/span\u003e ! -d \u003cspan class=\"nv\"\u003e$OUT_DIR\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;output directory missing: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$OUT_DIR\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#dependency check, assume we are a standard POISX machine\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    which find \u0026gt; /dev/null \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;find not installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    which xargs \u0026gt; /dev/null \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;xargs not installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    which sort \u0026gt; /dev/null \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;sort not installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    which tail \u0026gt; /dev/null \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;tail not installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    which cut \u0026gt; /dev/null \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;cut not installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    which du \u0026gt; /dev/null \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;du not installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#choose an HTTP client\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eGET\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e which curl \u0026gt; /dev/null\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eGET\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;curl\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$INSECURE\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e \u003cspan class=\"nv\"\u003eGET\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GET\u003c/span\u003e\u003cspan class=\"s2\"\u003e --insecure\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eGET\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GET\u003c/span\u003e\u003cspan class=\"s2\"\u003e --fail -# -L\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelif\u003c/span\u003e which wget \u0026gt; /dev/null\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eGET\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;wget\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$INSECURE\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e \u003cspan class=\"nv\"\u003eGET\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GET\u003c/span\u003e\u003cspan class=\"s2\"\u003e --no-check-certificate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eGET\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GET\u003c/span\u003e\u003cspan class=\"s2\"\u003e -qO-\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        fail \u003cspan class=\"s2\"\u003e\u0026#34;neither wget/curl are installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#debug HTTP\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$DEBUG\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eGET\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GET\u003c/span\u003e\u003cspan class=\"s2\"\u003e -v\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#optional auth to install from private repos\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#NOTE: this also needs to be set on your instance of installer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eAUTH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eGITHUB_TOKEN\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e ! -z \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$AUTH\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eGET\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GET\u003c/span\u003e\u003cspan class=\"s2\"\u003e -H \u0026#39;Authorization: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$AUTH\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#find OS #TODO BSDs and other posixs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"sb\"\u003e`\u003c/span\u003euname -s\u003cspan class=\"sb\"\u003e`\u003c/span\u003e in\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Darwin\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"nv\"\u003eOS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;darwin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Linux\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"nv\"\u003eOS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;linux\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\u003cspan class=\"o\"\u003e)\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;unknown os: \u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003euname -s\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#find ARCH\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e uname -m \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep -E \u003cspan class=\"s1\"\u003e\u0026#39;(arm|arch)64\u0026#39;\u003c/span\u003e \u0026gt; /dev/null\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eARCH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;arm64\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# no m1 assets. if on mac arm64, rosetta allows fallback to amd64\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$OS\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;darwin\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nv\"\u003eARCH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;amd64\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelif\u003c/span\u003e uname -m \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep \u003cspan class=\"m\"\u003e64\u003c/span\u003e \u0026gt; /dev/null\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eARCH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;amd64\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelif\u003c/span\u003e uname -m \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep arm \u0026gt; /dev/null\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eARCH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;arm\u0026#34;\u003c/span\u003e \u003cspan class=\"c1\"\u003e#TODO armv6/v7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelif\u003c/span\u003e uname -m \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep \u003cspan class=\"m\"\u003e386\u003c/span\u003e \u0026gt; /dev/null\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eARCH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;386\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        fail \u003cspan class=\"s2\"\u003e\u0026#34;unknown arch: \u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003euname -m\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#choose from asset list\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eURL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eFTYPE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eOS\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e_\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eARCH\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e in\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;linux_amd64\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eURL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/neovim/neovim/releases/download/stable/nvim-linux64.tar.gz\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eFTYPE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;.tar.gz\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;darwin_amd64\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eURL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/neovim/neovim/releases/download/stable/nvim-macos.tar.gz\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eFTYPE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;.tar.gz\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\u003cspan class=\"o\"\u003e)\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;No asset for platform \u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eOS\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eARCH\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#got URL! download it...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e -n \u003cspan class=\"s2\"\u003e\u0026#34;Downloading\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e -n \u003cspan class=\"s2\"\u003e\u0026#34; \u003c/span\u003e\u003cspan class=\"nv\"\u003e$USER\u003c/span\u003e\u003cspan class=\"s2\"\u003e/\u003c/span\u003e\u003cspan class=\"nv\"\u003e$PROG\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e ! -z \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$RELEASE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e -n \u003cspan class=\"s2\"\u003e\u0026#34; \u003c/span\u003e\u003cspan class=\"nv\"\u003e$RELEASE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e ! -z \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$ASPROG\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e -n \u003cspan class=\"s2\"\u003e\u0026#34; as \u003c/span\u003e\u003cspan class=\"nv\"\u003e$ASPROG\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e -n \u003cspan class=\"s2\"\u003e\u0026#34; (\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eOS\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eARCH\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.....\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#enter tempdir\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    mkdir -p \u003cspan class=\"nv\"\u003e$TMP_DIR\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003ecd\u003c/span\u003e \u003cspan class=\"nv\"\u003e$TMP_DIR\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$FTYPE\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.gz\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        which gzip \u0026gt; /dev/null \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;gzip is not installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        bash -c \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GET\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u003c/span\u003e\u003cspan class=\"nv\"\u003e$URL\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e gzip -d - \u0026gt; \u003cspan class=\"nv\"\u003e$PROG\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;download failed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$FTYPE\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.tar.bz\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$FTYPE\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.tar.bz2\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        which tar \u0026gt; /dev/null \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;tar is not installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        which bzip2 \u0026gt; /dev/null \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;bzip2 is not installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        bash -c \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GET\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u003c/span\u003e\u003cspan class=\"nv\"\u003e$URL\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e tar jxf - \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;download failed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$FTYPE\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.tar.gz\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$FTYPE\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.tgz\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        which tar \u0026gt; /dev/null \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;tar is not installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        which gzip \u0026gt; /dev/null \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;gzip is not installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        bash -c \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GET\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u003c/span\u003e\u003cspan class=\"nv\"\u003e$URL\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e tar zxf - \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;download failed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$FTYPE\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.zip\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        which unzip \u0026gt; /dev/null \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;unzip is not installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        bash -c \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GET\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u003c/span\u003e\u003cspan class=\"nv\"\u003e$URL\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u0026gt; tmp.zip \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;download failed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        unzip -o -qq tmp.zip \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;unzip failed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        rm tmp.zip \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;cleanup failed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$FTYPE\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.bin\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        bash -c \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GET\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u003c/span\u003e\u003cspan class=\"nv\"\u003e$URL\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u0026gt; \u003cspan class=\"s2\"\u003e\u0026#34;neovim_\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eOS\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e_\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eARCH\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;download failed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        fail \u003cspan class=\"s2\"\u003e\u0026#34;unknown file type: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$FTYPE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#search subtree largest file (bin)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eTMP_BIN\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003efind . -type f \u003cspan class=\"p\"\u003e|\u003c/span\u003e xargs du \u003cspan class=\"p\"\u003e|\u003c/span\u003e sort -n \u003cspan class=\"p\"\u003e|\u003c/span\u003e tail -n \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e cut -f 2\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e ! -f \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$TMP_BIN\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        fail \u003cspan class=\"s2\"\u003e\u0026#34;could not find find binary (largest file)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#ensure its larger than 1MB\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#TODO linux=elf/darwin=macho file detection?\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"k\"\u003e$(\u003c/span\u003edu -m \u003cspan class=\"nv\"\u003e$TMP_BIN\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e cut -f1\u003cspan class=\"k\"\u003e)\u003c/span\u003e -lt \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        fail \u003cspan class=\"s2\"\u003e\u0026#34;no binary found (\u003c/span\u003e\u003cspan class=\"nv\"\u003e$TMP_BIN\u003c/span\u003e\u003cspan class=\"s2\"\u003e is not larger than 1MB)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#move into PATH or cwd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    chmod +x \u003cspan class=\"nv\"\u003e$TMP_BIN\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;chmod +x failed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eDEST\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$OUT_DIR\u003c/span\u003e\u003cspan class=\"s2\"\u003e/\u003c/span\u003e\u003cspan class=\"nv\"\u003e$PROG\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e ! -z \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$ASPROG\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eDEST\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$OUT_DIR\u003c/span\u003e\u003cspan class=\"s2\"\u003e/\u003c/span\u003e\u003cspan class=\"nv\"\u003e$ASPROG\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#move without sudo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eOUT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003emv \u003cspan class=\"nv\"\u003e$TMP_BIN\u003c/span\u003e \u003cspan class=\"nv\"\u003e$DEST\u003c/span\u003e 2\u0026gt;\u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e1\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eSTATUS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003e$?\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# failed and string contains \u0026#34;Permission denied\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$STATUS\u003c/span\u003e -ne \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$OUT\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e~ \u003cspan class=\"s2\"\u003e\u0026#34;Permission denied\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mv with sudo...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            sudo mv \u003cspan class=\"nv\"\u003e$TMP_BIN\u003c/span\u003e \u003cspan class=\"nv\"\u003e$DEST\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e fail \u003cspan class=\"s2\"\u003e\u0026#34;sudo mv failed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            fail \u003cspan class=\"s2\"\u003e\u0026#34;mv failed (\u003c/span\u003e\u003cspan class=\"nv\"\u003e$OUT\u003c/span\u003e\u003cspan class=\"s2\"\u003e)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Downloaded to \u003c/span\u003e\u003cspan class=\"nv\"\u003e$DEST\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#done\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    cleanup\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einstall\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"\u003ca href=\"/self-host/\" class=\"glossary-term\" title=\"Self hosting is the act of hosting your own applications and services without using a SAS provider. This is typically done with your own hardware, but there...\"\u003eself-host\u003c/a\u003e-your-own\"\u003eSelf Host Your Own \u003ca href=\"#self-host-your-own\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI’d reccomend self hosting your own. This way you know that it’s consistent\nand unlikely to change in a way that breaks your use.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ecurl -s https://i.jpillora.com/installer | bash\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"repos-i-am-using-installer-for\"\u003eRepos I am using installer for \u003ca href=\"#repos-i-am-using-installer-for\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere are the repos I am using installer for.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eatuinsh/atuin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebenbjohnson/litestream\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebootandy/dust\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBurntSushi/ripgrep\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echmln/sd\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecjbassi/ytop\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edalance/procs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edbrgn/tealdeer\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003educaale/xh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego-task/task\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eimsnif/bandwhich\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eimsnif/diskonaut\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekovidgoyal/kitty\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emgdm/htmlq\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eneovim/neovim\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eogham/dog\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eogham/exa\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epemistahl/grex\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esharkdp/bat\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esharkdp/fd\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esharkdp/pastel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esirwart/ripsecrets\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003estarship/starship\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etopgrade-rs/topgrade\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ezellij-org/zellij\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\njpillora/installer is the install script generator I have been looking for. It\ndownloads binaries for your machine from GitHub releases and unzips them for\nyou. It grabs the latest release, so you can easily update them. I have\ntried scripting these installs in the past and struggled to consistently get\nthe latest version for every package and unpack it correctly.\n\nAlso these pre-compiled binaries install rediculously fast compared to building\nthem from source.\n\nCheck out some example links.\n\nopening in a browser will show metadata\n\n[https://i.jpillora.com/serve](https://i.jpillora.com/serve){.hoverlink}\n\nIf you pass in script=true it will instead return the install script as it\nwould by default through curl.\n\n[https://i.jpillora.com/serve?script=true](https://i.jpillora.com/serve?script=true){.hoverlink}\n\n## Use it to install neovim\n\nAll you need to do to generate an install script is to pass in the GitHub repo\nslug with the org.\n\n```bash\ncurl https://i.jpillora.com/neovim/neovim | bash\n```\n\nThe shell script that it generates for neovim looks like this.\n\n```bash\n#!/bin/bash\nif [ \"$DEBUG\" == \"1\" ]; then\n    set -x\nfi\nTMP_DIR=$(mktemp -d -t jpillora-installer-XXXXXXXXXX)\nfunction cleanup {\n    rm -rf $TMP_DIR \u003e /dev/null\n}\nfunction fail {\n    cleanup\n    msg=$1\n    echo \"============\"\n    echo \"Error: $msg\" 1\u003e\u00262\n    exit 1\n}\nfunction install {\n    #settings\n    USER=\"neovim\"\n    PROG=\"neovim\"\n    ASPROG=\"\"\n    MOVE=\"false\"\n    RELEASE=\"stable\"\n    INSECURE=\"false\"\n    OUT_DIR=\"$(pwd)\"\n    GH=\"https://github.com\"\n    #bash check\n    [ ! \"$BASH_VERSION\" ] \u0026\u0026 fail \"Please use bash instead\"\n    [ ! -d $OUT_DIR ] \u0026\u0026 fail \"output directory missing: $OUT_DIR\"\n    #dependency check, assume we are a standard POISX machine\n    which find \u003e /dev/null || fail \"find not installed\"\n    which xargs \u003e /dev/null || fail \"xargs not installed\"\n    which sort \u003e /dev/null || fail \"sort not installed\"\n    which tail \u003e /dev/null || fail \"tail not installed\"\n    which cut \u003e /dev/null || fail \"cut not installed\"\n    which du \u003e /dev/null || fail \"du not installed\"\n    #choose an HTTP client\n    GET=\"\"\n    if which curl \u003e /dev/null; then\n        GET=\"curl\"\n        if [[ $INSECURE = \"true\" ]]; then GET=\"$GET --insecure\"; fi\n        GET=\"$GET --fail -# -L\"\n    elif which wget \u003e /dev/null; then\n        GET=\"wget\"\n        if [[ $INSECURE = \"true\" ]]; then GET=\"$GET --no-check-certificate\"; fi\n        GET=\"$GET -qO-\"\n    else\n        fail \"neither wget/curl are installed\"\n    fi\n    #debug HTTP\n    if [ \"$DEBUG\" == \"1\" ]; then\n        GET=\"$GET -v\"\n    fi\n    #optional auth to install from private repos\n    #NOTE: this also needs to be set on your instance of installer\n    AUTH=\"${GITHUB_TOKEN}\"\n    if [ ! -z \"$AUTH\" ]; then\n        GET=\"$GET -H 'Authorization: $AUTH'\"\n    fi\n    #find OS #TODO BSDs and other posixs\n    case `uname -s` in\n    Darwin) OS=\"darwin\";;\n    Linux) OS=\"linux\";;\n    *) fail \"unknown os: $(uname -s)\";;\n    esac\n    #find ARCH\n    if uname -m | grep -E '(arm|arch)64' \u003e /dev/null; then\n        ARCH=\"arm64\"\n\n        # no m1 assets. if on mac arm64, rosetta allows fallback to amd64\n        if [[ $OS = \"darwin\" ]]; then\n            ARCH=\"amd64\"\n        fi\n\n    elif uname -m | grep 64 \u003e /dev/null; then\n        ARCH=\"amd64\"\n    elif uname -m | grep arm \u003e /dev/null; then\n        ARCH=\"arm\" #TODO armv6/v7\n    elif uname -m | grep 386 \u003e /dev/null; then\n        ARCH=\"386\"\n    else\n        fail \"unknown arch: $(uname -m)\"\n    fi\n    #choose from asset list\n    URL=\"\"\n    FTYPE=\"\"\n    case \"${OS}_${ARCH}\" in\n    \"linux_amd64\")\n        URL=\"https://github.com/neovim/neovim/releases/download/stable/nvim-linux64.tar.gz\"\n        FTYPE=\".tar.gz\"\n        ;;\n    \"darwin_amd64\")\n        URL=\"https://github.com/neovim/neovim/releases/download/stable/nvim-macos.tar.gz\"\n        FTYPE=\".tar.gz\"\n        ;;\n    *) fail \"No asset for platform ${OS}-${ARCH}\";;\n    esac\n    #got URL! download it...\n    echo -n \"Downloading\"\n    echo -n \" $USER/$PROG\"\n    if [ ! -z \"$RELEASE\" ]; then\n        echo -n \" $RELEASE\"\n    fi\n    if [ ! -z \"$ASPROG\" ]; then\n        echo -n \" as $ASPROG\"\n    fi\n    echo -n \" (${OS}/${ARCH})\"\n\n    echo \".....\"\n\n    #enter tempdir\n    mkdir -p $TMP_DIR\n    cd $TMP_DIR\n    if [[ $FTYPE = \".gz\" ]]; then\n        which gzip \u003e /dev/null || fail \"gzip is not installed\"\n        bash -c \"$GET $URL\" | gzip -d - \u003e $PROG || fail \"download failed\"\n    elif [[ $FTYPE = \".tar.bz\" ]] || [[ $FTYPE = \".tar.bz2\" ]]; then\n        which tar \u003e /dev/null || fail \"tar is not installed\"\n        which bzip2 \u003e /dev/null || fail \"bzip2 is not installed\"\n        bash -c \"$GET $URL\" | tar jxf - || fail \"download failed\"\n    elif [[ $FTYPE = \".tar.gz\" ]] || [[ $FTYPE = \".tgz\" ]]; then\n        which tar \u003e /dev/null || fail \"tar is not installed\"\n        which gzip \u003e /dev/null || fail \"gzip is not installed\"\n        bash -c \"$GET $URL\" | tar zxf - || fail \"download failed\"\n    elif [[ $FTYPE = \".zip\" ]]; then\n        which unzip \u003e /dev/null || fail \"unzip is not installed\"\n        bash -c \"$GET $URL\" \u003e tmp.zip || fail \"download failed\"\n        unzip -o -qq tmp.zip || fail \"unzip failed\"\n        rm tmp.zip || fail \"cleanup failed\"\n    elif [[ $FTYPE = \".bin\" ]]; then\n        bash -c \"$GET $URL\" \u003e \"neovim_${OS}_${ARCH}\" || fail \"download failed\"\n    else\n        fail \"unknown file type: $FTYPE\"\n    fi\n    #search subtree largest file (bin)\n    TMP_BIN=$(find . -type f | xargs du | sort -n | tail -n 1 | cut -f 2)\n    if [ ! -f \"$TMP_BIN\" ]; then\n        fail \"could not find find binary (largest file)\"\n    fi\n    #ensure its larger than 1MB\n    #TODO linux=elf/darwin=macho file detection?\n    if [[ $(du -m $TMP_BIN | cut -f1) -lt 1 ]]; then\n        fail \"no binary found ($TMP_BIN is not larger than 1MB)\"\n    fi\n    #move into PATH or cwd\n    chmod +x $TMP_BIN || fail \"chmod +x failed\"\n    DEST=\"$OUT_DIR/$PROG\"\n    if [ ! -z \"$ASPROG\" ]; then\n        DEST=\"$OUT_DIR/$ASPROG\"\n    fi\n    #move without sudo\n    OUT=$(mv $TMP_BIN $DEST 2\u003e\u00261)\n    STATUS=$?\n    # failed and string contains \"Permission denied\"\n    if [ $STATUS -ne 0 ]; then\n        if [[ $OUT =~ \"Permission denied\" ]]; then\n            echo \"mv with sudo...\"\n            sudo mv $TMP_BIN $DEST || fail \"sudo mv failed\"\n        else\n            fail \"mv failed ($OUT)\"\n        fi\n    fi\n    echo \"Downloaded to $DEST\"\n    #done\n    cleanup\n}\ninstall\n```\n\n## Self Host Your Own\n\nI'd reccomend self hosting your own. This way you know that it's consistent\nand unlikely to change in a way that breaks your use.\n\n```\ncurl -s https://i.jpillora.com/installer | bash\n```\n\n## Repos I am using installer for\n\nHere are the repos I am using installer for.\n\n```bash\natuinsh/atuin\nbenbjohnson/litestream\nbootandy/dust\nBurntSushi/ripgrep\nchmln/sd\ncjbassi/ytop\ndalance/procs\ndbrgn/tealdeer\nducaale/xh\ngo-task/task\nimsnif/bandwhich\nimsnif/diskonaut\nkovidgoyal/kitty\nmgdm/htmlq\nneovim/neovim\nogham/dog\nogham/exa\npemistahl/grex\nsharkdp/bat\nsharkdp/fd\nsharkdp/pastel\nsirwart/ripsecrets\nstarship/starship\ntopgrade-rs/topgrade\nzellij-org/zellij\n```\n",
      "summary": "jpillora/installer is the install script generator I have been looking for. It downloads binaries for your machine from GitHub releases and unzips them for...",
      "date_published": "2023-10-04T19:28:33Z",
      "date_modified": "2023-10-04T19:28:33Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "bash",
        "cli"
      ]
    },
    {
      "id": "https://waylonwalker.com/fastapi-static-content/",
      "url": "https://waylonwalker.com/fastapi-static-content/",
      "title": "how to host static content with fastapi",
      "content_html": "\u003cp\u003eI wanted to host some static files through \u003ca href=\"/fastapi/\" class=\"glossary-term\" title=\"FastAPI is a modern and efficient web framework for Python, built on top of the Starlette web framework, and pydantic for data validation and serialization.\"\u003efastapi\u003c/a\u003e. Typical use cases for this\nmight be some static web content like \u003ca href=\"/html/\" class=\"glossary-term\" title=\"HTML (HyperText Markup Language) is the standard markup language used to create and design documents on the World Wide Web. It structures web content by...\"\u003ehtml\u003c/a\u003e/css/js. It could also be images or\nsome data that doesn’t need dynamically rendered.\u003c/p\u003e\n\u003ch2 id=\"from-the-docs\"\u003eFrom the Docs \u003ca href=\"#from-the-docs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe docs cover how to host static files, and give this solution that is built\ninto fastapi.\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"hoverlink  has-avatar has-avatar-before\" href=\"https://fastapi.tiangolo.com/tutorial/static-files/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/fastapi.tiangolo.com.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/fastapi.tiangolo.com.png\"\u003ehttps://fastapi.tiangolo.com/tutorial/static-files/\u003c/a\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi.staticfiles\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eStaticFiles\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emount\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/static\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eStaticFiles\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edirectory\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;static\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;static\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"authenticated-static-files\"\u003eAuthenticated Static Files \u003ca href=\"#authenticated-static-files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003eThanks to \u003ca href=\"https://github.com/tiangolo/fastapi/issues/858\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003e#858\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/OscartGiles\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003eOscartGiles\u003c/a\u003e posted this solution to add\nauthentication to static files. I tried this out on my\n\u003ca href=\"https://thoughts.waylonwalker.com\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/thoughts.waylonwalker.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/thoughts.waylonwalker.com.ico\" class=\"has-avatar  has-avatar-before\"\u003ethoughts\u003c/a\u003e and it worked flawlessly.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003etyping\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epathlib\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003esecrets\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTPException\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003estatus\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi.staticfiles\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eStaticFiles\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi.security\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTPBasic\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTPBasicCredentials\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ePathLike\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etyping\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eUnion\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;os.PathLike[str]\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esecurity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTPBasic\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003everify_username\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTPBasicCredentials\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecredentials\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003esecurity\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecorrect_username\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esecrets\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecompare_digest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecredentials\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;user\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecorrect_password\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esecrets\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecompare_digest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecredentials\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epassword\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;password\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecorrect_username\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ecorrect_password\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eraise\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTPException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003estatus_code\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003estatus\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eHTTP_401_UNAUTHORIZED\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003edetail\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Incorrect email or password\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;WWW-Authenticate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Basic\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ecredentials\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eAuthStaticFiles\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eStaticFiles\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"fm\"\u003e__init__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003ekwargs\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003esuper\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"fm\"\u003e__init__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003ekwargs\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"fm\"\u003e__call__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003escope\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ereceive\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003esend\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eassert\u003c/span\u003e \u003cspan class=\"n\"\u003escope\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003erequest\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ereceive\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003everify_username\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"nb\"\u003esuper\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"fm\"\u003e__call__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ereceive\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003esend\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emount\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;/static\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eAuthStaticFiles\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edirectory\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"vm\"\u003e__file__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;static\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;static\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you want both then, all you have to do is mount \u003ccode\u003eAuthStaticFiles\u003c/code\u003e to a\ndifferent route. Now you can have private, or paid content behind\n\u003ccode\u003e/restricted\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emount\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/static\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eStaticFiles\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edirectory\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;static\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;static\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emount\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;/restricted\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eAuthStaticFiles\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edirectory\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"vm\"\u003e__file__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;restricted\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;restricted\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI wanted to host some static files through fastapi. Typical use cases for this\nmight be some static web content like html/css/js. It could also be images or\nsome data that doesn't need dynamically rendered.\n\n## From the Docs\n\nThe docs cover how to host static files, and give this solution that is built\ninto fastapi.\n\n[https://fastapi.tiangolo.com/tutorial/static-files/](https://fastapi.tiangolo.com/tutorial/static-files/){.hoverlink}\n\n```python\nfrom fastapi import FastAPI\nfrom fastapi.staticfiles import StaticFiles\n\napp = FastAPI()\n\napp.mount(\"/static\", StaticFiles(directory=\"static\"), name=\"static\")\n```\n\n## Authenticated Static Files\n\n_Thanks to [#858](https://github.com/tiangolo/fastapi/issues/858)._\n\n[OscartGiles](https://github.com/OscartGiles) posted this solution to add\nauthentication to static files. I tried this out on my\n[thoughts](https://thoughts.waylonwalker.com) and it worked flawlessly.\n\n```python\nimport typing\nfrom pathlib import Path\nimport secrets\n\nfrom fastapi import FastAPI, Request, HTTPException, status\nfrom fastapi.staticfiles import StaticFiles\nfrom fastapi.security import HTTPBasic, HTTPBasicCredentials\n\n\nPathLike = typing.Union[str, \"os.PathLike[str]\"]\napp = FastAPI()\nsecurity = HTTPBasic()\n\n\nasync def verify_username(request: Request) -\u003e HTTPBasicCredentials:\n\n    credentials = await security(request)\n\n    correct_username = secrets.compare_digest(credentials.username, \"user\")\n    correct_password = secrets.compare_digest(credentials.password, \"password\")\n    if not (correct_username and correct_password):\n        raise HTTPException(\n            status_code=status.HTTP_401_UNAUTHORIZED,\n            detail=\"Incorrect email or password\",\n            headers={\"WWW-Authenticate\": \"Basic\"},\n        )\n    return credentials.username\n\n\nclass AuthStaticFiles(StaticFiles):\n    def __init__(self, *args, **kwargs) -\u003e None:\n\n        super().__init__(*args, **kwargs)\n\n    async def __call__(self, scope, receive, send) -\u003e None:\n\n        assert scope[\"type\"] == \"http\"\n\n        request = Request(scope, receive)\n        await verify_username(request)\n        await super().__call__(scope, receive, send)\n\n\napp.mount(\n    \"/static\",\n    AuthStaticFiles(directory=Path(__file__).parent / \"static\"),\n    name=\"static\",\n)\n```\n\nIf you want both then, all you have to do is mount `AuthStaticFiles` to a\ndifferent route. Now you can have private, or paid content behind\n`/restricted`.\n\n```python\napp.mount(\"/static\", StaticFiles(directory=\"static\"), name=\"static\")\napp.mount(\n    \"/restricted\",\n    AuthStaticFiles(directory=Path(__file__).parent / \"restricted\"),\n    name=\"restricted\"\n)\n```\n",
      "summary": "I wanted to host some static files through fastapi. Typical use cases for this might be some static web content like html/css/js. It could also be images or...",
      "date_published": "2023-10-04T08:32:58Z",
      "date_modified": "2023-10-04T08:32:58Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/set-up-minio-bucket-entrypoint/",
      "url": "https://waylonwalker.com/set-up-minio-bucket-entrypoint/",
      "title": "Set up minio bucket entrypoint",
      "content_html": "\u003cp\u003eI recently se tup minio object storage in my \u003ca href=\"/homelab/\" class=\"glossary-term\" title=\"A place to self host applications. For me this is primarily self built web applications, and applications for sharing files with my family. Techno Tim has a...\"\u003ehomelab\u003c/a\u003e for litestream sqlite\nbackups. The litestream quickstart made it easy to get everything up and\nrunning on localhost, but I hit a wall when dns was involved to pull it from a\ndifferent machine.\u003c/p\u003e\n\u003ch2 id=\"here-is-what-i-got-to-work\"\u003eHere is what I got to work \u003ca href=\"#here-is-what-i-got-to-work\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFirst I had to configure the Key ID and Secret Access Key generated in the\nminio ui.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ aws configure\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAWS Access Key ID \u003cspan class=\"o\"\u003e[\u003c/span\u003e****************VZnD\u003cspan class=\"o\"\u003e]\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAWS Secret Access Key \u003cspan class=\"o\"\u003e[\u003c/span\u003e****************xAm8\u003cspan class=\"o\"\u003e]\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDefault region name \u003cspan class=\"o\"\u003e[\u003c/span\u003eus-east-1\u003cspan class=\"o\"\u003e]\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDefault output format \u003cspan class=\"o\"\u003e[\u003c/span\u003eNone\u003cspan class=\"o\"\u003e]\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen set the the s3 signature_version to s3v4.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws configure \u003cspan class=\"nb\"\u003eset\u003c/span\u003e default.s3.signature_version s3v4\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow when I have minio running on \u003ca href=\"https://my-minio-endpoint.com\"\u003ehttps://my-minio-endpoint.com\u003c/a\u003e I can use the\naws cli to access the bucket.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNote that \u003ccode\u003ehttps://my-minio-endpoint.com\u003c/code\u003e resolves to the bucket endpoint\n(default 9000) not the ui (default 9001).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws --endpoint-url https://my-minio-endpoint.com s3 ls my_bucket\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"now-configuring-litestream\"\u003eNow Configuring Litestream \u003ca href=\"#now-configuring-litestream\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eLitestream also accepts the \u003ccode\u003eendpoint\u003c/code\u003e argument via config. I could not get it\nto work just with the ui.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNote the \u003ccode\u003eaws configure\u003c/code\u003e step above is not required for litestream, only the\naws cli.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edbs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/path/to/database.db\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ereplicas\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003es3://my_bucket/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eendpoint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://my-minio-endpoint.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eregion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eus-east-1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eaccess-key-id\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e****************VZnD\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003esecret-access-key\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e************************************xAm8\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow run a litestream replication.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elitestream replicate -config litestream.yml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# or put the config in /etc/litestream.yml and just run replicate\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elitestream replicate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI recently se tup minio object storage in my homelab for litestream sqlite\nbackups. The litestream quickstart made it easy to get everything up and\nrunning on localhost, but I hit a wall when dns was involved to pull it from a\ndifferent machine.\n\n## Here is what I got to work\n\nFirst I had to configure the Key ID and Secret Access Key generated in the\nminio ui.\n\n```bash\n❯ aws configure\nAWS Access Key ID [****************VZnD]:\nAWS Secret Access Key [****************xAm8]:\nDefault region name [us-east-1]:\nDefault output format [None]:\n```\n\nThen set the the s3 signature_version to s3v4.\n\n```bash\naws configure set default.s3.signature_version s3v4\n```\n\nNow when I have minio running on \u003chttps://my-minio-endpoint.com\u003e I can use the\naws cli to access the bucket.\n\n\u003e Note that `https://my-minio-endpoint.com` resolves to the bucket endpoint\n\u003e (default 9000) not the ui (default 9001).\n\n```bash\naws --endpoint-url https://my-minio-endpoint.com s3 ls my_bucket\n```\n\n## Now Configuring Litestream\n\nLitestream also accepts the `endpoint` argument via config. I could not get it\nto work just with the ui.\n\n\u003e Note the `aws configure` step above is not required for litestream, only the\n\u003e aws cli.\n\n```yaml\ndbs:\n  - path: /path/to/database.db\n    replicas:\n      - url: s3://my_bucket/\n        endpoint: https://my-minio-endpoint.com\n        region: us-east-1\n        access-key-id: ****************VZnD\n        secret-access-key: ************************************xAm8\n```\n\nNow run a litestream replication.\n\n```bash\nlitestream replicate -config litestream.yml\n# or put the config in /etc/litestream.yml and just run replicate\nlitestream replicate\n```\n",
      "summary": "I recently se tup minio object storage in my homelab for litestream sqlite backups. The litestream quickstart made it easy to get everything up and running...",
      "date_published": "2023-10-01T20:11:51Z",
      "date_modified": "2023-10-01T20:11:51Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "data",
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/tailwind-and-jinja/",
      "url": "https://waylonwalker.com/tailwind-and-jinja/",
      "title": "Setup Tailwind for Jinja",
      "content_html": "\u003cp\u003eI’ve recently given tailwindcss a second chance and am really liking it. Here\nis how I set it up for my python based projects.\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"hoverlink\" href=\"https://waylonwalker.com/a-case-for-tailwindcss\"\u003ehttps://waylonwalker.com/a-case-for-tailwindcss\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation \u003ca href=\"#installation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003enpm\u003c/code\u003e is used to install the cli that you will need to configure and compile tailwindcss.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install -g tailwindcss-cli\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"setup\"\u003eSetup \u003ca href=\"#setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou will need to create a tailwind.config.js file, to get this you can use the cli.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpx tailwindcss init\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"using-tailwind-with-jinja-templates\"\u003eUsing tailwind with jinja templates \u003ca href=\"#using-tailwind-with-jinja-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTo set up tailwind to work with jinja templates you will need to point the\ntailwind config content to your jinja templates directory.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emodule\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexports\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;templates/**/*.html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"setting-up-the-base-styles\"\u003eSetting up the base styles \u003ca href=\"#setting-up-the-base-styles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI like to use the \u003ccode\u003e@tailwind base;\u003c/code\u003e, to do this I set up an input.css file.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003etailwind\u003c/span\u003e \u003cspan class=\"nt\"\u003ebase\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003etailwind\u003c/span\u003e \u003cspan class=\"nt\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003etailwind\u003c/span\u003e \u003cspan class=\"nt\"\u003eutilities\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"compiling\"\u003eCompiling \u003ca href=\"#compiling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow that it’s all setup you can run the tailwindcss command. You will get an\noutput.css with base tailwind plus any of the classes that you used.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etailwindcss -i ./input.css -o ./output.css --watch\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've recently given tailwindcss a second chance and am really liking it. Here\nis how I set it up for my python based projects.\n\n[https://waylonwalker.com/a-case-for-tailwindcss](https://waylonwalker.com/a-case-for-tailwindcss){.hoverlink}\n\n## Installation\n\n`npm` is used to install the cli that you will need to configure and compile tailwindcss.\n\n```sh\nnpm install -g tailwindcss-cli\n```\n\n## Setup\n\nYou will need to create a tailwind.config.js file, to get this you can use the cli.\n\n```sh\nnpx tailwindcss init\n```\n\n## Using tailwind with jinja templates\n\nTo set up tailwind to work with jinja templates you will need to point the\ntailwind config content to your jinja templates directory.\n\n```js\nmodule.exports = {\n  content: [\"templates/**/*.html\"],\n};\n```\n\n## Setting up the base styles\n\nI like to use the `@tailwind base;`, to do this I set up an input.css file.\n\n```css\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n```\n\n## Compiling\n\nNow that it's all setup you can run the tailwindcss command. You will get an\noutput.css with base tailwind plus any of the classes that you used.\n\n```sh\ntailwindcss -i ./input.css -o ./output.css --watch\n```\n",
      "summary": "I've recently given tailwindcss a second chance and am really liking it. Here is how I set it up for my python based projects.",
      "date_published": "2023-09-17T17:10:32Z",
      "date_modified": "2023-09-17T17:10:32Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/python-scandir-ignores-hidden-directories/",
      "url": "https://waylonwalker.com/python-scandir-ignores-hidden-directories/",
      "title": "Python scandir ignores hidden directories",
      "content_html": "\u003cp\u003eThe next version of markata will be around a full second faster at building\nit’s docs, that’s a 30% bump in performance at the current state. This\nperformance will come when virtual environments are stored in the same\ndirectory as the source code.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000300.1657735302.webp\" class=\"glightbox-link\" aria-label=\"“One lone jedi stands in Glowing chains of interconnected network of technological cubes, in the middle of a futuristic cyberpunk dubai city, in the art style of dan mumford and marc simonetti, atmospheric lighting, intricate, volumetric lighting, beautiful, sharp focus, ultra detailed” -s50 -W800 -H350 -C7.5 -Ak_lms -S1657735302\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000300.1657735302.webp\" alt=\"“One lone jedi stands in Glowing chains of interconnected network of technological cubes, in the middle of a futuristic cyberpunk dubai city, in the art style of dan mumford and marc simonetti, atmospheric lighting, intricate, volumetric lighting, beautiful, sharp focus, ultra detailed” -s50 -W800 -H350 -C7.5 -Ak_lms -S1657735302\"/ data-glightbox=\"description: “One lone jedi stands in Glowing chains of interconnected network of technological cubes, in the middle of a futuristic cyberpunk dubai city, in the art style of dan mumford and marc simonetti, atmospheric lighting, intricate, volumetric lighting, beautiful, sharp focus, ultra detailed” -s50 -W800 -H350 -C7.5 -Ak_lms -S1657735302\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"what-happened\"\u003eWhat happened?? \u003ca href=\"#what-happened\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI was looking through my profiler for some unexpected performance hits, and\nnoticed that the \u003ccode\u003edocs\u003c/code\u003e plugin was taking nearly a full second (sometimes\nmore), just to run glob.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e|\u003c/span\u003e  \u003cspan class=\"o\"\u003e|-\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.068\u003c/span\u003e \u003cspan class=\"n\"\u003eglob\u003c/span\u003e  \u003cspan class=\"n\"\u003emarkata\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eplugins\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003edocs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e40\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e|\u003c/span\u003e  \u003cspan class=\"o\"\u003e|\u003c/span\u003e  \u003cspan class=\"o\"\u003e|-\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.838\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003elistcomp\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e  \u003cspan class=\"n\"\u003emarkata\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eplugins\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003edocs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e82\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e|\u003c/span\u003e  \u003cspan class=\"o\"\u003e|\u003c/span\u003e  \u003cspan class=\"o\"\u003e|\u003c/span\u003e  \u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.817\u003c/span\u003e \u003cspan class=\"n\"\u003ePathSpec\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ematch_file\u003c/span\u003e  \u003cspan class=\"n\"\u003epathspec\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003epathspec\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e165\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e|\u003c/span\u003e  \u003cspan class=\"o\"\u003e|\u003c/span\u003e  \u003cspan class=\"o\"\u003e|\u003c/span\u003e        \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e14\u003c/span\u003e \u003cspan class=\"n\"\u003eframes\u003c/span\u003e \u003cspan class=\"n\"\u003ehidden\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e  \u003cspan class=\"n\"\u003epathspec\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebuilt\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"ow\"\u003ein\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"python-scandir-ignores-hidden-directories\"\u003ePython scandir ignores hidden directories \u003ca href=\"#python-scandir-ignores-hidden-directories\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI started looking for different solutions and what I found was that I was\nhitting pathspec with way more files than I needed to.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003elist\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;**/*.py\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 6444\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ef\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eglob\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;**/*.py\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erecursive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 110\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAfter digging into the docs I found that \u003ccode\u003eglob.glob\u003c/code\u003e uses \u003ccode\u003eos.scandir\u003c/code\u003e which\nignores ‘.’ and ‘..’ directories while Path.glob does not.\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"hoverlink  has-avatar has-avatar-before\" href=\"https://docs.python.org/3/library/os.html#os.scandir\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/docs.python.org.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/docs.python.org.ico\"\u003ehttps://docs.python.org/3/library/os.html#os.scandir\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"results\"\u003eresults? \u003ca href=\"#results\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow glob.py from the docs plugin does not even show up in the profiler.\u003c/p\u003e\n\u003cp\u003eI opened up ipython and saw the following results. For some reason as I hit\ndocs.glob it was only hitting 488 ms from ipython, but it was still a massive\nimprovement over the original.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"n\"\u003etimeit\u003c/span\u003e \u003cspan class=\"n\"\u003edocs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 488 ms ± 3.05 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"n\"\u003etimeit\u003c/span\u003e \u003cspan class=\"n\"\u003edocs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 9.37 ms ± 90.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nThe next version of markata will be around a full second faster at building\nit's docs, that's a 30% bump in performance at the current state. This\nperformance will come when virtual environments are stored in the same\ndirectory as the source code.\n\n![\"One lone jedi stands in Glowing chains of interconnected network of technological cubes, in the middle of a futuristic cyberpunk dubai city, in the art style of dan mumford and marc simonetti, atmospheric lighting, intricate, volumetric lighting, beautiful, sharp focus, ultra detailed\" -s50 -W800 -H350 -C7.5 -Ak_lms -S1657735302](https://stable-diffusion.waylonwalker.com/000300.1657735302.webp)\n\n## What happened??\n\nI was looking through my profiler for some unexpected performance hits, and\nnoticed that the `docs` plugin was taking nearly a full second (sometimes\nmore), just to run glob.\n\n```python\n    |  |- 1.068 glob  markata/plugins/docs.py:40\n    |  |  |- 0.838 \u003clistcomp\u003e  markata/plugins/docs.py:82\n    |  |  |  `- 0.817 PathSpec.match_file  pathspec/pathspec.py:165\n    |  |  |        [14 frames hidden]  pathspec, \u003cbuilt-in\u003e, \u003cstring\u003e\n```\n\n## Python scandir ignores hidden directories\n\nI started looking for different solutions and what I found was that I was\nhitting pathspec with way more files than I needed to.\n\n```python\nlen(list(Path().glob(\"**/*.py\")))\n# 6444\nlen([Path(f) for f in glob.glob(\"**/*.py\", recursive=True)])\n# 110\n```\n\nAfter digging into the docs I found that `glob.glob` uses `os.scandir` which\nignores '.' and '..' directories while Path.glob does not.\n\n[https://docs.python.org/3/library/os.html#os.scandir](https://docs.python.org/3/library/os.html#os.scandir){.hoverlink}\n\n## results?\n\nNow glob.py from the docs plugin does not even show up in the profiler.\n\nI opened up ipython and saw the following results. For some reason as I hit\ndocs.glob it was only hitting 488 ms from ipython, but it was still a massive\nimprovement over the original.\n\n```python\n%timeit docs.glob(m)\n# 488 ms ± 3.05 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n\n%timeit docs.glob(m)\n# 9.37 ms ± 90.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n```\n",
      "summary": "The next version of markata will be around a full second faster at building it's docs, that's a 30% bump in performance at the current state. This...",
      "date_published": "2023-06-17T20:19:59Z",
      "date_modified": "2023-06-17T20:19:59Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/setting-up-paru/",
      "url": "https://waylonwalker.com/setting-up-paru/",
      "title": "setting up paru | installing from the AUR for the first time",
      "content_html": "\u003cp\u003e\u003ca href=\"/paru/\" class=\"glossary-term\" title=\"paru is a package manager for archlinux that installs packages from the \u003ca href=\"/aur/\" class=\"glossary-term\" title=\"Arch User Repository, a collection of community maintained packages for archlinux.\"\u003eAUR\u003c/a\u003e.\"\u003eparu\u003c/a\u003e is an aur helper that allows you to use a package manager to install\npackages from the aur.\u003c/p\u003e\n\u003ch2 id=\"whats-the-aur\"\u003eWhat’s the Aur \u003ca href=\"#whats-the-aur\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe Aur is a set of community managed packages that can be installed on arch based distros.\u003c/p\u003e\n\u003ch2 id=\"why-a-helper\"\u003eWhy a helper? \u003ca href=\"#why-a-helper\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eparu just makes it easy, no clone and run makepkg. You can do everything paru\ncan do using the built in pacman installer.\u003c/p\u003e\n\u003ch2 id=\"manual-install-from-the-aur\"\u003eManual Install from the Aur \u003ca href=\"#manual-install-from-the-aur\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou will need to manually instal pacman from the aur in order to get started.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo pacman -S --needed base-devel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone https://aur.archlinux.org/paru.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e paru\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emakepkg -si\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"installing-packages-with-paru\"\u003eInstalling packages with paru \u003ca href=\"#installing-packages-with-paru\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOnce setup you are ready to install packages from the AUR just like the core repos.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e# you can update your system using paru\nparu -Syu\n\n# you can install packages from the AUR\nparu -S tailscale\nparu -S prismlauncher\n\n# even core repo packages can be installed\nparu -S docker\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"paru-in-docker\"\u003eParu in Docker \u003ca href=\"#paru-in-docker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere is a snippet from my devtainer\n\u003ca href=\"https://github.com/WaylonWalker/devtainer/blob/main/Dockerfile\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003edockerfile\u003c/a\u003e.\nWhere I use paru to install packages from the AUR inside of a dockerfile.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFROM archlinux\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRUN \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;[multilib]\u0026#39;\u003c/span\u003e \u0026gt;\u0026gt; /etc/pacman.conf \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Include = /etc/pacman.d/mirrorlist\u0026#39;\u003c/span\u003e \u0026gt;\u0026gt; /etc/pacman.conf \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pacman --noconfirm -Syyu \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pacman --noconfirm -S base-devel git \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    groupadd --gid \u003cspan class=\"m\"\u003e1000\u003c/span\u003e devtainer \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    useradd --uid \u003cspan class=\"m\"\u003e1000\u003c/span\u003e --gid \u003cspan class=\"m\"\u003e1000\u003c/span\u003e -m -r -s /bin/bash devtainer \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    passwd -d devtainer \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;devtainer ALL=(ALL) ALL\u0026#39;\u003c/span\u003e \u0026gt; /etc/sudoers.d/devtainer \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    mkdir -p /home/devtainer/.gnupg \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;standard-resolver\u0026#39;\u003c/span\u003e \u0026gt; /home/devtainer/.gnupg/dirmngr.conf \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    chown -R devtainer:devtainer /home/devtainer \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    mkdir /build \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    chown -R devtainer:devtainer /build \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003ecd\u003c/span\u003e /build \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    sudo -u devtainer git clone --depth \u003cspan class=\"m\"\u003e1\u003c/span\u003e https://aur.archlinux.org/paru.git \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003ecd\u003c/span\u003e paru \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    sudo -u devtainer makepkg --noconfirm -si \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    sed -i \u003cspan class=\"s1\"\u003e\u0026#39;s/#RemoveMake/RemoveMake/g\u0026#39;\u003c/span\u003e /etc/paru.conf \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pacman -Qtdq \u003cspan class=\"p\"\u003e|\u003c/span\u003e xargs -r pacman --noconfirm -Rcns \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    rm -rf /home/devtainer/.cache \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    rm -rf /build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUSER devtainer\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRUN sudo -u devtainer paru --noconfirm --skipreview --useask -S \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    bat \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    cargo \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    direnv \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    dua-cli \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    dust \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    fd\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"final-thoughts\"\u003eFinal Thoughts \u003ca href=\"#final-thoughts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere are other options out there, paru seemed to be the most supported at the\ntime I started using arch and there has been no other reason for me to change\nit. It’s treated me well for nearly a year now.\u003c/p\u003e\n",
      "content_text": "\nparu is an aur helper that allows you to use a package manager to install\npackages from the aur.\n\n## What's the Aur\n\nThe Aur is a set of community managed packages that can be installed on arch based distros.\n\n## Why a helper?\n\nparu just makes it easy, no clone and run makepkg. You can do everything paru\ncan do using the built in pacman installer.\n\n## Manual Install from the Aur\n\nYou will need to manually instal pacman from the aur in order to get started.\n\n```bash\nsudo pacman -S --needed base-devel\ngit clone https://aur.archlinux.org/paru.git\ncd paru\nmakepkg -si\n```\n\n## Installing packages with paru\n\nOnce setup you are ready to install packages from the AUR just like the core repos.\n\n```\n# you can update your system using paru\nparu -Syu\n\n# you can install packages from the AUR\nparu -S tailscale\nparu -S prismlauncher\n\n# even core repo packages can be installed\nparu -S docker\n```\n\n## Paru in Docker\n\nHere is a snippet from my devtainer\n[dockerfile](https://github.com/WaylonWalker/devtainer/blob/main/Dockerfile).\nWhere I use paru to install packages from the AUR inside of a dockerfile.\n\n```bash\nFROM archlinux\n\nRUN echo '[multilib]' \u003e\u003e /etc/pacman.conf \u0026\u0026 \\\n    echo 'Include = /etc/pacman.d/mirrorlist' \u003e\u003e /etc/pacman.conf \u0026\u0026 \\\n    pacman --noconfirm -Syyu \u0026\u0026 \\\n    pacman --noconfirm -S base-devel git \u0026\u0026 \\\n    groupadd --gid 1000 devtainer \u0026\u0026 \\\n    useradd --uid 1000 --gid 1000 -m -r -s /bin/bash devtainer \u0026\u0026 \\\n    passwd -d devtainer \u0026\u0026 \\\n    echo 'devtainer ALL=(ALL) ALL' \u003e /etc/sudoers.d/devtainer \u0026\u0026 \\\n    mkdir -p /home/devtainer/.gnupg \u0026\u0026 \\\n    echo 'standard-resolver' \u003e /home/devtainer/.gnupg/dirmngr.conf \u0026\u0026 \\\n    chown -R devtainer:devtainer /home/devtainer \u0026\u0026 \\\n    mkdir /build \u0026\u0026 \\\n    chown -R devtainer:devtainer /build \u0026\u0026 \\\n    cd /build \u0026\u0026 \\\n    sudo -u devtainer git clone --depth 1 https://aur.archlinux.org/paru.git \u0026\u0026 \\\n    cd paru \u0026\u0026 \\\n    sudo -u devtainer makepkg --noconfirm -si \u0026\u0026 \\\n    sed -i 's/#RemoveMake/RemoveMake/g' /etc/paru.conf \u0026\u0026 \\\n    pacman -Qtdq | xargs -r pacman --noconfirm -Rcns \u0026\u0026 \\\n    rm -rf /home/devtainer/.cache \u0026\u0026 \\\n    rm -rf /build\n\nUSER devtainer\nRUN sudo -u devtainer paru --noconfirm --skipreview --useask -S \\\n    bat \\\n    cargo \\\n    direnv \\\n    dua-cli \\\n    dust \\\n    fd\n\n```\n\n## Final Thoughts\n\nThere are other options out there, paru seemed to be the most supported at the\ntime I started using arch and there has been no other reason for me to change\nit. It's treated me well for nearly a year now.\n",
      "summary": "paru is an aur helper that allows you to use a package manager to install packages from the aur.",
      "date_published": "2023-05-27T20:22:42Z",
      "date_modified": "2023-05-27T20:22:42Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/gh-release/",
      "url": "https://waylonwalker.com/gh-release/",
      "title": "Releasing a New Version of Your Python Package Just Got Easier",
      "content_html": "\u003cp\u003eQuickly and easily create new versions of your Python package with the \u003ccode\u003egh release\u003c/code\u003e\ncommand. Get the version number, changelog, and\u003c/p\u003e\n\u003cp\u003eReleasing a new version of your Python package can be a daunting task. You need to make\nsure that all the necessary files are included, and that the version number is correct.\nBut now, with the help of the \u003ccode\u003egh release\u003c/code\u003e command, you can make the process much\nsmoother.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003egh release\u003c/code\u003e command allows you to quickly and easily create a new version of your\nPython package. All you need to do is provide the version number, the changelog, and the\ndistribution files. For example, if you wanted to create a new version of your package\nwith the version number \u003ccode\u003ev1.2.3\u003c/code\u003e, you could use the following command:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egh release create v1.2.3 -F CHANGELOG.md dist/*.whl dist/*.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis command will create a new version of your package with the specified version number,\nand include the changelog and the distribution files. It’s a great way to make sure that\nall the necessary files are included in the release, and that the version number is\ncorrect.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003egh release\u003c/code\u003e command is a great tool for quickly and easily creating new versions of\nyour Python package. With just a few simple commands, you can make sure that all the\nnecessary files are included, and that the version number is correct. So if you’re looking\nfor an easy way to release a new version of your Python package, give the \u003ccode\u003egh release\u003c/code\u003e\ncommand a try.\u003c/p\u003e\n",
      "content_text": "\nQuickly and easily create new versions of your Python package with the `gh release`\ncommand. Get the version number, changelog, and\n\nReleasing a new version of your Python package can be a daunting task. You need to make\nsure that all the necessary files are included, and that the version number is correct.\nBut now, with the help of the `gh release` command, you can make the process much\nsmoother.\n\nThe `gh release` command allows you to quickly and easily create a new version of your\nPython package. All you need to do is provide the version number, the changelog, and the\ndistribution files. For example, if you wanted to create a new version of your package\nwith the version number `v1.2.3`, you could use the following command:\n\n```bash\ngh release create v1.2.3 -F CHANGELOG.md dist/*.whl dist/*.tar.gz\n```\n\nThis command will create a new version of your package with the specified version number,\nand include the changelog and the distribution files. It's a great way to make sure that\nall the necessary files are included in the release, and that the version number is\ncorrect.\n\nThe `gh release` command is a great tool for quickly and easily creating new versions of\nyour Python package. With just a few simple commands, you can make sure that all the\nnecessary files are included, and that the version number is correct. So if you're looking\nfor an easy way to release a new version of your Python package, give the `gh release`\ncommand a try.\n",
      "summary": "Quickly and easily create new versions of your Python package with the command. Get the version number, changelog, and",
      "date_published": "2023-01-23T10:52:19Z",
      "date_modified": "2023-01-23T10:52:19Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "cli"
      ]
    },
    {
      "id": "https://waylonwalker.com/arch-rejects-password/",
      "url": "https://waylonwalker.com/arch-rejects-password/",
      "title": "Arch Linux Randomly Rejecting Passwords",
      "content_html": "\u003cblockquote\u003e\n\u003cp\u003eFix Arch Linux randomly rejecting passwords with one command. Try\n‘faillock –user $USER’ to reset login counter and regain access. Quick\nsolution for a smooth computing\u0026#34;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000255.3612717469.webp\" class=\"glightbox-link\" aria-label=\"an intertwined mess of wires\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000255.3612717469.webp\" alt=\"an intertwined mess of wires\"/ data-glightbox=\"description: an intertwined mess of wires\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eIf you’re an Arch Linux user, you may have experienced a frustrating issue\nwhere your password is randomly not being accepted by the system. This can be a\nmajor inconvenience and can cause a lot of frustration, especially if it\nhappens frequently.\u003c/p\u003e\n\u003cp\u003eThe good news is that there is a simple fix for this issue. The following bash\ncode can be used to fix the problem:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ebash faillock --user $USER\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eThis command is used to reset the failed login count for the current user. By\nrunning this command, you will be able to reset the system’s login counter and\nregain access to your account.\u003c/p\u003e\n\u003cp\u003eIt’s important to note that this command should only be used as a temporary\nsolution. If you find yourself frequently having to run this command, it’s\nlikely that there is a deeper issue with your system that needs to be\naddressed.\u003c/p\u003e\n\u003cp\u003eIn any case, if you’re experiencing problems with your Arch Linux system not\naccepting your password, give the above command a try and see if it resolves\nthe issue for you.\u003c/p\u003e\n",
      "content_text": "\n\u003e Fix Arch Linux randomly rejecting passwords with one command. Try\n\u003e 'faillock --user $USER' to reset login counter and regain access. Quick\n\u003e solution for a smooth computing\"\n\n![an intertwined mess of wires](https://stable-diffusion.waylonwalker.com/000255.3612717469.webp)\n\nIf you're an Arch Linux user, you may have experienced a frustrating issue\nwhere your password is randomly not being accepted by the system. This can be a\nmajor inconvenience and can cause a lot of frustration, especially if it\nhappens frequently.\n\nThe good news is that there is a simple fix for this issue. The following bash\ncode can be used to fix the problem:\n\n`bash faillock --user $USER`\n\nThis command is used to reset the failed login count for the current user. By\nrunning this command, you will be able to reset the system's login counter and\nregain access to your account.\n\nIt's important to note that this command should only be used as a temporary\nsolution. If you find yourself frequently having to run this command, it's\nlikely that there is a deeper issue with your system that needs to be\naddressed.\n\nIn any case, if you're experiencing problems with your Arch Linux system not\naccepting your password, give the above command a try and see if it resolves\nthe issue for you.\n",
      "summary": "Fix Arch Linux randomly rejecting passwords with one command. Try \u003e 'faillock --user $USER' to reset login counter and regain access. Quick \u003e solution for a...",
      "date_published": "2023-01-19T07:46:31Z",
      "date_modified": "2023-01-19T07:46:31Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/fail-ci-scripts/",
      "url": "https://waylonwalker.com/fail-ci-scripts/",
      "title": "dash e your github docker actions",
      "content_html": "\u003cp\u003eGive github actions the -e flag in the shebang \u003ccode\u003e#!\u003c/code\u003e so they fail on any one\ncommand failure. Otherwise each line will set the exit status, but only the\nlast one will be passed to ci.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash -e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"what-is--e\"\u003eWhat is -e \u003ca href=\"#what-is--e\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe -e flag to the bash command allows your script to exit immediately if any\ncommand within the script returns a non-zero exit status. This can be useful\nfor ensuring that your script exits with an error if any of the commands it\nruns fail, which can help you identify and debug issues in your script. For\nexample, if you have a script that runs several commands and one of those\ncommands fails, the script will continue running without the -e flag, but will\nexit immediately if the -e flag is present. This can make it easier to\ntroubleshoot your script and ensure that it runs correctly.\u003c/p\u003e\n\u003ch2 id=\"solution-for-windows\"\u003eSolution for Windows \u003ca href=\"#solution-for-windows\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn windows the solution is not quite as simple. You can define a function in a\nWindows batch script that wraps an if statement to check the exit status of a\ncommand and handle any errors that may have occurred. Here is an example of how\nyou might define a function called “check_error” that does this:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nl\"\u003echeck_error\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"k\"\u003eerrorlevel\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eecho\u003c/span\u003e An error occurred!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eexit\u003c/span\u003e /b 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo use this function in your script, you would simply call it after running a\ncommand, like this:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esome_command\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003ecall\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nl\"\u003echeck_error\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis would run the “some_command” and then call the “check_error” function to\ncheck the exit status and handle any errors that may have occurred. This\napproach allows you to reuse the error-checking logic in your script, which can\nmake it easier to write and maintain.\u003c/p\u003e\n",
      "content_text": "\nGive github actions the -e flag in the shebang `#!` so they fail on any one\ncommand failure. Otherwise each line will set the exit status, but only the\nlast one will be passed to ci.\n\n```bash\n#!/bin/bash -e\n```\n\n## What is -e\n\nThe -e flag to the bash command allows your script to exit immediately if any\ncommand within the script returns a non-zero exit status. This can be useful\nfor ensuring that your script exits with an error if any of the commands it\nruns fail, which can help you identify and debug issues in your script. For\nexample, if you have a script that runs several commands and one of those\ncommands fails, the script will continue running without the -e flag, but will\nexit immediately if the -e flag is present. This can make it easier to\ntroubleshoot your script and ensure that it runs correctly.\n\n## Solution for Windows\n\nIn windows the solution is not quite as simple. You can define a function in a\nWindows batch script that wraps an if statement to check the exit status of a\ncommand and handle any errors that may have occurred. Here is an example of how\nyou might define a function called \"check_error\" that does this:\n\n```cmd\n:check_error\nif errorlevel 1 (\n  echo An error occurred!\n  exit /b 1\n)\n```\n\nTo use this function in your script, you would simply call it after running a\ncommand, like this:\n\n```cmd\nsome_command\ncall :check_error\n```\n\nThis would run the \"some_command\" and then call the \"check_error\" function to\ncheck the exit status and handle any errors that may have occurred. This\napproach allows you to reuse the error-checking logic in your script, which can\nmake it easier to write and maintain.\n",
      "summary": "Give github actions the -e flag in the shebang so they fail on any one command failure. Otherwise each line will set the exit status, but only the last one...",
      "date_published": "2022-12-07T13:09:37Z",
      "date_modified": "2022-12-07T13:09:37Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "actions",
        "bash",
        "ci-cd",
        "cli",
        "github"
      ]
    },
    {
      "id": "https://waylonwalker.com/ssh-copy-id/",
      "url": "https://waylonwalker.com/ssh-copy-id/",
      "title": "ssh copy id",
      "content_html": "\u003cp\u003eI recently setup some vm’s on my main machine and got sick of signing in with\npasswords.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003essh-keygen\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003essh-copy-id -i ~/.ssh/id_rsa.pub virt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI recently setup some vm's on my main machine and got sick of signing in with\npasswords.\n\n``` bash\nssh-keygen\nssh-copy-id -i ~/.ssh/id_rsa.pub virt\n```\n",
      "summary": "I recently setup some vm's on my main machine and got sick of signing in with passwords.",
      "date_published": "2022-12-04T20:10:05Z",
      "date_modified": "2022-12-04T20:10:05Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/tmux-push-pull-panes/",
      "url": "https://waylonwalker.com/tmux-push-pull-panes/",
      "title": "tmux push/pull panes",
      "content_html": "\u003cp\u003eMoving panes between tmux sessions is something that makes tmux a very flexible\nand powerful tool.  I don’t need this feature very often, but it comes in\nclutch when you need it.\u003c/p\u003e\n\u003ch2 id=\"pull-a-pane-from-any-other-session\"\u003ePull a pane from any other session \u003ca href=\"#pull-a-pane-from-any-other-session\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUsing \u003ccode\u003echoose-window\u003c/code\u003e I was able to come up with a way to select any pane\nwithing any other session and join it into my current session.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Choose a pane to join in horizontally\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ebind\u003c/span\u003e f choose-window -Z \u003cspan class=\"s1\"\u003e\u0026#39;join-pane -h -s \u0026#34;%%\u0026#34;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"pushpull-from-scratch\"\u003ePush/Pull from scratch \u003ca href=\"#pushpull-from-scratch\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI’ve long had this one in my tmux config, I always have a “scratch” session\nthat I’m running, I often use for looking at things like \u003ccode\u003ek9s\u003c/code\u003e accross repos\nwithin a popup.\u003c/p\u003e\n\u003cp\u003eThis use case puts a pane into the scratch session, then pulls it back out.  I\nwill use this to move a pane between sessions in the rare cases I need to do\nthis.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# push the active pane into the scratch session horizonally\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ebind\u003c/span\u003e -n M-f join-pane -ht scratch\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# pull the last active pane from the scratch session horizonally into this session\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ebind\u003c/span\u003e -n M-F join-pane -hs scratch\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nMoving panes between tmux sessions is something that makes tmux a very flexible\nand powerful tool.  I don't need this feature very often, but it comes in\nclutch when you need it.\n\n## Pull a pane from any other session\n\nUsing `choose-window` I was able to come up with a way to select any pane\nwithing any other session and join it into my current session.\n\n``` bash\n# Choose a pane to join in horizontally\nbind f choose-window -Z 'join-pane -h -s \"%%\"'\n```\n\n## Push/Pull from scratch\n\nI've long had this one in my tmux config, I always have a \"scratch\" session\nthat I'm running, I often use for looking at things like `k9s` accross repos\nwithin a popup.\n\nThis use case puts a pane into the scratch session, then pulls it back out.  I\nwill use this to move a pane between sessions in the rare cases I need to do\nthis.\n\n``` bash\n# push the active pane into the scratch session horizonally\nbind -n M-f join-pane -ht scratch\n# pull the last active pane from the scratch session horizonally into this session\nbind -n M-F join-pane -hs scratch\n```\n",
      "summary": "Moving panes between tmux sessions is something that makes tmux a very flexible and powerful tool. I don't need this feature very often, but it comes in...",
      "date_published": "2022-12-04T13:25:54Z",
      "date_modified": "2022-12-04T13:25:54Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "cli",
        "tmux"
      ]
    },
    {
      "id": "https://waylonwalker.com/ssh-key-permissions/",
      "url": "https://waylonwalker.com/ssh-key-permissions/",
      "title": "ssh key permissions",
      "content_html": "\u003cp\u003eI just shared some ssh keys with myself and ran into this error telling me that\nI did not set the correct permissions on my key.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePermissions \u003cspan class=\"m\"\u003e0750\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;/home/waylon/.ssh/id_*******\u0026#39;\u003c/span\u003e are too open.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIt is required that your private key files are NOT accessible by others.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis private key will be ignored.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLoad key \u003cspan class=\"s2\"\u003e\u0026#34;/home/waylon/.ssh/id_*******\u0026#34;\u003c/span\u003e: bad Permissions\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erepo: Permission denied \u003cspan class=\"o\"\u003e(\u003c/span\u003epublickey,gssapi-keyex,gssapi-with-mic\u003cspan class=\"o\"\u003e)\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efatal: Could not \u003cspan class=\"nb\"\u003eread\u003c/span\u003e from remote repository.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePlease make sure you have the correct access rights\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eand the repository exists.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI changed them with the following commands.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echmod \u003cspan class=\"m\"\u003e644\u003c/span\u003e ~/.ssh/id_*******.pub\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echmod \u003cspan class=\"m\"\u003e600\u003c/span\u003e ~/.ssh/id_*******\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI just shared some ssh keys with myself and ran into this error telling me that\nI did not set the correct permissions on my key.\n\n``` bash\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\nPermissions 0750 for '/home/waylon/.ssh/id_*******' are too open.\nIt is required that your private key files are NOT accessible by others.\nThis private key will be ignored.\nLoad key \"/home/waylon/.ssh/id_*******\": bad Permissions\nrepo: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).\nfatal: Could not read from remote repository.\n\nPlease make sure you have the correct access rights\nand the repository exists.\n```\n\nI changed them with the following commands.\n\n``` bash\nchmod 644 ~/.ssh/id_*******.pub\nchmod 600 ~/.ssh/id_*******\n```\n",
      "summary": "I just shared some ssh keys with myself and ran into this error telling me that I did not set the correct permissions on my key.",
      "date_published": "2022-11-22T16:16:38Z",
      "date_modified": "2022-11-22T16:16:38Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/nvim-navic/",
      "url": "https://waylonwalker.com/nvim-navic/",
      "title": "nvim navic",
      "content_html": "\u003cp\u003eWith the latest release of version of nvim 0.8.0 we get access to a new winbar\nfeature.  One thing I have long wanted somewhere in my nvim is navigation for\npairing partners or anyone watching can keep track of where I am.  As the\ndriver it’s easy to keep track of the file/function you are in.  But when you\nmake big jumps in a few keystrokes it can be quite disorienting to anyone\nwatching, and having this feedback to look at is very helpful.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000362.2841371882.webp\" class=\"glightbox-link\" aria-label=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C6.0 -Ak_lms -S2841371882\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000362.2841371882.webp\" alt=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C6.0 -Ak_lms -S2841371882\"/ data-glightbox=\"description: “cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C6.0 -Ak_lms -S2841371882\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"winbar\"\u003ewinbar \u003ca href=\"#winbar\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003envim exposes the winbar api in lua, and you can send any text to the winbar as follows.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evim.o\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewinbar\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;here\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can try it for yourself right from the nvim command line.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003elua\u003c/span\u003e \u003cspan class=\"nx\"\u003evim\u003c/span\u003e.\u003cspan class=\"nx\"\u003eo\u003c/span\u003e.\u003cspan class=\"nx\"\u003ewinbar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;here\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow you will notice one line above your file with the word \u003ccode\u003ehere\u003c/code\u003e at the very\nbeginning.\u003c/p\u003e\n\u003ch2 id=\"clearing-the-winbar\"\u003eClearing the winbar \u003ca href=\"#clearing-the-winbar\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you want to clear it out, you can just set it to an empty string or \u003ccode\u003enil\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003elua\u003c/span\u003e \u003cspan class=\"nx\"\u003evim\u003c/span\u003e.\u003cspan class=\"nx\"\u003eo\u003c/span\u003e.\u003cspan class=\"nx\"\u003ewinbar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003elua\u003c/span\u003e \u003cspan class=\"nx\"\u003evim\u003c/span\u003e.\u003cspan class=\"nx\"\u003eo\u003c/span\u003e.\u003cspan class=\"nx\"\u003ewinbar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003enil\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"setting-up-nvim-navic\"\u003eSetting up nvim-navic \u003ca href=\"#setting-up-nvim-navic\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou will need to install \u003ccode\u003envim-navic\u003c/code\u003e if you want to use it.  I added it to my\nplugins using Plug as follows.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecall\u003c/span\u003e \u003cspan class=\"nx\"\u003eplug\u003c/span\u003e#\u003cspan class=\"nx\"\u003ebegin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;~/.local/share/nvim/plugged\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ePlug\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;SmiteshP/nvim-navic\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecall\u003c/span\u003e \u003cspan class=\"nx\"\u003eplug\u003c/span\u003e#\u003cspan class=\"nx\"\u003eend\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003eNote! \u003ccode\u003envim-navic\u003c/code\u003e does require the use of the nvim lsp, so if you are not\nusing it then maybe this won’t work for you.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI created an \u003ccode\u003eon_attach\u003c/code\u003e function long ago, cause that’s what Teej told me to\ndo.  Now I am glad I did, because it made this change super easy.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"kr\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003eon_attach\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eclient\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebufnr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eclient.server_capabilities\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edocumentSymbolProvider\u003c/span\u003e \u003cspan class=\"kr\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003enavic.attach\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eclient\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebufnr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen you need to use that \u003ccode\u003eon_attach\u003c/code\u003e function on all of the lsp’s that you\nwant navic to work on.\u003c/p\u003e\n\u003cp\u003eThen in a lua file you need to setup the winbar, for now I put this in my\nlsp-config settings file, but eventually I want to move my settings to lua and\nput it there.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evim.o\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewinbar\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; %{%v:lua.vim.fn.expand(\u0026#39;%F\u0026#39;)%}  %{%v:lua.require\u0026#39;nvim-navic\u0026#39;.get_location()%}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"what-my-winbar-looks-like\"\u003eWhat my winbar looks like \u003ca href=\"#what-my-winbar-looks-like\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhat I have right now is everything someone who is watching would need to know\nto navigate to the same place that I am in the project.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e waylonwalker/app.py   Link \u0026gt;  on_click\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/d01f3307-6397-4fdf-a870-0165b331d186.webp\" class=\"glightbox-link\" aria-label=\"nvim-navic-example.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/d01f3307-6397-4fdf-a870-0165b331d186.webp\" alt=\"nvim-navic-example.webp\"/ data-glightbox=\"description: nvim-navic-example.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"diff\"\u003eDiff \u003ca href=\"#diff\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere are the changes that I made to to my plugins list and my lsp-config to get\nit.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e /home/u_walkews/.config/nvim/plugins.vim\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecall plug#begin(\u0026#39;~/.local/share/nvim/plugged\u0026#39;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+Plug \u0026#39;SmiteshP/nvim-navic\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#  /home/u_walkews/.config/nvim/lua/waylonwalker/lsp-config.lua\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gd\"\u003e-local function on_attach() end\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+local navic = require(\u0026#34;nvim-navic\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+local function on_attach(client, bufnr)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+    if client.server_capabilities.documentSymbolProvider then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+        navic.attach(client, bufnr)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+    end\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+end\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+vim.o.winbar = \u0026#34; %{%v:lua.vim.fn.expand(\u0026#39;%F\u0026#39;)%}  %{%v:lua.require\u0026#39;nvim-navic\u0026#39;.get_location()%}\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"gh-commit\"\u003eGH commit \u003ca href=\"#gh-commit\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you want to see the change on GitHub, here is the\n\u003ca href=\"https://github.com/WaylonWalker/devtainer/commit/62298a935d93a2cf21e1c965d323363bcbd22881\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003ediff\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/WaylonWalker/devtainer/commit/62298a935d93a2cf21e1c965d323363bcbd22881\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/5efbd396-2716-49d3-833b-3004f1726afe.webp\" alt=\"nvim-navic-setup-gh-diff.webp\"/ data-glightbox=\"description: nvim-navic-setup-gh-diff.webp\"\u003e\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nWith the latest release of version of nvim 0.8.0 we get access to a new winbar\nfeature.  One thing I have long wanted somewhere in my nvim is navigation for\npairing partners or anyone watching can keep track of where I am.  As the\ndriver it's easy to keep track of the file/function you are in.  But when you\nmake big jumps in a few keystrokes it can be quite disorienting to anyone\nwatching, and having this feedback to look at is very helpful.\n\n![\"cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality\" -s50 -W832 -H416 -C6.0 -Ak_lms -S2841371882](https://stable-diffusion.waylonwalker.com/000362.2841371882.webp)\n\n## winbar\n\nnvim exposes the winbar api in lua, and you can send any text to the winbar as follows.\n\n``` lua\nvim.o.winbar = \"here\"\n```\n\nYou can try it for yourself right from the nvim command line.\n\n``` vim\n:lua vim.o.winbar = \"here\"\n```\n\nNow you will notice one line above your file with the word `here` at the very\nbeginning.\n\n## Clearing the winbar\n\nIf you want to clear it out, you can just set it to an empty string or `nil`.\n\n``` vim\n:lua vim.o.winbar = \"\"\n:lua vim.o.winbar = nil\n```\n\n## Setting up nvim-navic\n\nYou will need to install `nvim-navic` if you want to use it.  I added it to my\nplugins using Plug as follows.\n\n``` vim\ncall plug#begin('~/.local/share/nvim/plugged')\nPlug 'SmiteshP/nvim-navic'\ncall plug#end()\n```\n\n\u003e Note! `nvim-navic` does require the use of the nvim lsp, so if you are not\n\u003e using it then maybe this won't work for you.\n\nI created an `on_attach` function long ago, cause that's what Teej told me to\ndo.  Now I am glad I did, because it made this change super easy.\n\n``` lua\nlocal function on_attach(client, bufnr)\n    if client.server_capabilities.documentSymbolProvider then\n        navic.attach(client, bufnr)\n    end\nend\n```\n\nThen you need to use that `on_attach` function on all of the lsp's that you\nwant navic to work on.\n\nThen in a lua file you need to setup the winbar, for now I put this in my\nlsp-config settings file, but eventually I want to move my settings to lua and\nput it there.\n\n``` lua\nvim.o.winbar = \" %{%v:lua.vim.fn.expand('%F')%}  %{%v:lua.require'nvim-navic'.get_location()%}\"\n```\n\n## What my winbar looks like\n\nWhat I have right now is everything someone who is watching would need to know\nto navigate to the same place that I am in the project.\n\n``` text\n waylonwalker/app.py   Link \u003e  on_click\n```\n\n![nvim-navic-example.webp](https://dropper.waylonwalker.com/api/file/d01f3307-6397-4fdf-a870-0165b331d186.webp)\n\n## Diff\n\nHere are the changes that I made to to my plugins list and my lsp-config to get\nit.\n\n```diff\n /home/u_walkews/.config/nvim/plugins.vim\ncall plug#begin('~/.local/share/nvim/plugged')\n+Plug 'SmiteshP/nvim-navic'\n```\n\n``` diff\n#  /home/u_walkews/.config/nvim/lua/waylonwalker/lsp-config.lua\n-local function on_attach() end\n+local navic = require(\"nvim-navic\")\n+local function on_attach(client, bufnr)\n+    if client.server_capabilities.documentSymbolProvider then\n+        navic.attach(client, bufnr)\n+    end\n+end\n+\n+vim.o.winbar = \" %{%v:lua.vim.fn.expand('%F')%}  %{%v:lua.require'nvim-navic'.get_location()%}\"\n```\n\n## GH commit\n\nIf you want to see the change on GitHub, here is the\n[diff](https://github.com/WaylonWalker/devtainer/commit/62298a935d93a2cf21e1c965d323363bcbd22881)\n\n[![nvim-navic-setup-gh-diff.webp](https://dropper.waylonwalker.com/api/file/5efbd396-2716-49d3-833b-3004f1726afe.webp)](https://github.com/WaylonWalker/devtainer/commit/62298a935d93a2cf21e1c965d323363bcbd22881)\n",
      "summary": "With the latest release of version of nvim 0.8.0 we get access to a new winbar feature. One thing I have long wanted somewhere in my nvim is navigation for...",
      "date_published": "2022-10-27T20:13:20Z",
      "date_modified": "2022-10-27T20:13:20Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "vim"
      ]
    },
    {
      "id": "https://waylonwalker.com/pipx-textual-devtools/",
      "url": "https://waylonwalker.com/pipx-textual-devtools/",
      "title": "pipx textual devtools",
      "content_html": "\u003cp\u003eI really like having global cli command installed with pipx.  Since textual\n\u003ccode\u003e0.2.x\u003c/code\u003e (the css release) is out I want to be able to pop into textual devtools\neasily from anywhere.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000359.2404332231.webp\" class=\"glightbox-link\" aria-label=\"“rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S2404332231\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000359.2404332231.webp\" alt=\"“rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S2404332231\"/ data-glightbox=\"description: “rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S2404332231\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"pipx-install\"\u003ePipx Install \u003ca href=\"#pipx-install\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou can pipx install textual.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipx install textual\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBut if you try to run any textual cli commands you will run into a\n\u003ccode\u003eModuleNotFoundError\u003c/code\u003e, because you need to install the optional \u003ccode\u003edev\u003c/code\u003e\ndependencies.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eTraceback\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emost\u003c/span\u003e \u003cspan class=\"n\"\u003erecent\u003c/span\u003e \u003cspan class=\"n\"\u003ecall\u003c/span\u003e \u003cspan class=\"n\"\u003elast\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003eFile\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/home/u_walkews/.local/bin/textual\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003emodule\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003etextual.cli.cli\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003erun\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003eFile\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/home/u_walkews/.local/pipx/venvs/textual/lib/python3.10/site-packages/textual/cli/cli.py\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003emodule\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003eclick\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ne\"\u003eModuleNotFoundError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eNo\u003c/span\u003e \u003cspan class=\"n\"\u003emodule\u003c/span\u003e \u003cspan class=\"n\"\u003enamed\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"pipx-inject\"\u003ePipx Inject \u003ca href=\"#pipx-inject\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn order to install optional dependencies with \u003ccode\u003epipx\u003c/code\u003e you need to first install\nthe library, then inject in the optional dependencies using the square bracket\nsyntax.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipx install textual\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipx inject textual \u003cspan class=\"s1\"\u003e\u0026#39;textual[dev]\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI really like having global cli command installed with pipx.  Since textual\n`0.2.x` (the css release) is out I want to be able to pop into textual devtools\neasily from anywhere.\n\n![\"rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality\" -s50 -W832 -H416 -C12.0 -Ak_lms -S2404332231](https://stable-diffusion.waylonwalker.com/000359.2404332231.webp)\n\n## Pipx Install\n\nYou can pipx install textual.\n\n``` bash\npipx install textual\n```\n\nBut if you try to run any textual cli commands you will run into a\n`ModuleNotFoundError`, because you need to install the optional `dev`\ndependencies.\n\n``` python\nTraceback (most recent call last):\n  File \"/home/u_walkews/.local/bin/textual\", line 5, in \u003cmodule\u003e\n    from textual.cli.cli import run\n  File \"/home/u_walkews/.local/pipx/venvs/textual/lib/python3.10/site-packages/textual/cli/cli.py\", line 4, in \u003cmodule\u003e\n    import click\nModuleNotFoundError: No module named 'click'\n```\n\n## Pipx Inject\n\nIn order to install optional dependencies with `pipx` you need to first install\nthe library, then inject in the optional dependencies using the square bracket\nsyntax.\n\n``` bash\npipx install textual\npipx inject textual 'textual[dev]'\n```\n",
      "summary": "I really like having global cli command installed with pipx. Since textual (the css release) is out I want to be able to pop into textual devtools easily...",
      "date_published": "2022-10-24T08:16:33Z",
      "date_modified": "2022-10-24T08:16:33Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/textual-app-devtools/",
      "url": "https://waylonwalker.com/textual-app-devtools/",
      "title": "textual app devtools",
      "content_html": "\u003cp\u003eI am working through the textual tutorial, and I want to put it in a proper cli\nthat I can pip install and run the command without \u003ccode\u003etextual run --dev app.py\u003c/code\u003e.\nThis is a fine pattern, but I also want this to work when I don’t have a file\nto run.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000221.3617210203.webp\" class=\"glightbox-link\" aria-label=\"“An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -S3617210203\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000221.3617210203.webp\" alt=\"“An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -S3617210203\"/ data-glightbox=\"description: “An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -S3617210203\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"pyprojecttoml-entrypoints\"\u003epyproject.toml entrypoints \u003ca href=\"#pyprojecttoml-entrypoints\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI set up a new project running \u003ccode\u003ehatch new\u003c/code\u003e, and added the following entrypoint,\ngiving me a \u003ccode\u003etutorial\u003c/code\u003e cli command to run.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eproject\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003escripts\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etutorial\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;textual_tutorial.tui:tui\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ca class=\"hoverlink\" href=\"https://waylonwalker.com/hatch-new-cli/\"\u003ehttps://waylonwalker.com/hatch-new-cli/\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"setuppy-entrypoints\"\u003esetup.py entrypoints \u003ca href=\"#setuppy-entrypoints\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you are using \u003ccode\u003esetup.py\u003c/code\u003e, you can set up entrypoints in the \u003ccode\u003esetup\u003c/code\u003e command.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003esetuptools\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003esetup\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esetup\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eentry_points\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;console_scripts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tutorial = textual_tutorial.tui:tui\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ca class=\"hoverlink\" href=\"https://waylonwalker.com/minimal-python-package/\"\u003ehttps://waylonwalker.com/minimal-python-package/\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"tuipy\"\u003etui.py \u003ca href=\"#tuipy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003eadding features\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eNow to get devtools through a cli without running through \u003ccode\u003etextual run --dev\u003c/code\u003e.\nI pulled open the textual cli source code, and this is what it does at the time\nof writing.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNote: I used sys.argv as a way to implement a \u003ccode\u003e--dev\u003c/code\u003e quickly tutorial. For a\nreal project, I’d setup argparse, click, or typer. \u003ccode\u003etyper\u003c/code\u003e is my go to these\ndays, unless I am really trying to limit dependencies, then the standard\nlibrary \u003ccode\u003eargparse\u003c/code\u003e might be what I go with.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003etui\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003etextual.features\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eparse_features\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003eos\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003esys\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edev\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;--dev\u0026#34;\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003esys\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eargv\u003c/span\u003e \u003cspan class=\"c1\"\u003e# this works, but putting it behind argparse, click, or typer would be much better\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efeatures\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eparse_features\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;TEXTUAL\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003edev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003efeatures\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;debug\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003efeatures\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;devtools\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;TEXTUAL\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;,\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003esorted\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efeatures\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eapp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eStopwatchApp\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"vm\"\u003e__name__\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;__main__\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etui\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"other-flags\"\u003eOther Flags??? \u003ca href=\"#other-flags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you look at the source, there is one other flag for \u003ccode\u003eheadless\u003c/code\u003e mode.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eFEATURES\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFinal\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;devtools\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;debug\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;headless\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"run-it\"\u003eRun it \u003ca href=\"#run-it\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere it is running with \u003ccode\u003etutorial --dev\u003c/code\u003e on the left, and \u003ccode\u003etextual console\u003c/code\u003e on\nthe right.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/01c4b236-fc55-4760-814a-d61d141ef1db.webp\" class=\"glightbox-link\" aria-label=\"textual-tutorial-devtools.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/01c4b236-fc55-4760-814a-d61d141ef1db.webp\" alt=\"textual-tutorial-devtools.webp\"/ data-glightbox=\"description: textual-tutorial-devtools.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nI am working through the textual tutorial, and I want to put it in a proper cli\nthat I can pip install and run the command without `textual run --dev app.py`.\nThis is a fine pattern, but I also want this to work when I don't have a file\nto run.\n\n![\"An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art\" -s50 -W768 -H448 -C7.5 -Ak_lms -S3617210203](https://stable-diffusion.waylonwalker.com/000221.3617210203.webp)\n\n## pyproject.toml entrypoints\n\nI set up a new project running `hatch new`, and added the following entrypoint,\ngiving me a `tutorial` cli command to run.\n\n```toml\n...\n\n[project.scripts]\ntutorial = 'textual_tutorial.tui:tui'\n```\n\n[https://waylonwalker.com/hatch-new-cli/](https://waylonwalker.com/hatch-new-cli/){.hoverlink}\n\n## setup.py entrypoints\n\nIf you are using `setup.py`, you can set up entrypoints in the `setup` command.\n\n```python\nfrom setuptools import setup\n\nsetup(\n    ...\n    entry_points={\n        \"console_scripts\": [\"tutorial = textual_tutorial.tui:tui\"],\n    },\n    ...\n)\n```\n\n[https://waylonwalker.com/minimal-python-package/](https://waylonwalker.com/minimal-python-package/){.hoverlink}\n\n## tui.py\n\n_adding features_\n\nNow to get devtools through a cli without running through `textual run --dev`.\nI pulled open the textual cli source code, and this is what it does at the time\nof writing.\n\n\u003e Note: I used sys.argv as a way to implement a `--dev` quickly tutorial. For a\n\u003e real project, I'd setup argparse, click, or typer. `typer` is my go to these\n\u003e days, unless I am really trying to limit dependencies, then the standard\n\u003e library `argparse` might be what I go with.\n\n```python\ndef tui():\n\n    from textual.features import parse_features\n    import os\n    import sys\n\n    dev = \"--dev\" in sys.argv # this works, but putting it behind argparse, click, or typer would be much better\n\n    features = set(parse_features(os.environ.get(\"TEXTUAL\", \"\")))\n    if dev:\n        features.add(\"debug\")\n        features.add(\"devtools\")\n\n    os.environ[\"TEXTUAL\"] = \",\".join(sorted(features))\n    app = StopwatchApp()\n    app.run()\n\n\nif __name__ == \"__main__\":\n    tui()\n```\n\n## Other Flags???\n\nIf you look at the source, there is one other flag for `headless` mode.\n\n```python\nFEATURES: Final = {\"devtools\", \"debug\", \"headless\"}\n```\n\n## Run it\n\nHere it is running with `tutorial --dev` on the left, and `textual console` on\nthe right.\n\n![textual-tutorial-devtools.webp](https://dropper.waylonwalker.com/api/file/01c4b236-fc55-4760-814a-d61d141ef1db.webp)\n",
      "summary": "I am working through the textual tutorial, and I want to put it in a proper cli that I can pip install and run the command without . This is a fine pattern,...",
      "date_published": "2022-10-24T07:42:48Z",
      "date_modified": "2022-10-24T07:42:48Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/obs-virtual-camera-on-boot/",
      "url": "https://waylonwalker.com/obs-virtual-camera-on-boot/",
      "title": "obs virtual camera on boot",
      "content_html": "\u003cp\u003eFor far too long I have had to fidget with v4l2oloopback after reboot.  I’ve\nhad this happen on ubuntu 18.04, 22.04, and arch.\u003c/p\u003e\n\u003cp\u003eAfter a reboot the start virtual camera button won’t work, It appears and is\nclickable, but never turns on.  Until I run this command.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo modprobe v4l2loopback \u003cspan class=\"nv\"\u003evideo_nr\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e10\u003c/span\u003e \u003cspan class=\"nv\"\u003ecard_label\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;OBS Video Source\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eexclusive_caps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000378.373882614.webp\" class=\"glightbox-link\" aria-label=\"“cell shaded, long, full body, shot of a cybernetic blue soldier with glowing pink eyes looking into a selfie camera with ring light, llustration, post grunge, 4 k, warm colors, cinematic dramatic atmosphere, sharp focus, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C12.0 -Ak_lms -S373882614\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000378.373882614.webp\" alt=\"“cell shaded, long, full body, shot of a cybernetic blue soldier with glowing pink eyes looking into a selfie camera with ring light, llustration, post grunge, 4 k, warm colors, cinematic dramatic atmosphere, sharp focus, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C12.0 -Ak_lms -S373882614 \"/ data-glightbox=\"description: “cell shaded, long, full body, shot of a cybernetic blue soldier with glowing pink eyes looking into a selfie camera with ring light, llustration, post grunge, 4 k, warm colors, cinematic dramatic atmosphere, sharp focus, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C12.0 -Ak_lms -S373882614\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eToday I learned that you can turn on kernel modules through some files in \u003ccode\u003e/etc/modules...\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eThis is what I did to my arch system to get it to work right after boot.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;v4l2loopback\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e sudo tee /etc/modules-load.d/v4l2loopback.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;options v4l2loopback video_nr=10 card_label=\\\u0026#34;OBS Video Source\\\u0026#34; exclusive_caps=1\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e sudo tee /etc/modprobe.d/v4l2loopback.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nFor far too long I have had to fidget with v4l2oloopback after reboot.  I've\nhad this happen on ubuntu 18.04, 22.04, and arch.\n\nAfter a reboot the start virtual camera button won't work, It appears and is\nclickable, but never turns on.  Until I run this command.\n\n``` bash\nsudo modprobe v4l2loopback video_nr=10 card_label=\"OBS Video Source\" exclusive_caps=1\n```\n\n![\"cell shaded, long, full body, shot of a cybernetic blue soldier with glowing pink eyes looking into a selfie camera with ring light, llustration, post grunge, 4 k, warm colors, cinematic dramatic atmosphere, sharp focus, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\" -s50 -W832 -H416 -C12.0 -Ak_lms -S373882614 ](https://stable-diffusion.waylonwalker.com/000378.373882614.webp)\n\nToday I learned that you can turn on kernel modules through some files in `/etc/modules...`\n\nThis is what I did to my arch system to get it to work right after boot.\n\n``` bash\necho \"v4l2loopback\" | sudo tee /etc/modules-load.d/v4l2loopback.conf\necho \"options v4l2loopback video_nr=10 card_label=\\\"OBS Video Source\\\" exclusive_caps=1\" | sudo tee /etc/modprobe.d/v4l2loopback.conf\n```\n",
      "summary": "For far too long I have had to fidget with v4l2oloopback after reboot. I've had this happen on ubuntu 18.04, 22.04, and arch.",
      "date_published": "2022-10-18T08:34:25Z",
      "date_modified": "2022-10-18T08:34:25Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/localstack-status-permission/",
      "url": "https://waylonwalker.com/localstack-status-permission/",
      "title": "localstack status permission",
      "content_html": "\u003cp\u003eI ran into an issue where I was unable to ask localstack for its status. I\nwould run the command and it would tell me that it didn’t have permission to\nread files from my own home directory.  Let’s fix it\u003c/p\u003e\n\u003ch2 id=\"the-issue\"\u003eThe issue \u003ca href=\"#the-issue\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI would run this to ask for the status.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elocalstack status\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd get this error\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePermissionError: \u003cspan class=\"o\"\u003e[\u003c/span\u003eErrno 13\u003cspan class=\"o\"\u003e]\u003c/span\u003e Permission denied: \u003cspan class=\"s1\"\u003e\u0026#39;/home/waylon/.cache/localstack/image_metadata\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"what-happened\"\u003eWhat happened \u003ca href=\"#what-happened\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIt dawned on me that the first time I ran localstack was straight docker, not\nthe python cli.  When docker runs it typically runs as root unless the\nDockerfile sets up a user and group for it.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000364.3517264680.webp\" class=\"glightbox-link\" aria-label=\"“cell shaded, long, full body, shot of a cybernetic blue soldier with glowing pink eyes, llustration, post grunge, cinebatic dramatic atmosphere, sharp focus, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C12.0 -Ak_lms -S3517264680\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000364.3517264680.webp\" alt=\"“cell shaded, long, full body, shot of a cybernetic blue soldier with glowing pink eyes, llustration, post grunge, cinebatic dramatic atmosphere, sharp focus, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C12.0 -Ak_lms -S3517264680 \"/ data-glightbox=\"description: “cell shaded, long, full body, shot of a cybernetic blue soldier with glowing pink eyes, llustration, post grunge, cinebatic dramatic atmosphere, sharp focus, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C12.0 -Ak_lms -S3517264680\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"how-to-fix-it\"\u003eHow to fix it \u003ca href=\"#how-to-fix-it\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you have sudo access to the machine you are on you can recursively change\nownership to your user and group.  I chose to just give myself ownership of my\nwhole \u003ccode\u003e~/.cache directory\u003c/code\u003e you could choose a deeper directory if you want.  I\nfeel pretty safe giving myself ownership to my own cache directory on my own\nmachine.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewhoami\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# waylon\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echown -R waylon:waylon ~/.cache\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"now-its-working\"\u003eNow it’s working \u003ca href=\"#now-its-working\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRunning localstack status now gives me a nice status message rather than an\nerror.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ localstack status\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e┌─────────────────┬───────────────────────────────────────────────────────┐\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ Runtime version │ 1.2.1.dev                                             │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ Docker image    │ tag: latest, id: dbbfe0ce0008, 📆 2022-10-15T00:51:03 │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ Runtime status  │ ✖ stopped                                             │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└─────────────────┴───────────────────────────────────────────────────────┘\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI ran into an issue where I was unable to ask localstack for its status. I\nwould run the command and it would tell me that it didn't have permission to\nread files from my own home directory.  Let's fix it\n\n## The issue\n\nI would run this to ask for the status.\n\n``` bash\nlocalstack status\n```\n\nAnd get this error\n\n``` bash\nPermissionError: [Errno 13] Permission denied: '/home/waylon/.cache/localstack/image_metadata'\n```\n\n## What happened\n\nIt dawned on me that the first time I ran localstack was straight docker, not\nthe python cli.  When docker runs it typically runs as root unless the\nDockerfile sets up a user and group for it.\n\n![\"cell shaded, long, full body, shot of a cybernetic blue soldier with glowing pink eyes, llustration, post grunge, cinebatic dramatic atmosphere, sharp focus, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\" -s50 -W832 -H416 -C12.0 -Ak_lms -S3517264680 ](https://stable-diffusion.waylonwalker.com/000364.3517264680.webp)\n\n## How to fix it\n\nIf you have sudo access to the machine you are on you can recursively change\nownership to your user and group.  I chose to just give myself ownership of my\nwhole `~/.cache directory` you could choose a deeper directory if you want.  I\nfeel pretty safe giving myself ownership to my own cache directory on my own\nmachine.\n\n``` bash\nwhoami\n# waylon\n\nchown -R waylon:waylon ~/.cache\n```\n\n## Now it's working\n\nRunning localstack status now gives me a nice status message rather than an\nerror.\n\n``` bash\n❯ localstack status\n┌─────────────────┬───────────────────────────────────────────────────────┐\n│ Runtime version │ 1.2.1.dev                                             │\n│ Docker image    │ tag: latest, id: dbbfe0ce0008, 📆 2022-10-15T00:51:03 │\n│ Runtime status  │ ✖ stopped                                             │\n└─────────────────┴───────────────────────────────────────────────────────┘\n```\n",
      "summary": "I ran into an issue where I was unable to ask localstack for its status. I would run the command and it would tell me that it didn't have permission to read...",
      "date_published": "2022-10-17T08:55:26Z",
      "date_modified": "2022-10-17T08:55:26Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "aws",
        "cloud"
      ]
    },
    {
      "id": "https://waylonwalker.com/markata-supports-jinja-plugins-0-5-0-dev2/",
      "url": "https://waylonwalker.com/markata-supports-jinja-plugins-0-5-0-dev2/",
      "title": "Markata Supports Jinja Plugins 0.5.0.dev2",
      "content_html": "\u003cp\u003eMarkata now allows you to create jinja extensions that will be loaded right in\nwith nothing more than a \u003ccode\u003epip install\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"from-the-changelog\"\u003eFrom the Changelog \u003ca href=\"#from-the-changelog\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe entry for 0.5.0.dev2 from markata’s \u003ca href=\"https://markata.dev/changelog/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/markata.dev.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/markata.dev.ico\" class=\"has-avatar  has-avatar-before\"\u003echangelog\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCreated entrypoint hook allowing for users to extend marka with jinja\nexensions #60 0.5.0.dev2\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://stable-diffusion.waylonwalker.com/000368.1808537114.webp\" class=\"glightbox-link\" aria-label=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S1808537114\"\u003e\u003cimg src=\"https://stable-diffusion.waylonwalker.com/000368.1808537114.webp\" alt=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S1808537114\" class=\"more-cinematic glightbox\"/ data-glightbox=\"description: “cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S1808537114\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"markata-gh\"\u003emarkata-gh \u003ca href=\"#markata-gh\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe first example that you can use right now is \u003ccode\u003emarkata-gh\u003c/code\u003e.  It will render\nrepos by GitHub topic and user using the gh cli, which is available in github\nactions!\u003c/p\u003e\n\u003cp\u003eGet it with a pip install\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install markata-gh\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse it with some jinja in your markdown.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Markata plugins\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIt uses the logged in uer by default.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% gh_repo_list_topic \u0026#34;markata\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eYou can more explicitly grab your username, and a topic.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% gh_repo_list_topic \u0026#34;waylonwalker\u0026#34;, \u0026#34;personal-website\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"how-is-this-achieved\"\u003eHow is this achieved \u003ca href=\"#how-is-this-achieved\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe jinja extension details are for another post, but this is how \u003ccode\u003emarkata-gh\u003c/code\u003e\nexposes itslef as a jinja extension.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eGhRepoListTopic\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eExtension\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etags\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;gh_repo_list_topic\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"fm\"\u003e__init__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003esuper\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"fm\"\u003e__init__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eparse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eparser\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eline_number\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003enext\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eparser\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estream\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elineno\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eargs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eparser\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eparse_tuple\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eitems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eexcept\u003c/span\u003e \u003cspan class=\"ne\"\u003eAttributeError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eraise\u003c/span\u003e \u003cspan class=\"ne\"\u003eAttributeError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s2\"\u003e\u0026#34;Invalid Syntax gh_repo_list_topic expects \u0026lt;username\u0026gt;, or \u0026lt;username\u0026gt;,\u0026lt;topic\u0026gt; both must have the comma\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003enodes\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCallBlock\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecall_method\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;run\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"p\"\u003e[],\u003c/span\u003e \u003cspan class=\"p\"\u003e[],\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eset_lineno\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eline_number\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etopic\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecaller\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;get\u0026#39;s markdown to inject into post\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003erepo_md\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etopic\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003etopic\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000368.2487720618.webp\" class=\"glightbox-link\" aria-label=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S2487720618\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000368.2487720618.webp\" alt=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S2487720618 \"/ data-glightbox=\"description: “cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S2487720618\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"entrypoints\"\u003eEntrypoints \u003ca href=\"#entrypoints\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThen \u003ccode\u003emarkata-gh\u003c/code\u003e exposes itself as an extension through entrypoints.\u003c/p\u003e\n\u003ch3 id=\"creating-entrypoints-in-pyprojecttoml\"\u003eCreating entrypoints in pyproject.toml \u003ca href=\"#creating-entrypoints-in-pyprojecttoml\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf your project is using \u003ccode\u003epyproject.toml\u003c/code\u003e for packaging you can setup an\nentrypoint as follows.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eproject\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eentry-points\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;markata.jinja_md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkta_gh\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata_gh.repo_list:GhRepoListTopic\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"creating-entrypoints-in-setuppy\"\u003eCreating entrypoints in setup.py \u003ca href=\"#creating-entrypoints-in-setuppy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf your project is using \u003ccode\u003esetup.py\u003c/code\u003e for packaging you can setup an\nentrypoint as follows.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esetup\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eentry_points\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;markata.jinja_md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;markta_gh\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata_gh.repo_list:GhRepoListTopic\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000368.655826089.webp\" class=\"glightbox-link\" aria-label=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S655826089\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000368.655826089.webp\" alt=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S655826089\"/ data-glightbox=\"description: “cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S655826089\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nMarkata now allows you to create jinja extensions that will be loaded right in\nwith nothing more than a `pip install`.\n\n## From the Changelog\n\nThe entry for 0.5.0.dev2 from markata's [changelog](https://markata.dev/changelog/)\n\n* Created entrypoint hook allowing for users to extend marka with jinja\n  exensions #60 0.5.0.dev2\n\n![\"cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality\" -s50 -W832 -H416 -C12.0 -Ak_lms -S1808537114](https://stable-diffusion.waylonwalker.com/000368.1808537114.webp){.more-cinematic}\n\n## markata-gh\n\nThe first example that you can use right now is `markata-gh`.  It will render\nrepos by GitHub topic and user using the gh cli, which is available in github\nactions!\n\nGet it with a pip install\n\n``` bash\npip install markata-gh\n```\n\nUse it with some jinja in your markdown.\n\n``` markdown\n## Markata plugins\n\nIt uses the logged in uer by default.\n\n{% gh_repo_list_topic \"markata\" %}\n\nYou can more explicitly grab your username, and a topic.\n{% gh_repo_list_topic \"waylonwalker\", \"personal-website\" %}\n```\n\n## How is this achieved\n\nThe jinja extension details are for another post, but this is how `markata-gh`\nexposes itslef as a jinja extension.\n\n``` python\nclass GhRepoListTopic(Extension):\n    tags = {\"gh_repo_list_topic\"}\n\n    def __init__(self, environment):\n        super().__init__(environment)\n\n    def parse(self, parser):\n        line_number = next(parser.stream).lineno\n        try:\n            args = parser.parse_tuple().items\n        except AttributeError:\n            raise AttributeError(\n                \"Invalid Syntax gh_repo_list_topic expects \u003cusername\u003e, or \u003cusername\u003e,\u003ctopic\u003e both must have the comma\"\n            )\n\n        return nodes.CallBlock(self.call_method(\"run\", args), [], [], \"\").set_lineno(\n            line_number\n        )\n\n    def run(self, username=None, topic=None, caller=None):\n        \"get's markdown to inject into post\"\n        return repo_md(username=username, topic=topic)\n```\n\n![\"cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality\" -s50 -W832 -H416 -C12.0 -Ak_lms -S2487720618 ](https://stable-diffusion.waylonwalker.com/000368.2487720618.webp)\n\n## Entrypoints\n\nThen `markata-gh` exposes itself as an extension through entrypoints.\n\n### Creating entrypoints in pyproject.toml\n\nIf your project is using `pyproject.toml` for packaging you can setup an\nentrypoint as follows.\n\n``` toml\n[project.entry-points.\"markata.jinja_md\"]\nmarkta_gh = \"markata_gh.repo_list:GhRepoListTopic\"\n```\n\n## Creating entrypoints in setup.py\n\nIf your project is using `setup.py` for packaging you can setup an\nentrypoint as follows.\n\n``` python\nsetup(\n    ...\n    entry_points={\n        \"markata.jinja_md\": [\"markta_gh\" = \"markata_gh.repo_list:GhRepoListTopic\"]\n    },\n    ...\n)\n```\n\n![\"cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality\" -s50 -W832 -H416 -C12.0 -Ak_lms -S655826089](https://stable-diffusion.waylonwalker.com/000368.655826089.webp)\n",
      "summary": "Markata now allows you to create jinja extensions that will be loaded right in with nothing more than a .",
      "date_published": "2022-10-11T14:34:35Z",
      "date_modified": "2022-10-11T14:34:35Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "markata",
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/django-rest-framework-getting-started/",
      "url": "https://waylonwalker.com/django-rest-framework-getting-started/",
      "title": "Getting Started with Django REST framework",
      "content_html": "\u003cp\u003eIn my adventure to learn django, I want to be able to setup REST api’s to feed\ninto dynamic front end sites. Potentially sites running react under the hood.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000327.4270306418.webp\" class=\"glightbox-link\" aria-label=\"cell shaded full body shot of a cybernetic blue soldier with glowing eyes working ina lab, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\u0026amp;#34; -s50 -W832 -H416 -C18.0 -Ak_lms -S4270306418\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000327.4270306418.webp\" alt=\"cell shaded full body shot of a cybernetic blue soldier with glowing eyes working ina lab, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\u0026#34; -s50 -W832 -H416 -C18.0 -Ak_lms -S4270306418\"/ data-glightbox=\"description: cell shaded full body shot of a cybernetic blue soldier with glowing eyes working ina lab, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\u0026#34; -s50 -W832 -H416 -C18.0 -Ak_lms -S4270306418\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"install\"\u003eInstall \u003ca href=\"#install\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTo get started lets open up a \u003ccode\u003etodo\u003c/code\u003e app that I created with \u003ccode\u003edjango-admin startproject todo\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install djangorestframework\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"install-app\"\u003eInstall APP \u003ca href=\"#install-app\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow we need to declare \u003ccode\u003erest_framwork\u003c/code\u003e as an \u003ccode\u003eINSTALLED_APP\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eINSTALLED_APPS\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;rest_framework\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"create-the-api-app\"\u003ecreate the api app \u003ca href=\"#create-the-api-app\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNext I will create all the files that I need to get the api running.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir api\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etouch api/__init__.py api/serializers.py api/urls.py api/views.py\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000323.3862698977.webp\" class=\"glightbox-link\" aria-label=\"cell shaded full body shot of a cybernetic blue soldier with glowing eyes working ina lab, llustration, post grunge, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\u0026amp;#34; -s50 -W832 -H416 -C7.5 -Ak_lms -S3862698977\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000323.3862698977.webp\" alt=\"cell shaded full body shot of a cybernetic blue soldier with glowing eyes working ina lab, llustration, post grunge, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\u0026#34; -s50 -W832 -H416 -C7.5 -Ak_lms -S3862698977\"/ data-glightbox=\"description: cell shaded full body shot of a cybernetic blue soldier with glowing eyes working ina lab, llustration, post grunge, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\u0026#34; -s50 -W832 -H416 -C7.5 -Ak_lms -S3862698977\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"basemodelspy\"\u003ebase/models.py \u003ca href=\"#basemodelspy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI already have the following model from last time I was playing with django. It\nwill suffice as it is not the focus of what I am learning for now.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNote the name of the model class is singular, this is becuase django will\nautomatically pluralize it in places like the admin panel, and you would end\nup with Itemss.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003edjango.db\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003emodels\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create your models here.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eItem\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emodels\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eModel\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003emodels\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCharField\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emax_length\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecreated\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003emodels\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTimeField\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eauto_now_add\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"fm\"\u003e__str__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epriority\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNext I will make some dummy data to be able to return. I popped open \u003ccode\u003eipython\u003c/code\u003e\nand made a few records.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003ebase.models\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eItem\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eItem\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eobjects\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecreate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;first\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eItem\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eobjects\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecreate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;second\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eItem\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eobjects\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecreate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;third\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"apiserializerspy\"\u003eapi/serializers.py \u003ca href=\"#apiserializerspy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNext we need to set up a serializer to seriaze and de-serialize data between\nour model and json. You can specify each field individually or all of them by\npassing in \u003ccode\u003e__all__\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003erest_framework\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eserializers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003ebase.models\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eItem\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eItemSerializer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eserializers\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eModelSerializer\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eMeta\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003emodel\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eItem\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003efields\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;__all__\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"apiviewspy\"\u003eapi/views.py \u003ca href=\"#apiviewspy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000340.2111691103.webp\" class=\"glightbox-link\" aria-label=\"“cell shaded full body shot of a shiny golden cybernetic soldier with glowing eyes looking through binoculars, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C18.0 -Ak_lms -S2111691103 cell shaded full body shot of a shiny golden cybernetic soldier with glowing eyes looking through binoculars, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem command\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000340.2111691103.webp\" alt=\"“cell shaded full body shot of a shiny golden cybernetic soldier with glowing eyes looking through binoculars, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C18.0 -Ak_lms -S2111691103 cell shaded full body shot of a shiny golden cybernetic soldier with glowing eyes looking through binoculars, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem command \"/ data-glightbox=\"description: “cell shaded full body shot of a shiny golden cybernetic soldier with glowing eyes looking through binoculars, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C18.0 -Ak_lms -S2111691103 cell shaded full body shot of a shiny golden cybernetic soldier with glowing eyes looking through binoculars, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem command\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eNow we need a view leveraging the \u003ccode\u003edjangorestframework\u003c/code\u003e. The serializer we\njust created will be used to serialize all of the rows into a list of objects\nthat Response can handle.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNote: to return a collection of model objects we need to set many to \u003ccode\u003eTrue\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003erest_framework.decorators\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eapi_view\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003erest_framework.response\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003ebase.models\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eItem\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003e.serializers\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eItemSerializer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@api_view\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;GET\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_data\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eitems\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eItem\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eobjects\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eserializer\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eItemSerializer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eitems\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003emany\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eserializer\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@api_view\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;POST\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eadd_item\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eserializer\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eItemSerializer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edata\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eserializer\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eis_valid\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eserializer\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esave\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"apiurlspy\"\u003eapi/urls.py \u003ca href=\"#apiurlspy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000341.192089936.webp\" class=\"glightbox-link\" aria-label=\"“cell shaded full body shot of a shiny golden cybernetic soldier with glowing eyes looking at a map, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C18.0 -Ak_lms -S192089936\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000341.192089936.webp\" alt=\"“cell shaded full body shot of a shiny golden cybernetic soldier with glowing eyes looking at a map, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C18.0 -Ak_lms -S192089936 \"/ data-glightbox=\"description: “cell shaded full body shot of a shiny golden cybernetic soldier with glowing eyes looking at a map, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C18.0 -Ak_lms -S192089936\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eNow we need to setup routing to access the views through an url.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003edjango.urls\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003epath\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003e.\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eviews\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eurlpatterns\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eviews\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget_data\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;add/\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eviews\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd_item\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"todourlspy\"\u003etodo/urls.py \u003ca href=\"#todourlspy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThen we need to include these urls from our api in the urls specified by \u003ccode\u003esettings.ROOT_URLCONf\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003edjango.urls\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003epath\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eurlpatterns\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;api/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003einclude\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;api.urls\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"run-it\"\u003eRun it \u003ca href=\"#run-it\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epython\u003c/span\u003e \u003cspan class=\"n\"\u003emanage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epy\u003c/span\u003e \u003cspan class=\"n\"\u003erunserver\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRunning the developement server and going to \u003ccode\u003elocalhost:8000/api\u003c/code\u003e we can see\nthe full list of items in th api.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/1142afab-b71f-474d-bf5c-27bd2a01309b.webp\" class=\"glightbox-link\" aria-label=\"djangorestframework-get-items.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/1142afab-b71f-474d-bf5c-27bd2a01309b.webp\" alt=\"djangorestframework-get-items.webp\"/ data-glightbox=\"description: djangorestframework-get-items.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nIn my adventure to learn django, I want to be able to setup REST api's to feed\ninto dynamic front end sites. Potentially sites running react under the hood.\n\n![cell shaded full body shot of a cybernetic blue soldier with glowing eyes working ina lab, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\" -s50 -W832 -H416 -C18.0 -Ak_lms -S4270306418](https://stable-diffusion.waylonwalker.com/000327.4270306418.webp)\n\n## Install\n\nTo get started lets open up a `todo` app that I created with `django-admin startproject todo`.\n\n```bash\npip install djangorestframework\n```\n\n## Install APP\n\nNow we need to declare `rest_framwork` as an `INSTALLED_APP`.\n\n```bash\nINSTALLED_APPS = [\n    ...\n    \"rest_framework\",\n    ...\n]\n```\n\n## create the api app\n\nNext I will create all the files that I need to get the api running.\n\n```bash\nmkdir api\ntouch api/__init__.py api/serializers.py api/urls.py api/views.py\n```\n\n![cell shaded full body shot of a cybernetic blue soldier with glowing eyes working ina lab, llustration, post grunge, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\" -s50 -W832 -H416 -C7.5 -Ak_lms -S3862698977](https://stable-diffusion.waylonwalker.com/000323.3862698977.webp)\n\n## base/models.py\n\nI already have the following model from last time I was playing with django. It\nwill suffice as it is not the focus of what I am learning for now.\n\n\u003e Note the name of the model class is singular, this is becuase django will\n\u003e automatically pluralize it in places like the admin panel, and you would end\n\u003e up with Itemss.\n\n```python\nfrom django.db import models\n\n# Create your models here.\n\nclass Item(models.Model):\n    name = models.CharField(max_length=200)\n    created = models.DateTimeField(auto_now_add=True)\n\n    def __str__(self):\n        return f\"{self.priority} {self.name}\"\n```\n\nNext I will make some dummy data to be able to return. I popped open `ipython`\nand made a few records.\n\n```python\nfrom base.models import Item\n\nItem.objects.create(name='first')\nItem.objects.create(name='second')\nItem.objects.create(name='third')\n```\n\n## api/serializers.py\n\nNext we need to set up a serializer to seriaze and de-serialize data between\nour model and json. You can specify each field individually or all of them by\npassing in `__all__`.\n\n```python\nfrom rest_framework import serializers\n\nfrom base.models import Item\n\n\nclass ItemSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = Item\n        fields = '__all__'\n```\n\n## api/views.py\n\n![\"cell shaded full body shot of a shiny golden cybernetic soldier with glowing eyes looking through binoculars, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\" -s50 -W832 -H416 -C18.0 -Ak_lms -S2111691103 cell shaded full body shot of a shiny golden cybernetic soldier with glowing eyes looking through binoculars, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem command ](https://stable-diffusion.waylonwalker.com/000340.2111691103.webp)\n\nNow we need a view leveraging the `djangorestframework`. The serializer we\njust created will be used to serialize all of the rows into a list of objects\nthat Response can handle.\n\n\u003e Note: to return a collection of model objects we need to set many to `True`\n\n```python\nfrom rest_framework.decorators import api_view\nfrom rest_framework.response import Response\n\nfrom base.models import Item\n\nfrom .serializers import ItemSerializer\n\n\n@api_view([\"GET\"])\ndef get_data(request):\n    items = Item.objects.all()\n    serializer = ItemSerializer(items, many=True)\n    return Response(serializer.data)\n\n@api_view(['POST'])\ndef add_item(request):\n    serializer = ItemSerializer(data = request.data)\n    if serializer.is_valid():\n        serializer.save()\n    return Response()\n\n```\n\n## api/urls.py\n\n![\"cell shaded full body shot of a shiny golden cybernetic soldier with glowing eyes looking at a map, llustration, post grunge, pink glowing volumetric lighting, engulfed in smoke and fog, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\" -s50 -W832 -H416 -C18.0 -Ak_lms -S192089936 ](https://stable-diffusion.waylonwalker.com/000341.192089936.webp)\n\nNow we need to setup routing to access the views through an url.\n\n```python\nfrom django.urls import path\n\nfrom . import views\n\nurlpatterns = [\n        path('', views.get_data),\n        path('add/', views.add_item),\n        ]\n```\n\n## todo/urls.py\n\nThen we need to include these urls from our api in the urls specified by `settings.ROOT_URLCONf`\n\n```python\nfrom django.urls import path\n\nurlpatterns = [\n    ...\n    path(\"api/\", include(\"api.urls\")),\n]\n```\n\n## Run it\n\n```python\npython manage.py runserver\n```\n\nRunning the developement server and going to `localhost:8000/api` we can see\nthe full list of items in th api.\n\n![djangorestframework-get-items.webp](https://dropper.waylonwalker.com/api/file/1142afab-b71f-474d-bf5c-27bd2a01309b.webp)\n",
      "summary": "In my adventure to learn django, I want to be able to setup REST api's to feed into dynamic front end sites. Potentially sites running react under the hood.",
      "date_published": "2022-10-09T15:57:37Z",
      "date_modified": "2022-10-09T15:57:37Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "django",
        "python",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/markata-now-uses-hatch/",
      "url": "https://waylonwalker.com/markata-now-uses-hatch/",
      "title": "Markata now uses hatch",
      "content_html": "\u003cp\u003eMarkata now uses hatch as its build backend, and version bumping tool.\n\u003ccode\u003esetup.py\u003c/code\u003e, and \u003ccode\u003esetup.cfg\u003c/code\u003e are completely gone.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://stable-diffusion.waylonwalker.com/000136.4048189038.webp\" class=\"glightbox-link\" aria-label=\"“An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk trending on artstation, neon lighting, volumetric lighting, pink lighting” -s50 -W800 -H450 -C7.5 -Ak_lms -S4048189038\"\u003e\u003cimg src=\"https://stable-diffusion.waylonwalker.com/000136.4048189038.webp\" alt=\"“An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk trending on artstation, neon lighting, volumetric lighting, pink lighting” -s50 -W800 -H450 -C7.5 -Ak_lms -S4048189038\" class=\"more-cinematic glightbox\"/ data-glightbox=\"description: “An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk trending on artstation, neon lighting, volumetric lighting, pink lighting” -s50 -W800 -H450 -C7.5 -Ak_lms -S4048189038\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"050-is-big\"\u003e0.5.0 is big \u003ca href=\"#050-is-big\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMarkata 0.5.0 is now out, and it’s huge.  Even though it’s the backend of this\nblog I don’t actually have that many posts directly about it.  I’ve used it a\nbit for blog fuel in generic ways, like talking about pluggy and diskcache, but\nvery little have I even mentioned it.\u003c/p\u003e\n\u003cp\u003eOver the last month I made a big push to get 0.5.0 out, which adds a whole\nbunch of new configurability to \u003ccode\u003emarkata\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eHere’s the \u003ca href=\"https://markata.dev/changelog/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/markata.dev.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/markata.dev.ico\" class=\"has-avatar  has-avatar-before\"\u003echangelog\u003c/a\u003e entry.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cul\u003e\n\u003cli\u003eMoved to PEP 517 build #59 0.5.0.dev1\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"my-personal-simple-cicd\"\u003eMy Personal Simple CI/CD \u003ca href=\"#my-personal-simple-cicd\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBefore cutting all of my personal projects over to hatch.  The first thing I\ndid was to setup a solid github action,\n\u003ca href=\"https://github.com/WaylonWalker/hatch-action\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003ehatch-action\u003c/a\u003ethat I can resue.\u003c/p\u003e\n\u003cp\u003eIt automatically bumps versions, using pre-releases on all branches other than\nmain, with special branches for bumping major, minor, patch, dev, alha, beta,\nand dev.\u003c/p\u003e\n\u003ch2 id=\"hatch-new---init\"\u003ehatch new –init \u003ca href=\"#hatch-new---init\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTo convert the project over to hatch, and get rid of setup.py/setup.cfg, I ran\n\u003ccode\u003ehatch new --init\u003c/code\u003e.  This automatically grabs all the metadata for the project\nand makes a \u003ccode\u003epyproject.toml\u003c/code\u003e that has most of what I need.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehatch new --init\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI then manually moved over my isort config, put flake8 config into \u003ccode\u003e.flake8\u003c/code\u003e,\nand dropped setup.cfg.\u003c/p\u003e\n\u003ch2 id=\"lint-test\"\u003elint-test \u003ca href=\"#lint-test\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePart of my hatch-action is to run a \u003ccode\u003ebefore-command\u003c/code\u003e, for markata, this runs\nall of my linting and testing in one hatch script called \u003ccode\u003elint-test\u003c/code\u003e.  If this\nfails CI will fail and I can read the report in the logs, make a fix and\nre-publish.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehatch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenvs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003escripts\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecov\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=markata --cov=tests\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eno-cov\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cov --no-cov\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;flake8 markata\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;black --check markata\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort-imports\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;isort markata\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebuild-docs\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elint-test\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"s2\"\u003e\u0026#34;lint\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"s2\"\u003e\u0026#34;format\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"s2\"\u003e\u0026#34;seed-isort-config\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sort-imports\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cov\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etest-lint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;lint-test\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"typical-branching-workflow\"\u003eTypical branching workflow \u003ca href=\"#typical-branching-workflow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003ewith automatic versioning\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eMy typical workflow is to work on features in their own branch where they do\nnot automatically version or publish, they keep the same version they were\nbranched off of.  Then I do a pr to develop, which will do a \u003ccode\u003eminor,dev\u003c/code\u003e bump\nand publish a pre-relese to pypi.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# starting with version 0.0.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFeature1 -- │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFeature2 -- ├── dev 0.1.0.dev1,2,3 ── main 0.1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFeature3 -- │\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI will let several features collect in develop before cutting a full relese\nover to main.  This gives me time to make sure the solution is what makes the\nmost sense, I try to use it in a few projects, and generally its edges show,\nand another pr is warranted to make the feature useful for more use cases.\nAfter running and using these new releases in a few projects, I am confident\nthat its ready and release to main.\u003c/p\u003e\n\u003ch3 id=\"managing-prs\"\u003emanaging prs \u003ca href=\"#managing-prs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDoing PR’s with gh, probably deserves its own post but here are some helpful\ncommands.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egh pr create --base develop --fill\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egh pr edit\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egh pr diff \u003cspan class=\"p\"\u003e|\u003c/span\u003e dunk\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egh pr merge -ds\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"building-and-publishing\"\u003eBuilding and publishing \u003ca href=\"#building-and-publishing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000221.3512493435.webp\" class=\"glightbox-link\" aria-label=\"“An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -S3512493435\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000221.3512493435.webp\" alt=\"“An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -S3512493435\"/ data-glightbox=\"description: “An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -S3512493435\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003ehatch makes building and publishing pretty straightforward.  It’s one command\ninside my hatch-action to build and one to publish.  On each project that uses\nmy hatch-action I only need to give it a token that I get from PyPi.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eHATCH_INDEX_USER\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e__token__\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eHATCH_INDEX_AUTH\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.pypi_password }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"full-set-of-changes\"\u003eFull set of changes \u003ca href=\"#full-set-of-changes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you want to see all of the details on how markata moved over to hatch, you can check out this diff.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/WaylonWalker/markata/compare/v0.4.0..v0.5.0.dev0\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003ehttps://github.com/WaylonWalker/markata/compare/v0.4.0..v0.5.0.dev0\u003c/a\u003e\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000224.2409791448.webp\" class=\"glightbox-link\" aria-label=\"“An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -U 4.0 0.6 -S2409791448\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000224.2409791448.webp\" alt=\"“An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -U 4.0 0.6 -S2409791448 \"/ data-glightbox=\"description: “An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -U 4.0 0.6 -S2409791448\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nMarkata now uses hatch as its build backend, and version bumping tool.\n`setup.py`, and `setup.cfg` are completely gone.\n\n![\"An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk trending on artstation, neon lighting, volumetric lighting, pink lighting\" -s50 -W800 -H450 -C7.5 -Ak_lms -S4048189038](https://stable-diffusion.waylonwalker.com/000136.4048189038.webp){.more-cinematic}\n\n## 0.5.0 is big\n\nMarkata 0.5.0 is now out, and it's huge.  Even though it's the backend of this\nblog I don't actually have that many posts directly about it.  I've used it a\nbit for blog fuel in generic ways, like talking about pluggy and diskcache, but\nvery little have I even mentioned it.\n\nOver the last month I made a big push to get 0.5.0 out, which adds a whole\nbunch of new configurability to `markata`.\n\nHere's the [changelog](https://markata.dev/changelog/) entry.\n\n\u003e * Moved to PEP 517 build #59 0.5.0.dev1\n\n## My Personal Simple CI/CD\n\nBefore cutting all of my personal projects over to hatch.  The first thing I\ndid was to setup a solid github action,\n[hatch-action](https://github.com/WaylonWalker/hatch-action)that I can resue.\n\nIt automatically bumps versions, using pre-releases on all branches other than\nmain, with special branches for bumping major, minor, patch, dev, alha, beta,\nand dev.\n\n## hatch new --init\n\nTo convert the project over to hatch, and get rid of setup.py/setup.cfg, I ran\n`hatch new --init`.  This automatically grabs all the metadata for the project\nand makes a `pyproject.toml` that has most of what I need.\n\n``` bash\nhatch new --init\n```\n\nI then manually moved over my isort config, put flake8 config into `.flake8`,\nand dropped setup.cfg.\n\n## lint-test\n\nPart of my hatch-action is to run a `before-command`, for markata, this runs\nall of my linting and testing in one hatch script called `lint-test`.  If this\nfails CI will fail and I can read the report in the logs, make a fix and\nre-publish.\n\n``` toml\n[tool.hatch.envs.default.scripts]\ncov = \"pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=markata --cov=tests\"\nno-cov = \"cov --no-cov\"\nlint = \"flake8 markata\"\nformat = \"black --check markata\"\nsort-imports = \"isort markata\"\nbuild-docs = \"markata build\"\nlint-test = [\n \"lint\",\n \"format\",\n \"seed-isort-config\",\n \"sort-imports\",\n \"cov\",\n]\ntest-lint = \"lint-test\"\n```\n\n## Typical branching workflow\n\n_with automatic versioning_\n\nMy typical workflow is to work on features in their own branch where they do\nnot automatically version or publish, they keep the same version they were\nbranched off of.  Then I do a pr to develop, which will do a `minor,dev` bump\nand publish a pre-relese to pypi.\n\n``` text\n# starting with version 0.0.0\nFeature1 -- │\nFeature2 -- ├── dev 0.1.0.dev1,2,3 ── main 0.1.0\nFeature3 -- │\n```\n\nI will let several features collect in develop before cutting a full relese\nover to main.  This gives me time to make sure the solution is what makes the\nmost sense, I try to use it in a few projects, and generally its edges show,\nand another pr is warranted to make the feature useful for more use cases.\nAfter running and using these new releases in a few projects, I am confident\nthat its ready and release to main.\n\n### managing prs\n\nDoing PR's with gh, probably deserves its own post but here are some helpful\ncommands.\n\n``` bash\ngh pr create --base develop --fill\ngh pr edit\ngh pr diff | dunk\ngh pr merge -ds\n```\n\n## Building and publishing\n\n![\"An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art\" -s50 -W768 -H448 -C7.5 -Ak_lms -S3512493435](https://stable-diffusion.waylonwalker.com/000221.3512493435.webp)\n\nhatch makes building and publishing pretty straightforward.  It's one command\ninside my hatch-action to build and one to publish.  On each project that uses\nmy hatch-action I only need to give it a token that I get from PyPi.\n\n``` yaml\nenv:\n  HATCH_INDEX_USER: __token__\n  HATCH_INDEX_AUTH: ${{ secrets.pypi_password }}\n```\n\n## Full set of changes\n\nIf you want to see all of the details on how markata moved over to hatch, you can check out this diff.\n\n\u003chttps://github.com/WaylonWalker/markata/compare/v0.4.0..v0.5.0.dev0\u003e\n\n![\"An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art\" -s50 -W768 -H448 -C7.5 -Ak_lms -U 4.0 0.6 -S2409791448 ](https://stable-diffusion.waylonwalker.com/000224.2409791448.webp)\n",
      "summary": "Markata now uses hatch as its build backend, and version bumping tool. , and are completely gone.",
      "date_published": "2022-10-08T07:25:10Z",
      "date_modified": "2022-10-08T07:25:10Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "markata",
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/django-create-superuser/",
      "url": "https://waylonwalker.com/django-create-superuser/",
      "title": "django create superuser",
      "content_html": "\u003cp\u003eMy next step into django made me realize that I do not have access to the admin panel, turns out that I need to create a cuper user first.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000368.3309980874.webp\" class=\"glightbox-link\" aria-label=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S3309980874\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000368.3309980874.webp\" alt=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S3309980874\"/ data-glightbox=\"description: “cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S3309980874\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"run-migrations\"\u003eRun Migrations \u003ca href=\"#run-migrations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRight away when trying to setup the superuser I ran into this issue\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edjango.db.utils.OperationalError: no such table: auth_user\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBack to the \u003ca href=\"https://docs.djangoproject.com/en/1.8/intro/tutorial01/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/docs.djangoproject.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/docs.djangoproject.com.ico\" class=\"has-avatar  has-avatar-before\"\u003etutorial\u003c/a\u003e\ntells me that I need to run migrations to setup some tables for the\n\u003ccode\u003eINSTALLED_APPS\u003c/code\u003e, \u003ccode\u003edjango.contrib.admin\u003c/code\u003e being one of them.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython manage.py migrate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/c5774ced-b535-42d3-bbdc-8be39da7795e.png\" class=\"glightbox-link\" aria-label=\"trydjango-migration.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/c5774ced-b535-42d3-bbdc-8be39da7795e.png\" alt=\"trydjango-migration.png\"/ data-glightbox=\"description: trydjango-migration.png\"\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\u003cp\u003eyes I am still running remote on from my chromebook.\u003c/p\u003e\u003c/figcaption\u003e\u003c/figure\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython manage.py createsuperuser\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/b46c5a29-56d2-413f-bc14-f49353169ea3.png\" class=\"glightbox-link\" aria-label=\"trydjango-create-superuser.png\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/b46c5a29-56d2-413f-bc14-f49353169ea3.png\" alt=\"trydjango-create-superuser.png\"/ data-glightbox=\"description: trydjango-create-superuser.png\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eThe super user has been created.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000368.2018296614.webp\" class=\"glightbox-link\" aria-label=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S2018296614\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000368.2018296614.webp\" alt=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S2018296614\"/ data-glightbox=\"description: “cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S2018296614\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"csrf-failure\"\u003eCSRF FAILURE \u003ca href=\"#csrf-failure\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMy next issue trying to run off of a separate domain was a cross site request\nforgery error.\u003c/p\u003e\n\u003cp\u003eSince this is a valid domain that we are hosting the app from we need to tell\nDjango that this is safe.  We can do this again in the \u003ccode\u003esettings.py\u003c/code\u003e, but this\ntime the variable we need is not there out of the box and we need to add it.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eCSRF_TRUSTED_ORIGINS = [\u0026#39;https://localhost.waylonwalker.com\u0026#39;]\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"i-made-it\"\u003eI made it!! \u003ca href=\"#i-made-it\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAnd we are in, and welcomed for the first time with this django admin panel.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/839b17ce-1850-44d4-a560-014e878934bd.webp\" class=\"glightbox-link\" aria-label=\"trydjango-hello.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/839b17ce-1850-44d4-a560-014e878934bd.webp\" alt=\"trydjango-hello.webp\"/ data-glightbox=\"description: trydjango-hello.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"remote-hosting\"\u003eRemote Hosting \u003ca href=\"#remote-hosting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou might find these settings helpful as well if you are trying to run your\nsite on a remote host like aws, digital ocean, linode, or any sort of cloud\nprovidor.  I had it running in my home lab while I was out of the house and\nssh’d in over with a chromebook.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000368.1092166059.webp\" class=\"glightbox-link\" aria-label=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S1092166059\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000368.1092166059.webp\" alt=\"“cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S1092166059\"/ data-glightbox=\"description: “cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality” -s50 -W832 -H416 -C12.0 -Ak_lms -S1092166059\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nMy next step into django made me realize that I do not have access to the admin panel, turns out that I need to create a cuper user first.\n\n![\"cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality\" -s50 -W832 -H416 -C12.0 -Ak_lms -S3309980874](https://stable-diffusion.waylonwalker.com/000368.3309980874.webp)\n\n## Run Migrations\n\nRight away when trying to setup the superuser I ran into this issue\n\n``` bash\ndjango.db.utils.OperationalError: no such table: auth_user\n```\n\nBack to the [tutorial](https://docs.djangoproject.com/en/1.8/intro/tutorial01/)\ntells me that I need to run migrations to setup some tables for the\n`INSTALLED_APPS`, `django.contrib.admin` being one of them.\n\n``` bash\npython manage.py migrate\n```\n\n![trydjango-migration.png](https://dropper.waylonwalker.com/api/file/c5774ced-b535-42d3-bbdc-8be39da7795e.png)\n\n\u003e yes I am still running remote on from my chromebook.\n\n``` bash\npython manage.py createsuperuser\n```\n\n![trydjango-create-superuser.png](https://dropper.waylonwalker.com/api/file/b46c5a29-56d2-413f-bc14-f49353169ea3.png)\n\nThe super user has been created.\n\n![\"cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality\" -s50 -W832 -H416 -C12.0 -Ak_lms -S2018296614](https://stable-diffusion.waylonwalker.com/000368.2018296614.webp)\n\n## CSRF FAILURE\n\nMy next issue trying to run off of a separate domain was a cross site request\nforgery error.\n\n\nSince this is a valid domain that we are hosting the app from we need to tell\nDjango that this is safe.  We can do this again in the `settings.py`, but this\ntime the variable we need is not there out of the box and we need to add it.\n\n```\nCSRF_TRUSTED_ORIGINS = ['https://localhost.waylonwalker.com']\n```\n\n## I made it!!\n\nAnd we are in, and welcomed for the first time with this django admin panel.\n\n![trydjango-hello.webp](https://dropper.waylonwalker.com/api/file/839b17ce-1850-44d4-a560-014e878934bd.webp)\n\n## Remote Hosting\n\nYou might find these settings helpful as well if you are trying to run your\nsite on a remote host like aws, digital ocean, linode, or any sort of cloud\nprovidor.  I had it running in my home lab while I was out of the house and\nssh'd in over with a chromebook.\n\n![\"cybernetic soldier working on a rusting tape machine robot, cinematic lighting, detailed, cell shaded, 4 k, warm colours, concept art, by wlop, ilya kuvshinov, artgerm, krenz cushart, greg rutkowski, pixiv. cinematic dramatic atmosphere, sharp focus, volumetric lighting, cinematic lighting, studio quality\" -s50 -W832 -H416 -C12.0 -Ak_lms -S1092166059](https://stable-diffusion.waylonwalker.com/000368.1092166059.webp)\n",
      "summary": "My next step into django made me realize that I do not have access to the admin panel, turns out that I need to create a cuper user first.",
      "date_published": "2022-09-26T07:14:04Z",
      "date_modified": "2022-09-26T07:14:04Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "django",
        "python",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/django-disallowed-host/",
      "url": "https://waylonwalker.com/django-disallowed-host/",
      "title": "django disallowed host",
      "content_html": "\u003cp\u003eI am continuing my journey into django, but today I am not at my workstation. I\nam ssh’d in remotely from a chromebook.  I am fully outside of my network, so I\ncan’t access it by localhost, or it’s ip.  I do have cloudflared tunnel\ninstalled and dns setup to a \u003ccode\u003elocalhost.waylonwalker.com\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"settings\"\u003eSettings \u003ca href=\"#settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI found this in \u003ccode\u003esettings.py\u003c/code\u003e and yolo, it worked first try.  I am in from my\nremote location, and even have auth taken care of thanks to cloudflare.  I am\nreally hoping to learn how to setup my own auth with django as this is one of\nthe things that I could really use in my toolbelt.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eALLOWED_HOSTS\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;localhost.waylonwalker.com\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000321.3422093952.webp\" class=\"glightbox-link\" aria-label=\"“cell shaded long shot of a cybernetic blue bald soldier with glowing blue eyes as Borderlands 3 concept art, llustration, post grunge, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C7.5 -Ak_lms -S3422093952\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000321.3422093952.webp\" alt=\"“cell shaded long shot of a cybernetic blue bald soldier with glowing blue eyes as Borderlands 3 concept art, llustration, post grunge, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C7.5 -Ak_lms -S3422093952 \"/ data-glightbox=\"description: “cell shaded long shot of a cybernetic blue bald soldier with glowing blue eyes as Borderlands 3 concept art, llustration, post grunge, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C7.5 -Ak_lms -S3422093952\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nI am continuing my journey into django, but today I am not at my workstation. I\nam ssh'd in remotely from a chromebook.  I am fully outside of my network, so I\ncan't access it by localhost, or it's ip.  I do have cloudflared tunnel\ninstalled and dns setup to a `localhost.waylonwalker.com`.\n\n## Settings\n\nI found this in `settings.py` and yolo, it worked first try.  I am in from my\nremote location, and even have auth taken care of thanks to cloudflare.  I am\nreally hoping to learn how to setup my own auth with django as this is one of\nthe things that I could really use in my toolbelt.\n\n``` python\nALLOWED_HOSTS = ['localhost.waylonwalker.com']\n```\n\n![\"cell shaded long shot of a cybernetic blue bald soldier with glowing blue eyes as Borderlands 3 concept art, llustration, post grunge, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\" -s50 -W832 -H416 -C7.5 -Ak_lms -S3422093952 ](https://stable-diffusion.waylonwalker.com/000321.3422093952.webp)\n",
      "summary": "I am continuing my journey into django, but today I am not at my workstation. I am ssh'd in remotely from a chromebook. I am fully outside of my network, so...",
      "date_published": "2022-09-26T06:15:24Z",
      "date_modified": "2022-09-26T06:15:24Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "django",
        "python",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/trying-out-django/",
      "url": "https://waylonwalker.com/trying-out-django/",
      "title": "Trying out django",
      "content_html": "\u003cp\u003eI have no experience in django, and in my exploration to become a better python\ndeveloper I am dipping my toe into one of the most polished and widely used web\nframeworks Django to so that I can better understand it and become a better\npython developer.\u003c/p\u003e\n\u003cp\u003eIf you found this at all helpful make sure you check out the \u003ca href=\"https://docs.djangoproject.com/en/4.1/intro/tutorial01/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/docs.djangoproject.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/docs.djangoproject.com.ico\" class=\"has-avatar  has-avatar-before\"\u003edjango tutorial\u003c/a\u003e\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000243.2250540408.webp\" class=\"glightbox-link\" aria-label=\"“An atronaut working in a lab, there is a long snake working along side, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -S2250540408\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000243.2250540408.webp\" alt=\"“An atronaut working in a lab, there is a long snake working along side, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -S2250540408\"/ data-glightbox=\"description: “An atronaut working in a lab, there is a long snake working along side, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -S2250540408\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"install-django\"\u003einstall django \u003ca href=\"#install-django\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe first thing I need to do is render out a template to start the project.\nFor this I need the \u003ccode\u003edjango-admin\u003c/code\u003e cli.  To get this I am going the route of\n\u003ccode\u003epipx\u003c/code\u003e it will be installed globally on my system in it’s own virtual\nenvironment that I don’t have to manage.  This will be useful only for using\nstartproject as far as I know.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipx install django\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edjango-admin startproject try_django\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e try_django\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/1913211c-81ac-4de4-af49-9a532f0786f7.webp\" class=\"glightbox-link\" aria-label=\"django-startproject.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/1913211c-81ac-4de4-af49-9a532f0786f7.webp\" alt=\"django-startproject.webp\"/ data-glightbox=\"description: django-startproject.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"make-a-venv\"\u003eMake a venv \u003ca href=\"#make-a-venv\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOnce I have the project I need a venv for all of django and all of my\ndependencies I might need for the project.  I have really been diggin \u003ccode\u003ehatch\u003c/code\u003e\nlately, and it has a one line \u003cem\u003e“make a \u003ca href=\"/virtual-environment/\" class=\"glossary-term\" title=\"Virtual Environment is term for a sandboxed environment commonly associated with the python programming language. If you are installing any sort of python...\"\u003evirtual environment\u003c/a\u003e and manage it for\nme”\u003c/em\u003e command.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehatch shell\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/974809a1-02bd-46c4-acf9-783fd5128b35.webp\" class=\"glightbox-link\" aria-label=\"trydjango-venv.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/974809a1-02bd-46c4-acf9-783fd5128b35.webp\" alt=\"trydjango-venv.webp\"/ data-glightbox=\"description: trydjango-venv.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eIf hatch is a bit bleeding edge for you, or it has died out by the time you\nread this.  The ol trusty venv will likely stand the test of time, this is what\nI would use for that.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython -m .venv --prmpt \u003cspan class=\"sb\"\u003e`\u003c/span\u003ebasename \u003cspan class=\"nv\"\u003e$PWD\u003c/span\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e. ./.venv/bin/activate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"start-the-webserver\"\u003eStart the webserver \u003ca href=\"#start-the-webserver\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNext up we need to start the webserver to start seeing that development\ncontent.  The first thing I did was run it as stated in the tutorial and find\nit clashed with a currently running web server port.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython manage.py runserver\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/ac1397f4-71b9-4617-9438-33cfa2e53c75.webp\" class=\"glightbox-link\" aria-label=\"django-runserver-oops.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/ac1397f4-71b9-4617-9438-33cfa2e53c75.webp\" alt=\"django-runserver-oops.webp\"/ data-glightbox=\"description: django-runserver-oops.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eI jumped over to that tmux session, killed the process and I was up and running.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/828d8e21-00c7-4f02-bd47-e3cebc318adc.webp\" class=\"glightbox-link\" aria-label=\"trydjango-runserver.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/828d8e21-00c7-4f02-bd47-e3cebc318adc.webp\" alt=\"trydjango-runserver.webp\"/ data-glightbox=\"description: trydjango-runserver.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"whats-running\"\u003eWhat’s running \u003ca href=\"#whats-running\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe default django hello world looks well designed.  You are first presented\nwith this page.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/e5523925-1565-454c-bab3-c70c4deabc83.webp\" class=\"glightbox-link\" aria-label=\"trydjango-hello.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/e5523925-1565-454c-bab3-c70c4deabc83.webp\" alt=\"trydjango-hello.webp\"/ data-glightbox=\"description: trydjango-hello.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"next\"\u003eNext \u003ca href=\"#next\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI opened up the \u003ccode\u003eurls.py\u003c/code\u003e to discover that the only configured url was at\n\u003ccode\u003e/admin\u003c/code\u003e. I tried to log in as admin, but was unable to as I have not yet\ncreated a superuser.  Next time I play with django that is what I will explore.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000250.526887289.webp\" class=\"glightbox-link\" aria-label=\"An astronaut working in a dimly lit labratory, it is almost black, heavy dark blacks, black space, heavy vingette, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, by Alphonse Mucha, dynamic lighting, digital art\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000250.526887289.webp\" alt=\"An astronaut working in a dimly lit labratory, it is almost black, heavy dark blacks, black space, heavy vingette, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, by Alphonse Mucha, dynamic lighting, digital art\"/ data-glightbox=\"description: An astronaut working in a dimly lit labratory, it is almost black, heavy dark blacks, black space, heavy vingette, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, by Alphonse Mucha, dynamic lighting, digital art\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nI have no experience in django, and in my exploration to become a better python\ndeveloper I am dipping my toe into one of the most polished and widely used web\nframeworks Django to so that I can better understand it and become a better\npython developer.\n\nIf you found this at all helpful make sure you check out the [django tutorial](https://docs.djangoproject.com/en/4.1/intro/tutorial01/)\n\n\n![\"An atronaut working in a lab, there is a long snake working along side, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art\" -s50 -W768 -H448 -C7.5 -Ak_lms -S2250540408](https://stable-diffusion.waylonwalker.com/000243.2250540408.webp)\n## install django\n\nThe first thing I need to do is render out a template to start the project.\nFor this I need the `django-admin` cli.  To get this I am going the route of\n`pipx` it will be installed globally on my system in it's own virtual\nenvironment that I don't have to manage.  This will be useful only for using\nstartproject as far as I know.\n\n``` bash\npipx install django\ndjango-admin startproject try_django\ncd try_django\n```\n\n![django-startproject.webp](https://dropper.waylonwalker.com/api/file/1913211c-81ac-4de4-af49-9a532f0786f7.webp)\n\n## Make a venv\n\nOnce I have the project I need a venv for all of django and all of my\ndependencies I might need for the project.  I have really been diggin `hatch`\nlately, and it has a one line _\"make a virtual environment and manage it for\nme\"_ command.\n\n``` bash\nhatch shell\n```\n\n![trydjango-venv.webp](https://dropper.waylonwalker.com/api/file/974809a1-02bd-46c4-acf9-783fd5128b35.webp)\n\nIf hatch is a bit bleeding edge for you, or it has died out by the time you\nread this.  The ol trusty venv will likely stand the test of time, this is what\nI would use for that.\n\n``` bash\npython -m .venv --prmpt `basename $PWD`\n. ./.venv/bin/activate\n```\n\n## Start the webserver\n\nNext up we need to start the webserver to start seeing that development\ncontent.  The first thing I did was run it as stated in the tutorial and find\nit clashed with a currently running web server port.\n\n``` bash\npython manage.py runserver\n```\n\n![django-runserver-oops.webp](https://dropper.waylonwalker.com/api/file/ac1397f4-71b9-4617-9438-33cfa2e53c75.webp)\n\nI jumped over to that tmux session, killed the process and I was up and running.\n\n![trydjango-runserver.webp](https://dropper.waylonwalker.com/api/file/828d8e21-00c7-4f02-bd47-e3cebc318adc.webp)\n\n## What's running\n\nThe default django hello world looks well designed.  You are first presented\nwith this page.\n\n![trydjango-hello.webp](https://dropper.waylonwalker.com/api/file/e5523925-1565-454c-bab3-c70c4deabc83.webp)\n\n## Next\n\nI opened up the `urls.py` to discover that the only configured url was at\n`/admin`. I tried to log in as admin, but was unable to as I have not yet\ncreated a superuser.  Next time I play with django that is what I will explore.\n\n![An astronaut working in a dimly lit labratory, it is almost black, heavy dark blacks, black space, heavy vingette, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, by Alphonse Mucha, dynamic lighting, digital art](https://stable-diffusion.waylonwalker.com/000250.526887289.webp)\n",
      "summary": "I have no experience in django, and in my exploration to become a better python developer I am dipping my toe into one of the most polished and widely used...",
      "date_published": "2022-09-25T18:47:54Z",
      "date_modified": "2022-09-25T18:47:54Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "django",
        "python",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/jinja2-escape/",
      "url": "https://waylonwalker.com/jinja2-escape/",
      "title": "how to escape variables in jinja templates",
      "content_html": "\u003cp\u003eWhile updating my site to use Markata’s new configurable head I ran into some\nescaping issues.  Things like single quotes would cause jinja to fail as it was\nclosing quotes that it shouldnt have.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000258.1910330087.webp#cinematic\" class=\"glightbox-link\" aria-label=\"Nuclear core being help up by glowing neon wires, cyberpunk synthwave, intricate abstract. delicate artwork. by tooth wu, wlop, beeple, dan mumford. pink volumetric lighting, octane render, trending on artstation, greg rutkowski very coherent symmetrical artwork. cinematic, hyper realism, high detail, octane render, 8k, depth of field, bokeh. chrome accents.\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000258.1910330087.webp#cinematic\" alt=\"Nuclear core being help up by glowing neon wires, cyberpunk synthwave, intricate abstract. delicate artwork. by tooth wu, wlop, beeple, dan mumford. pink volumetric lighting, octane render, trending on artstation, greg rutkowski very coherent symmetrical artwork. cinematic, hyper realism, high detail, octane render, 8k, depth of field, bokeh. chrome accents.\"/ data-glightbox=\"description: Nuclear core being help up by glowing neon wires, cyberpunk synthwave, intricate abstract. delicate artwork. by tooth wu, wlop, beeple, dan mumford. pink volumetric lighting, octane render, trending on artstation, greg rutkowski very coherent symmetrical artwork. cinematic, hyper realism, high detail, octane render, 8k, depth of field, bokeh. chrome accents.\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"jinja-escaping-strings\"\u003eJinja Escaping Strings \u003ca href=\"#jinja-escaping-strings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJinja comes with a handy utility for escaping strings.  I definitly tried to\nover-complicate this before realizing.  You can just pipe your variables into\n\u003ccode\u003ee\u003c/code\u003e to escape them.  This has worked pretty flawless at solving some jinja\nissues for me.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ title|e }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"creating-meta-tags-in-markata\"\u003eCreating meta tags in Markata \u003ca href=\"#creating-meta-tags-in-markata\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe issue I ran into was when trying to setup meta tags with the new\nconfigurable head, some of my titles have single quotes in them.  This is what\nI put in my \u003ccode\u003emarkata.toml\u003c/code\u003e to create some meta tags.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emeta\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;og:title\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;{{ title }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUsing my article titles like this ended up causing this syntax error when not\nescaped.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ne\"\u003eSyntaxError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003einvalid\u003c/span\u003e \u003cspan class=\"n\"\u003esyntax\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003ePerhaps\u003c/span\u003e \u003cspan class=\"n\"\u003eyou\u003c/span\u003e \u003cspan class=\"n\"\u003eforgot\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003ecomma\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ne\"\u003eException\u003c/span\u003e \u003cspan class=\"n\"\u003eignored\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eForward\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"fm\"\u003e__del__\u003c/span\u003e \u003cspan class=\"n\"\u003eat\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x7fa9807192d0\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eTraceback\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emost\u003c/span\u003e \u003cspan class=\"n\"\u003erecent\u003c/span\u003e \u003cspan class=\"n\"\u003ecall\u003c/span\u003e \u003cspan class=\"n\"\u003elast\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ne\"\u003eTypeError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;NoneType\u0026#39;\u003c/span\u003e \u003cspan class=\"nb\"\u003eobject\u003c/span\u003e \u003cspan class=\"ow\"\u003eis\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"n\"\u003ecallable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"jinja2-escape\"\u003ejinja2 escape \u003ca href=\"#jinja2-escape\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAfter making a complicated system of using \u003ccode\u003ehtml.escape\u003c/code\u003e I realized that jinja\nincluded escaping out of the box so I updated my \u003ccode\u003emarkata.toml\u003c/code\u003e to include the\nescaping, and it all just worked!.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emeta\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;og:title\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;{{ title|e }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000255.3328233410.webp#cinematic\" class=\"glightbox-link\" aria-label=\"Nuclear core being help up by wires, intricate abstract. delicate artwork. by tooth wu, wlop, beeple, dan mumford. pink volumetric lighting, octane render, trending on artstation, greg rutkowski very coherent symmetrical artwork. cinematic, hyper realism, high detail, octane render, 8k, depth of field, bokeh. chrome accents.\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000255.3328233410.webp#cinematic\" alt=\"Nuclear core being help up by wires, intricate abstract. delicate artwork. by tooth wu, wlop, beeple, dan mumford. pink volumetric lighting, octane render, trending on artstation, greg rutkowski very coherent symmetrical artwork. cinematic, hyper realism, high detail, octane render, 8k, depth of field, bokeh. chrome accents.\"/ data-glightbox=\"description: Nuclear core being help up by wires, intricate abstract. delicate artwork. by tooth wu, wlop, beeple, dan mumford. pink volumetric lighting, octane render, trending on artstation, greg rutkowski very coherent symmetrical artwork. cinematic, hyper realism, high detail, octane render, 8k, depth of field, bokeh. chrome accents.\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nWhile updating my site to use Markata's new configurable head I ran into some\nescaping issues.  Things like single quotes would cause jinja to fail as it was\nclosing quotes that it shouldnt have.\n\n![Nuclear core being help up by glowing neon wires, cyberpunk synthwave, intricate abstract. delicate artwork. by tooth wu, wlop, beeple, dan mumford. pink volumetric lighting, octane render, trending on artstation, greg rutkowski very coherent symmetrical artwork. cinematic, hyper realism, high detail, octane render, 8k, depth of field, bokeh. chrome accents.](https://stable-diffusion.waylonwalker.com/000258.1910330087.webp#cinematic)\n\n## Jinja Escaping Strings\n\nJinja comes with a handy utility for escaping strings.  I definitly tried to\nover-complicate this before realizing.  You can just pipe your variables into\n`e` to escape them.  This has worked pretty flawless at solving some jinja\nissues for me.\n\n``` html\n\u003cp\u003e\n{{ title|e }}\n\u003c/p\u003e\n```\n\n## Creating meta tags in Markata\n\nThe issue I ran into was when trying to setup meta tags with the new\nconfigurable head, some of my titles have single quotes in them.  This is what\nI put in my `markata.toml` to create some meta tags.\n\n``` toml\n[[markata.head.meta]]\nname = \"og:title\"\ncontent = \"{{ title }}\"\n```\n\nUsing my article titles like this ended up causing this syntax error when not\nescaped.\n\n``` python\nSyntaxError: invalid syntax. Perhaps you forgot a comma?\nException ignored in: \u003cfunction Forward.__del__ at 0x7fa9807192d0\u003e\nTraceback (most recent call last):\n    ...\nTypeError: 'NoneType' object is not callable\n```\n\n## jinja2 escape\n\nAfter making a complicated system of using `html.escape` I realized that jinja\nincluded escaping out of the box so I updated my `markata.toml` to include the\nescaping, and it all just worked!.\n\n``` toml\n[[markata.head.meta]]\nname = \"og:title\"\ncontent = \"{{ title|e }}\"\n```\n\n![Nuclear core being help up by wires, intricate abstract. delicate artwork. by tooth wu, wlop, beeple, dan mumford. pink volumetric lighting, octane render, trending on artstation, greg rutkowski very coherent symmetrical artwork. cinematic, hyper realism, high detail, octane render, 8k, depth of field, bokeh. chrome accents.](https://stable-diffusion.waylonwalker.com/000255.3328233410.webp#cinematic)\n",
      "summary": "While updating my site to use Markata's new configurable head I ran into some escaping issues. Things like single quotes would cause jinja to fail as it was...",
      "date_published": "2022-09-24T15:18:50Z",
      "date_modified": "2022-09-24T15:18:50Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/use-ipython-extensions/",
      "url": "https://waylonwalker.com/use-ipython-extensions/",
      "title": "I've made my ipython config too complicated, let's fix it.",
      "content_html": "\u003cp\u003eWhen I am developing python code I often have a repl open alongside of it\nrunning snippets ofcode as I go.  Ipython is my repl of choice, and I hace\ntricked it out the best I can and I really like it.  The problem I recently\ndiscovered is that I have way overcomplicated it.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000221.3407229670.webp\" class=\"glightbox-link\" aria-label=\"Open image\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000221.3407229670.webp\" alt=\"\"/ data-glightbox=\"description: \"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"what-have-i-done\"\u003eWhat Have I done?? \u003ca href=\"#what-have-i-done\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSo in the past the way I have setup a few extensions for myself is to add\nsomething like this to my \u003ccode\u003e~/.ipython/profile_default/startup\u003c/code\u003e directory.  It\nsets up some things like rich highlighting or in this example automatic\nimports.  I even went as far as installing some of these in the case I didn’t have them installed.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003esubprocess\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003eIPython\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eget_ipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003eIPython.core.error\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eUsageError\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eipython\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eget_ipython\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erun_line_magic\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;load_ext pyflyby\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;inline\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eexcept\u003c/span\u003e \u003cspan class=\"n\"\u003eUsageError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;installing pyflyby\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esubprocess\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePopen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pip\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;install\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pyflyby\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003estdout\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003esubprocess\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDEVNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003estderr\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003esubprocess\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDEVNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewait\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erun_line_magic\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;load_ext pyflyby\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;inline\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;installing isort\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esubprocess\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePopen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pip\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;install\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;isort\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003estdout\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003esubprocess\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDEVNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003estderr\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003esubprocess\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDEVNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000255.43782833.webp\" class=\"glightbox-link\" aria-label=\"A man looking over to a glowing nuclear core with hundreds of wires running from it\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000255.43782833.webp\" alt=\"A man looking over to a glowing nuclear core with hundreds of wires running from it\"/ data-glightbox=\"description: A man looking over to a glowing nuclear core with hundreds of wires running from it\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"what-i-missed\"\u003eWhat I missed? \u003ca href=\"#what-i-missed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI missed the fact that some of these tools like \u003ccode\u003epyflyby\u003c/code\u003e and \u003ccode\u003erich\u003c/code\u003e already\nhave an ipython extension maintained by the library that just works.  It’s less\ncomplicated and more robust to future changes in the library.  If anything ever\nchanges with these I will not have to worry about which version is installed,\nthe extension will just take care of itself.\u003c/p\u003e\n\u003ch2 id=\"how-to-activate-these\"\u003eHow to activate these. \u003ca href=\"#how-to-activate-these\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe reccomended way is to add them to your\n\u003ccode\u003e~/.ipython/profile_default/ipython_config.py\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eInteractiveShellApp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eextensions\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;rich\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eInteractiveShellApp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eextensions\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;markata\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eInteractiveShellApp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eextensions\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;pyflyby\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe issue that I found with this is that you can end up with a sea of errors\nflooding your terminal.  Personally I will know immediately if ipython is\nworking right or not and typically have scriped venv installs so I have\neverything I need, so If I don’t have everything it’s probably for a reason and\nI don’t need an error message lighting up.\u003c/p\u003e\n\u003cp\u003eMy way around this was to test if the module was importable and if it had a\n\u003ccode\u003eload_ipython_extension\u003c/code\u003e attribute before appending it as an extension.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eactivate_extension\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eextension\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003emod\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eimportlib\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eimport_module\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eextension\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003egetattr\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emod\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;load_ipython_extension\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eInteractiveShellApp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eextensions\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eextension\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eexcept\u003c/span\u003e \u003cspan class=\"ne\"\u003eModuleNotFoundError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;extension is not installed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eexcept\u003c/span\u003e \u003cspan class=\"ne\"\u003eAttributeError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;extension does not have a \u0026#39;load_ipython_extension\u0026#39; function\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eextensions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;rich\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pyflyby\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003eextension\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eextensions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eactivate_extension\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eextension\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"my-change\"\u003eMy Change \u003ca href=\"#my-change\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you want to see what I did to my config see \u003ca href=\"https://github.com/WaylonWalker/devtainer/commit/e83b65db8cc292e0de99f1089754e088d8e7e3ef\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003ethis commit\u003c/a\u003e.\u003c/p\u003e\n",
      "content_text": "\nWhen I am developing python code I often have a repl open alongside of it\nrunning snippets ofcode as I go.  Ipython is my repl of choice, and I hace\ntricked it out the best I can and I really like it.  The problem I recently\ndiscovered is that I have way overcomplicated it.\n\n![](https://stable-diffusion.waylonwalker.com/000221.3407229670.webp)\n\n## What Have I done??\n\nSo in the past the way I have setup a few extensions for myself is to add\nsomething like this to my `~/.ipython/profile_default/startup` directory.  It\nsets up some things like rich highlighting or in this example automatic\nimports.  I even went as far as installing some of these in the case I didn't have them installed.\n\n``` python\nimport subprocess\n\nfrom IPython import get_ipython\nfrom IPython.core.error import UsageError\n\nipython = get_ipython()\n\ntry:\n    ipython.run_line_magic(\"load_ext pyflyby\", \"inline\")\nexcept UsageError:\n    print(\"installing pyflyby\")\n    subprocess.Popen(\n        [\"pip\", \"install\", \"pyflyby\"],\n        stdout=subprocess.DEVNULL,\n        stderr=subprocess.DEVNULL,\n    ).wait()\n    ipython.run_line_magic(\"load_ext pyflyby\", \"inline\")\n    print(\"installing isort\")\n    subprocess.Popen(\n        [\"pip\", \"install\", \"isort\"],\n        stdout=subprocess.DEVNULL,\n        stderr=subprocess.DEVNULL,\n    )\n```\n\n![A man looking over to a glowing nuclear core with hundreds of wires running from it](https://stable-diffusion.waylonwalker.com/000255.43782833.webp)\n\n## What I missed?\n\nI missed the fact that some of these tools like `pyflyby` and `rich` already\nhave an ipython extension maintained by the library that just works.  It's less\ncomplicated and more robust to future changes in the library.  If anything ever\nchanges with these I will not have to worry about which version is installed,\nthe extension will just take care of itself.\n\n## How to activate these.\n\nThe reccomended way is to add them to your\n`~/.ipython/profile_default/ipython_config.py`\n\n``` python\nc.InteractiveShellApp.extensions.append('rich')\nc.InteractiveShellApp.extensions.append('markata')\nc.InteractiveShellApp.extensions.append('pyflyby')\n```\n\nThe issue that I found with this is that you can end up with a sea of errors\nflooding your terminal.  Personally I will know immediately if ipython is\nworking right or not and typically have scriped venv installs so I have\neverything I need, so If I don't have everything it's probably for a reason and\nI don't need an error message lighting up.\n\nMy way around this was to test if the module was importable and if it had a\n`load_ipython_extension` attribute before appending it as an extension.\n\n``` python\ndef activate_extension(extension):\n    try:\n        mod = importlib.import_module(extension)\n        getattr(mod, \"load_ipython_extension\")\n        c.InteractiveShellApp.extensions.append(extension)\n    except ModuleNotFoundError:\n        \"extension is not installed\"\n    except AttributeError:\n        \"extension does not have a 'load_ipython_extension' function\"\n\n\nextensions = [\"rich\", \"markata\", \"pyflyby\"]\nfor extension in extensions:\n    activate_extension(extension)\n\n```\n\n## My Change\n\nIf you want to see what I did to my config see [this commit](https://github.com/WaylonWalker/devtainer/commit/e83b65db8cc292e0de99f1089754e088d8e7e3ef).\n",
      "summary": "When I am developing python code I often have a repl open alongside of it running snippets ofcode as I go. Ipython is my repl of choice, and I hace tricked...",
      "date_published": "2022-09-20T15:40:31Z",
      "date_modified": "2022-09-20T15:40:31Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/markata-configure-head/",
      "url": "https://waylonwalker.com/markata-configure-head/",
      "title": "markata extend \u003chead\u003e in configuration",
      "content_html": "\u003cp\u003e\u003ca href=\"https://stable-diffusion.waylonwalker.com/000172.2339173599.webp\" class=\"glightbox-link\" aria-label=\"Astronauts stunting some stylish color explosion\"\u003e\u003cimg src=\"https://stable-diffusion.waylonwalker.com/000172.2339173599.webp\" alt=\"Astronauts stunting some stylish color explosion\" class=\"more-cinematic glightbox\"/ data-glightbox=\"description: Astronauts stunting some stylish color explosion\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eA long needed feature of markata has been the ability to really configure out\ntemplates with configuration rather.  It’s been long that you needed that if\nyou really want to change the style, meta tags, or anything in the head you\nneeded to write a plugin or eject out of the template and use your own.\u003c/p\u003e\n\u003ch2 id=\"adding-some-head\"\u003eAdding some Head \u003ca href=\"#adding-some-head\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow you can add some extra style to your site with the existing built-in\ntemplate.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026lt;style\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003eimg {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  width: 100%;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  height: auto;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003eul {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  display: flex;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  flex-wrap: wrap;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026lt;/style\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"you-can-have-more-than-one-head\"\u003eYou can have more than one Head \u003ca href=\"#you-can-have-more-than-one-head\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEach text entry in \u003ccode\u003emarkata.head\u003c/code\u003e just gets appended raw into the head.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026lt;style\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003eimg {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  width: 100%;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  height: auto;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003eul {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  display: flex;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  flex-wrap: wrap;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026lt;/style\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026lt;script\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003econsole.log(\u0026#39;hey there\u0026#39;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026lt;/script\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"still-need-more\"\u003eStill need more? \u003ca href=\"#still-need-more\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf this does not take you far enough yet, you can still eject out and use your\nown template pretty easy.  If you are going for a full custom site it’s likely\nthat this will be the workflow for awhile.  Markata should only get better and\nmake this required less often as it matures.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epost_template\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pages/templates/post_template.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOnce you have this in your \u003ccode\u003emarkata.toml\u003c/code\u003e you can put whatever you want in your\nown template.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000172.2678273305.webp\" class=\"glightbox-link\" aria-label=\"“An astronaut working in a lab, colorful explosion, powder, particles, smoke, 35mm, bokeh, fog, f1.2, shallow depth of field, experiments running, beakers, test tubes, cyberpunk, octane render, trending on artstation, neon lighting, volumetric lighting, pink lighting” -s50 -W800 -H450 -C7.5 -Ak_lms -S2678273305\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000172.2678273305.webp\" alt=\"“An astronaut working in a lab, colorful explosion, powder, particles, smoke, 35mm, bokeh, fog, f1.2, shallow depth of field, experiments running, beakers, test tubes, cyberpunk, octane render, trending on artstation, neon lighting, volumetric lighting, pink lighting” -s50 -W800 -H450 -C7.5 -Ak_lms -S2678273305\"/ data-glightbox=\"description: “An astronaut working in a lab, colorful explosion, powder, particles, smoke, 35mm, bokeh, fog, f1.2, shallow depth of field, experiments running, beakers, test tubes, cyberpunk, octane render, trending on artstation, neon lighting, volumetric lighting, pink lighting” -s50 -W800 -H450 -C7.5 -Ak_lms -S2678273305\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\n![Astronauts stunting some stylish color explosion](https://stable-diffusion.waylonwalker.com/000172.2339173599.webp){.more-cinematic}\n\nA long needed feature of markata has been the ability to really configure out\ntemplates with configuration rather.  It's been long that you needed that if\nyou really want to change the style, meta tags, or anything in the head you\nneeded to write a plugin or eject out of the template and use your own.\n\n## Adding some Head\n\nNow you can add some extra style to your site with the existing built-in\ntemplate.\n\n``` toml\n[[markata.head]]\ntext = \"\"\"\n\u003cstyle\u003e\nimg {\n  width: 100%;\n  height: auto;\n}\nul {\n  display: flex;\n  flex-wrap: wrap;\n}\n\u003c/style\u003e\n\"\"\"\n```\n\n## You can have more than one Head\n\nEach text entry in `markata.head` just gets appended raw into the head.\n\n``` toml\n[[markata.head]]\ntext = \"\"\"\n\u003cstyle\u003e\nimg {\n  width: 100%;\n  height: auto;\n}\nul {\n  display: flex;\n  flex-wrap: wrap;\n}\n\u003c/style\u003e\n\"\"\"\n\n[[markata.head]]\ntext = \"\"\"\n\u003cscript\u003e\nconsole.log('hey there')\n\u003c/script\n\"\"\"\n```\n\n## Still need more?\n\nIf this does not take you far enough yet, you can still eject out and use your\nown template pretty easy.  If you are going for a full custom site it's likely\nthat this will be the workflow for awhile.  Markata should only get better and\nmake this required less often as it matures.\n\n``` toml\n[markata]\npost_template = \"pages/templates/post_template.html\"\n```\n\nOnce you have this in your `markata.toml` you can put whatever you want in your\nown template.\n\n![\"An astronaut working in a lab, colorful explosion, powder, particles, smoke, 35mm, bokeh, fog, f1.2, shallow depth of field, experiments running, beakers, test tubes, cyberpunk, octane render, trending on artstation, neon lighting, volumetric lighting, pink lighting\" -s50 -W800 -H450 -C7.5 -Ak_lms -S2678273305](https://stable-diffusion.waylonwalker.com/000172.2678273305.webp)\n",
      "date_published": "2022-09-11T20:25:45Z",
      "date_modified": "2022-09-11T20:25:45Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "markata",
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/hatch-new-cli/",
      "url": "https://waylonwalker.com/hatch-new-cli/",
      "title": "Create a new Python Project with the Hatch Cli",
      "content_html": "\u003cp\u003eI’m really getting into using hatch as my go to build system, and I am really\nliking it so far.  I am slowly finding new  things that just work really well.\n\u003ccode\u003ehatch new\u003c/code\u003e is one of those things that I didn’t realize I needed until I had\nit.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/86bc196b-60ae-4a74-a7c9-48aebb2edc0e.webp\" class=\"glightbox-link\" aria-label=\"Hatch new cover image\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/file/86bc196b-60ae-4a74-a7c9-48aebb2edc0e.webp\" alt=\"Hatch new cover image\"/ data-glightbox=\"description: Hatch new cover image\"\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\u003cp\u003ecreating new versions created by myself with stable diffusion\u003c/p\u003e\u003c/figcaption\u003e\u003c/figure\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/765d9f0c-c73a-44e5-8f0a-0027dff67abe.webp\" class=\"glightbox-link\" aria-label=\"hatch-new-cli.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/765d9f0c-c73a-44e5-8f0a-0027dff67abe.webp\" alt=\"hatch-new-cli.webp\"/ data-glightbox=\"description: hatch-new-cli.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cpre\u003e\u003ccode\u003e❯ pipx run hatch new --help\nUsage: hatch new [OPTIONS] [NAME] [LOCATION]\n\n  Create or initialize a project.\n\nOptions:\n  -i, --interactive  Interactively choose details about the project\n  --cli              Give the project a command line interface\n  --init             Initialize an existing project\n  -h, --help         Show this message and exit.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNote! I am running all of these commands with pipx. I like to use pipx for\nall of my system level cli applications.  To emphasis this point in the\narticle I am going to use \u003ccode\u003epipx run hatch\u003c/code\u003e, but you can \u003ccode\u003epipx install hatch\u003c/code\u003e\nthen just run \u003ccode\u003ehatch\u003c/code\u003e from there.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"interacively-create-a-new-project\"\u003eInteracively create a new project \u003ca href=\"#interacively-create-a-new-project\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRunning \u003ccode\u003ehatch new -i\u003c/code\u003e will ask let you interactivly choose details about the\nproject, such as the project’s name.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epipx run hatch new -i\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAfter running and naming the project \u003cstrong\u003eHatch New\u003c/strong\u003e we end up with the following\nfiletree.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ tree .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── hatch_new\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── __about__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   └── __init__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── LICENSE.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── pyproject.toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└── tests\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    └── __init__.py\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"non-interative\"\u003eNon-Interative \u003ca href=\"#non-interative\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou can also fill in the project name ahead of time, and it will run without\nany questions.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/7d902784-e69e-4990-a711-22365665594c.webp\" class=\"glightbox-link\" aria-label=\"hatch-new-another-project.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/7d902784-e69e-4990-a711-22365665594c.webp\" alt=\"hatch-new-another-project.webp\"/ data-glightbox=\"description: hatch-new-another-project.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ pipx run hatch new \u003cspan class=\"s2\"\u003e\u0026#34;Another Project\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eanother-project\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── another_project\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── __about__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   └── __init__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── tests\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   └── __init__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── LICENSE.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└── pyproject.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003eNote! all of these examples will create a project directory within your\ncurrent working directory.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/da377ba0-89f8-4b40-b0a6-c2c742c6b11f.webp\" class=\"glightbox-link\" aria-label=\"“An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk, octane render, trending on artstation, neon lighting, volumetric lighting, pink lighting” -s50 -W800 -H450 -C10.0 -Ak_lms -S324995023\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/file/da377ba0-89f8-4b40-b0a6-c2c742c6b11f.webp\" alt=\"“An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk, octane render, trending on artstation, neon lighting, volumetric lighting, pink lighting” -s50 -W800 -H450 -C10.0 -Ak_lms -S324995023\"/ data-glightbox=\"description: “An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk, octane render, trending on artstation, neon lighting, volumetric lighting, pink lighting” -s50 -W800 -H450 -C10.0 -Ak_lms -S324995023\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"--init\"\u003e–init \u003ca href=\"#--init\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003eexisting project\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ehatch new\u003c/code\u003e has an \u003ccode\u003e--init\u003c/code\u003e flag in order to initialize a new hatch\npyproject.toml in an existing project.  This feels like it would be useful if\nyou are converting a project to hatch, or if like me you sometimes start making\nsomething before you realize it’s something that you want to package.  Honestly\nthis doesn’t happen too much anymore I package most things, and I hope \u003ccode\u003ehatch new\u003c/code\u003e completely breaks this habbit of mine.\u003c/p\u003e\n\u003cp\u003eLet’s say I have the following existing project.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ tree\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└── hatch_init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    └── __init__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e directory, \u003cspan class=\"m\"\u003e1\u003c/span\u003e file\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI can setup packaging with hatch by running.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipx run hatch new --init\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/8e43edca-57d9-4bbf-9ca8-c6d026356be3.webp\" class=\"glightbox-link\" aria-label=\"hatch-init-existing.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/8e43edca-57d9-4bbf-9ca8-c6d026356be3.webp\" alt=\"hatch-init-existing.webp\"/ data-glightbox=\"description: hatch-init-existing.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eThe \u003ccode\u003epyproject.toml\u003c/code\u003e that comes out is pretty similar to the one that comes out\nof the normal \u003ccode\u003ehatch new\u003c/code\u003e, but without any other files.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNote that you will need to setup a \u003ccode\u003e__about__.py\u003c/code\u003e yourself for the dynamic\nversioning that it has setup for you.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuild-system\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erequires\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;hatchling\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebuild-backend\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;hatchling.build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eproject\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;hatch-init\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;initialize an existing project using hatch\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereadme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;README.md\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erequires-python\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026gt;=3.7\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elicense\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;MIT\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ekeywords\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Waylon S. Walker\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eemail\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;waylon@waylonwalker.com\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eclassifiers\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;Development Status :: 4 - Beta\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;Programming Language :: Python\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;Programming Language :: Python :: 3.7\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;Programming Language :: Python :: 3.8\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;Programming Language :: Python :: 3.9\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;Programming Language :: Python :: 3.10\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;Programming Language :: Python :: 3.11\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;Programming Language :: Python :: Implementation :: CPython\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;Programming Language :: Python :: Implementation :: PyPy\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edependencies\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edynamic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eproject\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eurls\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eDocumentation\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/unknown/hatch-init#readme\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eIssues\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/unknown/hatch-init/issues\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eSource\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/unknown/hatch-init\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehatch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;hatch_init/__about__.py\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehatch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenvs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edependencies\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;pytest\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;pytest-cov\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehatch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenvs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003escripts\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecov\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=hatch_init --cov=tests\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eno-cov\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cov --no-cov\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003etool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehatch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenvs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etest\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ematrix\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epython\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;37\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;38\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;39\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;310\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;311\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecoverage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebranch\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eparallel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eomit\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;hatch_init/__about__.py\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecoverage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ereport\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_lines\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;no cov\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;if __name__ == .__main__.:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;if TYPE_CHECKING:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"cli\"\u003ecli \u003ca href=\"#cli\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003ehatch new\u003c/code\u003e does not stop there, it also has a \u003ccode\u003e--cli\u003c/code\u003e flag to give you a cli\nout of the box as well.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ pipx run hatch new \u003cspan class=\"s2\"\u003e\u0026#34;new cli\u0026#34;\u003c/span\u003e --cli\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enew-cli\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── new_cli\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── cli\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   │   └── __init__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── __about__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── __init__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   └── __main__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── tests\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   └── __init__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── LICENSE.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└── pyproject.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen you use the \u003ccode\u003e--cli\u003c/code\u003e flag you also get \u003ccode\u003eclick\u003c/code\u003e as a dependency and\n\u003ccode\u003eproject.scripts\u003c/code\u003e setup automatically.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e[project]\nname = \u0026#34;new-cli\u0026#34;\n\n# ...\n\ndependencies = [\n  \u0026#34;click\u0026#34;,\n]\n\n# ...\n\n[project.scripts]\nnew-cli = \u0026#34;new_cli.cli:new_cli\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003ca href=\"https://stable-diffusion.waylonwalker.com/000130.98801549.webp\" class=\"glightbox-link\" aria-label=\"“An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk trending on artstation” -s50 -W800 -H450 -C7.5 -Ak_lms -S98801549\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000130.98801549.webp\" alt=\"“An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk trending on artstation” -s50 -W800 -H450 -C7.5 -Ak_lms -S98801549\n\"/ data-glightbox=\"description: “An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk trending on artstation” -s50 -W800 -H450 -C7.5 -Ak_lms -S98801549\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"whats-in-the-cli\"\u003ewhat’s in the cli \u003ca href=\"#whats-in-the-cli\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIt’s a hello-world click application.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# SPDX-FileCopyrightText: 2022-present Waylon S. Walker \u0026lt;waylon@waylonwalker.com\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# SPDX-License-Identifier: MIT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003eclick\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003e..__about__\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003e__version__\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@click.group\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext_settings\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;help_option_names\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;-h\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;--help\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]},\u003c/span\u003e \u003cspan class=\"n\"\u003einvoke_without_command\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@click.version_option\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eversion\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003e__version__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eprog_name\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;new cli\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@click.pass_context\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003enew_cli\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ectx\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eclick\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eContext\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eclick\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eecho\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Hello world!\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"sneak-peek\"\u003esneak peek \u003ca href=\"#sneak-peek\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI’ll dive more into environments and the run command later, but we can run the\ncli pretty damn quick with two commands. In under 5s I was able to run this cli\nthat it created.  This is a pretty incredible startup time.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/608b7c9c-3cff-4659-87d4-6e5618f6dbcb.webp\" class=\"glightbox-link\" aria-label=\"pipx-run-hatch-hello-world.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/608b7c9c-3cff-4659-87d4-6e5618f6dbcb.webp\" alt=\"pipx-run-hatch-hello-world.webp\"/ data-glightbox=\"description: pipx-run-hatch-hello-world.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/bb318422-4943-4cf2-b987-cab4839ebfce.webp\" class=\"glightbox-link\" aria-label=\"“An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk trending on artstation, neon lighting, volumetric lighting, pink lighting” -s50 -W800 -H450 -C7.5 -Ak_lms -S2274808816\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/file/bb318422-4943-4cf2-b987-cab4839ebfce.webp\" alt=\"“An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk trending on artstation, neon lighting, volumetric lighting, pink lighting” -s50 -W800 -H450 -C7.5 -Ak_lms -S2274808816\"/ data-glightbox=\"description: “An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk trending on artstation, neon lighting, volumetric lighting, pink lighting” -s50 -W800 -H450 -C7.5 -Ak_lms -S2274808816\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nI'm really getting into using hatch as my go to build system, and I am really\nliking it so far.  I am slowly finding new  things that just work really well.\n`hatch new` is one of those things that I didn't realize I needed until I had\nit.\n\n\n![Hatch new cover image](https://dropper.waylonwalker.com/file/86bc196b-60ae-4a74-a7c9-48aebb2edc0e.webp)\n\n\u003e creating new versions created by myself with stable diffusion\n\n![hatch-new-cli.webp](https://dropper.waylonwalker.com/api/file/765d9f0c-c73a-44e5-8f0a-0027dff67abe.webp)\n\n```\n❯ pipx run hatch new --help\nUsage: hatch new [OPTIONS] [NAME] [LOCATION]\n\n  Create or initialize a project.\n\nOptions:\n  -i, --interactive  Interactively choose details about the project\n  --cli              Give the project a command line interface\n  --init             Initialize an existing project\n  -h, --help         Show this message and exit.\n```\n\n\u003e Note! I am running all of these commands with pipx. I like to use pipx for\n\u003e all of my system level cli applications.  To emphasis this point in the\n\u003e article I am going to use `pipx run hatch`, but you can `pipx install hatch`\n\u003e then just run `hatch` from there.\n\n## Interacively create a new project\n\nRunning `hatch new -i` will ask let you interactivly choose details about the\nproject, such as the project's name.\n\n```\npipx run hatch new -i\n```\n\nAfter running and naming the project **Hatch New** we end up with the following\nfiletree.\n\n``` bash\n❯ tree .\n.\n├── hatch_new\n│   ├── __about__.py\n│   └── __init__.py\n├── LICENSE.txt\n├── pyproject.toml\n├── README.md\n└── tests\n    └── __init__.py\n```\n\n## Non-Interative\n\nYou can also fill in the project name ahead of time, and it will run without\nany questions.\n\n![hatch-new-another-project.webp](https://dropper.waylonwalker.com/api/file/7d902784-e69e-4990-a711-22365665594c.webp)\n\n``` bash\n❯ pipx run hatch new \"Another Project\"\nanother-project\n├── another_project\n│   ├── __about__.py\n│   └── __init__.py\n├── tests\n│   └── __init__.py\n├── LICENSE.txt\n├── README.md\n└── pyproject.toml\n```\n\n\u003e Note! all of these examples will create a project directory within your\n\u003e current working directory.\n\n![\"An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk, octane render, trending on artstation, neon lighting, volumetric lighting, pink lighting\" -s50 -W800 -H450 -C10.0 -Ak_lms -S324995023](https://dropper.waylonwalker.com/file/da377ba0-89f8-4b40-b0a6-c2c742c6b11f.webp)\n\n## --init\n_existing project_\n\n`hatch new` has an `--init` flag in order to initialize a new hatch\npyproject.toml in an existing project.  This feels like it would be useful if\nyou are converting a project to hatch, or if like me you sometimes start making\nsomething before you realize it's something that you want to package.  Honestly\nthis doesn't happen too much anymore I package most things, and I hope `hatch\nnew` completely breaks this habbit of mine.\n\nLet's say I have the following existing project.\n\n``` bash\n❯ tree\n.\n└── hatch_init\n    └── __init__.py\n\n1 directory, 1 file\n```\n\nI can setup packaging with hatch by running.\n\n``` bash\npipx run hatch new --init\n```\n\n![hatch-init-existing.webp](https://dropper.waylonwalker.com/api/file/8e43edca-57d9-4bbf-9ca8-c6d026356be3.webp)\n\n\nThe `pyproject.toml` that comes out is pretty similar to the one that comes out\nof the normal `hatch new`, but without any other files.\n\n\u003e Note that you will need to setup a `__about__.py` yourself for the dynamic\n\u003e versioning that it has setup for you.\n\n``` toml\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[project]\nname = \"hatch-init\"\ndescription = 'initialize an existing project using hatch'\nreadme = \"README.md\"\nrequires-python = \"\u003e=3.7\"\nlicense = \"MIT\"\nkeywords = []\nauthors = [\n  { name = \"Waylon S. Walker\", email = \"waylon@waylonwalker.com\" },\n]\nclassifiers = [\n  \"Development Status :: 4 - Beta\",\n  \"Programming Language :: Python\",\n  \"Programming Language :: Python :: 3.7\",\n  \"Programming Language :: Python :: 3.8\",\n  \"Programming Language :: Python :: 3.9\",\n  \"Programming Language :: Python :: 3.10\",\n  \"Programming Language :: Python :: 3.11\",\n  \"Programming Language :: Python :: Implementation :: CPython\",\n  \"Programming Language :: Python :: Implementation :: PyPy\",\n]\ndependencies = []\ndynamic = [\"version\"]\n\n[project.urls]\nDocumentation = \"https://github.com/unknown/hatch-init#readme\"\nIssues = \"https://github.com/unknown/hatch-init/issues\"\nSource = \"https://github.com/unknown/hatch-init\"\n\n[tool.hatch.version]\npath = \"hatch_init/__about__.py\"\n\n[tool.hatch.envs.default]\ndependencies = [\n  \"pytest\",\n  \"pytest-cov\",\n]\n[tool.hatch.envs.default.scripts]\ncov = \"pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=hatch_init --cov=tests\"\nno-cov = \"cov --no-cov\"\n\n[[tool.hatch.envs.test.matrix]]\npython = [\"37\", \"38\", \"39\", \"310\", \"311\"]\n\n[tool.coverage.run]\nbranch = true\nparallel = true\nomit = [\n  \"hatch_init/__about__.py\",\n]\n\n[tool.coverage.report]\nexclude_lines = [\n  \"no cov\",\n  \"if __name__ == .__main__.:\",\n  \"if TYPE_CHECKING:\",\n]\n```\n\n## cli\n\n`hatch new` does not stop there, it also has a `--cli` flag to give you a cli\nout of the box as well.\n\n``` bash\n❯ pipx run hatch new \"new cli\" --cli\nnew-cli\n├── new_cli\n│   ├── cli\n│   │   └── __init__.py\n│   ├── __about__.py\n│   ├── __init__.py\n│   └── __main__.py\n├── tests\n│   └── __init__.py\n├── LICENSE.txt\n├── README.md\n└── pyproject.toml\n```\n\nWhen you use the `--cli` flag you also get `click` as a dependency and\n`project.scripts` setup automatically.\n\n```\n[project]\nname = \"new-cli\"\n\n# ...\n\ndependencies = [\n  \"click\",\n]\n\n# ...\n\n[project.scripts]\nnew-cli = \"new_cli.cli:new_cli\"\n```\n\n![\"An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk trending on artstation\" -s50 -W800 -H450 -C7.5 -Ak_lms -S98801549\n](https://stable-diffusion.waylonwalker.com/000130.98801549.webp)\n\n## what's in the cli\n\nIt's a hello-world click application.\n\n``` python\n# SPDX-FileCopyrightText: 2022-present Waylon S. Walker \u003cwaylon@waylonwalker.com\u003e\n#\n# SPDX-License-Identifier: MIT\nimport click\n\nfrom ..__about__ import __version__\n\n\n@click.group(context_settings={'help_option_names': ['-h', '--help']}, invoke_without_command=True)\n@click.version_option(version=__version__, prog_name='new cli')\n@click.pass_context\ndef new_cli(ctx: click.Context):\n    click.echo('Hello world!')\n```\n\n## sneak peek\n\nI'll dive more into environments and the run command later, but we can run the\ncli pretty damn quick with two commands. In under 5s I was able to run this cli\nthat it created.  This is a pretty incredible startup time.\n\n\n![pipx-run-hatch-hello-world.webp](https://dropper.waylonwalker.com/api/file/608b7c9c-3cff-4659-87d4-6e5618f6dbcb.webp)\n\n![\"An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk trending on artstation, neon lighting, volumetric lighting, pink lighting\" -s50 -W800 -H450 -C7.5 -Ak_lms -S2274808816](https://dropper.waylonwalker.com/file/bb318422-4943-4cf2-b987-cab4839ebfce.webp)\n",
      "summary": "I'm really getting into using hatch as my go to build system, and I am really liking it so far. I am slowly finding new things that just work really well. is...",
      "date_published": "2022-09-02T07:54:03Z",
      "date_modified": "2022-09-02T07:54:03Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/hatch-version/",
      "url": "https://waylonwalker.com/hatch-version/",
      "title": "Versioning Python Projects with Hatch",
      "content_html": "\u003cp\u003eHatch has an amazing versioning cli for python packages that just works.  It\ntakes very little config to get going and you can start bumping versions\nwithout worry.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://dropper.waylonwalker.com/file/249097cc-ca95-4976-89cc-bc23004ef376.webp\" class=\"glightbox-link\" aria-label=\"Hatch version cover image\"\u003e\u003cimg src=\"https://dropper.waylonwalker.com/file/249097cc-ca95-4976-89cc-bc23004ef376.webp\" alt=\"Hatch version cover image\" class=\"more-cinematic glightbox\"/ data-glightbox=\"description: Hatch version cover image\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecreating new versions created by myself with stable diffusion\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"project-layout\"\u003eproject layout \u003ca href=\"#project-layout\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor trying out the \u003ccode\u003ehatch version\u003c/code\u003e cli let’s make a simple project with the\nterrible name \u003ccode\u003epkg\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ tree .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── pkg\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── __about__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   └── __init__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── pyproject.toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└── README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e directory, \u003cspan class=\"m\"\u003e4\u003c/span\u003e files\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"pyprojecttoml\"\u003epyproject.toml \u003ca href=\"#pyprojecttoml\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe main hero of this post is the \u003ccode\u003epyproject.toml\u003c/code\u003e.  This is what defines all\nof our \u003ca href=\"https://peps.python.org/pep-0517/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/peps.python.org.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/peps.python.org.png\" class=\"has-avatar  has-avatar-before\"\u003ePEP 517\u003c/a\u003e style project setup.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eproject\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pkg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Show how to version packages with hatch\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereadme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;README.md\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edynamic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"s2\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuild-system\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erequires\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"s2\"\u003e\u0026#34;hatchling\u0026gt;=1.4.1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebuild-backend\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;hatchling.build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehatch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pkg/__about__.py\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"statically-versioning\"\u003estatically versioning \u003ca href=\"#statically-versioning\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003eproject.version\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eIt is possible to set the version number inside the \u003ccode\u003epyproject.toml\u003c/code\u003e\nstatically.  This is fine if you just want to version your package manually,\nand not through the \u003ccode\u003ehatch\u003c/code\u003e cli.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eproject\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pkg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;0.0.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003eStatically versioning in pyproject.toml will not work with \u003ccode\u003ehatch version\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/5e0db9e0-e60a-4a50-8f96-02f194347b2c.webp\" class=\"glightbox-link\" aria-label=\"hatch-static-version-error.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/5e0db9e0-e60a-4a50-8f96-02f194347b2c.webp\" alt=\"hatch-static-version-error.webp\"/ data-glightbox=\"description: hatch-static-version-error.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCannot \u003cspan class=\"nb\"\u003eset\u003c/span\u003e version when it is statically defined by the \u003cspan class=\"sb\"\u003e`\u003c/span\u003eproject.version\u003cspan class=\"sb\"\u003e`\u003c/span\u003e field\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"dynamically-versioning\"\u003edynamically Versioning \u003ca href=\"#dynamically-versioning\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003eproject.dynamic\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eSetting the project verion dynamically can be done by changing up the following\nto your \u003ccode\u003epyproject.toml\u003c/code\u003e.  Hatch only accepts a path to store your version.  If\nyou need to reference  it elsewhere in your project you can grab it from the\npackage metadata for that file.  I would not put anything else that could\npossibly clash with the version, as you might accidently change both things.\u003c/p\u003e\n\u003cp\u003eIf you really need to set it in more places use a package like bump2version.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eproject\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pkg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edynamic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehatch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pkg/__about__.py\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003eNote: you can configure hatch to use a different pattern\n\u003ca href=\"https://hatch.pypa.io/1.2/version/#configuration\"\u003ehttps://hatch.pypa.io/1.2/version/#configuration\u003c/a\u003e, but I have not found it to\nbe something that I need.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"--about--py\"\u003e\u003cstrong\u003eabout\u003c/strong\u003e.py \u003ca href=\"#--about--py\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ca href=\"https://github.com/pypa/hatch/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003ehatch\u003c/a\u003e project itself uses a\n\u003ca href=\"https://github.com/pypa/hatch/blob/master/src/hatch/__about__.py\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003e\u003cstrong\u003eabout\u003c/strong\u003e.py\u003c/a\u003e\nto store it’s version. It’s sole content is a single \u003ccode\u003e__version__\u003c/code\u003e variable.  I\ndon’t have any personal issues with this so I am going to be following this in\nmy projects that use hatch.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e__version__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;0.0.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"versioning\"\u003eversioning \u003ca href=\"#versioning\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003e\u003ca href=\"https://hatch.pypa.io/1.2/version/#updating\"\u003ehatch version docs\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eHatch has a pretty intuitive versioning api.  \u003ccode\u003ehatch version\u003c/code\u003e gives you the\nversion.  If you pass in a version like \u003ccode\u003ehatch version \u0026#34;0.0.1\u0026#34;\u003c/code\u003e it will set it\nto that version as long as it is in the future, otherwise it will error.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# print the current version\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehatch version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# set the version to 0.0.1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehatch version \u003cspan class=\"s2\"\u003e\u0026#34;0.0.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"bumping\"\u003ebumping \u003ca href=\"#bumping\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou can bump parts of the \u003ca href=\"https://semver.org/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/semver.org.jpg\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/semver.org.jpg\" class=\"has-avatar  has-avatar-before\"\u003esemver\u003c/a\u003e version.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# minor bump\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehatch version minor\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# beta pre-release bump\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# If published to pypi this can be installed with the --pre flag to pip\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehatch version b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# bump minor and beta\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehatch version minor,b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# release all of the --pre-release flags such as alpha beta rc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehatch release\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"example\"\u003eExample \u003ca href=\"#example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere is a screenshot of bumping a projet along.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/322a0310-0cea-4320-9f13-955bcd6b5e17.webp\" class=\"glightbox-link\" aria-label=\"hatch-version-cli.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/322a0310-0cea-4320-9f13-955bcd6b5e17.webp\" alt=\"hatch-version-cli.webp\"/ data-glightbox=\"description: hatch-version-cli.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"gitops\"\u003eGitOps \u003ca href=\"#gitops\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn my github actions flow I will be utilizing this to automate my versions. In\nmy side projects I use the \u003ccode\u003edevelop\u003c/code\u003e branch to release –pre releases.  I have\nall of my own dependent projets running on these –pre releases, this allows me\nto cut myself in my own projects before anyone else.  Then on main I\nautomatically release this beta version.\u003c/p\u003e\n\u003ch2 id=\"github-actions\"\u003eGitHub Actions \u003ca href=\"#github-actions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere is what the ci/cd for \u003ccode\u003emarkata\u003c/code\u003e looks like. There  might be a better\nworkflow strategy, but I use a single github actions workflow and cut branches\nto release –pre releases and full release.  These steps will bump, tag,\ncommit, and deploy for me.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eautomatically pre-release develop branch\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.ref == \u0026#39;refs/heads/develop\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git config --global user.name \u0026#39;autobump\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git config --global user.email \u0026#39;autobump@markata.dev\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          VERSION=`hatch version`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          # if current version is not already beta then bump minor and beta\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          [ -z \u0026#34;${b##*`hatch version`*}\u0026#34; ] \u0026amp;\u0026amp; hatch version b || hatch version minor,b\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          NEW_VERSION=`hatch version`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git add markta/__about__.py\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git commit -m \u0026#34;Bump version: $VERSION → $NEW_VERSION\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git tag $VERSION\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git push\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git push --tags\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eautomatically release main branch\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.ref == \u0026#39;refs/heads/main\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git config --global user.name \u0026#39;autobump\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git config --global user.email \u0026#39;autobump@markata.dev\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          VERSION=`hatch version`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          hatch version release\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          NEW_VERSION=`hatch version`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git add markta/__about__.py\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git commit -m \u0026#34;Bump version: $VERSION → $NEW_VERSION\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git tag $VERSION\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git push\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git push --tags\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          python -m build\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epypi-publish\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.ref == \u0026#39;refs/heads/develop\u0026#39; || github.ref == \u0026#39;refs/heads/main\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epypa/gh-action-pypi-publish@v1.1.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epassword\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.pypi_password }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"hatch-version-action\"\u003eHatch Version Action \u003ca href=\"#hatch-version-action\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI am setting up a github custom action\n\u003ca href=\"https://github.com/WaylonWalker/hatch-version-action\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003ewaylonwalker/hatch-version-action\u003c/a\u003e\nthat will lint, test, bump, and publish for me in one step.  More on that in\nthe future.\u003c/p\u003e\n",
      "content_text": "\nHatch has an amazing versioning cli for python packages that just works.  It\ntakes very little config to get going and you can start bumping versions\nwithout worry.\n\n![Hatch version cover image](https://dropper.waylonwalker.com/file/249097cc-ca95-4976-89cc-bc23004ef376.webp){.more-cinematic}\n\n\u003e creating new versions created by myself with stable diffusion\n\n## project layout\n\nFor trying out the `hatch version` cli let's make a simple project with the\nterrible name `pkg`.\n\n``` bash\n❯ tree .\n.\n├── pkg\n│   ├── __about__.py\n│   └── __init__.py\n├── pyproject.toml\n└── README.md\n\n1 directory, 4 files\n```\n\n## pyproject.toml\n\nThe main hero of this post is the `pyproject.toml`.  This is what defines all\nof our [PEP 517](https://peps.python.org/pep-0517/) style project setup.\n\n``` toml\n[project]\nname = \"pkg\"\ndescription = \"Show how to version packages with hatch\"\nreadme = \"README.md\"\ndynamic = [\n \"version\",\n]\n\n[build-system]\nrequires = [\n \"hatchling\u003e=1.4.1\",\n]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.version]\npath = \"pkg/__about__.py\"\n```\n\n## statically versioning\n\n_project.version_\n\nIt is possible to set the version number inside the `pyproject.toml`\nstatically.  This is fine if you just want to version your package manually,\nand not through the `hatch` cli.\n\n``` toml\n[project]\nname = \"pkg\"\nversion = \"0.0.0\"\n# ...\n```\n\n\u003e Statically versioning in pyproject.toml will not work with `hatch version`\n\n![hatch-static-version-error.webp](https://dropper.waylonwalker.com/api/file/5e0db9e0-e60a-4a50-8f96-02f194347b2c.webp)\n\n``` bash\nCannot set version when it is statically defined by the `project.version` field\n```\n\n## dynamically Versioning\n\n_project.dynamic_\n\nSetting the project verion dynamically can be done by changing up the following\nto your `pyproject.toml`.  Hatch only accepts a path to store your version.  If\nyou need to reference  it elsewhere in your project you can grab it from the\npackage metadata for that file.  I would not put anything else that could\npossibly clash with the version, as you might accidently change both things.\n\nIf you really need to set it in more places use a package like bump2version.\n\n``` toml\n[project]\nname = \"pkg\"\ndynamic = [\n  \"version\"\n]\n# ...\n[tool.hatch.version]\npath = \"pkg/__about__.py\"\n```\n\n\u003e Note: you can configure hatch to use a different pattern\n\u003e \u003chttps://hatch.pypa.io/1.2/version/#configuration\u003e, but I have not found it to\n\u003e be something that I need.\n\n## __about__.py\n\nThe [hatch](https://github.com/pypa/hatch/) project itself uses a\n[__about__.py](https://github.com/pypa/hatch/blob/master/src/hatch/__about__.py)\nto store it's version. It's sole content is a single `__version__` variable.  I\ndon't have any personal issues with this so I am going to be following this in\nmy projects that use hatch.\n\n``` python\n__version__ = \"0.0.0\"\n```\n\n## versioning\n\n_[hatch version docs](https://hatch.pypa.io/1.2/version/#updating)_\n\nHatch has a pretty intuitive versioning api.  `hatch version` gives you the\nversion.  If you pass in a version like `hatch version \"0.0.1\"` it will set it\nto that version as long as it is in the future, otherwise it will error.\n\n``` bash\n# print the current version\nhatch version\n\n# set the version to 0.0.1\nhatch version \"0.0.1\"\n```\n\n## bumping\n\nYou can bump parts of the [semver](https://semver.org/) version.\n\n``` bash\n# minor bump\nhatch version minor\n\n# beta pre-release bump\n# If published to pypi this can be installed with the --pre flag to pip\nhatch version b\n\n# bump minor and beta\nhatch version minor,b\n\n# release all of the --pre-release flags such as alpha beta rc\nhatch release\n```\n\n## Example\n\nHere is a screenshot of bumping a projet along.\n\n![hatch-version-cli.webp](https://dropper.waylonwalker.com/api/file/322a0310-0cea-4320-9f13-955bcd6b5e17.webp)\n\n## GitOps\n\nIn my github actions flow I will be utilizing this to automate my versions. In\nmy side projects I use the `develop` branch to release --pre releases.  I have\nall of my own dependent projets running on these --pre releases, this allows me\nto cut myself in my own projects before anyone else.  Then on main I\nautomatically release this beta version.\n\n## GitHub Actions\n\nHere is what the ci/cd for `markata` looks like. There  might be a better\nworkflow strategy, but I use a single github actions workflow and cut branches\nto release --pre releases and full release.  These steps will bump, tag,\ncommit, and deploy for me.\n\n``` yaml\n      - name: automatically pre-release develop branch\n        if: github.ref == 'refs/heads/develop'\n        run: |\n          git config --global user.name 'autobump'\n          git config --global user.email 'autobump@markata.dev'\n          VERSION=`hatch version`\n          # if current version is not already beta then bump minor and beta\n          [ -z \"${b##*`hatch version`*}\" ] \u0026\u0026 hatch version b || hatch version minor,b\n          NEW_VERSION=`hatch version`\n          git add markta/__about__.py\n          git commit -m \"Bump version: $VERSION → $NEW_VERSION\"\n          git tag $VERSION\n          git push\n          git push --tags\n\n      - name: automatically release main branch\n        if: github.ref == 'refs/heads/main'\n        run: |\n          git config --global user.name 'autobump'\n          git config --global user.email 'autobump@markata.dev'\n          VERSION=`hatch version`\n          hatch version release\n          NEW_VERSION=`hatch version`\n          git add markta/__about__.py\n          git commit -m \"Bump version: $VERSION → $NEW_VERSION\"\n          git tag $VERSION\n          git push\n          git push --tags\n\n      - name: build\n        run: |\n          python -m build\n\n      - name: pypi-publish\n        if: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/main'\n        uses: pypa/gh-action-pypi-publish@v1.1.0\n        with:\n          password: ${{ secrets.pypi_password }}\n```\n\n## Hatch Version Action\n\nI am setting up a github custom action\n[waylonwalker/hatch-version-action](https://github.com/WaylonWalker/hatch-version-action)\nthat will lint, test, bump, and publish for me in one step.  More on that in\nthe future.\n",
      "summary": "Hatch has an amazing versioning cli for python packages that just works. It takes very little config to get going and you can start bumping versions without...",
      "date_published": "2022-09-01T13:19:22Z",
      "date_modified": "2022-09-01T13:19:22Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/from-markdown-to-blog-with-markata/",
      "url": "https://waylonwalker.com/from-markdown-to-blog-with-markata/",
      "title": "From Markdown to Blog with Markata | lightning talk | python web conf 2022",
      "content_html": "\u003cp\u003eMarkata is a great python framework that allows you to go from markdown to a\nfull website very quickly.  You can get up and running with nothing more than\nMarkdown.  It is also built on a full plugin architecture, so if there is extra\nfunctionality that you want to add, you can create a plugin to make it behave\nlike you want.\u003c/p\u003e\n\u003cp\u003eFull transparancy… I built markata.\u003c/p\u003e\n\u003ch2 id=\"the-talk\"\u003eThe talk \u003ca href=\"#the-talk\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe talk is live on YouTube.  Make sure you check out the other videos from the\nconference.  There were quite a few quality talks that deserve a watch as well.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://youtu.be/Wq9YBamSgs0\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/youtu.be.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/youtu.be.png\" class=\"has-avatar  has-avatar-before\"\u003ehttps://youtu.be/Wq9YBamSgs0\u003c/a\u003e\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000221.1721400243.webp\" class=\"glightbox-link\" aria-label=\"“An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -S3617210203\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000221.1721400243.webp\" alt=\"“An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -S3617210203\"/ data-glightbox=\"description: “An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art” -s50 -W768 -H448 -C7.5 -Ak_lms -S3617210203\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nMarkata is a great python framework that allows you to go from markdown to a\nfull website very quickly.  You can get up and running with nothing more than\nMarkdown.  It is also built on a full plugin architecture, so if there is extra\nfunctionality that you want to add, you can create a plugin to make it behave\nlike you want.\n\nFull transparancy... I built markata.\n\n## The talk\n\nThe talk is live on YouTube.  Make sure you check out the other videos from the\nconference.  There were quite a few quality talks that deserve a watch as well.\n\nhttps://youtu.be/Wq9YBamSgs0\n\n\n![\"An astronaut working in a lab, hacking on a computer terminal, htop is running, shallow depth of field beakers, test tubes, volumetric lighting, pink lighting, by victo ngai, killian eng vibrant colours, dynamic lighting, digital art\" -s50 -W768 -H448 -C7.5 -Ak_lms -S3617210203](https://stable-diffusion.waylonwalker.com/000221.1721400243.webp)\n",
      "summary": "Markata is a great python framework that allows you to go from markdown to a full website very quickly. You can get up and running with nothing more than...",
      "date_published": "2022-08-31T10:01:09Z",
      "date_modified": "2022-08-31T10:01:09Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "markata",
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/i-spoke-at-python-web-conf-2022/",
      "url": "https://waylonwalker.com/i-spoke-at-python-web-conf-2022/",
      "title": "I spoke at Python Web Conf 2022",
      "content_html": "\u003cp\u003eI spoke at python webconf in March 2022 about how I deploy this blog on a\ncontinuous basis.\u003c/p\u003e\n\u003cp\u003eBuilding this blog has brought me a lot of benefits.  I have\na set of custom curated notes to help describe a problem and how to solve it to\nme.  At theis point it’s not uncommon to google an Issue I am having and\nfinding my own blog with exactly the solution I need at the top.\u003c/p\u003e\n\u003cp\u003eI also bump into people from time to time that recognize me from the blog, its\na nice conversation starter, and street cred.\u003c/p\u003e\n\u003ch2 id=\"the-talk\"\u003eThe Talk \u003ca href=\"#the-talk\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe talk recently released on Youtube, you can watch it without having a ticket\nto the conference for free.  There were a bunch of other talks that you should\ncheck out too!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://youtu.be/JDZVjDCTKHE\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/youtu.be.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/youtu.be.png\" class=\"has-avatar  has-avatar-before\"\u003ehttps://youtu.be/JDZVjDCTKHE\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI spoke at python webconf in March 2022 about how I deploy this blog on a\ncontinuous basis.\n\nBuilding this blog has brought me a lot of benefits.  I have\na set of custom curated notes to help describe a problem and how to solve it to\nme.  At theis point it's not uncommon to google an Issue I am having and\nfinding my own blog with exactly the solution I need at the top.\n\nI also bump into people from time to time that recognize me from the blog, its\na nice conversation starter, and street cred.\n\n## The Talk\n\nThe talk recently released on Youtube, you can watch it without having a ticket\nto the conference for free.  There were a bunch of other talks that you should\ncheck out too!\n\nhttps://youtu.be/JDZVjDCTKHE\n",
      "summary": "I spoke at python webconf in March 2022 about how I deploy this blog on a continuous basis.",
      "date_published": "2022-08-30T08:40:22Z",
      "date_modified": "2022-08-30T08:40:22Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/pypi-2fa/",
      "url": "https://waylonwalker.com/pypi-2fa/",
      "title": "I turned on 2FA for all of my pypi packages",
      "content_html": "\u003cp\u003eI got all the pypi packages that I own behind 2 factor authentication. 💪\u003c/p\u003e\n\u003cp\u003eRecently this really made it’s rounds in the python news since pypi was\nrequiring critical package maintainers to have 2FA on and even offering them\nhardware tokens to help them turn this on.\u003c/p\u003e\n\u003cp\u003eI feel like this caused a bit of confusion as turning on 2FA does not mean that\nyou need to do anything different to deploy a package, and it \u003cstrong\u003eDOES NOT\u003c/strong\u003e\nrequire a hardware token.  You can continue using your favorite 2FA app.\u003c/p\u003e\n\u003cp\u003eYou might wonder what this means for my projects. It means that to edit any\n\u003cem\u003esensitive content\u003c/em\u003e such as pull a new api token, add/remove maintainers, or\ndeleting a release I need to use a TOPT (time based one time password)\napplication such as Google Authenticator, Microsoft Authenticator, Authy, or\nFreeOTP.\u003c/p\u003e\n\u003cp\u003eThis has very little change to my overall workflow as my CI system still\nautomatically deploys for me with the same api token as before.\u003c/p\u003e\n\u003cp\u003eThis is one small thing that maintainers can do to prevent supply chain attacks\non their projects that they put so much work into.\u003c/p\u003e\n\u003ch2 id=\"login\"\u003eLogin \u003ca href=\"#login\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen I log in I now get this extra screen asking for an auth token.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/ba6d1b7b-ea84-4b03-b53f-53ef7b1e9174.webp\" class=\"glightbox-link\" aria-label=\"pypi-2fa-code.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/ba6d1b7b-ea84-4b03-b53f-53ef7b1e9174.webp\" alt=\"pypi-2fa-code.webp\"/ data-glightbox=\"description: pypi-2fa-code.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"my-packages\"\u003eMy packages \u003ca href=\"#my-packages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOnce I turned on 2FA for my account I could then turn on 2FA requirement for\neach project.  I am not sure how much safety there is in pypi, it might require\nall maintainers to have it turned on before it allows packages to have it\nturned on.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/8a8c66d5-61a0-4a89-a23c-09976b8e95ae.webp\" class=\"glightbox-link\" aria-label=\"my-pypi-packages-aug-2022.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/8a8c66d5-61a0-4a89-a23c-09976b8e95ae.webp\" alt=\"my-pypi-packages-aug-2022.webp\"/ data-glightbox=\"description: my-pypi-packages-aug-2022.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eOnce turned on it requires anyone who maintains the project to have 2FA on to\nbe able to edit any sensitive content.\u003c/p\u003e\n",
      "content_text": "\nI got all the pypi packages that I own behind 2 factor authentication. 💪\n\nRecently this really made it's rounds in the python news since pypi was\nrequiring critical package maintainers to have 2FA on and even offering them\nhardware tokens to help them turn this on.\n\nI feel like this caused a bit of confusion as turning on 2FA does not mean that\nyou need to do anything different to deploy a package, and it **DOES NOT**\nrequire a hardware token.  You can continue using your favorite 2FA app.\n\nYou might wonder what this means for my projects. It means that to edit any\n_sensitive content_ such as pull a new api token, add/remove maintainers, or\ndeleting a release I need to use a TOPT (time based one time password)\napplication such as Google Authenticator, Microsoft Authenticator, Authy, or\nFreeOTP.\n\nThis has very little change to my overall workflow as my CI system still\nautomatically deploys for me with the same api token as before.\n\nThis is one small thing that maintainers can do to prevent supply chain attacks\non their projects that they put so much work into.\n\n## Login\n\nWhen I log in I now get this extra screen asking for an auth token.\n\n![pypi-2fa-code.webp](https://dropper.waylonwalker.com/api/file/ba6d1b7b-ea84-4b03-b53f-53ef7b1e9174.webp)\n\n## My packages\n\nOnce I turned on 2FA for my account I could then turn on 2FA requirement for\neach project.  I am not sure how much safety there is in pypi, it might require\nall maintainers to have it turned on before it allows packages to have it\nturned on.\n\n![my-pypi-packages-aug-2022.webp](https://dropper.waylonwalker.com/api/file/8a8c66d5-61a0-4a89-a23c-09976b8e95ae.webp)\n\nOnce turned on it requires anyone who maintains the project to have 2FA on to\nbe able to edit any sensitive content.\n",
      "summary": "I got all the pypi packages that I own behind 2 factor authentication. 💪",
      "date_published": "2022-08-29T07:51:54Z",
      "date_modified": "2022-08-29T07:51:54Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/vim-sort-u/",
      "url": "https://waylonwalker.com/vim-sort-u/",
      "title": "use vim to remove duplicates",
      "content_html": "\u003cp\u003eI just love how some features of vim are so discoverable and memorable once you\nreally start to grasp it.  Sorting and uniqing your files or ranges is one of\nthose examples for me.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026#34; sort the file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026#34; sort the file only keeping unique lines\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"nx\"\u003eu\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026#34; sort a range\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;,\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003esort\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026#34; sort a range only keeping unique lines\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;,\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"nx\"\u003eu\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI recently used this to dedupe my autogenerated links section for\n\u003ca href=\"https://waylonwalker.com/rich-syntax-range-style/\"\u003erich-syntax-range-style\u003c/a\u003e.\nMore often I am using it to sort and uniqify objects like arrays and lists.\u003c/p\u003e\n\u003cp\u003eHere is what the markdown looks like.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003epy-tree-sitter\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com/tree-sitter/py-tree-sitter\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003erich\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com/Textualize/rich\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003e@textualizeio\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://twitter.com/textualizeio\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003erich\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com/Textualize/rich\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003eanother post\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://waylonwalker.com/designing-kedro-router\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003eprint-register-pipelines\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://screenshots.waylonwalker.com/print-register-pipelines.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003erich\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com/Textualize/rich\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003econsole-print-register-pipelines\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://screenshots.waylonwalker.com/console-print-register-pipelines.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003erich\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com/Textualize/rich\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003esyntax-print-register-pipelines\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://screenshots.waylonwalker.com/syntax-print-register-pipelines.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003erich\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com/Textualize/rich\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003esyntax-print-register-pipelines-highlight-line\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://screenshots.waylonwalker.com/syntax-print-register-pipelines-highlight-line.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003epy-tree-sitter\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com/tree-sitter/py-tree-sitter\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen typing \u003ccode\u003evap:sort u\u003c/code\u003e yields a uniqly sorted list of links.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003e@textualizeio\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://twitter.com/textualizeio\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003eanother post\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://waylonwalker.com/designing-kedro-router\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003econsole-print-register-pipelines\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://screenshots.waylonwalker.com/console-print-register-pipelines.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003eprint-register-pipelines\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://screenshots.waylonwalker.com/print-register-pipelines.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003epy-tree-sitter\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com/tree-sitter/py-tree-sitter\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003erich\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com/Textualize/rich\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003esyntax-print-register-pipelines-highlight-line\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://screenshots.waylonwalker.com/syntax-print-register-pipelines-highlight-line.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e [\u003cspan class=\"nt\"\u003esyntax-print-register-pipelines\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://screenshots.waylonwalker.com/syntax-print-register-pipelines.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nI just love how some features of vim are so discoverable and memorable once you\nreally start to grasp it.  Sorting and uniqing your files or ranges is one of\nthose examples for me.\n\n\n``` vim\n\" sort the file\n:sort\n\" sort the file only keeping unique lines\n:sort u\n\n\n\" sort a range\n:'\u003c,'\u003e sort\n\" sort a range only keeping unique lines\n:'\u003c,'\u003e sort u\n```\n\nI recently used this to dedupe my autogenerated links section for\n[rich-syntax-range-style](https://waylonwalker.com/rich-syntax-range-style/).\nMore often I am using it to sort and uniqify objects like arrays and lists.\n\nHere is what the markdown looks like.\n\n``` markdown\n* [py-tree-sitter](https://github.com/tree-sitter/py-tree-sitter)\n* [rich](https://github.com/Textualize/rich)\n* [@textualizeio](https://twitter.com/textualizeio)\n* [rich](https://github.com/Textualize/rich)\n* [another post](https://waylonwalker.com/designing-kedro-router)\n* [print-register-pipelines](https://screenshots.waylonwalker.com/print-register-pipelines.webp)\n* [rich](https://github.com/Textualize/rich)\n* [console-print-register-pipelines](https://screenshots.waylonwalker.com/console-print-register-pipelines.webp)\n* [rich](https://github.com/Textualize/rich)\n* [syntax-print-register-pipelines](https://screenshots.waylonwalker.com/syntax-print-register-pipelines.webp)\n* [rich](https://github.com/Textualize/rich)\n* [syntax-print-register-pipelines-highlight-line](https://screenshots.waylonwalker.com/syntax-print-register-pipelines-highlight-line.webp)\n* [py-tree-sitter](https://github.com/tree-sitter/py-tree-sitter)\n```\n\nThen typing `vap:sort u` yields a uniqly sorted list of links.\n\n``` markdown\n* [@textualizeio](https://twitter.com/textualizeio)\n* [another post](https://waylonwalker.com/designing-kedro-router)\n* [console-print-register-pipelines](https://screenshots.waylonwalker.com/console-print-register-pipelines.webp)\n* [print-register-pipelines](https://screenshots.waylonwalker.com/print-register-pipelines.webp)\n* [py-tree-sitter](https://github.com/tree-sitter/py-tree-sitter)\n* [rich](https://github.com/Textualize/rich)\n* [syntax-print-register-pipelines-highlight-line](https://screenshots.waylonwalker.com/syntax-print-register-pipelines-highlight-line.webp)\n* [syntax-print-register-pipelines](https://screenshots.waylonwalker.com/syntax-print-register-pipelines.webp)\n```\n\n",
      "summary": "I just love how some features of vim are so discoverable and memorable once you really start to grasp it. Sorting and uniqing your files or ranges is one of...",
      "date_published": "2022-08-25T06:50:32Z",
      "date_modified": "2022-08-25T06:50:32Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/rich-syntax-range-style/",
      "url": "https://waylonwalker.com/rich-syntax-range-style/",
      "title": "Highlighting text ranges with Rich | python",
      "content_html": "\u003cp\u003eToday I’ve been playing with\n\u003ca href=\"https://github.com/tree-sitter/py-tree-sitter\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003epy-tree-sitter\u003c/a\u003e a bit and I\nwanted to highlight match ranges, but was unable to figure out how to do it\nwith \u003ca href=\"https://github.com/Textualize/rich\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003erich\u003c/a\u003e, so I reached out to\n\u003ca href=\"https://twitter.com/textualizeio\"\u003e@textualizeio\u003c/a\u003e for help.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/_WaylonWalker/status/1562469770766589952\"\u003ehttps://twitter.com/_WaylonWalker/status/1562469770766589952\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eWhile waiting for that reply let’s show how we got this far.\u003c/p\u003e\n\u003ch2 id=\"imports\"\u003eimports \u003ca href=\"#imports\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eLets import all the classes that we need from \u003ca href=\"https://github.com/Textualize/rich\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003erich\u003c/a\u003e and setup a console to print\nto.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003erich.console\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eConsole\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003erich.syntax\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eSyntax\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003erich.style\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eStyle\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econsole\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eConsole\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"some-code\"\u003esome code \u003ca href=\"#some-code\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow we need some code to highlight. I am going to rip my \u003ccode\u003eregister_pipeline\u003c/code\u003e\nfrom \u003ca href=\"https://waylonwalker.com/designing-kedro-router\"\u003eanother post\u003c/a\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003efrom find_kedro import find_kedro\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003edef register_pipelines(self) -\u0026gt; Dict[str, Pipeline]:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    \u0026#34;\u0026#34;\u0026#34;Register the project\u0026#39;s pipeline.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    Returns:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e        A mapping from a pipeline name to a ``Pipeline`` object.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    \u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    return find_kedro()\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"print\"\u003eprint \u003ca href=\"#print\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWe could simply print out the code we have as a variable, but thats a bit hard\nto read.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/765c471d-990f-4c7c-9c99-7a039c4db900.webp\" class=\"glightbox-link\" aria-label=\"print-register-pipelines.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/765c471d-990f-4c7c-9c99-7a039c4db900.webp\" alt=\"print-register-pipelines.webp\"/ data-glightbox=\"description: print-register-pipelines.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"consoleprint\"\u003econsole.print \u003ca href=\"#consoleprint\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eprinting with \u003ca href=\"https://github.com/Textualize/rich\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003erich\u003c/a\u003e’s console makes it a little better, but not much by default.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/b946c8b4-c1f0-4d58-8709-90c8f95a1f77.webp\" class=\"glightbox-link\" aria-label=\"console-print-register-pipelines.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/b946c8b4-c1f0-4d58-8709-90c8f95a1f77.webp\" alt=\"console-print-register-pipelines.webp\"/ data-glightbox=\"description: console-print-register-pipelines.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"syntax\"\u003eSyntax \u003ca href=\"#syntax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWe can pull from \u003ca href=\"https://github.com/Textualize/rich\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003erich\u003c/a\u003e’s syntax module to really pretty this up.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esyntax\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSyntax\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;python\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eline_numbers\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econsole\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esyntax\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/f9329423-c0f5-4263-b241-b8f470fc758c.webp\" class=\"glightbox-link\" aria-label=\"syntax-print-register-pipelines.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/f9329423-c0f5-4263-b241-b8f470fc758c.webp\" alt=\"syntax-print-register-pipelines.webp\"/ data-glightbox=\"description: syntax-print-register-pipelines.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eNow we are getting some really impressive print outs right in the terminal!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003enote that I have ipython set to use \u003ca href=\"https://github.com/Textualize/rich\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003erich\u003c/a\u003e, you will need to console.print() in scripts\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"highlight-lines\"\u003ehighlight lines \u003ca href=\"#highlight-lines\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow we can start highlighting lines right when we initialize our \u003ccode\u003eSyntax\u003c/code\u003e\ninstance.  It looks ok.  It’s not super visible, but more importantly its not\ngranular enough.  I want to highlight specific ranges like the word\nregister_pipelines.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esyntax\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSyntax\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;python\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eline_numbers\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ehighlight_lines\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econsole\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esyntax\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/20b4564e-3a08-4e5a-9bed-cda07779c8fb.webp\" class=\"glightbox-link\" aria-label=\"syntax-print-register-pipelines-highlight-line.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/20b4564e-3a08-4e5a-9bed-cda07779c8fb.webp\" alt=\"syntax-print-register-pipelines-highlight-line.webp\"/ data-glightbox=\"description: syntax-print-register-pipelines-highlight-line.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eThis hows the line, but still is not very accurate.\u003c/p\u003e\n\u003ch2 id=\"highlight-text\"\u003ehighlight text \u003ca href=\"#highlight-text\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e[@textualizeio] got back to me, let’s see if What we can do with stylize_range!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/textualizeio/status/1562487302274043904\"\u003ehttps://twitter.com/textualizeio/status/1562487302274043904\u003c/a\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esyntax\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSyntax\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;python\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eline_numbers\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003estyle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eStyle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ebgcolor\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;deep_pink4\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esyntax\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estylize_range\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e22\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econsole\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esyntax\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis gives us the final result we are looking for, we can easily see what is\nbeing targeted here.  In this case the function name \u003ccode\u003eregister_pipelines\u003c/code\u003e.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/b5f27c34-6ffe-425c-b2df-8ade7c5b6f8b.webp\" class=\"glightbox-link\" aria-label=\"syntax-highlight-range-register-pipelines.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/b5f27c34-6ffe-425c-b2df-8ade7c5b6f8b.webp\" alt=\"syntax-highlight-range-register-pipelines.webp\"/ data-glightbox=\"description: syntax-highlight-range-register-pipelines.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eThis turns out to be exacly what I am looking for.  Now I have an easy way to\nprint out highlighted code wtih my\n\u003ca href=\"https://github.com/tree-sitter/py-tree-sitter\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003epy-tree-sitter\u003c/a\u003e query results.\u003c/p\u003e\n\u003ch2 id=\"links\"\u003eLinks \u003ca href=\"#links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://twitter.com/textualizeio\"\u003e@textualizeio\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://waylonwalker.com/designing-kedro-router\"\u003eanother post\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tree-sitter/py-tree-sitter\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003epy-tree-sitter\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Textualize/rich\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003erich\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nToday I've been playing with\n[py-tree-sitter](https://github.com/tree-sitter/py-tree-sitter) a bit and I\nwanted to highlight match ranges, but was unable to figure out how to do it\nwith [rich](https://github.com/Textualize/rich), so I reached out to\n[@textualizeio](https://twitter.com/textualizeio) for help.\n\nhttps://twitter.com/_WaylonWalker/status/1562469770766589952\n\nWhile waiting for that reply let's show how we got this far.\n\n## imports\n\nLets import all the classes that we need from [rich](https://github.com/Textualize/rich) and setup a console to print\nto.\n\n``` python\nfrom rich.console import Console\nfrom rich.syntax import Syntax\nfrom rich.style import Style\n\nconsole = Console()\n```\n\n## some code\n\nNow we need some code to highlight. I am going to rip my `register_pipeline`\nfrom [another post](https://waylonwalker.com/designing-kedro-router).\n\n``` python\ncode = '''\nfrom find_kedro import find_kedro\n\ndef register_pipelines(self) -\u003e Dict[str, Pipeline]:\n    \"\"\"Register the project's pipeline.\n    Returns:\n        A mapping from a pipeline name to a ``Pipeline`` object.\n    \"\"\"\n    return find_kedro()\n'''\n```\n\n## print\n\nWe could simply print out the code we have as a variable, but thats a bit hard\nto read.\n\n![print-register-pipelines.webp](https://dropper.waylonwalker.com/api/file/765c471d-990f-4c7c-9c99-7a039c4db900.webp)\n\n## console.print\n\nprinting with [rich](https://github.com/Textualize/rich)'s console makes it a little better, but not much by default.\n\n![console-print-register-pipelines.webp](https://dropper.waylonwalker.com/api/file/b946c8b4-c1f0-4d58-8709-90c8f95a1f77.webp)\n\n## Syntax\n\nWe can pull from [rich](https://github.com/Textualize/rich)'s syntax module to really pretty this up.\n\n``` python\nsyntax = Syntax(code, 'python', line_numbers=True)\nconsole.print(syntax)\n```\n\n![syntax-print-register-pipelines.webp](https://dropper.waylonwalker.com/api/file/f9329423-c0f5-4263-b241-b8f470fc758c.webp)\n\nNow we are getting some really impressive print outs right in the terminal!\n\n\u003e note that I have ipython set to use [rich](https://github.com/Textualize/rich), you will need to console.print() in scripts\n\n## highlight lines\n\nNow we can start highlighting lines right when we initialize our `Syntax`\ninstance.  It looks ok.  It's not super visible, but more importantly its not\ngranular enough.  I want to highlight specific ranges like the word\nregister_pipelines.\n\n``` python\nsyntax = Syntax(code, 'python', line_numbers=True, highlight_lines=[4])\nconsole.print(syntax)\n```\n\n![syntax-print-register-pipelines-highlight-line.webp](https://dropper.waylonwalker.com/api/file/20b4564e-3a08-4e5a-9bed-cda07779c8fb.webp)\n\nThis hows the line, but still is not very accurate.\n\n## highlight text\n\n[@textualizeio] got back to me, let's see if What we can do with stylize_range!\n\nhttps://twitter.com/textualizeio/status/1562487302274043904\n\n``` python\nsyntax = Syntax(code, 'python', line_numbers=True)\nstyle = Style(bgcolor='deep_pink4')\nsyntax.stylize_range(style, (4, 4), (4, 22))\nconsole.print(syntax)\n```\n\nThis gives us the final result we are looking for, we can easily see what is\nbeing targeted here.  In this case the function name `register_pipelines`.\n\n![syntax-highlight-range-register-pipelines.webp](https://dropper.waylonwalker.com/api/file/b5f27c34-6ffe-425c-b2df-8ade7c5b6f8b.webp)\n\nThis turns out to be exacly what I am looking for.  Now I have an easy way to\nprint out highlighted code wtih my\n[py-tree-sitter](https://github.com/tree-sitter/py-tree-sitter) query results.\n\n## Links\n\n* [@textualizeio](https://twitter.com/textualizeio)\n* [another post](https://waylonwalker.com/designing-kedro-router)\n* [py-tree-sitter](https://github.com/tree-sitter/py-tree-sitter)\n* [rich](https://github.com/Textualize/rich)\n",
      "summary": "Today I've been playing with py-tree-sitter a bit and I wanted to highlight match ranges, but was unable to figure out how to do it with rich, so I reached...",
      "date_published": "2022-08-24T20:06:34Z",
      "date_modified": "2022-08-24T20:06:34Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/vimgrep-open-buffers/",
      "url": "https://waylonwalker.com/vimgrep-open-buffers/",
      "title": "vimgrep open buffers",
      "content_html": "\u003cp\u003eHow to vimgrep over hidden files.\u003c/p\u003e\n\u003cp\u003eI needed to delete all build pipeline steps that were named \u003ccode\u003eupload docs\u003c/code\u003e.  I\ncurrently have about 60 projects running from the same template all running\nvery similar builds.  In the past I’ve scripted out migrations for large\nchanges like this, they involved writing a python script that would load the\nyaml file into a dictionary, find the corresponding steps make the change and\nwrite it back out.\u003c/p\u003e\n\u003cp\u003eToday’s job was much simplar, just delete the step, were all steps are\nsurrounded by newlines.  My first thought was to just open all files in vim and\nrun \u003ccode\u003edap\u003c/code\u003e.  I just needed to get these files:positions into my quickfix.  My\nissue is that all the builds reside within hidden directories by convention.\u003c/p\u003e\n\u003ch2 id=\"the-issue\"\u003eThe issue \u003ca href=\"#the-issue\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003evariability\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eAfter searching through all the projects it was clear that all the steps were\nin their own paragraph, though I was not 100% confident enough to completely\nautomate it, and the word \u003ccode\u003eupload docs\u003c/code\u003e was in the paragraph.\u003c/p\u003e\n\u003cp\u003esome were a two liner\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eupload docs\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eaws s3 ...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSome had a variation in the name\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eupload docs to s3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eaws s3 ...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003esome were more than 2 lines.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eupload docs\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    aws s3 ...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003esome used a different command.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eupload docs\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    python ...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"templates-are-great\"\u003eTemplates are great \u003ca href=\"#templates-are-great\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003ebut they change\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eTemplates are amazing, and tools like cookiecutter and copier are essential in\nmy workflow, but those templates change over time. Some things are a constant,\nand others like this one are an ever evolving beast until they are tamed into\nsomething the team is happy with.\u003c/p\u003e\n\u003ch2 id=\"vimgrep-over-hidden-files\"\u003evimgrep over hidden files \u003ca href=\"#vimgrep-over-hidden-files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI know all the files that I care to search for are called build.yml, and they\nare in a hidden directory.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e:args `fd -H build.yml`\n:vimgrep /upload docs/ ##\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOnce opened as a buffer by using args, and a handy fd command I can vimgrep\nover all the open buffers using \u003ccode\u003e##\u003c/code\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOpen buffers are represented by ##\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNow I can just \u003ccode\u003edap\u003c/code\u003e and \u003ccode\u003e:cnext\u003c/code\u003e my way through the list of changes that I\nhave, and know that I hit every one of them when I am at the end of my list.\nAnd can double check this in about 10s by scrolling back through the quickfix\nlist.\u003c/p\u003e\n\u003ch2 id=\"vim-points-achieved\"\u003eVim points achieved \u003ca href=\"#vim-points-achieved\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou’re not a true vim enthusiast until you have spent 10 minutes writing a blog\npost about how vim saved you 5 minutes.  Check out all the other times this has\nhappened to me in the \u003ca href=\"https://waylonwalker.com/vim/\"\u003evim\u003c/a\u003e tag.\u003c/p\u003e\n",
      "content_text": "\nHow to vimgrep over hidden files.\n\nI needed to delete all build pipeline steps that were named `upload docs`.  I\ncurrently have about 60 projects running from the same template all running\nvery similar builds.  In the past I've scripted out migrations for large\nchanges like this, they involved writing a python script that would load the\nyaml file into a dictionary, find the corresponding steps make the change and\nwrite it back out.\n\nToday's job was much simplar, just delete the step, were all steps are\nsurrounded by newlines.  My first thought was to just open all files in vim and\nrun `dap`.  I just needed to get these files:positions into my quickfix.  My\nissue is that all the builds reside within hidden directories by convention.\n\n## The issue\n_variability_\n\nAfter searching through all the projects it was clear that all the steps were\nin their own paragraph, though I was not 100% confident enough to completely\nautomate it, and the word `upload docs` was in the paragraph.\n\nsome were a two liner\n\n``` yaml\n- name: upload docs\n  script: aws s3 ...\n```\n\nSome had a variation in the name\n\n``` yaml\n- name: upload docs to s3\n  script: aws s3 ...\n```\n\nsome were more than 2 lines.\n\n\n``` yaml\n- name: upload docs\n  script: |\n    aws s3 ...\n```\n\nsome used a different command.\n\n``` yaml\n- name: upload docs\n  script: |\n    python ...\n```\n\n## Templates are great\n_but they change_\n\nTemplates are amazing, and tools like cookiecutter and copier are essential in\nmy workflow, but those templates change over time. Some things are a constant,\nand others like this one are an ever evolving beast until they are tamed into\nsomething the team is happy with.\n\n## vimgrep over hidden files ##\n\nI know all the files that I care to search for are called build.yml, and they\nare in a hidden directory.\n\n```\n:args `fd -H build.yml`\n:vimgrep /upload docs/ ##\n```\n\nOnce opened as a buffer by using args, and a handy fd command I can vimgrep\nover all the open buffers using `##`\n\n\u003e Open buffers are represented by ##\n\nNow I can just `dap` and `:cnext` my way through the list of changes that I\nhave, and know that I hit every one of them when I am at the end of my list.\nAnd can double check this in about 10s by scrolling back through the quickfix\nlist.\n\n## Vim points achieved\n\nYou're not a true vim enthusiast until you have spent 10 minutes writing a blog\npost about how vim saved you 5 minutes.  Check out all the other times this has\nhappened to me in the [vim](https://waylonwalker.com/vim/) tag.\n",
      "summary": "How to vimgrep over hidden files.",
      "date_published": "2022-08-22T13:17:32Z",
      "date_modified": "2022-08-22T13:17:32Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "vim"
      ]
    },
    {
      "id": "https://waylonwalker.com/markata-0-3-0/",
      "url": "https://waylonwalker.com/markata-0-3-0/",
      "title": "markata 0.3.0 is 15-20% faster",
      "content_html": "\u003cfigure\u003e\n\u003ca href=\"https://dropper.wayl.one/file/af225f43-ba71-454c-b0b9-257371d0cf87.webp\" class=\"glightbox-link\" aria-label=\"image from Dall-e\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.wayl.one/file/af225f43-ba71-454c-b0b9-257371d0cf87.webp\" alt=\"image from Dall-e\"/ data-glightbox=\"description: image from Dall-e\"\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\u003cp\u003ea sprinter edging out his opponent by Dall-e\u003c/p\u003e\u003c/figcaption\u003e\u003c/figure\u003e\n\u003cp\u003eIt’s about time to release Markata 0.3.0.  I’ve had 8 pre-releases since the\nlast release, but more importantly it has about 3 months of updates.  Many of\nwhich are just cleaning up bad practices that were showing up as hot spots on\nmy \u003ccode\u003epyinstrument\u003c/code\u003e reports\u003c/p\u003e\n\u003cp\u003eMarkata started off partly as a python developer frustrated with using nodejs\nfor everything, and a desire to learn how to make frameworks in pluggy. Little\ndid I know how flexible pluggy would make it.  It started out just as my blog\ngenerator, but has turned into quite a bit more.\u003c/p\u003e\n\u003cp\u003eOver time this side project has grown some warts and some of them were now\nbecoming a big enough issue it was time to cut them out.\u003c/p\u003e\n\u003ch2 id=\"lets-compare\"\u003eLet’s compare \u003ca href=\"#lets-compare\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI like to use my tils articles for examples and tests like this as there are\nenough articles for a good test, but they are pretty short and quick to render.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir ~/git/tils/tils\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecp  ~/git/waylonwalker.com/pages/til/ ~/tils/tils -r\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e ~/git/tils/tils\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"running-tils-on-020\"\u003erunning tils on 0.2.0 \u003ca href=\"#running-tils-on-020\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAt the time of writing this is the current version of markata, so just make a\nnew venv and run it.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 -m venv .venv --prompt \u003cspan class=\"k\"\u003e$(\u003c/span\u003ebasename \u003cspan class=\"nv\"\u003e$PWD\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install markata\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ecold tils: 14.523\nwarm tils:  1.028\u003c/p\u003e\n\u003ch2 id=\"running-tils-on-030b8\"\u003erunning tils on 0.3.0b8 \u003ca href=\"#running-tils-on-030b8\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 -m venv .venv --prompt \u003cspan class=\"k\"\u003e$(\u003c/span\u003ebasename \u003cspan class=\"nv\"\u003e$PWD\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# --pre installs pre-releases that include a b in their version name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install markata --pre\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ecold tils: 11.551 (+20%)\nwarm tils:  0.860 (+16%)\u003c/p\u003e\n\u003ch2 id=\"pyinstrument\"\u003epyinstrument \u003ca href=\"#pyinstrument\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThese measurements were taken with pyinstrument mostly out of convenience since\nthere is already a pyinstrument hook built in, but also because I like\npyinstrument.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/4dca6bd0-8b81-4260-a303-b062f7152a8c.webp\" class=\"glightbox-link\" aria-label=\"pyinstrument-markata==0.3.0b8-tils-hot.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/4dca6bd0-8b81-4260-a303-b062f7152a8c.webp\" alt=\"pyinstrument-markata==0.3.0b8-tils-hot.webp\"/ data-glightbox=\"description: pyinstrument-markata==0.3.0b8-tils-hot.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eHere is the pyinstrument report from the last run.\u003c/p\u003e\n\u003ch2 id=\"my-machine\"\u003eMy Machine \u003ca href=\"#my-machine\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis comparison was not very exhaustive. It was ran on my pretty new to me\nRyzen 5 3600 machine.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/80cd2f7a-8cf0-42ae-a235-d537478d00a7.webp\" class=\"glightbox-link\" aria-label=\"neofetch-8-21-2022.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/80cd2f7a-8cf0-42ae-a235-d537478d00a7.webp\" alt=\"neofetch-8-21-2022.webp\"/ data-glightbox=\"description: neofetch-8-21-2022.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"the-changes\"\u003eThe changes \u003ca href=\"#the-changes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMost of these changes revolve in how the lifecycle is ran.  It was trying to be\nextra cautious and run previous steps for you if it thought it might be\nneedes, in reality it was rerunning a few steps multiple times no matter what.\u003c/p\u003e\n\u003cp\u003eThe other thing I turned off by default, but can be opted into, is\nbeautifulasoup’s prettify.  That was one of the slower steps ran on my site.\u003c/p\u003e\n\u003ch2 id=\"030\"\u003e0.3.0 \u003ca href=\"#030\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIt should be out by the time you see this, I wanted to compare the changes I\nhad made and make sure that it was still making forward progress and thought I\nwould share the results.\u003c/p\u003e\n",
      "content_text": "\n![image from Dall-e](https://dropper.wayl.one/file/af225f43-ba71-454c-b0b9-257371d0cf87.webp)\n\n\u003e a sprinter edging out his opponent by Dall-e\n\nIt's about time to release Markata 0.3.0.  I've had 8 pre-releases since the\nlast release, but more importantly it has about 3 months of updates.  Many of\nwhich are just cleaning up bad practices that were showing up as hot spots on\nmy `pyinstrument` reports\n\nMarkata started off partly as a python developer frustrated with using nodejs\nfor everything, and a desire to learn how to make frameworks in pluggy. Little\ndid I know how flexible pluggy would make it.  It started out just as my blog\ngenerator, but has turned into quite a bit more.\n\nOver time this side project has grown some warts and some of them were now\nbecoming a big enough issue it was time to cut them out.\n\n## Let's compare\n\nI like to use my tils articles for examples and tests like this as there are\nenough articles for a good test, but they are pretty short and quick to render.\n\n``` bash\nmkdir ~/git/tils/tils\ncp  ~/git/waylonwalker.com/pages/til/ ~/tils/tils -r\ncd ~/git/tils/tils\n```\n\n## running tils on 0.2.0\n\nAt the time of writing this is the current version of markata, so just make a\nnew venv and run it.\n\n``` bash\npython3 -m venv .venv --prompt $(basename $PWD)\npip install markata\nmarkata clean\nmarkata build\n```\n\ncold tils: 14.523\nwarm tils:  1.028\n\n## running tils on 0.3.0b8\n\n``` bash\npython3 -m venv .venv --prompt $(basename $PWD)\n# --pre installs pre-releases that include a b in their version name\npip install markata --pre\nmarkata clean\nmarkata build\n```\n\ncold tils: 11.551 (+20%)\nwarm tils:  0.860 (+16%)\n\n## pyinstrument\n\nThese measurements were taken with pyinstrument mostly out of convenience since\nthere is already a pyinstrument hook built in, but also because I like\npyinstrument.\n\n![pyinstrument-markata==0.3.0b8-tils-hot.webp](https://dropper.waylonwalker.com/api/file/4dca6bd0-8b81-4260-a303-b062f7152a8c.webp)\n\nHere is the pyinstrument report from the last run.\n\n## My Machine\n\nThis comparison was not very exhaustive. It was ran on my pretty new to me\nRyzen 5 3600 machine.\n\n![neofetch-8-21-2022.webp](https://dropper.waylonwalker.com/api/file/80cd2f7a-8cf0-42ae-a235-d537478d00a7.webp)\n\n## The changes\n\nMost of these changes revolve in how the lifecycle is ran.  It was trying to be\nextra cautious and run previous steps for you if it thought it might be\nneedes, in reality it was rerunning a few steps multiple times no matter what.\n\nThe other thing I turned off by default, but can be opted into, is\nbeautifulasoup's prettify.  That was one of the slower steps ran on my site.\n\n## 0.3.0\n\nIt should be out by the time you see this, I wanted to compare the changes I\nhad made and make sure that it was still making forward progress and thought I\nwould share the results.\n",
      "summary": "a sprinter edging out his opponent by Dall-e",
      "date_published": "2022-08-21T13:53:20Z",
      "date_modified": "2022-08-21T13:53:20Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "markata",
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/name-it-claim-it-aim-it/",
      "url": "https://waylonwalker.com/name-it-claim-it-aim-it/",
      "title": "name it claim it aim it",
      "content_html": "\u003ch2 id=\"deliberative\"\u003eDeliberative \u003ca href=\"#deliberative\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePeople exceptionally talented in the Deliberative theme are best described by\nthe serious care they take in making decisions or choices. They anticipate\nobstacles.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI am risk-adverse.  I want everything well thought out and calculated before I\nmake any sort of change.  I have never gambled in my life and just the thought\nof it makes me anxious.\u003c/p\u003e\n\u003ch2 id=\"aim-it\"\u003eAim it \u003ca href=\"#aim-it\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI can use this as a strength to plan out potential issues and prevent them.  I\ndo this quite often with my role in infrastructure.\u003c/p\u003e\n\u003cp\u003eI need to make sure that I use deadlines to keep this as a strength and not\nhinderence.\u003c/p\u003e\n\u003ch2 id=\"automation\"\u003eAutomation \u003ca href=\"#automation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOne of the biggest ways that I utilize this skill is automation.  I am all\nabout automating things, not just because I don’t want to do the manual work,\nbut I am not sure when I am going to need to do something again.\u003c/p\u003e\n",
      "content_text": "\n\n## Deliberative\n\n\u003e People exceptionally talented in the Deliberative theme are best described by\n\u003e the serious care they take in making decisions or choices. They anticipate\n\u003e obstacles.\n\nI am risk-adverse.  I want everything well thought out and calculated before I\nmake any sort of change.  I have never gambled in my life and just the thought\nof it makes me anxious.\n\n## Aim it\n\nI can use this as a strength to plan out potential issues and prevent them.  I\ndo this quite often with my role in infrastructure.  \n\nI need to make sure that I use deadlines to keep this as a strength and not\nhinderence.\n\n## Automation\n\nOne of the biggest ways that I utilize this skill is automation.  I am all\nabout automating things, not just because I don't want to do the manual work,\nbut I am not sure when I am going to need to do something again.\n",
      "summary": "People exceptionally talented in the Deliberative theme are best described by \u003e the serious care they take in making decisions or choices. They anticipate \u003e...",
      "date_published": "2022-08-04T14:28:30Z",
      "date_modified": "2022-08-04T14:28:30Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "catalytic"
      ]
    },
    {
      "id": "https://waylonwalker.com/get-python-package-versions/",
      "url": "https://waylonwalker.com/get-python-package-versions/",
      "title": "get the version of any python package | python api",
      "content_html": "\u003cp\u003eA common meta thing that I need in python is to find the version of a package.\nMost of the time I reach for \u003ccode\u003epackage_name.__version__\u003c/code\u003e, but that does not\nalways work.\u003c/p\u003e\n\u003ch2 id=\"but-not-all-projects-have-a---version--\"\u003ebut not all projects have a \u003ccode\u003e__version__\u003c/code\u003e \u003ca href=\"#but-not-all-projects-have-a---version--\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn searching the internet for an answer nearly every one of them pointed me to\n\u003ccode\u003e__version__\u003c/code\u003e.  This works for most projects, but is simply a convention, its\nnot required.  Not all projects implement a \u003ccode\u003e__version__\u003c/code\u003e, but most do.  I’ve\nnever seen it lie to me, but there is nothing stopping someone from shipping\nmismatched versions.\u003c/p\u003e\n\u003ch2 id=\"if-you-maintain-a-project-ship-a---version--\"\u003eIf you maintain a project ship a \u003ccode\u003e__version__\u003c/code\u003e \u003ca href=\"#if-you-maintain-a-project-ship-a---version--\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003eI appreciate it\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eWhile its not required its super handy and easy for anyone to remember off the\ntop of their head.  It makes it easy to start debugging differences between\nwhat you have vs what you see somewhere else. You can do this by dropping a\n\u003ccode\u003e__version__\u003c/code\u003e variable inside your  \u003ccode\u003e__init__.py\u003c/code\u003e file.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e## __init__.py\n__version__ = 1.0.0\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"so\"\u003eSO \u003ca href=\"#so\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003estack overflow saves the day\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eSpecial thanks to this\n\u003ca href=\"https://stackoverflow.com/questions/20180543/how-do-i-check-the-versions-of-python-modules/32965521#32965521\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/stackoverflow.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/stackoverflow.com.ico\" class=\"has-avatar  has-avatar-before\"\u003eStack Overflow post\u003c/a\u003e\nfor answering this question for me.\u003c/p\u003e\n\u003ch2 id=\"so-what-do-you-do\"\u003eSo what do you do… \u003ca href=\"#so-what-do-you-do\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003eimportlib\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eYour next option is to reach into the package metadata of the package that you\nare interested in, and this has changed over time as highlighted in the stack\noverflow post.\u003c/p\u003e\n\u003cp\u003efor Python \u0026gt;= 3.8:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003efrom importlib.metadata import version\n\nversion(\u0026#39;markata\u0026#39;)\n# `0.3.0.b4`\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI only really use python \u0026gt;= 3.8 these days, but if you need to implement it for\nan older version check out the stack overflow post.\u003c/p\u003e\n\u003ch2 id=\"another-option\"\u003eAnother option.. \u003ca href=\"#another-option\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003euse the command line\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eAnother common option uses pip at the command line.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ pip show markata\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eName: markata\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eVersion: 0.3.0b4\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSummary: Static site generator plugins all the way down.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHome-page: https://markata.dev\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAuthor: Waylon Walker\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAuthor-email: waylon@waylonwalker.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLicense: MIT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLocation: /home/waylon/git/waylonwalker.com/.venv/lib/python3.11/site-packages\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRequires: anyconfig, beautifulsoup4, checksumdir, diskcache, feedgen, jinja2, more-itertools, pathspec, pillow, pluggy, pymdown-extensions, python-frontmatter, pytz, rich, textual, toml, typer\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRequired-by:\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd if the package implements a command line its common to ship a version\ncommand such as \u003ccode\u003e--version\u003c/code\u003e or \u003ccode\u003e-V\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ markata --version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMarkata CLI Version: 0.3.0.b4\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"why-did-i-need-to-do-this\"\u003eWhy did I need to do this? \u003ca href=\"#why-did-i-need-to-do-this\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWell we have a cli tool that wraps around piptools and we wanted to include the\nversion of piptools in the comments that it produces dynamically.  This is why\nI wanted to dynamically grab the version inside python without shelling out to\n\u003ccode\u003epip show\u003c/code\u003e.  Now along with the version of our internal tool you will get the\nversion of \u003ccode\u003epiptools\u003c/code\u003e even though \u003ccode\u003epiptools\u003c/code\u003e does not ship a \u003ccode\u003e__version__\u003c/code\u003e\nvariable.\u003c/p\u003e\n\u003ch2 id=\"fin\"\u003eFin \u003ca href=\"#fin\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn the end, I am glad I learned that its so easy to use the more accurate\npackage metadata, but still appreciate packages shipping \u003ccode\u003e__version__\u003c/code\u003e for all\nof us n00b’s out here.\u003c/p\u003e\n",
      "content_text": "\nA common meta thing that I need in python is to find the version of a package.\nMost of the time I reach for `package_name.__version__`, but that does not\nalways work.\n\n## but not all projects have a `__version__`\n\nIn searching the internet for an answer nearly every one of them pointed me to\n`__version__`.  This works for most projects, but is simply a convention, its\nnot required.  Not all projects implement a `__version__`, but most do.  I've\nnever seen it lie to me, but there is nothing stopping someone from shipping\nmismatched versions.\n\n## If you maintain a project ship a `__version__`\n_I appreciate it_\n\nWhile its not required its super handy and easy for anyone to remember off the\ntop of their head.  It makes it easy to start debugging differences between\nwhat you have vs what you see somewhere else. You can do this by dropping a\n`__version__` variable inside your  `__init__.py` file.\n\n```\n## __init__.py\n__version__ = 1.0.0\n```\n\n## SO\n_stack overflow saves the day_\n\nSpecial thanks to this\n[Stack Overflow post](https://stackoverflow.com/questions/20180543/how-do-i-check-the-versions-of-python-modules/32965521#32965521)\nfor answering this question for me.\n\n## So what do you do...\n_importlib_\n\nYour next option is to reach into the package metadata of the package that you\nare interested in, and this has changed over time as highlighted in the stack\noverflow post.\n\nfor Python \u003e= 3.8:\n\n```\nfrom importlib.metadata import version\n\nversion('markata')\n# `0.3.0.b4`\n```\n\nI only really use python \u003e= 3.8 these days, but if you need to implement it for\nan older version check out the stack overflow post.\n\n## Another option..\n_use the command line_\n\nAnother common option uses pip at the command line.\n\n```bash\n❯ pip show markata\nName: markata\nVersion: 0.3.0b4\nSummary: Static site generator plugins all the way down.\nHome-page: https://markata.dev\nAuthor: Waylon Walker\nAuthor-email: waylon@waylonwalker.com\nLicense: MIT\nLocation: /home/waylon/git/waylonwalker.com/.venv/lib/python3.11/site-packages\nRequires: anyconfig, beautifulsoup4, checksumdir, diskcache, feedgen, jinja2, more-itertools, pathspec, pillow, pluggy, pymdown-extensions, python-frontmatter, pytz, rich, textual, toml, typer\nRequired-by:\n```\n\nAnd if the package implements a command line its common to ship a version\ncommand such as `--version` or `-V`.\n\n``` bash\n❯ markata --version\nMarkata CLI Version: 0.3.0.b4\n```\n\n## Why did I need to do this?\n\nWell we have a cli tool that wraps around piptools and we wanted to include the\nversion of piptools in the comments that it produces dynamically.  This is why\nI wanted to dynamically grab the version inside python without shelling out to\n`pip show`.  Now along with the version of our internal tool you will get the\nversion of `piptools` even though `piptools` does not ship a `__version__`\nvariable.\n\n## Fin\n\nIn the end, I am glad I learned that its so easy to use the more accurate\npackage metadata, but still appreciate packages shipping `__version__` for all\nof us n00b's out here.\n",
      "summary": "A common meta thing that I need in python is to find the version of a package. Most of the time I reach for , but that does not always work.",
      "date_published": "2022-07-29T15:48:36Z",
      "date_modified": "2022-07-29T15:48:36Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/two-new-aliases-for-git/",
      "url": "https://waylonwalker.com/two-new-aliases-for-git/",
      "title": "Two new shell aliases for git",
      "content_html": "\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000172.3260819219.webp\" class=\"glightbox-link\" aria-label=\"Astronaut doing a mic drop with explosion\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000172.3260819219.webp\" alt=\"Astronaut doing a mic drop with explosion\"/ data-glightbox=\"description: Astronaut doing a mic drop with explosion\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eRecently I added two new bash/zsh aliases to make my \u003ca href=\"/glossary/git/\" class=\"glossary-term\" title=\"Git is a version control system for tracking changes in source code during software development. In the beginning there were many, some were licensed. As...\"\u003egit\u003c/a\u003e experience just a tad\nbetter.\u003c/p\u003e\n\u003ch2 id=\"trackme\"\u003etrackme \u003ca href=\"#trackme\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMost of our work repos were recently migrated to new remote urls, we scriped\nout the update to all of the repos, but I was left with a tracking error for\nall of my open branches.  To easily resolve this I just made an alias so that I\ncan just run \u003ccode\u003etrackme\u003c/code\u003e anytime I see this error.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThere is no tracking information for the current branch.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Please specify which branch you want to merge with.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    See git-pull(1) for details\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    git pull \u0026lt;remote\u0026gt; \u0026lt;branch\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIf you wish to set tracking information for this branch you can do so with:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    git branch --set-upstream develop origin/\u0026lt;branch\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"getting-the-branch\"\u003egetting the branch \u003ca href=\"#getting-the-branch\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe following command will always return the currently checked out branch name.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit symbolic-ref --short HEAD\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eInjecting this into the suggested \u003ccode\u003egit\u003c/code\u003e command as a subshell gives us this\nalias that when ran with \u003ccode\u003etrackme\u003c/code\u003e will automatically fix tracking for my\nbranch.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ealias\u003c/span\u003e \u003cspan class=\"nv\"\u003etrackme\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;git branch --set-upstream-to=origin/$(git symbolic-ref --short HEAD)\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"rebasemain\"\u003erebasemain \u003ca href=\"#rebasemain\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI sometimes get a bit lazy at checking main for changes before submitting any\nprs, so again I made a quick shell alias that will rebase main into my branch\nbefore I open a pr.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ealias\u003c/span\u003e \u003cspan class=\"nv\"\u003erebasemain\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;git pull origin main --rebase\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"the-aliases\"\u003eThe Aliases \u003ca href=\"#the-aliases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere are both of the alias’s, feel free to steal and modify them into your\ndotfiles.  If you are uniniatiated a common starting place to put these is\neither in your \u003ccode\u003e~/.bashrch\u003c/code\u003e or \u003ccode\u003e~/.zshrc\u003c/code\u003e depending on your shell of choice.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ealias\u003c/span\u003e \u003cspan class=\"nv\"\u003etrackme\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;git branch --set-upstream-to=origin/$(git symbolic-ref --short HEAD)\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ealias\u003c/span\u003e \u003cspan class=\"nv\"\u003erebasemain\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;git pull origin main --rebase\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n![Astronaut doing a mic drop with explosion](https://stable-diffusion.waylonwalker.com/000172.3260819219.webp)\n\nRecently I added two new bash/zsh aliases to make my git experience just a tad\nbetter.\n\n## trackme\n\nMost of our work repos were recently migrated to new remote urls, we scriped\nout the update to all of the repos, but I was left with a tracking error for\nall of my open branches.  To easily resolve this I just made an alias so that I\ncan just run `trackme` anytime I see this error.\n\n```txt\nThere is no tracking information for the current branch.\n    Please specify which branch you want to merge with.\n    See git-pull(1) for details\n\n    git pull \u003cremote\u003e \u003cbranch\u003e\n\nIf you wish to set tracking information for this branch you can do so with:\n\n    git branch --set-upstream develop origin/\u003cbranch\u003e\n```\n\n### getting the branch\n\nThe following command will always return the currently checked out branch name.\n\n``` bash\ngit symbolic-ref --short HEAD\n```\n\nInjecting this into the suggested `git` command as a subshell gives us this\nalias that when ran with `trackme` will automatically fix tracking for my\nbranch.\n\n``` bash\nalias trackme='git branch --set-upstream-to=origin/$(git symbolic-ref --short HEAD)'\n```\n\n## rebasemain\n\nI sometimes get a bit lazy at checking main for changes before submitting any\nprs, so again I made a quick shell alias that will rebase main into my branch\nbefore I open a pr.\n\n``` bash\nalias rebasemain='git pull origin main --rebase'\n```\n\n## The Aliases\n\nHere are both of the alias's, feel free to steal and modify them into your\ndotfiles.  If you are uniniatiated a common starting place to put these is\neither in your `~/.bashrch` or `~/.zshrc` depending on your shell of choice.\n\n``` bash\nalias trackme='git branch --set-upstream-to=origin/$(git symbolic-ref --short HEAD)'\nalias rebasemain='git pull origin main --rebase'\n```\n",
      "summary": "Recently I added two new bash/zsh aliases to make my git experience just a tad better.",
      "date_published": "2022-06-28T12:31:10Z",
      "date_modified": "2022-06-28T12:31:10Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "git"
      ]
    },
    {
      "id": "https://waylonwalker.com/ipython-q-exit/",
      "url": "https://waylonwalker.com/ipython-q-exit/",
      "title": "IPython q to exit",
      "content_html": "\u003cp\u003eSo many terminal applications bind \u003ccode\u003eq\u003c/code\u003e to exit, even the python debugger, its\nmuscle memory for me. But to exit ipython I have to type out \u003ccode\u003eexit\u0026lt;ENTER\u0026gt;\u003c/code\u003e.\nThis is fine, but since q is muscle memory for me I get this error a few times\nper day.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮\n│ \u0026lt;ipython-input-1-2b66fd261ee5\u0026gt;:1 in \u0026lt;module\u0026gt;                                                     │\n╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\nNameError: name \u0026#39;q\u0026#39; is not defined\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAfter digging way too deep into how IPython implements its \u003ccode\u003eExitAutoCall\u003c/code\u003e I\nrealized there was a very simple solution here. \u003ccode\u003eIPython\u003c/code\u003e automatically\nimports all the scripts you put in your profile directory, all I needed was to\ncreate \u003ccode\u003e~/.ipython/profile_default/startup/q.py\u003c/code\u003e with the following.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eq = exit\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIt was that simple. This is not a game changer by any means, but I will now\nsee one less error in my workflow. I just press \u003ccode\u003eq\u0026lt;Enter\u0026gt;\u003c/code\u003e and I am out,\nwithout error.\u003c/p\u003e\n",
      "content_text": "\nSo many terminal applications bind `q` to exit, even the python debugger, its\nmuscle memory for me. But to exit ipython I have to type out `exit\u003cENTER\u003e`.\nThis is fine, but since q is muscle memory for me I get this error a few times\nper day.\n\n```\n╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮\n│ \u003cipython-input-1-2b66fd261ee5\u003e:1 in \u003cmodule\u003e                                                     │\n╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\nNameError: name 'q' is not defined\n```\n\nAfter digging way too deep into how IPython implements its `ExitAutoCall` I\nrealized there was a very simple solution here. `IPython` automatically\nimports all the scripts you put in your profile directory, all I needed was to\ncreate `~/.ipython/profile_default/startup/q.py` with the following.\n\n```\nq = exit\n```\n\nIt was that simple. This is not a game changer by any means, but I will now\nsee one less error in my workflow. I just press `q\u003cEnter\u003e` and I am out,\nwithout error.\n",
      "summary": "So many terminal applications bind to exit, even the python debugger, its muscle memory for me. But to exit ipython I have to type out . This is fine, but...",
      "date_published": "2022-06-13T10:10:34Z",
      "date_modified": "2022-06-13T10:10:34Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/copier-slugify/",
      "url": "https://waylonwalker.com/copier-slugify/",
      "title": "Copier Slugify | python templating | using cookiecutter",
      "content_html": "\u003cp\u003eIt’s no secret that I love automation, and lately my templating framework of\nchoice has been copier.  One hiccup I recently ran into was having spaces in my\ntemplated directory names.  This makes it harder to run commands against as you\nneed to escape them, and if they end up in a url you end up with ugly \u003ccode\u003e%20\u003c/code\u003e all\nover.\u003c/p\u003e\n\u003ch2 id=\"cookiecutter-has-the-solution\"\u003eCookiecutter has the solution \u003ca href=\"#cookiecutter-has-the-solution\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYes the solution comes from a competing templating framework.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI install copier with pipx, so I need to inject cookiecutter in to my copier\nenvironment to use the slugify filter.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipx inject copier cookiecutter\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you are using a normal \u003ca href=\"/virtual-environment/\" class=\"glossary-term\" title=\"Virtual Environment is term for a sandboxed environment commonly associated with the python programming language. If you are installing any sort of python...\"\u003evirtual environment\u003c/a\u003e you can just pip install it.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install copier cookiecutter\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"add-the-extension-to-your-template\"\u003eadd the extension to your template \u003ca href=\"#add-the-extension-to-your-template\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003ecopier.yml\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eNow to enable the extension you need to declare it in your \u003ccode\u003ecopier.yml\u003c/code\u003e file in\nyour template.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e_jinja_extensions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ecookiecutter.extensions.SlugifyExtension\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"use-it--slugify\"\u003eUse it | slugify \u003ca href=\"#use-it--slugify\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003euse-it\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eNow to use it, anywhere that you want to slugify a variable, you just pipe it\ninto slugify.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ tree .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── copier.yml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└── \u003cspan class=\"o\"\u003e{{\u003c/span\u003e site_name\u003cspan class=\"p\"\u003e|\u003c/span\u003eslugify \u003cspan class=\"o\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    └── markata.toml.jinja\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e directory, \u003cspan class=\"m\"\u003e3\u003c/span\u003e files\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eHere is a slimmed down version of what the \u003ccode\u003ecopier.yml\u003c/code\u003e looks like.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003esite_name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003estr\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ehelp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eWhat is the name of your site, this shows in seo description and the site title.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDin Djarin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e_jinja_extensions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ecookiecutter.extensions.SlugifyExtension\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"results\"\u003eResults \u003ca href=\"#results\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRunning the template looks a bit like this.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/ffd34b52-cef7-4de8-b451-4426989fb70c.webp\" class=\"glightbox-link\" aria-label=\"copier-cookiecutter-slugify.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/ffd34b52-cef7-4de8-b451-4426989fb70c.webp\" alt=\"copier-cookiecutter-slugify.webp\"/ data-glightbox=\"description: copier-cookiecutter-slugify.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003chr/\u003e\n\u003ch2 id=\"straight-from-their-docs\"\u003estraight from their docs \u003ca href=\"#straight-from-their-docs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe next section is straight from the \u003ca href=\"https://cookiecutter.readthedocs.io/en/latest/advanced/template_extensions.html#slugify-extension\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/cookiecutter.readthedocs.io.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/cookiecutter.readthedocs.io.ico\" class=\"has-avatar  has-avatar-before\"\u003ecookiecutter docs\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"slugify-extension\"\u003eSlugify extension \u003ca href=\"#slugify-extension\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe \u003ccode\u003ecookiecutter.extensions.SlugifyExtension\u003c/code\u003e extension provides a \u003ccode\u003eslugify\u003c/code\u003e\nfilter in templates that converts string into its dashed (“slugified”) version:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e{% \u0026#34;It\u0026#39;s a random version\u0026#34; | slugify %}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWould output:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eit-s-a-random-version\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIt is different from a mere replace of spaces since it also treats some special\ncharacters differently such as \u003ccode\u003e\u0026#39;\u003c/code\u003e in the example above. The function accepts\nall arguments that can be passed to the \u003ccode\u003eslugify\u003c/code\u003e function of\n\u003ccode\u003epython-slugify\u003c/code\u003e_. For example to change the output from\n\u003ccode\u003eit-s-a-random-version\u003c/code\u003e to \u003ccode\u003eit_s_a_random_version\u003c/code\u003e, the \u003ccode\u003eseparator\u003c/code\u003e parameter\nwould be passed: \u003ccode\u003eslugify(separator=\u0026#39;_\u0026#39;)\u003c/code\u003e.\u003c/p\u003e\n",
      "content_text": "\nIt's no secret that I love automation, and lately my templating framework of\nchoice has been copier.  One hiccup I recently ran into was having spaces in my\ntemplated directory names.  This makes it harder to run commands against as you\nneed to escape them, and if they end up in a url you end up with ugly `%20` all\nover.\n\n## Cookiecutter has the solution\n\n\u003e Yes the solution comes from a competing templating framework.\n\nI install copier with pipx, so I need to inject cookiecutter in to my copier\nenvironment to use the slugify filter.\n\n``` bash\npipx inject copier cookiecutter\n```\n\nIf you are using a normal virtual environment you can just pip install it.\n\n``` bash\npip install copier cookiecutter\n```\n\n## add the extension to your template\n\n_copier.yml_\n\nNow to enable the extension you need to declare it in your `copier.yml` file in\nyour template.\n\n``` yaml\n_jinja_extensions:\n    - cookiecutter.extensions.SlugifyExtension\n```\n\n## Use it | slugify\n\n_use-it_\n\nNow to use it, anywhere that you want to slugify a variable, you just pipe it\ninto slugify.\n\n``` bash\n❯ tree .\n.\n├── copier.yml\n├── README.md\n└── {{ site_name|slugify }}\n    └── markata.toml.jinja\n\n1 directory, 3 files\n```\n\nHere is a slimmed down version of what the `copier.yml` looks like.\n\n``` yml\nsite_name:\n  type: str\n  help: What is the name of your site, this shows in seo description and the site title.\n  default: Din Djarin\n\n_jinja_extensions:\n    - cookiecutter.extensions.SlugifyExtension\n```\n\n## Results\n\nRunning the template looks a bit like this.\n\n![copier-cookiecutter-slugify.webp](https://dropper.waylonwalker.com/api/file/ffd34b52-cef7-4de8-b451-4426989fb70c.webp)\n\n---\n\n## straight from their docs\n\nThe next section is straight from the [cookiecutter docs](\nhttps://cookiecutter.readthedocs.io/en/latest/advanced/template_extensions.html#slugify-extension)\n\n### Slugify extension\n\nThe `cookiecutter.extensions.SlugifyExtension` extension provides a `slugify`\nfilter in templates that converts string into its dashed (\"slugified\") version:\n\n``` jinja\n{% \"It's a random version\" | slugify %}\n```\n\nWould output:\n\n```\nit-s-a-random-version\n```\n\nIt is different from a mere replace of spaces since it also treats some special\ncharacters differently such as `'` in the example above. The function accepts\nall arguments that can be passed to the `slugify` function of\n`python-slugify`_. For example to change the output from\n`it-s-a-random-version` to `it_s_a_random_version`, the `separator` parameter\nwould be passed: `slugify(separator='_')`.\n",
      "summary": "It's no secret that I love automation, and lately my templating framework of choice has been copier. One hiccup I recently ran into was having spaces in my...",
      "date_published": "2022-06-11T12:37:50Z",
      "date_modified": "2022-06-11T12:37:50Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "copier",
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/textual-has-devtools/",
      "url": "https://waylonwalker.com/textual-has-devtools/",
      "title": "Textual has devtools",
      "content_html": "\u003cp\u003eTextual has devtools in the upcoming css branch, and its pretty awesome!\u003c/p\u003e\n\u003ch2 id=\"its-still-early\"\u003eIt’s still early \u003ca href=\"#its-still-early\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTextual is still very early and not really ready for prime time, but it’s quite\namazing how easy some things such as creating keybindings is. The docs are\ncoming, but missing right now so if you want to use textual be ready for\nreading source code and examples.\u003c/p\u003e\n\u003ch2 id=\"on-to-the-devtools\"\u003eOn to the devtools \u003ca href=\"#on-to-the-devtools\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAs \u003ca href=\"https://twitter.com/willmcgugan\"\u003e@willmcgugan\u003c/a\u003e shows in this tweet it’s\npretty easy to setup, it requires having two terminals open, or using tmux, and\ncurrently you have to use the css branch.\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"hoverlink\" href=\"https://twitter.com/willmcgugan/status/1531294412696956930\"\u003ehttps://twitter.com/willmcgugan/status/1531294412696956930\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"why-does-textual-need-its-own-devtools\"\u003eWhy does textual need its own devtools \u003ca href=\"#why-does-textual-need-its-own-devtools\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTextual is a tui application framework. Unlike when you are building cli\napplications, when the tui takes over the terminal in full screen there is no\nwhere to print statement debug, and breakpoints don’t work.\u003c/p\u003e\n\u003ch2 id=\"getting-the-css-branch\"\u003egetting the css branch \u003ca href=\"#getting-the-css-branch\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn the future it will likely be in main and not need this, but for now you need\nto get the css branch to get devtools.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone https://github.com/Textualize/textual\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit fetch --alll\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit checkout css\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"install-in-a-virtual-environment\"\u003einstall in a \u003ca href=\"/virtual-environment/\" class=\"glossary-term\" title=\"Virtual Environment is term for a sandboxed environment commonly associated with the python programming language. If you are installing any sort of python...\"\u003evirtual environment\u003c/a\u003e \u003ca href=\"#install-in-a-virtual-environment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow you can create a virtual environment, feel free to use whatever virtual\nenvironment tool you want, venv is built in to most python distributions\nthough, and should just be there.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 -m venv .venv --prompt textual\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003esource\u003c/span\u003e .venv/bin/activate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install .\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"now-that-we-have-textual-installed\"\u003eNow that we have textual installed \u003ca href=\"#now-that-we-have-textual-installed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOnce textual is installed you can open up the devtools by running textual console.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etextual console\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/api/file/9a528fd8-7f06-4a6d-b46e-26165e4a0e93.webp\" class=\"glightbox-link\" aria-label=\"textual-console.webp\"\u003e\u003cimg class=\"glightbox\" src=\"https://dropper.waylonwalker.com/api/file/9a528fd8-7f06-4a6d-b46e-26165e4a0e93.webp\" alt=\"textual-console.webp\"/ data-glightbox=\"description: textual-console.webp\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nTextual has devtools in the upcoming css branch, and its pretty awesome!\n\n## It's still early\n\nTextual is still very early and not really ready for prime time, but it's quite\namazing how easy some things such as creating keybindings is. The docs are\ncoming, but missing right now so if you want to use textual be ready for\nreading source code and examples.\n\n## On to the devtools\n\nAs [@willmcgugan](https://twitter.com/willmcgugan) shows in this tweet it's\npretty easy to setup, it requires having two terminals open, or using tmux, and\ncurrently you have to use the css branch.\n\n[https://twitter.com/willmcgugan/status/1531294412696956930](https://twitter.com/willmcgugan/status/1531294412696956930){.hoverlink}\n\n## Why does textual need its own devtools\n\nTextual is a tui application framework. Unlike when you are building cli\napplications, when the tui takes over the terminal in full screen there is no\nwhere to print statement debug, and breakpoints don't work.\n\n## getting the css branch\n\nIn the future it will likely be in main and not need this, but for now you need\nto get the css branch to get devtools.\n\n```bash\ngit clone https://github.com/Textualize/textual\ngit fetch --alll\ngit checkout css\n```\n\n## install in a virtual environment\n\nNow you can create a virtual environment, feel free to use whatever virtual\nenvironment tool you want, venv is built in to most python distributions\nthough, and should just be there.\n\n```bash\npython3 -m venv .venv --prompt textual\nsource .venv/bin/activate\npip install .\n```\n\n## Now that we have textual installed\n\nOnce textual is installed you can open up the devtools by running textual console.\n\n```bash\ntextual console\n```\n\n![textual-console.webp](https://dropper.waylonwalker.com/api/file/9a528fd8-7f06-4a6d-b46e-26165e4a0e93.webp)\n",
      "summary": "Textual has devtools in the upcoming css branch, and its pretty awesome!",
      "date_published": "2022-06-09T21:21:11Z",
      "date_modified": "2022-06-09T21:21:11Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/pyenv-pipx/",
      "url": "https://waylonwalker.com/pyenv-pipx/",
      "title": "Using Different versions of python with pipx | pyenv",
      "content_html": "\u003cfigure\u003e\n\u003ca href=\"https://stable-diffusion.waylonwalker.com/000363.70567464.webp\" class=\"glightbox-link\" aria-label=\"“cell shaded, long, full body, shot of a cybernetic blue soldier with glowing pink eyes, llustration, post grunge, cinebatic dramatic atmosphere, sharp focus, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C7.5 -Ak_lms -S70567464\"\u003e\u003cimg class=\"glightbox\" src=\"https://stable-diffusion.waylonwalker.com/000363.70567464.webp\" alt=\"“cell shaded, long, full body, shot of a cybernetic blue soldier with glowing pink eyes, llustration, post grunge, cinebatic dramatic atmosphere, sharp focus, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C7.5 -Ak_lms -S70567464\"/ data-glightbox=\"description: “cell shaded, long, full body, shot of a cybernetic blue soldier with glowing pink eyes, llustration, post grunge, cinebatic dramatic atmosphere, sharp focus, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C7.5 -Ak_lms -S70567464\"\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eI love using pipx for automatic \u003ca href=\"/virtual-environment/\" class=\"glossary-term\" title=\"Virtual Environment is term for a sandboxed environment commonly associated with the python programming language. If you are installing any sort of python...\"\u003evirtual environment\u003c/a\u003e management of my globally\ninstalled python cli applications, but sometimes the application is not\ncompatible with your globally installed \u003ccode\u003epipx\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"which-version-of-python-is-pipx-using\"\u003eWhich version of python is \u003ccode\u003epipx\u003c/code\u003e using?? \u003ca href=\"#which-version-of-python-is-pipx-using\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis one took me a minute to figure out at first, please let me know if there\nis a better way. I am pretty certain that this is not the ideal way, but it\nworks.\u003c/p\u003e\n\u003cp\u003eMy first technique was to make a package that printed out \u003ccode\u003esys.version\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# what version of python does the global pipx use?\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipx run --spec git+https://github.com/waylonwalker/pyvers pyvers\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# what version of python does the local pipx use?\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython -m pipx run --spec git+https://github.com/waylonwalker/pyvers pyvers\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"lets-setup-some-other-versions-of-python-with-pyenv\"\u003eLet’s setup some other versions of python with pyenv \u003ca href=\"#lets-setup-some-other-versions-of-python-with-pyenv\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you don’t already have \u003ca href=\"https://github.com/pyenv/pyenv\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003epyenv\u003c/a\u003e installed,\nyou can follow their \u003ca href=\"https://github.com/pyenv/pyenv#installation\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003einstall\ninstructions\u003c/a\u003e to get it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv install 3.8.13\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv install 3.10.5\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"i-usually-require-a-virtual-environment\"\u003eI usually require a virtual environment \u003ca href=\"#i-usually-require-a-virtual-environment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI set the \u003ccode\u003ePIP_REQUIRE_VIRTUALENV\u003c/code\u003e environment variable to \u003ccode\u003etrue\u003c/code\u003e to ensure\nthat the virtual environment is activated when pip installing, this makes it so\nthat I can’t accidentally use the global env, which is typically not what I\nwant to do.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003ePIP_REQUIRE_VIRTUALENV\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# for windows users\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eset\u003c/span\u003e \u003cspan class=\"nv\"\u003ePIP_REQUIRE_VIRTUALENV\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003eThis goes right into my shell startup script \u003ccode\u003e~/.bashrc\u003c/code\u003e or \u003ccode\u003e~/.zshrc\u003c/code\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"exceptions-happen\"\u003eExceptions happen \u003ca href=\"#exceptions-happen\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis is my one exception. I’ve had better luck putting pipx right in the\nglobal python environment. Not the system python, but each python version that\nI install with pyenv.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003ePIP_REQUIRE_VIRTUALENV\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# for windows users\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eset\u003c/span\u003e \u003cspan class=\"nv\"\u003ePIP_REQUIRE_VIRTUALENV\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"lets-install-pipx\"\u003eLet’s install pipx \u003ca href=\"#lets-install-pipx\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFirst up is python 3.10.5\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv global 3.10.5\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install pipx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipx run --spec git+https://github.com/waylonwalker/pyvers pyvers\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e3.10.5 \u003cspan class=\"o\"\u003e(\u003c/span\u003emain, Jun  \u003cspan class=\"m\"\u003e6\u003c/span\u003e 2022, 18:49:26\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003eGCC 12.1.0\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNext is python 3.8.13j\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv global 3.8.13\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install pipx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipx run --spec git+https://github.com/waylonwalker/pyvers pyvers\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e3.8.13 \u003cspan class=\"o\"\u003e(\u003c/span\u003edefault, Aug  \u003cspan class=\"m\"\u003e8\u003c/span\u003e 2022, 21:06:56\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003eGCC 12.1.0\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow once I close this shell I will always end up with\n\u003ccode\u003ePIP_REQUIRE_VIRTUALENV=true\u003c/code\u003e, since it’s in my shell startup script. So\nmake sure that you reset it or kill this shell before doing any damage.\u003c/p\u003e\n",
      "content_text": "\n![\"cell shaded, long, full body, shot of a cybernetic blue soldier with glowing pink eyes, llustration, post grunge, cinebatic dramatic atmosphere, sharp focus, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem\" -s50 -W832 -H416 -C7.5 -Ak_lms -S70567464](https://stable-diffusion.waylonwalker.com/000363.70567464.webp)\n\nI love using pipx for automatic virtual environment management of my globally\ninstalled python cli applications, but sometimes the application is not\ncompatible with your globally installed `pipx`\n\n## Which version of python is `pipx` using??\n\nThis one took me a minute to figure out at first, please let me know if there\nis a better way. I am pretty certain that this is not the ideal way, but it\nworks.\n\nMy first technique was to make a package that printed out `sys.version`.\n\n```bash\n# what version of python does the global pipx use?\npipx run --spec git+https://github.com/waylonwalker/pyvers pyvers\n\n# what version of python does the local pipx use?\npython -m pipx run --spec git+https://github.com/waylonwalker/pyvers pyvers\n```\n\n## Let's setup some other versions of python with pyenv\n\n\u003e If you don't already have [pyenv](https://github.com/pyenv/pyenv) installed,\n\u003e you can follow their [install\n\u003e instructions](https://github.com/pyenv/pyenv#installation) to get it.\n\n```bash\npyenv install 3.8.13\npyenv install 3.10.5\n```\n\n## I usually require a virtual environment\n\nI set the `PIP_REQUIRE_VIRTUALENV` environment variable to `true` to ensure\nthat the virtual environment is activated when pip installing, this makes it so\nthat I can't accidentally use the global env, which is typically not what I\nwant to do.\n\n```bash\nexport PIP_REQUIRE_VIRTUALENV=true\n# for windows users\nset PIP_REQUIRE_VIRTUALENV=true\n```\n\n\u003e This goes right into my shell startup script `~/.bashrc` or `~/.zshrc`.\n\n## Exceptions happen\n\nThis is my one exception. I've had better luck putting pipx right in the\nglobal python environment. Not the system python, but each python version that\nI install with pyenv.\n\n```bash\nexport PIP_REQUIRE_VIRTUALENV=false\n# for windows users\nset PIP_REQUIRE_VIRTUALENV=false\n```\n\n## Let's install pipx\n\nFirst up is python 3.10.5\n\n```bash\npyenv global 3.10.5\npip install pipx\npipx run --spec git+https://github.com/waylonwalker/pyvers pyvers\n\n3.10.5 (main, Jun  6 2022, 18:49:26) [GCC 12.1.0]\n```\n\nNext is python 3.8.13j\n\n```bash\npyenv global 3.8.13\npip install pipx\npipx run --spec git+https://github.com/waylonwalker/pyvers pyvers\n\n3.8.13 (default, Aug  8 2022, 21:06:56)\n[GCC 12.1.0]\n```\n\nNow once I close this shell I will always end up with\n`PIP_REQUIRE_VIRTUALENV=true`, since it's in my shell startup script. So\nmake sure that you reset it or kill this shell before doing any damage.\n",
      "summary": "I love using pipx for automatic virtual environment management of my globally installed python cli applications, but sometimes the application is not...",
      "date_published": "2022-05-28T20:38:42Z",
      "date_modified": "2022-05-28T20:38:42Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    }
  ]
}