{
  "version": "https://jsonfeed.org/version/1",
  "title": "elver.me - everything (JSON Feed)",
  "description": "Recent content on elver.me",
  "home_page_url": "https://elver.me/",
  "feed_url": "https://elver.me/feed.json",
  "items": [
    
    {
      "id": "https://elver.me/weeknotes/245-stranded/",
      "url": "https://elver.me/weeknotes/245-stranded/",
      "title": "Weeknotes 245: Stranded",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou\u0026rsquo;ll be glad to know I\u0026rsquo;ve had neither the time nor headspace to worry about\nAI this week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week has been another shit one. After all hell broke lose in the Middle\nEast last Saturday, A, who was meant to get home from her holiday on\nWednesday, became stranded instead. This was very stressful as flights became\nfew and expensive due to the closed air space in the region.\u003c/p\u003e\n\u003cp\u003eThe worst part is the not knowing.\u003c/p\u003e\n\u003cp\u003eOh, and don\u0026rsquo;t rely rely on anyone you\u0026rsquo;ve paid to help or even give the\nslightest shit either. \u003ca href=\"https://www.atol.org/about-atol/what-does-atol-protection-mean/\"\u003eATOL protection\u003c/a\u003e will be getting tested when she\neventually gets back.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHappy Birthday to me 🥳\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI installed \u003ca href=\"https://dockhand.pro/\"\u003eDockhand\u003c/a\u003e this week to give me a better overview of my Docker\ncontainers. It\u0026rsquo;s really nice so far. Easy to setup and get going. It can\nnotify you of various events like containers being started, stopped, etc, and\ncan also check for updates \u0026ndash; I set these up via \u003ca href=\"https://ntfy.sh/\"\u003entfy\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThere are several other contenders in this space including \u003ca href=\"https://www.portainer.io/\"\u003ePortainer\u003c/a\u003e,\n\u003ca href=\"https://getarcane.app/\"\u003eArcane\u003c/a\u003e, and \u003ca href=\"https://komo.do/\"\u003eKomodo\u003c/a\u003e, so I might not be settled on this one forever.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://andreasfragner.com/writing/three-ways-to-solve-problems\"\u003eThree ways to solve problems\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;reaching the desired state (perfect product) is neither possible nor\nsensible\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.ivanturkovic.com/2026/01/22/history-software-simplification-cobol-ai-hype/\"\u003eThe Eternal Promise: A History of Attempts to Eliminate Programmers\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBut the fundamental challenge remains unchanged: translating human intent\ninto correct, efficient, maintainable, secure software is hard. Not because\nthe tools are inadequate, but because the problem is inherently complex.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ePerhaps\u0026hellip;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHistory suggests that reports of programming\u0026rsquo;s death have been greatly\nexaggerated, repeatedly, for over sixty years. There is no reason to believe\nthis time is fundamentally different. There is every reason to believe that\nthose who invest in deep understanding will continue to be valuable,\nregardless of what tools emerge.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u0026hellip;some hope?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mrpopov.com/posts/elixir-phoenix-optimisations-iphone-safari/\"\u003eElixir Phoenix Optimisations iPhone Safari\u003c/a\u003e \u0026ndash; gotta be careful with that\nCSS!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.eod.com/blog/2026/02/lose-myself/\"\u003eLose Myself\u003c/a\u003e by Greg Knauss\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIs the code any good? I don\u0026rsquo;t know. Who cares? Nobody looks at it anyway. AI\nproduces a result, and results are what matter, and if you\u0026rsquo;re waiting for\nquality to factor significantly into that equation, I\u0026rsquo;ve got some bad news\nabout the last 40 years of professional software development for you.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://shapeof.com/archives/2026/2/greg_knauss_is_losing_himself.html\"\u003eGreg Knauss Is Losing Himself\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAnd I have discipline and I know how to ship. And in my experience, that\u0026rsquo;s\nwhat has always mattered.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eTwo qualities I do not have. That\u0026rsquo;s a shame for me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.pgedge.com/blog/postgresql-18-returning-enhancements-a-game-changer-for-modern-applications\"\u003ePostgreSQL 18 RETURNING Enhancements: A Game Changer for Modern Applications\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eToday I am learning about the \u003ccode\u003eMERGE\u003c/code\u003e statement.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://simonwillison.net/2026/Mar/5/chardet/\"\u003eCan coding agents relicense open source through a \u0026ldquo;clean room\u0026rdquo; implementation\nof code?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAs discussed in this issue from 2014 (where Dan first openly contemplated a\nlicense change) Mark Pilgrim’s original code was a manual port from C to\nPython of Mozilla’s MPL-licensed character detection library.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is fascinating. Python library chardet was rewritten using Claude.\nOriginal author objects, but the original library, before rewrite, was itself\na port from C to Python.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://uplock.app/\"\u003eUplock\u003c/a\u003e \u0026ndash; If I move to Apple Passwords from 1Password I will need somewhere\nto put all those non-password secrets that I use 1Password for. This might be\nthat place.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://siddhantkhare.com/writing/ai-fatigue-is-real\"\u003eAI fatigue is real and nobody talks about it\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI had to learn to let go. Not of quality - I still care about quality. But\nof the expectation that AI would produce quality. I now treat every AI\noutput as a rough draft. A starting point. Raw material. I mentally label it\n\u0026ldquo;draft\u0026rdquo; the moment it appears, and that framing change alone reduced my\nfrustration by half.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis post is chock-full of plugs for the author’s various products but a lot\nof it really resonated with me. I have felt \u003cem\u003eso\u003c/em\u003e tired when using AI. At first\nI thought it was not having coded much recently. Getting back into programming\nafter some time off often makes me really tired as I re-engage my brain in a\ndifferent way.\u003c/p\u003e\n\u003cp\u003eBut this time I think AI is the main cause. Reading the reams of text it\nproduces, which is something I struggle with generally, and the guilt from\nskipping over it all. The code reviews. The understanding hundreds of lines of\ntext from nothing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mariakonnikova.substack.com/p/the-fight-for-our-attention\"\u003eThe fight for our attention\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve beaten this drum many times, but I\u0026rsquo;m going to keep at it. Multitasking\nis a myth. You cannot split your attention. It is neurologically impossible.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mastodon.social/@siracusa/116171778118888641\"\u003eJohn Siracusa on the new MacBook Neo\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe A18 Pro in the MacBook Neo is 19% faster than the M2 Ultra in the Mac\nPro in single-core performance (Geekbench 6). The MacBook Neo starts at\n$599. The Mac Pro, which is still for sale, starts at $6,99.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eCrazy that this is the case. The MacBook Neo should be the average user\u0026rsquo;s\ncomputer, no doubt.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about \u003ca href=\"https://www.ferretdb.com/\"\u003eFerretDB\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA truly Open Source MongoDB alternative, built on Postgres\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt there anything Postgres can\u0026rsquo;t do?!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAt least the daffodils are starting to bloom.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou\u0026rsquo;ll be glad to know I\u0026rsquo;ve had neither the time nor headspace to worry about\nAI this week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week has been another shit one. After all hell broke lose in the Middle\nEast last Saturday, A, who was meant to get home from her holiday on\nWednesday, became stranded instead. This was very stressful as flights became\nfew and expensive due to the closed air space in the region.\u003c/p\u003e",
      "date_published": "2026-03-08T00:00:00+00:00",
      "date_modified": "2026-03-08T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/244-context-bloat/",
      "url": "https://elver.me/weeknotes/244-context-bloat/",
      "title": "Weeknotes 244: Context bloat",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI discovered that not only is \u003ca href=\"https://github.com/oban-bg/oban_web\"\u003eOban Web\u003c/a\u003e now free but it also works with the\nfairly recent SQLite support. This is cool because for small side projects\nI\u0026rsquo;ve been increasingly interested in using SQLite. And having a web interface\nto jobs is a massive help.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of SQLite. I am increasingly of the opinion that almost all\n\u0026ldquo;self-hosted\u0026rdquo; software should start with SQLite and offer other databases as\nan alternative. It makes deployment easier. Backups are easier. Who wants to\nrun a single instance of MySQL just for that one thing?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://expert-lsp.org/the-first-release-candidate/\"\u003eThe First Release Candidate\u003c/a\u003e of Expert, the Elixir LSP.\u003c/p\u003e\n\u003cp\u003eExcited to try this out!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/zihao-liu-qs/treekei\"\u003etreekei\u003c/a\u003e \u0026ndash; \u0026ldquo;A file tree with line counts\u0026rdquo;\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/243-pretty-big-re-organisation/#:~:text=A-,tree%20alternative,-that%20doesn%E2%80%99t%20list\"\u003eAnother tree alternative\u003c/a\u003e. Better name.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother trip south this week. There were a lot of small issues that I needed\nto address whilst there, and I managed to complete them all which was a\nrelief, and it lets me relax after a very anxious week.\u003c/p\u003e\n\u003cp\u003eThe smart lock was the main focus of my attention. It\u0026rsquo;s a constant problem.\nWell, it\u0026rsquo;s not constant. It works fine for 6 months and then doesn\u0026rsquo;t. I\nrecently had newly added PIN codes not work, and notifications completely\nstopped\u0026hellip;notifying. Oh, and the batteries we low too. I\u0026rsquo;ve now replaced the\nbatteries, and relocated the \u0026ldquo;WiFi bridge\u0026rdquo; to plug socket to see that fixes\nthe intermittent connectivity problems.\u003c/p\u003e\n\u003cp\u003eIt was nice to see friends too, of course.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m now \u003ca href=\"https://plezy.app/\"\u003eusing Plezy\u003c/a\u003e full time for consuming content from my Plex server.\nThere are less worries about what formats the video might be, and I can avoid\ntranscoding - Direct Play only - by just using Plezy as the client. I bought\nthe iOS version too, for my iPad, to support development. £4.99 well spent.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://variantsystems.io/blog/building-production-calendar-phoenix-liveview\"\u003eBuilding a Calendar in Phoenix LiveView\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHow we built a full-featured calendar in LiveView\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s become clear to me that despite all the opportunity afforded to me by\nLLMs, still it is \u003cem\u003eI\u003c/em\u003e who is in the way of creating things. Same as it ever\nwas.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://simonwillison.net/2026/Feb/15/deep-blue/\"\u003eDeep Blue\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSomething I see a lot of is people out there who are having existential\ncrises and are very, very unhappy because they’re like, \u0026ldquo;I dedicated my\ncareer to learning this thing and now it just does it. What am I even for?\u0026rdquo;.\nI will very happily try and convince those people that they are for a whole\nbunch of things and that none of that experience they\u0026rsquo;ve accumulated has\ngone to waste, but psychologically it’s a difficult time for software\nengineers.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI did not, in 2026, think I\u0026rsquo;d be reading the words “context bloat” quite as\nmuch as I am.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI enabled a couple of ad blocking lists in NextDNS and now I can visit local\nnews websites without catching anything. I don\u0026rsquo;t know why I didn\u0026rsquo;t do this\nsooner. Reasons. I started paying for NextDNS, it\u0026rsquo;s only £1.79/month which in\nterms of a quality of life improvement seems pretty cheap. However\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://controld.com/\"\u003eControl D\u003c/a\u003e, a NextDNS competitor looks interesting. And is cheaper.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI kept seeing things about \u003ca href=\"https://github.com/microsoft/playwright-cli\"\u003e\u003ccode\u003eplaywright-cli\u003c/code\u003e\u003c/a\u003e this week and decided to give it\na go. It is what is sounds like, a command line interface to \u003ca href=\"https://en.wikipedia.org/wiki/Playwright_%28software%29\"\u003ePlaywright\u003c/a\u003e, the\nbrowser automation tool. An MCP already exists for Playwright, but this cli\nversion is more \u0026ldquo;token efficient\u0026rdquo; so is apparently preferred.\u003c/p\u003e\n\u003cp\u003eI was able to describe to the LLM what to tests to write, and then have those\ntests converted into actual runnable specs. It was very easy. I\u0026rsquo;m not saying\nthis is the best way to write tests, but if you need to add some confidence\nbefore making changes, and you don\u0026rsquo;t have tests already, this might be best\nbang for your buck.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI spent some time sharpening our kitchen knives this week which is how I\nmanaged to slice the end off my left thumb. Naturally.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI discovered that not only is \u003ca href=\"https://github.com/oban-bg/oban_web\"\u003eOban Web\u003c/a\u003e now free but it also works with the\nfairly recent SQLite support. This is cool because for small side projects\nI\u0026rsquo;ve been increasingly interested in using SQLite. And having a web interface\nto jobs is a massive help.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of SQLite. I am increasingly of the opinion that almost all\n\u0026ldquo;self-hosted\u0026rdquo; software should start with SQLite and offer other databases as\nan alternative. It makes deployment easier. Backups are easier. Who wants to\nrun a single instance of MySQL just for that one thing?\u003c/p\u003e",
      "date_published": "2026-03-01T00:00:00+00:00",
      "date_modified": "2026-03-01T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/243-pretty-big-re-organisation/",
      "url": "https://elver.me/weeknotes/243-pretty-big-re-organisation/",
      "title": "Weeknotes 243: Pretty big re-organisation",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou may or may not have noticed that I shipped a pretty big re-organisation of\nmy \u0026ldquo;web presence\u0026rdquo; this week.\u003c/p\u003e\n\u003cp\u003eThe separate \u003ca href=\"https://weeknotes.elver.me\"\u003eweeknotes\u003c/a\u003e website where you would\u0026rsquo;ve been reading this before\nis no more. That is now a section on here at \u003ca href=\"https://elver.me/weeknotes/\"\u003eelver.me/weeknotes/\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe blog from \u003ca href=\"https://jordanelver.co.uk\"\u003ejordanelver.co.uk\u003c/a\u003e has also been consolidated here. Leaving\nthat website as more of a work/calling card kind of thing.\u003c/p\u003e\n\u003cp\u003eI intend to use \u003ca href=\"https://elver.me\"\u003ehttps://elver.me\u003c/a\u003e for the majority of the stuff I publish\nonline.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve added redirects for everything I could think of, but it is of course\npossible I missed one (thank you \u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e for pointing one out already!). If\nyou are subscribed to any feeds and you got duplicates or unreads I\u0026rsquo;m sorry\nbut how exactly feed readers manage this is unknown to me and it was too much\nwork for two of you.\u003c/p\u003e\n\u003cp\u003eSpeaking of which there are now a lot more feeds at \u003ca href=\"https://elver.me/feeds/\"\u003e/feeds\u003c/a\u003e too so that you\ncan subscribe to only the parts you are interested in or, more likely, all the\nexciting content on this website.\u003c/p\u003e\n\u003cp\u003eOf course, I got OpenAI GPT-5.3 Codex using \u003ca href=\"https://opencode.ai/\"\u003eopencode\u003c/a\u003e to do a lot of the\nheavy lifting which was mainly migrating content in Markdown files from one\nplace to another and munging it about a bit.\u003c/p\u003e\n\u003cp\u003eEven updating the old and crufty jordanelver.co.uk which was running Ruby 2.7\nand other ancient gems was easy thanks to me asking Codex to generate me a\n\u003ccode\u003eDockerfile\u003c/code\u003e I could use to get it going and edit from there. This will be\nre-designed at \u003cem\u003esome point\u003c/em\u003e. I knew I could use Docker to solve this problem,\nbut having it done and working in 30 seconds does change things,\nsignificantly.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m pretty happy this is all done.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://aaronrussell.dev/posts/agentic-engineering\"\u003eAgentic engineering\u003c/a\u003e \u0026ndash; A lot of insightful points here.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/waynehoover/pbrich\"\u003epbrich\u003c/a\u003e \u0026ndash; \u0026ldquo;Like pbcopy, but with support for arbitrary pasteboard types\u0026rdquo;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSomething that I\u0026rsquo;ve avoided for years, talking into my phone/computer/device,\nneeds addressing. AI use has made it clear, I need to start talking and\ntranscribing more. Typing is a barrier to use.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve avoided it for so long because it\u0026rsquo;s been very bad in the past. That, and\nI feel like a pillock talking into my phone. But I remember feeling that way\nabout using my iPhone and laptop in public too. Need to get over that.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/caffienerd/struct-cli\"\u003estruct\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eStruct: tree with a developer brain. Stop drowning in site-packages — struct\nshows you the code you care about.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eA \u003ccode\u003etree\u003c/code\u003e alternative that doesn\u0026rsquo;t list \u003ccode\u003enode_modules/\u003c/code\u003e, nice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://openepaperlink.de/\"\u003eOpenEPaperLink\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOpenEPaperLink is an alternative protocol and firmware implementation for\nelectronic shelf labels. Multiple Displays are supported with ESP32-based\naccess points and 802.15.4 radio communication.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAn excuse to get some colour \u003ca href=\"https://en.wikipedia.org/wiki/E_Ink\"\u003eE Ink\u003c/a\u003e displays?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.zachdaniel.dev/p/software-conjuring\"\u003eSoftware Conjuring\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe thing is that it really doesn\u0026rsquo;t feel like engineering any more. I feel\ninstead that I\u0026rsquo;ve gotten really good at my spellwork.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://til.hashrocket.com/posts/pfjzwvr00o-visualize-a-git-branchs-history\"\u003eVisualize a Git Branch\u0026rsquo;s History\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit log --oneline --graph --decorate --all\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eKeeping this one handy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt dawned on me this week that although \u0026ldquo;public\u0026rdquo; access (not really public as\neverything is still behind Tailscale) to all my services was now secured over\nHTTPS, inter-service communication \u0026ndash; when one container talks to another \u0026ndash;\nwas not. That communication was happening without using TLS direct to the\ncontainer and port. Now, this is a homelab environment, but we should still do\nour best to tidy this up \u0026ndash; I guarantee this homelab has better security than\n99% of businesses!\u003c/p\u003e\n\u003cp\u003eMy aim was to replace addresses configured inside running containers that look\nlike \u003ccode\u003ehttp://\u0026lt;service\u0026gt;:\u0026lt;port\u0026gt;\u003c/code\u003e with their secure counterpart\n\u003ccode\u003ehttps://\u0026lt;service\u0026gt;.custom.domain\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eI was planning on using that \u003ca href=\"/weeknotes/242-happening-regardless/#:~:text=could%20use%20the-,extra_hosts,-directive%20in%20a\"\u003e\u003ccode\u003eextra_hosts\u003c/code\u003e trick I discovered and utilised\nlast week\u003c/a\u003e, but happened across a slightly less hacky solution, network\naliases.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-diff\" data-lang=\"diff\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  caddy:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    container_name: caddy\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ports:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      - 443:443\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    volumes:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      - ./caddy/Caddyfile:/etc/caddy/Caddyfile\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      - /opt/appdata/caddy/data:/data\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      - /opt/appdata/caddy/config:/config\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+   networks:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+     default:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+       aliases:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+         - \u0026lt;service1\u0026gt;.custom.domain\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+         - \u0026lt;service2\u0026gt;.custom.domain\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+         - \u0026lt;service3\u0026gt;.custom.domain\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e\u003c/span\u003e    restart: unless-stopped\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eInstead of needing to add an \u003ccode\u003eextra_host\u003c/code\u003e config change for each container, I\ncould instead add network aliases for the services that need to talk \u0026ndash; these\nare essentially just DNS entries that work only in Docker, but that’s fine \u0026ndash;\nand then they can reach each other. I made this change and configured the URLs\nin the respective softwares and it all works.\u003c/p\u003e\n\u003cp\u003eI also removed the previous \u003ccode\u003eextra_host\u003c/code\u003e configuration I added last week and\nreplaced it with another network alias.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dev.37signals.com/introducing-upright/\"\u003eIntroducing Upright: An Open Source Synthetic Monitoring System\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eLots of great ideas in here. Playwright Probes, in particular, are cool.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://johan.hal.se/wrote/2026/02/03/the-sideprocalypse/\"\u003eThe Sideprocalypse\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eListen: every idea you\u0026rsquo;ve ever had, every single one, some cocaine-addled\nsales critter has had too. And they\u0026rsquo;re better than you at SEO.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is \u003cem\u003esomewhat\u003c/em\u003e what I was saying (in \u003cem\u003eslightly\u003c/em\u003e different terms) to a\nfriend last week but I hope Johan and I are wrong. I fear we are not 😢\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVibe of the week: \u003ca href=\"https://open.spotify.com/track/1CsMuJeMzRqNgS7G0fo1Gv\"\u003eHow to Fight Loneliness\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e(Not a call for help, I\u0026rsquo;m fine!)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou may or may not have noticed that I shipped a pretty big re-organisation of\nmy \u0026ldquo;web presence\u0026rdquo; this week.\u003c/p\u003e\n\u003cp\u003eThe separate \u003ca href=\"https://weeknotes.elver.me\"\u003eweeknotes\u003c/a\u003e website where you would\u0026rsquo;ve been reading this before\nis no more. That is now a section on here at \u003ca href=\"https://elver.me/weeknotes/\"\u003eelver.me/weeknotes/\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe blog from \u003ca href=\"https://jordanelver.co.uk\"\u003ejordanelver.co.uk\u003c/a\u003e has also been consolidated here. Leaving\nthat website as more of a work/calling card kind of thing.\u003c/p\u003e\n\u003cp\u003eI intend to use \u003ca href=\"https://elver.me\"\u003ehttps://elver.me\u003c/a\u003e for the majority of the stuff I publish\nonline.\u003c/p\u003e",
      "date_published": "2026-02-22T00:00:00+00:00",
      "date_modified": "2026-02-22T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/242-happening-regardless/",
      "url": "https://elver.me/weeknotes/242-happening-regardless/",
      "title": "Weeknotes 242: Happening regardless",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis week is very AI/LLM heavy for which I apologise. It feels as if it is\ndominating my life. That\u0026rsquo;s not even hyperbole. Every conversation I have seems\nto end up talking about it some how, even with \u0026ldquo;normal\u0026rdquo; people who don\u0026rsquo;t have\nskin in the game.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s amazing. It\u0026rsquo;s awful. It\u0026rsquo;s happening regardless.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week\u0026rsquo;s project was to setup SSO (Single Sign-on) for my services at home.\nI have ignored Single Sign-on for years, not having really had to deal or come\ninto contact with it at all. The name seems fairly self-describing, but it is\nalso quite a nebulous term for software that allows you to authenticate a user\nand have them \u0026ldquo;logged in\u0026rdquo; to some other software, without the need to login to\neach service separately.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/OpenID#OpenID_Connect_(OIDC)\"\u003eOIDC\u003c/a\u003e, based on OAuth 2.0, seems to be the modern protocol for achieving\nthis.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been lurking on Reddit for a while and subconsciously keeping note of the\nsolutions proffered to this problem. I decided upon the combination of \u003ca href=\"https://pocket-id.org/\"\u003ePocket\nID\u003c/a\u003e and \u003ca href=\"https://tinyauth.app/\"\u003eTinyauth\u003c/a\u003e along with Caddy (which I\u0026rsquo;m already using as reverse\nproxy).\u003c/p\u003e\n\u003cp\u003eIt is seemingly working. Maybe there\u0026rsquo;ll be a blog post on how I set it up.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSee what the environment variables are from a running Docker Container.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-docker\" data-lang=\"docker\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker inspect \u0026lt;container\u0026gt; --format \u003cspan style=\"color:#d14\"\u003e\u0026#39;{{range .Config.Env}}{{println .}}{{end}}\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#a61717;background-color:#e3d2d2\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf you were to, for example, completely hypothetically, accidentally, maybe,\ndelete your \u003ccode\u003e*.env\u003c/code\u003e files containing all your secrets, you could recover them\nusing this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.neatnik.net/setting-up-an-irc-server/\"\u003eSetting up an IRC server\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eSetting up an IRC server for use amongst friends is very tempting. But does it\nsolve anything for me really? People I know are already scattered over\ndifferent Slacks, Signals, WhatsApps, and others. And if I setup an IRC server\nthen I\u0026rsquo;m asking them to add IRC to their own list communication channels.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.peonping.com/\"\u003epeon-ping - \u0026ldquo;Stop babysitting your terminal\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWarcraft III Peon voice notifications (+ more!) for Claude Code, Codex, and\nother IDEs. Stop babysitting your terminal.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cem\u003eThis\u003c/em\u003e is what software is about.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL that you can specify hostname mappings at build time with Docker Compose.\nMy use case for this was, once again (I am sorry) DNS. It is\u0026hellip;\u003cem\u003ealways\u003c/em\u003e DNS.\u003c/p\u003e\n\u003cp\u003eSince I don\u0026rsquo;t have a DNS server on my network I have been relying on \u003ca href=\"/weeknotes/241-my-dns-problem/#:~:text=fix%E2%80%9D%20is%20that-,NextDNS,-has%20a%20feature\"\u003eNextDNS\nRewrites and /etc/hosts\u003c/a\u003e. This works for \u003cem\u003emy client devices\u003c/em\u003e. However the\nserver I am running at home does not use NextDNS, so it cannot resolve the\nsame hostnames that I can on my clients (my laptop).\u003c/p\u003e\n\u003cp\u003eUntil now that hasn\u0026rsquo;t been a problem because when Docker containers need to\ntalk to one another, I can use \u003ca href=\"https://docs.docker.com/reference/compose-file/networks/\"\u003eDocker networking\u003c/a\u003e. Docker networking is a\nmagical feature where running containers appear on the internal Docker network\nusing their container name as hostname. For example, if I have two containers\nrunning, \u003ccode\u003efoo\u003c/code\u003e and \u003ccode\u003ebar\u003c/code\u003e. If \u003ccode\u003ebar\u003c/code\u003e has a web server running on port 3000, I\ncan reach it from \u003ccode\u003efoo\u003c/code\u003e with \u003ccode\u003ehttp://bar:3000\u003c/code\u003e without having to do anything\nelse.\u003c/p\u003e\n\u003cp\u003eThis is great for a lot of use cases, but not for the OIDC flow I was setting\nup this week. To simplify a lot (because I don\u0026rsquo;t fully grasp it like all OAuth\nrelated topics) the flow starts in the web browser and you are redirected to\nthe OIDC provider. This works because we\u0026rsquo;re on the client, so we have properly\nresolving DNS. The OIDC provider then \u003ccode\u003ePOST\u003c/code\u003es the initiator \u0026ndash; server to\nserver. This is the part that fails, we don\u0026rsquo;t have working DNS on the server,\njust client.\u003c/p\u003e\n\u003cp\u003eTo fix this I need the server to be able to resolve initiating service. I\ncould setup hardcoded DNS entries on my home server, but it seems like my\n\u003ccode\u003e/etc/hosts\u003c/code\u003e habit is already getting out of hand, so instead I found I could\nuse the \u003ca href=\"https://docs.docker.com/reference/compose-file/build/#extra_hosts\"\u003e\u003ccode\u003eextra_hosts\u003c/code\u003e directive\u003c/a\u003e in a \u003ccode\u003edocker-compose.yml\u003c/code\u003e to specify the\nmapping.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-docker\" data-lang=\"docker\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eextra_hosts:\u003cspan style=\"color:#a61717;background-color:#e3d2d2\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a61717;background-color:#e3d2d2\"\u003e\u003c/span\u003e  - \u003cspan style=\"color:#d14\"\u003e\u0026#34;service.custom.domain:192.168.0.1\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#a61717;background-color:#e3d2d2\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis feels like a slight hack, we\u0026rsquo;re putting DNS stuff where you might not\nexpect to find it, but I think it\u0026rsquo;s reasonable for now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/mitchellh/vouch\"\u003eVouch — A community trust management system\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHistorically, the effort required to understand a codebase, implement a\nchange, and submit that change for review was high enough that it naturally\nfiltered out many low quality contributions from unqualified people. For\nover 20 years of my life, this was enough for my projects as well as enough\nfor most others.\u2028\u2028Unfortunately, the landscape has changed particularly with\nthe advent of AI tools that allow people to trivially create\nplausible-looking but extremely low-quality contributions with little to no\ntrue understanding. Contributors can no longer be trusted based on the\nminimal barrier to entry to simply submit a change.\u2028\u2028But, open source still\nworks on trust! And every project has a definite group of trusted\nindividuals (maintainers) and a larger group of probably trusted individuals\n(active members of the community in any form). So, let\u0026rsquo;s move to an explicit\ntrust model where trusted individuals can vouch for others, and those\nvouched individuals can then contribute.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://exe.dev/\"\u003eexe.dev\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eexe.dev is a subscription service that gives you virtual machines, with\npersistent disks, quickly and without fuss. These machines are immediately\naccessible over HTTPS, with sensible and secure defaults. You can share your\nweb server as easily as you can share a Google Doc. With built-in optional\nauthentication, so you can focus on your thing.\u003c/p\u003e\n\u003cp\u003eYour VMs share CPU/RAM—you pay for underlying resources, not per VM. Make a\nbunch!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI think this service looks really interesting, I\u0026rsquo;m just not sure what my\nworkflow would look like using it. On the one hand I like that it keeps\neverything isolated, but to make it useful I\u0026rsquo;m going to need to give it access\nto things, so I don\u0026rsquo;t know. \u003ccode\u003escp\u003c/code\u003e-ing files around doesn\u0026rsquo;t seem like fun. FUSE\nSSH filesystem? Something else?\u003c/p\u003e\n\u003cp\u003eUndeniably great domain name though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/XENONCYBER/envy\"\u003eenvy\u003c/a\u003e — \u0026ldquo;A terminal based tool for managing secrets with both tui and cli\nsupport\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA secure encrypted vault for managing API keys, secrets, and environment\nvariables. Built for developers who live in the terminal.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI do have the problem of .env files being scattered around 🤔\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://crawshaw.io/blog/programming-with-llms\"\u003eHow I program with LLMs\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSometimes the LLM is wrong. So are people.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eExactly. You don\u0026rsquo;t believe anything you read or are told by other people\neither do you?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://disco.cloud/\"\u003edisco\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDisco is the self-hosted Open Source Heroku alternative: git push deploys,\nzero-downtime releases, automatic SSL, on your own servers at hardware\ncost.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis sounds somewhat like Hatchbox.io? Opaque pricing means a no from me\nthough.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://localghost.dev/blog/stop-generating-start-thinking/\"\u003eStop generating, start thinking\u003c/a\u003e \u0026ndash; Thoughtful takes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://zed.dev/blog/on-programming-with-agents\"\u003eOn Programming with Agents\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFocus on the thinking and let agents do the typing. Use the three rules to\nguide your workflow: plan first so you know what you\u0026rsquo;re building, stay\nengaged so you never lose the thread, and review the output so you can stand\nbehind what ships.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.zolkos.com/2025/12/03/vanilla-css-is-all-you-need\"\u003eVanilla CSS is all you need\u003c/a\u003e \u0026ndash; This was quite an education for me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://nolanlawson.com/2026/02/07/we-mourn-our-craft/\"\u003eWe mourn our craft\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUltimately if you have a mortgage and a car payment and a family you love,\nyou\u0026rsquo;re going to make your decision. It’s maybe not the decision that your\nyounger, more idealistic self would want you to make, but it does keep your\ncar and your house and your family safe inside it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dashbit.co/blog/why-elixir-best-language-for-ai\"\u003eWhy Elixir is the best language for AI\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI keep seeing various posts from people about how their particular tools are\n\u0026ldquo;the best\u0026rdquo; for use with LLMs. And here I am doing the same, but I\u0026rsquo;m also\n\u003ca href=\"https://autocodebench.github.io/\"\u003elinking to a study\u003c/a\u003e that I looked at for up to 1 minute.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://thebitshift.com/blog/the-greenfield/\"\u003eThe Greenfield\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis is the single most expensive delusion in engineering.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://amit.prasad.me/blog/rip-good-code\"\u003eThe silent death of Good Code\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis week is very AI/LLM heavy for which I apologise. It feels as if it is\ndominating my life. That\u0026rsquo;s not even hyperbole. Every conversation I have seems\nto end up talking about it some how, even with \u0026ldquo;normal\u0026rdquo; people who don\u0026rsquo;t have\nskin in the game.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s amazing. It\u0026rsquo;s awful. It\u0026rsquo;s happening regardless.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week\u0026rsquo;s project was to setup SSO (Single Sign-on) for my services at home.\nI have ignored Single Sign-on for years, not having really had to deal or come\ninto contact with it at all. The name seems fairly self-describing, but it is\nalso quite a nebulous term for software that allows you to authenticate a user\nand have them \u0026ldquo;logged in\u0026rdquo; to some other software, without the need to login to\neach service separately.\u003c/p\u003e",
      "date_published": "2026-02-15T00:00:00+00:00",
      "date_modified": "2026-02-15T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/241-my-dns-problem/",
      "url": "https://elver.me/weeknotes/241-my-dns-problem/",
      "title": "Weeknotes 241: My DNS problem",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/232-your-blog-is-dead-to-me/#:~:text=route%2C%20for%20now%20%E2%80%93-,/etc/hosts,-.\"\u003eDNS problem\u003c/a\u003e took a step forward when I realised that I might be able to\nsolve it, again perhaps temporarily, without having to actually setup a proper\nDNS server \u0026ndash; which I seem to be constantly putting off. That fix is\n\u003ca href=\"https://nextdns.io/\"\u003eNextDNS\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNextDNS protects you from all kinds of security threats, blocks ads and\ntrackers on websites and in apps and provides a safe and supervised Internet\nfor kids — on all devices and on all networks.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve been a NextDNS user on and off for a few years. I never really fully\ncommitted to it though despite being impressed by the whole idea and\nimplementation.\u003c/p\u003e\n\u003cp\u003eThe \u0026ldquo;fix\u0026rdquo; is that NextDNS has a feature called \u003ca href=\"https://nextdns.io/#:~:text=Rewrites,for%20any%20domain.\"\u003eRewrites\u003c/a\u003e which are basically\nDNS mappings from hostname to IPs.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSet or override the DNS response for any domain. Rewrites apply to\nsubdomains as well, and local IP addresses are supported as answers.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis sounds like what a DNS server does. As \u003ca href=\"/weeknotes/231-on-a-roll/#:~:text=Subnet%20Router\"\u003epreviously covered, because of\nsubnet routing\u003c/a\u003e, I can use local IPs when connected to my tailnet. So if I\u0026rsquo;m\nconnected to Tailscale and using NextDNS, my services are resolving to their\nproper DNS names.\u003c/p\u003e\n\u003cp\u003eI added a rewrite like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e  *.custom.domain → 192.168.0.1\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis is working for \u003cem\u003eme\u003c/em\u003e but it does raise the question of how to get everyone\nin the house using NextDNS and if that even matters? Getting the Virgin Media\nrouter to dish out NextDNS via DHCP seems like a non-starter.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://inessential.com/2004/12/01/black_box_parsing.html\"\u003eBlack Box Parsing\u003c/a\u003e \u0026ndash; Encapsulation is good.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gem.coop/updates/4/\"\u003egem.coop update #4: cooldowns beta\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis seems like an interesting technique. I\u0026rsquo;ve always been a reluctant updater\nof libraries/gems, not for fear of introducing security vulnerabilities, but\nthat everything else might break. I think we forget that people write code\n(lol — not anymore) and we blindly accept their changes into our codebases\nlike they are free of cost. They are not.\u003c/p\u003e\n\u003cp\u003eThere has to be a compromise between updating all the time, and never updating\nthough.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mariakonnikova.substack.com/p/the-power-of-the-literally-written\"\u003eThe power of the (literally) written word\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhat\u0026rsquo;s more, you can\u0026rsquo;t write as quickly as you type, so your brain has to\nactually comprehend what it\u0026rsquo;s hearing and process it, so that you can write\ndown the essentials. In a sense, then, you\u0026rsquo;re encoding twice, first, in the\neffort it takes to internalize what you\u0026rsquo;re hearing and sum it up in a way\nthat enables you to write it down quickly enough, and second, in the\nphysical process of writing itself.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.mikeswanson.com/backseat-software/\"\u003eBackseat Software\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;the slow shift from software as a tool you operate to software as a\nchannel that operates on you. Once a product learns it can talk back, it\u0026rsquo;s\nremarkably hard to keep it quiet.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://support.dnsimple.com/articles/sshfp-records/\"\u003eWhat are SSHFP Records?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAn SSHFP (SSH FingerPrint, record type 44) record is a type of DNS resource\nrecord that is used to securely publish SSH host key fingerprints in\nthe Domain Name System (DNS). The primary purpose of an SSHFP record is to\nprovide a way for SSH clients to automatically and securely verify the\nauthenticity of an SSH server\u0026rsquo;s public key, helping to protect against\nman-in-the-middle (MITM) attacks during SSH connections.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe algorithm knows me. Everything is DNS records at the moment.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://nitter.net/akshay_pachaar/status/2014314783391298019\"\u003e\u003ccode\u003epg_textsearch\u003c/code\u003e seems like it\u0026rsquo;s going to be a great addition to Postgres!\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://byroot.github.io/ruby/performance/2025/10/28/string-literals.html\"\u003eFrozen String Literals: Past, Present, Future?\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis has been sat in my “to read” pile since it was published, but I\u0026rsquo;m glad to\nhave finally read it because now I have a much better idea of why we\u0026rsquo;ve been\nwriting \u003ccode\u003e# frozen_string_literal: true\u003c/code\u003e at the top of our Ruby files.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.heroku.com/blog/an-update-on-heroku/\"\u003eAn Update on Heroku\u003c/a\u003e \u0026ndash; What a sad state of affairs this is. Such a game\nchanger with a massive lead squandered.\u003c/p\u003e\n\u003cp\u003ePeople have totally forgotten what a game-changer Heroku was and just how easy\nit made deploying Ruby on Rails applications. It had a big impact on the\npopularity of Rails itself. I still think the ease of deployment is unmatched.\u003c/p\u003e\n\u003cp\u003e(I really like \u003ca href=\"https://fly.io/\"\u003eFly.io\u003c/a\u003e \u0026ndash; despite having nothing deployed in production there\n\u0026ndash; but I don\u0026rsquo;t think the experience is as good, nor is it ever likely to be as\nthey position themselves differently to Heroku.)\u003c/p\u003e\n\u003cp\u003eAnd no, \u0026ldquo;Kamal and Hetzner\u0026rdquo; is not the same thing \u0026ndash; although they are a good\nthing apparently. I ask you once again, who is looking after that VPS of\nyours?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitchellh.com/writing/my-ai-adoption-journey\"\u003eMy AI Adoption Journey\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eImmediately cease trying to perform meaningful work via a chatbot\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis cemented for me something I hadn\u0026rsquo;t fully understood. All the copying and\npasting destroys any productivity. For anything that will code or does\nanything on the filesystem it\u0026rsquo;s best to just go straight to the terminal.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/chrishutchinson/claude-receipts\"\u003e\u003ccode\u003eclaude-receipts\u003c/code\u003e\u003c/a\u003e — \u0026ldquo;Bring receipts from your Claude Code sessions\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eWe\u0026rsquo;re all probably gonna need this when we\u0026rsquo;re fully dependant on them.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI made \u003ca href=\"https://github.com/jordelver/gridfinity-canon-lp-e5-battery-holder/\"\u003emy first \u003cem\u003efrom scratch\u003c/em\u003e 3D model\u003c/a\u003e!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA Gridfinity compatible battery holder for Canon LP-E5 batteries created\nusing OpenSCAD.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s a battery holder for Canon camera batteries. I wrote it in OpenSCAD\u0026hellip;\u003c/p\u003e\n\u003cmodel-viewer\n    src=\"/models/gridfinity-canon-lp-e5-battery-holder.glb\"\n    alt=\"Canon LP-E5 battery 3 slot holder for Gridfinity\"\n    camera-controls\n    auto-rotate\n    \n    camera-orbit=\"35deg 68deg 140%\"\n    \n    \n    \n    style=\"width:100%;height:520px;\"\u003e\n  \u003c/model-viewer\u003e\n\n\u003cp\u003eI was \u003ca href=\"/weeknotes/235-magnets/#:~:text=mathsy\"\u003eright about OpenSCAD getting very mathsy\u003c/a\u003e. It quickly gets too\ncomplicated for me to understand, thankfully LLMs are very helpful with this\ntask too.\u003c/p\u003e\n\u003cp\u003e(Aside: I had ChatGPT walk me through \u003ca href=\"https://www.blender.org/\"\u003eBlender\u003c/a\u003e to create a render of the STL,\nupon which the interactive version above is based, and despite it taking ages\nand being painful, we did get there. I would\u0026rsquo;ve just noped out of Blender in\nthe past. Have you seen the Blender interface?! 🤯)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs LLM\u0026rsquo;s become \u0026ldquo;just another tool in the toolbox\u0026rdquo;, which at the moment I\nbelieve they will. And if it is just matter of learning how to fit them into\nyour workflow and operate them effectively, then why are we committing the\nchanges they helped \u003cem\u003eus\u003c/em\u003e make \u003cem\u003eas them\u003c/em\u003e?\u003c/p\u003e\n\u003cp\u003eAre we showing our workings for fear of being found out?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.arkency.com/the-timezone-bug-that-hid-in-plain-sight-for-months/\"\u003eThe timezone bug that hid in plain sight for months\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eYet again time and date maths is hard.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBoth OpenAI\u0026rsquo;s Codex 5.3 and Anthropic\u0026rsquo;s Opus 4.3 were released this week, so I\nfelt I should try them out despite not feeling like I have enough usage of\neither to really judge whether they are \u0026ldquo;better\u0026rdquo;. I am very much working on\nvibes with this stuff.\u003c/p\u003e\n\u003cp\u003eClaude has felt like it was way ahead and as such I mostly concentrated on it.\nCodex impressed me though. I spent some time with Codex 5.3 though on various\nprojects and it felt less needy and needed less hand holding. I think.\u003c/p\u003e\n\u003cp\u003eIt is still funny when I ask it to do something quite straightforward and it\ndoes it in the most convoluted way possible. For example, I asked it to format\na document by word wrapping to 80 characters and it instantly starts writing a\nPython script to do so, instead of, you know, many of the sensible ways to\nachieve that task.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/232-your-blog-is-dead-to-me/#:~:text=route%2C%20for%20now%20%E2%80%93-,/etc/hosts,-.\"\u003eDNS problem\u003c/a\u003e took a step forward when I realised that I might be able to\nsolve it, again perhaps temporarily, without having to actually setup a proper\nDNS server \u0026ndash; which I seem to be constantly putting off. That fix is\n\u003ca href=\"https://nextdns.io/\"\u003eNextDNS\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNextDNS protects you from all kinds of security threats, blocks ads and\ntrackers on websites and in apps and provides a safe and supervised Internet\nfor kids — on all devices and on all networks.\u003c/p\u003e",
      "date_published": "2026-02-08T00:00:00+00:00",
      "date_modified": "2026-02-08T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/240-always-use-hot-glue/",
      "url": "https://elver.me/weeknotes/240-always-use-hot-glue/",
      "title": "Weeknotes 240: Always use hot glue",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"https://mecha.so/comet\"\u003eMecha Comet\u003c/a\u003e looks like a cool little handheld computer which I would\nnever use.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/jordelver/dotfiles/commit/6aae2381440bc06bf20e87c4905fd5602cd632f4\"\u003eMake Ghostty look as much like iTerm as possible\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThanks to help from my mate Claude, I now have \u003ca href=\"https://ghostty.org/\"\u003eGhostty\u003c/a\u003e configured to match\niTerm with only a tiny difference (that I\u0026rsquo;ve noticed so far) so I\u0026rsquo;m moving\nover to give it a proper try.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/nvzone/typr\"\u003etypr\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMost Beautiful Typing practice plugin for Neovim with dashboard\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis does look very nice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAn unfortunate event: bleach on my new black hoodie 🙀 First I attempted to\ncolour it in using black sharpie. That resulted in the coloured in bit being\n\u003cem\u003etoo\u003c/em\u003e black. So I resorted to dyeing it. No cigar. It is now a gym hoodie.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI \u0026ldquo;fixed\u0026rdquo; my \u003ca href=\"/weeknotes/190-no-worky/#:~:text=Finally%2C-,something%20I%20fixed,-.%20We%20use%20an\"\u003eSoundcore speaker again\u003c/a\u003e. You could say there is no \u0026ldquo;again\u0026rdquo;\nbecause I\u0026rsquo;m here fixing it a second time. I am of course blaming the speaker.\nThe \u003ca href=\"/weeknotes/231-on-a-roll/#:~:text=it%2C%20but%20I%E2%80%99ve-,preemptively%20bought,-some%20right%2Dangled\"\u003eswitches I bought\u003c/a\u003e were wrong. I used hot glue to fix it this time.\nAlways use hot glue.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/netmute/dol\"\u003edol\u003c/a\u003e \u0026ndash; \u0026ldquo;Detect dark/light mode on the CLI\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eThe definition of Unix \u0026ndash; one thing well.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://european-alternatives.eu/\"\u003eEuropean alternatives for digital products\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe help you find European alternatives for digital service and products,\nlike cloud services and SaaS products.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://arrowsmithlabs.com/blog/secure-by-default-how-phoenix-keeps-you-safe-for-free\"\u003e\u0026ldquo;Secure by default\u0026rdquo; - how Phoenix keeps you safe for free\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA lot of \u0026ldquo;indie hackers\u0026rdquo; apparently think that security isn\u0026rsquo;t important.\nSure, it\u0026rsquo;s better to be secure than insecure, but you have a business to\nlaunch - security is a cost you can live without, so get your MVP out the\ndoor asap then you can worry about security later.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis has always been a problem with cowboy coders and I\u0026rsquo;m afraid that it\u0026rsquo;s\nonly going to get worse with all the vibe coders out there. People who didn\u0026rsquo;t\ncare before are even less likely to care now when they\u0026rsquo;re not even writing the\ncode. AI is only going to exacerbate the problem.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://zarar.dev/regex-serialization-has-changes-in-elixir-119-otp-28/\"\u003eWhy Regex Serialization Changed in Elixir 1.19/OTP 28\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://eieio.games/blog/ssh-sends-100-packets-per-keystroke/\"\u003eWHY DOES SSH SEND 100 PACKETS PER KEYSTROKE?\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis is a really interesting.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn 2023, ssh added keystroke timing obfuscation. The idea is that the speed\nat which you type different letters betrays some information about which\nletters you\u0026rsquo;re typing. So ssh sends lots of \u0026ldquo;chaff\u0026rdquo; packets along with your\nkeystrokes to make it hard for an attacker to determine when you\u0026rsquo;re actually\nentering keys.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is why I\u0026rsquo;m very suspicious of people who think they can roll their own\nsecurity. Not quite a fair example here as obviously SSH is having to do\nthings that most of us writing web applications are not, but still you need to\nbe aware of things like timing attacks which are a lot more difficult to\nhandle than a simple username and password.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI think they\u0026rsquo;re sometimes right! Interacting with LLMs is a new skill, and\nit feels pretty weird if you\u0026rsquo;re used to writing software like it\u0026rsquo;s 2020.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVery true. This new LLM stuff is learning how to use them effectively.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.todoist.com/ramble\"\u003eTodoist Ramble\u003c/a\u003e looks like a nice implementation.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.dnsimple.com/2026/01/tlsa-record-support/\"\u003eAnnouncing TLSA Record Support\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTLSA records bind TLS certificates to DNS names using DNSSEC. Instead of\nrelying solely on Certificate Authorities (CAs) to validate certificates,\nTLSA records let you publish certificate information directly in your DNS\nzone. When a client connects to your server, it can verify that the\ncertificate presented matches what\u0026rsquo;s published in DNS.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jvns.ca/blog/2026/01/27/some-notes-on-starting-to-use-django/\"\u003eSome notes on starting to use Django\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAround the same time as I was getting into Ruby I was also playing around with\nPython and I always liked it. I never got around to learning more though\nbecause it sort of felt like I had my \u0026ldquo;scripting language\u0026rdquo; bases covered with\nRuby. Maybe that was silly.\u003c/p\u003e\n\u003cp\u003eReading this kinda made me wonder what would\u0026rsquo;ve happened if I\u0026rsquo;d chosen Python\nand Django back then.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://sindresorhus.com/ds-store-inspector\"\u003eDS_Store Inspector\u003c/a\u003e — \u0026ldquo;Inspect .DS_Store files\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eMight be useful to the right audience?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://little-book-of.github.io/c/\"\u003eThe Little Book of C\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis looks like a nice introduction for the C curious amongst us.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHopefully some advice to future me one day. People who are offering a software\nproduct, \u003cem\u003eplease\u003c/em\u003e tell me what it does and what problems it solves! It\u0026rsquo;s\nscalable? Oh, cool. It can streamline my blah? Sweet. What does your thing do?\nAnd include screenshots, for god sake.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/dimonomid/nerdlog\"\u003enerdlog\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNerdlog: fast, remote-first, multi-host TUI log viewer with timeline\nhistogram and no central server\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis looks useful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI noticed some burn-in on my Apple Studio Display this week. Not good. I do\nnot want. I suspect this is my problem for not starting the screensaver\nenough.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHow do you decide which JavaScript date picker to use? The paralysis by\nanalysis is now affecting 3D printing activities. There is just so much\n\u003cem\u003estuff\u003c/em\u003e out there, which is wonderful, but deciding between this or that is\nvery difficult. And given what I was \u003ca href=\"/weeknotes/239-inevitable-to-some-degree/#:~:text=necessitates%20some%20waste\"\u003esaying last week about waste\u003c/a\u003e I\u0026rsquo;m doubly\nkeen to not make mistakes.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"https://mecha.so/comet\"\u003eMecha Comet\u003c/a\u003e looks like a cool little handheld computer which I would\nnever use.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/jordelver/dotfiles/commit/6aae2381440bc06bf20e87c4905fd5602cd632f4\"\u003eMake Ghostty look as much like iTerm as possible\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThanks to help from my mate Claude, I now have \u003ca href=\"https://ghostty.org/\"\u003eGhostty\u003c/a\u003e configured to match\niTerm with only a tiny difference (that I\u0026rsquo;ve noticed so far) so I\u0026rsquo;m moving\nover to give it a proper try.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/nvzone/typr\"\u003etypr\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMost Beautiful Typing practice plugin for Neovim with dashboard\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis does look very nice.\u003c/p\u003e",
      "date_published": "2026-02-01T00:00:00+00:00",
      "date_modified": "2026-02-01T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/239-inevitable-to-some-degree/",
      "url": "https://elver.me/weeknotes/239-inevitable-to-some-degree/",
      "title": "Weeknotes 239: Inevitable to some degree",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eRemember I was going to try a \u003ca href=\"/weeknotes/232-your-blog-is-dead-to-me/#:~:text=very%20lowest%20of%20lo%2Dfi%20route\"\u003etry a lo-fi approach to using a proper domain\u003c/a\u003e\non my home network? Well I have now got that working, and with a \u003ca href=\"/weeknotes/236-acme-challenge/#:~:text=I%20discovered%20the-,DNS%2D01%20challenge\"\u003elittle\nsprinkle of DNS-01 ACME challenge\u003c/a\u003e I\u0026rsquo;ve also got legit Let\u0026rsquo;s Encrypt\ncertificates for all my services, which will just work everywhere (but, at the\nmoment, you know, just on this computer).\u003c/p\u003e\n\u003cp\u003eI chose the simplest option for moving forward with this which was to get\nmyself a brand spanking new domain name. After many fraught hours trying to\nfind \u003ca href=\"/weeknotes/236-acme-challenge/#:~:text=trying%20to%20buy%20any%20sort%20of%20decent%20domain%20name%20is%20so%20depressing\"\u003esomething not shit\u003c/a\u003e I bit the bullet and registered a new domain with\nour friends Porkbun.\u003c/p\u003e\n\u003cp\u003eI wasn\u0026rsquo;t intending to set everything up straight away but I suddenly realised\nout of nowhere that Porkbun actually provided a lot of the things I wanted in\norder reduce the impact of any potential API secret leaks, my main concern\nwith the whole endeavor.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNow, the risk of token leak is small, but if it did happen, the consequences\nare potentially massive. If some nefarious actor got access to my DNS\nrecords very bad things could happen. [\u0026hellip;] they could do something like\nchange my MX records and take over my email. Once someone has your email\nit\u0026rsquo;s game over, man. Keys to the kingdom.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIsolating any impact was my goal. We practice good security over here in these\nhere parts. As long as it fits into budget and is convenient.\u003c/p\u003e\n\u003cp\u003eI was looking for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDNS-01 ACME challenge support \u0026ndash; So that we can use Let\u0026rsquo;s Encrypt for TLS\ncertificates.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eScoped access tokens \u0026ndash; Tokens that only allow access to certain domains\nand/or certain types of records (\u003ccode\u003eTXT\u003c/code\u003e only).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTo not to pay any money, if possible.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFirstly\u003c/strong\u003e, Porkbun \u003cem\u003edoes\u003c/em\u003e have a compatible API we can use for DNS-01\nchallenges (and \u003ca href=\"https://github.com/caddy-dns/porkbun\"\u003esupport for Caddy available\u003c/a\u003e) ✅\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSecondly\u003c/strong\u003e, Porkbun doesn\u0026rsquo;t actually provide scoped access tokens. But, but,\nbut, they do require you to turn on the API for each domain which you intend\nto use the API with ✅\u003c/p\u003e\n\u003cp\u003eIf we turn on API access for just that single \u0026ldquo;homelab\u0026rdquo; domain we get the\nrequired isolation, and even if the Porkbun authorisation code were to fail\nsomehow, I\u0026rsquo;m only hosting the single DNS zone with them \u0026ndash; my other domains\nhave their nameservers pointed at DNSimple, whom I use to handle other DNS\nneeds.\u003c/p\u003e\n\u003cp\u003eYou\u0026rsquo;ve gotta think about your failure modes.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eThirdly\u003c/strong\u003e, this is all included by default with Porkbun as your domain\nregistrar, so no extra money changes hands ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://meta.stackexchange.com/questions/224873/all-stack-exchange-data-dump-releases\"\u003eStack Exchange data dump releases\u003c/a\u003e \u0026ndash; You know you can download all of Stack\nExchange? If you were considering it you might want to do it now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://nesbitt.io/2026/01/24/rewriting-git-pkgs-in-go.html\"\u003eRewriting git-pkgs in Go\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe Ruby version worked fine, but installing a Ruby gem as a git subcommand\nhas friction: you need Ruby installed, the right version, maybe a version\nmanager, and gem install puts binaries somewhere that might not be in your\nPATH. Go compiles to a single binary with no runtime dependencies. It\u0026rsquo;s pure\nGo, so there are no C extensions or platform-specific compilation issues to\ndeal with. You download it and it works.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is why, as a Ruby developer, I would be reluctant to write cli programs\nthat need to \u003cem\u003edistributed\u003c/em\u003e in Ruby. Too much friction. I\u0026rsquo;m also reluctant to\ninstall those that others have written.\u003c/p\u003e\n\u003cp\u003eAnd when I \u003ckbd\u003eCTRL\u003c/kbd\u003e-\u003ckbd\u003ec\u003c/kbd\u003e a Ruby cli program and see a Ruby\nstacktrace, no thanks.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://relinq.app/?ueid=b4f3a6152578f90ffbdaa44714d0648d\"\u003eRelinq\u003c/a\u003e \u0026ndash; \u0026ldquo;A tiny Mac app that converts song links between Spotify, Apple\nMusic, YouTube Music, and more.\u0026rdquo;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was speaking to a friend who recently got a 3D printer and he was saying\nthat he didn\u0026rsquo;t want to just print things for the sake of it due to the\n\u0026ldquo;landfill\u0026rdquo; involved. I\u0026rsquo;ve had others say similar things to me, and I\ncompletely agree with that sentiment.\u003c/p\u003e\n\u003cp\u003eThe problem is that the hobby in general \u003cem\u003enecessitates some\u003c/em\u003e waste. When you\ncreate a model, and print it, you are never going to end up with a perfect\nresult the first time. It \u003cem\u003ewill\u003c/em\u003e need tweaking, revising, and printing again,\nprobably multiple times. I do my best to plan ahead to minimise waste (and\nmoney!) and I\u0026rsquo;m often reluctant to print due to concerns over producing waste,\nbut it is inevitable to some degree.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/caronc/apprise\"\u003e\u0026ldquo;Apprise - Push Notifications that work with just about every platform!\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis is a very cool idea to stop reimplementing notifications for every app.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI discovered from \u003ca href=\"https://jacobstuart.com/posts/2024/caddy-wildcard-tls/\"\u003e\u0026ldquo;Caddy Could Be Leaking Your Secret Domains\u0026rdquo;\u003c/a\u003e that TLS\ncertificates issued by certain Certificate Authorities (including Let\u0026rsquo;s\nEncrypt) are \u003ca href=\"https://crt.sh/?q=elver.me\"\u003ea matter of public record\u003c/a\u003e due to \u003ca href=\"https://certificate.transparency.dev/\"\u003eCertificate Transparency\u003c/a\u003e.\nThis means that if you\u0026rsquo;re using Let\u0026rsquo;s Encrypt for your homelab, you could be\nleaking your subdomain names into the public. This isn\u0026rsquo;t a massive deal, but\nit\u0026rsquo;s worth knowing it\u0026rsquo;s happening.\u003c/p\u003e\n\u003cp\u003eThe solution is to use a wildcard certificate.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://plezy.app/\"\u003ePlezy\u003c/a\u003e \u0026ndash; \u0026ldquo;A beautiful Plex client\u0026rdquo; \u0026ndash; Giving this a go.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePSA: Spotify has a Basic plan without all the audiobooks that you probably\ndidn\u0026rsquo;t want anyway. I was able to downgrade my plan, keep everything music\nrelated, and save a couple of quid.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/238-filament-backup/#:~:text=Upgraded%20to%20iOS%2026%20this%20week\"\u003eupgrade to iOS 26\u003c/a\u003e doesn\u0026rsquo;t seem to have been good for my battery. I\u0026rsquo;m\nhaving to charge half way through the day at the moment. I hope it gets\nbetter.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI plucked up the courage to take my A1 apart and replace the AC Board. The\n\u003ca href=\"https://wiki.bambulab.com/en/a1/maintenance/ac-board-replacement\"\u003einstructions provided by Bambu on their wiki\u003c/a\u003e were good. The most difficult\npart was disconnecting the existing wires to the board, but I eventually got\nthem. Seems fine so far. I guess it works or doesn\u0026rsquo;t work.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://daringfireball.net/linked/2026/01/19/creator-studio-icon-history\"\u003eBASIC APPLE GUY: CREATOR STUDIO ICON HISTORY\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIs there anyone who doesn\u0026rsquo;t find this sad?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis \u003cem\u003eis\u003c/em\u003e pretty sad.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://cooklang.org/\"\u003eCooklang\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCooklang is a simple, human-readable text format for writing recipes that\ncan be understood by both cooks and computers.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI finally managed to sack off my Twitter account. What a faff it was. They\nreally don\u0026rsquo;t want you to do it.\u003c/p\u003e\n\u003cp\u003eI created a new account, then changed my username on the original account,\ndeactivated that account, then changed the username on the new account. A\nprocess which spanned several days during which I could\u0026rsquo;ve lost control of the\naccount.\u003c/p\u003e\n\u003cp\u003eI didn\u0026rsquo;t want to just deactivate the original account because I wasn\u0026rsquo;t 100%\nsure I hadn\u0026rsquo;t used this identity to sign up to some service from when Twitter\nwas a trusted identity provider, and didn\u0026rsquo;t want someone squatting it.\u003c/p\u003e\n\u003cp\u003eThe only fallout I\u0026rsquo;ve seen so far is some complaining from Keybase, which I\ndon\u0026rsquo;t use anyway.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/blopker/codebook\"\u003eCODEBOOK - An unholy spell checker for code\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://inessential.com/2026/01/21/email-from-minnesota-family.html\"\u003eEmail from Family in Minnesota\u003c/a\u003e \u0026ndash; You know, I\u0026rsquo;d say his second term is\n\u003cem\u003emuch\u003c/em\u003e worse than the first.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://yorkruby.org/\"\u003eYork Ruby\u003c/a\u003e had a nice little resurgence this week, first after the Christmas\nlull, with a brand new person attending their first, and another returning for\ntheir second, meetup. Lots of good chats about how using \u003ccode\u003e\u0026lt;font\u0026gt;\u003c/code\u003e tags was\ncool back in the day.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://torrentfreak.com/nvidia-contacted-annas-archive-to-secure-access-to-millions-of-pirated-books/\"\u003e\u0026ldquo;NVIDIA Contacted Anna\u0026rsquo;s Archive to Secure Access to Millions of Pirated\nBooks\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eWell, well, well, well.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSmall quality of life improvement this week: when I buy a coffee at my local\ncoffee shop they insist on sending me an email receipt (I use their loyalty\napp). Because I am attention deficient this is annoying, unnecessary, and\ndistracting for me.\u003c/p\u003e\n\u003cp\u003eI setup an email rule that filters those messages and just marks them as\n\u0026ldquo;read\u0026rdquo;. It\u0026rsquo;s a small thing, but removes friction. I\u0026rsquo;ve started adding similar\nrules for other regular emails I receive too such as \u0026ldquo;invoice\u0026rdquo; emails which I\nneed to deal with later.\u003c/p\u003e\n\u003cp\u003eLet the computer work for you.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about \u003ca href=\"https://en.wikipedia.org/wiki/The_Pile_(dataset)\"\u003e\u0026ldquo;The Pile\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe Pile is an 886 GB diverse, open-source dataset of English text created\nas a training dataset for large language models (LLMs).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://cagemaker.org/\"\u003eCageMaker PRCG - Parametric Rack Cage Generator\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis is very cool. Need to mount something in your rack? How about printing a\nwhole new rack?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eRemember I was going to try a \u003ca href=\"/weeknotes/232-your-blog-is-dead-to-me/#:~:text=very%20lowest%20of%20lo%2Dfi%20route\"\u003etry a lo-fi approach to using a proper domain\u003c/a\u003e\non my home network? Well I have now got that working, and with a \u003ca href=\"/weeknotes/236-acme-challenge/#:~:text=I%20discovered%20the-,DNS%2D01%20challenge\"\u003elittle\nsprinkle of DNS-01 ACME challenge\u003c/a\u003e I\u0026rsquo;ve also got legit Let\u0026rsquo;s Encrypt\ncertificates for all my services, which will just work everywhere (but, at the\nmoment, you know, just on this computer).\u003c/p\u003e\n\u003cp\u003eI chose the simplest option for moving forward with this which was to get\nmyself a brand spanking new domain name. After many fraught hours trying to\nfind \u003ca href=\"/weeknotes/236-acme-challenge/#:~:text=trying%20to%20buy%20any%20sort%20of%20decent%20domain%20name%20is%20so%20depressing\"\u003esomething not shit\u003c/a\u003e I bit the bullet and registered a new domain with\nour friends Porkbun.\u003c/p\u003e",
      "date_published": "2026-01-25T00:00:00+00:00",
      "date_modified": "2026-01-25T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/238-filament-backup/",
      "url": "https://elver.me/weeknotes/238-filament-backup/",
      "title": "Weeknotes 238: Filament backup",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAlthough I now have a slight reluctance to print \u003ca href=\"/weeknotes/237-aka-paving-slab/#:~:text=s%20doing%20a-,tiny%20bit%20of%20melting,-%F0%9F%94%A5%20This%20is%20apparently\"\u003efor fear of something going\nwrong\u003c/a\u003e I decided to go ahead and print a \u003ca href=\"https://makerworld.com/en/models/92486-ams-lite-top-mount-for-a1#profileId-100105\"\u003eAMS Lite top mount\u003c/a\u003e. This is so that\nyou can mount the AMS above the printer, to save space. This is a long print\nwith multiple plates, so I got to test out the \u003ca href=\"https://wiki.bambulab.com/en/ams-lite/manual/intro-ams-lite#filament-run-out-detection-and-filament-backup-function\"\u003eautomatic filament switching\u003c/a\u003e\ncapabilities of the AMS Lite and A1 for the first time as the spool I was\nusing did not have enough filament on it to complete the job. How this is\nsupposed to work is that if you have another spool of the exact same material\nand colour on the AMS Lite it will automatically switch once the current one\nis used up.\u003c/p\u003e\n\u003cp\u003eThis required enabling \u0026ldquo;AMS filament backup\u0026rdquo; in the AMS settings.\u003c/p\u003e\n\u003cp\u003eI watched eagerly as the current spool ran dry and then\u0026hellip;after a brief pause\nto purge the existing filament, it automatically started using the full spool.\nMagic 🪄 So that seems to work nicely.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of devices which might spontaneously combust, Bambu, with me only\nhaving to mention UK consumer law a couple of times, agreed to send me a new\nversion of the AC board for the A1.\u003c/p\u003e\n\u003cp\u003eCredit to them, it has already arrived.\u003c/p\u003e\n\u003cp\u003eGiven I bought this printer two months ago I don\u0026rsquo;t think it\u0026rsquo;s unreasonable to\nexpect them to replace the AC Board as a precautionary measure. I \u003cem\u003ecould\u003c/em\u003e\ndemand a replacement or refund.\u003c/p\u003e\n\u003cp\u003eCoincidently, I\u0026rsquo;ve noticed on Reddit just how many people are willing to\naccept that their printer might melt. I suspect, given the demographics of\nReddit, that most of them are likely American and used to non-existent\nconsumer protection laws.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFramed another picture this week. This time a small print of the \u003ca href=\"https://en.wikipedia.org/wiki/Tindersticks_(1993_album)\"\u003efirst\nTindersticks album\u003c/a\u003e cover.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe locked ourselves out of the house for SECOND TIME at the end of last week.\nGrown adults. Twice. 🤬 💸\u003c/p\u003e\n\u003cp\u003eThis stems from living in a flat for 10+ years where you had to leave \u003cem\u003ewith\nthe keys\u003c/em\u003e in order to lock it. The new house just lets you pull the door shut\nas you leave. God-damned convenient door.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFor all the wonder of LLMs you\u0026rsquo;d think Claude would be able to work without\nlosing the text I just typed into the chat box. You\u0026rsquo;d be wrong. It\u0026rsquo;s\ncompletely reproducible too: you don\u0026rsquo;t have Internet but Claude is running,\nyou type into the chat box, it reconnects to the Internet and loses what you\ntyped. Cool.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI moved my Plex library around this week and it went buttery smooth\nthankfully. I\u0026rsquo;ve been putting it off, but I made a plan, ran it past Claude\nfor a critique, and followed it. Nothing abnormal going on so far. I plan on\nwriting a proper blog post about this, but I have said that before.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I learnt that Framework, the upgradeable laptop people, make a\n\u003ca href=\"https://frame.work/gb/en/products/desktop-diy-amd-aimax300/configuration/new\"\u003eDesktop PC\u003c/a\u003e. I was surprised. Building PC\u0026rsquo;s from upgradable parts has been a\nthing for a long time already.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.chrisgregori.dev/opinion/code-is-cheap-now-software-isnt\"\u003eCode Is Cheap Now. Software Isn\u0026rsquo;t.\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWith twenty dollars, a few hours of spare time, and a bit of patience,\nalmost anyone can ship a functional application.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u0026ldquo;almost anyone\u0026rdquo; — this post makes a lot of interesting points, but I think\nthey\u0026rsquo;re really overestimating the average person. That is not meant to be\ndisparaging, I just don\u0026rsquo;t think most people have an interest in making their\nown software?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ma.ttias.be/web-development-is-fun-again/\"\u003eWeb development is fun again\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThat leaves room to experiment with UI and UX, to try ideas and throw them\naway. To add small quality-of-life improvements I couldn\u0026rsquo;t justify before,\nbecause there was always something more urgent.\u0026quot;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI got around to using \u003ca href=\"https://koreader.rocks/\"\u003eKOReader\u003c/a\u003e on my jailbroken Kindle this week and oh my,\nit\u0026rsquo;s been quite a journey. The software is clearly highly capable, but the\nmenus and settings are indecipherable to the degree that I had to Google basic\nthings. Still, I got there in the end. Maybe I\u0026rsquo;ll read a book.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.zsa.io/mouse-jiggler-and-double-click/\"\u003eIntroducing Mouse Jiggler and Double Click\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eBuilt-in mouse jiggling is a novel, and potentially useful, feature.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://helmarr.com/\"\u003eHelmarr\u003c/a\u003e is a lovely looking app which I installed this week to provide\nbetter iOS-based management of my \u0026ldquo;homelab\u0026rdquo; (I have given up and started\ncalling the computer in the spare room that). It is very nice indeed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpgraded to iOS 26 this week (mostly so that I could install Helmarr, and I\nknew I couldn\u0026rsquo;t avoid upgrading forever) and I can\u0026rsquo;t say I like it, but it\ndoes feel like \u003ca href=\"/weeknotes/237-aka-paving-slab/#:~:text=getting%20a%20new%20computer\"\u003esetting a new wallpaper\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI finished printing a \u003ca href=\"https://makerworld.com/en/models/2190465-cathedral-complete-board-game-no-ams\"\u003eCathedral board game\u003c/a\u003e that looked cool this week.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/cathedral.jpeg\" alt=\"3D printed \u0026ldquo;Cathedral\u0026rdquo; board game\"\u003e\u003c/p\u003e\n\u003cp\u003eAn opportunity to print something with more detail, and to try out some\ndifferent filaments. It was a bit tricky removing the supports, and some parts\nwe very fragile and broke off. Some fell off. But overall not bad.\u003c/p\u003e\n\u003cp\u003eWe haven\u0026rsquo;t played it yet!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.monarchlauncher.com/\"\u003eMonarch\u003c/a\u003e \u0026ndash; A potential \u003ca href=\"https://www.raycast.com/\"\u003eRaycast\u003c/a\u003e competitor I\u0026rsquo;ll keep an eye on.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve learnt a surprising amount of things about Linux permissions this week.\nIt\u0026rsquo;s actually slightly embarrassing that it\u0026rsquo;s taken me this long, but it\u0026rsquo;s the\nkind of thing that once you know the basics you can just get by (\u003ccode\u003echmod 777\u003c/code\u003e\nanyone?). And I have been doing for many years.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve utilised the both the \u003ccode\u003esetgid\u003c/code\u003e and \u0026ldquo;sticky\u0026rdquo; bits.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003esetgid\u003c/code\u003e bit.\u003c/p\u003e\n\u003cp\u003eWhen a user creates new files in a directory, they are owned by the user and\ntheir primary group. I was not aware that a primary group was a thing, but if\nyou run \u003ccode\u003eid \u0026lt;your-username\u0026gt;\u003c/code\u003e you will see that it outputs something like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003euid=501(jord) gid=20(staff) groups=20(staff),12(everyone)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003ccode\u003egid\u003c/code\u003e is the primary group, and \u003ccode\u003egroups\u003c/code\u003e is \u003cem\u003eall\u003c/em\u003e the groups the user is a\nmember of including the primary group.\u003c/p\u003e\n\u003cp\u003eIf you have different processes interacting with the same files this can cause\npermission difficulties where one process creates the file and another can\u0026rsquo;t\nread it etc.\u003c/p\u003e\n\u003cp\u003eThe solution is to set the \u003ccode\u003esetgid\u003c/code\u003e on the parent directory which means newly\ncreated files \u003ca href=\"https://en.wikipedia.org/wiki/Setuid#When_set_on_a_directory\"\u003ewill inherit the group\u003c/a\u003e already set on the directory. As long as\nthe users are a part of this group, and the permissions allow, everything will\nwork.\u003c/p\u003e\n\u003cp\u003eThe \u0026ldquo;sticky\u0026rdquo; bit.\u003c/p\u003e\n\u003cp\u003eSetting the \u0026ldquo;sticky\u0026rdquo; bit on a directory means that a user can \u003ca href=\"https://en.wikipedia.org/wiki/Setuid#Sticky_bit\"\u003eonly delete\nfiles in a directory which they own\u003c/a\u003e. I was moving some files around, and\ngiving access to those files to a new service user. I added the sticky bit so\nthat the new user can create files in the directory, but not delete \u003cem\u003eexisting\u003c/em\u003e\nfiles. As a precaution. Will it work? I\u0026rsquo;ll let you know.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://helium.computer/\"\u003eHelium\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBest privacy and unbiased ad-blocking by default. Handy features like native\n!bangs and split view. No adware, no bloat, no noise. Made for people, by\npeople. Fully open source.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI gave this a very quick go and it didn\u0026rsquo;t strike me. Good to have competitors\nin the browser market though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=MiUHjLxm3V0\"\u003eThe World\u0026rsquo;s Most Important Machine\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI heard about about \u003ca href=\"https://en.wikipedia.org/wiki/Extreme_ultraviolet_lithography\"\u003eEUV Lithography\u003c/a\u003e on a podcast a whole ago and then \u003ca href=\"https://atp.fm/#:~:text=ASML%20%26%20TSMC,-Extreme%20ultraviolet%20lithography\"\u003eATP\u003c/a\u003e\nmentioned this video recently. It sounded fascinating. And, it \u003cem\u003eis\u003c/em\u003e. It\u0026rsquo;s\nactually incredible that any of this works.\u2028This is an hour long, which in\n2026 is a long time, but absolutely worth your while. I wish I understood more\nof it!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/danburzo/yamatter\"\u003eYamatter\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eInspect and transform YAML frontmatter data from the command line.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI can see this being useful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about \u003ca href=\"https://en.wikipedia.org/wiki/Mutual_authentication#mTLS\"\u003emTLS\u003c/a\u003e from \u003ca href=\"https://jacobstuart.com/posts/2024/caddy-mutual-tls/\"\u003eSecurely Exposing Docker Services With Mutual TLS and\nCaddy\u003c/a\u003e. I think I\u0026rsquo;ve seen this acronym flying around before but never knew\nwhat it was. It seems like this is mostly used in Enterprise environments\nwhich would normally make me allergic to it, but it seems pretty handy for a,\nhere it comes again, homelab environment too. Basically TLS where both sides\nof the connection, client and server, are verified to have the private key. If\nthey don\u0026rsquo;t match no connection at all it made.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAlthough I now have a slight reluctance to print \u003ca href=\"/weeknotes/237-aka-paving-slab/#:~:text=s%20doing%20a-,tiny%20bit%20of%20melting,-%F0%9F%94%A5%20This%20is%20apparently\"\u003efor fear of something going\nwrong\u003c/a\u003e I decided to go ahead and print a \u003ca href=\"https://makerworld.com/en/models/92486-ams-lite-top-mount-for-a1#profileId-100105\"\u003eAMS Lite top mount\u003c/a\u003e. This is so that\nyou can mount the AMS above the printer, to save space. This is a long print\nwith multiple plates, so I got to test out the \u003ca href=\"https://wiki.bambulab.com/en/ams-lite/manual/intro-ams-lite#filament-run-out-detection-and-filament-backup-function\"\u003eautomatic filament switching\u003c/a\u003e\ncapabilities of the AMS Lite and A1 for the first time as the spool I was\nusing did not have enough filament on it to complete the job. How this is\nsupposed to work is that if you have another spool of the exact same material\nand colour on the AMS Lite it will automatically switch once the current one\nis used up.\u003c/p\u003e",
      "date_published": "2026-01-18T00:00:00+00:00",
      "date_modified": "2026-01-18T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/237-aka-paving-slab/",
      "url": "https://elver.me/weeknotes/237-aka-paving-slab/",
      "title": "Weeknotes 237: aka paving slab",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMonday came, back to work for many. I too, was glad to be back into my normal\nroutine, for as long as that can last.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://basicappleguy.com/basicappleblog/hive\"\u003eHive by Basic Apple Guy\u003c/a\u003e \u0026ndash; new year, new wallpaper. Not only does it make\nyour computer look nice but it also saves money as setting a new wallpaper\nfeels like getting a new computer.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.tortoisemedia.com/listen/elons-spies\"\u003eElon\u0026rsquo;s Spies by Tortoise Investigates\u003c/a\u003e \u0026ndash; You know, I think this Elon guy\nmight not be a good person. If the Nazi salute wasn\u0026rsquo;t enough for you, maybe\nthis will be.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThere have been \u003ca href=\"https://www.reddit.com/r/BambulabsA1fires/comments/1q8e8f4/list_of_a1_ntc_failures_posted_to_rbambulab/\"\u003emany reports on Reddit\u003c/a\u003e of \u003ca href=\"https://bambulab.com/en/a1\"\u003eBambu A1\u003c/a\u003es doing a \u003cem\u003etiny\u003c/em\u003e bit\nof melting 🔥 This is apparently caused by a faulty \u003ca href=\"https://en.wikipedia.org/wiki/Thermistor#NTC\"\u003eNTC thermister\u003c/a\u003e component\nwhich likes to get very hot and has, on occasion, melted through the plastic\ncasing of the printer. Bambu keep saying that this is \u0026ldquo;by design\u0026rdquo;, which I\nfind hard to believe. (I mean, I can believe that it is a safety feature in\nterms of it burning out and stopping further serious fire, but having a\ncomponent regularly melting the case cannot be the preferred outcome.)\u003c/p\u003e\n\u003cp\u003eIt is not clear which models are affected, and Bambu are staying tight-lipped.\u003c/p\u003e\n\u003cp\u003eIn order to mitigate any potential fire I decided to install a fire prevention\ndevice, aka \u003ca href=\"https://www.diy.com/departments/bradstone-arnhem-anthracite-reconstituted-stone-paving-slab-0-2m-l-450mm-w-450mm/802562_BQ.prd\"\u003epaving slab\u003c/a\u003e. It is a low cost way to stop any potential fire,\nand I had already thought about getting one to help with stabilising the\nprinter anyway.\u003c/p\u003e\n\u003cp\u003eHopefully Bambu get their act together and do the right thing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://isbndb.com/\"\u003eISBNDB\u003c/a\u003e \u0026ndash; do you \u003ca href=\"/weeknotes/222-humble-tumble/#:~:text=Book%20Data\"\u003eneed book data\u003c/a\u003e? This seems cheap to me to save all the\ntrouble of curating your own? 🤔\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.glyph.im/2026/01/the-next-thing-will-not-be-big.html\"\u003eNext Thing Will Not Be Big\u003c/a\u003e \u0026ndash; this is worth your time.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThere’s no need for another streaming service if 100% of your leisure time\nis already committed to TikTok, YouTube and Netflix; famously, Netflix has\nalready considered sleep its primary competitor for close to a decade -\nyears before the pandemic.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/schlae/VapeRE/\"\u003eReverse Engineered Vape Circuit Boards\u003c/a\u003e \u0026ndash; nice use of e-waste.\u003c/p\u003e\n\u003cp\u003eVia \u003ca href=\"https://po-ru.com/2026/01/06/week-261-a-good-rest#:~:text=Reverse%20engineered%20disposable%20vape%20boards.%20They%E2%80%99re%20quite%20capable.\"\u003ePaul Battley\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://techcrunch.com/2026/01/05/hacktivist-deletes-white-supremacist-websites-live-on-stage-during-hacker-conference/\"\u003eHacktivist deletes white supremacist websites live onstage during hacker\nconference\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026lsquo;Imagine calling yourselves the \u0026lsquo;master race\u0026rsquo; but forgetting to secure your\nown website — maybe try mastering to host WordPress before world\ndomination,\u0026rsquo; Root wrote.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNice one, Martha 🤣\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you\u0026rsquo;re going to put BBC licence payer funded content exclusively behind BBC\nSounds the least you can do is make the BBC Sounds iOS app decent. The\nUI\u0026hellip;needs work \u003ca href=\"/weeknotes/37-sticker-me/#:~:text=poorly%20implemented%20podcast%20app\"\u003e(still)\u003c/a\u003e. It\u0026rsquo;s hard to know what is available to listen to\nand what I\u0026rsquo;ve previously listened to. Basics, basics, basics.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.eff.org/deeplinks/2018/02/technical-deep-dive-securing-automation-acme-dns-challenge-validation\"\u003eA Technical Deep Dive: Securing the Automation of ACME DNS Challenge\nValidation\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen DNS is compromised, a malicious attacker can easily intercept all the\nconnections directed toward your email or other protected service, terminate\nthe TLS encryption (since they can now prove ownership over the domain and\nget their own valid certificates for it), read the plaintext data, and then\nre-encrypt the data and pass the connection along to your server. For most\npeople, this would be very hard to detect.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAn in-depth article about \u003ca href=\"/weeknotes/236-acme-challenge/#:~:text=ACME%20challenge\"\u003eACME DNS challenges I was talking about last week\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA local news website stopped publishing it\u0026rsquo;s feed from some reason this week\nso I restored it, to a certain extent, via \u003ca href=\"https://fetchrss.com/\"\u003eFetchRSS\u003c/a\u003e. Not sure how it will\nwork out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s been bloody cold (\u0026ldquo;feels like\u0026rdquo; -9 as I write this) so I treated myself to\nsome new \u003ca href=\"https://www.marksandspencer.com/knitted-gloves/p/clp60705830?color=CHARCOAL#intid=pid_pg1pip4g4r1c4\"\u003egloves with \u0026ldquo;innovative touchscreen pads\u0026rdquo;\u003c/a\u003e, which means I can stay\nglued to my screen even in the cold. How I like it.\u003c/p\u003e\n\u003cp\u003eAnd to top it off, I got a pair of \u003ca href=\"https://www.amazon.co.uk/dp/B0CC189314\"\u003eUSB-C rechargeable hand warmers\u003c/a\u003e which are\nsurprisingly good at taking the edge off chilly hands despite using them\nfeeling like carrying a potential fire in your hands at all times.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://autoncorp.com/biodome/\"\u003eClaude is growing tomatoes\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eVia \u003ca href=\"https://dri.es/claude-is-growing-a-tomato-plant\"\u003eDries Buytaert\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I was trying to organise my \u0026ldquo;projects\u0026rdquo; and my \u0026ldquo;learning\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eProcrastinating by creating big lists of things is a good start. I use\n\u003ca href=\"https://culturedcode.com/things/\"\u003eThings\u003c/a\u003e to organise my life. There are several YouTube playlists that I\nwanted to watch, but in a Things Project I wanted a heading for each playlist\nand then a TODO item for each video \u0026ndash; this is laborious to do manually; a\nlot of cutting and pasting. We can thankfully do better.\u003c/p\u003e\n\u003cp\u003eGet a list of all video titles in a playlist, in order:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eyt-dlp --flat-playlist --print title \u0026lt;playlist-url\u0026gt; | pbcopy\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eGo into Things, create heading in a project, paste. You should get an item for\neach.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/tailwindlabs/tailwindcss.com/pull/2388#issuecomment-3717222957\"\u003e\u0026quot;\u0026hellip;the reality is that 75% of the people on our engineering team lost their\njobs here yesterday because of the brutal impact AI has had on our business\u0026quot;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI was always surprised, and impressed, at creating a business from a CSS\nframework. Genuinely. This is a shame regardless of what you might think of\nTailwind.\u003c/p\u003e\n\u003cp\u003eVia \u003ca href=\"https://rknight.me/notes/202601080857/\"\u003eRobb Knight\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://tonsky.me/blog/tahoe-icons/\"\u003eIt\u0026rsquo;s hard to justify Tahoe icons\u003c/a\u003e \u0026ndash; Alan strikes again.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOn the upside: it\u0026rsquo;s not that hard anymore to design better than Apple! Let\u0026rsquo;s\ndrink to that. Happy New year!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eScathing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.crowdsupply.com/open-tools/open-printer\"\u003eOpen Printer\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFinally, an open hardware printer you can actually understand, repair, and upgrade\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRuby 4 has a lot of cool new stuff. My favourite is probably the \u003ca href=\"https://rubyreferences.github.io/rubychanges/4.0.html#new-default-gems\"\u003enewest\ndefault gem: \u003ccode\u003ewin32-registry\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMonday came, back to work for many. I too, was glad to be back into my normal\nroutine, for as long as that can last.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://basicappleguy.com/basicappleblog/hive\"\u003eHive by Basic Apple Guy\u003c/a\u003e \u0026ndash; new year, new wallpaper. Not only does it make\nyour computer look nice but it also saves money as setting a new wallpaper\nfeels like getting a new computer.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.tortoisemedia.com/listen/elons-spies\"\u003eElon\u0026rsquo;s Spies by Tortoise Investigates\u003c/a\u003e \u0026ndash; You know, I think this Elon guy\nmight not be a good person. If the Nazi salute wasn\u0026rsquo;t enough for you, maybe\nthis will be.\u003c/p\u003e",
      "date_published": "2026-01-11T00:00:00+00:00",
      "date_modified": "2026-01-11T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/236-acme-challenge/",
      "url": "https://elver.me/weeknotes/236-acme-challenge/",
      "title": "Weeknotes 236: ACME challenge",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA thousand apologies to those whose Monday back at work was unbearable without\nthese weeknotes. I am but human.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/235-magnets/#:~:text=to%20compare.%20A-,converter,-is%20winging%20it%E2%80%99s\"\u003econverter for my Kaweco Brass Sport\u003c/a\u003e arrived as did a \u003ca href=\"https://www.theonlinepencompany.com/kaweco-060-nib-gold-plated\"\u003ebroader nib\u003c/a\u003e and\nI\u0026rsquo;m now much happier writing with this pen.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.ispreview.co.uk/index.php/2026/01/starlink-to-shift-leo-ultrafast-broadband-satellites-into-a-lower-orbit.html\"\u003eStarlink to Shift LEO Ultrafast Broadband Satellites into a Lower Orbit\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBy the end of July 2025 Starlink\u0026rsquo;s global network had 6 million customers\nand 110,000 of those were in the UK (up from 87,000 in 2024) – mostly in\nrural areas.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI was surprised at how many customers Starlink has in the UK.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://carto-art.vercel.app/\"\u003eCartoArt\u003c/a\u003e \u0026ndash; this is cool to create high-quality map posters.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://yearcompass.com/\"\u003eYear Compass\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNew year\u0026rsquo;s resolutions don\u0026rsquo;t work. YearCompass does - for more than a\nmillion people around the world since 2012.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI downloaded this and then failed to complete it. Happy New Year.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter feeling like I was getting somewhere with my Home Automation setup I\nregret to inform you that things broke in bigly ways.\u003c/p\u003e\n\u003cp\u003eIn an attempt to fix all the things I went on upgrade spree.\u003c/p\u003e\n\u003cp\u003eFirst, I bumped up \u003ca href=\"https://www.zigbee2mqtt.io/\"\u003eZigbee2MQTT\u003c/a\u003e to the latest version, and then turned my\nattention to the firmware(s) running on the \u003ca href=\"https://smlight.tech/global/slzb06m\"\u003eSLZB-06M\u003c/a\u003e. The SLZB-06M has two\ndifferent firmwares which I found a bit confusing initially. It has Core/OS\nand Over-the-air (OTA). Core/OS, as you might have guessed, handles the actual\nOS running on the device and affects the web UI etc. The other is for the\nZigbee networking stuff.\u003c/p\u003e\n\u003cp\u003eUpdating the Zigbee firmware through the web UI worked first time. The Core/OS\nfirmware however kept failing with checksum errors. In the end I downloaded\n\u003ca href=\"https://smlight.tech/flasher/#SLZB-06%E2%80%A8https://updates.smlight.tech/firmware/slzb06x/core/slzb-os-v3.1.3-ota.bin\"\u003ev3.1.3\u003c/a\u003e and flashed it manually.\u003c/p\u003e\n\u003cp\u003eThings did not get better. I\u0026rsquo;m not sure what\u0026rsquo;s going on.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://shkspr.mobi/blog/2026/01/where-is-bitcoin/\"\u003eWhere is Bitcoin?\u003c/a\u003e \u0026ndash; where indeed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://nationalparktypeface.com/\"\u003eNational Park Typeface\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCapturing the charm of the router-carved type ubiquitous in America\u0026rsquo;s\nnational parks, without sacrificing legibility or versatility.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVia \u003ca href=\"https://rknight.me/blog/weeknote-1981/#:~:text=Turns%20out%20there%27s%20another%20similar%20one\"\u003eRobb Knight\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/232-your-blog-is-dead-to-me/#:~:text=which%20I%E2%80%99ve%20yet%20to%20setup\"\u003eI am no closer\u003c/a\u003e to having a proper \u003ca href=\"https://en.wikipedia.org/wiki/Fully_qualified_domain_name\"\u003eFQDN\u003c/a\u003es for my local services, but I have\nbeen thinking about how I can secure them using SSL/TLS.\u003c/p\u003e\n\u003cp\u003eI could create my own self-signed certificates and distribute them to the few\ndevices that I would be using to access the services but that does seem like a\nhassle. I mean, this whole thing is a hassle, but a different kind of hassle.\u003c/p\u003e\n\u003cp\u003eInstead of self-signed I have been trying to absorb how \u003ca href=\"https://en.wikipedia.org/wiki/Certificate_authority\"\u003eCertificate\nAuthorities\u003c/a\u003e like \u003ca href=\"https://en.wikipedia.org/wiki/Let%27s_Encrypt\"\u003eLet\u0026rsquo;s Encrypt\u003c/a\u003e work. I remember when Let\u0026rsquo;s Encrypt was\nlaunched and how much of a big deal it apparently was, but similar to how I\nonly start liking a band 20 years after they were cool only now am I cottoning\non. I\u0026rsquo;ve been using Let\u0026rsquo;s Encrypt indirectly for some time. This website uses\nLet\u0026rsquo;s Encrypt certificates but Netlify take care of everything and I have/had\nno idea how it worked.\u003c/p\u003e\n\u003cp\u003eLet\u0026rsquo;s Encrypt only issue certificates to domains you control, and you prove\nyou control the domain via an \u003ca href=\"https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment\"\u003eACME challenge\u003c/a\u003e. The most common challenge is\n\u003ca href=\"https://letsencrypt.org/docs/challenge-types/#http-01-challenge\"\u003eHTTP-01\u003c/a\u003e where they look for a token you host on your website. Once they find\nand validate the token they will issue you a certificate. Because my services\nare not publicly available (they are only accessible via Tailscale) I was\nunder the impression I couldn\u0026rsquo;t use something like Let\u0026rsquo;s Encrypt to issue\ncertificates because they would be unable to perform this automated check.\u003c/p\u003e\n\u003cp\u003eThen I discovered the \u003ca href=\"https://letsencrypt.org/docs/challenge-types/#dns-01-challenge\"\u003eDNS-01 challenge\u003c/a\u003e. This works in a similar way but\ninstead of checking for a file with a token, they will look for the token in\nyour DNS records for the domain. So if you have an automated way to create\n\u003ccode\u003eTXT\u003c/code\u003e DNS records you can prove you control the domain. Perfect for my\nscenario.\u003c/p\u003e\n\u003cp\u003eOne of the ways ACME challenges are automated is through your web server or\nreverse proxy software. For example, \u003ca href=\"https://caddyserver.com/\"\u003eCaddy\u003c/a\u003e will act as an \u0026ldquo;ACME client\u0026rdquo; and\nperform all these steps for you automatically. You give Caddy a file to create\n\u003ccode\u003eTXT\u003c/code\u003e DNS records on your behalf and it will do so. This is usually\nfacilitated by giving Caddy an access token to use with your DNS provider\u0026rsquo;s\nHTTP API.\u003c/p\u003e\n\u003cp\u003eI have not set \u003cem\u003eany\u003c/em\u003e of this up yet, but it does sound pretty good so far,\nright? Create an access token for your DNS provider\u0026rsquo;s API, give the token to\nCaddy, Caddy does the ACME dance, certificate is issued, profit.\u003c/p\u003e\n\u003cp\u003eHowever, most providers \u003cem\u003edo not\u003c/em\u003e provide scoped access tokens. So when you\ncreate an access token you\u0026rsquo;re often giving that token full power to \u003ca href=\"https://en.wikipedia.org/wiki/Create%2C_read%2C_update_and_delete\"\u003eCRUD\u003c/a\u003e the\nshit out of all the DNS records for ALL THE DOMAINS that you host with that\nprovider!\u003c/p\u003e\n\u003cp\u003eNow, the risk of token leak is small, but if it did happen, the consequences\nare potentially massive. If some nefarious actor got access to my DNS records\nvery bad things could happen. They could start writing more interesting\nweeknotes for one, but worse still, they could do something like change my MX\nrecords and take over my email. Once someone has your email it\u0026rsquo;s game over,\nman. Keys to the kingdom.\u003c/p\u003e\n\u003cp\u003eSo this poses a problem. If I don\u0026rsquo;t want to have an access token that gives\nfull access to my DNS records lying about on my web server, what to do? Well\nsome providers provide so called scoped access tokens of various granularity.\nIt would be better if you could say \u0026ldquo;this token can only create x record for\ny domain\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eI use DNSimple and scoped access tokens are unfortunately \u003ca href=\"https://blog.dnsimple.com/2023/11/scoped-access-tokens/\"\u003eonly available on\nthe Teams plan and above\u003c/a\u003e. I\u0026rsquo;ve only got a handful of domains, so paying $29\nUSD/month is not feasible for me. (I get it, gotta make money, but it\u0026rsquo;s\nfrustrating when trying to do Good Security ™ and the features to help you do\nso are shuttered away behind more expensive plans.)\u003c/p\u003e\n\u003cp\u003eIt seems to me there are three ways forward:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eUse a completely different domain name with a different DNS provider.\nThis completely isolates the domain, and as such access token so none of\nthe important domains are reachable.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMove \u003cem\u003eall\u003c/em\u003e my domains to a different DNS provider such as Cloudflare who\n\u003cem\u003edo\u003c/em\u003e support scoped access tokens on all plans (although I\u0026rsquo;ve been unable\nto independently verify that \u0026ndash; if you know, please tell me).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUse a completely different domain name with a different DNS provider and\nsetup a CNAME to \u003ca href=\"https://letsencrypt.org/docs/challenge-types/#dns-01-challenge:~:text=Since%20Let%E2%80%99s%20Encrypt,quicker%2Dupdating%20server.\"\u003edelegate to it for ACME challenges\u003c/a\u003e. This says \u0026ldquo;ask\nfoo.com if I own bar.com\u0026rdquo;. This has the same practical effect as the\nother options to various degrees though.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eI\u0026rsquo;m leaning towards getting a new domain. Simplest solution.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRelated: trying to buy any sort of decent domain name is so depressing.\nAnything short is just gone, even random characters at obscure TLDs.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA thousand apologies to those whose Monday back at work was unbearable without\nthese weeknotes. I am but human.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/235-magnets/#:~:text=to%20compare.%20A-,converter,-is%20winging%20it%E2%80%99s\"\u003econverter for my Kaweco Brass Sport\u003c/a\u003e arrived as did a \u003ca href=\"https://www.theonlinepencompany.com/kaweco-060-nib-gold-plated\"\u003ebroader nib\u003c/a\u003e and\nI\u0026rsquo;m now much happier writing with this pen.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.ispreview.co.uk/index.php/2026/01/starlink-to-shift-leo-ultrafast-broadband-satellites-into-a-lower-orbit.html\"\u003eStarlink to Shift LEO Ultrafast Broadband Satellites into a Lower Orbit\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBy the end of July 2025 Starlink\u0026rsquo;s global network had 6 million customers\nand 110,000 of those were in the UK (up from 87,000 in 2024) – mostly in\nrural areas.\u003c/p\u003e",
      "date_published": "2026-01-04T00:00:00+00:00",
      "date_modified": "2026-01-04T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/235-magnets/",
      "url": "https://elver.me/weeknotes/235-magnets/",
      "title": "Weeknotes 235: Magnets",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eChristmas again. It was fine. Glad it\u0026rsquo;s over. So is my credit card.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://issinrealtime.org/\"\u003eISS IN REAL TIME\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA real-time journey onboard the International Space Station\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is crazily detailed. Very cool.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCAD is not something I\u0026rsquo;ve ever done with the possible exception of 1 module at\nCollege when I was 18 or 19 (although the memory is so vague that I question\nif it actually happened or not!). However, it has become clear that I will\nneed to learn some sort of CAD software if I want to take this 3D printing\nmalarkey somewhere other than download and print. There are many, many,\noptions. I seem to have started with the most difficult option.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://openscad.org/\"\u003eOpenSCAD\u003c/a\u003e is \u0026ldquo;The Programmers Solid 3D CAD Modeller\u0026rdquo;, so in some ways it is\nmore familiar to me than the way a lot of other CAD software works. I\u0026rsquo;ve spent\nmy life working with text, not pointing and clicking in an UI. Instead of a\nGUI you use it\u0026rsquo;s programming language to describe the shapes you want. Which\nis of course very familiar to me as a programmer.\u003c/p\u003e\n\u003cp\u003eIt is very early days but I can already see it getting \u003cem\u003every\u003c/em\u003e complicated and\n\u0026ldquo;mathsy\u0026rdquo;. I did manage to alter a bracket for an Apple TV though. It turns out\nthat the bracket doesn\u0026rsquo;t work for my use-case, but still, I did a CAD.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIncidentally, the current stable release of OpenSCAD is 2021-01, released\nin\u0026hellip;2021. They have nightly builds though, so on the recommendation of a\ntutorial I downloaded that instead.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn order to get the \u003ca href=\"https://www.raycast.com/khasbilegt/1password\"\u003eRaycast 1Password extension\u003c/a\u003e working I took the plunge\nand upgraded to 1Password 8 after avoiding it for a long time. It was fine.\nAnd now the extension works.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=J0IqVC8mTwk\"\u003eYEAH BITCH! MAGNETS!\u003c/a\u003e \u0026ndash; Ahem. I\u0026rsquo;ve been buying magnets in various sizes in\norder to extend the range of a contact sensor for my gate. I think I found the\nright combination of size and number in order to make it work. Next is to\ndesign/alter a case for them to go in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI don\u0026rsquo;t wanna be right, but I was. After fixing my home automations I was\nfeeling pretty good about how reliable it all was until I got home after being\naway for the weekend, and none of them were working.\u003c/p\u003e\n\u003cp\u003eIn the end I had to restart some software piece of the puzzle and then\neverything started working again, but this has somewhat shaken my faith in the\nwhole system. I do not want to be restarting things to have my house work.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://steveklabnik.com/writing/thirteen-years-of-rust-and-the-birth-of-rue/\"\u003eThirteen years of Rust and the birth of Rue\u003c/a\u003e \u0026ndash; Steve writes I take note.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFather Christmas was particularly kind this year and got me a \u003ca href=\"https://www.kaweco-pen.com/schreibgeraete/fuellhalter/423/kaweco-brass-sport-fuellhalter\"\u003eKaweco Brass\nSport\u003c/a\u003e fountain pen. I\u0026rsquo;m still getting used to it, with it being both heavier\nand slightly shorter than the \u003ca href=\"https://www.lamy.com/en-gb/p/lamy-safari-fountain-pen/54912096502104\"\u003eLamy Safari\u003c/a\u003e. I think the nib is probably a bit\nthin for my liking too, but giving it a try for a while to compare. A\nconverter is winging it\u0026rsquo;s way to me now so I can fill it up with different\ninks.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m looking forward to the patina kicking in after my filthy mitts have been\non it a while.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI like the \u003ca href=\"https://www.ruby-lang.org/\"\u003enew Ruby Language website\u003c/a\u003e. It looks fresh and modern. And the\nupdate to \u003ca href=\"https://www.ruby-lang.org/en/news/2025/12/23/new-look-for-ruby-documentation/\"\u003ethe docs\u003c/a\u003e is also very welcome. I haven\u0026rsquo;t used them yet though, so\nit\u0026rsquo;s hard to judge how useful they are other than that they look nicer.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI bought some new drill bits and finally put up a blind in my office that I\npurchased in September 2024. Impressive even by my standards.\u003c/p\u003e\n\u003cp\u003eThe worst part? It was \u003cem\u003ereally\u003c/em\u003e straightforward and took about 15 minutes.\nMaybe it was the magical new drill bits. Maybe something else. Imagine what I\nwould be capable of if not cursed with this brain.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eChristmas again. It was fine. Glad it\u0026rsquo;s over. So is my credit card.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://issinrealtime.org/\"\u003eISS IN REAL TIME\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA real-time journey onboard the International Space Station\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is crazily detailed. Very cool.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCAD is not something I\u0026rsquo;ve ever done with the possible exception of 1 module at\nCollege when I was 18 or 19 (although the memory is so vague that I question\nif it actually happened or not!). However, it has become clear that I will\nneed to learn some sort of CAD software if I want to take this 3D printing\nmalarkey somewhere other than download and print. There are many, many,\noptions. I seem to have started with the most difficult option.\u003c/p\u003e",
      "date_published": "2025-12-28T00:00:00+00:00",
      "date_modified": "2025-12-28T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/234-background-sounds/",
      "url": "https://elver.me/weeknotes/234-background-sounds/",
      "title": "Weeknotes 234: Background sounds",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAnother brief sojourn to Sheffield this week. Good times ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen setting up Home Assistant there are two integration choices when it comes\nto Zigbee connectivity: \u003ca href=\"https://www.home-assistant.io/integrations/zha/\"\u003eZigbee Home Automation\u003c/a\u003e (ZHA), which is the\n\u0026ldquo;official\u0026rdquo; integration from the Home Assistant people, or \u003ca href=\"https://www.zigbee2mqtt.io/\"\u003eZigbee2MQTT\u003c/a\u003e (Z2M)\n(with the \u003ca href=\"https://www.home-assistant.io/integrations/mqtt/\"\u003eMQTT integration\u003c/a\u003e), which is a third party integration but has\nsupposedly better device support, and more flexibility.\u003c/p\u003e\n\u003cp\u003eI decided upon Z2M. Zigbee2MQTT requires more setup but I\u0026rsquo;m happy to tinker to\nget things working. Z2M requires a separate \u003ca href=\"https://en.wikipedia.org/wiki/MQTT\"\u003eMQTT\u003c/a\u003e broker \u0026ndash; \u003ca href=\"https://mosquitto.org/\"\u003eMosquitto\u003c/a\u003e is\nthe oft recommended choice, which I went with.\u003c/p\u003e\n\u003cp\u003eBut I did not setup authentication, because authentication is how you make\nthings not work. This is a home network and if someone gains access to my\nnetwork bad things have already happened, but still, we should do what we can\nso I decided to set it up finally.\u003c/p\u003e\n\u003cp\u003eLike \u003ca href=\"/weeknotes/203-bug-ridden-forms/#:~:text=fuss%20and%20it-,worked%20first%20time,-.\"\u003ethe time I didn\u0026rsquo;t Dockerize Plex\u003c/a\u003e for ages and then it just worked, this\nwas a very similar experience. It did take a bit of planning, but not much.\u003c/p\u003e\n\u003cp\u003eAnyway, during the setup I discovered a neat feature. You can store your\ncredentials in a different file from the main mosquitto config.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000080\"\u003emqtt\u003c/span\u003e:\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#000080\"\u003euser\u003c/span\u003e:\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;!secrets.yaml mqtt_user\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#000080\"\u003epassword\u003c/span\u003e:\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;!secrets.yaml mqtt_password\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThen you can put your secrets in \u003ccode\u003esecrets.yaml\u003c/code\u003e like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000080\"\u003emqtt_user\u003c/span\u003e:\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003euser\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000080\"\u003emqtt_password\u003c/span\u003e:\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003emqtt_password\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis means I can version control the config without committing credentials to\ngit.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Christmas trip down south is now done and dusted. We were blessed with an\neasy journey both times, which takes a lot of the stress out of things. It was\nnice to see everyone, but I\u0026rsquo;m glad to be home. I guess this is home now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/KrishKrosh/TrackWeight\"\u003eTrackWeight\u003c/a\u003e \u0026ndash; Turn your MacBook\u0026rsquo;s trackpad into a precise digital weighing\nscale.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI went to check the \u003ca href=\"/weeknotes/231-on-a-roll/#:~:text=time%20is%20also-,now%20complete,-.%20Blimey%2C%20I%E2%80%99m%20on\"\u003eGame Boy I completed\u003c/a\u003e a few weeks ago, ready to be\nwrapped up for Christmas, and it no longer plays games. For reasons. This is\nannoying. I have had to fall back to a backup gift and will need to\ntroubleshoot this one now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome brief experiments with different 3D printer build plates this week\nyielded mixed results. There is much to play with and tweak.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://hey.paris/posts/appleid/\"\u003e20 Years of Digital Life, Gone in an Instant, thanks to Apple\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA major brick-and-mortar store sold an Apple Gift Card that Apple seemingly\ntook offence to, and locked out my entire Apple ID, effectively bricking my\ndevices and my iCloud Account, Apple Developer ID, and everything associated\nwith it, and I have no recourse.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is the sort of thing that keeps me up at night.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://howtodothings.co/626/how-to-stop-avoiding-big-tasks-using-an-easy-20-second-trick/\"\u003eHow to Stop Avoiding Big Tasks, Using an Easy 20-Second Trick\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis has been hanging out in my web browser for weeks\u0026hellip;\u003c/p\u003e\n\u003cp\u003eSaying that the advice is good I think. I\u0026rsquo;ve done something similar to this,\nbut not quite the same when coding. I\u0026rsquo;ll leave what I was doing in the\ncomments of the code, and what I should do or try next. Using the word “NEXT”\nis surprisingly powerful. I am going to try and implement this across tasks\nwhich are not programming based.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.nicchan.me/blog/the-f-off-contact-page/\"\u003eThe f*** off contact page\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn order to combat my inability to concentrate on anything much at all, I am\nconstantly using the \u003ca href=\"https://support.apple.com/en-gb/guide/iphone/iphb2cfa052c/ios\"\u003eBackground Sounds\u003c/a\u003e feature of iOS. I find the noise\nhelps. (It\u0026rsquo;s hidden away under Settings -\u0026gt; Accessibility -\u0026gt; Audio \u0026amp; Visual -\u0026gt;\nBackground Sounds, but I\u0026rsquo;ve got a \u003ca href=\"https://support.apple.com/en-us/109346\"\u003ebutton for it in Control Center\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003eI use \u003ca href=\"https://noizioapp.com/\"\u003eNoizio\u003c/a\u003e for this on my Mac, but there is something particular about the\nApple supplied sounds that I like so I went looking for Background Sounds on\nmacOS. I it \u003cem\u003eis\u003c/em\u003e a thing on macOS, but again, it\u0026rsquo;s hidden away in Settings. I\nnow have \u003ca href=\"https://github.com/raycast/extensions/blob/b8c8fcd7ebd441a5452b396923f2a40e879565ba/extensions/background-sounds/README.md\"\u003ethis Raycast extension\u003c/a\u003e to easily toggle it on and off.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAnother brief sojourn to Sheffield this week. Good times ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen setting up Home Assistant there are two integration choices when it comes\nto Zigbee connectivity: \u003ca href=\"https://www.home-assistant.io/integrations/zha/\"\u003eZigbee Home Automation\u003c/a\u003e (ZHA), which is the\n\u0026ldquo;official\u0026rdquo; integration from the Home Assistant people, or \u003ca href=\"https://www.zigbee2mqtt.io/\"\u003eZigbee2MQTT\u003c/a\u003e (Z2M)\n(with the \u003ca href=\"https://www.home-assistant.io/integrations/mqtt/\"\u003eMQTT integration\u003c/a\u003e), which is a third party integration but has\nsupposedly better device support, and more flexibility.\u003c/p\u003e\n\u003cp\u003eI decided upon Z2M. Zigbee2MQTT requires more setup but I\u0026rsquo;m happy to tinker to\nget things working. Z2M requires a separate \u003ca href=\"https://en.wikipedia.org/wiki/MQTT\"\u003eMQTT\u003c/a\u003e broker \u0026ndash; \u003ca href=\"https://mosquitto.org/\"\u003eMosquitto\u003c/a\u003e is\nthe oft recommended choice, which I went with.\u003c/p\u003e",
      "date_published": "2025-12-21T00:00:00+00:00",
      "date_modified": "2025-12-21T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/233-joe-pesci/",
      "url": "https://elver.me/weeknotes/233-joe-pesci/",
      "title": "Weeknotes 233: Joe Pesci",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.brickborrow.com/\"\u003eBrick Borrow\u003c/a\u003e \u0026ndash; This seems like a really good idea? I\u0026rsquo;ve often thought that\nI\u0026rsquo;d like to build some Lego sets, but I don\u0026rsquo;t know what I\u0026rsquo;d do with them\nafterwards. I don\u0026rsquo;t particularly want a house full of Lego.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBecause I\u0026rsquo;m such selfless nice guy I volunteered to take a look at someone\u0026rsquo;s\n\u0026ldquo;slow\u0026rdquo; laptop running Windows 10. It became clear fairly quickly that wiping\nthis thing and reinstalling Windows could only take it so far.\u003c/p\u003e\n\u003cp\u003eI decided the best thing for it was an upgrade from 1TB spinning disk to 120GB\nSSD (only ~60GB was being used anyway). I bought a \u003ca href=\"https://www.amazon.co.uk/dp/B08LKMQ9T4\"\u003eSSD for £15.49!\u003c/a\u003e I was\nthinking about buying second-hand from eBay or Vinted where they can be had\nfor slightly less at ~£8-12, but the extra few quid is worth it for the\nability to return it if things don\u0026rsquo;t work out.\u003c/p\u003e\n\u003cp\u003eIs it now super fast? No. Not really. But it has turned it from \u0026ldquo;Oh my god\nplease end this torment\u0026rdquo; to \u0026ldquo;This is a bit slow but usable\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eInstalling Windows 10. What can I possibly to have done in a previous life to\ndeserve this fate? Every time I encounter Windows, it\u0026rsquo;s worse than the last\ntime. Awful. Just awful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI received an email from someone thanking me for my \u003ca href=\"/blog/how-to-replace-a-failed-disk-in-a-zfs-mirror/\"\u003ehow to replace a disk in\na ZFS mirror\u003c/a\u003e article. I\u0026rsquo;ve benefited greatly from the personal websites of\nmany people over the years, so giving back even a \u003cem\u003etiny bit\u003c/em\u003e is heartening.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI \u003ca href=\"https://elver.me/projects/touchid-trackpad/\"\u003ewrote up\u003c/a\u003e the process I followed to build the \u003ca href=\"https://www.thingiverse.com/thing:6955798\"\u003eTrackID Touchpad\u003c/a\u003e I\ncompleted \u003ca href=\"/weeknotes/231-on-a-roll/#:~:text=I%20built%20one%20of%20those%20TouchID%20Trackpads\"\u003ethe other week\u003c/a\u003e. This took way longer than I expected.\u003c/p\u003e\n\u003cp\u003eI get \u003cem\u003eextremely\u003c/em\u003e distracted by what the thing looks like \u0026ndash; you might be\nthinking, if you\u0026rsquo;ve clicked that link, \u0026ldquo;it doesn\u0026rsquo;t look like you do\u0026rdquo;. I kept\nit very lo-fi intentionally in an attempt to tame the distraction of yet\nanother static site generator black hole.\u003c/p\u003e\n\u003cp\u003eIf you get URLs right you can change it later.\u003c/p\u003e\n\u003cp\u003eAnd I got the URLs right 😉\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLook at these \u003ca href=\"https://chubbycable.com/products/new-fashion-240w-anodizing-new-color-fast-charging-cable-for-new-iphone-17?variant=45077311783098\"\u003elovely USB-C cables\u003c/a\u003e with a truly terrible logo. I bought a\ncouple to try (there are a few models which don\u0026rsquo;t have the logo).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDid you know you can put images on web pages now?\u003c/p\u003e\n\u003cp\u003eTo me, \u003ca href=\"https://en.wikipedia.org/wiki/WebP\"\u003eWebP\u003c/a\u003e is the cool, but unsupported, new kid on the block. \u003ca href=\"https://caniuse.com/webp\"\u003eWebP has been\nmainstream since 2020\u003c/a\u003e. In fact WebP is being slowly superseded by even newer\nformats like \u003ca href=\"https://en.wikipedia.org/wiki/AVIF\"\u003eAVIF\u003c/a\u003e, and perhaps eventually \u003ca href=\"https://en.wikipedia.org/wiki/JPEG_XL\"\u003eJPEG XL\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI did some experimentation with WebP and AVIF formats using \u003ca href=\"https://en.wikipedia.org/wiki/ImageMagick\"\u003e\u003ccode\u003emagick\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://github.com/AOMediaCodec/libavif\"\u003eavifenc\u003c/a\u003e, and \u003ca href=\"https://developers.google.com/speed/webp/docs/cwebp\"\u003ecwebp\u003c/a\u003e. \u003ccode\u003eavifenc\u003c/code\u003e and \u003ccode\u003ecwebp\u003c/code\u003e are the reference\nimplementations for those formats respectively. \u003ccode\u003emagick\u003c/code\u003e is\u0026hellip;ImageMagick.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eavifenc\u003c/code\u003e and \u003ccode\u003ecwebp\u003c/code\u003e cannot convert straight from a \u003ca href=\"https://en.wikipedia.org/wiki/High_Efficiency_Image_File_Format\"\u003eHEIC\u003c/a\u003e, so an\nintermediate, lossless, PNG is required.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esips -s format png original.heic --out original.png\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThese are the results.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ls -1lSh | awk \u003cspan style=\"color:#d14\"\u003e\u0026#39;{print $5, $9}\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  9.4M original.png\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  1.0M original.heic\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  421K original-magick.webp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  415K original-cwebp.webp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  392K original-avifenc.avif\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  230K original-magick.avif\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFor the record, JPEG XL is definitely \u003ca href=\"https://caniuse.com/jpegxl\"\u003enot ready yet\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy printer \u003ca href=\"/weeknotes/224-one-for-my-therapist/#:~:text=You%E2%80%99ve%20guessed%20it%2C-,it%20would%20not%20print,-.\"\u003efell off the network again\u003c/a\u003e due to the previous 2.4GHz WiFi\nissues. Never trust WiFi, it will always let you down. New network equipment\nis getting closer and closer to purchase time. I just wanna print, man.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://makerworld.com/en/crowdfunding/110-snapframes-custom-frame-generator\"\u003eSnapFrames: Custom Frame Generator\u003c/a\u003e \u0026ndash; this is cool and relevant to my recent\ninterest in framing various things. I will follow with interest.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.freecycle.org/\"\u003eFreeCycle\u003c/a\u003e has been very handy this week. First I picked up a nice large\npicture frame for free on Wednesday evening, and then got rid of an old wall\nunit that was surplus to requirements on Friday morning.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI fitted a \u003ca href=\"https://biqu.equipment/products/biqu-panda-lux-led-upgrade-kit-bambu-lab-a1\"\u003eLED light upgrade kit\u003c/a\u003e to my Bambu A1. The double-sided tape that\nthis came with was truly awful for what is an otherwise quite clever upgrade.\u003c/p\u003e\n\u003cp\u003eThe kit uses a light sensor that fits over the existing (pants) LED light\nbuilt-in to the printer. That means that you retain control over the lighting\nvia the normal controls on the printer touchscreen, and via the app. Nice.\u003c/p\u003e\n\u003cp\u003eI added my own 3M double-sided tape in the end and that seems to have secured\nit pretty well. I\u0026rsquo;m not sure if this upgrade is really worth doing to be\nhonest, it doesn\u0026rsquo;t give you a much better view of what you\u0026rsquo;re printing, which\nseems like it would be the point. Still, it was cheap, and fun.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI built a \u003ca href=\"https://makerworld.com/en/models/233902-dowel-filament-racks?from=search#profileId-1299804\"\u003eFilament spool rack\u003c/a\u003e for my filament stash. It was getting a bit\nunruly. It came out quite nicely I think. I found a nice design for the end\npieces and connected them.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/filament-rack-empty.jpeg\" alt=\"Empty Filament spool rack\"\u003e\n\u003cimg src=\"/images/filament-rack-full.jpeg\" alt=\"Filament spool rack full of filament\"\u003e\u003c/p\u003e\n\u003cp\u003eThe design recommended PVC pipe, which I bought from \u003ca href=\"https://www.toolstation.com/20mm-heavy-duty-round-pvc-conduit/p47063\"\u003eToolstation for £1.51\u003c/a\u003e,\nbut I decided, after picking it up, that it looked a bit naff. Instead I ended\nup opting for some nice \u003ca href=\"https://www.wickes.co.uk/Rothley-White-Interior-Multi-Rail-Tube---19-x-1820mm/p/530316\"\u003ewhite steel wardrobe tubing from Wickes at £4\u003c/a\u003e, which\nI cut down to size with a pipe cutter.\u003c/p\u003e\n\u003cp\u003eDoes anyone need 2 metres of black PVC conduit?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome \u003ca href=\"https://en.wikipedia.org/wiki/Common_cold\"\u003esniffles\u003c/a\u003e this week. Shout out to \u003ca href=\"https://en.wikipedia.org/wiki/Xylometazoline\"\u003eXylometazoline\u003c/a\u003e (aka \u003ca href=\"https://www.otrivine.co.uk/\"\u003eOtrivine\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI performed my first modifications to an existing 3D model this week. My aim\nwas to add some text onto the face of a case. \u003ca href=\"https://bambulab.com/en/download/studio\"\u003eBambu Studio\u003c/a\u003e makes this fairly\neasy once you\u0026rsquo;ve watched a video on how to do it. However, I suspect that soon\nI will be reaching for more powerful CAD software and all that that entails.\u003c/p\u003e\n\u003cp\u003eIn order to save print time and filament, I also managed to cut the existing\nmodel down into a smaller piece whilst testing the print settings.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe world of Game Boy modding is full of confusion. Products are mainly\nmanufactured by two or three big players, but often use the same (often\nrecycled) components. For example, both \u003ca href=\"https://hispeedidostore.com/\"\u003eHispeedido\u003c/a\u003e and \u003ca href=\"https://funnyplaying.com/\"\u003eFunnyplaying\u003c/a\u003e use\nthe same screen for their DMG \u0026ldquo;laminated\u0026rdquo; kits but it\u0026rsquo;s hard to be sure of\nthat up front.\u003c/p\u003e\n\u003cp\u003eI only know because I bought a \u003ca href=\"https://hispeedidostore.com/products/newest-laminated-q5-3-1-inches-larger-display-hd-ips-rips-screen-osd-frm-for-gbo-dmg-lcd-kits-housing-shell-case\"\u003eHispeedido screen kit for a DMG\u003c/a\u003e I\u0026rsquo;m working\non and tested it with a \u003ca href=\"https://funnyplaying.com/products/dmg-gbp-after-sales-ips-lcd\"\u003eFunnyplaying laminated screen\u003c/a\u003e and it works. The\nreality is that, especially as a relative newcomer, you often don\u0026rsquo;t really\nknow what you\u0026rsquo;re buying without experimentation.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI loves me some \u003ca href=\"https://en.wikipedia.org/wiki/Quick_Look\"\u003eQuick Look\u003c/a\u003e, so I setup \u003ca href=\"https://github.com/DavidPhillipOster/ThumbHost3mf\"\u003eThumbHost3mf\u003c/a\u003e this week for\npreviewing \u003ca href=\"https://en.wikipedia.org/wiki/3D_Manufacturing_Format\"\u003e\u003ccode\u003e*.3mf\u003c/code\u003e\u003c/a\u003e files.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I setup my first Home Assistant automations, and of course one\ninstantly stopped working. This is what I envisage a \u0026ldquo;smart home\u0026rdquo; is \u0026ndash; things\njust not working sometimes.\u003c/p\u003e\n\u003cp\u003eThe troublesome one was a contact sensor to tell me when the front door is\nopen. It seemed to fall off the Zigbee network as soon as I moved it to the\ndoor. Re-pairing it whilst \u003cem\u003eat\u003c/em\u003e the front door seems to have fixed it and it\nhas been working since so far.\u003c/p\u003e\n\u003cp\u003eThe other was a hardware switch to turn my office lighting on/off. It is fine.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dri.es/source-available-is-not-open-source-and-that-is-okay\"\u003e\u0026ldquo;Source available\u0026rdquo; is not open source (and that\u0026rsquo;s okay)\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA more accurate framing would be that Fizzy is source available. You can\nread it, run it, and modify it. But DHH\u0026rsquo;s company is keeping the SaaS rights\nbecause they want to be able to build a sustainable business. That is\ndefensible and generous, but it is  not  open source.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I realised that \u003ca href=\"https://www.themoviedb.org/person/4517-joe-pesci\"\u003eJoe Pesci\u003c/a\u003e starred in \u003ca href=\"https://www.themoviedb.org/movie/771-home-alone\"\u003eHome Alone\u003c/a\u003e and \u003ca href=\"https://www.themoviedb.org/movie/769-goodfellas\"\u003eGoodFellas\u003c/a\u003e\nin the same year, 1990! The roles could not be more different.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.brickborrow.com/\"\u003eBrick Borrow\u003c/a\u003e \u0026ndash; This seems like a really good idea? I\u0026rsquo;ve often thought that\nI\u0026rsquo;d like to build some Lego sets, but I don\u0026rsquo;t know what I\u0026rsquo;d do with them\nafterwards. I don\u0026rsquo;t particularly want a house full of Lego.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBecause I\u0026rsquo;m such selfless nice guy I volunteered to take a look at someone\u0026rsquo;s\n\u0026ldquo;slow\u0026rdquo; laptop running Windows 10. It became clear fairly quickly that wiping\nthis thing and reinstalling Windows could only take it so far.\u003c/p\u003e",
      "date_published": "2025-12-14T00:00:00+00:00",
      "date_modified": "2025-12-14T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/232-your-blog-is-dead-to-me/",
      "url": "https://elver.me/weeknotes/232-your-blog-is-dead-to-me/",
      "title": "Weeknotes 232: Your blog is dead to me",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIf your blog doesn\u0026rsquo;t have a feed it is dead to me. That\u0026rsquo;s a shame because I\nwould like to read your blog.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe picked our Christmas tree on Wednesday afternoon and it was delivered\nFriday evening ready to be decorated, which I cannot be arsed to do. Ho, ho,\nho.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI added a handy dandy \u003ca href=\"https://github.com/jordelver/dotfiles/commit/2041c165ee91351ed9563a2490a80de70ff7a920\"\u003eRaycast script command to start 3D cameras\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/raycast-3d-cameras.png\" alt=\"Raycast \u0026ldquo;3D cameras\u0026rdquo; command shown on macOS\"\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOnce I plucked up the courage (pathetic!) to figure out how to change out\nhalf-used filament spools, for example to change to a different colour, it\nbecame clear that this was going to be a constant pain. You have to carefully\ntape up the filament so it doesn\u0026rsquo;t unravel into a big disastrous mess when\nremoving it from a spool, which is time consuming.\u003c/p\u003e\n\u003cp\u003eAs a result I\u0026rsquo;ve been printing lots of \u003ca href=\"https://makerworld.com/en/models/73599-v4-bambu-spool-honeycomb-edition#profileId-105962\"\u003efilament spools\u003c/a\u003e (\u003ca href=\"/weeknotes/231-on-a-roll/#:~:text=Most%203D%20printing%20is%20about%20pimping%20out%20the%203D%20printer\"\u003etold you\u003c/a\u003e) that I\ncan more easily swap on and off the printer.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/197-i-m-a-youtuber-now/#:~:text=My%20desk%20has%20finally%20been%20upgraded\"\u003eMegaDesk controller for my desk\u003c/a\u003e became unresponsive and it wouldn\u0026rsquo;t move\nup or down. I had to reboot it (turn it off and on again). Nothing is immune\nfrom breaking!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had my first failed 3D print this week. The print just stopped after it was\nabout 35% done and reported being \u0026ldquo;successful\u0026rdquo;, which it very much was not.\nThe print head didn\u0026rsquo;t move back to its home position like it usually does\neither, which resulted in the print sticking to the nozzle as it cooled 😢\u003c/p\u003e\n\u003cp\u003eAfter some research it seemed like the \u003ca href=\"https://en.wikipedia.org/wiki/G-code\"\u003eG-code\u003c/a\u003e was probably corrupted.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eG-code instructions are provided to a machine controller (industrial\ncomputer) that tells the motors where to move, how fast to move, and what\npath to follow.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt seems like it just followed the G-code as far as it could and then stopped\nwhen it found no more instructions. SD card corruption was popping up a lot in\nmy research, which I found strange. I was under the impression that the SD\ncard was just used to manually add prints to the printer, but it turns out\nthat even when you initiate a print over the network it is still written to\nthe SD card, so the card is always involved in any print job.\u003c/p\u003e\n\u003cp\u003eI formatted the SD card, and I\u0026rsquo;ve had many successful print jobs since, but I\nordered a new SD card anyway in case it happens again.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGiven the amount of fake flash memory devices floating about on popular\nmarketplaces I decided I should test the new SD memory card somehow. I came\nacross \u003ca href=\"https://github.com/AltraMayor/f3\"\u003ef3\u003c/a\u003e and gave that a go. It seemed to \u0026ldquo;work\u0026rdquo; I suppose 🤷‍♀️\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitchellh.com/writing/ghostty-non-profit\"\u003eGhostty Is Now Non-Profit\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn addition to the 7% fees, my family is personally donating $150,000\ndirectly to the Hack Club project\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMitchell Hashimoto seems to be one of the good guys who made good and is now\ngiving back in big, sustainable, ways. Not just technically, but financially.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.nataliethenerd.com/build-a-boy-update-1-wip-and-tech-specs/\"\u003eBuild A Boy update #1: WIP and tech specs\u003c/a\u003e - Natalie the Nerd is making good\nprogress on her Lego Game Boy kit.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://angelika.me/2025/12/04/buying-kinesis-advantage-was-a-mistake/\"\u003eBuying the Kinesis Advantage 360 keyboard was a mistake\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI had to consider all the keyboard shortcuts that I normally use. Every\nattempt at changing the layout would be costly. It takes weeks to develop\nnew muscle memory, so it felt very important to get it right on the first\ntry.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is exactly how I\u0026rsquo;ve felt about customising keyboards. I just don\u0026rsquo;t have a\nparticularly strong opinion on what is the best placement for a key, and the\ncost of experimentation just seems too high. (No, I am still not using the new\nkeyboard.)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.kickstarter.com/projects/makera-inc/makera-z1-entry-level-cnc-pro-level-power\"\u003eMakera Z1 Desktop CNC: Entry-level CNC, Pro-level Power\u003c/a\u003e \u0026ndash; another week,\nanother home CNC machine.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.jasonscheirer.com/weblog/vignettes/\"\u003eA Series of Vignettes From My Childhood and Early Career\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis is indeed a set of passive-aggressive jabs on the continuing assault on\nour senses by the LLM hype lobby.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you need to check what your public IP is when connected to some remote\nmachine you can do this and you\u0026rsquo;ll get a nice JSON response.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ecurl http://ipinfo.io\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis is useful for checking if the request is, say, connecting through a proxy\ntoo.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ecurl -x http://ip:8888 http://ipinfo.io\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou know when RSS feeds don\u0026rsquo;t have the full content? Annoying, right. I was\naware that proxy services and software were a thing, so went investigating for\na solution (I\u0026rsquo;m not busy actually, no) and I found that the service I already\nuse, \u003ca href=\"https://feedbin.com/\"\u003eFeedbin\u003c/a\u003e, has this built-in \u0026ndash; sort of. There is a \u0026ldquo;Reader\u0026rdquo; button you\ncan press which shows you the full article content.\u003c/p\u003e\n\u003cp\u003eAt first it looked like it was only going to work in the Feedbin iOS app, and\nI use \u003ca href=\"https://netnewswire.com/\"\u003eNetNewsWire\u003c/a\u003e like any self-respecting feed user. I was sure it wouldn\u0026rsquo;t\nwork there, but it does!\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s not perfect, loading each article manually by pressing the button seems\nlike unnecessary friction. Better than nowt though as I can avoid \u0026ldquo;local news\nwebsite ads\u0026rdquo;, the worst kind of ads.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNow is \u003ca href=\"https://gizmodo.com/do-not-build-a-pc-right-now-prices-out-of-control-2000694774\"\u003e\u003cem\u003enot\u003c/em\u003e a good time to build a PC\u003c/a\u003e. Look at the \u003ca href=\"https://pcpartpicker.com/trends/price/memory/\"\u003eprice of memory\u003c/a\u003e!\u003c/p\u003e\n\u003cp\u003e(Hat tip to \u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e for the graph link.)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDNS is really hard, man - for me at least. Sure, the basics make sense, but it\ncan get complicated fast. I\u0026rsquo;ve been adding a fair few new Docker services to\nmy home network recently and I\u0026rsquo;m sick of typing URLs with port numbers, so I\nwanted to be able to refer to services by a custom domain.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve decided to go the very lowest of lo-fi route, for now \u0026ndash; \u003ccode\u003e/etc/hosts\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eBecause I only connect to these services on my local network, or via\nTailscale, and I have \u003ca href=\"/weeknotes/231-on-a-roll/#:~:text=I%20setup%20my%20main%20file%20server%20machine%20at%20home%20as%20a%20Subnet%20Router\"\u003eTailscale Subnet Routing turned on\u003c/a\u003e I can always\nresolve the local IP, so I can just add entries to \u003ccode\u003e/etc/hosts\u003c/code\u003e like:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e192.168.0.1  service.custom.domain\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eCoupled with a reverse proxy (which I\u0026rsquo;ve yet to setup) and it should work. It\nwill only work on this one computer, but it will work.\u003c/p\u003e\n\u003cp\u003eThat\u0026rsquo;s all I need right now. I will revisit running proper DNS later when then\nnetwork evolves into something proper.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://sixcolors.com/post/2025/12/in-a-major-coup-for-someone-alan-dye-leaves-apple/\"\u003eIn a major coup for someone, Alan Dye leaves Apple\u003c/a\u003e \u0026ndash; this guy couldn\u0026rsquo;t\ndesign his way out of a paper bag. Design isn\u0026rsquo;t making things transparent, Al.\u003c/p\u003e\n\u003cp\u003ePeople, stop making things pretty, start \u003cem\u003edesigning\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIf your blog doesn\u0026rsquo;t have a feed it is dead to me. That\u0026rsquo;s a shame because I\nwould like to read your blog.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe picked our Christmas tree on Wednesday afternoon and it was delivered\nFriday evening ready to be decorated, which I cannot be arsed to do. Ho, ho,\nho.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI added a handy dandy \u003ca href=\"https://github.com/jordelver/dotfiles/commit/2041c165ee91351ed9563a2490a80de70ff7a920\"\u003eRaycast script command to start 3D cameras\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/raycast-3d-cameras.png\" alt=\"Raycast \u0026ldquo;3D cameras\u0026rdquo; command shown on macOS\"\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOnce I plucked up the courage (pathetic!) to figure out how to change out\nhalf-used filament spools, for example to change to a different colour, it\nbecame clear that this was going to be a constant pain. You have to carefully\ntape up the filament so it doesn\u0026rsquo;t unravel into a big disastrous mess when\nremoving it from a spool, which is time consuming.\u003c/p\u003e",
      "date_published": "2025-12-07T00:00:00+00:00",
      "date_modified": "2025-12-07T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/231-on-a-roll/",
      "url": "https://elver.me/weeknotes/231-on-a-roll/",
      "title": "Weeknotes 231: On a roll",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe replacement screen for which I raised a \u003ca href=\"/weeknotes/230-broken-web/#:~:text=my%20best%20friend\"\u003ePayPal dispute\u003c/a\u003e was received and\nworks, that\u0026rsquo;s the end of that particular saga.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNow that the coin batteries in my home automation devices are starting to run\nout, and after reading about \u003ca href=\"/weeknotes/230-broken-web/#:~:text=impressive%20project\"\u003ethat impressive project to build a sensor from\nscratch\u003c/a\u003e (which uses a AAA battery) I\u0026rsquo;m starting to realise that rechargeable\nAAA batteries may be the way forward, if possible. Coin batteries seem\ncheaper, but if you buy decent ones it adds up, and marketplaces seem full of\njunk.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.lego.com/en-gb/product/star-trek-u-s-s-enterprise-ncc-1701-d-10356\"\u003eStar Trek: U.S.S. Enterprise NCC-1701-D™\u003c/a\u003e - Christmas is coming, and if you\nneed some ideas, I\u0026rsquo;m just saying.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/190-no-worky/#:~:text=something%20I%20fixed\"\u003ebutton on the speaker I fixed\u003c/a\u003e seems to be playing up again. I\u0026rsquo;ve yet to\nopen it, but I\u0026rsquo;ve preemptively bought \u003ca href=\"https://www.switchelectronics.co.uk/products/6x6mm-right-angle-momentary-pcb-tactile-switch-7-0mm\"\u003esome right-angled switches\u003c/a\u003e (by\neyeballing the photos, no science involved) because they were cheap and I\u0026rsquo;m\nalready \u003ca href=\"/weeknotes/190-no-worky/#:~:text=I%20swapped%20out%20one%20of%20the%20other%20buttons%20into%20the%20power%20button%20position\"\u003eone switch down since the last repair\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy Kindle now has \u003ca href=\"https://en.wikipedia.org/wiki/Secure_Shell\"\u003esshd\u003c/a\u003e. How else would you get epubs onto a Kindle? AMA 😁\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFungus gnats! I am so sick of these fuckers. My tunnel vision thought that\nthey were coming from the plant pots themselves. As \u003ca href=\"/weeknotes/218-botulism-opportunity/#:~:text=I%20was%20wrong\"\u003epreviously documented\u003c/a\u003e I\nsent in a nemotode army and installed sticky traps. Still they persisted. So I\ntopped the soil with an anti-fungus gnat gravel. Still they came. Then I\nremembered that I had bags of compost in the understairs cupboard\u0026hellip;\u003c/p\u003e\n\u003cp\u003eIt was extremely obvious that this was the main source of the gnats once I\nwent looking. There was a fungus gnat graveyard next to the bags, bodies\neverywhere. I\u0026rsquo;ve taped up the bags now. Every crevice they could get out of\nnow covered in parcel tape. Now we wait 🤞\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis is a cool concept. Turn your \u003ca href=\"https://makerworld.com/en/models/2029113-modular-system-for-x1-p1-p2-series#profileId-2188110\"\u003e3D printer into other kinds of machine\u003c/a\u003e\nlike a plotter, laser cutter, etc.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/228-all-my-friends/#:~:text=manually%20uploading%20torrent%20files\"\u003eShortcut\u003c/a\u003e how have I lived without you 😍 I added the ability for files to be\ndeleted after upload. Such technology.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy car went back into the garage this week. A new battery, which isn\u0026rsquo;t bad as\nit\u0026rsquo;s pretty old now, and a unblocking of the rear washer jets was in order.\nThe issue I\u0026rsquo;ve been having with the revs dropping whilst idling in traffic\nremains unsolved, but there is some suspicion that the timing chain is\nstretching and needs replacement. An expensive job, but not Audi dealer\nexpensive, so there\u0026rsquo;s that. The mechanic didn\u0026rsquo;t seem too worried. Famous last\nwords 😬\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe\u0026rsquo;re an Air Fryer family now. Black Friday was the time to pounce on a deal,\nand pounce I did. I did my research, setup a Camel Camel Camel alert, and then\nI waited. I went against the grain and bought a \u003ca href=\"https://www.amazon.co.uk/dp/B0CHFMK8S5\"\u003eCosori model\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI was a skeptic, isn\u0026rsquo;t an air fryer just a small convection oven? Yes, yes it\nis, but I\u0026rsquo;m won over. The speed and easy clean up is a game changer. It\u0026rsquo;s\nundeniably too big for our worktop, so that might get boring fast.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI built one of those \u003ca href=\"https://www.thingiverse.com/thing:6955798/\"\u003eTouchID Trackpads\u003c/a\u003e I \u003ca href=\"/weeknotes/223-now-there-are-graphs/#:~:text=very%20nice%20idea\"\u003ementioned before\u003c/a\u003e. Early days but\nI\u0026rsquo;m pretty happy with it so far, although it\u0026rsquo;s too early to tell whether I\nwill actually use it. I enjoyed the process though.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/touchid-trackpad.jpeg\" alt=\"Completed TouchID Trackpad project\"\u003e\u003c/p\u003e\n\u003cp\u003eI expect to write up the build of this with photos (!) in a longer blog post\nso be sure to like and subscribe for that.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhat you can get delivered to your door next day should constantly surprise\nus. We\u0026rsquo;re completely spoilt in a lot of ways. Conversely sometimes I\u0026rsquo;m shocked\nat how difficult it is to acquire certain things.\u003c/p\u003e\n\u003cp\u003eNow, this \u0026ldquo;thing\u0026rdquo; is a very particular headphone socket (\u003ca href=\"https://www.digikey.co.uk/en/products/detail/same-sky-formerly-cui-devices/SJ2-35954A-SMT-TR/6619576?s=N4IgTCBcDaIMoCkwFoDMBWAnOgLAQWTgFkAVZEgJRAF0BfIA\"\u003eSJ2-35954A-SMT-TR\u003c/a\u003e),\nsure, but it seems the only way to get this part at a \u003cem\u003ereasonable price\u003c/em\u003e is to\nbuy £50 pounds quid worth of them. I just want \u003cem\u003eone\u003c/em\u003e. I\u0026rsquo;ve \u003ca href=\"/weeknotes/185-fabric-shaving/#:~:text=Anyway%2C%20that%E2%80%99s%20the%20story%20of%20how%20a%20man%20ordered%20%C2%A360%20worth%20of%20the%20same%20part%20out%20of%20sheer%20stubbornness\"\u003ebeen here before\u003c/a\u003e\nand not sure I want re-visit.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhat are you using \u003ca href=\"/weeknotes/230-broken-web/#:~:text=I%20purchased%20a%20Tapo%20C110%20camera%20this%20week\"\u003ethose cameras\u003c/a\u003e for Jordan? To monitor my 3D printer of\ncourse, silly! When a long print is doing its thing I don\u0026rsquo;t want to confined\nto the house watching over it, checking for fires etc, so it\u0026rsquo;s nice to be able\nto take a quick look now and then.\u003c/p\u003e\n\u003cp\u003eSo now I have both trained on the printer from different vantage points. I\nstarted off with a wider view of the whole setup. It seems nice to be able to\nsee everything in case there\u0026rsquo;s some problems outside of the printer itself.\nThe other, cheaper, camera is aimed firmly at the print bed itself using a \u003ca href=\"https://makerworld.com/en/models/104825-bambulab-a1-tapo-c110-camera-holder#profileId-147746\"\u003e3D\nprinted bracket\u003c/a\u003e (duh!).\u003c/p\u003e\n\u003cp\u003eMost 3D printing is about pimping out the 3D printer.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which, I wanted to access those cameras on my Mac. The iOS app is\nvery nice, but it\u0026rsquo;s more useful to have the camera streams running in the\ncorner of my desktop instead whilst doing something else.\u003c/p\u003e\n\u003cp\u003eAs I said before, the cameras can be \u003ca href=\"https://www.tapo.com/us/faq/724/\"\u003eaccessed over RTSP\u003c/a\u003e, so it is just a\nmatter of pulling those streams and arranging them into some sort of window. I\ndidn\u0026rsquo;t want to expose these RTSP streams to the Internet particularly, but I\ndo have Tailscale.\u003c/p\u003e\n\u003cp\u003eIf you setup \u003ca href=\"https://tailscale.com/kb/1019/subnets\"\u003eSubnet Routing in Tailscale\u003c/a\u003e you can access local devices which\nhave an IP, but onto which you cannot install the Tailscale client. Once this\nis configured and you\u0026rsquo;re connected to your tailnet, you can access the device\nby it\u0026rsquo;s IP address as you would locally.\u003c/p\u003e\n\u003cp\u003eI setup my main file server machine at home as a Subnet Router as per the\ndocs.\u003c/p\u003e\n\u003cp\u003eFirst I had to enable \u003ca href=\"https://tailscale.com/kb/1019/subnets#enable-ip-forwarding\"\u003eIP Forwarding\u003c/a\u003e in Linux like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;net.ipv4.ip_forward = 1\u0026#39;\u003c/span\u003e | sudo tee -a /etc/sysctl.d/99-tailscale.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;net.ipv6.conf.all.forwarding = 1\u0026#39;\u003c/span\u003e | sudo tee -a /etc/sysctl.d/99-tailscale.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo sysctl -p /etc/sysctl.d/99-tailscale.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd then alter my Docker Compose config to \u0026ldquo;advertise\u0026rdquo; the routes:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-diff\" data-lang=\"diff\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   tailscale:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     image: tailscale/tailscale:stable\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     container_name: tailscale\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     environment:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       - TS_STATE_DIR=/var/lib/tailscale\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e-      - TS_EXTRA_ARGS=--advertise-exit-node\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+      - TS_ROUTES=192.168.0.0/24\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+      - TS_EXTRA_ARGS=--advertise-exit-node --accept-routes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e\u003c/span\u003e     volumes:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       - /opt/appdata/tailscale:/var/lib/tailscale\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       - /dev/net/tun:/dev/net/tun\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd re-create the container.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker-compose up -d --force-recreate tailscale\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOnce I\u0026rsquo;d done that I accepted the change in the web interface, and I could\naccess the devices ✅\u003c/p\u003e\n\u003cp\u003eThen there was the issue of actually displaying the streams. Claude, my man,\nhelped me out with this. I was sure there was some command line media player\nthat could do this, but I was unsure of the options. I ended up using \u003ca href=\"https://mpv.io/\"\u003empv\u003c/a\u003e\nwhich seems to be a modern replacement for \u003ca href=\"https://mplayerhq.hu/\"\u003emplayer\u003c/a\u003e which I used to use back\nin the day.\u003c/p\u003e\n\u003cp\u003eWith a lot of back and forth I ended up with a \u003ca href=\"https://github.com/jordelver/dotfiles/commit/25544ef4e745181671cb6a59b0631afdce5eaa79\"\u003enifty shell function\u003c/a\u003e which\nfires up the streams stacked vertically on top of each other, and that stays\non top of other windows.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-fish\" data-lang=\"fish\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003e3dcams\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003e-d\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Show my 3D printer cameras in a vertically stacked window\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#900;font-weight:bold\"\u003empv\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e    \u003cspan style=\"color:#008080\"\u003e--lavfi-complex\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;[vid1][vid2]vstack[vo]\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e    \u003cspan style=\"color:#008080\"\u003e--geometry\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e1280x0-\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e+\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e    \u003cspan style=\"color:#008080\"\u003e--no-audio\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e    \u003cspan style=\"color:#008080\"\u003e--msg-level\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eall\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003eerror \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e    \u003cspan style=\"color:#008080\"\u003e--ontop\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e    \u003cspan style=\"color:#008080\"\u003e$3D_PRINTER_CAM1_URL\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e    \u003cspan style=\"color:#008080\"\u003e--external-file\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003e$3D_PRINTER_CAM2_URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis isn\u0026rsquo;t yet battle-tested, but it works fairly well from what I can tell.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"https://www.boxypixel.com/products/metal-unhinged-game-boy-advance-sp-screen-base-kit\"\u003eBoxy Pixel GBA-SP Unhinged\u003c/a\u003e project I\u0026rsquo;ve been planning for a long time is\nalso now complete. Blimey, I\u0026rsquo;m on a roll.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/boxy-pixel-unhinged.jpeg\" alt=\"Boxy Pixel GBA SP Unhinged in silver\"\u003e\u003c/p\u003e\n\u003cp\u003eIsn\u0026rsquo;t she a beaut?! 😍\u003c/p\u003e\n\u003cp\u003eAgain, expect more excruciating detail about this process at a later date.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI am looking forward to starting my Coffee Advent calendar tomorrow. I\u0026rsquo;m fun.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe replacement screen for which I raised a \u003ca href=\"/weeknotes/230-broken-web/#:~:text=my%20best%20friend\"\u003ePayPal dispute\u003c/a\u003e was received and\nworks, that\u0026rsquo;s the end of that particular saga.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNow that the coin batteries in my home automation devices are starting to run\nout, and after reading about \u003ca href=\"/weeknotes/230-broken-web/#:~:text=impressive%20project\"\u003ethat impressive project to build a sensor from\nscratch\u003c/a\u003e (which uses a AAA battery) I\u0026rsquo;m starting to realise that rechargeable\nAAA batteries may be the way forward, if possible. Coin batteries seem\ncheaper, but if you buy decent ones it adds up, and marketplaces seem full of\njunk.\u003c/p\u003e",
      "date_published": "2025-11-30T00:00:00+00:00",
      "date_modified": "2025-11-30T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/230-broken-web/",
      "url": "https://elver.me/weeknotes/230-broken-web/",
      "title": "Weeknotes 230: Broken web",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMy advice, \u003ca href=\"/weeknotes/229-wildly-inefficient/#:~:text=use%20the%20NHS%20this%20week\"\u003enever get sick\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother example of a broken web. Why do you go to IKEA\u0026rsquo;s website? Is it to\nread the latest news on the world famous IKEA meatball (that is a real\nexample!)? No, it’s to browse and purchase the products IKEA sell. Which part\nof the home page loads last on ikea.com? You guessed it, the link to\ntheir online store. Absolute madness.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOnce again, \u003ca href=\"https://github.com/gohugoio/hugo/pull/14091\"\u003eyou are welcome\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI purchased a \u003ca href=\"https://www.tapo.com/uk/product/smart-camera/tapo-c110/\"\u003eTapo C110 camera\u003c/a\u003e this week for £16.99. I was astonished at how\ncheap it was. I wasn\u0026rsquo;t expecting much, but it\u0026rsquo;s genuinely fantastic for the\nmoney. It was easy to set-up, streams great via their app, has night vision,\nand you can access the camera streams via \u003ca href=\"https://en.wikipedia.org/wiki/Real-Time_Streaming_Protocol\"\u003eRTSP\u003c/a\u003e should be so inclined (which\nI am).\u003c/p\u003e\n\u003cp\u003eI was tempted to buy another, but the price shot back up to ~£23 until it then\nplummeted back down to £15.99. Yes, please! Snapped up another.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://hackaday.io/project/204509-zicada-diy-zigbee-multisensor\"\u003eZicada - DIY Zigbee Multisensor\u003c/a\u003e \u0026ndash; this is a very impressive project.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eZicada is a DIY Zigbee sensor based on Nordic’s nRF52840 SoC. It combines a\ntemperature and humidity sensor with a hall effect switch, making it\nsuitable for both climate and door/window monitoring. Zicada is optimized\nfor ultra-low power consumption, running at just 6µW in standby. This allows\nit to operate on a rechargeable AAA battery for 2 years or longer. It is\nfully compatible with Home Assistant (ZHA) and Zigbee2MQTT.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eDesigned an electronic circuit. Designed a PCB and had it manufactured. Hand\nsoldered. Built, designed and 3D-printed an enclosure. Wrote the software from\nscratch. Impressive stuff ✅\u003c/p\u003e\n\u003cp\u003eI might try and build one of these one day. It might be a fun addition to my\nHome Assistant shenanigans.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWould you believe it, the people who were ignoring my emails are now trying to\nbe my best friend with multiple emails from them in quick succession. \u003ca href=\"/weeknotes/229-wildly-inefficient/#:~:text=PayPal%20dispute\"\u003eThe\nsystem works\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003ePayPal with credit card hooked up is my new jam for certain purchases.\nAccording to Monzo you get 120 days to claim a chargeback from a company,\nsomething I\u0026rsquo;ve never done, but it\u0026rsquo;s nice to know you might able to.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eComplaining is easy and I do it often. Here is an example of good service:\nFastmail support. They got back to me quickly and were helpful. Even if the\nsolution to my problem was \u0026ldquo;turn if off and on again\u0026rdquo; aka uninstall/reinstall\nthe app. It is possible.\u003c/p\u003e\n\u003cp\u003e(Still managed a small complaint 😉)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThere was bloomin\u0026rsquo; snow this week. It was a shock to go from unseasonably (is\nthat even a thing any more?) warm weather for this time of year to \u0026ldquo;feels\nlike\u0026rdquo; temperatures of -7. I even wore my thermals!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.home-assistant.io/blog/2025/11/19/home-assistant-connect-zbt-2/\"\u003eThe best gets better - Home Assistant Connect ZBT-2\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe easiest way to start with Zigbee or Thread just got even better, with\nHome Assistant Connect ZBT-2. This USB adapter plugs into your Home\nAssistant system and opens up a world of smart device options.”\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI have no use for this at the moment but it looks like an low effort way to\nget into Home Automation with Home Assistant.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/news/823788/europe-cookie-prompt-browser-changes-proposal\"\u003eEurope’s cookie nightmare is crumbling\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe sheer amount of cookie pop-ups across Europe means people often just\nclick any button to get access to a website, simply because of the annoyance\ninstead of worrying about their privacy. \u0026ldquo;This is not a real choice made by\ncitizens to protect their phones or computers and to choose what happens to\ntheir data,” says the European Commission.\u0026rdquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://knowyourmeme.com/memes/you-dont-say--3\"\u003enick-cage-you-dont-say.gif\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ePlease make the popups stop. Anything to make them stop.\u003c/p\u003e\n\u003cp\u003e(And before you say, use this browser extension or that - when a website\ndoesn\u0026rsquo;t work for no apparent reason in six months time, do you remember that\nit might be your popup killer? I don\u0026rsquo;t)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.cloudflare.com/18-november-2025-outage/\"\u003eCloudflare outage on November 18, 2025\u003c/a\u003e \u0026ndash; Don\u0026rsquo;t \u003ca href=\"https://blog.cloudflare.com/18-november-2025-outage/#:~:text=unwrap()\"\u003e\u003ccode\u003eunwrap\u003c/code\u003e\u003c/a\u003e your production\ncode, kids (\u003ca href=\"https://www.youtube.com/watch?v=sJBaMJfxzYk\"\u003enice explanation from ThePrimegean\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe combination of Black Friday, Amazon, and the discovery that you get a 2%\ndiscount for \u0026ldquo;no rush delivery\u0026rdquo; might not have been good for my wallet, but it\nis good for my inner prepper. Let\u0026rsquo;s just say we\u0026rsquo;ll be happily washing our\ndishes and clothes into April 2026. And the cost per wash is a regular\ncalculation I am now very familiar with.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt happened. I bought a \u003ca href=\"https://bambulab.com/en-gb/a1\"\u003e3D printer\u003c/a\u003e. Fuck.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMy advice, \u003ca href=\"/weeknotes/229-wildly-inefficient/#:~:text=use%20the%20NHS%20this%20week\"\u003enever get sick\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother example of a broken web. Why do you go to IKEA\u0026rsquo;s website? Is it to\nread the latest news on the world famous IKEA meatball (that is a real\nexample!)? No, it’s to browse and purchase the products IKEA sell. Which part\nof the home page loads last on ikea.com? You guessed it, the link to\ntheir online store. Absolute madness.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOnce again, \u003ca href=\"https://github.com/gohugoio/hugo/pull/14091\"\u003eyou are welcome\u003c/a\u003e.\u003c/p\u003e",
      "date_published": "2025-11-23T00:00:00+00:00",
      "date_modified": "2025-11-23T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/229-wildly-inefficient/",
      "url": "https://elver.me/weeknotes/229-wildly-inefficient/",
      "title": "Weeknotes 229: Wildly inefficient",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNo Game Boy news this week. Waiting on parts. You\u0026rsquo;re welcome.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.juliensauctions.com/en/auctions/the-jim-henson-company-70th-anniversary-auction\"\u003eWould you like to own a muppet?\u003c/a\u003e (via \u003ca href=\"https://simplebits.com/notebook/studio-notes-57/\"\u003eSimple Bits\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe had cause to use the NHS this week. The first doctor we saw was fantastic.\nShe was empathetic, and seemed to really care. The system seems wildly\ninefficient though. The doctor navigated the bureaucracy in order to arrange\nan ultrasound, which necessitated moving departments, which meant giving all\nthe \u003cem\u003esame\u003c/em\u003e information a second time, and performing all the \u003cem\u003esame\u003c/em\u003e tests\nagain. And then no scan. We will have to wait and see what happens 😬\u003c/p\u003e\n\u003cp\u003eAs a nation, we accept wild inefficiency readily. Like a national past time.\nThe NHS is something to be very proud of, but you can love something whilst\npointing out it\u0026rsquo;s failings (thanks Mum 👋). How else can we make it better?\u003c/p\u003e\n\u003cp\u003eI really hope I never get something that needs serious medical attention.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://rachelkickdesign.com/products/national-forest-font-duo-1\"\u003eNational Forest Font Duo\u003c/a\u003e \u0026ndash; Look at this beaut 😍\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI bought and wrote all my Christmas cards this week. What an arsehole. Peak\nprocrastination.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDo you \u003ca href=\"/weeknotes/195-funky-town/#:~:text=Say%20that%20you%20were%20becoming%20border%2Dline%20obsessed%20with%20sourcing%20a%20Zigbee%2Dcapable%20smart%20power%20socket\"\u003eremember when I was obsessed\u003c/a\u003e with procuring the \u003ca href=\"https://www.ikea.com/gb/en/p/inspelning-plug-smart-energy-monitor-80569842/\"\u003eIKEA INSPELNING\u003c/a\u003e for\nits energy tracking capabilities at a very affordable price? I was browsing\nunrelated items on IKEA\u0026rsquo;s website and it popped up. Curiosity got the best of\nme and can you believe it, IN STOCK. I may have bought too many, but soon I\nwill know when I will be financially ruined by \u003ca href=\"/weeknotes/222-humble-tumble/#:~:text=We%20bought%20a%20tumble%20dryer%20and%20it%E2%80%99s%20changing%20our%20lives\"\u003ethe tumble dryer\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA sticker shop wanted to charge me £17 to send a sticker to the UK.\u003c/p\u003e\n\u003cp\u003eA sticker. SEVENTEEN POUNDS.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about \u003ca href=\"https://en.wikipedia.org/wiki/3DBenchy\"\u003e3DBenchy\u003c/a\u003e. 3DBenchy is a 3D model designed to test the capabilities\nof 3D printers. It nearly disappeared in 2024 due to a company acquisition\n(\u003ca href=\"https://www.thingiverse.com/thing:6907169\"\u003e3D Boaty\u003c/a\u003e was created in response \u0026ndash; it\u0026rsquo;s not a boat) but was \u003ca href=\"https://www.nti-group.com/home/news/3dbenchy/\"\u003esubsequently\nrelicensed into the public domain\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=mDNM5X7__l4\"\u003e\u0026ldquo;I haven\u0026rsquo;t been this excited in YEARS\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eNo way around it, this is cool.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.zsa.io/diy-silicone-wrist-rest/\"\u003eDIY Moonlander Wrist Rest Pad\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve never worked with silicone before, and I definitely don\u0026rsquo;t have all the\nequipment needed to get the best results possible - but even with the basics\nI\u0026rsquo;m quite happy with how these turned out.”\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/alexpasmantier/television\"\u003eTelevision\u003c/a\u003e \u0026ndash; \u0026ldquo;A fast and hackable fuzzy finder for the terminal.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t need a new fuzzy finder. I don\u0026rsquo;t need a new fuzzy finder.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI raised my first ever PayPal dispute this week \u0026ndash; fun times.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNo Game Boy news this week. Waiting on parts. You\u0026rsquo;re welcome.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.juliensauctions.com/en/auctions/the-jim-henson-company-70th-anniversary-auction\"\u003eWould you like to own a muppet?\u003c/a\u003e (via \u003ca href=\"https://simplebits.com/notebook/studio-notes-57/\"\u003eSimple Bits\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe had cause to use the NHS this week. The first doctor we saw was fantastic.\nShe was empathetic, and seemed to really care. The system seems wildly\ninefficient though. The doctor navigated the bureaucracy in order to arrange\nan ultrasound, which necessitated moving departments, which meant giving all\nthe \u003cem\u003esame\u003c/em\u003e information a second time, and performing all the \u003cem\u003esame\u003c/em\u003e tests\nagain. And then no scan. We will have to wait and see what happens 😬\u003c/p\u003e",
      "date_published": "2025-11-16T00:00:00+00:00",
      "date_modified": "2025-11-16T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/228-all-my-friends/",
      "url": "https://elver.me/weeknotes/228-all-my-friends/",
      "title": "Weeknotes 228: All my friends",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMy latest trip down South was successful and restorative \u0026ndash; \u003ca href=\"https://genius.com/Lcd-soundsystem-all-my-friends-lyrics#:~:text=You%20spent%20the%20first%20five%20years%20trying%20to%20get%20with%20the%20plan%0AAnd%20the%20next%20five%20years%20trying%20to%20be%20with%20your%20friends%20again\"\u003eLCD Soundsystem\nwere right\u003c/a\u003e. My usual anxiety about the journey to and fro once again proved\nto be incorrect \u0026ndash; it was fine, with the exception of the upper back soreness\nI got from all the driving. I\u0026rsquo;m looking forward to visiting for the final time\nthis year around Christmas time.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.joshwcomeau.com/animation/linear-timing-function/\"\u003eSprings and Bounces in Native CSS\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe magic of the \u003ccode\u003elinear()\u003c/code\u003e timing function.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been manually uploading torrent files to my web client, one at a time,\nfor far too long. So this week I decided I\u0026rsquo;d had enough and wanted an easy way\nto perform this task. Ideally I wanted something at the macOS system level\nwhere you could right click on the files and choose to Upload.\u003c/p\u003e\n\u003cp\u003eThe \u003ca href=\"https://support.apple.com/en-gb/guide/shortcuts-mac/apdf22b0444c/mac\"\u003eShortcuts\u003c/a\u003e app was what I required. Like Automator before it, creating a\nShortcut, as a programmer, is a frustrating experience where the easiest of\nthings seem very hard, still I got something working as a \u0026ldquo;Quick Action\u0026rdquo; so it\nappears in the right click menu. It runs a \u003cem\u003every small\u003c/em\u003e shell script to upload\nthe selected files using \u003ca href=\"https://en.wikipedia.org/wiki/Secure_copy_protocol\"\u003e\u003ccode\u003escp\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eAlready paying dividends. Chalk it up as one of those things I should\u0026rsquo;ve done\nages ago.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI added a further two working Game Boys to my collection this week, and\nstarted a third, but that is still work in progress.\u003c/p\u003e\n\u003ch4 id=\"game-boy-advance\"\u003eGame Boy Advance\u003c/h4\u003e\n\u003cp\u003eThis is the first finished Game Boy Advance I\u0026rsquo;ve completed. It has a new shell\nand IPS screen. It was straight forward, the only hiccup being closing it\nwhilst getting all the pieces lined up.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/gba-black.jpeg\" alt=\"Refurbished Game Boy Advance in black with colour screen\"\u003e\u003c/p\u003e\n\u003cp\u003eThe shell is \u003cem\u003efine\u003c/em\u003e (a bit on the cheaper end) but the screen is very nice.\u003c/p\u003e\n\u003ch4 id=\"game-boy-dmg\"\u003eGame Boy DMG\u003c/h4\u003e\n\u003cp\u003eThere was more wrong with this one. The sound was dodgy, and would crackle,\nespecially when the volume wheel was used. I was surprised to find that\ncleaning the headphone jack with contact cleaner sorted it.\u003c/p\u003e\n\u003cp\u003eHowever, getting the screen in this one lined up was a nightmare. It\u0026rsquo;s made\ndifficult by not being able to tell if it\u0026rsquo;s in the correct position unless\nit\u0026rsquo;s turned on. And you can\u0026rsquo;t really power it on until you put it together.\nAfter several adjustments I eventually got it.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/dmg-white.jpeg\" alt=\"Refurbished Game Boy DMG in white with yellow screen\"\u003e\u003c/p\u003e\n\u003cp\u003eThis wasn\u0026rsquo;t actually the DMG I intended to work on. I was planning on building\none with a laminated screen to start because it \u003cem\u003eshould\u003c/em\u003e be easier.\nUnfortunately, the screen arrived damaged and I am now being ignored by the\nmanufacturer support, neat.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMore \u003ca href=\"https://github.com/zinefer/zinefer.github.com/pull/571#:~:text=github%3A%20Fix%20typo%20in%20stale%20PR%20message%2008a0679a8%20%40jordelver\"\u003eincalculable contributions\u003c/a\u003e to Open Source.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen I \u003ca href=\"/weeknotes/219-differentiators/#:~:text=New%20keyboard%20time\"\u003ebought the Voyager I\u0026rsquo;m failing to use\u003c/a\u003e of course I decided I should\nimmediately pimp it out with a \u003ca href=\"https://3dkeycap.com/products/keycap-tilting-kit\"\u003ekeycap tilting kit\u003c/a\u003e so that I could angle the\nkeycaps in a more comfortable way so when I\u0026rsquo;m not using it I don\u0026rsquo;t get RSI.\u003c/p\u003e\n\u003cp\u003eThe kit took over \u003cem\u003e6 weeks\u003c/em\u003e to arrive for reasons. The primary one being that\nthe shipping tracking was non-existent which meant it sat at the Post Office\nfor weeks before being returned to sender \u0026ndash; but at least not \u003ca href=\"/weeknotes/227-game-boy-week/#:~:text=Evri%2C%20that%E2%80%99s%20how\"\u003eEvri\u0026rsquo;s fault\u003c/a\u003e\nthis time.\u003c/p\u003e\n\u003cp\u003eI fitted the kit and it looks pretty swish. I couldn\u0026rsquo;t tell you how they are\nat making me a better typist though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRobby Russell:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://x.com/robbyrussell/status/1984303948103323685?_bhlid=450ad5c1b07af69e5c5ba0108c0433f824a4e82f\"\u003eAnd caring is still the rarest skill in tech.\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAin\u0026rsquo;t that the truth.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://danwebb.net/posts/safety-first/\"\u003eSafety First\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s simpler than that - nine times out of ten, your engineers are scared to\nchange things.\u003c/p\u003e\n\u003cp\u003eEvery deploy gets batched up with loads of changes because deploys are\npainful. Which makes them scarier.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI remember working somewhere where the deploys were done quarterly. The whole\nprocess was framed around reducing risk, when in fact it did the opposite.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://bsky.app/profile/fpsvogel.bsky.social/post/3m4dubxwgmk24?_bhlid=814110c0a6d3a739df41c225f6261254a31201c4\"\u003eHere\u0026rsquo;s a fun bit of Ruby metaprogramming: get the name of the method that\ncalled the current method.\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecaller_locations(\u003cspan style=\"color:#099\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#099\"\u003e1\u003c/span\u003e)\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efirst\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003elabel\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003esplit(\u003cspan style=\"color:#d14\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e)\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003elast\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eHandy.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMy latest trip down South was successful and restorative \u0026ndash; \u003ca href=\"https://genius.com/Lcd-soundsystem-all-my-friends-lyrics#:~:text=You%20spent%20the%20first%20five%20years%20trying%20to%20get%20with%20the%20plan%0AAnd%20the%20next%20five%20years%20trying%20to%20be%20with%20your%20friends%20again\"\u003eLCD Soundsystem\nwere right\u003c/a\u003e. My usual anxiety about the journey to and fro once again proved\nto be incorrect \u0026ndash; it was fine, with the exception of the upper back soreness\nI got from all the driving. I\u0026rsquo;m looking forward to visiting for the final time\nthis year around Christmas time.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.joshwcomeau.com/animation/linear-timing-function/\"\u003eSprings and Bounces in Native CSS\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe magic of the \u003ccode\u003elinear()\u003c/code\u003e timing function.\u003c/p\u003e",
      "date_published": "2025-11-09T00:00:00+00:00",
      "date_modified": "2025-11-09T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/227-game-boy-week/",
      "url": "https://elver.me/weeknotes/227-game-boy-week/",
      "title": "Weeknotes 227: Game Boy week",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.techspot.com/news/110075-google-pulls-plug-first-second-gen-nest-thermostats.html\"\u003eGoogle pulls the plug on first and second gen Nest Thermostats\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAffected devices have been unpaired and removed from the Nest app\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI have a 3rd Generation model so I guess I\u0026rsquo;m next.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFrom Helen Lewis: \u003ca href=\"https://www.theatlantic.com/ideas/archive/2025/10/fear-laughing-riyadh-comedy-louis-ck/684527/\"\u003eI Watched Stand-Up in Saudi Arabia\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBurr’s words reflect the bland incuriosity that accrues with wealth. As I\nate dinner one night at the Ritz-Carlton, in a Chinese restaurant\noverlooking the indoor swimming pool, I reflected that the promise of a\nfive-star hotel is insulation, a cocoon against the outside world. A rich\nperson—a successful comedian, say—could glide from the business-class lounge\nto the front of the aircraft to an air-conditioned limo to a luxury hotel\nwhere your dinner is interrupted by five different people asking if\neverything is okay. Live enough days like this, and the whole world becomes\nyour bellhop. No wonder these guys like Saudi Arabia. The way that daily\nlife bends around rich people is that little bit more obvious here.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Paradox_of_tolerance\"\u003eParadox of tolerance\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe paradox of tolerance is a philosophical concept suggesting that if\na society extends tolerance to those who are intolerant, it risks enabling\nthe eventual dominance of intolerance, thereby undermining the very\nprinciple of tolerance.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI had never heard of this before.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://afomera.dev/posts/2025-10-25-stop-giving-harm-a-microphone\"\u003eStop Giving Harm a Microphone\u003c/a\u003e \u0026ndash; I thought this was a very reasonable and\nfair take.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRant about notification/message read/unread state forthcoming (skip if I were\nyou).\u003c/p\u003e\n\u003cp\u003eNearly every mobile app I use which has some sort of notification or message\nread state cannot get it right in various ways.\u003c/p\u003e\n\u003cp\u003eYou get a message from Vinted. You click on it, you read it. The read state\ndoes not change. It goes away at some point in the future. Maybe. Hopefully.\u003c/p\u003e\n\u003cp\u003eMy banking app prompts to authorize a transaction (good), I click the\nnotification and authorize, it completes. It shows a notification for the\nthing I \u003cem\u003ejust\u003c/em\u003e did as unread. I must go to the \u0026ldquo;notifications\u0026rdquo; icon and\nmanually clear it. Every time.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eAside:\u003c/em\u003e I think this likely regulatory ass-covering, so they can say that\nthey notified you despite, in modern iOS, having scanned your face!\u003c/p\u003e\n\u003cp\u003eIn other apps there will be notification badge but absolutely no sign of\nanything to \u0026ldquo;read\u0026rdquo; in the app. You have to stab around amongst the screens in\nan attempt to clear it. Is this some sort of \u0026ldquo;engagement\u0026rdquo; dark pattern or just\nregular incompetence?\u003c/p\u003e\n\u003cp\u003eContinue\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.mcsweeneys.net/articles/hi-its-me-wikipedia-and-i-am-ready-for-your-apology\"\u003eHi, It’s Me, Wikipedia, and I Am Ready for Your Apology\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn a few years, you\u0026rsquo;ll say, \u0026ldquo;Wow, look, a human being who can read.\u0026rdquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e😆\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/224-one-for-my-therapist/#:~:text=I%20am%20making%20a%20comeback\"\u003eI told you I was going to get back to my Game Boy hobby\u003c/a\u003e didn\u0026rsquo;t I.\u003c/p\u003e\n\u003ch4 id=\"a-dead-dmg\"\u003eA dead DMG\u003c/h4\u003e\n\u003cp\u003eFirst up, I brought a Game Boy DMG back to life. It was not turning on at all.\nThis was easily rectified with new battery terminals, the originals were\ncorroded. I will decide what to do with it later, but I suspect it will get\nthe full replace-all-the-things treatment.\u003c/p\u003e\n\u003ch4 id=\"game-boy-pocket-1\"\u003eGame Boy Pocket 1\u003c/h4\u003e\n\u003cp\u003eThis bolstered my confidence, and due to having the most success with the DMGs\nand Game Boy Pockets (they\u0026rsquo;re basically the same console), I turned my\nattention to a GBP next. I re-shelled it and gave it a new IPS screen. It came\nout well I think.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/gbp-dmg.jpeg\" alt=\"Refurbished Game Boy Pocket in original DMG style\"\u003e\u003c/p\u003e\n\u003cp\u003eThere is one small imperfection which you can\u0026rsquo;t really see unless you go\nlooking for it. In the top right corner of the new screen there is a slight\nbleed, but it is obscured by the lens, so not a massive deal. I\u0026rsquo;m not sure if\nit came this way or due to my installation.\u003c/p\u003e\n\u003ch4 id=\"game-boy-pocket-2\"\u003eGame Boy Pocket 2\u003c/h4\u003e\n\u003cp\u003eThe next one was trickier.\u003c/p\u003e\n\u003cp\u003eIt was D.O.A. and showed no sign of life. However, upon opening it up it\nseemed fairly obvious what the problem might be. One of the battery terminals,\nand the capacitor next to it, were corroded. Replacing both was in order.\u003c/p\u003e\n\u003cp\u003eRemoving the corroded battery terminal was straight forward. Sadly when I\nremoved the capacitor one of the pads came with it \u0026ndash; this was now an\nopportunity for some trace repair. I\u0026rsquo;ve done this before, but unsuccessfully.\u003c/p\u003e\n\u003cp\u003eBy happenstance I had watched a YouTube video on this recently, and the\ntechniques shown seemed like they might fix the issue I had last time I tried\nthis.\u003c/p\u003e\n\u003cp\u003eThere are various ways to fix pads/traces, but what I tried last time was to\nuse adhesive copper tape stuck to the board to replace the missing pad. You\ncan then solder to the new copper tape. This part went well but as soon as I\ntried soldering to it the adhesive melted and it started moving around 😭 The\nvideo showed a very similar approach but they covered the copper tape with\n\u003ca href=\"https://en.wikipedia.org/wiki/Solder_mask\"\u003esolder mask\u003c/a\u003e and, once cured, ground it back with a grinding pen to reveal\n\u003cem\u003esome\u003c/em\u003e of the copper. The solder mask helps to keep the copper tape in-place.\nI\u0026rsquo;m learning (Ralf Wiggum gif).\u003c/p\u003e\n\u003cp\u003eI could then solder a new capacitor into place, and it sprung back to life ✅\u003c/p\u003e\n\u003cp\u003eI re-shelled it and installed an IPS screen, and closed it all up. Done.\u003c/p\u003e\n\u003cp\u003eThen I realised I had forgotten to hook up the touch sensor for the screen\nbefore closing it up. I would need to open it back up and stick it on.\u003c/p\u003e\n\u003cp\u003eAll the screws but one came out, but the final one wouldn\u0026rsquo;t budge, and I\nstripped it fairly quickly. I Googled for solutions and tried suggestions of\nusing a rubber band, latex glove, and super glue to increase purchase on it.\nEventually I managed to remove it using a shitty free screwdriver that came\nfree with something or other. Thanks shitty old screwdriver. I don\u0026rsquo;t think the\nfree screws you get with kits can be trusted.\u003c/p\u003e\n\u003cp\u003eAnd here is the finished product.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/gbp-white.jpeg\" alt=\"Refurbished Game Boy Pocket in white\"\u003e\u003c/p\u003e\n\u003cp\u003eThe screen on this one is 100% perfecto.\u003c/p\u003e\n\u003ch4 id=\"gba-motherboard-replacement\"\u003eGBA motherboard replacement\u003c/h4\u003e\n\u003cp\u003eFull of optimism I moved onto a project that\u0026rsquo;s been sitting on the back burner\nfor a while \u0026ndash; a complete \u003ca href=\"https://funnyplaying.com/products/gba-custom-upgraded-motherboard-replacement\"\u003e3rd party replacement motherboard\u003c/a\u003e. This board is\nmore or less completely new hardware, with almost everything upgraded from the\noriginal console. You just need to supply original CPU and RAM chips.\u003c/p\u003e\n\u003cp\u003eI needed to de-solder the CPU and RAM from a non-working GBA, and transplant\nthem onto the new board. This was an opportunity to use the new \u0026ldquo;low-melt\u0026rdquo;\nsolder I recently purchased (which I talk about more in \u003cem\u003efascinating\u003c/em\u003e detail\nbelow).\u003c/p\u003e\n\u003cp\u003eI felt ready to attempt this. Well, it went a bit wrong and I was left with\nconsole which booted but only showed vertical lines on the screen 😬 I\nverified that the screen worked with another console to rule it out.\u003c/p\u003e\n\u003cp\u003e✅ The good parts\u003c/p\u003e\n\u003cp\u003eI used hot air and my new found love of \u0026ldquo;low-melt\u0026rdquo; solder to very easily\nremove the CPU and RAM from the donor board. I was not expecting this part to\nbe easy as I have tried similar before and it was frustratingly tricky.\u003c/p\u003e\n\u003cp\u003eSoldering the RAM to the new board was seemingly straightforward too and I was\npleased with the job I did on this.\u003c/p\u003e\n\u003cp\u003e❌ The less good parts\u003c/p\u003e\n\u003cp\u003eThe legs on the CPU are very delicate and easily bent. This makes lining them\nup on the board to re-solder fairly intricate. And this is where it went\nwrong. On three sides it went well, but on the fourth lining up and soldering\nthe legs became a bit of a mess and I ended up lifting one of the pads onto\nwhich I needed to solder a leg (you may have noticed a pattern here). This\nnecessitated more trace repair, which I completed but wasn\u0026rsquo;t happy about given\nthat this was a brand new board.\u003c/p\u003e\n\u003cp\u003eAt the moment I am unsure what is wrong with it. One of the main issues is\nthat I don\u0026rsquo;t actually \u003cem\u003eknow\u003c/em\u003e that the CPU and RAM chips work as I\u0026rsquo;ve never\nseen them working \u0026ndash; they came from a non-working console.\u003c/p\u003e\n\u003cp\u003eFor now this project is on hiatus. I will revisit.\u003c/p\u003e\n\u003ch4 id=\"in-conclusion\"\u003eIn conclusion\u003c/h4\u003e\n\u003cp\u003eA pretty successful week on the whole. Can\u0026rsquo;t complain too much.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/Gaurav-Gosain/tuios\"\u003eTUIOS - Terminal UI Operating System\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTUIOS is a terminal-based window manager that provides a modern, efficient\ninterface for managing multiple terminal sessions\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eInteresting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been meaning to buy some “low-melt\u0026quot; solder for a while. It has it\u0026rsquo;s\ncritics, but I am a complete convert for the task which it is intended for.\u003c/p\u003e\n\u003cp\u003eThe idea behind \u0026ldquo;low-melt\u0026rdquo; solder is that it melts easily. You apply it to\nexisting, usually unleaded, solder in order to alter the chemistry and bring\ndown the overall melting point of the existing solder joint. Once you\u0026rsquo;ve done\nthat you can heat the whole thing far more easily, at lower temperatures,\nwhich allows safe removal of components. Especially useful for those with\nmultiple points of connection to the board.\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;low melt\u0026rdquo; is not intended for making new solder joints, only removal. After\nyou\u0026rsquo;ve used it to remove components you should completely clear it up, and use\nregular solder of your choice for making new joints.\u003c/p\u003e\n\u003cp\u003eI used \u0026ldquo;low melt\u0026rdquo; to remove the CPU and RAM chips from a GBA using hot air and\nit made the process way easier than I was anticipating. First I applied flux\nto the existing chips legs, then low melt \u0026ndash; it\u0026rsquo;s quite finicky and difficult\nto apply \u0026ndash; and then came back with hot air to re-melt and remove.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWith Game Boy action comes complaining about delivery services. How can I get\nsomething delivered, for free (I know it\u0026rsquo;s built-in, but humour me), from\nChina quicker than something from eBay in the UK?\u003c/p\u003e\n\u003cp\u003eEvri, that\u0026rsquo;s how 🤡\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://basicappleguy.com/basicappleblog/the-airpods-pro-3-flight-problem\"\u003eThe AirPods Pro 3 Flight Problem\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTesting Apple’s latest noise-cancelling earbuds at 39,000 feet reveals a\npotential flaw most users won\u0026rsquo;t notice, until they fly.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI hope this issue is not universal. It might be prudent to take my AirPod Pro\n2s on my next flight.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.techspot.com/news/110075-google-pulls-plug-first-second-gen-nest-thermostats.html\"\u003eGoogle pulls the plug on first and second gen Nest Thermostats\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAffected devices have been unpaired and removed from the Nest app\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI have a 3rd Generation model so I guess I\u0026rsquo;m next.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFrom Helen Lewis: \u003ca href=\"https://www.theatlantic.com/ideas/archive/2025/10/fear-laughing-riyadh-comedy-louis-ck/684527/\"\u003eI Watched Stand-Up in Saudi Arabia\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBurr’s words reflect the bland incuriosity that accrues with wealth. As I\nate dinner one night at the Ritz-Carlton, in a Chinese restaurant\noverlooking the indoor swimming pool, I reflected that the promise of a\nfive-star hotel is insulation, a cocoon against the outside world. A rich\nperson—a successful comedian, say—could glide from the business-class lounge\nto the front of the aircraft to an air-conditioned limo to a luxury hotel\nwhere your dinner is interrupted by five different people asking if\neverything is okay. Live enough days like this, and the whole world becomes\nyour bellhop. No wonder these guys like Saudi Arabia. The way that daily\nlife bends around rich people is that little bit more obvious here.\u003c/p\u003e",
      "date_published": "2025-11-02T00:00:00+00:00",
      "date_modified": "2025-11-02T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/226-am-i-a-real-boy/",
      "url": "https://elver.me/weeknotes/226-am-i-a-real-boy/",
      "title": "Weeknotes 226: Am I a real boy?",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe went to see \u003ca href=\"https://www.setlist.fm/setlist/the-divine-comedy/2025/york-barbican-york-england-7b59dac4.html\"\u003eThe Divine Comedy\u003c/a\u003e as planned. They were fantastic and played\n\u003cem\u003emost\u003c/em\u003e of the hits I wanted to hear 👏\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur \u003ca href=\"/weeknotes/225-vat-of-bolognaise/#:~:text=then%20have%20friends%20visiting%20at%20the%20weekend\"\u003efriends visited as planned\u003c/a\u003e and we took the opportunity to take them to\nWhitby for the day. We hadn\u0026rsquo;t been there before either. It was \u003cem\u003every\u003c/em\u003e windy\nand \u003cem\u003every\u003c/em\u003e cold, which did somewhat dampen our experience. Still, it was nice\nenough and we had fish and chips which is the law when you visit Whitby.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.yellowduck.be/posts/comparing-gps-coordinates-in-elixir\"\u003eComparing GPS coordinates in Elixir\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen working with GPS data, comparing two coordinates directly is\nunreliable. Due to natural precision loss and device variations, even two\nreadings from the same spot can differ slightly in latitude and longitude.\nInstead of checking for equality, you should compare their distance — for\nexample, ensuring they’re within a few meters of each other.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/barodeur/llm_rescuer\"\u003ellm_rescuer\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn 1965, Tony Hoare invented the null reference and later called it his\n\u0026ldquo;billion-dollar mistake\u0026rdquo;. Well, we\u0026rsquo;re here to fix it by potentially spending\na billion dollars in OpenAI API tokens! 💸\u003c/p\u003e\n\u003cp\u003eBecause clearly, the best way to solve a problem caused by the absence of a\nvalue is to throw artificial intelligence at it until it hallucinates a\nreasonable response. What could possibly go wrong?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://overtype.dev/\"\u003eOverType\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOverType is a transparent textarea over rendered markdown. Plain text\nsimplicity, WYSIWYG beauty, zero complexity.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA way in which I used AI this week.\u003c/p\u003e\n\u003cp\u003eI was shopping \u003cem\u003eon-liiine\u003c/em\u003e and there were many variations of the same product.\nSome were larger, some smaller. Some came with an extra battery. Etc etc. The\nthing is each variation was on a separate web page, and I was dealing with\nsome of the most inconsistent \u0026ldquo;web design\u0026rdquo; possible. Very bad websites. The\nsort of website where you would ordinarily just go somewhere else to buy it.\nUnfortunately these products are only sold in a few places and this was the\nleast worst option.\u003c/p\u003e\n\u003cp\u003eI could not make head nor tail of what I was looking at.\u003c/p\u003e\n\u003cp\u003eSo, I asked Claude.\u003c/p\u003e\n\u003cp\u003eI gave it the URLs to compare and it downloaded them and summarised the\ndifferences. It wasn\u0026rsquo;t perfect by any means but it dragged me out of the\nanalysis paralysis I was stuck in, and my credit card is thankful for the\nopportunity to spend once more.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn the last week I have been working on my note-taking approach for Neovim\nsome more and even had moments of enjoyment writing Lua. I may not be\ncompletely lost.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.gyford.com/phil/writing/2025/10/15/1995-internet/\"\u003eMy first months in cyberspace\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt was a miracle and it changed my life. All of our lives. Not always for\nthe better: even those of us who were, at times, slightly cynical early on\nwere naive about how ruthlessly and literally carelessly businesses would\nturn the technologies to their own narrow ends.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eOh, the nostalgia! I missed out on quite a lot of this \u0026ndash; I never Gophered, or\nused Finger, and only became aware of Usenet in terms of warez much later, but\nthe World Wide Web hit me in a similar fashion in circa 1997/98.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.ruby-lang.org/en/news/2025/10/17/rubygems-repository-transition/\"\u003eThe Transition of RubyGems Repository Ownership\u003c/a\u003e \u0026ndash; Definitely seems like the\nright home for Rubygems, despite the obvious damage control.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI tried out \u003ca href=\"/weeknotes/224-one-for-my-therapist/#:~:text=the%20next%20level%20%E2%80%93-,bottled%20inks,-.%20Why%20am%20I\"\u003ethe bottled ink for my fountain pen\u003c/a\u003e this week. I was expecting\nto make a right ol\u0026rsquo; mess during the filling process, but it was surprisingly\ndisaster-free. I filled the \u003ca href=\"https://www.lamy.com/en-gb/p/lamy-z-28-converter\"\u003eZ28 Converter\u003c/a\u003e for \u003ca href=\"https://www.lamy.com/en-gb/p/lamy-safari-fountain-pen/54912095256920\"\u003eLamy Safari\u003c/a\u003e with \u003ca href=\"https://www.diamineinks.co.uk/products/diamine-80ml-fountain-pen-ink-imperial-purple\"\u003eImperial\nPurple from Diamine\u003c/a\u003e \u0026ndash; lovely colour.\u003c/p\u003e\n\u003cp\u003eThe ink seems to flow very well, perhaps \u003cem\u003etoo\u003c/em\u003e well. I might have to change\nback to a finer nib to see what the difference is.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not sure what the correct term is, but I\u0026rsquo;m still finding that occasionally\nI miss parts of the stroke when writing certain letters. I had considered that\nmaybe this was an ink flow problem, but it could also be the pen, or, heaven\nforbid, me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://allaboutcoding.ghinda.com/how-to-use-pattern-matching-to-locate-elements-in-a-hash-array\"\u003eHow to Use Pattern Matching to Locate Elements in a Hash Array\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI still can\u0026rsquo;t get used to the pattern matching syntax in Ruby.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://island94.org/2025/10/rails-103-early-hints-could-be-better-maybe-doesn-t-matter\"\u003eRails 103 Early Hints could be better, maybe doesn\u0026rsquo;t matter\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;d never heard of the 103 HTTP status code.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI can\u0026rsquo;t actually get 103 Early Hints to be returned all the way to me in any\nof my production environments. Likely because there is a network device,\nreverse proxy, load balancer, CDN, or something that’s blocking them.”\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNever mind 😆 Doesn\u0026rsquo;t matter.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://pawelgrzybek.com/the-css-reset-again/\"\u003eThe CSS Reset, again\u003c/a\u003e \u0026ndash; I learnt a lot of CSS properties from this article.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://sindresorhus.com/menu-drop\"\u003eMenu Drop\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAnother cool little Menu Bar app. I\u0026rsquo;m not sure I AirDrop \u003cem\u003efrom\u003c/em\u003e my Mac enough\nto warrant taking up menu bar space, but it might be worth it to you.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://intertwingly.net/blog/2025/10/12/Capacity-Planning.html\"\u003eCapacity Planning for Multi-Tenant SQLite Applications\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhat do you do when you need to paste some text somewhere before pasting\nsomewhere else? You can open an Apple Note note, or TextEdit document, or\nsomething else?\u003c/p\u003e\n\u003cp\u003eI was thinking about using \u003ca href=\"https://tot.rocks/\"\u003eTot\u003c/a\u003e for this as I find myself doing this more\noften than I thought (perhaps because of LLM usage?), but then I remembered\nthat I am already entrenched in the Raycast ecosystem, and they have a \u003ca href=\"https://www.raycast.com/core-features/notes\"\u003eNotes\nfacility\u003c/a\u003e built in.\u003c/p\u003e\n\u003cp\u003eMy needs as limited at the moment so I will try it out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://youtu.be/JJXEmkTtuUU?si=iCzEBif_-Uu6fdPA\"\u003eHow the UK is fixing its parking app nightmare\u003c/a\u003e \u0026ndash; is this\u0026hellip;\u003ca href=\"https://en.wikipedia.org/wiki/National_Parking_Platform\"\u003eprogress\u003c/a\u003e?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://steveklabnik.com/writing/i-see-a-future-in-jj/\"\u003eI see a future in jj\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ejj is being used in projects as small as individual developers and as large\nas one of the largest monorepos in the world. That’s a big deal. It can show\nthe social proof needed for others to give jj a chance.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve been aware of \u003ca href=\"https://jj-vcs.github.io/jj/latest/\"\u003eJujutsu\u003c/a\u003e for a while, but always thought it would be too\ndifficult to adopt even if it was considerably better than \u003ccode\u003egit\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e(Software doesn\u0026rsquo;t just \u0026ldquo;win\u0026rdquo; by being better. A \u003cem\u003elot\u003c/em\u003e of people thought\n\u003ca href=\"https://www.mercurial-scm.org/\"\u003eMercurial\u003c/a\u003e was nicer to use (still do!), but it did not win.)\u003c/p\u003e\n\u003cp\u003eI really like \u003ccode\u003egit\u003c/code\u003e. When you\u0026rsquo;ve used \u003ca href=\"https://en.wikipedia.org/wiki/Microsoft_Visual_SourceSafe\"\u003eVisual SourceSafe\u003c/a\u003e you \u003cem\u003ewill\u003c/em\u003e like\n\u003ccode\u003egit\u003c/code\u003e \u0026ndash; trust me. It\u0026rsquo;s one of those programs that really changed my developer\nlife. And despite it\u0026rsquo;s clearly poor cli UI.\u003c/p\u003e\n\u003cp\u003eThe fact that \u003ccode\u003ejj\u003c/code\u003e can use git as the \u0026ldquo;backend\u0026rdquo; really does change things.\nWithout that, I would not be even thinking about trying it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI went to see \u003ca href=\"https://www.themoviedb.org/movie/533533-tron-ares\"\u003eTron: Ares\u003c/a\u003e this week on a whim (don\u0026rsquo;t bother, probably). I\nalways get a kick out of seeing real-life commands in films regardless of\ntheir use. This time I spotted \u003ccode\u003esudo systemctl\u003c/code\u003e and \u003ccode\u003esudo killall\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.johnhawthorn.com/2025/searching-ruby-docs/\"\u003eSearching Ruby\u0026rsquo;s documentation\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis documentation (and any documentation built with rdoc 6.15.0 or greater)\nnow can be searched using a query parameter. Check it out!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI am very pleased to see these documentation improvements.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI appreciate that Kagi\u0026rsquo;s \u0026ldquo;bangs\u0026rdquo; are open source and accept contributions\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is also neat, I didn\u0026rsquo;t know \u003ca href=\"https://github.com/kagisearch/bangs/tree/main\"\u003ethese are open\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis has happened quickly! Not \u003ca href=\"https://nataliethenerd.com/products/brick-boy-in-stock-notification\"\u003eone\u003c/a\u003e, but \u003ca href=\"https://www.kickstarter.com/projects/brickboy/brickboy-the-kit-that-makes-the-lego-game-boy-come-alive\"\u003etwo\u003c/a\u003e options to turn the \u003ca href=\"https://www.lego.com/en-gb/product/game-boy-72046\"\u003eLego Game\nBoy\u003c/a\u003e into a real Boy.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe went to see \u003ca href=\"https://www.setlist.fm/setlist/the-divine-comedy/2025/york-barbican-york-england-7b59dac4.html\"\u003eThe Divine Comedy\u003c/a\u003e as planned. They were fantastic and played\n\u003cem\u003emost\u003c/em\u003e of the hits I wanted to hear 👏\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur \u003ca href=\"/weeknotes/225-vat-of-bolognaise/#:~:text=then%20have%20friends%20visiting%20at%20the%20weekend\"\u003efriends visited as planned\u003c/a\u003e and we took the opportunity to take them to\nWhitby for the day. We hadn\u0026rsquo;t been there before either. It was \u003cem\u003every\u003c/em\u003e windy\nand \u003cem\u003every\u003c/em\u003e cold, which did somewhat dampen our experience. Still, it was nice\nenough and we had fish and chips which is the law when you visit Whitby.\u003c/p\u003e",
      "date_published": "2025-10-26T00:00:00+00:00",
      "date_modified": "2025-10-26T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/225-vat-of-bolognaise/",
      "url": "https://elver.me/weeknotes/225-vat-of-bolognaise/",
      "title": "Weeknotes 225: Vat of Bolognaise",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/224-one-for-my-therapist/#:~:text=My%20car%20goes%20into%20the%20garage%20next%20week\"\u003eThe car\u003c/a\u003e seems to have developed \u0026ldquo;a noise\u0026rdquo; since going to garage. Good times.\nNever try.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitchellh.com/writing/building-large-technical-projects\"\u003eMy Approach to Building Large Technical Projects\u003c/a\u003e \u0026ndash; Writing a terminal\nemulator from scratch has got to be up there in terms of both large and\ncomplex. Impressive.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSuch is the progress of the LLM landscape, that as soon as I\u0026rsquo;d finished\nreading \u003ca href=\"https://blog.fsck.com/2025/10/05/how-im-using-coding-agents-in-september-2025/\"\u003eHow I\u0026rsquo;m using coding agents in September, 2025\u003c/a\u003e I moved straight onto\n\u003ca href=\"https://blog.fsck.com/2025/10/09/superpowers/\"\u003eSuperpowers: How I\u0026rsquo;m using coding agents in October 2025\u003c/a\u003e and it had\nprogressed even more.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI find that AI models are especially prone to handing me walls of text when\nthey think they\u0026rsquo;re \u0026ldquo;done\u0026rdquo;.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMe too. I really need to work on prompting Claude to behave as I want. I find\nthe walls of text pretty overwhelming a lot of the time.\u003c/p\u003e\n\u003cp\u003eSome interesting tips in these two articles. I feel that I am at the \u0026ldquo;ask\nquestions and hope\u0026rdquo; stage of using LLMs.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://simonwillison.net/2025/Oct/16/claude-skills/\"\u003eClaude Skills are awesome, maybe a bigger deal than MCP\u003c/a\u003e 😩\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome Christmas activity this week. Trips planned. Lists made.\u003c/p\u003e\n\u003cp\u003eI am part of the problem.\u003c/p\u003e\n\u003cp\u003eHere follows some old codger statements: 1) Blimey, Christmas stuff in the\nshops already, it should be banned! 2) Seems like we only just had Christmas,\ndoesn\u0026rsquo;t it come around quickly?!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;Codger\u0026rdquo; \u0026ndash; great word. Pleased with that.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ewaldbenes.com/en/blog/reveal-software-complexity\"\u003eUnderstanding why people underestimate software complexity\u003c/a\u003e \u0026ndash; Some good\nexamples of complexity in software.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://hexos.com/blog/introducing-zfs-anyraid-sponsored-by-eshtek\"\u003eIntroducing ZFS AnyRaid\u003c/a\u003e \u0026ndash; this sounds awesome if it comes to fruition. File\nsystem advancements don\u0026rsquo;t feel like the sort of thing you \u003cem\u003ecan\u003c/em\u003e rush, nor\nshould you. The TLDR is that you will be able to mix and match different sized\ndisks when this is implemented.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.amazon.co.uk/dp/B07ZH5V89T\"\u003eDSLRKIT DC 5V 2.4A Active PoE Splitter Power Over Ethernet 802.3af 5.5x2.1mm\u003c/a\u003e\n\u0026ndash; I saw this mentioned on Reddit and I can see myself using one of these\nsoon-ish. It allows you to make devices that require a 5V DC plug PoE-capable.\nThe use-case for me being a \u003ca href=\"https://www.philips-hue.com/en-gb/p/hue-bridge/8719514342583\"\u003ePhilips Hue Bridge\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn order to try and stay on the straight and narrow weight-wise, and to make\ndinner times easier during Winter, I made an unholy amount of Bolognaise on\nSaturday. So much Bolognaise in fact that we had issues fitting it in the\nfreezer 🥶 \u0026ndash; bye, bye, sausages from 2023 👋\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/bolognaise.jpg\" alt=\"A massive vat of Bolognaise sauce\"\u003e\u003c/p\u003e\n\u003cp\u003eThis is me adding a \u003cem\u003elittle bit\u003c/em\u003e of cheese. Just a smidge.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/CrankBoyHQ/crankboy-app\"\u003eCrankBoy\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA full-speed Game Boy emulator for Playdate\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWhat some people come up with. Superb.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAn unusually full weekend, sometimes it goes like that. On Friday night we\ntravelled over to Hull to see \u003ca href=\"https://en.wikipedia.org/wiki/Nick_Helm\"\u003eNick Helm\u003c/a\u003e; always worth it. Then on Saturday,\nover to Sheffield to see a concert of the music of the Lord of the Rings, Game\nof Thrones etc. We were sandwiched in between two groups of cretins in\nSheffield, such is life.\u003c/p\u003e\n\u003cp\u003eNext week we are seeing \u003ca href=\"https://en.wikipedia.org/wiki/The_Divine_Comedy_(band)\"\u003eThe Divine Comedy\u003c/a\u003e, and then have friends visiting at\nthe weekend. Busy!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/224-one-for-my-therapist/#:~:text=My%20car%20goes%20into%20the%20garage%20next%20week\"\u003eThe car\u003c/a\u003e seems to have developed \u0026ldquo;a noise\u0026rdquo; since going to garage. Good times.\nNever try.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitchellh.com/writing/building-large-technical-projects\"\u003eMy Approach to Building Large Technical Projects\u003c/a\u003e \u0026ndash; Writing a terminal\nemulator from scratch has got to be up there in terms of both large and\ncomplex. Impressive.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSuch is the progress of the LLM landscape, that as soon as I\u0026rsquo;d finished\nreading \u003ca href=\"https://blog.fsck.com/2025/10/05/how-im-using-coding-agents-in-september-2025/\"\u003eHow I\u0026rsquo;m using coding agents in September, 2025\u003c/a\u003e I moved straight onto\n\u003ca href=\"https://blog.fsck.com/2025/10/09/superpowers/\"\u003eSuperpowers: How I\u0026rsquo;m using coding agents in October 2025\u003c/a\u003e and it had\nprogressed even more.\u003c/p\u003e",
      "date_published": "2025-10-19T00:00:00+00:00",
      "date_modified": "2025-10-19T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/224-one-for-my-therapist/",
      "url": "https://elver.me/weeknotes/224-one-for-my-therapist/",
      "title": "Weeknotes 224: One for my therapist",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis is probably one for my therapist, but I genuinely screamed at my printer\nthis week. A proper, guttural, scream. You\u0026rsquo;ve guessed it, it would not print.\u003c/p\u003e\n\u003cp\u003eIt wouldn\u0026rsquo;t print because it was not connected to the network. I couldn\u0026rsquo;t work\nout why until the next day when I noticed that my Kindle was also offline. The\nprinter and Kindle would not connect to the network but all the other devices\nin the house seemed to be fine \u0026ndash; strange. Then I realised that those two\ndevices only work on 2.4GHz WiFi, whilst the everything else can work on both\n2.4GHz \u003cem\u003eand\u003c/em\u003e 5GHz.\u003c/p\u003e\n\u003cp\u003e2.4GHz WiFi was not working for some reason. A reboot of the router fixed the\nissue. Computers, man.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitchellh.com/writing/non-trivial-vibing#user-content-fn-7\"\u003eVibing a Non-Trivial Ghostty Feature\u003c/a\u003e by Mitchell Hashimoto.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI\u0026rsquo;m regularly asked to share non-trivial examples of how I use AI and\nagentic coding tools and this felt like a golden opportunity to walk through\nmy process with a well-scoped, non-trivial, real-world, shipping feature\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.themoviedb.org/movie/1317149-i-swear\"\u003eI Swear\u003c/a\u003e is worth seeing. I really enjoyed it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s hard to believe but there was even more Ruby drama this week to the point\nwhere I have now lost track. However, I do think Robby Russell is probably\ncorrect when \u003ca href=\"https://robbyonrails.com/articles/2025/10/09/organizations-like-code-deserve-refactoring/#:~:text=No%20one%E2%80%99s%20operating%20with%20the%20full%20picture.%20Not%20the%20board.%20Not%20the%20staff.%20Not%20the%20donors.%20Not%20the%20community.%20Everyone%E2%80%99s%20got%20fragments%20and%20they%E2%80%99re%20trying%20to%20construct%20meaning%20from%20partial%20data.\"\u003ehe says that no one has the full story\u003c/a\u003e. There is some very\nstrange behaviour on all sides it seems to me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNot content with using my off-the-shelf cartridge inks with my fountain pen,\nI\u0026rsquo;m now taking the hobby to the next level \u0026ndash; bottled inks. Why am I doing\nthis? Mainly boredom and the excitement of packages arriving. But also a\ngreater range of colours and inks.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter taking a break from the Game Boy scene, I am making a comeback in time\nfor Christmas (I am sorry 🤮). Prepare for further disappointment, I know I\nam. Money has been spent, orders have been made.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI filled up a whole notebook \u003ca href=\"/weeknotes/219-differentiators/#:~:text=Mine%20has%20turned%20into%20a%20traditional%20journal%20already\"\u003ewith my new journalling habit\u003c/a\u003e this week \u0026ndash; 123\npages of hand-written words. I wouldn\u0026rsquo;t say this is a concrete habit, but I\nhave managed it without a break for over a month. Why is that? Why has this\nstuck relatively easily whilst other habits fall to the wayside?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/223-now-there-are-graphs/#:~:text=Edinburgh%2Dbound%20next%20week\"\u003etrip to Edinburgh\u003c/a\u003e happened and I\u0026rsquo;m glad I made the effort. It was nice\nto catch up with a few friendly faces, and spending a bit of time walking\naround Edinburgh is always worth it. The main attraction, the Scottish Ruby\nmeetup, had two interesting talks on LLMs, and I did learn quite a lot.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy phone has been doing this weird thing recently. When charging, but not\nparticularly low on battery, it will become somewhat unresponsive and begin to\nstutter and lag. The actual UI lags and doesn\u0026rsquo;t seem to receive input.\nUnplugging the charging cable seems to fix things.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t think I\u0026rsquo;ve ever had an iPhone do this in all the years I\u0026rsquo;ve been using\nthem, so it\u0026rsquo;s very strange. I suppose I\u0026rsquo;ll keep an eye on it and make sure I\u0026rsquo;m\nbacked up.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy car goes into the garage next week. Wish me luck.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis is probably one for my therapist, but I genuinely screamed at my printer\nthis week. A proper, guttural, scream. You\u0026rsquo;ve guessed it, it would not print.\u003c/p\u003e\n\u003cp\u003eIt wouldn\u0026rsquo;t print because it was not connected to the network. I couldn\u0026rsquo;t work\nout why until the next day when I noticed that my Kindle was also offline. The\nprinter and Kindle would not connect to the network but all the other devices\nin the house seemed to be fine \u0026ndash; strange. Then I realised that those two\ndevices only work on 2.4GHz WiFi, whilst the everything else can work on both\n2.4GHz \u003cem\u003eand\u003c/em\u003e 5GHz.\u003c/p\u003e",
      "date_published": "2025-10-12T00:00:00+00:00",
      "date_modified": "2025-10-12T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/223-now-there-are-graphs/",
      "url": "https://elver.me/weeknotes/223-now-there-are-graphs/",
      "title": "Weeknotes 223: Now there are graphs",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI had to \u003ca href=\"/weeknotes/104-reboot-my-remote/#:~:text=I%20had%20to%20reboot%20it%20to%20fix%20the%20issue\"\u003ereboot my Apple TV remote again\u003c/a\u003e, same issue as last time, the\nvolume buttons stopped working. It had a good 832 days to be fair.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.jetbrains.com/datagrip/2025/10/01/datagrip-is-now-free-for-non-commercial-use/\"\u003eDataGrip Is Now Free for Non-Commercial Use\u003c/a\u003e \u0026ndash; I remember liking DataGrip\nwhen I used a trial a few years ago. Might be worth a look.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/danmayer/coverband\"\u003eCoverband\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA gem to measure production code usage, showing a counter for the number of\ntimes each line of code is executed. Coverband allows easy configuration to\ncollect and report on production code usage. It reports in the background\nvia a thread, can be used as Rack middleware, or can be manually configured\nto meet any need.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI always forget this tool exists, so noting it here to remember.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.gingerbill.org/article/2025/09/08/package-managers-are-evil/#fn:5\"\u003ePackage Managers are Evil\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI found this article via \u003ca href=\"https://www.youtube.com/watch?v=Rv9q6kW1vOg\"\u003ethe Primeagen video on the most recent npm supply\nchain attack\u003c/a\u003e. It\u0026rsquo;s a very interesting take on package managers that is at\nodds with my own views and I expect the views of most people I know. It has\nbeen thought provoking.\u003c/p\u003e\n\u003cp\u003eWhen I first started getting interested in Elixir I noticed that there was\nmuch more of \u0026ldquo;write it yourself\u0026rdquo; attitude to dependencies. Instead of\nauthentication libraries, they supplied a generator that you could maintain\nyourself (this is different to scaffolding). Coming from Ruby, that was\nsurprising.\u003c/p\u003e\n\u003cp\u003eMaybe we\u0026rsquo;ve gotten this wrong for a long time.\u003c/p\u003e\n\u003cp\u003e(Do you remember when we used to routinely package things such as CSS\nframeworks into gems? \u0026ndash; madness.)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.clever-cloud.com/blog/engineering/2015/05/20/why-auto-increment-is-a-terrible-idea/\"\u003eWhy Auto Increment Is A Terrible Idea\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUse UUIDs as primary keys. They can be freely exposed without disclosing\nsensitive information, they are not predictable and they are performant.\u003c/p\u003e\n\u003cp\u003eAlso, UUIDs being random, you lose locality, and your index ends up\nscattered. This causes a definite performance hit when confronted to high\ninsert rates. Also, this creates extra disk use.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which, \u003ca href=\"https://www.thenile.dev/blog/uuidv7\"\u003eUUIDv7 Comes to PostgreSQL 18\u003c/a\u003e \u0026ndash; version 7 UUIDs seem\nlike a big improvement for performance as they are now more sortable to help\nindex performance.\u003c/p\u003e\n\u003cp\u003eHowever, if I\u0026rsquo;m reading this correctly you now lose one of the previous\nbenefits as UUIDv7 will expose when the UUID was created as it now contains a\ntimestamp component. May or may not be a problem for you?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wanted to try out the Postgres 18 UUIDv7 support. I got build failures at\nfirst until I did this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-fish\" data-lang=\"fish\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003e$ \u003c/span\u003ebrew info icu4c\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003e$ \u003c/span\u003eenv \u003cspan style=\"color:#008080\"\u003ePKG_CONFIG_PATH\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003ebrew --prefix)/opt/icu4c/lib/pkgconfig\u0026#34;\u003c/span\u003e asdf install postgres \u003cspan style=\"color:#099\"\u003e18\u003c/span\u003e.\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you\u0026rsquo;ve used Rails you will no doubt have had issues with inconsistent\ndatabase state when switching branches.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/widefix/actual_db_schema\"\u003eactual_db_schema\u003c/a\u003e sounds like it can help.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWipe out inconsistent DB and schema.rb when switching branches. To do that,\ninstall this gem and use the standard rake db:migrate command.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.404media.co/how-ruby-went-off-the-rails/\"\u003eHow Ruby Went Off the Rails\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI set up a \u003ca href=\"https://www.raycast.com/pindab0ter/hue\"\u003eRaycast extension\u003c/a\u003e to control my monitor backlight (\u003ca href=\"https://www.philips-hue.com/en-gb/p/lightstrips-play-gradient-lightstrip-for-pc/8719514434639\"\u003eHue Play\nGradient Lightstrip for PC\u003c/a\u003e). It\u0026rsquo;s not \u003cem\u003eexactly\u003c/em\u003e what I\u0026rsquo;d like as it still\nrequires too many steps, but it\u0026rsquo;s a start.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://articles.pragdave.me/p/the-kindness-of-strangers\"\u003eThe Kindness of Strangers\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSometimes the thing your are adding is so trivial, you might as well just\nimplement it yourself. The left_pad fiasco of 2016 is a great example. It\nwas literally a dozen or so lines of code that left-padded a string, and yet\nthousands of projects decided to add it as a dependency rather than write it\nthemselves.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe reasons are many.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI am in no way \u0026ldquo;good\u0026rdquo; at Lua, but the main issue I\u0026rsquo;ve always faced with it was\nnot the language but the context of hacking on it in Neovim. Lua modules are\ncached when run so changes would not be reflected as I edited source files.\nThe only way it seemed to work was to restart \u003ccode\u003envim\u003c/code\u003e each time I made a change\nwhich I\u0026rsquo;m sure you can appreciate really slows down progress.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve looked into this \u0026ldquo;problem\u0026rdquo; before but could never settle on an answer. My\nold mate Claude stepped in and suggested several options, and I went with this\n\u003ca href=\"https://github.com/nvim-lua/plenary.nvim\"\u003eplenary\u003c/a\u003e-based (originally written by \u003ca href=\"https://github.com/tjdevries\"\u003eTJ DeVries\u003c/a\u003e) solution.\u003c/p\u003e\n\u003cp\u003eI added a temporary keybinding like this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.keymap.set(\u003cspan style=\"color:#d14\"\u003e\u0026#34;n\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;\u0026lt;F5\u0026gt;\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  require(\u003cspan style=\"color:#d14\"\u003e\u0026#39;plenary.reload\u0026#39;\u003c/span\u003e).reload_module(\u003cspan style=\"color:#d14\"\u003e\u0026#34;notes\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  require(\u003cspan style=\"color:#d14\"\u003e\u0026#34;notes\u0026#34;\u003c/span\u003e).notes()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e, { desc \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Reload and test\u0026#34;\u003c/span\u003e })\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow I can hit \u003ccode\u003eF5\u003c/code\u003e and the modules are reloaded and the code run.\u003c/p\u003e\n\u003cp\u003eMy module setup looks like this:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-terminal\" data-lang=\"terminal\"\u003e  .\n  ├── lua\n  │   └── notes\n  │       ├── init.lua\n  │       └── picker.lua\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd all modules under \u003ccode\u003enotes/\u003c/code\u003e seem to be properly reloaded, which is exactly\nwhat I wanted.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you have some Lua table you want to inspect, you can do this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.notify(vim.inspect(picker))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBut if your table is big it will be unwieldy and difficult to read. Instead\nyou can write the result to a register\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.fn.setreg(\u003cspan style=\"color:#d14\"\u003e\u0026#34;+\u0026#34;\u003c/span\u003e, vim.inspect(picker))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u0026hellip;and it becomes available on your clipboard for pasting somewhere else.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gradient.style/\"\u003eHDR gradients\u003c/a\u003e \u0026ndash; a tool to create CSS HDR gradients.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI noticed somewhere that \u003ca href=\"https://blog.phusion.nl/2025/09/26/passenger-6-1-0/\"\u003ePassenger 6.1.0 was released recently\u003c/a\u003e and I\nrealised I had completely lost track of Passenger. I\u0026rsquo;ve not used it in years\nbut I remember the early days where it saved us from having to restart our app\nservers every hour 😆 Apparently it now supports a variety of languages, not\njust Ruby.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.thingiverse.com/thing:6955798/\"\u003eHidden Touch ID for Apple Magic Trackpad\u003c/a\u003e \u0026ndash; very nice idea. I love Touch ID,\nbut I don\u0026rsquo;t love having to reach for my laptop when I\u0026rsquo;m at home and it\u0026rsquo;s\nelevated up on an arm. I\u0026rsquo;ve heard people mentioning the \u0026ldquo;tape a Magic\nKeyboard\u0026rdquo; under the desk trick, but I\u0026rsquo;m not sure I can cope with that!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/106-why-we-all-need-subtitles-now/#:~:text=there%20will%20be%20self%2Dcongratulatory%20graphs\"\u003eNow there are graphs\u003c/a\u003e.\u003c/p\u003e\n\u003csvg width=\"300\" height=\"200\" viewBox=\"0 0 300 200\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\n  \u003cpath d=\"M4.00,4.00 L33.20,9.03 L62.40,44.23 L91.60,74.40 L120.80,109.60 L150.00,124.69 L179.20,139.77 L208.40,154.86 L237.60,159.89 L266.80,169.94 L296.00,180.00 L296.00,180.00 L4.00,180.00 Z\" fill=\"#667eea40\"/\u003e\n  \u003cpath d=\"M4.00,4.00 L33.20,9.03 L62.40,44.23 L91.60,74.40 L120.80,109.60 L150.00,124.69 L179.20,139.77 L208.40,154.86 L237.60,159.89 L266.80,169.94 L296.00,180.00\" fill=\"none\" stroke=\"#667eea\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/\u003e\n  \u003ctext x=\"4\" y=\"196\" font-family=\"Arial, sans-serif\" font-size=\"12\" fill=\"#666\" text-anchor=\"start\"\u003eNov 24\u003c/text\u003e\n  \u003ctext x=\"296\" y=\"196\" font-family=\"Arial, sans-serif\" font-size=\"12\" fill=\"#666\" text-anchor=\"end\"\u003eSep 25\u003c/text\u003e\n\u003c/svg\u003e\n\u003cp\u003eBetter late, than never.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIncidentally, I asked Claude for suggestions on where I could generate a\n\u003ca href=\"https://en.wikipedia.org/wiki/Sparkline\"\u003esparkline\u003c/a\u003e graph and export it as an SVG to include here. Instead of\nsuggesting links it just built one for me then and there that I could\ninteractively enter my values into! 😮\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOn Sunday we headed up to \u003ca href=\"/weeknotes/221-firm-grip/#:~:text=I%20managed%20to%20snag%20some%20not%20so%20great%20tickets%20to%20see%20them%20in%20Newcastle%20in%20a%20couple%20of%20weeks\"\u003eNewcastle to see the Beans\u003c/a\u003e. It was great fun, and\nthe seats were absolutely fine considering the theatre seat map made them look\na lot further away than they were.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEdinburgh-bound next week. Since I live closer now, it is somewhat more\naccessible than it once was, so I decided I could handle the train journey to\nattend the Scottish Ruby meetup.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI had to \u003ca href=\"/weeknotes/104-reboot-my-remote/#:~:text=I%20had%20to%20reboot%20it%20to%20fix%20the%20issue\"\u003ereboot my Apple TV remote again\u003c/a\u003e, same issue as last time, the\nvolume buttons stopped working. It had a good 832 days to be fair.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.jetbrains.com/datagrip/2025/10/01/datagrip-is-now-free-for-non-commercial-use/\"\u003eDataGrip Is Now Free for Non-Commercial Use\u003c/a\u003e \u0026ndash; I remember liking DataGrip\nwhen I used a trial a few years ago. Might be worth a look.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/danmayer/coverband\"\u003eCoverband\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA gem to measure production code usage, showing a counter for the number of\ntimes each line of code is executed. Coverband allows easy configuration to\ncollect and report on production code usage. It reports in the background\nvia a thread, can be used as Rack middleware, or can be manually configured\nto meet any need.\u003c/p\u003e",
      "date_published": "2025-10-05T00:00:00+00:00",
      "date_modified": "2025-10-05T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/222-humble-tumble/",
      "url": "https://elver.me/weeknotes/222-humble-tumble/",
      "title": "Weeknotes 222: Humble tumble",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://hardcover.app/pages/book-data\"\u003e\u0026ldquo;Where Does Book Data Come from?\u0026rdquo;\u003c/a\u003e \u0026ndash; I expected that this question would be\nfairly involved, and it is.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy Virgin Media broadband contract came up for renewal 🙀 I\u0026rsquo;ve been\nanticipating this moment since we signed our first contract. Unfortunately, we\nhad little choice. They are the only viable choice choice on our street.\nOpenreach and City Fibre are constantly \u0026ldquo;planning\u0026rdquo; but have failed to \u0026ldquo;build\u0026rdquo;\nso far.\u003c/p\u003e\n\u003cp\u003eSurprisingly, Virgin were not \u003cem\u003equite\u003c/em\u003e as bad I had anticipated, still the cost\nto carry on without entering a new contract would have gone up to £83.84 per\nmonth from £48.37 😢\u003c/p\u003e\n\u003cp\u003eThe renewal offered for a new contract was ~£47 a month. I managed to get them\nto drop it to £42. So it could\u0026rsquo;ve been much worse. We are now contracted for\nanother 24 MONTHS though, so I expect Openreach and/or City Fibre to suddenly\nget their act together starting Monday.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitchellh.com/writing/libghostty-is-coming\"\u003eLibghostty Is Coming\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTerminal emulation is a classic problem that appears simple on the surface\nbut is riddled with unexpected complexities and edge cases.3 As a result,\nmost of these implementations are incomplete, buggy, and slow.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI bet!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://paulbjensen.co.uk/2025/09/17/on-dhhs-as-i-remember-london.html\"\u003eOn DHH\u0026rsquo;s \u0026ldquo;As I Remember London\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWell I\u0026rsquo;m born in the UK (London of all places), and I\u0026rsquo;m white. Does that\nmake me a \u0026rsquo;native Brit'?\u003c/p\u003e\n\u003cp\u003eNot really. You see, my parents are Danish.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eA well thought-out and reasonable analysis.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI don\u0026rsquo;t think an \u003ca href=\"https://github.com/Plan-Vert/open-letter\"\u003eopen letter\u003c/a\u003e will achieve any real change, but I think it is\nvalid as a form of protest. If you are unhappy with leadership, what else can\nyou do? Forking something like Rails is not viable without the required\nresources. The amount of defacement happening in the repo is pretty pathetic.\nI imagine these are the same sort of people who would vehemently defend \u0026ldquo;free\nspeech\u0026rdquo; as long as you\u0026rsquo;re saying things they like.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eApropos of nothing 👀 the \u003ca href=\"https://github.com/dessant/repo-lockdown\"\u003erepo-lockdown\u003c/a\u003e and \u003ca href=\"https://github.com/vloddi/changed-lines-count-labeler\"\u003echanged-lines-count-labeler\u003c/a\u003e\nGitHub Actions look useful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis whole debacle has also reminded me that it is difficult to agree with\ndisagreeable people.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLet\u0026rsquo;s reset ✨ The former Nintendo of America president and COO, who has just\nstepped down, is called Doug Bowser ✨\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMore good news. We bought a tumble dryer and it\u0026rsquo;s changing our lives. How did\nI make it this far into my life without experiencing the humble tumble?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ievgenpyrogov.com/cleaning-up-code-using-ast-grep/\"\u003eCleaning up code using ast-grep\u003c/a\u003e \u0026ndash; \u003ccode\u003east-grep\u003c/code\u003e seems cool, but I\u0026rsquo;m not sure\nthis process is as easy as the author implies. I can see many find and\nreplaces happening instead 😆\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/neondatabase-labs/elephantshark\"\u003eelephantshark\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePostgres network traffic monitor\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSeems like this would be very useful if you needed it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI can really recommend \u003ca href=\"https://www.themoviedb.org/tv/81358-mr-inbetween\"\u003eMr Inbetween\u003c/a\u003e \u0026ndash; it is excellent. On paper there is\nnothing particularly interesting about this programme, but the script and\ngreat acting elevate it to something very worthwhile.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.themoviedb.org/tv/157239-alien-earth\"\u003eAlien Earth\u003c/a\u003e is also over, and all I can say without spoiling anything is\nthat I wanted more. And I still want more. And when will Season 2 be released\nplease.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://andre.arko.net/2025/09/11/rails-on-sqlite-exciting-new-ways-to-cause-outages/\"\u003eRails on SQLite: exciting new ways to cause outages\u003c/a\u003e \u0026ndash; Good balanced take on\nrunning SQLite in production\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://minds.md/zakirullin/cognitive\"\u003eCognitive load is what matters\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI really enjoyed this, but the problem is getting other people to agree on\nwhat is or isn\u0026rsquo;t creating “cognitive load”. I have definitely worked with\npeople who would not agree that the various examples in this article are\ndifficult to understand. #empathy\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI think we might have a new contender for most useless delivery company: APC.\u003c/p\u003e\n\u003cp\u003eLong story short, I asked for them to deliver the parcel to a local shop,\nwhich they eventually did. However, they failed to say \u003cem\u003ewhere\u003c/em\u003e they had\ndelivered it to. None of the numerous emails or texts they sent said \u003cem\u003ewhere\u003c/em\u003e\nit had gone.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDon\u0026rsquo;t you know where you parcel is going Jordan?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eReader, when you are receiving the quantity of parcels I do sometimes you\nforget where they are going.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://technicaldeft.com/posts/can-coding-agents-build-complex-systems\"\u003e\u0026ldquo;Can a coding agent build a database system?\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYes, but not one I trust or would want to maintain.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI \u003ca href=\"https://github.com/jordelver/dotfiles/commit/8fb0c6fc952cc0845a7c24067d93e15ff7f8d58a\"\u003einstalled\u003c/a\u003e the \u003ca href=\"https://herb-tools.dev/overview\"\u003eHerb\u003c/a\u003e LSP after talking to \u003ca href=\"https://harry.dev/\"\u003eHarry\u003c/a\u003e about it. I\u0026rsquo;m not sure\nhow much this is going to help me, but I\u0026rsquo;m glad someone is working on HTML\ntooling. I\u0026rsquo;ll see how I go!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://hardcover.app/pages/book-data\"\u003e\u0026ldquo;Where Does Book Data Come from?\u0026rdquo;\u003c/a\u003e \u0026ndash; I expected that this question would be\nfairly involved, and it is.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy Virgin Media broadband contract came up for renewal 🙀 I\u0026rsquo;ve been\nanticipating this moment since we signed our first contract. Unfortunately, we\nhad little choice. They are the only viable choice choice on our street.\nOpenreach and City Fibre are constantly \u0026ldquo;planning\u0026rdquo; but have failed to \u0026ldquo;build\u0026rdquo;\nso far.\u003c/p\u003e\n\u003cp\u003eSurprisingly, Virgin were not \u003cem\u003equite\u003c/em\u003e as bad I had anticipated, still the cost\nto carry on without entering a new contract would have gone up to £83.84 per\nmonth from £48.37 😢\u003c/p\u003e",
      "date_published": "2025-09-28T00:00:00+00:00",
      "date_modified": "2025-09-28T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/221-firm-grip/",
      "url": "https://elver.me/weeknotes/221-firm-grip/",
      "title": "Weeknotes 221: Firm grip",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://tomstu.art/the-dhh-problem\"\u003eThe DHH Problem\u003c/a\u003e — Remains as relevant today as when it was first given. More\nso in fact. I don\u0026rsquo;t think I was ready to hear this back in 2014. Maybe I\nwasn\u0026rsquo;t paying attention. Maybe I didn\u0026rsquo;t fully grasp the situation. I have a\nfirm grip now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://lore.kernel.org/git/20250904-b4-pks-rust-breaking-change-v1-0-3af1d25e0be9@pks.im/\"\u003eRust is making baby steps into the git codebase\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/219-differentiators/#:~:text=One%20of%20my%20teeth%20broke%20late%20Sunday%20night\"\u003ebroken tooth\u003c/a\u003e was finally fixed yesterday. I\u0026rsquo;m £240 down, but happy that\nit seems to be sorted albeit with some lingering discomfort.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.cloudflare.com/deep-dive-into-cloudflares-sept-12-dashboard-and-api-outage/\"\u003eA deep dive into Cloudflare’s September 12, 2025 dashboard and API outage\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe API calls were managed by a React useEffect hook, but we mistakenly\nincluded a problematic object in its dependency array. Because this object\nwas recreated on every state or prop change, React treated it as “always\nnew,” causing the useEffect to re-run each time. As a result, the API call\nexecuted many times during a single dashboard render instead of just once.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eReact DOS-ing yourself is very funny.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFrom a job posting I saw this week.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA formal qualification in Ruby-based digital development is advantageous,\nbut not essential.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSuch as?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=EWizRYh7IKA\"\u003eThe :heading pseudo-class is finally here!\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThank. God.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.blog/ai-and-ml/github-copilot/meet-the-github-mcp-registry-the-fastest-way-to-discover-mcp-servers/\"\u003eMeet the GitHub MCP Registry: The fastest way to discover MCP Servers\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis is your new home base for discovering MCP servers. Learn how we’re\nworking with the broader community on MCP publication and discovery.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis whole \u003ca href=\"https://pup-e.com/goodbye-rubygems.pdf\"\u003eRuby\u003c/a\u003e \u003ca href=\"https://andre.arko.net/2025/09/19/goodbye-rubygems/\"\u003eCentral\u003c/a\u003e \u003ca href=\"https://rubycentral.org/news/strengthening-the-stewardship-of-rubygems-and-bundler/\"\u003ething\u003c/a\u003e is disappointing. Hopefully we find out\nwhat\u0026rsquo;s going on. One thing we do know, even with the most charitable\ninterpretation, Ruby Central are terrible at communication, and I don\u0026rsquo;t think\n\u003ca href=\"https://apiguy.substack.com/p/a-board-members-perspective-of-the?r=43k3q\u0026amp;utm_medium=ios\u0026amp;triedRedirect=true#:~:text=We%20don%27t%20have%20some%20big%20PR%20machine%20or%20communications%20team\"\u003e\u0026ldquo;we don\u0026rsquo;t have a PR department\u0026rdquo;\u003c/a\u003e really cuts it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://underjord.io/elixir-is-not-owned-by-big-tech.html\"\u003eElixir is not owned by Big Tech\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://letterclub.org/\"\u003eLetter Club\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePrivate group newsletters where the readers are the writers too.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is an interesting idea.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.blog/open-source/maintainers/building-personal-apps-with-open-source-and-ai/\"\u003eBuilding personal apps with open source and AI\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf open source is the foundation, AI has become the rocket fuel for personal\nsoftware. Building something just for yourself used to mean wrestling with\nunfamiliar frameworks or spending hours debugging arcane errors. Now? AI can\nhelp you scaffold a project, troubleshoot issues, or even just explain a\ntricky codebase.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI managed to hold off buying a new phone, but I did splurge on some new\nAirPods Pro 3. They arrived Saturday and so far I think they were worth the\nupgrade. I\u0026rsquo;m still getting used to the fit, but I think it\u0026rsquo;s better. Some\npeople apparently don\u0026rsquo;t like the sound, but me for it\u0026rsquo;s an improvement so far.\nAnd the most important feature, Active Noise Cancellation, is improved.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA friend of mine was telling me about how he recently saw \u003ca href=\"https://en.wikipedia.org/wiki/Three_Bean_Salad_%28podcast%29\"\u003eThree Bean Salad\u003c/a\u003e\n(the finest podcast available on the Internet) live in Bristol and envy got\nthe best of me. I managed to snag some not so great tickets to see them in\nNewcastle in a couple of weeks. I haven\u0026rsquo;t been to Newcastle in years, and only\never once before, so we’re going to make a weekend of it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dansinker.com/posts/2025-05-23-who-cares/\"\u003eThe Who Cares Era\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;I don\u0026rsquo;t need to rehash it all. But the thing that is most disheartening\nto me is how at every step along the way, nobody cared.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://elixirdrops.net/d/6UJjiKBt\"\u003eCustom Phoenix generator templates\u003c/a\u003e \u0026ndash; I had no idea you can just add\ntemplates into \u003ccode\u003epriv/templates/\u003c/code\u003e and the Phoenix generators will use them.\nVery nice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBe careful with this\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-fish\" data-lang=\"fish\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003efor\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003efile\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003ein\u003c/span\u003e ../**/*.mkv\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#900;font-weight:bold\"\u003emv\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003e$file\u003c/span\u003e .\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDon\u0026rsquo;t ask me how I know 😭\u003c/p\u003e\n\u003cp\u003e(Ok, I\u0026rsquo;ll tell you since you insist. I ran this from the wrong directory and\nmoved all my files from nested directories into the current directory. I then\nhad to spent a lot of time manually moving all the files back to whence they\ncame. \u003ccode\u003e**\u003c/code\u003e is dangerous, and apparently so am I.)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.olleewatch.com/\"\u003eOllee Watch\u003c/a\u003e is a very cool idea\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTurn your classic Casio watch into a smartwatch!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://borretti.me/article/notes-on-managing-adhd\"\u003eNotes on Managing ADHD\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen I wake up, I do my morning routine, get some quick wins, and then I try\nto tackle the thing I dread the most, as early in the morning as possible,\nbecause that\u0026rsquo;s the time of day when I have the most energy and self-control.\nI get that done and I move on.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is something I instinctively did this week. I needed to phone the garage\nto ask about an oil service I need.\u003c/p\u003e\n\u003cp\u003e(I \u003cem\u003eloathe\u003c/em\u003e phoning people. I will happily Zoom you, Google Meet you, or\nFaceTime you \u0026ndash; not Teams, I\u0026rsquo;m not an animal \u0026ndash; I\u0026rsquo;ll chat in-person, no\nproblem. But I \u003cem\u003ehate\u003c/em\u003e the phone.)\u003c/p\u003e\n\u003cp\u003eSo I phoned very first thing in the morning. I still didn\u0026rsquo;t want to, it was\nstill hard and unpleasant, but, importantly, I did it. I mean, I didn\u0026rsquo;t get\nthe information I wanted, but it still counts as a win.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.boxypixel.com/products/ipod-classic-5th-7th-gen-metal-housing-kit\"\u003eipod Classic (5th-7th Gen) Metal Housing + Buttons Kit\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eOh god, stop me buying this.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://tomstu.art/the-dhh-problem\"\u003eThe DHH Problem\u003c/a\u003e — Remains as relevant today as when it was first given. More\nso in fact. I don\u0026rsquo;t think I was ready to hear this back in 2014. Maybe I\nwasn\u0026rsquo;t paying attention. Maybe I didn\u0026rsquo;t fully grasp the situation. I have a\nfirm grip now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://lore.kernel.org/git/20250904-b4-pks-rust-breaking-change-v1-0-3af1d25e0be9@pks.im/\"\u003eRust is making baby steps into the git codebase\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/219-differentiators/#:~:text=One%20of%20my%20teeth%20broke%20late%20Sunday%20night\"\u003ebroken tooth\u003c/a\u003e was finally fixed yesterday. I\u0026rsquo;m £240 down, but happy that\nit seems to be sorted albeit with some lingering discomfort.\u003c/p\u003e",
      "date_published": "2025-09-21T00:00:00+00:00",
      "date_modified": "2025-09-21T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/220-fountain-pen-guy/",
      "url": "https://elver.me/weeknotes/220-fountain-pen-guy/",
      "title": "Weeknotes 220: Fountain pen guy",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWorkflow, workflow, workflow \u0026ndash; I\u0026rsquo;ve now \u003ca href=\"https://github.com/jordelver/dotfiles/compare/8d4391a37d684f0b21f951a1427b5a793dfce6d7...d9ef4014d4eb51e847f2c3d6ef9f190b5c1752d3\"\u003emoved over to Snacks.picker from\nTelescope\u003c/a\u003e and I\u0026rsquo;m already 110% more productive, and ready for AI to take my\njob.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy flat went up for sale and not a single viewing so far. I wasn\u0026rsquo;t expecting\nit to exactly fly off the shelf, but I was expecting at least one viewing by\nnow. I guess it\u0026rsquo;s always a waiting game with selling houses and/or it\u0026rsquo;s\noverpriced. I will need to give it some time at least before making any\nchanges.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy visit to the West Country was a successful one. The drive both up and down\nwere uneventful, which is how drives should be. I did a surprising amount of\ndriving whilst there too, especially compared to the norm these days. It seems\nlike a weird thing to miss, driving, but I do miss it, despite all the obvious\nbenefits of \u003cem\u003enot\u003c/em\u003e having to drive literally anywhere I want to go as I once\ndid.\u003c/p\u003e\n\u003cp\u003eMany people made time for me whilst I was there and good times were had. It\nwas really nice to catch up with everyone, and I felt tinges of sadness once I\ngot home on Saturday. Today (Sunday) it feels like weeks since I was there.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSaturday evening we were booked to see That Feels Significant Live! with Elis,\nJohn, and Producer Dave. It was very fun show \u0026ndash; basically a live version of\nthe radio show but unshackled by their corporate overlords (the BBC). Dave was\na very good sport considering he\u0026rsquo;s not a performer like Elis and John.\u003c/p\u003e\n\u003cp\u003eTop tip, don\u0026rsquo;t leave your pen knife attached to your key ring when trying to\nenter a venue. They \u003cem\u003ewill\u003c/em\u003e take this DANGEROUS WEAPON off you. (Although I did\nmanage to get it back when I left thankfully.)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theatlantic.com/technology/archive/2025/06/good-taste-ai/683101/\"\u003eGood Taste Is More Important Than Ever\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTaste starts with noticing.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m not sure I agree with the whole premise of the article, but I did agree\nwith this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://vale.sh/\"\u003eVale CLI\u003c/a\u003e \u0026ndash; \u0026ldquo;Your style, our editor\u0026rdquo;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eVale is an open-source, command-line tool that brings your editorial style\nguide to life.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is an interesting tool. To date my \u0026ldquo;editorial style\u0026rdquo; only goes as far as\nlinting the Markdown I write with the \u003ca href=\"https://github.com/nosborn/github-action-markdown-cli\"\u003egithub-action-markdown-cli\u003c/a\u003e GitHub\nAction, but I could see myself using this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://daringfireball.net/linked/2025/09/06/siegler-cynical-read\"\u003eA CYNICAL READ ON ANTHROPIC\u0026rsquo;S BOOK SETTLEMENT\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBy settling for $1.5B, is Anthropic sort of pulling up a drawbridge, making\nit so that other startups can\u0026rsquo;t possibly come into their castle? I mean, am\nI crazy?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI mean, maybe.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePlex suffered a \u0026ldquo;security incident\u0026rdquo; aka lost a database somehow, so I had to\nreset my password. Well, I didn\u0026rsquo;t \u003cem\u003ehave\u003c/em\u003e to, but it seemed prudent. However,\nresetting one\u0026rsquo;s password apparently also means \u0026ldquo;losing access to the entire\nserver\u0026rdquo; which I was not expecting and nor were many people apparently judging\nby the threads I\u0026rsquo;ve seen on Reddit.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://shiftmag.dev/saying-no-is-not-a-free-action-in-the-world-of-software-engineering-5339/\"\u003eSaying NO is not a free action in the world of software engineering\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn order to aid my new journalling habit I\u0026rsquo;ve become Fountain Pen Guy.\u003c/p\u003e\n\u003cp\u003eI have gone years without writing anything more than a birthday card but now\nthat I\u0026rsquo;ve consigned myself to write at least three (small) pages of waffle per\nday, and given how unpleasant I\u0026rsquo;ve found it, it felt right to look into\nwriting implements. The only remedy is to spend money.\u003c/p\u003e\n\u003cp\u003eNot since my Secondary School Parker pen have I regularly written using a\nfountain pen. I did have a brief dalliance with a \u003ca href=\"https://www.lamy.com/en-gb/p/lamy-safari-fountain-pen/54912096567640\"\u003eLamy Safari\u003c/a\u003e about 10 years\nago (according to my Amazon order history!), but it didn\u0026rsquo;t stick.\u003c/p\u003e\n\u003cp\u003eIt turns out that one of my York Ruby friends is a senior level fountain pen\nguy already and he had a small collection of pens he was willing to let me\ntry, which was very helpful. Writing in front of someone else, unpleasant but\nnecessary.\u003c/p\u003e\n\u003cp\u003eDespite liking a few of his more expensive pens, I decided, for now, to bring\nmy Lamy Safari back to life. I failed, but I did try. The ink simply will not\nflow correctly out of the pen, even with a new nib and cleaning (as far as I\nknow how). So I spent a moderate amount of money instead and bought the same\npen again in a different colour (variety is the spice of life) and I\u0026rsquo;m now\nhappily using it and finding it easier than other pens. I may still splurge on\nsomething better later, but for now I\u0026rsquo;m quite enjoying it.\u003c/p\u003e\n\u003cp\u003e(Side note, I\u0026rsquo;m constantly amazed the breadth of content available on YouTube.\nBecause I\u0026rsquo;m mostly into computer related content, I think I assume that\nYouTube will be full of computer stuff, which is is. But if you type in almost\nany niche you\u0026rsquo;ll find someone producing content. I watched one guy reviewing\nthe different types of paper notebooks for use with fountain pens.)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI did not get the emergency alert on my phone \u0026ndash; am I safe?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWorkflow, workflow, workflow \u0026ndash; I\u0026rsquo;ve now \u003ca href=\"https://github.com/jordelver/dotfiles/compare/8d4391a37d684f0b21f951a1427b5a793dfce6d7...d9ef4014d4eb51e847f2c3d6ef9f190b5c1752d3\"\u003emoved over to Snacks.picker from\nTelescope\u003c/a\u003e and I\u0026rsquo;m already 110% more productive, and ready for AI to take my\njob.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy flat went up for sale and not a single viewing so far. I wasn\u0026rsquo;t expecting\nit to exactly fly off the shelf, but I was expecting at least one viewing by\nnow. I guess it\u0026rsquo;s always a waiting game with selling houses and/or it\u0026rsquo;s\noverpriced. I will need to give it some time at least before making any\nchanges.\u003c/p\u003e",
      "date_published": "2025-09-14T00:00:00+00:00",
      "date_modified": "2025-09-14T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/219-differentiators/",
      "url": "https://elver.me/weeknotes/219-differentiators/",
      "title": "Weeknotes 219: Differentiators",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/218-botulism-opportunity/#:~:text=When%20the%20great%20re%2Dpotting%20took%20place%20I%20thought%20I%E2%80%99d%20avoided%20the%20usually%20inevitable%20fugus%20gnats.%20I%20was%20wrong.%20Very%20wrong.%20The%20little%20fuckers%20have%20arrived%20in%20full%20force%20and%20god%20they%E2%80%99re%20annoying.%20But%20I%E2%80%99m%20fighting%20back%20%F0%9F%A5%8A%20I%E2%80%99ve%20deployed%20a%20Nemotode%20army%20and%20sticky%20traps\"\u003eNemotode army and sticky traps\u003c/a\u003e are having \u003cem\u003esome\u003c/em\u003e effect.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThings were said:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAfter my initial excitement over Alien: Earth I think I reluctantly need\nto admit to myself that it isn\u0026rsquo;t holding together as I had hoped.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI was wrong. Very wrong. Episode 5 is \u003cem\u003eexcellent\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;d like to take this opportunity to apologise to all involved.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dev.37signals.com/announcing-lexxy-a-new-rich-text-editor-for-rails/\"\u003eLexxy: A new rich text editor for Rails\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen I exit a \u003ccode\u003etmux\u003c/code\u003e session (usually by \u003ckbd\u003eCTRL\u003c/kbd\u003e-\u003ckbd\u003ed\u003c/kbd\u003e) \u003ccode\u003etmux\u003c/code\u003e\ndetaches from all sessions. I always have several sessions running at one time\nso I then need to to run \u003ccode\u003etmux a\u003c/code\u003e to reattach \u0026ndash; it\u0026rsquo;s pretty annoying and has\nbeen bugging me for \u003cem\u003eyears\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eWell, no more. This week, I made \u003ca href=\"https://github.com/jordelver/dotfiles/commit/6f00964928b847ac89a1bd61789789c2ee7af7d8\"\u003ethis life changing commit\u003c/a\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eset-option -g detach-on-destroy off\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eFrom the \u003ca href=\"https://man.openbsd.org/OpenBSD-current/man1/tmux.1#:~:text=detach%2Don%2Ddestroy%20%5B,session%20in%20alphabetical%20order.\"\u003eman page\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf off, the client is switched to the most recently active of the\nremaining sessions.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI don\u0026rsquo;t know when this option was introduced (I have a feeling after I last\nlooked into the issue) but I\u0026rsquo;m glad I have it now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://tom-select.js.org/\"\u003eTom Select\u003c/a\u003e \u0026ndash; handy, dandy, fancy select library.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://devknife.app/\"\u003eDevKnife\u003c/a\u003e \u0026ndash; neat idea.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDevKnife replaces browser tabs, CLI scripts, and scattered tools with one\nnative Mac app.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThere are other ways to achieve the sort of things this app provides but it\u0026rsquo;s\nnice that it\u0026rsquo;s all packaged up in one easy tool.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMore workflow improvements - I can now fuzzily change tmux sessions \u003ca href=\"https://github.com/jordelver/dotfiles/commit/c5d50a7f6bcc470f01f8f01ed509f3a4bc99de69\"\u003eusing\n\u003ccode\u003efzf\u003c/code\u003e\u003c/a\u003e. Hitting \u003ckbd\u003eCTRL\u003c/kbd\u003e-\u003ckbd\u003eb\u003c/kbd\u003e-\u003ckbd\u003es\u003c/kbd\u003e now invokes \u003ccode\u003efzf\u003c/code\u003e\nwith a list of running sessions which I can filter and change to by pressing\n\u003ckbd\u003eENTER\u003c/kbd\u003e. Nice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI started reading two books this week: 1) \u003ca href=\"https://www.goodreads.com/book/show/203778046-a-history-of-britain-in-ten-enemies\"\u003eA History of Britain in 10 Enemies\u003c/a\u003e\nby Terry Deary; and 2) \u003ca href=\"https://www.goodreads.com/book/show/97942.The_Artist_s_Way\"\u003eThe Artist\u0026rsquo;s Way\u003c/a\u003e by Julia Cameron. Both seem to get\npolarizing reviews, which is an interesting coincidence.\u003c/p\u003e\n\u003cp\u003eThe Artist\u0026rsquo;s Way is based on a programme/workshop to get your creativity\ngoing. An early part of the book introduces what Julia Cameron calls \u0026ldquo;Morning\nPages\u0026rdquo;. The idea is that forcing yourself to complete 3 pages of text every\nmorning gets the creative juices flowing in some way.\u003c/p\u003e\n\u003cp\u003eIt might be bs, but I\u0026rsquo;ve been trying it for a week so far. Mine has turned\ninto a traditional journal already, which I\u0026rsquo;m not sure is the point, but\nstill, the act of writing by hand (however tortuous, and I can assure you Day\n1 was like torture) \u003cem\u003efeels\u003c/em\u003e like it connects something in the brain.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOne of my teeth broke late Sunday night. I knew this time was coming as I\u0026rsquo;ve\nbeen fairly issue free for the last few years. Of course I haven\u0026rsquo;t sorted a\nnew dentist since moving so I now have a two week wait for an appointment\nwhich will be ok as long as it remains pain free.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wanted to try out Neovim nightly so I decided to \u003ca href=\"https://github.com/jordelver/dotfiles/commit/7a84771be57f4819b755b2beed1b9f37396eda14\"\u003eput the control of which\nNeovim is installed under \u003ccode\u003easdf\u003c/code\u003e\u003c/a\u003e. I\u0026rsquo;m not sure if it meets my needs or not\nyet.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOver to Sheffield on Thursday to see JJ \u0026ndash; very much enjoyed chatting and\ncatching up 😊\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://railsblocks.com/\"\u003eRails Blocks\u003c/a\u003e \u0026ndash; \u0026ldquo;UI components for your Rails app\u0026rdquo;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA ready-to-use collection of 230+ UI components with minimal dependencies\nand a focus on simplicity\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dev.to/resource_bunk_1077cab07da/how-i-write-code-that-i-dont-hate-reading-a-week-later-303b\"\u003eHow I Write Code That I Don\u0026rsquo;t Hate Reading a Week Later\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe mark of a good developer isn\u0026rsquo;t just building systems that work — it\u0026rsquo;s\nwriting code that remains kind, even after time passes.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSome good tips in here.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://kraust.github.io/posts/neovim-is-a-multiplexer/\"\u003eNeovim is a Multiplexer\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn this post, I plan to talk about :terminal.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI have more or less ignored \u003ccode\u003e:terminal\u003c/code\u003e as a feature since it was added to\nNeovim, so this was interesting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs part of my \u0026ldquo;sort your shit out\u0026rdquo; enterprise I have started meditating again.\n5 out of 7 days so far as I type this (there is still time to make it 6\ntoday!).\u003c/p\u003e\n\u003cp\u003eThe difference between starting meditation \u003cem\u003enow\u003c/em\u003e and at other times in the\npast is that I don\u0026rsquo;t feel I \u003cem\u003eneed\u003c/em\u003e it right now. There is no current crisis.\nBut I feel that sitting and reflecting in whatever way is a good practice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which, I needed to load my guided meditation audio back onto my\niPhone (I don\u0026rsquo;t remember removing the files, but they were nowhere to be\nfound).\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve moaned about this before, but the process is absolutely baffling when you\ndon\u0026rsquo;t do it very often. Do I need to use the macOS Music app or Finder or\nboth? I have to search how to do this every time. Terrible experience from\nApple.\u003c/p\u003e\n\u003cp\u003eI guess they are not incentivised to make this better when they want you to be\nstreaming instead.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNew keyboard time! Somewhat on a whim I decided to buy yet another new\nkeyboard. This time the \u003ca href=\"https://www.zsa.io/voyager\"\u003eZSA Voyager\u003c/a\u003e. A split keyboard again, but this one is\nsmaller than the \u003ca href=\"https://ergodox-ez.com/\"\u003eErgoDox EZ\u003c/a\u003e I already own and don\u0026rsquo;t use. I hoping this is\none of the differentiators to actually using it.\u003c/p\u003e\n\u003cp\u003eThe other differentiator being a plan towards learning. This keyboard is not\ngoing to get used simply by hope. The ZSA team seem very aware that there is a\nbarrier to entry with their products (I\u0026rsquo;d imagine a lot of people give up) and\nas a result they seem to have put a lot of effort into their support systems.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.mcsweeneys.net/articles/the-em-dash-responds-to-the-ai-allegations\"\u003eThe Em Dash Responds to the AI Allegations\u003c/a\u003e \u0026ndash; very good 👏\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/218-botulism-opportunity/#:~:text=When%20the%20great%20re%2Dpotting%20took%20place%20I%20thought%20I%E2%80%99d%20avoided%20the%20usually%20inevitable%20fugus%20gnats.%20I%20was%20wrong.%20Very%20wrong.%20The%20little%20fuckers%20have%20arrived%20in%20full%20force%20and%20god%20they%E2%80%99re%20annoying.%20But%20I%E2%80%99m%20fighting%20back%20%F0%9F%A5%8A%20I%E2%80%99ve%20deployed%20a%20Nemotode%20army%20and%20sticky%20traps\"\u003eNemotode army and sticky traps\u003c/a\u003e are having \u003cem\u003esome\u003c/em\u003e effect.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThings were said:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAfter my initial excitement over Alien: Earth I think I reluctantly need\nto admit to myself that it isn\u0026rsquo;t holding together as I had hoped.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI was wrong. Very wrong. Episode 5 is \u003cem\u003eexcellent\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;d like to take this opportunity to apologise to all involved.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dev.37signals.com/announcing-lexxy-a-new-rich-text-editor-for-rails/\"\u003eLexxy: A new rich text editor for Rails\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen I exit a \u003ccode\u003etmux\u003c/code\u003e session (usually by \u003ckbd\u003eCTRL\u003c/kbd\u003e-\u003ckbd\u003ed\u003c/kbd\u003e) \u003ccode\u003etmux\u003c/code\u003e\ndetaches from all sessions. I always have several sessions running at one time\nso I then need to to run \u003ccode\u003etmux a\u003c/code\u003e to reattach \u0026ndash; it\u0026rsquo;s pretty annoying and has\nbeen bugging me for \u003cem\u003eyears\u003c/em\u003e.\u003c/p\u003e",
      "date_published": "2025-09-07T00:00:00+00:00",
      "date_modified": "2025-09-07T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/218-botulism-opportunity/",
      "url": "https://elver.me/weeknotes/218-botulism-opportunity/",
      "title": "Weeknotes 218: Botulism opportunity",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eGiving away a mattress for free is harder than you\u0026rsquo;d think.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIs a page with 218 links on it too many links? Part of me thinks I should\nstart paginating the home page of this here website, and the other part simply\ncannot be arsed. The page is 5.4kB, loads fast, and renders fast \u0026ndash; who cares?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://menial.co.uk/base/\"\u003eBase\u003c/a\u003e \u0026ndash; \u0026ldquo;The best SQLite database editor for macOS\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been looking for a decent GUI SQLite tool.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://daniel.haxx.se/blog/2025/08/08/http-is-not-simple/\"\u003eHTTP is not simple\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI often hear or see people claim that HTTP is a simple protocol. Primarily\nof course from people without much experience or familiarity with actual\nimplementations. I think I personally also had thoughts in that style back\nwhen I started working with the protocol.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe primary author of \u003ccode\u003ecurl\u003c/code\u003e knows a lot about HTTP.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://evilmartians.com/chronicles/the-long-game-why-rails-survived-the-hype-cycle-and-what-it-means-for-your-startup\"\u003eThe Long Game: why Rails survived the hype cycle and what it means for your\nstartup\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://selkie.design/substage/\"\u003eSubstage\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eConvert, organize and more: control your Mac and its files with natural\nlanguage.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is cool/terrifying/inadvisable.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m planning a trip south in a couple of weeks to see a friend. It is\nsurprising how overwhelming I found organising everything.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fly.io/blog/build-better-agents-with-morphllm/\"\u003eBuild Better Agents With MorphLLM\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI\u0026rsquo;m an audiophile, which is a nice way to describe someone who spends their\nchildren’s college fund on equipment that yields no audible improvement in\nsound quality.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.makingsoftware.com/chapters/color-spaces-models-and-gamuts\"\u003eWhat is a color space?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eColor is an unreasonably complex topic. Just when you think you\u0026rsquo;ve got it\nfigured out, it reveals a whole new layer of complexity that you didn\u0026rsquo;t know\nexisted.\u003c/p\u003e\n\u003cp\u003eThis is partly because it doesn\u0026rsquo;t really exist.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eLook, I\u0026rsquo;m not going to read this website, you’re not going to read this\nwebsite, but my god what a lovely piece of work. In a world of mediocrity what\na breath of fresh air it is \u0026ndash; beautiful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ftes.de/articles/2025-03-31-beyond-data-confirm\"\u003eBeyond data-confirm\u003c/a\u003e \u0026ndash; Nice tutorial on replacing those fugly browser\ndialogs\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDue to a supermarket chilli plant surviving more than a week I found myself\nwith an abundance of red chillies. There was nothing else to do but attempt\nchilli jam. Never ignore the opportunity for botulism to thrive.\u003c/p\u003e\n\u003cp\u003eI ended up with something more akin to a thick syrup which was hot \u003cem\u003eAF\u003c/em\u003e 🥵 so\nI re-boiled it the next day and now it \u003cem\u003ehas\u003c/em\u003e set to something more resembling\njam.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mashable.com/article/google-android-sideloading-apps-security\"\u003eGoogle is shutting down Android sideloading in the name of security\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAndroid zealots assemble!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://rubyelders.com/writings/2025-08-wubular-1.html\"\u003eIntroducing Wubular: Rubular Reimagined in Ruby+WASM\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSince Ruby 3.2, MRI itself can be compiled — thanks to  Yuta Saito\n(@kateinoigakukun) — to run in WASM environments. WASM is essentially\nassembly for the web: safe, fast, portable bytecode that browsers (and other\nruntimes) can execute. Combine it with WASI (WebAssembly System Interface)\nand you get access to basic system features like files, time, and randomness\n— enough to run full Ruby apps.\u003c/p\u003e\n\u003cp\u003eThat flips the old Rubular model upside down: regex evaluation (and any Ruby\ncode) can now run entirely client-side.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMaybe I\u0026rsquo;ve not been paying enough attention but this is the first time I\u0026rsquo;ve\nreally felt like WebAssembly is the perfect solution for something.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://andre.arko.net/2025/08/25/rv-a-new-kind-of-ruby-management-tool/\"\u003erv, a new kind of Ruby management tool\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI was skeptical going into read this, but then I see \u0026ldquo;Sam Stephenson\u0026rdquo; and I\ntake notice. I am usually in favour of more generic tools for managing\nversions of things, that\u0026rsquo;s why I currently use \u003ccode\u003easdf\u003c/code\u003e as it can handle Ruby,\nbut also Redis or Postgres etc.\u003c/p\u003e\n\u003cp\u003eFrom \u003ca href=\"https://github.com/spinel-coop/rv/blob/main/docs/PLANS.md#:~:text=Get%20rid%20of%20rvm%2C%20rbenv%2C%20chruby%2C%20asdf%2C%20mise%2C%20ruby%2Dbuild%2C%20ruby%2Dinstall%2C%20bundler%2C%20and%20rubygems%2C%20all%20at%20once.\"\u003erv plans\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGet rid of rvm, rbenv, chruby, asdf, mise, ruby-build, ruby-install,\nbundler, and rubygems, all at once.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis has more ambitious plans though so I will watch with interest.\u003c/p\u003e\n\u003cp\u003eAnd if it stops people using \u003ccode\u003ervm\u003c/code\u003e even better.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://beta.ideas.lego.com/product-ideas/de0eda3f-84aa-4cfa-9fab-c9eb155ada80\"\u003eLego Bondi Blue iMac G3\u003c/a\u003e? Yes, please!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAbout a year ago the \u003ca href=\"https://elixir-lang.org/blog/2024/08/15/welcome-elixir-language-server-team/\"\u003ecompeting Elixir LSPs decided to come together\u003c/a\u003e and\ncreate the defacto LSP for Elixir. Now the \u003ca href=\"https://github.com/elixir-lang/expert\"\u003efirst release is available\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI have \u003ca href=\"https://github.com/jordelver/dotfiles/commit/57c160ff7f48da11a7221ec10ca3e1b90e4c8a10\"\u003eset it up regardless\u003c/a\u003e, and it seems to do things.\u003c/p\u003e\n\u003cp\u003eEmbarrassing to admit perhaps but I still don\u0026rsquo;t really use LSPs in any big\nway. I\u0026rsquo;m not even sure what to expect from them with Neovim. I\u0026rsquo;m hoping\nsomeone is going to create something on YouTube to school me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe speed with which \u003ca href=\"https://nicsfix.com/\"\u003eNic\u0026rsquo;s Fix\u003c/a\u003e fixes \u003ca href=\"https://www.youtube.com/live/l6p4bWw_oEk?t=1h54m11s\"\u003eSiracusa\u0026rsquo;s HomePod\u003c/a\u003e is very impressive\neven if the soldering did raise some eyebrows 🤨😆\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe watched \u003ca href=\"https://www.themoviedb.org/movie/744653-the-thursday-murder-club\"\u003eThe Thursday Murder Club\u003c/a\u003e. I like Pierce Brosnan but he should\njust stop doing accents. Like in \u003ca href=\"https://www.paramountplus.com/gb/shows/mobland/\"\u003eMobLand\u003c/a\u003e, the man just can\u0026rsquo;t do them. We\u0026rsquo;re\nnot talking Ray Winston levels of bad, but bad. The film is fine.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI finished \u003ca href=\"https://www.themoviedb.org/tv/106161-alma-s-not-normal\"\u003eAlma\u0026rsquo;s Not Normal\u003c/a\u003e Season 2 and enjoyed it, but it didn\u0026rsquo;t hit me\nlike the first, perhaps because I left a long time between seasons. The cast\nare unbelievably good though, and \u003ca href=\"https://en.wikipedia.org/wiki/Sophie_Willan\"\u003eSophie Willan\u003c/a\u003e is a real talent (she\u0026rsquo;s\ngreat on Taskmaster too).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter my \u003ca href=\"/weeknotes/216-legally-purchased-media/#:~:text=Alien%3A%20Earth%20is%20very%20good\"\u003einitial excitement over Alien: Earth\u003c/a\u003e I think I reluctantly need to\nadmit to myself that it isn\u0026rsquo;t holding together as I had hoped.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen \u003ca href=\"/weeknotes/210-sorry-i-m-sweaty-it-s-genetic/#:~:text=I%20re%2Dpotted%20a%20load%20of%20my%20indoor%20plants%20this%20week\"\u003ethe great re-potting\u003c/a\u003e took place I thought I\u0026rsquo;d avoided the usually\ninevitable \u003ca href=\"https://en.wikipedia.org/wiki/Fungus_gnat\"\u003efungus gnats\u003c/a\u003e. I was wrong. Very wrong. The little fuckers have\narrived in full force and god they\u0026rsquo;re annoying. But I\u0026rsquo;m fighting back 🥊 I\u0026rsquo;ve\ndeployed a \u003ca href=\"https://en.wikipedia.org/wiki/Nematode\"\u003eNemotode\u003c/a\u003e army and sticky traps 🤞\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eGiving away a mattress for free is harder than you\u0026rsquo;d think.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIs a page with 218 links on it too many links? Part of me thinks I should\nstart paginating the home page of this here website, and the other part simply\ncannot be arsed. The page is 5.4kB, loads fast, and renders fast \u0026ndash; who cares?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://menial.co.uk/base/\"\u003eBase\u003c/a\u003e \u0026ndash; \u0026ldquo;The best SQLite database editor for macOS\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been looking for a decent GUI SQLite tool.\u003c/p\u003e",
      "date_published": "2025-08-31T00:00:00+00:00",
      "date_modified": "2025-08-31T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/217-half-assed-idea/",
      "url": "https://elver.me/weeknotes/217-half-assed-idea/",
      "title": "Weeknotes 217: Half-assed idea",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://macrowave.co/\"\u003eMacrowave\u003c/a\u003e \u0026ndash; \u0026ldquo;Turn Your Mac Into a Private Radio Station\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI realised that all of my \u0026ldquo;ideas\u0026rdquo; for \u0026ldquo;apps\u0026rdquo; are actually just single feature\nideas that require me to build a whole other app in order to implement them.\nNot very time efficient 😆\u003c/p\u003e\n\u003cp\u003eFor example, I use \u003ca href=\"https://callsheetapp.com/\"\u003eCallsheet\u003c/a\u003e to track what TV or Movies I want to watch, and\nit works well for that, but it doesn\u0026rsquo;t let me view the movies on a calendar,\nwhich is what I would also like.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSo I did an \u003ca href=\"https://github.com/jordelver/tmdb_cal\"\u003einternet code\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI decided that instead of using Callsheet I would use the \u003ca href=\"https://www.themoviedb.org/\"\u003eTMDB\u003c/a\u003e watchlist\nfeature and then use their API to pull the watchlist items and output an ical\nwhich I could subscribe to.\u003c/p\u003e\n\u003cp\u003eThis was quite a half-assed idea from the very start, which both didn\u0026rsquo;t solve\nthe problem and not in the right way. I find it difficult to figure out\nwhether some of these thoughts are self-sabotage or genuine concerns so I\ndecided to carry on anyway, and at least get it deployed and \u0026ldquo;working\u0026rdquo; so it\ndidn\u0026rsquo;t end up on the unfinished pile.\u003c/p\u003e\n\u003cp\u003eWell I don\u0026rsquo;t actually consider this \u0026ldquo;done\u0026rdquo; yet but I did write and deploy some\ncode for the first time in ages, so that is good.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL how to \u003ca href=\"https://support.plex.tv/articles/200381043-multi-version-movies/#:~:text=Can%20I%20use%20Editions%20and%20Versions%20at%20the%20same%20time%3F\"\u003ename files with different editions and versions for Plex\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://didoesdigital.com/blog/stress-test-data-for-web-projects/\"\u003eStress Test Data for Web Projects\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen making websites I have some go-to test data to push designs to the\nlimits. I use this test data for creating test accounts, submitting forms,\nas mock data in designs, and all sorts of random things.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eRefer to the bottom for CSS solutions.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/pwntester/octo.nvim\"\u003e\u003ccode\u003eocto.nvim\u003c/code\u003e\u003c/a\u003e \u0026ndash; I don\u0026rsquo;t have much use for this right now, but I think I might\nin the future.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://svenning.io/build-for-joy-not-work\"\u003eBuild for Joy, Not Work\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve been lucky enough to experience building great UIs for amazing\nproducts, but when I look around me, I see a world of \u0026ldquo;good enough\u0026rdquo;.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eYeah.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://elixircasts.io/liveview-colocated-hooks\"\u003e#197: LiveView Colocated Hooks\u003c/a\u003e seem like a nice idea.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.itpro.com/software/development/aws-ceo-matt-garman-just-said-what-everyone-is-thinking-about-ai-replacing-software-developers\"\u003eAWS CEO Matt Garman just said what everyone is thinking about AI replacing\nsoftware developers\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe real tragedy? An entire generation of Web Designers and Software\nEngineers may never know the joy of making something truly meaningful —\nsomething that solves an actual problem instead of bumping a conversion rate\nby 0.25%.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIs this real? A CEO not talking complete bollocks 🙀\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://katafrakt.me/2025/07/03/ecto-on-replace-deferred-check/\"\u003eEcto, \u003ccode\u003eon_replace\u003c/code\u003e and deferred checks\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDeferrable constraint waits until the end of the transaction with checking\nif its condition is met. This was exactly what I was looking for!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve not heard of deferrable constraints before. Now I have.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theregister.com/2025/08/20/mcdonalds_terrible_security/\"\u003eMcDonald\u0026rsquo;s not lovin\u0026rsquo; it when hacker exposes nuggets of rotten security\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA white-hat hacker has discovered a series of critical flaws in McDonald\u0026rsquo;s\nstaff and partner portals that allowed anyone to order free food online, get\nadmin rights to the burger slinger\u0026rsquo;s marketing materials, and could allow an\nattacker to get a corporate email account with which to conduct a little\nfilet-o-phishing.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAbsolute clown shoes, this.\u003c/p\u003e\n\u003cp\u003e(Excellent punning from the The Register as you\u0026rsquo;d expect).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://antonz.org/is-online/\"\u003eAm I online?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAfter some research, I found this URL that Google itself seems to use in\nChrome to check for connectivity:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://google.com/generate_204\"\u003ehttp://google.com/generate_204\u003c/a\u003e\n\u003ca href=\"https://google.com/generate_204\"\u003ehttps://google.com/generate_204\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe URL returns a 204 No Content HTTP status\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is handy to know about. As close to a canonical connectivity URL as\nyou\u0026rsquo;ll find I expect.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/216-legally-purchased-media/#:~:text=visit%20from%20a%20good%20friend%20next%20weekend\"\u003eMy friend arrived\u003c/a\u003e on Friday night and left Sunday morning, so the weekend\nwas full and went quickly. Good times were made, chats were had. I was sad to\nsee him leave. I hate goodbyes.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://macrowave.co/\"\u003eMacrowave\u003c/a\u003e \u0026ndash; \u0026ldquo;Turn Your Mac Into a Private Radio Station\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI realised that all of my \u0026ldquo;ideas\u0026rdquo; for \u0026ldquo;apps\u0026rdquo; are actually just single feature\nideas that require me to build a whole other app in order to implement them.\nNot very time efficient 😆\u003c/p\u003e\n\u003cp\u003eFor example, I use \u003ca href=\"https://callsheetapp.com/\"\u003eCallsheet\u003c/a\u003e to track what TV or Movies I want to watch, and\nit works well for that, but it doesn\u0026rsquo;t let me view the movies on a calendar,\nwhich is what I would also like.\u003c/p\u003e",
      "date_published": "2025-08-24T00:00:00+00:00",
      "date_modified": "2025-08-24T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/216-legally-purchased-media/",
      "url": "https://elver.me/weeknotes/216-legally-purchased-media/",
      "title": "Weeknotes 216: Legally purchased media",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eChatGPT 5 was released last week so I gave it a try. It\u0026rsquo;s increasingly\ndifficult to keep up with the various different models, their versions, and\nhow good or bad they are at various tasks, but it seems \u0026ldquo;good\u0026rdquo; I suppose.\u003c/p\u003e\n\u003cp\u003eI was downloading some legally purchased media and had a text file of URLs to\ndownload (which I had to manually collate, will no one think of the\nchildren!) but my new AI overlord did help me out somewhat even offering to\nparallelize everything.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecat vids.txt | parallel -j4 yt-dlp \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  -f \u003cspan style=\"color:#d14\"\u003e\u0026#34;bv[height=2160]+ba/best\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  --merge-output-format mp4 \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  --remux-video mp4 \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  --no-fixup all \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  -o \u003cspan style=\"color:#d14\"\u003e\u0026#39;{#}-%\\(title\\).80s.%\\(ext\\)s\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e{}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI\u0026rsquo;ve never used \u003ccode\u003eparallel\u003c/code\u003e before, but it sure did max out my bandwidth or at\nleast make better use of it. After much back and forth, I had a working\ncommand which did perform as advertised, and a directory full o\u0026rsquo; files.\u003c/p\u003e\n\u003cp\u003eI wanted to check that each file, once downloaded, had an audio track/channel,\nand GPT 5 came up with this for fish shell which did do what I\nwanted:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003efor\u003c/span\u003e f in *.mp4\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e ffprobe -loglevel error -select_streams a -show_entries \u003cspan style=\"color:#008080\"\u003estream\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003eindex -of \u003cspan style=\"color:#008080\"\u003ecsv\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003ep\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003e$f\u003c/span\u003e | grep -q .\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#0086b3\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003e$f\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;: Yes\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#0086b3\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003e$f\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;: No\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  end\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eend\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWhich output:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e01_Linux_ISOs_Made_Easy.mp4 : Yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e02_Linux_ISOs_Made_Easy.mp4 : Yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e03_Linux_ISOs_Made_Easy.mp4 : Yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e04_Linux_ISOs_Made_Easy.mp4 : Yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e05_Linux_ISOs_Made_Easy.mp4 : Yes\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eGood enough for me.\u003c/p\u003e\n\u003cp\u003eThe power of the command line used to rely on one\u0026rsquo;s ability to remember all\nthe flags of some unix utility, which I don\u0026rsquo;t have. Maybe the power will be\nmore readily available to me now, or \u003cem\u003emaybe\u003c/em\u003e I\u0026rsquo;ll inadvertently wipe my\nfilesystem.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.monicahq.com/\"\u003eMonica\u003c/a\u003e \u0026ndash; Open source personal CRM.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMonica helps you organize the social interactions with your loved ones.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is a good idea.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://yoyo-code.com/why-is-github-ui-getting-so-much-slower/\"\u003eWhy is GitHub UI getting so much slower?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you try this out at home and play around with it, you\u0026rsquo;ll find out\nthat opening the \u0026ldquo;Files changed\u0026rdquo; link in a new tab is actually 2x faster\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBlimey.\u003c/p\u003e\n\u003cp\u003eI see this quite often with products I use. I start using them because they\nwork well and solve a problem for me. Fast forward a few years and they\u0026rsquo;ve\nstopped thinking about the product itself. Instead it\u0026rsquo;s all \u0026ldquo;partnerships\u0026rdquo; and\ntrying to sell me products. No, I won\u0026rsquo;t be getting a loan from you at\nastronomical rates. No, I\u0026rsquo;m not interested in insurance from your \u0026ldquo;partner\u0026rdquo;. I\ndon\u0026rsquo;t care if the product owner needs a raise.\u003c/p\u003e\n\u003cp\u003eMaybe less chat about AI and more work making the product work well?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://getgriddle.app/\"\u003eGriddle\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA native macOS menu bar app that provides quick window tiling with keyboard\nshortcuts and visual grid overlay. Just press QWE, ASD to tile your windows\ninstantly. DRM-free, one-time purchase for all your Macs.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI am a simple man. I see window tiling, I link.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://eahanson.com/articles/faster-tests\"\u003eMake Elixir Tests Faster\u003c/a\u003e \u0026ndash; some nice tips.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.dragcity.com/products/100-sound-effects\"\u003eFred Armisen - 100 Sound Effects\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFred Armisen, long known as one of the most curious\nactor/comedian/musician/producer/author/all-round good guys in the business,\nlikes unusual ways of entertaining people. Like this one: 100 Sound\nEffects is an album that can be used as a library, an industrial tool for\nyour own entertainment projects, or simply for brain-stimulating deep\nlistening. From basic sounds to more abstract scenarios, 100 Sound\nEffects is an album like no other!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eA mad idea, which is why I like it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.themoviedb.org/tv/157239-alien-earth\"\u003eAlien: Earth\u003c/a\u003e is very good 🙌\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNeovim looks to be \u003ca href=\"https://github.com/neovim/neovim/pull/33440\"\u003egetting\u003c/a\u003e \u003ca href=\"https://github.com/neovim/neovim/pull/34823\"\u003esupport\u003c/a\u003e for LSP’s \u003ca href=\"https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_documentColor\"\u003e\u003ccode\u003etextDocument/documentColor\u003c/code\u003e\u003c/a\u003e\nwhich allows the LSP to provide colours useful for CSS in particular, and\nother use cases, I\u0026rsquo;m sure.\u003c/p\u003e\n\u003cp\u003eSide note: The feedback from certain people on the PRs above are the reason I\nget fed up with this industry. Using words like \u0026ldquo;readable\u0026rdquo; and \u0026ldquo;objective\u0026rdquo;\nlike they are. Learn how to talk to people, nerds.\u003c/p\u003e\n\u003cp\u003eVia \u003ca href=\"https://www.reddit.com/r/neovim/comments/1moxwv9/hexadecimal_colors_in_v012_ootb/\"\u003eHexadecimal colors in v0.12 OOTB\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNever underestimate the speed with which banking organisations will drop the\ninterest rate on your accounts. The same people who will take your money\ninstantly, but insist that a refund takes 7-10 days. Bastards.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen I asked how I should \u003ca href=\"/weeknotes/214-a-bit-of-care-a-bit-of-craft/#:~:text=How%20would%20you%20transfer%201.7GB%20of%20photos%20to%20your%20partners%20computer%3F\"\u003eshare some files on my network\u003c/a\u003e a couple of weeks\nago I was inundated with suggestions (I wasn\u0026rsquo;t) but \u003ca href=\"https://simonstarr.com/\"\u003eSimon\u003c/a\u003e did suggest the\nobvious route I should have taken, built-in \u003ca href=\"https://support.apple.com/en-gb/guide/mac-help/mh17131/mac\"\u003eMac File Sharing\u003c/a\u003e. I will\nremember to do that next time.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://thecynical.dev/posts/ticket-driven-development/\"\u003eTicket-Driven Development: The Fastest Way to Go Nowhere\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eEventually, even the good devs stop caring.\u2028They stop asking questions.\u2028They\nstop solving problems.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBeen here. Often.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/215-slopsquatting/#:~:text=Going%20on%20holiday%20next%20week\"\u003eshort holiday\u003c/a\u003e in \u003ca href=\"https://en.wikipedia.org/wiki/Gothenburg\"\u003eGothenburg\u003c/a\u003e was fairly successful. It was nice enough,\nparticularly the people, but I wouldn\u0026rsquo;t \u003cem\u003erush\u003c/em\u003e back. Sometimes it\u0026rsquo;s just nice\nto get away.\u003c/p\u003e\n\u003cp\u003eSome highlights:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe partook in a walking tour as we usually do. My feet didn\u0026rsquo;t hurt at all\ndespite a lot of walking. Being lighter does have benefits.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe took a day trip to see the islands of \u003ca href=\"https://en.wikipedia.org/wiki/Styrs%C3%B6\"\u003eStyrsö\u003c/a\u003e and \u003ca href=\"https://en.wikipedia.org/wiki/Dons%C3%B6\"\u003eDonsö\u003c/a\u003e in the\n\u003ca href=\"https://en.wikipedia.org/wiki/Gothenburg_archipelago\"\u003eGothenburg archipelago\u003c/a\u003e. Very cheap and easy to catch the ferry over.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Styrs%C3%B6\"\u003eStyrsö\u003c/a\u003e and \u003ca href=\"https://en.wikipedia.org/wiki/Dons%C3%B6\"\u003eDonsö\u003c/a\u003e are \u0026ldquo;car less\u0026rdquo;. Sounds idyllic doesn\u0026rsquo;t it? What it\nactually means in effect is that everyone drives a golf cart or a scooter in\nthe kind of manner you\u0026rsquo;d expect with no (little?) police presence.\u003c/p\u003e\n\u003cp\u003eStill, very picturesque.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOf course \u003ca href=\"https://www.salut-saluhallen.se/en\"\u003ewe had Swedish meatballs\u003c/a\u003e. Superb.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://andymasley.substack.com/p/contra-the-uk-government-please-dont\"\u003eContra the UK government, please don\u0026rsquo;t delete your old photos and emails to\nsave water\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe group failed to compare how much water each choice saves. Once you do\nthat, it becomes clear how ridiculous this advice is. I did the math.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI am \u003cem\u003eshocked\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://slashdot.org/comments.pl?sid=23765914\u0026amp;cid=65583466\"\u003e\u0026ldquo;Sold his stock\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI earn money from my labor and pay something like 55% combined tax on it. I\nam the happiest person ever. Life to me was never about accomplishment, but\nabout Happiness, which is Smiles minus Frowns. I developed these\nphilosophies when I was 18-20 years old and I never sold out.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWoz seems to have it worked out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://maxrozen.com/onlineornot-diaries-25-you-can-just-build-things\"\u003eOnlineOrNot Diaries 25: you can just build things\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI know, it sounds cliché at this point, but you can just build things. What\ndo I mean by just build things? I mean, don\u0026rsquo;t obsess over the right\nlanguage, framework, tools, or approach to use. Just build something, and\nship it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s true.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn the absolute worst case, you get it wrong. Guess what? you can just fix\nit.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI totally agree with this. The problem is that I don\u0026rsquo;t believe it applies to\n\u003cem\u003eme\u003c/em\u003e. I\u0026rsquo;ve spent my whole life trying to not get it wrong so I don\u0026rsquo;t have to\nfix it later. And I don\u0026rsquo;t trust that I can fix it. Rationally I know this\nisn\u0026rsquo;t true, but I\u0026rsquo;m not always rational.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI am looking forward to a visit from a good friend next weekend ☺️\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eChatGPT 5 was released last week so I gave it a try. It\u0026rsquo;s increasingly\ndifficult to keep up with the various different models, their versions, and\nhow good or bad they are at various tasks, but it seems \u0026ldquo;good\u0026rdquo; I suppose.\u003c/p\u003e\n\u003cp\u003eI was downloading some legally purchased media and had a text file of URLs to\ndownload (which I had to manually collate, will no one think of the\nchildren!) but my new AI overlord did help me out somewhat even offering to\nparallelize everything.\u003c/p\u003e",
      "date_published": "2025-08-17T00:00:00+00:00",
      "date_modified": "2025-08-17T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/215-slopsquatting/",
      "url": "https://elver.me/weeknotes/215-slopsquatting/",
      "title": "Weeknotes 215: Slopsquatting",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI received a cheque (ask your parents) in the post this week. A cheque!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.m.wikipedia.org/wiki/Slopsquatting\"\u003eslopsquatting\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA new term called slopsquatting, a form of cybersquatting where users\nregister non-existent package names hallucinated by LLMs for unsuspecting\nusers to install\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s important to improve one\u0026rsquo;s vocabulary.\u003c/p\u003e\n\u003cp\u003eVia \u003ca href=\"https://selfh.st/weekly/2025-08-08/\"\u003eSelf-Host Weekly (8 August 2025)\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://x.com/ThatArrowsmith/status/1948490317277143438\"\u003eGeorge Arrowsmith\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eQA is about to become a huge bottleneck in software development. AI lets us\nchurn out HUGE amounts of code extremely fast, but you still need to make\nsure it works. AI can help with testing too, but if you \u003cem\u003ereally\u003c/em\u003e want to be\nsure it works, you need the reassurance of human eyes on it. And human eyes\ndon\u0026rsquo;t scale.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u0026ldquo;churn\u0026rdquo; being the operative word. So much churn.\u003c/p\u003e\n\u003cp\u003eCode reviews are also going to be very hard work. They\u0026rsquo;re already awful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://eltonminetto.dev/en/post/2025-06-19-go-more-opinated/\"\u003eGo should be more opinionated\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHow do you structure a project that will be developed and evolved by a team?\nAt this point, the language step aside from strong opinions, and each team\nor company needs to decide how to structure their projects.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eRuby on Rails \u003cem\u003edid\u003c/em\u003e pioneer this. Before Rails everyone was slapping together\nwebsites using their own homegrown \u0026ldquo;web frameworks\u0026rdquo; aka \u003ccode\u003efunctions.php\u003c/code\u003e. Like\nit or loath it, Rails brought a structure to answer the question \u0026ldquo;where does\nthis file go?\u0026rdquo; \u0026ndash; it\u0026rsquo;s just a shame they haven\u0026rsquo;t taken it beyond models,\nviews, and controllers for the most part.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBut it wasn\u0026rsquo;t always like this. For a long time, there was no official\npackage manager for the language; consequently, the community developed\nseveral alternatives. They all worked, but fragmentation was getting out of\ncontrol, making it challenging to integrate packages.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSee JavaScript. JavaScript, of course, takes it much further by having such a\ndreadful standard library, for so long, that \u003ca href=\"https://en.wikipedia.org/wiki/Npm_left-pad_incident\"\u003e\u003ccode\u003eleftpad\u003c/code\u003e\u003c/a\u003e becomes a thing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.ui.com/article/introducing-unifi-os-server\"\u003eIntroducing UniFi OS Server for MSPs\u003c/a\u003e \u0026ndash; This is interesting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://bower.sh/you-might-not-need-tmux\"\u003eYou might not need tmux\u003c/a\u003e (via \u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSome good points in here which I\u0026rsquo;ve suffered too — namely the native scroll\nback (and associated tmux-based scrolling which I always forget how to do!)\nand the “weirdness” with things like \u003ccode\u003eTERM\u003c/code\u003e but the solutions posited don\u0026rsquo;t\nseem any less buggy or difficult to setup to be honest. I won\u0026rsquo;t change for\nnow, but it did make me think that perhaps I might in the future.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fileutils.com/\"\u003eFileUtils\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAdvanced file operations and utilities integrated into macOS Finder\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSome nice power user utilities.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.jonoalderson.com/conjecture/javascript-broke-the-web-and-called-it-progress/\"\u003eJavaScript broke the web (and called it progress)\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eClearly written from the frustrated view of someone trying to get content\nchanges made (presumably for SEO reasons) but I agree with almost everything\nwritten here.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis isn\u0026rsquo;t just a technical issue. It’s an organisational one. We\u0026rsquo;ve handed\ncontrol of the web to the only people who understand the machinery. And\nthey’re too busy fixing the machine to stop and ask whether we needed it in\nthe first place.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eA lot of this goes on.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.zachdaniel.dev/p/elixir-misconceptions-1\"\u003eDon\u0026rsquo;t \u0026ldquo;let it crash\u0026rdquo;. Let it heal.\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA note to the Elixir programmers who commonly say \u0026ldquo;let it crash\u0026rdquo;: This\nphrase gives outsiders and newcomers the wrong idea, and encourages bad\nhabits for those who misinterpret it. If I had my way, we would stop saying\nit.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAre you looking for self-hosted software alternatives to popular commercial\nproducts? \u003ca href=\"https://selfh.st/\"\u003ehttps://selfh.st/\u003c/a\u003e is your friend.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fly.io/docs/machines/guides-examples/multi-container-machines/\"\u003eMulti-container Machines\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFly Machines support running multiple containers per virtual machine using\nthe containers array.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eYou can now deploy multiple containers to a single VM on Fly — very nice\nfeature improvement. I can see this being very useful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://elixirschool.com/en/lessons/misc/lua\"\u003eElixir School on Lua\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe Lua library for Elixir is an ergonomic wrapper around Luerl, Robert\nVirding’s pure Erlang implementation of Lua 5.3. Unlike other approaches\nthat rely on NIFs or other mechanisms, this implementation runs entirely on\nthe BEAM VM while providing excellent sandboxing and integration\ncapabilities.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://aresluna.org/frame-of-preference/\"\u003eFrame of preference — A history of Mac settings, 1984–2004\u003c/a\u003e — very cool. The\n\u003ca href=\"https://infinitemac.org/\"\u003einteractive Macs from Infinite Mac\u003c/a\u003e used in the article are very impressive —\nI\u0026rsquo;ve not seen these before.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://timeflies.buzz/\"\u003eTime Flies\u003c/a\u003e \u0026ndash; I was not at all impressed by this until I \u003ca href=\"https://www.youtube.com/watch?v=ljYUvrr-PvE\"\u003ewatched the\nvideo\u003c/a\u003e. Watch the video.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGoing on holiday next week \u0026ndash; whoo!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI received a cheque (ask your parents) in the post this week. A cheque!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.m.wikipedia.org/wiki/Slopsquatting\"\u003eslopsquatting\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA new term called slopsquatting, a form of cybersquatting where users\nregister non-existent package names hallucinated by LLMs for unsuspecting\nusers to install\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s important to improve one\u0026rsquo;s vocabulary.\u003c/p\u003e\n\u003cp\u003eVia \u003ca href=\"https://selfh.st/weekly/2025-08-08/\"\u003eSelf-Host Weekly (8 August 2025)\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://x.com/ThatArrowsmith/status/1948490317277143438\"\u003eGeorge Arrowsmith\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eQA is about to become a huge bottleneck in software development. AI lets us\nchurn out HUGE amounts of code extremely fast, but you still need to make\nsure it works. AI can help with testing too, but if you \u003cem\u003ereally\u003c/em\u003e want to be\nsure it works, you need the reassurance of human eyes on it. And human eyes\ndon\u0026rsquo;t scale.\u003c/p\u003e",
      "date_published": "2025-08-10T00:00:00+00:00",
      "date_modified": "2025-08-10T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/214-a-bit-of-care-a-bit-of-craft/",
      "url": "https://elver.me/weeknotes/214-a-bit-of-care-a-bit-of-craft/",
      "title": "Weeknotes 214: A bit of care. A bit of craft.",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAugust? Unacceptable.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe had the misfortune of catching some of \u003ca href=\"https://www.themoviedb.org/movie/755898-war-of-the-worlds\"\u003eWar of the Worlds\u003c/a\u003e with Ice Cube\nthis week. The part where he uses \u0026ldquo;View Source\u0026rdquo; was my personal highlight\nbefore we turned it off.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHow would you transfer 1.7GB of photos to your partners computer? We\u0026rsquo;re both\non the same WiFi network, and there\u0026rsquo;s no central shared file storage\navailable. AirDrop is a reasonable approach isn\u0026rsquo;t it? Peer-to-peer transfer,\njob done.\u003c/p\u003e\n\u003cp\u003eNope. AirDrop would consistently work until \u003cem\u003eabout\u003c/em\u003e halfway, and then just\nstall forever.\u003c/p\u003e\n\u003cp\u003eThis sort of thing makes me feel completely incompetent as both a computer\nperson and human. In the end we used \u003ca href=\"https://wetransfer.com/\"\u003eWeTransfer\u003c/a\u003e. That\u0026rsquo;s right, we pushed\n1.7GB of data up and then pulled 1.7GB of data back down. What a time.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.yellowduck.be/posts/make-io-inspect-colorful-and-readable-in-elixir\"\u003eMake IO.inspect colorful and readable in Elixir\u003c/a\u003e 🌈\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy office has slowly been accumulating more and more stuff, so a tidy up was\ndue. I\u0026rsquo;ve pretty much only succeeded in making a big ol\u0026rsquo; mess though 🤦‍♂️\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs part of my office tidy, I found some ticket stubs for various gigs I\u0026rsquo;d\nattended. Let me tell you, late 2015 to late 2017 was the glory years for live\nmusic and comedy. I\u0026rsquo;d completely forgotten that I\u0026rsquo;d even seen some of these\nartists.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMusicians:\u003c/strong\u003e \u003ca href=\"https://en.wikipedia.org/wiki/Queens_of_the_Stone_Age\"\u003eQueens of the Stone Age\u003c/a\u003e, \u003ca href=\"https://en.wikipedia.org/wiki/Eagles_of_Death_Metal\"\u003eEagles of Death Metal\u003c/a\u003e, \u003ca href=\"https://en.wikipedia.org/wiki/Father_John_Misty\"\u003eFather\nJohn Misty\u003c/a\u003e, \u003ca href=\"https://en.wikipedia.org/wiki/The_Hotelier\"\u003eThe Hotelier\u003c/a\u003e, \u003ca href=\"https://en.wikipedia.org/wiki/Touch%C3%A9_Amor%C3%A9\"\u003eTouché Amoré\u003c/a\u003e, \u003ca href=\"https://en.wikipedia.org/wiki/Jimmy_Eat_World\"\u003eJimmy Eat World\u003c/a\u003e, \u003ca href=\"https://en.wikipedia.org/wiki/Silversun_Pickups\"\u003eSilversun\nPickups\u003c/a\u003e, \u003ca href=\"https://en.wikipedia.org/wiki/Turin_Brakes\"\u003eTurin Brakes\u003c/a\u003e, and \u003ca href=\"https://en.wikipedia.org/wiki/Regina_Spektor\"\u003eRegina Spektor\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eComedians:\u003c/strong\u003e \u003ca href=\"https://en.wikipedia.org/wiki/John_Robins_(comedian)\"\u003eJohn Robins\u003c/a\u003e, \u003ca href=\"https://en.wikipedia.org/wiki/Elis_James_and_John_Robins\"\u003eElis James and John Robins\u003c/a\u003e twice, \u003ca href=\"https://en.wikipedia.org/wiki/Daniel_Kitson\"\u003eDaniel\nKitson\u003c/a\u003e, and \u003ca href=\"https://en.wikipedia.org/wiki/Romesh_Ranganathan\"\u003eRomesh Ranganathan\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(Please visit one of these links, it took ages to link \u0026rsquo;em up 🙏)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://vereis.com/posts/my_programming_journey\"\u003eMy Programming Journey\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI feel like I \u0026ldquo;lost myself\u0026rdquo; over the years. I got too focused on backend\nsystems and business problems, too far from the creative drive that\noriginally motivated me.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI feel ya.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/playlist?list=PLHFP2OPUpCeZcPutT9yn4-e0bMmrn5Gd1\"\u003eRails New, a beginner\u0026rsquo;s Ruby on Rails tutorial\u003c/a\u003e \u0026ndash; Glad to see that the Rails\nFoundation have produced this beginners series for getting into Rails.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.joshwcomeau.com/svg/friendly-introduction-to-svg/\"\u003eA Friendly Introduction to SVG\u003c/a\u003e \u0026ndash; I haven\u0026rsquo;t been through all of this because\nconcentration, but it\u0026rsquo;s extremely well done. This is the sort of web craft\nthat is often missing these days 👴\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e👆 is where I found out about the \u003ca href=\"https://www.atipofoundry.com/fonts/wotfard\"\u003eWotfard\u003c/a\u003e typeface — very nice. In fact, the\n\u003ca href=\"https://www.atipofoundry.com\"\u003eatipo foundry\u003c/a\u003e has a ton of really nice fonts — I really like \u003ca href=\"https://www.atipofoundry.com/fonts/bariol-serif\"\u003eBariol Serif\u003c/a\u003e\nand \u003ca href=\"https://www.atipofoundry.com/fonts/noway-round\"\u003eNoway Round\u003c/a\u003e in particular. Linking here for when I need a new font.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/212-bungie-cords/#:~:text=We%20finally%20gave%20in%20and%20bought%20a%20new%20mattress%20after%20unhappily%20living%20with%20the%20one%20we%20bought%20just%20over%20a%20year%20ago\"\u003eThe new mattress was delivered\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIn an act of hubris I turned down the offer from the delivery men to take it\nupstairs for me thinking \u0026ldquo;how heavy can a box be?\u0026rdquo; — turns out extremely\nfucking heavy. I could not lift the box. Instead I had to push it up, on its\nside, step by step, until I got to the top.\u003c/p\u003e\n\u003cp\u003eDespite transportation issues, so far we\u0026rsquo;re deeming it a success. Insofar as\nit\u0026rsquo;s comfortable, and we don\u0026rsquo;t have a mound in the middle of the bed anymore.\nNow to get rid of the old one\u0026hellip;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.jonoalderson.com/conjecture/its-time-for-modern-css-to-kill-the-spa/\"\u003eIt\u0026rsquo;s time for modern CSS to kill the SPA\u003c/a\u003e \u0026ndash; I\u0026rsquo;ve been waiting for the \u003ca href=\"https://developer.chrome.com/docs/web-platform/view-transitions/\"\u003eView\nTransitions API\u003c/a\u003e to become supported enough that we can stop the blight of\nSPAs we\u0026rsquo;ve all been enduring the last tens years or so.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy Plex server went haywire this week. We rely heavily on Plex in our house so\nwhen it goes wrong it can be very annoying.\u003c/p\u003e\n\u003cp\u003eIt started when I visited the Plex dashboard to find all the media I\u0026rsquo;d added\nin approximately the last month missing 🙀 My \u0026ldquo;Continue Watching\u0026rdquo; was also not\nshowing anything and some new playlists I pinned were also gone.\u003c/p\u003e\n\u003cp\u003ePanic immediately sets in as I imagine major disk corruption as the cause. But\nI run ZFS, and it has been super solid for me for years, so that seems\nunlikely. I find that the files are present on the filesystem.\u003c/p\u003e\n\u003cp\u003eI had rebooted the server the day before as a last ditch attempt at fixing\nsome other unrelated errors, so it seemed likely that this might have\ntriggered something.\u003c/p\u003e\n\u003cp\u003eI did a rescan and nothing seemed to happen at first but after a few minutes\nsome files did appear, good, but they\u0026rsquo;re are all out of order from when I\nadded them, bad/annoying.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s then that I start thinking perhaps the Plex SQLite database had become\ncorrupted instead. I have automatic database backups turned on, so I went\nlooking for them but found they didn\u0026rsquo;t seem to have run in the last month or\nso \u0026ndash; weird. Why would the backups be so old?\u003c/p\u003e\n\u003cp\u003eEverything just seemed a bit \u003cem\u003eout of date\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eThen it dawned on me that I was looking at a different Plex server. I was\nlooking at the system installed version. The version installed via \u003ccode\u003eapt\u003c/code\u003e years\nago before \u003ca href=\"/weeknotes/203-bug-ridden-forms/#:~:text=Moving%20my%20Plex%20installation%20to%20run%20under%20Docker\"\u003emigrating to Docker\u003c/a\u003e. It seems that I had left the old package\ninstalled and when I rebooted it started up the \u0026ldquo;old\u0026rdquo; Plex server via\n\u003ccode\u003esystemd\u003c/code\u003e and (presumably because of the way Docker networking works?) that\nserver was taking priority over the Docker-installed version as they\u0026rsquo;re both\nbound to the same port.\u003c/p\u003e\n\u003cp\u003eI stopped the server with \u003ccode\u003esudo systemctl stop plexmediaserver\u003c/code\u003e and \u003cem\u003emy\u003c/em\u003e\nPlex sprung back into action! Everything present and correct \u0026ndash; \u003cem\u003ephew\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esudo apt remove plexmediaserver\u003c/code\u003e ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.ispreview.co.uk/index.php/2025/07/uk-government-warns-promoting-the-use-of-vpns-could-attract-fines.html\"\u003eUK Government Warns Promoting the Use of VPNs Could Attract Fines\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eOur poorly thought out law isn\u0026rsquo;t quite having the effect we wanted it to so\nwe’re going to use threats instead.\u003c/p\u003e\n\u003cp\u003eWell done guys.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://panamaplaylists.com/\"\u003ePanama Playlists\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI found the real Spotify accounts of celebrities, politicians, and\njournalists. Many use their real names. With a little sleuthing, I could say\nwith near-certainty: yep, this is them. Heard of the Panama Papers? That\nexposed offshore bank accounts. This is about onshore vibes.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eEven if this is fake, still funny.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.yellowduck.be/posts/elixir-usagerules-development-tool\"\u003eElixir UsageRules development tool\u003c/a\u003e \u0026ndash; This is an interesting tool to help\nwith LLM usage.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHave you ever used a food/diet tracking app and hated every moment of it? Me\ntoo. They\u0026rsquo;re all generally terrible in some way. Some have good enough\nusability but terrible food databases. Some are awful to enter numbers into \u0026ndash;\nessentially their primary goal.\u003c/p\u003e\n\u003cp\u003eI accidentally came across \u003ca href=\"https://macrofactorapp.com/\"\u003eMacroFactor\u003c/a\u003e and it might actually be good 🤔\n(gonna cost you though).\u003c/p\u003e\n\u003cp\u003eThis app does crazy things like focus the text field that you need to type\ninto automatically speeding up data entry dramatically 😮\u003c/p\u003e\n\u003cp\u003eA bit of care. A bit of craft.\u003c/p\u003e\n\u003cp\u003eIt also apparently does some algorithmic gubbins to suggest what your macros\nshould be. I\u0026rsquo;m less interested in that, but we\u0026rsquo;ll see.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.datacenterdynamics.com/en/news/design-platform-figma-spends-300000-on-aws-daily/\"\u003eDesign platform Figma spends $300,000 on AWS daily\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDaily. $300,000 per \u003cem\u003eday\u003c/em\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn addition to the high hosting cost, Figma notes that its platform is\nentirely dependent on AWS\u0026rsquo; performance and can be affected by outages.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMuppets.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://proton.me/blog/authenticator-app\"\u003eIntroducing Proton Authenticator – secure 2FA, your way\u003c/a\u003e \u0026ndash; I am tempted to\ntry this as I\u0026rsquo;m currently relying on Google Authenticator and we all know how\nrelying on Google usually ends.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI think I\u0026rsquo;m listening to too many podcasts, especially at the gym. Being at\nthe gym seems to be a podcast listening hour and less \u003cem\u003eworking out\u003c/em\u003e. I should\nbe concentrating on getting \u003ca href=\"https://www.urbandictionary.com/define.php?term=swol\"\u003eswol\u003c/a\u003e. I also realised that I\u0026rsquo;ve been missing\nlistening to music as much as I used to. Time for a change.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAugust? Unacceptable.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe had the misfortune of catching some of \u003ca href=\"https://www.themoviedb.org/movie/755898-war-of-the-worlds\"\u003eWar of the Worlds\u003c/a\u003e with Ice Cube\nthis week. The part where he uses \u0026ldquo;View Source\u0026rdquo; was my personal highlight\nbefore we turned it off.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHow would you transfer 1.7GB of photos to your partners computer? We\u0026rsquo;re both\non the same WiFi network, and there\u0026rsquo;s no central shared file storage\navailable. AirDrop is a reasonable approach isn\u0026rsquo;t it? Peer-to-peer transfer,\njob done.\u003c/p\u003e",
      "date_published": "2025-08-03T00:00:00+00:00",
      "date_modified": "2025-08-03T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/213-here-we-go-again/",
      "url": "https://elver.me/weeknotes/213-here-we-go-again/",
      "title": "Weeknotes 213: Here we go again",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAfter moaning about \u003ca href=\"https://castro.fm/\"\u003eCastro\u003c/a\u003e (to myself, then to friends, and \u003ca href=\"/weeknotes/200-reciprocating-saw/#:~:text=Playing%20audio%20via,with%20the%20car!\"\u003ehere\u003c/a\u003e) I\ndecided to contact their support over a weird issue I\u0026rsquo;ve been having when\nusing it via CarPlay. They said they were going to revisit. We\u0026rsquo;ll see.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://antirez.com/news/154\"\u003eCoding with LLMs in the summer of 2025 (an update)\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe fundamental requirement for the LLM to be used is: don\u0026rsquo;t use agents or\nthings like editor with integrated coding agents.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is interesting as it goes directly against how most people are\nrecommending getting the most out of AI, but I find myself also leaning\ntowards this way of working.\u003c/p\u003e\n\u003cp\u003eMaybe I\u0026rsquo;m a control freak, but unscrambling and trying to understand why the\nagent has done can take me longer than stepping through manually without an\nagent.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://git-quick-stats.sh/\"\u003egit-quick-stats.sh\u003c/a\u003e \u0026ndash; This might be handy for those of you still counting\nlines as the greatest contribution to a project. You know who you are ;)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe visited Blackpool on Monday (it was near where we were \u003ca href=\"/weeknotes/212-bungie-cords/#:~:text=I%20bought%20a%20second%2Dhand%20armchair%20for%20my%20office%20on%20eBay\"\u003epicking the chair\nup from\u003c/a\u003e). If you have nothing good to say don\u0026rsquo;t say anything at all, however,\nhighlights were the very fancy car park in the centre, and the massive Tesco\nExtra - really, it has to be seen to be believed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/212-bungie-cords/#:~:text=it%20borderline%20won%E2%80%99t%20fit%20in%20my%20car\"\u003eThe chair, unbelievably, did fit inside my car\u003c/a\u003e although it was touch and go\nfor a few minutes \u0026ndash; it was looking unlikely until we flipped it over.\u003c/p\u003e\n\u003cp\u003eGetting it inside the house when we got home was a different matter. I was\nclearly focussing on the wrong aperture. Thankfully we managed to get it\nthrough the front bay window which is much wider than our front door. Then we\nneeded to get it up two more floors - we left that ’til the next day. It was a\nstruggle, but we eventually managed it.\u003c/p\u003e\n\u003cp\u003eI have to keep it now.\u003c/p\u003e\n\u003cp\u003eIt was slightly grubby in places, but overall condition is good, and I\u0026rsquo;ve now\ncleaned it up using a foam based cleaner which is fun if nothing else.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://defraenvironment.blog.gov.uk/2025/01/31/introducing-the-deposit-return-scheme-for-drinks-containers/\"\u003eIntroducing the deposit return scheme for drinks containers\u003c/a\u003e \u0026ndash; this seems\nlike a good sensible thing which is why it\u0026rsquo;s even more surprising that it\u0026rsquo;s\nhappening. The devil will be in the detail though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://zeropath.com/blog/idor-crisis-2025\"\u003eAuthorization Bugs Are Having Their SQL Injection Moment\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhy? Because every authorization check is unique to your business logic\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis does not surprise me. We still ignore the basics. No one gets praise for\ngetting the basics right.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://rubytalk.org/t/ann-rails-0-5-0-the-end-of-vaporware/12744\"\u003e[ANN] Rails 0.5.0: The end of vaporware!\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve been talking (and hyping) Rails for so long that it’s all wierd to\nfinally have it out in the open. Mind you, we’re still not talking about a\n1.0 release, but the package currently on offer is still something I’m very\ncomfortable to share with the world. Undoubtedly, there could be more\ndocumentation and more examples, but Real Artists Ship and this piece will\ngrow in public. Enjoy Rails!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eTime really does fly.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/news/713653/judge-withdraws-cormedix-case-ai-citation-errors\"\u003e\u0026ldquo;Errors found in US judge’s withdrawn decision stink of AI\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe opinion cited made-up quotes and misstated case outcomes, errors that AI\ntools are known to hallucinate.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHere we fucking go. Jesus.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCompleting the \u003ca href=\"https://survey.devographics.com/en-US/survey/state-of-html/2025\"\u003eState of HTML 2025 survey\u003c/a\u003e was a sobering activity for someone\nwho is supposedly a web developer. I don\u0026rsquo;t even HTML anymore.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve started counselling again. Hopefully I can sort myself out before\nfinancial and mental ruin sets in.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAfter moaning about \u003ca href=\"https://castro.fm/\"\u003eCastro\u003c/a\u003e (to myself, then to friends, and \u003ca href=\"/weeknotes/200-reciprocating-saw/#:~:text=Playing%20audio%20via,with%20the%20car!\"\u003ehere\u003c/a\u003e) I\ndecided to contact their support over a weird issue I\u0026rsquo;ve been having when\nusing it via CarPlay. They said they were going to revisit. We\u0026rsquo;ll see.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://antirez.com/news/154\"\u003eCoding with LLMs in the summer of 2025 (an update)\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe fundamental requirement for the LLM to be used is: don\u0026rsquo;t use agents or\nthings like editor with integrated coding agents.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is interesting as it goes directly against how most people are\nrecommending getting the most out of AI, but I find myself also leaning\ntowards this way of working.\u003c/p\u003e",
      "date_published": "2025-07-27T00:00:00+00:00",
      "date_modified": "2025-07-27T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/212-bungie-cords/",
      "url": "https://elver.me/weeknotes/212-bungie-cords/",
      "title": "Weeknotes 212: Bungie cords",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jordivillar.com/blog/becoming-irrelevant\"\u003eAm I Becoming Irrelevant?\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI bought a second-hand armchair for my office on eBay. We pick it up tomorrow,\nand it borderline won\u0026rsquo;t fit in my car, so that should be fun. I\u0026rsquo;ve acquired\nsome bungie cords which will hopefully help me bend the laws of physics.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.mux.com/blog/tailwind-is-the-worst-form-of-css-except-for-all-the-others\"\u003eTailwind is the worst form of CSS, except for all the others\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m happy to report that \u003ca href=\"/weeknotes/210-sorry-i-m-sweaty-it-s-genetic/#:~:text=I%20have%20attempted%20to%20split%20up%20my%20Monstera%20into%20several%20plants\"\u003emy Monstera cuttings\u003c/a\u003e are doing unexpectedly well\nhaving all started to grow very nice roots.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://justin.searls.co/mails/2025-06\"\u003eSearls of Wisdom for June 2025\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe all live in prisons of our own design, and it\u0026rsquo;s worth pondering whether\nbeing liberated from all constraints would result in true freedom or in the\ninstallation of new constraints.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://youtu.be/81-1fQaRMWo?si=1Xn_iByMM_WA-I8G\"\u003eChristopher MacArthur Boyd | Scary Times\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been enjoying \u003ca href=\"https://www.globalplayer.com/podcasts/42KwqS/\"\u003eHere Comes The Guillotine podcast\u003c/a\u003e for some time, and one\nof it’s hosts, Christopher MacArthur Boyd (whom I\u0026rsquo;d never heard of before the\npodcast) released his standup special on YouTube recently. I enjoyed it very\nmuch.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDid you know that you can \u003cem\u003egasp\u003c/em\u003e use Linux as your OS if like it better than\nmacOS. You don\u0026rsquo;t even need to have any ulterior motives.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.arkency.com/stop-concatenating-urls-with-strings/\"\u003eStop concatenating URLs with strings — Use proper tools instead\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYour code will be more reliable, easier to maintain and less prone to URL\nformatting errors.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSome good advice and tips here. People love concatenating strings though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/bitcrowd/tickety-tick/\"\u003etickety-tick\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA browser extension that helps you name branches and write better commit\nmessages\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAn interesting idea, but I think I\u0026rsquo;d prefer to do this from the command line\nrather than the browser. You might not.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mensfeld.pl/2025/07/solving-ruby-rdkafka-installation-problem/\"\u003eThe 60-Second Wait: How I Spent Months Solving the Ruby’s Most Annoying Gem\nInstallation Problem\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSounds simple, right? It wasn\u0026rsquo;t.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve wondered why more people don\u0026rsquo;t ship statically compiled binaries and now\nI know why - bit of a nightmare.\u003c/p\u003e\n\u003cp\u003eA lot of work has gone into this ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe finally gave in and bought a new mattress after unhappily living with the\none we bought just over a year ago. If we\u0026rsquo;d been more organised we could\u0026rsquo;ve\nreturned the current mattress within 100 days, but we were not, so we didn\u0026rsquo;t.\u003c/p\u003e\n\u003cp\u003eHopefully the new one will be better.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://lewiscampbell.tech/blog/250718.html\"\u003eNIH Is Far Cheaper Than The Wrong Dependency\u003c/a\u003e \u0026ndash; this is something that I\u0026rsquo;ve\nnoticed in the Elixir community \u0026ndash; far more willingness to write things from\nscratch which someone in the Ruby community would definitely rely on a gem\nfor.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://terriblesoftware.org/2025/07/18/why-most-feedback-shouldnt-exist/\"\u003eWhy Most Feedback Shouldn\u0026rsquo;t Exist\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you can\u0026rsquo;t point to a specific, concrete impact, then what you have isn\u0026rsquo;t\nfeedback — it\u0026rsquo;s a preference. And preferences aren\u0026rsquo;t performance issues.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is the case with a lot of technical feedback too. \u0026ldquo;Best Practices\u0026rdquo; are\njust \u0026ldquo;the way I want to do it\u0026rdquo; under a different name to make it sound\nlegitimate.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI tried \u003ca href=\"https://en.wikipedia.org/wiki/Tim_Tam\"\u003eTim Tams\u003c/a\u003e this week. They\u0026rsquo;re absolutely fine, but would recommend you\n\u003ca href=\"https://en.wikipedia.org/wiki/Penguin_%28biscuit%29\"\u003ep-p-p-Pickup a Penguin\u003c/a\u003e instead.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jordivillar.com/blog/becoming-irrelevant\"\u003eAm I Becoming Irrelevant?\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI bought a second-hand armchair for my office on eBay. We pick it up tomorrow,\nand it borderline won\u0026rsquo;t fit in my car, so that should be fun. I\u0026rsquo;ve acquired\nsome bungie cords which will hopefully help me bend the laws of physics.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.mux.com/blog/tailwind-is-the-worst-form-of-css-except-for-all-the-others\"\u003eTailwind is the worst form of CSS, except for all the others\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m happy to report that \u003ca href=\"/weeknotes/210-sorry-i-m-sweaty-it-s-genetic/#:~:text=I%20have%20attempted%20to%20split%20up%20my%20Monstera%20into%20several%20plants\"\u003emy Monstera cuttings\u003c/a\u003e are doing unexpectedly well\nhaving all started to grow very nice roots.\u003c/p\u003e",
      "date_published": "2025-07-20T00:00:00+00:00",
      "date_modified": "2025-07-20T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/211-10-litres-of-shower-gel/",
      "url": "https://elver.me/weeknotes/211-10-litres-of-shower-gel/",
      "title": "Weeknotes 211: 10 litres of shower gel",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe travelled back from dahn sahf on Tuesday. The journey back was far less\npleasant and included a surprise appearance from the low oil level warning\nlight on my car, and a fair bit of traffic, which meant it took 6 hours\ninstead 4.\u003c/p\u003e\n\u003cp\u003eStill, the trip was a successful one having completed all the tasks we needed\nto do, including 8 different appointments. Some decisions to be made now.\u003c/p\u003e\n\u003cp\u003eI even managed a trip to the gym one day, and to balance everything, a meal at\nour favourite restaurant.\u003c/p\u003e\n\u003cp\u003eThe trip was all much worse in my head than in reality. As usual. Have you\neven been anywhere if you don\u0026rsquo;t stress about it for a couple of weeks\nbeforehand?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe recent Amazon Prime Day sale got me but I might\u0026rsquo;ve bought stuff I actually\nneed instead of random guff. What I\u0026rsquo;m saying is I bought 10.8 litres of shower\ngel.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI also bought an electric blanket 🥶\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.prateekcodes.dev/rails-adds-association-deprecation/\"\u003eRails 8.1 adds association deprecation to safely remove unused relationships\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis is welcome and interesting feature 👏 It does feels like a plaster\nthough. As I\u0026rsquo;ve said before, so much refactoring is difficult/dangerous in\nRuby because we can\u0026rsquo;t be sure we\u0026rsquo;ve caught all call sites when making changes,\nand associations are only a small part of the problem. Still, very welcome I\u0026rsquo;d\nsay.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jacob.gold/posts/serving-200-million-requests-with-cgi-bin/\"\u003eServing 200 million requests per day with a cgi-bin\u003c/a\u003e \u0026ndash; Do you all know what\na \u003ccode\u003ecgi-bin\u003c/code\u003e is?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThree more builders this week. The first was in the house maybe 6 minutes, and\nwas quickly onto payment terms. The second was very nice, but seemed like a\nconstruction version of George Burns. And the third seemed \u0026ldquo;OK\u0026rdquo; but confirmed\nthe appointment an hour before, on a Sunday.\u003c/p\u003e\n\u003cp\u003eIt is becoming increasingly clear that there might not be a best option, only\nleast worst. Everything is pros and cons. Our current favourite remains.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA fair bit of socialising this week compared to most. Friday night dinner with\nfriends at a new restaurant we hadn\u0026rsquo;t tried before, and a lunch time catch-up\nwith Discoliam in Sheffield on Saturday. Sheffield is further than I\nremembered.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe travelled back from dahn sahf on Tuesday. The journey back was far less\npleasant and included a surprise appearance from the low oil level warning\nlight on my car, and a fair bit of traffic, which meant it took 6 hours\ninstead 4.\u003c/p\u003e\n\u003cp\u003eStill, the trip was a successful one having completed all the tasks we needed\nto do, including 8 different appointments. Some decisions to be made now.\u003c/p\u003e",
      "date_published": "2025-07-13T00:00:00+00:00",
      "date_modified": "2025-07-13T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/210-sorry-i-m-sweaty-it-s-genetic/",
      "url": "https://elver.me/weeknotes/210-sorry-i-m-sweaty-it-s-genetic/",
      "title": "Weeknotes 210: Sorry I'm sweaty, it's genetic!",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThree more meetings with builders this week\u0026hellip;it\u0026rsquo;s a surprising amount of work\nmeeting with builders and discussing extensions you can\u0026rsquo;t really afford.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStarted off the week with yet another escape into the cinema, this time \u003ca href=\"https://www.themoviedb.org/movie/1122099-the-ballad-of-wallis-island\"\u003eThe\nBallad of Wallis Island\u003c/a\u003e. I cannot say enough good things about this film. It\nsimply doesn\u0026rsquo;t put a foot wrong. I\u0026rsquo;ve been a fan of \u003ca href=\"https://en.wikipedia.org/wiki/Tim_Key\"\u003eTim Key\u003c/a\u003e for quite a\nwhile but \u003ca href=\"https://en.wikipedia.org/wiki/Tom_Basden\"\u003eTom Basden\u003c/a\u003e was fairly unknown to me \u0026ndash; what a talented pair they\nare. Tom Basden wrote a whole album of songs for the film as well as\nco-writing and starring. \u003ca href=\"https://en.wikipedia.org/wiki/Sian_Clifford\"\u003eSian Clifford\u003c/a\u003e delivers as she usually does too.\nLoved it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOn Thursday we both went to see Jurassic Park Rebirth. You know what it is,\nbut at least it doesn\u0026rsquo;t have Chris Pratt in it. Fairly enjoyable nonsense.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFour films in two weeks \u0026ndash; procrastination mode enabled ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhilst in Brighton I discovered \u003ca href=\"https://dalstons.com/\"\u003eDalston\u0026rsquo;s Soda\u003c/a\u003e \u0026ndash; they\u0026rsquo;re fantastic so I\nbought a mixed box to try. Impressively low calorie too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=bBU7gVNqVFw\"\u003eRegisters Explained - Vim Tips \u0026amp; Tricks - Stop Losing Text in Vim\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve never understood/never taken the time to understand Vim registers. Now I\nhave. As you\u0026rsquo;d expect they\u0026rsquo;re extremely full featured and overwhelming, but at\ntheir core fairly easy to grok.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which, \u003ca href=\"https://www.reddit.com/r/neovim/comments/1lp9skj/paste_without_copying_into_register_when/\"\u003eI found out\u003c/a\u003e that if you paste using \u003ccode\u003eP\u003c/code\u003e instead of \u003ccode\u003ep\u003c/code\u003e\nthe default register doesn\u0026rsquo;t get overwritten by the text onto which you\u0026rsquo;re\npasting. I\u0026rsquo;ve had this problem for years and I\u0026rsquo;ve just lived with.\u003c/p\u003e\n\u003cp\u003eThis is what makes Reddit hard to give up; it is actually useful occasionally.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gist.github.com/jordelver/e890777d40bf443d20ae93cf58fe310c\"\u003ekelvinauta/remove_comments.lua\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis function removes all comments from your code using treesitter in nvim.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNice example of Neovim Lua APIs.\u003c/p\u003e\n\u003cp\u003e(It actually doesn\u0026rsquo;t work as I would expect, leaving behind whitespace etc,\nbut it\u0026rsquo;s I still think it a valuable demonstration.)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI caught up with some of the Glastonbury coverage over last week. I found most\nof it a bit lack lustre to be honest.\u003c/p\u003e\n\u003cp\u003eHowever, \u003ca href=\"https://www.youtube.com/watch?v=3rykqo4uc3o\"\u003eDog Dribble by Getdown Services\u003c/a\u003e is brilliant. I\u0026rsquo;m obsessed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI re-potted a load of my indoor plants this week. I have attempted to split up\nmy \u003ca href=\"https://en.wikipedia.org/wiki/Monstera\"\u003eMonstera\u003c/a\u003e into several plants (thanks YouTube!). One of the cuttings has\nalready started sprouting roots so it\u0026rsquo;s looking good so far. It will take a\nwhile to see what else has survived and what I\u0026rsquo;ve killed off.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://infosecwriteups.com/burn-it-with-fire-how-to-eliminate-an-industry-wide-supply-chain-vulnerability-12515516fb56?gi=e6037f4e9be1\"\u003eBurn It With Fire: How to Eliminate an Industry-Wide Supply Chain\nVulnerability\u003c/a\u003e \u0026ndash; this sounds like a lot of work, respect.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn an attempt to take my exercise regime more seriously I decided that I need\nto work on being able to get into a full squat unaided and without weight.\nThis is often referred to as the resting squat.\u003c/p\u003e\n\u003cp\u003eLong story short I started some stretches and now have strained muscles in my\nfeet. \u003ca href=\"https://www.youtube.com/watch?v=qtjqh6IpIbU\"\u003eThe lesson is never try\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://andre.arko.net/2025/06/30/you-should-delete-tests/\"\u003eYou should delete tests\u003c/a\u003e \u0026ndash; I could not agree more. Good luck convincing your\ncolleagues though!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe drove down to Somerset on Sunday for a visit to the old country. I spent\nmost of the week feeling a low-level anxiety as a result. Not sure why. I was\ndreading the drive but that turned out to be easy enough. I\u0026rsquo;ve got a few\nappointments to deal with whilst I\u0026rsquo;m here, which I am also not looking forward\nto, and I don\u0026rsquo;t know what will come of those. It should at the very least\nprovide an opportunity to catch-up with a few people.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://write.as/conjure-utopia/lets-say-youre-working-in-tech-and-you-have-a-technical-role-youre-a\"\u003eI want to leave tech: what do I do?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eImagination alone is never sufficient to create change, but it\u0026rsquo;s always\nnecessary. Ultimately though, finding your space of agency is your own\nresponsibility: nobody can do it for you.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eShame.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThree more meetings with builders this week\u0026hellip;it\u0026rsquo;s a surprising amount of work\nmeeting with builders and discussing extensions you can\u0026rsquo;t really afford.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStarted off the week with yet another escape into the cinema, this time \u003ca href=\"https://www.themoviedb.org/movie/1122099-the-ballad-of-wallis-island\"\u003eThe\nBallad of Wallis Island\u003c/a\u003e. I cannot say enough good things about this film. It\nsimply doesn\u0026rsquo;t put a foot wrong. I\u0026rsquo;ve been a fan of \u003ca href=\"https://en.wikipedia.org/wiki/Tim_Key\"\u003eTim Key\u003c/a\u003e for quite a\nwhile but \u003ca href=\"https://en.wikipedia.org/wiki/Tom_Basden\"\u003eTom Basden\u003c/a\u003e was fairly unknown to me \u0026ndash; what a talented pair they\nare. Tom Basden wrote a whole album of songs for the film as well as\nco-writing and starring. \u003ca href=\"https://en.wikipedia.org/wiki/Sian_Clifford\"\u003eSian Clifford\u003c/a\u003e delivers as she usually does too.\nLoved it.\u003c/p\u003e",
      "date_published": "2025-07-06T00:00:00+00:00",
      "date_modified": "2025-07-06T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/209-twenty-minute-episode/",
      "url": "https://elver.me/weeknotes/209-twenty-minute-episode/",
      "title": "Weeknotes 209: Twenty minute episode",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gitignore.0x00.cl/\"\u003eGUItignore\u003c/a\u003e \u0026ndash; handy for creating your \u003ccode\u003e.gitignore\u003c/code\u003e file.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://basicappleguy.com/basicappleblog/macos-icon-history\"\u003eMACOS ICON HISTORY\u003c/a\u003e \u0026ndash; I\u0026rsquo;ll leave it you to decide whether things have gotten\nbetter or worse.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTwo films at the cinema this week, very unusual. These days I\u0026rsquo;m often\nreluctant to go to the cinema due to people. Leaving the house is apparently\ngood for you though, alas.\u003c/p\u003e\n\u003cp\u003eFirst up was \u003ca href=\"https://www.themoviedb.org/movie/1100988-28-years-later\"\u003e28 Years Later\u003c/a\u003e — I\u0026rsquo;ve been waiting for this to come out for\nsome time being a big fan of \u003ca href=\"https://www.themoviedb.org/movie/170-28-days-later\"\u003e28 Days Later\u003c/a\u003e. There are so many wangs in this\nfilm. No spoilers, but the ending was unexpected to say the least. Shout out\nto \u003ca href=\"https://www.movie-locations.com/movies/0/28-Years-Later.php#:~:text=The%20road%20twisting%20between%20sheer%20cliffs%2C%20is%20the%20B3135%20winding%20its%20way%20through%20famous%20Cheddar%20Gorge%20in%20the%20Mendip%20Hills%2C%20near%20the%20village%20of%20Cheddar\"\u003eCheddar Gorge\u003c/a\u003e (if you\u0026rsquo;ve never been it\u0026rsquo;s absolutely fantastic).\u003c/p\u003e\n\u003cp\u003eSecond was \u003ca href=\"https://www.themoviedb.org/movie/575265-mission-impossible-the-final-reckoning\"\u003eMission: Impossible - The Final Reckoning\u003c/a\u003e. I could barely\nremember what The Entity was supposed to be. Needless to say, a small sleep\nwas had. The whole film revolves around the stunts that Tom fancied doing that\nday.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.yellowduck.be/posts/understanding-and-using-stacktrace-0-in-elixir\"\u003eTIL about Elixir\u0026rsquo;s \u003ccode\u003e__STACKTRACE__/0\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://kobrakai.de/kolumne/entity-status-history\"\u003eEntity status history using Ecto\u003c/a\u003e \u0026ndash; Check out the complete lack of explicit\nconditionals in this code. Lovely stuff.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve read all but one of the \u003ca href=\"https://en.wikipedia.org/wiki/The_Murderbot_Diaries\"\u003eThe Murderbot Diaries\u003c/a\u003e books because I saw buzz\nabout them online a few years ago and they\u0026rsquo;re an easy read and short\n(especially good when you\u0026rsquo;re trying to meet your yearly book goal!).\u003c/p\u003e\n\u003cp\u003eSaying that, I\u0026rsquo;m not sure they\u0026rsquo;re \u003cem\u003ethat\u003c/em\u003e good. But they certainly are ripe for\nTV adaptation, so I\u0026rsquo;ve been watching \u003ca href=\"https://www.themoviedb.org/tv/241554-murderbot\"\u003eMurderbot\u003c/a\u003e, and \u003cem\u003eit is\u003c/em\u003e fun in places.\u003c/p\u003e\n\u003cp\u003e20 minute episodes though \u0026ndash; Come. On.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://nmn.gl/blog/ai-and-programmers\"\u003eWhy Good Programmers Use Bad AI\u003c/a\u003e \u0026ndash; sad but true. The craft is gone. Only\nresults matter, and probably always did.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/finnvoor/yap\"\u003eyap\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA CLI for on-device speech transcription using Speech.framework on macOS 26\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003emacOS Tahoe will be including new speech transcription APIs, and \u003ccode\u003eyap\u003c/code\u003e\n(excellent name) will help you use them.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had no idea that Apple Notes could have extensions, but apparently it can\n\u0026ndash; \u003ca href=\"https://www.pronotes.app\"\u003eProNotes\u003c/a\u003e. Giving it a whirl.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.carlolobrano.com/posts/2025-06-13-neovim-trick-contextual-code-snippets-for-better-code-notes/\"\u003eNeovim custom function: Contextual Code Snippets for Better Code Notes\u003c/a\u003e \u0026ndash;\nThis is a nice example of customising Neovim to your exact workflow and what\u0026rsquo;s\npossible with the Neovim Lua API.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen I compose these weeknotes I need to create a lot of links. I \u003ca href=\"/weeknotes/57-crimping-automatically/#:~:text=The%20posts%20on%20this%20website%20are%20written%20in%20Markdown%2C%20using%20reference%2Dstyle%20links%20which%20means%20I%20can%20wrap%20the%20link%20text%20in%20square%20brackets%20and%20then%20list%20the%20URLs%20at%20the%20bottom%20of%20the%20page.%20I%20really%20like%20this%20as%20it%20stops%20the%20main%20text%20getting%20cluttered%20up%20with%20URLs.\"\u003eprefer the\nreference-style Markdown links\u003c/a\u003e because they don\u0026rsquo;t mess up the flow of text,\nbut, they are cumbersome to write.\u003c/p\u003e\n\u003cp\u003eInspired by \u003ca href=\"/weeknotes/209-twenty-minute-episode/#:~:text=Neovim%20custom%20function%3A%20Contextual%20Code%20Snippets%20for%20Better%20Code%20Notes%20%E2%80%93%20This%20is%20a%20nice%20example%20of%20customising%20Neovim%20to%20your%20exact%20workflow%20and%20what%E2%80%99s%20possible%20with%20the%20Neovim%20Lua%20API.\"\u003ethe article above\u003c/a\u003e I decided to see if \u003ca href=\"https://docs.anthropic.com/en/docs/claude-code/overview\"\u003eClaude Code\u003c/a\u003e could create\na Neovim reference link helper function that I\u0026rsquo;ve been thinking about for a\nwhile, but that I never got around to.\u003c/p\u003e\n\u003cp\u003e(I\u0026rsquo;m sure that fuller-featured solutions exist for this problem but I haven\u0026rsquo;t\nexplored them yet, that\u0026rsquo;s a bigger project for how to handle Markdown more\neffectively generally.)\u003c/p\u003e\n\u003cp\u003eSo I wrote a prompt for the problem and my proposed solution for how it should\nwork and it got something working with some back and forth. The whole thing\nprobably took half and hour.\u003c/p\u003e\n\u003cp\u003eThen came the inevitable bugs and edge cases: it doesn\u0026rsquo;t work if the text to\nbe linked spans multiple lines, and sometimes it adds a random newline in the\noutput and I don\u0026rsquo;t know why.\u003c/p\u003e\n\u003cp\u003eStill, I\u0026rsquo;ve been reading a few articles about \u0026ldquo;how to use AI\u0026rdquo; and this is the\none of the things many articles mentioned — using AI to write code you would\nnever write yourself.\u003c/p\u003e\n\u003cp\u003eEven if you think we shouldn\u0026rsquo;t be writing \u0026ldquo;production\u0026rdquo; code with AI, it\u0026rsquo;s hard\nto argue against using it for tasks such as this. It gets you \u003cem\u003emost\u003c/em\u003e of the\nway and that is valuable even though I think I\u0026rsquo;ve spent more time debugging\nthan it took to create the first version of the code!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://simonwillison.net/2025/Jun/23/phoenix-new/\"\u003ePhoenix.new is Fly’s entry into the prompt-driven app development space\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://code.dblock.org/2025/06/21/using-claude-swarm-to-upgrade-ruby-projects.html\"\u003eUsing Claude-Swarm to Upgrade Ruby Projects\u003c/a\u003e \u0026ndash; this is interesting even\nthough I don\u0026rsquo;t really understand it! Why do you need multiple agents, can\u0026rsquo;t\nyou give a single agent all the context and instruction they need?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://metaredux.com/posts/2025/06/02/weird-ruby-anonymous-heredocs.html\"\u003eWeird Ruby: Anonymous Heredocs\u003c/a\u003e \u0026ndash; Ruby is indeed weird.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gitignore.0x00.cl/\"\u003eGUItignore\u003c/a\u003e \u0026ndash; handy for creating your \u003ccode\u003e.gitignore\u003c/code\u003e file.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://basicappleguy.com/basicappleblog/macos-icon-history\"\u003eMACOS ICON HISTORY\u003c/a\u003e \u0026ndash; I\u0026rsquo;ll leave it you to decide whether things have gotten\nbetter or worse.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTwo films at the cinema this week, very unusual. These days I\u0026rsquo;m often\nreluctant to go to the cinema due to people. Leaving the house is apparently\ngood for you though, alas.\u003c/p\u003e\n\u003cp\u003eFirst up was \u003ca href=\"https://www.themoviedb.org/movie/1100988-28-years-later\"\u003e28 Years Later\u003c/a\u003e — I\u0026rsquo;ve been waiting for this to come out for\nsome time being a big fan of \u003ca href=\"https://www.themoviedb.org/movie/170-28-days-later\"\u003e28 Days Later\u003c/a\u003e. There are so many wangs in this\nfilm. No spoilers, but the ending was unexpected to say the least. Shout out\nto \u003ca href=\"https://www.movie-locations.com/movies/0/28-Years-Later.php#:~:text=The%20road%20twisting%20between%20sheer%20cliffs%2C%20is%20the%20B3135%20winding%20its%20way%20through%20famous%20Cheddar%20Gorge%20in%20the%20Mendip%20Hills%2C%20near%20the%20village%20of%20Cheddar\"\u003eCheddar Gorge\u003c/a\u003e (if you\u0026rsquo;ve never been it\u0026rsquo;s absolutely fantastic).\u003c/p\u003e",
      "date_published": "2025-06-29T00:00:00+00:00",
      "date_modified": "2025-06-29T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/208-hangxiety/",
      "url": "https://elver.me/weeknotes/208-hangxiety/",
      "title": "Weeknotes 208: Hangxiety",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI finished \u003ca href=\"https://www.themoviedb.org/tv/90972-station-eleven\"\u003eStation Eleven\u003c/a\u003e \u0026ndash; very good indeed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA week dominated by Brighton Ruby as you\u0026rsquo;d expect. Despite my\nhaven\u0026rsquo;t-been-on-a-train-in-ages anxiety the journey to and from Brighton\npassed without incident. Brighton remains the same; once a year is plenty.\u003c/p\u003e\n\u003cp\u003eThere weren\u0026rsquo;t any \u0026ldquo;bad talks\u0026rdquo; from my point of view this year, but conversely\nnothing surprised or interested me very much either. I\u0026rsquo;m sure that says more\nabout me than the conference.\u003c/p\u003e\n\u003cp\u003eIt was great to meetup with various folk and chat about the \u003cdel\u003edespise\u003c/del\u003e demise\nof our profession. I was very glad that most managed to make it.\u003c/p\u003e\n\u003cp\u003eAs usual I came away with a feeling similar to that of \u0026ldquo;\u003ca href=\"https://en.wikipedia.org/wiki/Hangxiety\"\u003ehangxiety\u003c/a\u003e\u0026rdquo; despite\ntea-totalling the whole thing. Did I say something inappropriate? Did I not\nmake enough effort? The ego is powerful.\u003c/p\u003e\n\u003cp\u003eStill, there is next year.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"https://en.wikipedia.org/wiki/Three_UK\"\u003eThree\u003c/a\u003e (who \u003ca href=\"https://en.wikipedia.org/wiki/SMARTY\"\u003eSMARTY\u003c/a\u003e use) signal around these parts seem to be \u003ca href=\"/weeknotes/206-powerful-and-overwhelming/#:~:text=I%20decided%20to%20order%20a%20Smarty%20SIM%20card%20to%20evaluate\"\u003eworse\nthan I\u0026rsquo;d expected\u003c/a\u003e. I guess I’ll just have to wait until Trump Mobile is\nlaunched in the UK.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://arrowsmithlabs.com/blog/did-contexts-kill-phoenix\"\u003eDid contexts kill Phoenix?\u003c/a\u003e \u0026ndash; This is a tricky one because Phoenix certainly\ncontains a lot less magic than Rails, and Elixir less than Ruby. The problem\nis that the magic did initially pull me towards Ruby and Rails, but later\npushed me away.\u003c/p\u003e\n\u003cp\u003eThis seems to argue that it\u0026rsquo;s harder to get started with Phoenix than Rails\nwhich I think is broadly true, but with the advent of A.I. is getting started\nthe difficult part any more? Will A.I. be maintaining the code or will humans?\u003c/p\u003e\n\u003cp\u003eOn Phoenix\u0026rsquo;s popularity.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBut we Phoenicians must admit that the framework, now in its twelfth year,\nnever really took off like, say, Rails before it. It remains a niche\ntechnology with a small but loyal following, and it will probably stay that\nway.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI agree with this statement, but I also don\u0026rsquo;t think the success of Rails can\nbe replicated. It was of it\u0026rsquo;s time, in the right place, at the right time.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA \u003ca href=\"https://marlacummins.com/adhd-burnout-part-one/\"\u003edefinition of ADHD burnout\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ea response to chronic workplace stressors that has not been successfully\nmanaged, marked by emotional exhaustion, cynicism, and a reduced sense of\naccomplishment.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eExhaustion, cynicism, and a reduced sense of accomplishment eh, sounds\nfamiliar.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAmy Hupe\u0026rsquo;s talk \u0026ldquo;Systems of Harm\u0026rdquo; at Brighton Ruby reminded me of Patrick\nMcKenzie’s \u003ca href=\"https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/\"\u003e\u0026ldquo;Falsehoods Programmers Believe About Names\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI finished \u003ca href=\"https://www.themoviedb.org/tv/90972-station-eleven\"\u003eStation Eleven\u003c/a\u003e \u0026ndash; very good indeed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA week dominated by Brighton Ruby as you\u0026rsquo;d expect. Despite my\nhaven\u0026rsquo;t-been-on-a-train-in-ages anxiety the journey to and from Brighton\npassed without incident. Brighton remains the same; once a year is plenty.\u003c/p\u003e\n\u003cp\u003eThere weren\u0026rsquo;t any \u0026ldquo;bad talks\u0026rdquo; from my point of view this year, but conversely\nnothing surprised or interested me very much either. I\u0026rsquo;m sure that says more\nabout me than the conference.\u003c/p\u003e",
      "date_published": "2025-06-22T00:00:00+00:00",
      "date_modified": "2025-06-22T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/207-pilgrimage/",
      "url": "https://elver.me/weeknotes/207-pilgrimage/",
      "title": "Weeknotes 207: Pilgrimage",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe yearly pilgrimage to Brighton for \u003ca href=\"https://brightonruby.com/\"\u003eBrighton Ruby\u003c/a\u003e is happening next week.\nI\u0026rsquo;m not particularly interested in the content (despite knowing how much works\ngoes into organising an event like this, for which I\u0026rsquo;m grateful). As usual\nit\u0026rsquo;s an excuse to spend time with Ruby friends instead.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m glad that many of the usual gang are making it this year, but I need to\nset my expectations to avoid disappointment. People move on, jobs change,\ngroups shift. Everything changes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been watching \u003ca href=\"https://www.themoviedb.org/tv/88052-black-summer\"\u003eBlack Summer\u003c/a\u003e this week. If you like zombies and shooting\nwith very little in the way of discernible story, you’ll love this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA couple of weeks ago, after talking about my side project with Harry, I set\nmyself an arbitrary deadline in the hope of spurring on development. The\ndeadline was Brighton Ruby. Two weeks is enough time to get something done,\nbut not so much that it feels never ending.\u003c/p\u003e\n\u003cp\u003eIf anything, this arbitrary deadline had the complete opposite effect; I\u0026rsquo;ve\ndone nothing. I need pills or something. It\u0026rsquo;s very frustrating.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/206-powerful-and-overwhelming/#:~:text=More%20meetings%20planned%20for%20next%20week\"\u003eother builder\u003c/a\u003e didn\u0026rsquo;t turn up. The first one sent through a specification\nmissing most of the work we\u0026rsquo;d discussed. A third seemed completely overwhelmed\nby a basic extension and later said he didn\u0026rsquo;t have time. Good start.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe went to see \u003ca href=\"https://en.wikipedia.org/wiki/Matt_Forde\"\u003eMatt Forde\u003c/a\u003e on tour this week. I was very much \u003cem\u003enot\u003c/em\u003e up for it\nbut I thoroughly enjoyed the show.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was reading \u003ca href=\"https://crawshaw.io/blog/programming-with-agents\"\u003eHow I program with Agents\u003c/a\u003e and this tangential point stood out.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eVery few programs ever reach the point that they are heavily used and\nlong-lived. Almost everything has few users, or is short-lived, or both.\nLet’s not extrapolate from the experiences of engineers who only take jobs\nmaintaining large existing products to the entire industry.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd yet we spend a lot of our time copying the tools, frameworks, and \u0026ldquo;best\npractices\u0026rdquo; of massive tech companies. \u0026ldquo;Just don\u0026rsquo;t use it if you don\u0026rsquo;t like it\u0026rdquo;\n\u0026ndash; unfortunately few have the option, if you want to work you need to have the\nbuzzword on your CV.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI installed the \u003ca href=\"https://chromewebstore.google.com/detail/livedebugger-devtools/gmdfnfcigbfkmghbjeelmbkbiglbmbpe\"\u003eLiveDebugger Chrome extension\u003c/a\u003e which adds the LiveDebugger UI\ninto Chrome\u0026rsquo;s Developer Tools panel. It makes it far more convenient to use.\nAlas I haven\u0026rsquo;t use the debugger much due to my lack of programming.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://sky.app/\"\u003eIntroducing Sky, natural computing for the Macintosh.\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eComputers are incredible. But to make them do exactly what you want, you\nhave to think like a computer. And that\u0026rsquo;s hard.\u003c/p\u003e\n\u003cp\u003eNow, with AI, you can chat with computers the same way you talk to people:\nnatural language. We\u0026rsquo;re on a journey to bring that capability to everything\nyou can do on your computer.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/MacOS_Tahoe\"\u003emacOS Tahoe\u003c/a\u003e \u0026ndash; oh my. Hopefully they switch to being \u003cem\u003eactual\u003c/em\u003e designers\ninstead of just making things pretty by the time it gets released.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://arrowsmithlabs.com/blog/phoenix-contexts-are-simpler-than-you-think\"\u003e\u0026ldquo;Phoenix contexts are simpler than you think\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI think this is true, contexts are weirdly misunderstood or and thought\ncomplicated when they’re anything but. I wondered it\u0026rsquo;s likely because they\nprovoke you into thinking about design, and design is hard.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=5dIWtFJYjUE\"\u003eI\u0026rsquo;ve decided to allow all cookies\u003c/a\u003e \u0026ndash; I have a lot of sympathy for this.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe yearly pilgrimage to Brighton for \u003ca href=\"https://brightonruby.com/\"\u003eBrighton Ruby\u003c/a\u003e is happening next week.\nI\u0026rsquo;m not particularly interested in the content (despite knowing how much works\ngoes into organising an event like this, for which I\u0026rsquo;m grateful). As usual\nit\u0026rsquo;s an excuse to spend time with Ruby friends instead.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m glad that many of the usual gang are making it this year, but I need to\nset my expectations to avoid disappointment. People move on, jobs change,\ngroups shift. Everything changes.\u003c/p\u003e",
      "date_published": "2025-06-15T00:00:00+00:00",
      "date_modified": "2025-06-15T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/206-powerful-and-overwhelming/",
      "url": "https://elver.me/weeknotes/206-powerful-and-overwhelming/",
      "title": "Weeknotes 206: Powerful and overwhelming",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe met the first of our short-listed builders this week, and also visited our\nneighbours up the road who have had similar work done by the same company, and\ngraciously let us have a look around. Now we nervously wait to see what the\nquote looks like.\u003c/p\u003e\n\u003cp\u003eMore meetings planned for next week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://elixir-lang.org/blog/2025/06/02/elixir-outreach-stipend-for-speakers/\"\u003eElixir Outreach stipend for speakers and trainers\u003c/a\u003e \u0026ndash; great idea!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur diet has been fairly boring for a while, necessarily so in some ways, but\nI decided to cook something new this week \u0026ndash; Baked Butter Paneer (from \u003ca href=\"https://www.amazon.co.uk/gp/product/0241488001/\"\u003eMeera\nSodha\u0026rsquo;s Dinner\u003c/a\u003e). I\u0026rsquo;m still not enamoured with Paneer (it\u0026rsquo;s absolutely\n\u003cem\u003efine\u003c/em\u003e), but overall the dish came out well and I will likely make it again,\nmaybe with some variation.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMarkdown support in Apple Notes?!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://www.macrumors.com/2025/06/04/apple-notes-rumored-markdown-support-ios-26/\"\u003eApple Notes Expected to Gain Support for Exporting in Markdown in iOS 26\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSuch excitement, much wow.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.reddit.com/r/ruby/comments/1kyqhg5/comment/mv206bx/\"\u003e\u0026ldquo;What features would you like to see in Ruby that aren\u0026rsquo;t there currently?\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA complete revamp of pattern matching. More Scala-like. The syntax we have\nnow is godawful. So bad that people just don\u0026rsquo;t use it and brush pattern\nmatching off as useless when it’s actually quite awesome.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSome interesting answers to this question on \u003ccode\u003e/r/ruby\u003c/code\u003e. This one stood out to\nme as it mirrors my experience. I love pattern matching in Elixir, but never\nuse it in Ruby. I think a lot of that is the awful syntax. Ironic from Ruby, a\nlanguage admired (and admonished) for it\u0026rsquo;s beauty.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://f2.freshman.tech/guide/what-is-f2.html\"\u003eF2\u003c/a\u003e looks very powerful\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eF2 is a cross-platform tool for bulk renaming files and directories on\nLinux, macOS, and Windows. It simplifies the renaming process by offering\npowerful workflows while prioritizing safety to prevent data loss (such as\noverwriting files by accident).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt also looks fairly overwhelming. Noted for posterity.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI decided to order a \u003ca href=\"https://smarty.co.uk/\"\u003eSmarty\u003c/a\u003e SIM card to evaluate. I\u0026rsquo;m not sure EE is worth\nit now I\u0026rsquo;ve moved. And I do kinda miss free roaming abroad even though the\nsums don\u0026rsquo;t add up.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStill \u0026ldquo;working\u0026rdquo; on a side project.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe met the first of our short-listed builders this week, and also visited our\nneighbours up the road who have had similar work done by the same company, and\ngraciously let us have a look around. Now we nervously wait to see what the\nquote looks like.\u003c/p\u003e\n\u003cp\u003eMore meetings planned for next week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://elixir-lang.org/blog/2025/06/02/elixir-outreach-stipend-for-speakers/\"\u003eElixir Outreach stipend for speakers and trainers\u003c/a\u003e \u0026ndash; great idea!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur diet has been fairly boring for a while, necessarily so in some ways, but\nI decided to cook something new this week \u0026ndash; Baked Butter Paneer (from \u003ca href=\"https://www.amazon.co.uk/gp/product/0241488001/\"\u003eMeera\nSodha\u0026rsquo;s Dinner\u003c/a\u003e). I\u0026rsquo;m still not enamoured with Paneer (it\u0026rsquo;s absolutely\n\u003cem\u003efine\u003c/em\u003e), but overall the dish came out well and I will likely make it again,\nmaybe with some variation.\u003c/p\u003e",
      "date_published": "2025-06-08T00:00:00+00:00",
      "date_modified": "2025-06-08T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/205-mostly-what-i-m-watching/",
      "url": "https://elver.me/weeknotes/205-mostly-what-i-m-watching/",
      "title": "Weeknotes 205: Mostly what I'm watching",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTenderlove is at it again: \u003ca href=\"https://railsatscale.com/2025-05-21-fast-allocations-in-ruby-3-5/\"\u003eFast Allocations in Ruby 3.5\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://substack.com/home/post/p-164126379\"\u003eLetter to Arc members 2025\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn the meantime, please know this: we’re not trying to shut Arc down. We\nknow you use it and rely on it. Many of our family and friends do, too.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis \u003ca href=\"/weeknotes/196-expandable-file-folder/#:~:text=which%20I%E2%80%99m%20pretty%20sure%20The%20Browser%20Company%20are%20getting%20bored%20of\"\u003edoesn\u0026rsquo;t surprise me\u003c/a\u003e but at least Arc will be receiving regular updates,\nfor now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe finally made a shortlist of builders, and contacted a number of them this\nweek. Months and months of procrastination solved in a few hours.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLove, Death \u0026amp; Robots Season 4 got better thankfully, but still underwhelming\ncompared to previous seasons. Recommended episodes: \u003ca href=\"https://en.wikipedia.org/wiki/List_of_Love,_Death_%26_Robots_episodes#Volume_IV_(2025):~:text=%22How%20Zeke%20Got%20Religion%22\"\u003eZeke Found Religion\u003c/a\u003e,\n\u003ca href=\"https://en.wikipedia.org/wiki/List_of_Love,_Death_%26_Robots_episodes#Volume_IV_(2025):~:text=%22The%20Other%20Large%20Thing%22\"\u003eThe Other Large Thing\u003c/a\u003e, and \u003ca href=\"https://en.wikipedia.org/wiki/List_of_Love,_Death_%26_Robots_episodes#Volume_IV_(2025):~:text=10-,%22For%20He%20Can%20Creep%22,-Emily%20Dean\"\u003eFor He Can Creep\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.themoviedb.org/tv/100088-the-last-of-us/season/2\"\u003eThe Last of Us Season 2\u003c/a\u003e ended on a cliffhanger after just 7 episodes!\u003c/p\u003e\n\u003cp\u003eThis is unacceptable!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLast year I became aware of \u003ca href=\"https://www.themoviedb.org/tv/90972-station-eleven\"\u003eStation Eleven\u003c/a\u003e and I watched the first two\nepisodes but somewhere along the way I stopped for reasons I can\u0026rsquo;t remember.\nSo when I saw it mentioned online recently I decided to pick it up again, but\nfrom the start. It\u0026rsquo;s really good. It’s quite slow in a deliberate way. The\nacting is great.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://artifacts.app/\"\u003eArtifacts\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eArtifacts is an image + link organizer app for macOS and iOS. A completely\nnative, local first way to save all that stuff you find across the web.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve been wanting some way to collect inspiration from around the web so I\u0026rsquo;ll\nbe keeping an eye on this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.swmansion.com/elixir-contributor-summit-2025-shaping-the-future-together-at-software-mansion-cc3271a188eb\"\u003eElixir Contributor Summit 2025: Shaping the Future Together at Software\nMansion\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOn May 17th 2025, something special happened for the Elixir community. Right\nafter ElixirConf EU, we opened the doors of our Kraków office to host the\nvery first Elixir Contributor Summit.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNeovim content is back.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.keymap.set(\u003cspan style=\"color:#d14\"\u003e\u0026#39;x\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;\u0026lt;C-\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\\\\\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026gt;\u0026lt;C-n\u0026gt;`\u0026lt;/\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\\\\\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e%V\u0026#39;\u003c/span\u003e, {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  desc \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;Search forward within visual selection\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e})\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.keymap.set(\u003cspan style=\"color:#d14\"\u003e\u0026#39;x\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;?\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;\u0026lt;C-\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\\\\\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026gt;\u0026lt;C-n\u0026gt;`\u0026gt;?\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\\\\\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e%V\u0026#39;\u003c/span\u003e, {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  desc \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;Search backward within visual selection\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e})\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ca href=\"https://github.com/jordelver/dotfiles/commit/628090e9b55f4840a7d875fd8289dbaafca5d45a#diff-d4a1bff0f475826a45916509018f107cd68759c815391939c98a3e9e37173b40\"\u003eEasily search within visual selections\u003c/a\u003e using \u003ca href=\"https://www.reddit.com/r/neovim/comments/1kv7som/search_within_selection_in_neovim/\"\u003ethis tip I saw on Reddit\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTenderlove is at it again: \u003ca href=\"https://railsatscale.com/2025-05-21-fast-allocations-in-ruby-3-5/\"\u003eFast Allocations in Ruby 3.5\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://substack.com/home/post/p-164126379\"\u003eLetter to Arc members 2025\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn the meantime, please know this: we’re not trying to shut Arc down. We\nknow you use it and rely on it. Many of our family and friends do, too.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis \u003ca href=\"/weeknotes/196-expandable-file-folder/#:~:text=which%20I%E2%80%99m%20pretty%20sure%20The%20Browser%20Company%20are%20getting%20bored%20of\"\u003edoesn\u0026rsquo;t surprise me\u003c/a\u003e but at least Arc will be receiving regular updates,\nfor now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe finally made a shortlist of builders, and contacted a number of them this\nweek. Months and months of procrastination solved in a few hours.\u003c/p\u003e",
      "date_published": "2025-06-01T00:00:00+00:00",
      "date_modified": "2025-06-01T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/204-randomly-joined/",
      "url": "https://elver.me/weeknotes/204-randomly-joined/",
      "title": "Weeknotes 204: Randomly joined",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eStill waiting on parcels. I live for parcels.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was bored and retail therapy was the solution. Instead of doing something\nproductive I spent the time trawling eBay and Vinted for the perfect Game Boy\ngames. They will arrive, I\u0026rsquo;ll test them, and then never pick them up again.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL I learnt that you easily define a custom exception and have Phoenix\nautomatically return a 404 for it.\u003c/p\u003e\n\u003cp\u003eDefine the exception module.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edefmodule\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eFoo\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003edefmodule\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eBarError\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003edefexception\u003c/span\u003e [\u003cspan style=\"color:#990073\"\u003e:message\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd then implement \u003ccode\u003ePlug.Exception\u003c/code\u003e for it.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edefimpl\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003ePlug.Exception\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003efor\u003c/span\u003e: \u003cspan style=\"color:#458;font-weight:bold\"\u003eFoo.BarError\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e status(_exception), \u003cspan style=\"color:#990073\"\u003edo\u003c/span\u003e: \u003cspan style=\"color:#099\"\u003e404\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e actions(_exception), \u003cspan style=\"color:#990073\"\u003edo\u003c/span\u003e: []\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow when \u003ccode\u003eFoo.BarError\u003c/code\u003e is raised it will result in a 404 page being shown.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://hypercritical.co/2025/05/20/apple-turnaround\"\u003eApple Turnaround\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf we want a different result, it seems like we need different leaders.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSiracusa on Apple.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gist.github.com/fxn/86ad8584d7813caf03dac9222f8dcf41\"\u003efxn/namespaces.md\u003c/a\u003e, a nice write-up of the upcoming Ruby 3.5 feature,\nNamespaces. This sounds useful for Ruby.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.reddit.com/r/Tailscale/comments/1ksy3xy/someone_just_randomly_joined_my_tailnet/\"\u003eSomeone just randomly joined my Tailnet\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI think I became an owner of an organisation I don\u0026rsquo;t own the domain of.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eTailscale is still awesome, but this is fairly worrying. Still the open and\nresponsive comments from the Tailscale team are reassuring, and the defaults\nhave been changed to stop this happening so easily.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSomeone at the local Ruby meetup mentioned both \u003ca href=\"https://lmstudio.ai/\"\u003eLM Studio\u003c/a\u003e and \u003ca href=\"https://ollama.com/\"\u003eOllama\u003c/a\u003e this\nweek, so I thought I would give them a go. This makes running large language\nmodels locally easy. \u003cem\u003eWhich\u003c/em\u003e models to run is another question.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRaycast added experimental support for interacting with local models via\nOllama in their most recent update.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLocal models allow you to run nearly any open source LLM locally, on your\nmachine. Through our new integration with Ollama, you’ll now have access to\nmore than 100 AI models from various providers ranging from small 135M to\nmassive 671B parameter models.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m surprised they added support to run local models, but very please. Good\ntiming.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m sad to report that \u003ca href=\"/weeknotes/199-tv-heavy/#:~:text=Season%204%20is%20released%2015th%20May\"\u003edespite my excitement for Season 4 of Love, Death \u0026amp;\nRobots\u003c/a\u003e so far it is quite disappointing compared to what came before 😢\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eStill waiting on parcels. I live for parcels.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was bored and retail therapy was the solution. Instead of doing something\nproductive I spent the time trawling eBay and Vinted for the perfect Game Boy\ngames. They will arrive, I\u0026rsquo;ll test them, and then never pick them up again.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL I learnt that you easily define a custom exception and have Phoenix\nautomatically return a 404 for it.\u003c/p\u003e\n\u003cp\u003eDefine the exception module.\u003c/p\u003e",
      "date_published": "2025-05-25T00:00:00+00:00",
      "date_modified": "2025-05-25T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/203-bug-ridden-forms/",
      "url": "https://elver.me/weeknotes/203-bug-ridden-forms/",
      "title": "Weeknotes 203: Bug-ridden forms",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eStill no closer to \u003ca href=\"/weeknotes/202-vibe-despondent/#:~:text=To%20avoid%20the%20parcel%20being%20stolen%20again\"\u003egetting my parcel\u003c/a\u003e. Can you believe I\u0026rsquo;ve placed a third\norder because I\u0026rsquo;m just sick of waiting and there\u0026rsquo;s no way to retrieve my\nparcel. I\u0026rsquo;m aware it will now almost certainly be delivered.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=TbIoE8kp7Cc\"\u003eA quick look at LiveView\u0026rsquo;s LiveDebugger!\u003c/a\u003e \u0026ndash; cool project.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eQuite unbelievably I\u0026rsquo;m still \u003ca href=\"/weeknotes/199-tv-heavy/#:~:text=so%20I%20can%20start%20updating%20my%20address%20all%20over%20the%20place\"\u003eworking on updating my addresses\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eso I can start updating my address all over the place\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eOn Companies House this is easier said than done. I think it\u0026rsquo;s universally\nunderstood that GDS have done an incredible job on gov.uk. It\u0026rsquo;s fast. It\u0026rsquo;s\neasy to use. Something to be proud of even. However, there are lots of\ngovernment departments who are still clinging onto the past and you know\nyou\u0026rsquo;re in trouble when you click a link and end up looking at a completely\ndifferent website with an early 2000\u0026rsquo;s vibe.\u003c/p\u003e\n\u003cp\u003eCompanies House has some of the most confusing, bug-ridden, forms I\u0026rsquo;ve ever\nhad the misfortune to use. World-class bad forms. They\u0026rsquo;re not even\ncomplicated, we\u0026rsquo;re talking address fields with a few buttons. How are they\nmessing this up?\u003c/p\u003e\n\u003cp\u003eEventually I pressed the buttons in the correct order by some miracle and it\n\u003cem\u003eseems\u003c/em\u003e to have worked now. I hope this will be the end of it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother long awaited mini-project got done this week. Moving my Plex\ninstallation to run under Docker. Docker is my preferred way to run software\non my home server these days, especially as I gradually move my config into\ngit piece by piece.\u003c/p\u003e\n\u003cp\u003eWe heavily rely on Plex in our house, so I \u003cem\u003edid not\u003c/em\u003e want to break this. These\nare the steps I took.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eCreate a directory to store Plex config files.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esudo mkdir /opt/appdata/plex\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDisabled the \u0026ldquo;Empty trash automatically after every scan\u0026rdquo; in the Plex\nsettings.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTurned off the existing Plex server\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esudo systemctl stop plexmediaserver\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBacked up my Plex installation directory just in case\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esudo tar -czvf ~/plex_backup.tar.gz /var/lib/plexmediaserver/Library/\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFound out what the \u003ccode\u003eplex\u003c/code\u003e user and group IDs where from the \u003cstrong\u003ehost\u003c/strong\u003e system.\nThese need to match what we\u0026rsquo;re going to put in the \u003ccode\u003edocker-compose.yml\u003c/code\u003e\nconfig file to stave off any potential permissions issues.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ id plex\nuid=113(plex) gid=118(plex) groups=118(plex),44(video)\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCreated this Docker Compose config\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-diff\" data-lang=\"diff\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e version: \u0026#34;3\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e services:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+  plex:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+    container_name: plex\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+    image: plexinc/pms-docker:latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+    restart: unless-stopped\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+    network_mode: host\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+    environment:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+      - TZ=Etc/UTC\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+      - PLEX_UID=1000  # `plex` user on the host\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+      - PLEX_GID=1000  # `plex` group on the host\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+      - PLEX_CLAIM=\u0026lt;yout-token\u0026gt; # Claim token from https://www.plex.tv/claim/\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+    volumes:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+      # Config\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+      - /opt/appdata/plex:/config\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+     # Media directories\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+      - /movies:/movies¬\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+      - /music:/music¬\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+      - /tv:/tv¬\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+    devices:¬\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+      - /dev/dri:/dev/dri # Intel QuickSync support\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI copied over my existing Plex Library directory to \u003ccode\u003e/opt/appdata/\u003c/code\u003e which is\nwhere I\u0026rsquo;ve chosen to store Docker container state.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esudo cp -r /var/lib/plexmediaserver/Library/ /opt/appdata/plex/\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI knew I\u0026rsquo;d need to move some files to be accessible to the new Docker\ncontainer, but it wasn\u0026rsquo;t clear to me which parts needed to go where. This\nworked for me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGet Plex claim token from \u003ca href=\"https://www.plex.tv/claim/\"\u003ehttps://www.plex.tv/claim/\u003c/a\u003e and add it to the\n\u003ccode\u003edocker-compose.yml\u003c/code\u003e config. This automatically connects the new Plex server\nto your logged in user account.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStart the new container\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003edocker-compose up -d plex\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eProfit!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAll this procrastination and fuss and it worked first time.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLate posting this week because we went to the Scottish Highlands for a long\nweekend. I\u0026rsquo;ve only been to Edinburgh and Glasgow before now, so this was a\ndifferent side of Scotland I hadn\u0026rsquo;t seen before (with the exception of a 9\nhour bus tour starting and ending in Glasgow during which I saw a lot of the\ninside of a minibus).\u003c/p\u003e\n\u003cp\u003eLiving further north certainly affords us the opportunity to drive to Scotland\nnow whereas I would never have considered before. And drive we did, through\nsome of the most beautiful countryside in this country. We passed through or\nnear the Yorkshire Dales, Pennines, Lake District, and Highlands. And some\ncracking services too 😉\u003c/p\u003e\n\u003cp\u003eWe stayed in a lovely Airbnb outside of \u003ca href=\"https://en.wikipedia.org/wiki/Inverness\"\u003eInverness\u003c/a\u003e and visited several local\ntourist attractions, of which there are many, including \u003ca href=\"https://en.wikipedia.org/wiki/Loch_Ness\"\u003eLoch Ness\u003c/a\u003e (a\nlittle-known small lake), \u003ca href=\"https://en.wikipedia.org/wiki/Urquhart_Castle\"\u003eUrquhart Castle\u003c/a\u003e, \u003ca href=\"https://en.wikipedia.org/wiki/Clava_cairn\"\u003eClava Cairns\u003c/a\u003e (a load of rocks),\n\u003ca href=\"https://en.wikipedia.org/wiki/Culloden_Viaduct\"\u003eCulloden Viaduct\u003c/a\u003e (a load of better organised rocks), and \u003ca href=\"https://en.wikipedia.org/wiki/Fort_George,_Highland\"\u003eFort George\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eOn the way we split up the journey by staying in \u003ca href=\"https://en.wikipedia.org/wiki/Perth,_Scotland\"\u003ePerth\u003c/a\u003e overnight, but we did\nthe whole trek in my go on the way back, which is a long way, but not nearly\nas bad as I\u0026rsquo;d feared.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCompletely unrelated but remember that if you run out of pants whilst on\nholiday you can get them sent to an Amazon Locker somewhere along your journey\nroute 👌\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBack to it. Whatever \u0026ldquo;it\u0026rdquo; is.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eStill no closer to \u003ca href=\"/weeknotes/202-vibe-despondent/#:~:text=To%20avoid%20the%20parcel%20being%20stolen%20again\"\u003egetting my parcel\u003c/a\u003e. Can you believe I\u0026rsquo;ve placed a third\norder because I\u0026rsquo;m just sick of waiting and there\u0026rsquo;s no way to retrieve my\nparcel. I\u0026rsquo;m aware it will now almost certainly be delivered.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=TbIoE8kp7Cc\"\u003eA quick look at LiveView\u0026rsquo;s LiveDebugger!\u003c/a\u003e \u0026ndash; cool project.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eQuite unbelievably I\u0026rsquo;m still \u003ca href=\"/weeknotes/199-tv-heavy/#:~:text=so%20I%20can%20start%20updating%20my%20address%20all%20over%20the%20place\"\u003eworking on updating my addresses\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eso I can start updating my address all over the place\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eOn Companies House this is easier said than done. I think it\u0026rsquo;s universally\nunderstood that GDS have done an incredible job on gov.uk. It\u0026rsquo;s fast. It\u0026rsquo;s\neasy to use. Something to be proud of even. However, there are lots of\ngovernment departments who are still clinging onto the past and you know\nyou\u0026rsquo;re in trouble when you click a link and end up looking at a completely\ndifferent website with an early 2000\u0026rsquo;s vibe.\u003c/p\u003e",
      "date_published": "2025-05-18T00:00:00+00:00",
      "date_modified": "2025-05-18T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/202-vibe-despondent/",
      "url": "https://elver.me/weeknotes/202-vibe-despondent/",
      "title": "Weeknotes 202: Vibe despondent",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eVibe: Despondent.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSomeone fly-tipped their \u003cem\u003eChristmas Tree\u003c/em\u003e (a fucking CHRISTMAS TREE in May!)\nin our front garden during the night of Saturday to Sunday. It\u0026rsquo;s bad enough\ngetting rid of your own, nevermind someone elses. Fuckers.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI briefly tried out \u003ca href=\"https://tidewave.ai/\"\u003eTidewave\u003c/a\u003e this week on an Elixir Phoenix codebase. It was\neasy to get going with \u003ca href=\"https://claude.ai/download\"\u003eClaude Desktop\u003c/a\u003e but works with various editors. I was\nimpressed until it stopped responding leaving me in limbo, but it was magical\nfor a while.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemember \u003ca href=\"/weeknotes/200-reciprocating-saw/#:~:text=Someone%20stole%20a%20parcel%20from%20my%20doorstep%20on%20Thursday\"\u003emy Game Boy parts were stolen from my doorstep\u003c/a\u003e?\u003c/p\u003e\n\u003cp\u003eWell, after some brooding, I decided to re-order the same items again. And so\nAliExpress got even more of my money. To avoid the parcel being stolen again,\nI decided to ask Evri to deliver the order to a local Post Office for me to\ncollect instead. I eventually received a notification that it was ready, so\nalong I pop only to discover that the Post Office is now apparently \u0026ldquo;closed\nuntil further notice\u0026rdquo;. It appears they may have ceased trading. And they have\nmy parcel. Inside.\u003c/p\u003e\n\u003cp\u003eWhat happens now is anyone\u0026rsquo;s guess, but this is the second parcel with the\nsame contents that has failed to reach me. Is this a sign?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe idea of not using Google for web search was once inconceivable. Google\ncompletely dominated. I realised that I\u0026rsquo;ve been using Kagi full-time since\nJuly 2023 and I don\u0026rsquo;t miss Google at all. Kagi is not as good as the glory\ndays of Google, but with A.I. arriving the glory days feel long gone.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy advice to you: keep your computers up-to-date. Of course, the problem with\nkeeping computers current is just how easily software breaks. I suspect I\u0026rsquo;ve\nswapped a lot of fixed bugs for a lot of new bugs. So it goes. A double-edged\nsword.\u003c/p\u003e\n\u003cp\u003eI used \u003ca href=\"https://en.wikipedia.org/wiki/Ubuntu_version_history#1804\"\u003eUbuntu 18.04 (Bionic Beaver)\u003c/a\u003e when I set up my home server back in\n2018 not for any particular penchant for Ubuntu, but because it seemed easiest\nand well-supported as a major player distro, and now it needs to be ugraded\nbecause it is \u003cem\u003eno longer supported\u003c/em\u003e. And hasn\u0026rsquo;t been for a while; don\u0026rsquo;t judge.\u003c/p\u003e\n\u003cp\u003eIn order to get to where I wanted to be, the latest LTS release of Ubuntu, I\nhad to upgrade several times from version to version.\u003c/p\u003e\n\u003cp\u003eThere was a slightly scary moment when going from 18.04 to \u003ca href=\"https://en.wikipedia.org/wiki/Ubuntu_version_history#2404\"\u003e20.04\u003c/a\u003e where my\n\u003ca href=\"https://en.wikipedia.org/wiki/ZFS\"\u003eZFS\u003c/a\u003e pool briefly disappeared. The data stored on the pool never seemed at\nrisk - I have a lot of faith in ZFS to do the right thing - however, I don\u0026rsquo;t\nhave a lot of faith in myself to not take an interesting situation and turn it\ninto a disaster. I took my time.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ezpool status\u003c/code\u003e showed the pool was missing:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sudo zpool status\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eno pools available\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBut \u003ccode\u003ezpool import\u003c/code\u003e thought the pool was online:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sudo zpool import\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   pool: storage\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     id: \u003cspan style=\"color:#099\"\u003e13125165091315077677\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  state: ONLINE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e status: Some supported features are not enabled on the pool.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e action: The pool can be imported using its name or numeric identifier, though\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        some features will not be available without an explicit \u003cspan style=\"color:#d14\"\u003e\u0026#39;zpool upgrade\u0026#39;\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e config:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        storage     ONLINE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          mirror-0  ONLINE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            sda     ONLINE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            sdd     ONLINE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          mirror-1  ONLINE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            sde     ONLINE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            sdf     ONLINE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          mirror-2  ONLINE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            sdc     ONLINE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            sdb     ONLINE\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAfter some research (typing \u0026ldquo;send help\u0026rdquo; into Claude \u003cem\u003eis\u003c/em\u003e research), a simple\n\u003ccode\u003esudo zpool import storage -f\u003c/code\u003e fixed my issues, and the pool was back.\nSubsequent upgrades avoided breaking ZFS further thankfully.\u003c/p\u003e\n\u003cp\u003eFair play to \u003ca href=\"https://en.wikipedia.org/wiki/Canonical_%28company%29\"\u003eCanonical\u003c/a\u003e though, baring that ZFS hiccup the upgrades went\nfairly well with no major breakages as I\u0026rsquo;m currently aware. There were a few\nthings to tidy-up but almost everything is working as before.\u003c/p\u003e\n\u003cp\u003eAnyway, I\u0026rsquo;m now running a distro with support until at least 2029.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDuring my one of my Ubuntu upgrade cycles I was amused by this message:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYou have to download a total of 797 M. This download will take about 1 hour\n41 minutes with a 1Mbit DSL connection and about 1 day 6 hours with a \u003cstrong\u003e56k\nmodem\u003c/strong\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e56k!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/201-game-boy-rollercoaster/#:~:text=The%20Eternaut%20is%20very%20good%20so%20far\"\u003eFinished The Eternaut\u003c/a\u003e. It got a bit weird, and a bit less good, but I did\nenjoy it overall and will watch Season 2 when it is released.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn other ZFS news, a \u003ca href=\"https://github.com/openzfs/zfs/pull/17246\"\u003enew \u003ccode\u003ezfs rewrite\u003c/code\u003e command was implemented\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFor years users were asking for an ability to re-balance pool after vdev\naddition, de-fragment randomly written files, change some properties for\nalready written files, etc. The closest option would be to either copy and\nrename a file or send/receive/rename the dataset. Unfortunately all of those\noptions have some downsides.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAs I understand it, this should help in particular with RAIDZ vdevs as you can\nnow just add another disk, and rebalance your data across them, which was a\nbig limitation of RAIDZ setups, and the reason I went for mirrored vdevs.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSickness this week with a 3 day cold. May I be so bold as to say \u003ca href=\"https://www.jakemans.com/peppermint/p39006\"\u003eJakeman\u0026rsquo;s\nPeppermint\u003c/a\u003e are \u003cem\u003ethe best\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had the misfortune to need to create an Amazon AWS IAM user this week. You\nknow those \u0026ldquo;data breaches\u0026rdquo; we hear about fairly often? I guarantee most of\nthose are directly related to poor Amazon S3 bucket policies, and Amazon must\nshare the blame for creating an absolute mess of a system.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eVibe: Despondent.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSomeone fly-tipped their \u003cem\u003eChristmas Tree\u003c/em\u003e (a fucking CHRISTMAS TREE in May!)\nin our front garden during the night of Saturday to Sunday. It\u0026rsquo;s bad enough\ngetting rid of your own, nevermind someone elses. Fuckers.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI briefly tried out \u003ca href=\"https://tidewave.ai/\"\u003eTidewave\u003c/a\u003e this week on an Elixir Phoenix codebase. It was\neasy to get going with \u003ca href=\"https://claude.ai/download\"\u003eClaude Desktop\u003c/a\u003e but works with various editors. I was\nimpressed until it stopped responding leaving me in limbo, but it was magical\nfor a while.\u003c/p\u003e",
      "date_published": "2025-05-11T00:00:00+00:00",
      "date_modified": "2025-05-11T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/201-game-boy-rollercoaster/",
      "url": "https://elver.me/weeknotes/201-game-boy-rollercoaster/",
      "title": "Weeknotes 201: Game Boy rollercoaster",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI finished reading \u003ca href=\"https://www.goodreads.com/book/show/223436601-careless-people\"\u003eCareless People\u003c/a\u003e by Sarah Wynn-Williams this week about\nher time at FaceBook. I\u0026rsquo;ll save you the time \u0026ndash; it\u0026rsquo;s as bad as you think.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://openinframap.org/\"\u003eOpen Infrastructure Map\u003c/a\u003e \u0026ndash; this is cool.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOpen Infrastructure Map is a view of the world\u0026rsquo;s infrastructure mapped in\nthe OpenStreetMap database.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://claude.ai/\"\u003eClaude\u003c/a\u003e is not very good at HTML and CSS. I asked it to create a very\nstraightforward prototype page and it just couldn\u0026rsquo;t do it. It constantly\nflip-flopped back and forth between the various versions it had produced.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t know if this is an indictment of HTML and CSS or Claude. Why not both?\u003c/p\u003e\n\u003cp\u003eI was getting frustrated by it when it dawned on me how ridiculous that was\ngiven how impossible this was \u003cem\u003eat all\u003c/em\u003e until the last year or so. And fair\ndos, it did point me in the right direction.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGame Boy rollercoaster 🎢 this week. I only went and fixed \u003ca href=\"/weeknotes/200-reciprocating-saw/#:~:text=discovered%20that%20those%20buttons%20didn%E2%80%99t%20work\"\u003ethe button issue\u003c/a\u003e!\nThis is the first time I\u0026rsquo;ve diagnosed and fixed a proper electrical issue, so\nI consider it somewhat of a milestone.\u003c/p\u003e\n\u003cp\u003e(I\u0026rsquo;ll try to explain what I did, but I\u0026rsquo;m missing a lot real know-how here, so\nplease bear with).\u003c/p\u003e\n\u003cp\u003eWhen you press a button, the membrane underneath completes a circuit between\ntwo pads on the board, which sends a signal to the CPU. It seemed reasonable\nthat since \u003ckbd\u003eSelect\u003c/kbd\u003e, \u003ckbd\u003eStart\u003c/kbd\u003e, \u003ckbd\u003eA\u003c/kbd\u003e, and \u003ckbd\u003eB\u003c/kbd\u003e\nwere not working, there was some problem with that signal. The D-pad was\nunaffected. So I needed to follow where the signal travelled to see if there\nwas some break causing button presses to fail.\u003c/p\u003e\n\u003cp\u003eOn the PCB there are various \u003ca href=\"https://en.wikipedia.org/wiki/Via_(electronics)\"\u003e\u0026ldquo;vias\u0026rdquo;\u003c/a\u003e (a via is where the circuit travels to\nthe other side of the board via a small hole) and \u003ca href=\"https://en.wikipedia.org/wiki/Test_point\"\u003etest points\u003c/a\u003e (used\nfor\u0026hellip;testing) to allow following the traces around the board. I used a\nmultimeter in continuity mode to follow the traces from the button pads up to\nthe CPU.\u003c/p\u003e\n\u003cp\u003eDoing this revealed that we had continuity for traces going via a diode\nlabelled \u003ccode\u003eDA1\u003c/code\u003e, but not \u003ccode\u003eDA2\u003c/code\u003e. \u003ckbd\u003eStart\u003c/kbd\u003e, \u003ckbd\u003eSelect\u003c/kbd\u003e,\n\u003ckbd\u003eA\u003c/kbd\u003e, and \u003ckbd\u003eB\u003c/kbd\u003e all went via DA2, so this proved we had a\nbroken trace somewhere between \u003ccode\u003eDA2\u003c/code\u003e and the CPU. Eventually I narrowed it\ndown between two points which ran under the cartridge slot. I had previously\nfound some corrosion under the cartridge slot so my theory is that the\ncorrosion goes further than you can see and that had disrupted the trace.\u003c/p\u003e\n\u003cp\u003eI bypassed the broken trace by soldering a small wire between two points on\nthe board. This restored the buttons!\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/trace-bypass.jpg\" alt=\"Wire running to bypass broken trace\"\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe only remaining issue then was the power switch. I had to replace the power\nswitch to get this GBP to turn on. The power switch is a common power failure\nissue. I bought replacement switches which are easily soldered to the board,\nbut the actual plastic tab that you move to turn the console on don\u0026rsquo;t fit\ninside the case button as well I would like creating an unreliable contact\nbetween the switch and the button. I decided to try adding a small bit of hot\nglue to fill the gap. This went looked to be a good solution at first, but\nwhen attempting to remove the switch from the shell it snapped off 😭\u003c/p\u003e\n\u003cp\u003eThe only thing to do was replace the whole switch (again), which luckily I had\nto hand. However, I did a \u003cem\u003every bad\u003c/em\u003e job removing the old one, and ripped some\npads from the board in the process. I did fix the pads with some copper tape\nand patience though, and soldered a new switch in-place.\u003c/p\u003e\n\u003cp\u003eSome more hot glue, and this is the result.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/gbp-rose-red.jpg\" alt=\"Refurbished Game Boy Pocket in transparent Rose Red\"\u003e\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not 100% happy with the switch, but I\u0026rsquo;m resisting the urge to mess with it\nagain right now. Overall, this is a win ✅ My second completed Game Boy has\nbeen a long time coming.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.fastcompany.com/91324550/kerning-on-pope-francis-tomb-is-a-travesty\"\u003eThe kerning on the pope’s tomb is a travesty\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCheryl Jacobsen, a calligrapher and adjunct assistant professor at the\nCenter for the Book at the University of Iowa, calls the engraving\n\u0026ldquo;horrifically bad,\u0026rdquo; noting that “there is no historical reason for spacing\nthat bad.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eTis bad.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou may have heard of Power over Ethernet (certainly if you\u0026rsquo;ve been following\nalong here). PoE can supply 15.4 watts of power. Did you know PoE+ is a thing?\nIt can supply up to 25.5 watts. This is where it starts getting silly. PoE++\nincreases to 60 watts, but there\u0026rsquo;s more, PoE+++ can do 90 watts!\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ePoE = 802.3bt Type 1 (15.4 watts max)\nPoE+ = 802.3bt Type 2 (25.5 watts max)\nPoE++ = 802.3bt Type 3 (60 watts max)\nPoE+++ = 802.3bt Type 4 (90 watts max)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWe may run out of pluses in a few years.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.themoviedb.org/tv/226362-el-eternauta\"\u003eThe Eternaut\u003c/a\u003e is very good so far. I\u0026rsquo;m on episode 4. Check it out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBecause I was supposed to be doing something else, I started looking at\nsetting up \u003ca href=\"https://github.com/qdm12/gluetun\"\u003egluetun\u003c/a\u003e this week.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eVPN client in a thin Docker container for multiple VPN providers, written in\nGo, and using OpenVPN or Wireguard, DNS over TLS, with a few proxy servers\nbuilt-in.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis allows you to route traffic for your other Docker containers via your VPN\nprovider of choice. It took a bit of faffing but it seems to be working ok as\nfar as I can tell. I want to play around with it some more, in particular\ntesting how the kill switch functionality works.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI pulled a muscle in my back this week whilst standing completely still, head\ndown looking at my phone, at the gym, before I\u0026rsquo;d started my workout.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI finished reading \u003ca href=\"https://www.goodreads.com/book/show/223436601-careless-people\"\u003eCareless People\u003c/a\u003e by Sarah Wynn-Williams this week about\nher time at FaceBook. I\u0026rsquo;ll save you the time \u0026ndash; it\u0026rsquo;s as bad as you think.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://openinframap.org/\"\u003eOpen Infrastructure Map\u003c/a\u003e \u0026ndash; this is cool.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOpen Infrastructure Map is a view of the world\u0026rsquo;s infrastructure mapped in\nthe OpenStreetMap database.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://claude.ai/\"\u003eClaude\u003c/a\u003e is not very good at HTML and CSS. I asked it to create a very\nstraightforward prototype page and it just couldn\u0026rsquo;t do it. It constantly\nflip-flopped back and forth between the various versions it had produced.\u003c/p\u003e",
      "date_published": "2025-05-04T00:00:00+00:00",
      "date_modified": "2025-05-04T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/200-reciprocating-saw/",
      "url": "https://elver.me/weeknotes/200-reciprocating-saw/",
      "title": "Weeknotes 200: Reciprocating saw",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTWO HUNDRED posts! 🤩\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://thewirednomad.com/vpn\"\u003eHow to Use a Tailscale VPN for Remote Work and Travel\u003c/a\u003e \u0026ndash; I haven\u0026rsquo;t read\nthis, and I probably never will, but it looks interesting for the digital\nnomad.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA couple of DIY sessions this week albeit at someone else\u0026rsquo;s house. First time\nusing a reciprocating saw \u0026ndash; quite fun. All fingers accounted for.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome Game Boy action this week. I actually brought a Game Boy Pocket back to\nlife from not turning on at all. Replacing the capacitors and power switch did\nthe job. Once it had power I re-shelled it, hooked up a new IPS screen, and\ngave it new buttons and rubber membranes. Very happy with it. That was until I\ntried pressing \u003ckbd\u003eSelect\u003c/kbd\u003e, \u003ckbd\u003eStart\u003c/kbd\u003e, \u003ckbd\u003eA\u003c/kbd\u003e or\n\u003ckbd\u003eB\u003c/kbd\u003e, and discovered that those buttons didn\u0026rsquo;t work, sadness (the\nD-pad was fine). So now I have to figure out what to do.\u003c/p\u003e\n\u003cp\u003eThe perfectionist in me wants to pursue getting this one working even though I\nhave many other boards I could substitute in to get this project done. I set a\nlot of arbitrary rules for myself which are often self-defeating. More\npragmatism or grit required.\u003c/p\u003e\n\u003cp\u003eIt is a win that I brought a Game Boy back to life, despite not being fully\nfunctional, but I don\u0026rsquo;t feel it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/196-expandable-file-folder/#:~:text=trying%20out%20Quiche%20Browser\"\u003eexperiment with Quiche Browser\u003c/a\u003e on iOS is over. Back to Arc for now. I\u0026rsquo;m\nalready glad I went back.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSomeone stole a parcel from my doorstep on Thursday. Obviously the monetary\nloss is annoying (although it was low) but it was more annoying/disappointing\nknowing that thieves are apparently walking past my door on a regular basis.\nMaybe I\u0026rsquo;m annoyed with myself for being naive.\u003c/p\u003e\n\u003cp\u003eI hope they enjoy their new Game Boy Pocket shells, I\u0026rsquo;m sure they’ll get good\nuse out of them.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStill, the doorbell camera installation has moved up the priority list.\u003c/p\u003e\n\u003cp\u003eIdeally I would like a hardwired PoE doorbell. Sure WiFi is cool, and people\nwill swear there\u0026rsquo;s no problem with it, but network cables reduce so much\nfriction. After they are installed of course, because the quicker and easier\nthing to do \u003cem\u003eright now\u003c/em\u003e would be to get a WiFi doorbell.\u003c/p\u003e\n\u003cp\u003eThe thing is, a PoE doorbell is going to need a PoE switch, and I\u0026rsquo;m all out of\nthem right now considering that entire \u0026ldquo;network\u0026rdquo; currently still comprises of\nthe Virgin Media Hub supplied to us when we moved in, and it certainly doesn\u0026rsquo;t\nhave PoE capabilities.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been waiting on doing any proper networking since we moved in for a few\nreasons: 1) concern over spending money on networking gear; 2) not wanting to\n\u0026ldquo;get it wrong\u0026rdquo; because the network is bigger and more complicated in scope for\nthis house than the small flat we were living in before; 3) all the decisions\nwhich will need to be made.\u003c/p\u003e\n\u003cp\u003eMaybe I should get on with it anyway.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.tomshardware.com/peripherals/usb/usb-2-0-is-25-years-old-today-the-interface-standard-that-changed-the-world\"\u003e\u0026ldquo;USB 2.0 is 25 years old today — the interface standard that changed the\nworld\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not old, you\u0026rsquo;re old.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.charpeni.com/blog/how-to-easily-reproduce-a-flaky-test-in-playwright\"\u003eHow to Easily Reproduce a Flaky Test in Playwright\u003c/a\u003e \u0026ndash; I\u0026rsquo;m still yet to use\nPlaywright in anger, but these tips sound useful for when I do.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt would be great if Apple could make the audio routing(?!) on iOS \u0026ndash; it\u0026rsquo;s a\nmess.\u003c/p\u003e\n\u003cp\u003eSome examples:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTaking AirPods out of your ears should stop the music or whatever. Which it\nmostly does. But sometimes it doesn\u0026rsquo;t; it just continues playing. Sometimes\nI don\u0026rsquo;t notice straight away that sound is emanating from my pocket.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBut it gets worse. The app you’re using (\u003ca href=\"https://castro.fm/\"\u003eCastro\u003c/a\u003e usually in my case)\n\u003cem\u003ethinks\u003c/em\u003e the audio is still playing because the play/stop button state is\nstill set to \u0026ldquo;playing\u0026rdquo;. To stop the audio you have to press play and then\nstop again. Terrible UX.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePlaying audio via CarPlay is as bad. When I connect my phone to the car what\nhappens next seems completely random. Sometimes the last thing that was\nplaying just starts playing, completely unrequested. Sometimes nothing\nhappens. Sometimes I audio starts playing and I turn it off and IT TURNS\nITSELF BACK ON and I end up in a back and forth fight with the car!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m listening to a podcast. Opening Spotify stops the podcast. Why? I\nhaven\u0026rsquo;t pressed play in Spotify. Why would the audio stop?\u003c/p\u003e\n\u003cp\u003eI open Reddit whilst listening to Spotify. The music stops, presumably\nReddit stole focus from Spotify somehow.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSort yourself out Apple.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been planning a trip. Reddit is proving to be far more useful than the\nusual Trip Advisor trawling. Advice from locals is golden.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL Plex allows you to \u003ca href=\"https://support.plex.tv/articles/naming-and-organizing-your-tv-show-files/#:~:text=If%20you%20are,of%20the%20article.\"\u003einclude the TVDB/IMDB show ID in TV show directory\nname\u003c/a\u003e to aid in identifying it correctly.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you are using the “Plex TV Series” agent, you can optionally include the\nTMDB or TVDB show ID in the folder name to improve matching. If you choose\nto do that, it must be inside curly braces: ShowName (2020) {tmdb-123456} or\nShowName (2020) {tvdb-123456}, where 123456 is the show ID. An example can\nbe found at the end of the article.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHandy.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTWO HUNDRED posts! 🤩\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://thewirednomad.com/vpn\"\u003eHow to Use a Tailscale VPN for Remote Work and Travel\u003c/a\u003e \u0026ndash; I haven\u0026rsquo;t read\nthis, and I probably never will, but it looks interesting for the digital\nnomad.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA couple of DIY sessions this week albeit at someone else\u0026rsquo;s house. First time\nusing a reciprocating saw \u0026ndash; quite fun. All fingers accounted for.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome Game Boy action this week. I actually brought a Game Boy Pocket back to\nlife from not turning on at all. Replacing the capacitors and power switch did\nthe job. Once it had power I re-shelled it, hooked up a new IPS screen, and\ngave it new buttons and rubber membranes. Very happy with it. That was until I\ntried pressing \u003ckbd\u003eSelect\u003c/kbd\u003e, \u003ckbd\u003eStart\u003c/kbd\u003e, \u003ckbd\u003eA\u003c/kbd\u003e or\n\u003ckbd\u003eB\u003c/kbd\u003e, and discovered that those buttons didn\u0026rsquo;t work, sadness (the\nD-pad was fine). So now I have to figure out what to do.\u003c/p\u003e",
      "date_published": "2025-04-27T00:00:00+00:00",
      "date_modified": "2025-04-27T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/199-tv-heavy/",
      "url": "https://elver.me/weeknotes/199-tv-heavy/",
      "title": "Weeknotes 199: TV heavy",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe Last of Us is back with Season 2 🙌\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnts have invaded the kitchen. This means I\u0026rsquo;ve been going on a killing spree\nevery couple of days. I don\u0026rsquo;t like it, but they won\u0026rsquo;t be herded, and they\nwon\u0026rsquo;t leave.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/news/649851/figma-dev-mode-trademark-loveable-dispute\"\u003eTrademarking \u0026ldquo;Dev mode\u0026rdquo;\u003c/a\u003e \u0026ndash; nice one, Figma 🙄\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFigma slapped Swedish AI coding startup Loveable with a cease-and-desist\nwarning for naming one of its new product features “Dev Mode.” It turns out\nFigma successfully trademarked the term Dev Mode in November last year,\naccording to the US Patent and Trademark office, having introduced its own\nDev Mode feature in 2023.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe US Patent and Trademark office doing a fine job, as usual, too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been watching, and enjoying, \u003ca href=\"https://www.themoviedb.org/tv/247718-mobland\"\u003eMobLand\u003c/a\u003e solely because Tom Hardy is so\nexcellent in it. However, the Irish accents, especially Helen Mirren, blimey.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gridfinity.xyz/\"\u003eGridfinity\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe modular, open-source grid storage system\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIf I ever needed an excuse to get a 3D printer, this is it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf I don\u0026rsquo;t have a list of to-do items in \u003ca href=\"https://culturedcode.com/things/\"\u003eThings\u003c/a\u003e things don\u0026rsquo;t get done. I put\neverything in there. I even retroactively add them so that I know I\u0026rsquo;ve done\nsomething in the day. A way of combating the \u0026ldquo;What have you even done today?\u0026rdquo;\nthoughts that plague me.\u003c/p\u003e\n\u003cp\u003eBut adding items can become laborious so I\u0026rsquo;ve started taking advantage of the\n\u003ca href=\"https://support.apple.com/en-gb/guide/iphone/iph6d01d862/ios\"\u003eiOS Text Replacement\u003c/a\u003e features to add vim-style mnemonics for oft done tasks.\nSo typing \u003ccode\u003epwo\u003c/code\u003e is changed to \u003ccode\u003ePut washing on\u003c/code\u003e, and so on. And, because I\u0026rsquo;m\nfancy, I also add an emoji in there because the iOS emoji picker is awful, and\nit jazzes-up how everything looks.\u003c/p\u003e\n\u003cp\u003eUnexpectedly these text replacements also automagically sync across to macOS,\nwhich is nice ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://paraxial.io/blog/erlang-ssh\"\u003eWhat the Critical Erlang SSH Vulnerability Means for Elixir Developers\u003c/a\u003e \u0026ndash;\nThis is potentially bad, very bad, but the average application is likely\nunaffected, thankfully.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHot air reworking takes more skill than I thought, of course. Still, some\nsuccess during the couple of practice sessions I\u0026rsquo;ve engaged in this week.\u003c/p\u003e\n\u003cp\u003eThe old motherboards arrived from eBay. There is a good variety so I\u0026rsquo;m happy\nwith the purchase. The only potential issue that I noticed in retrospect is\nthat they are all quite new, from fairly recent laptops it seems, whereas my\nultimate goal is to apply hot air to boards that are 30+ years old. Whether\nthat matters is to be determined.\u003c/p\u003e\n\u003cp\u003eI did manage to remove fairly large chips from a couple of the boards. I\n\u003cem\u003ethink\u003c/em\u003e they were \u003ca href=\"https://en.wikipedia.org/wiki/Quad_flat_package\"\u003eQFP\u003c/a\u003e  chips which are soldered underneath as well as at the\nsides. This means (I think) that they soak up a lot of the heat making it more\ndifficult to melt the solder beneath. Or something.\u003c/p\u003e\n\u003cp\u003eRe-applying is not quite as tricky, but predictably pointed to the need for a\nmicroscope - of course it did - something I\u0026rsquo;ve been trying to avoid for a\nwhile now. The pins are just so physically small that it\u0026rsquo;s hard to see if\nthey\u0026rsquo;re connected or bridged. Paying a mortgage is overrated anyway.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt was a nice surprise to see my blog \u003ca href=\"https://crbelaus.com/2025/03/31/elixir-external-resources\"\u003ename checked\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://endoflife.date/\"\u003eendoflife.date\u003c/a\u003e is a nice idea. It is annoying how hard this sort of\ninformation it to find sometimes.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eEnd-of-life (EOL) and support information is often hard to track, or very\nbadly presented. endoflife.date documents EOL dates and support lifecycles\nfor various products.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://martinrobbins.substack.com/p/von-6-why-does-britain-feel-so-poor\"\u003eWhy does Britain feel so poor?\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA long time to-do list item was started and partially completed this week \u0026ndash;\nchanging my business address details \u0026ndash; hurrah!\u003c/p\u003e\n\u003cp\u003eThe thought of breaking something has kept this on the back-burner for a long\ntime, but now I\u0026rsquo;ve decided upon and purchased an account with a virtual office\naddress provider, so I can start updating my address all over the place.\u003c/p\u003e\n\u003cp\u003eThat will continue next week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL Royal Mail have a service called \u003ca href=\"https://www.postoffice.co.uk/mail/poste-restante\"\u003ePoste Restante\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eImagine being able to pick up your post when you\u0026rsquo;re travelling around the UK\nor abroad. Well now you can – thanks to Poste Restante\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ePotentially very handy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wrote some code for the first time in quite some time this week. Then it got\nhard and my interest waned. Why am I like this?\u003c/p\u003e\n\u003cp\u003eStill, I found the use of Anthrophic\u0026rsquo;s Claude 3.5 absolutely invaluable. It\u0026rsquo;s\nlike pair programming but without the social anxieties attached.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNow that I\u0026rsquo;ve finished Love, Death + Robots, and \u003ca href=\"/weeknotes/198-hot-air-station/#:~:text=Siracusa%E2%80%99s%20take%20on%20Death%2C%20Love%20%2B%20Robots\"\u003efollowing Siracusa\u0026rsquo;s lead\u003c/a\u003e,\nhere are my Top 10 favourite episodes, in no particular order.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSonnie\u0026rsquo;s Edge\u003c/li\u003e\n\u003cli\u003eThree Robots\u003c/li\u003e\n\u003cli\u003eAutomated Customer Service\u003c/li\u003e\n\u003cli\u003eThe Tall Grass\u003c/li\u003e\n\u003cli\u003eAll Through the House\u003c/li\u003e\n\u003cli\u003eThree Robots: Exit Strategies\u003c/li\u003e\n\u003cli\u003eBad Travelling\u003c/li\u003e\n\u003cli\u003eNight of the Mini Dead\u003c/li\u003e\n\u003cli\u003eSwarm\u003c/li\u003e\n\u003cli\u003eMason\u0026rsquo;s Rats\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSeason 4 is released 15th May.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe Last of Us is back with Season 2 🙌\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnts have invaded the kitchen. This means I\u0026rsquo;ve been going on a killing spree\nevery couple of days. I don\u0026rsquo;t like it, but they won\u0026rsquo;t be herded, and they\nwon\u0026rsquo;t leave.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/news/649851/figma-dev-mode-trademark-loveable-dispute\"\u003eTrademarking \u0026ldquo;Dev mode\u0026rdquo;\u003c/a\u003e \u0026ndash; nice one, Figma 🙄\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFigma slapped Swedish AI coding startup Loveable with a cease-and-desist\nwarning for naming one of its new product features “Dev Mode.” It turns out\nFigma successfully trademarked the term Dev Mode in November last year,\naccording to the US Patent and Trademark office, having introduced its own\nDev Mode feature in 2023.\u003c/p\u003e",
      "date_published": "2025-04-20T00:00:00+00:00",
      "date_modified": "2025-04-20T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/198-hot-air-station/",
      "url": "https://elver.me/weeknotes/198-hot-air-station/",
      "title": "Weeknotes 198: Hot air station",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.kickstarter.com/projects/clevetura/clvx-1-for-mac-gesture-keyboard\"\u003eCLVX 1 for Mac. Gesture Keyboard\u003c/a\u003e \u0026ndash; A keyboard with a trackpad built into\nthe keys. Not sure how well this would work in practice, but cool nonetheless.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://evanhahn.com/how-big-is-a-kilobyte/\"\u003eHow big is a kilobyte?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI saw a few people confidently declare that a kilobyte is 1000\nbytes—everyone else is wrong. I also saw the opposite. This ignores a lot of\nhuman nuance!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI always thought we used \u003ccode\u003e1000\u003c/code\u003e when talking about networks, and \u003ccode\u003e1024\u003c/code\u003e when\ntalking filesystems. Seems I was wrong too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://chartdb.io/\"\u003eChartDB\u003c/a\u003e is pretty swish!\u003c/p\u003e\n\u003cp\u003eAnd self-hostable too for those of you with beards.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://tld-list.com/\"\u003eTLD-LIST\u003c/a\u003e \u0026ndash; Really useful site for comparing domain prices.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA friend invited me along to visit a local \u0026ldquo;hackspace\u0026rdquo; this week. They have\nall manner of equipment and gadgets there. I\u0026rsquo;m glad I went but it was a pretty\noverwhelming experience to be honest, and I felt like a bit of an imposter.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.blog/ai-and-ml/llms/what-the-heck-is-mcp-and-why-is-everyone-talking-about-it/\"\u003e\u0026ldquo;What the heck is MCP and why is everyone talking about it?\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://hypercritical.co/2025/04/10/love-death-robots\"\u003eSiracusa\u0026rsquo;s take on Death, Love + Robots\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThey’re not all winners, but I treasure the ones that succeed on their own\nterms.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAgreed. I haven\u0026rsquo;t enjoyed all of these episodes, but the ones that \u003cem\u003eare good\u003c/em\u003e\nare \u003cem\u003ereally\u003c/em\u003e good.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWill \u003ca href=\"https://en.m.wikipedia.org/wiki/Jevons_paradox\"\u003eJevon\u0026rsquo;s paradox\u003c/a\u003e save us from A.I.?\u003c/p\u003e\n\u003cp\u003eHat tip to \u003ca href=\"https://www.relay.fm/radar/316\"\u003eUnder The Radar #316\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/197-i-m-a-youtuber-now/#:~:text=bought%20a%20hot%20air%20station\"\u003ehot air station\u003c/a\u003e was delivered and seems to work fine with a normal\n\u0026ldquo;kettle lead\u0026rdquo; as I\u0026rsquo;d hoped (it came with a European plug). I haven\u0026rsquo;t used it\nin anger yet as I\u0026rsquo;m waiting on some scrap motherboards from eBay to practice\non before I unleash it on an unsuspecting Game Boy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHowever, the fume extractor I ordered at the same time was \u003cem\u003enot\u003c/em\u003e delivered\neven though it says it was. This is the first time I\u0026rsquo;ve had an issue with\nsomething not having been delivered from AliExpress but I guess it was\ninevitable eventually.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.konnorrogers.com/posts/2025/converting-a-postgres-interval-to-an-integer\"\u003eConverting A Postgres Interval To An Integer\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIntervals are very convenient, especially when storing the \u0026ldquo;length of time\u0026rdquo;\nof a subscription, but subscriptions \u0026ldquo;timer\u0026rdquo; hasn\u0026rsquo;t started yet, and will\nstart at a future date.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI finally got a third party IPS screen to power up on a Game Boy Pocket 🙌\u003c/p\u003e\n\u003cp\u003eWhat special steps did I follow to reach this milestone? None at all. I\nfollowed exactly the same steps as I did for all my other attempts: connected\nthe ribbon cable and soldered a small wire from the power switch to the\ncontroller board. And this time it worked 🤷‍♂️\u003c/p\u003e\n\u003cp\u003eIt seems clear that I have some duff Game Boy Colors.\u003c/p\u003e\n\u003cp\u003eThis is a small step on a path to reduced self-loathing, and has bolstered my\nconfidence a bit.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.kickstarter.com/projects/clevetura/clvx-1-for-mac-gesture-keyboard\"\u003eCLVX 1 for Mac. Gesture Keyboard\u003c/a\u003e \u0026ndash; A keyboard with a trackpad built into\nthe keys. Not sure how well this would work in practice, but cool nonetheless.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://evanhahn.com/how-big-is-a-kilobyte/\"\u003eHow big is a kilobyte?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI saw a few people confidently declare that a kilobyte is 1000\nbytes—everyone else is wrong. I also saw the opposite. This ignores a lot of\nhuman nuance!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI always thought we used \u003ccode\u003e1000\u003c/code\u003e when talking about networks, and \u003ccode\u003e1024\u003c/code\u003e when\ntalking filesystems. Seems I was wrong too.\u003c/p\u003e",
      "date_published": "2025-04-13T00:00:00+00:00",
      "date_modified": "2025-04-13T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/197-i-m-a-youtuber-now/",
      "url": "https://elver.me/weeknotes/197-i-m-a-youtuber-now/",
      "title": "Weeknotes 197: I'm a YouTuber now",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWould you use \u003ca href=\"https://www.theverge.com/news/642620/trump-tariffs-formula-ai-chatgpt-gemini-claude-grok\"\u003eChatGPT to calculate tariffs with other countries?\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMe neither.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/tech/635020/av1-streaming-netflix-youtube-google-adoption\"\u003eAV1 is supposed to make streaming better, so why isn\u0026rsquo;t everyone using it?\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe were meant to go and see a show last Sunday evening, but we couldn\u0026rsquo;t be\narsed. So we didn\u0026rsquo;t. What is being wasteful and what is being an adult with\nthe agency to make decisions?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy desk has finally been upgraded with the addition of the \u003ca href=\"https://www.tindie.com/products/gcormier/megadesk/\"\u003eM-m-m-Megadesk\u003c/a\u003e\n(Yes, I am persisting with that) and it was not nearly as scary as I\nanticipated. The biggest part of the job is getting the controller casing open\nin order to swap the PCB over.\u003c/p\u003e\n\u003cp\u003eCheck out this completely silent timelapse I made of the disassembly process\nfeaturing my big head.\u003c/p\u003e\n\u003ciframe\n  width=\"560\"\n  height=\"315\"\n  src=\"https://www.youtube.com/embed/yYo_EYP9Rig?si=O0lfoPnMu7tGr1V0\"\n  title=\"Disassembling the IKEA Bekant desk controller ready for Megadesk installation\"\n  frameborder=\"0\"\n  allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n  referrerpolicy=\"strict-origin-when-cross-origin\"\n  allowfullscreen\u003e\n\u003c/iframe\u003e\n\u003cp\u003eThe desk now has programmable memory positions which can be accessed via the\n⬆️ button. Pressing ⬆️ ⬆️ now lowers the desk to the perfect sitting position\nand pressing ⬆️ ⬆️ ⬆️ raises the desk to standing height.\u003c/p\u003e\n\u003cp\u003eNice ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother new app from \u003ca href=\"https://sindresorhus.com/\"\u003eSindre Sorhus\u003c/a\u003e — \u003ca href=\"https://sindresorhus.com/text-lens\"\u003eTextLens\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eExtract text from anywhere on your screen. Select any area containing text -\nfrom images, videos, PDFs, or presentations - and instantly convert it to\neditable text.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI don\u0026rsquo;t need this is as I already have this functionality built-in to\n\u003ca href=\"https://cleanshot.com/\"\u003eCleanShot\u003c/a\u003e but if you\u0026rsquo;re not a CleanShot X user you might. I\u0026rsquo;ve \u003ca href=\"/weeknotes/30-quality-of-life-improvement/#:~:text=nice%20utility%20called%20TRex\"\u003epreviously\nmentioned\u003c/a\u003e \u003ca href=\"https://trex.ameba.co/\"\u003eTRex\u003c/a\u003e which is another alternative.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.aviator.co/blog/stacked-prs-code-changes-as-narrative/\"\u003eStacked PRs: Code Changes as Narrative\u003c/a\u003e \u0026ndash; The best developers I\u0026rsquo;ve worked\nwith have done this. Small, focussed PRs that tell a story. The worst; just a\ngrab bag o’ changes they want to merge.\u003c/p\u003e\n\u003cp\u003e(And \u003ca href=\"/weeknotes/179-tumultuous-week/#:~:text=Squash%20merges%20are%20dirty%20solution%20for%20people%20who%20cannot%20use%20rebase%20%E2%80%9Cmerges%E2%80%9D%20and%20cannot%20keep%20their%20commit%20history%20clean.\"\u003esquash merges are still bad\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://phoenixframework.org/blog/phoenix-1-8-released\"\u003ePhoenix 1.8 is nearing\u003c/a\u003e and it\u0026rsquo;s another solid release as usual. A couple of\nthings stood out to me in particular.\u003c/p\u003e\n\u003cp\u003eThe context guide has been rewritten.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe context guide has been broken apart into a few separate guides that now\nbetter explores data modeling, using ecommerce to drive the examples.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe core team have obviously been listening to community feedback with this\none as I\u0026rsquo;ve seen a fair few people not understand what to do with Contexts,\nmyself included. The idea of a Context is a good one; separate your data\naccess from your core logic. It can be confusing knowing how to apply though,\nso I think this change is great.\u003c/p\u003e\n\u003cp\u003eThe second thing is that Phoenix is moving to using \u003ca href=\"https://daisyui.com/\"\u003eDaisy UI\u003c/a\u003e by default\n(although you can, of course, opt out). I came across Daisy UI a while ago and\nthought it looked nice but it didn\u0026rsquo;t seen \u0026ldquo;ready\u0026rdquo; yet. It has come a long way.\nIt won\u0026rsquo;t be the preferred choice for a lot of people I suspect, but there\u0026rsquo;s a\nlot to be said for having your web app look fairly decent by default and I\nsuspect it\u0026rsquo;s quite a big contributing factor when people choose their web app\nstack.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIsn\u0026rsquo;t it wild that in 2025 certain requests to eBay are still routed through a\n\u003ca href=\"https://en.wikipedia.org/wiki/Dynamic-link_library\"\u003eDLL\u003c/a\u003e? (look out for \u003ccode\u003eeBayISAPI.dll\u003c/code\u003e in the URL).\u003c/p\u003e\n\u003cp\u003eeBay must have a hell of an enterprise support contract set up with Microsoft.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://birchtree.me/blog/this-alert-must-die/\"\u003eThis alert must die\u003c/a\u003e \u0026ndash; it really \u003cem\u003emust\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother thing I\u0026rsquo;ve been meaning to get to for a while since I \u003ca href=\"https://github.com/jordelver/dotfiles/pull/2\"\u003erefactored my\nNeovim config to use lazy.nvim\u003c/a\u003e was to setup completion and LSP. It wasn\u0026rsquo;t as\nhard (are you sensing a pattern?) to get the \u003ca href=\"https://github.com/jordelver/dotfiles/pull/3\"\u003ebasics working\u003c/a\u003e as I had\nimagined, but it is tricky to know what is working for me as I\u0026rsquo;m not in full\ncoding mode at the moment.\u003c/p\u003e\n\u003cp\u003eI decided to try the \u0026ldquo;NeoVim way\u0026rdquo; for keymaps. Completion is typically\n\u003ckbd\u003eTab\u003c/kbd\u003e and \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eTab\u003c/kbd\u003e for a lot of editors, but\nthat is not the default for vim. The pattern of \u003ckbd\u003eCTRL\u003c/kbd\u003e-\u003ckbd\u003en\u003c/kbd\u003e\nand \u003ckbd\u003eCTRL\u003c/kbd\u003e-\u003ckbd\u003ep\u003c/kbd\u003e is seen in many places throughout vim and the\nmakers of \u003ca href=\"https://github.com/Saghen/blink.cmp\"\u003eblink.cmp\u003c/a\u003e (the completion plugin I\u0026rsquo;m using) think you should\ncontinue that pattern (although you can configure otherwise if you chose).\u003c/p\u003e\n\u003cp\u003eSo now I have \u003ckbd\u003eCTRL\u003c/kbd\u003e-\u003ckbd\u003en\u003c/kbd\u003e to navigate to the next item,\n\u003ckbd\u003eCTRL\u003c/kbd\u003e - \u003ckbd\u003ep\u003c/kbd\u003e for previous, and \u003ckbd\u003eCTRL\u003c/kbd\u003e-\u003ckbd\u003ey\u003c/kbd\u003e\nfor accepting the suggestion.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m still getting used to it. Time  will tell whether I revert back to my\n\u003ckbd\u003eTab\u003c/kbd\u003e safe-space.\u003c/p\u003e\n\u003cp\u003eSnippets are also something I want to start using, and I am in the process of\nsetting that up now. Where those are concerned you \u003cem\u003edo\u003c/em\u003e use \u003ckbd\u003eTab\u003c/kbd\u003e and\n\u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eTab\u003c/kbd\u003e to navigate through the placeholders.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mypaycalculator.co.uk/\"\u003eTake Home Pay / Salary Calculator (2025/2026)\u003c/a\u003e \u0026ndash; This seems like it might be\nworth remembering.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gumroad.com/\"\u003eGumroad\u003c/a\u003e have \u003ca href=\"https://github.com/antiwork/gumroad\"\u003eopen sourced their code\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWith Gumroad, anyone can earn their first dollar online. Just start with\nwhat you know, see what sticks, and get paid. It\u0026rsquo;s that easy.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBecause I\u0026rsquo;ve been so successful in my new electronics hobby I\u0026rsquo;m plowing ahead\nwith even more advanced soldering techniques and I\u0026rsquo;ve bought a hot air station\nto aid in the soldering of tiny components, and in particular the removal of\nthem. I expect this to follow the same unsuccessful path I\u0026rsquo;ve been following\nuntil now, but I guess at least I\u0026rsquo;m trying.\u003c/p\u003e\n\u003cp\u003eAlso, retail therapy dopamine is super effective.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWould you use \u003ca href=\"https://www.theverge.com/news/642620/trump-tariffs-formula-ai-chatgpt-gemini-claude-grok\"\u003eChatGPT to calculate tariffs with other countries?\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMe neither.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/tech/635020/av1-streaming-netflix-youtube-google-adoption\"\u003eAV1 is supposed to make streaming better, so why isn\u0026rsquo;t everyone using it?\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe were meant to go and see a show last Sunday evening, but we couldn\u0026rsquo;t be\narsed. So we didn\u0026rsquo;t. What is being wasteful and what is being an adult with\nthe agency to make decisions?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy desk has finally been upgraded with the addition of the \u003ca href=\"https://www.tindie.com/products/gcormier/megadesk/\"\u003eM-m-m-Megadesk\u003c/a\u003e\n(Yes, I am persisting with that) and it was not nearly as scary as I\nanticipated. The biggest part of the job is getting the controller casing open\nin order to swap the PCB over.\u003c/p\u003e",
      "date_published": "2025-04-06T00:00:00+00:00",
      "date_modified": "2025-04-06T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/196-expandable-file-folder/",
      "url": "https://elver.me/weeknotes/196-expandable-file-folder/",
      "title": "Weeknotes 196: Expandable file folder",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe number of programmers who don\u0026rsquo;t seem know how a mailing list works is\nconcerning for the profession.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen machines/nodes are added to your tailnet the keys used are set to expire\n\u0026ndash; a reasonable default. However, Tailscale does not tell you when a key is\n\u003cem\u003eabout to\u003c/em\u003e expire or \u003cem\u003ehas\u003c/em\u003e expired.\u003c/p\u003e\n\u003cp\u003eThis is a long way of telling you I\u0026rsquo;ve lost access to a remote node on my\ntailnet. And I won\u0026rsquo;t be able to get access again without physically being in\nthe same room. Not the end of the world but a lesson I feel I should have seen\ncoming.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you\u0026rsquo;re wondering just how bored I am, and why wouldn\u0026rsquo;t you be, this week I\nbought a multi-pack of A6-sized expandable file folders to organise my\nconference sticker collection.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.charliemonroe.net/a-few-words-about-indie-app-business/\"\u003eA few words about indie app business\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMy recommendation is to diversify. Don’t just have one app, but also don’t\nhave 10 apps – you won’t be able to keep up with all of them. Have 2-4 solid\napps. One of them may be the main source of income, but have some fallback\napp(s) that can keep you afloat if something like this happens to you.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWise words.\u003c/p\u003e\n\u003cp\u003eNow just the small task of coming up with a \u003cem\u003eany\u003c/em\u003e single app idea and\nmustering the motivation required.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFinally, a modicum of success in one of my projects. \u003ca href=\"/weeknotes/195-funky-town/#:~:text=Throwing%20money%20at%20the%20problem\"\u003eMoney was indeed thrown\u003c/a\u003e\n(\u003ca href=\"https://www.amazon.co.uk/dp/B003GDX636\"\u003eI bought this doo-dad\u003c/a\u003e) and I have managed to mount some of my office\nartwork in a satisfactory way. But boy, did I fuck it up a lot first. This is\nwhat test pieces of mounting board are for. Always buy extra.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.eff.org/deeplinks/2025/03/meet-rayhunter-new-open-source-tool-eff-detect-cellular-spying\"\u003eMeet Rayhunter: A New Open Source Tool from EFF to Detect Cellular Spying\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRayhunter is a new open source tool we\u0026rsquo;ve created that runs off an\naffordable mobile hotspot that we hope empowers everyone, regardless of\ntechnical skill, to help search out CSS around the world.\u003c/p\u003e\n\u003cp\u003eCSS (also known as Stingrays or IMSI catchers) are devices that masquerade\nas legitimate cell-phone towers, tricking phones within a certain radius\ninto connecting to the device rather than a tower.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gpanders.com/blog/whats-new-in-neovim-0-11/\"\u003eWhat\u0026rsquo;s New in Neovim 0.11\u003c/a\u003e \u0026ndash; a new major release of Neovim.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://badsoftwareadvice.substack.com/p/how-to-handle-working-software\"\u003eHow to handle working software\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYou have stumbled onto the dark matter of our industry - our ultimate\ngoal and worst nightmare: working software.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve felt this exact thing, but not often, which is a sad state of affairs\nindeed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/179-tumultuous-week/#:~:text=Can%20you%20trust%20a%20bank%20who%20can%E2%80%99t%20correctly%20provision%20your%20bank%20account%3F\"\u003eMore bank account incompetence\u003c/a\u003e \u0026ndash; two examples this time.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eThe bank have decided it\u0026rsquo;s important that I accept a dialog in their iOS\napp which would let me accept payments via my phone. I won\u0026rsquo;t be doing this,\nand I don\u0026rsquo;t want to give you permission. Of course, there is no way to say\n\u0026ldquo;no\u0026rdquo; they just re-prompt you until the end of time. It\u0026rsquo;s a good job I don\u0026rsquo;t\nneed to use the app very often.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBanks are required to collect personal information for \u0026ldquo;checks\u0026rdquo;. I\nunderstand this. But if you\u0026rsquo;re going to ask for it it would be cool if your\napp worked when trying to submit it, yeah?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIs the 1% extra interest I\u0026rsquo;m receiving worth this?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been trying out \u003ca href=\"https://quiche.industries/browser/\"\u003eQuiche Browser\u003c/a\u003e (terrible name) on iOS as a replacement\nfor Arc Mobile which I\u0026rsquo;m pretty sure The Browser Company are getting bored of.\nI\u0026rsquo;m not loving it so far. I will persist for a bit longer.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mattgadient.com/x264-vs-x265-vs-vp8-vs-vp9-examples/\"\u003eEncoder Comparison \u0026ndash; x264 vs x265 vs VP8 vs VP9\u003c/a\u003e \u0026ndash; Compare different codecs\ninteractively, nice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLast week I decided to return one of the \u0026ldquo;non-working\u0026rdquo; Game Boy Color screens\nto whence it came. The helpful support person said they would check it over\nwhen it arrived back with them, and guess what? It worked. They hooked it up,\nand it worked.\u003c/p\u003e\n\u003cp\u003eWhilst it\u0026rsquo;s good to know the unit it definitely working, this lays the blame\nfor it not working with my GBCs squarely on my shoulders. A long email thread\nensued and they were very helpful in trying to get it working for me, alas\nthey were also stumped. Still, I have some generic advice and vague plan on\nhow to move forward but I am not optimistic. And, of course, I spent more\nmoney.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe number of programmers who don\u0026rsquo;t seem know how a mailing list works is\nconcerning for the profession.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen machines/nodes are added to your tailnet the keys used are set to expire\n\u0026ndash; a reasonable default. However, Tailscale does not tell you when a key is\n\u003cem\u003eabout to\u003c/em\u003e expire or \u003cem\u003ehas\u003c/em\u003e expired.\u003c/p\u003e\n\u003cp\u003eThis is a long way of telling you I\u0026rsquo;ve lost access to a remote node on my\ntailnet. And I won\u0026rsquo;t be able to get access again without physically being in\nthe same room. Not the end of the world but a lesson I feel I should have seen\ncoming.\u003c/p\u003e",
      "date_published": "2025-03-30T00:00:00+00:00",
      "date_modified": "2025-03-30T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/195-funky-town/",
      "url": "https://elver.me/weeknotes/195-funky-town/",
      "title": "Weeknotes 195: Funky town",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMy slow puncture was repaired. You can stop worrying now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been in a self-destructive funk most of the week for no reason in\nparticular other than too much time in my own head. A friend asked me if I was\nbored not having work at the moment. Sure, but I\u0026rsquo;m bored when \u003cem\u003ein\u003c/em\u003e work too.\nThe differentiator being not having an income.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI tried my hand at mounting and framing some artworks that I\u0026rsquo;ve had in folders\nfor some years. It didn\u0026rsquo;t go well. YouTube makes everything look too easy.\nThrowing money at the problem and trying again soon.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe took a mid-week trip to \u003ca href=\"https://en.wikipedia.org/wiki/Helmsley\"\u003eHelmsley\u003c/a\u003e in North Yorkshire and spent a few hours\nstrolling around. It\u0026rsquo;s a lovely little place in the middle of beautiful\ncountryside if you\u0026rsquo;re ever in the area.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGame Boy updates: This hobby might not be for me 😪 No real progress and not\nsure how to move anything forward.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs I\u0026rsquo;ve said before I bought various cheap-o temperature sensors to add to my\nfuture-potential-home-automation-nightmare Zigbee network. I paired them to\nthe network as temporary nodes so that I could compare what values they output\nover time and see if they are aligned in what temperature and humidity they\nthink the room is.\u003c/p\u003e\n\u003cp\u003eI spent most of the week procrastinating over creating a graph because I don\u0026rsquo;t\nknow why. When I sat down and actually looked at how to do it, it was a piece\nof piss, and done in 20 minutes. Jesus.\u003c/p\u003e\n\u003cp\u003eAnd now I have a graph.\u003c/p\u003e\n\u003cp\u003eConclusion, they all report about the same and does it even matter anyway?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://kyrylo.org/html/2024/10/25/why-does-target-blank-have-an-underscore-in-front.html\"\u003e\u0026ldquo;Why does target=\u0026quot;_blank\u0026rdquo; have an underscore in front?\u0026quot;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://organicmaps.app/\"\u003eOrganic Maps\u003c/a\u003e for those wanting to avoid the big tech guys.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOrganic Maps is one of the few applications nowadays that supports 100% of\nfeatures without an active Internet connection. Install Organic Maps,\ndownload maps, throw away your SIM card, and go for a weeklong trip on a\nsingle battery charge without any byte sent to the network.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitchellh.com/writing/as-code\"\u003e\u0026ldquo;As Code\u0026rdquo;\u003c/a\u003e \u0026ndash; Not the overall point of the post, but this quote stood out to\nme.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSome unsolicited business advice: don\u0026rsquo;t create new market categories, enter\nexisting ones and let your competitors bear the cost of educating the\nmarket.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSay that you were becoming border-line obsessed with sourcing a Zigbee-capable\nsmart power socket from a \u003ca href=\"https://www.ikea.com/\"\u003ewell-known manufacturer/retailer\u003c/a\u003e because it has\nenergy measuring capabilities and is “available” at a very reasonable price\nwhich you think makes it the least likely option to burn your house down, then\nyou might find \u003ca href=\"https://easyrebuild.com/stock?country=gb\u0026amp;itemNo=805.698.42\"\u003ethis website\u003c/a\u003e helpful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://stokerpostgresql.blogspot.com/2025/02/how-postgresqls-aggregate-filter-will.html\"\u003e\u0026ldquo;How PostgreSQL\u0026rsquo;s Aggregate FILTER Will Spoil You\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eWhat can\u0026rsquo;t Postgres do?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter \u003ca href=\"/weeknotes/182-secret-level/#:~:text=made%20for%20my%20short%20attention%20span\"\u003eraving about it some weeks ago\u003c/a\u003e I finally finish Secret Level. I think\nthere were probably only a couple of episodes which I didn\u0026rsquo;t really get into,\nthe rest was great.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis series feels like it’s made for my short attention span\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eLOL\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNot a dicky bird from the \u003ca href=\"/weeknotes/192-birds-are-tweeting/#:~:text=I%20won%E2%80%99t%20know%20for%20real%20for%20a%20few%20weeks\"\u003etroublesome smart lock in weeks\u003c/a\u003e! ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMy slow puncture was repaired. You can stop worrying now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been in a self-destructive funk most of the week for no reason in\nparticular other than too much time in my own head. A friend asked me if I was\nbored not having work at the moment. Sure, but I\u0026rsquo;m bored when \u003cem\u003ein\u003c/em\u003e work too.\nThe differentiator being not having an income.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI tried my hand at mounting and framing some artworks that I\u0026rsquo;ve had in folders\nfor some years. It didn\u0026rsquo;t go well. YouTube makes everything look too easy.\nThrowing money at the problem and trying again soon.\u003c/p\u003e",
      "date_published": "2025-03-23T00:00:00+00:00",
      "date_modified": "2025-03-23T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/194-symlink-it/",
      "url": "https://elver.me/weeknotes/194-symlink-it/",
      "title": "Weeknotes 194: Symlink it",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOne of my car tyres has a slow puncture.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fly.io/phoenix-files/make-your-liveview-feel-faster/\"\u003e\u0026ldquo;LiveView feels faster with a delayed loading indicator\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn less than 5 minutes I made the change and deployed my app. I now have a\nLiveView page that feels so much more responsive! Let’s look at how to add\nthis to an existing app.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAlways interesting how small UX tweaks can affect the \u003cem\u003eperceived\u003c/em\u003e performance\neven if nothing has actually gotten faster.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/193-pasta-machine/#:~:text=I%20briefly%20turned%20direction%20towards%20Home%20Automation\"\u003eforay into home automation\u003c/a\u003e continued with setting up the software side of\nthings. It took a few hours, and some head scratching, but I seem to have the\nbasics going \u0026ndash; Docker is the way.\u003c/p\u003e\n\u003cp\u003eThe basics in this case consists of \u003ca href=\"https://www.zigbee2mqtt.io/\"\u003ezigbee2mqtt\u003c/a\u003e, \u003ca href=\"https://mosquitto.org/\"\u003eMosquitto\u003c/a\u003e, and \u003ca href=\"https://www.home-assistant.io/\"\u003eHome\nAssistant\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eMosquitto is an \u003ca href=\"https://en.wikipedia.org/wiki/MQTT\"\u003eMQTT\u003c/a\u003e broker, which implements the MQTT pub/sub protocol, and\nis used to publish and listen for messages. It sits between zigbee2mqtt and\nHome Assistant.\u003c/p\u003e\n\u003cp\u003ezigbee2mqtt is a replacement for proprietary hardware bridges and it talks to\nthe various devices on the \u003ca href=\"https://en.wikipedia.org/wiki/Zigbee\"\u003eZigbee\u003c/a\u003e network.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m using the \u003ca href=\"https://smlight.tech/product/slzb-06m/\"\u003eSMLIGHT SLZB-06M\u003c/a\u003e over PoE as discussed last week, and watching\nTechno Tim\u0026rsquo;s \u003ca href=\"https://www.youtube.com/watch?v=8e4oaUHlMsE\"\u003e\u0026ldquo;Creating a ZigBee Hub with the SMLIGHT SLZB-06 and Home\nAssistant\u0026rdquo;\u003c/a\u003e sent me in the right direction. My \u003ccode\u003edocker-compose.yml\u003c/code\u003e config now\nlooks like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ehomeassistant:\n  container_name: homeassistant\n  image: \u0026quot;ghcr.io/home-assistant/home-assistant:stable\u0026quot;\n  volumes:\n    - /opt/appdata/homeassistant:/config\n    - /etc/localtime:/etc/localtime:ro\n    - /run/dbus:/run/dbus:ro\n  restart: unless-stopped\n  privileged: true\n  network_mode: host\n\nmqtt:\n  container_name: mqtt\n  image: eclipse-mosquitto:2.0\n  restart: unless-stopped\n  volumes:\n    - /opt/appdata/mosquitto:/mosquitto\n    - /etc/localtime:/etc/localtime:ro\n    - /etc/timezone:/etc/timezone:ro\n  ports:\n    - 1883:1883\n    - 9001:9001\n  command: 'mosquitto -c /mosquitto-no-auth.conf'\n\nzigbee2mqtt:\n  container_name: zigbee2mqtt\n  image: koenkk/zigbee2mqtt\n  restart: unless-stopped\n  volumes:\n    - /opt/appdata/zigbee2mqtt:/app/data\n    - ./zigbee2mqtt/configuration.yaml:/app/data/configuration.yaml:rw\n    - /run/udev:/run/udev:ro\n  ports:\n    - 8080:8080\n  environment:\n    - /etc/localtime:/etc/localtime:ro\n    - /etc/timezone:/etc/timezone:ro\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003ezigbee2mqtt requires it\u0026rsquo;s own config too, which was the hardest part to figure\nout. One of the hardest parts of setting up weirdo hardware you bought online\nis identifying exactly what the thing \u003cem\u003eis\u003c/em\u003e. For example, what chipset does it\nuse? Even for models in the same product line, the chips are likely to be\ndifferent, which is the case here.\u003c/p\u003e\n\u003cp\u003eThe pertinent parts of my zigbee2mqtt config:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eversion: 4\npermit_join: false\nmqtt:\n  base_topic: zigbee2mqtt\n  server: mqtt://mqtt\nserial:\n  port: tcp://192.168.0.220:6638\n  adapter: ezsp\nadvanced:\n  channel: 11\nfrontend\n  enabled: true\nhomeassistant:\n  enabled: true\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI had already purchased an array of temperature sensors, buttons, plug\nsockets, etc at a variety of price points. Unsurprisingly perhaps, the more\nexpensive devices were easier to handle, generally looked nicer, and look to\nbe better made. Saying that, I was surprised that even the cheapest devices\nseemed to pair and work relatively easily.\u003c/p\u003e\n\u003cp\u003eA promising start so far, but time will tell how reliable everything is. For\nnow I\u0026rsquo;m just letting everything run and trialling how it holds up. Actual\nautomations can come later.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://pid1.dev/posts/siren-call-of-sqlite-on-the-server/\"\u003e\u0026ldquo;Siren Call of SQLite on the Server\u0026rdquo;\u003c/a\u003e. To balance all my pro-SQLite posts,\nhere is the case against using SQLite for your web app.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.elixirstreams.com/tips/awesome-ok-noreply-liveview-helpers\"\u003e\u0026ldquo;ok/1 \u0026amp; noreply/1 LiveView helpers!\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eA nice tip for removing awkward return tuples from LiveViews.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDuring my Home Automation tinkering I learned about \u003ca href=\"https://en.wikipedia.org/wiki/Multicast_DNS\"\u003emDNS\u003c/a\u003e. The basics are\nthat if your device and network supports mDNS you should be able to\nautomatically refer to your device by \u003ccode\u003e\u0026lt;name\u0026gt;.local\u003c/code\u003e instead of it\u0026rsquo;s IP\naddress or having to rely on separate DNS.\u003c/p\u003e\n\u003cp\u003eThis did not work for me though.\u003c/p\u003e\n\u003cp\u003eAs my \u0026ldquo;network\u0026rdquo; only really consists of a Virgin Broadband Hub I suspect that\nit lacks whatever is required to make it work.\u003c/p\u003e\n\u003cp\u003eUseful to know though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA tip. Like any right thinking person, I want to keep my Docker config in\n\u003ccode\u003egit\u003c/code\u003e. That part is easy, create a repo, put your \u003ccode\u003edocker-compose.yml\u003c/code\u003e in it,\nand away you go. But what about other config files? zigbee2mqtt requires a\n\u003ccode\u003econfiguration.yaml\u003c/code\u003e file. I want to version control it too, but in order to\ndo so it has to live in the repo. So how do you supply it to the container so\nzigbee2mqtt can read and write it?\u003c/p\u003e\n\u003cp\u003eThis is the git repo structure I would like. We can then add new directories\nas we add services keeping everything nicely organised.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e.\n├── docker-compose.yml\n└── zigbee2mqtt\n    └── configuration.yaml\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eMy first thought, symlink it. This works, but when you setup the containers on\na new host you\u0026rsquo;re going to have to remember to run the requisite \u003ccode\u003eln -s\u003c/code\u003e\nsteps. That is another thing to remember, and another thing to document.\u003c/p\u003e\n\u003cp\u003eInstead we can use some Docker magic.\u003c/p\u003e\n\u003cp\u003eOn the server I already provide a place for containers to put their data under\n\u003ccode\u003e/opt/appdata/\u0026lt;service\u0026gt;\u003c/code\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e  zigbee2mqtt:\n    volumes:\n      - /opt/appdata/zigbee2mqtt:/app/data\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ezigbee2mqtt can read and write to \u003ccode\u003e/app/data\u003c/code\u003e inside the running container and\nthe files are put in \u003ccode\u003e/opt/appdata/zigbee2mqtt/\u003c/code\u003e on the host system.\u003c/p\u003e\n\u003cp\u003eThe magic comes when we \u003ca href=\"https://docs.docker.com/engine/storage/bind-mounts/\"\u003ebind mount\u003c/a\u003e the config file from the local git repo\ndirectly into the existing container volume.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-diff\" data-lang=\"diff\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  zigbee2mqtt:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    volumes:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      - /opt/appdata/zigbee2mqtt:/app/data\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+     - ./zigbee2mqtt/configuration.yaml:/app/data/configuration.yaml:rw\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(That \u003ccode\u003e:rw\u003c/code\u003e part at the end gives read/write permissions).\u003c/p\u003e\n\u003cp\u003eNow everything can stay in the git repo ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI very much enjoyed Bong Joon Ho\u0026rsquo;s \u003ca href=\"https://www.themoviedb.org/movie/696506-mickey-17\"\u003eMickey 17\u003c/a\u003e. Recommended.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOne of my car tyres has a slow puncture.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fly.io/phoenix-files/make-your-liveview-feel-faster/\"\u003e\u0026ldquo;LiveView feels faster with a delayed loading indicator\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn less than 5 minutes I made the change and deployed my app. I now have a\nLiveView page that feels so much more responsive! Let’s look at how to add\nthis to an existing app.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAlways interesting how small UX tweaks can affect the \u003cem\u003eperceived\u003c/em\u003e performance\neven if nothing has actually gotten faster.\u003c/p\u003e",
      "date_published": "2025-03-16T00:00:00+00:00",
      "date_modified": "2025-03-16T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/193-pasta-machine/",
      "url": "https://elver.me/weeknotes/193-pasta-machine/",
      "title": "Weeknotes 193: Pasta machine",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://daringfireball.net/linked/2025/03/03/keith-web-on-mobile\"\u003eJeremy Keith on the Web on Mobile\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThere are mobile web proponents who are in denial about this state of\naffairs, who seek to place the blame at Apple’s feet for the fact that\nWebKit is the only rendering engine available on iOS. But WebKit’s\nlimitations have nothing to do with the reasons so many websites suck when\nexperienced on mobile devices. The mobile web sucks just as bad on Android.\nApple’s WebKit-only rule on iOS is just a useful scapegoat for the fact that\nmost websites, as experienced on phones, are designed and engineered to\nsuck.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eFacts.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/qdm12/gluetun\"\u003egluetun\u003c/a\u003e \u0026ndash; this will come in handy.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eVPN client in a thin Docker container for multiple VPN providers, written in\nGo, and using OpenVPN or Wireguard, DNS over TLS, with a few proxy servers\nbuilt-in.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen we bought our new house we decided to get the kind of insurance policies\nwhich typically go along with such a purchase. This week I had need to talk to\na GP (nothing to worry about!) and I remembered that we had the ability to\ntalk to a private GP thrown-in. Like any right thinking person I\u0026rsquo;m a supporter\nof the NHS but getting this appointment was way easier than it would\u0026rsquo;ve been\nthrough my regular GP, and my issue was addressed within 15 minutes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://antirez.com/news/145\"\u003eWe are destroying software\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eYup.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFor Christmas I was bought a pasta making course, and this week we attended.\nAs my friend said \u0026ldquo;What a great skill to use 2 more times\u0026rdquo; \u0026ndash; true, but I was\nstill looking at pasta machines online before we left the venue 😆\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn an act of further procrastination (yawn!) I briefly turned direction\ntowards Home Automation this week by plugging in the Zigbee Coordinator I\npurchased some months ago. It’s nifty in that you can power it via USB or PoE\nand communicate with it via USB, Ethernet, or WiFi. I will always chose\nEthernet and PoE if given the option as it rules out a whole raft of things\nthat can go wrong with WiFi, and this time was no different.\u003c/p\u003e\n\u003cp\u003eUnfortunately I don\u0026rsquo;t have any fancy PoE-capable network equipment at the new\nhouse (yet!), which nearly turned into more purchases, but luckily I do own a\nPoE injector which I used to get it turned on and connected to the network.\u003c/p\u003e\n\u003cp\u003eThe web UI for the coordinator is very nice and looks functional \u0026ndash; you can\napparently flash the firmware from it but I\u0026rsquo;m yet to try that. The next step\nwill be to get some accompanying software up and running with our old friend\nDocker.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://make3.co/work/woemeter\"\u003eLumon Industries WoeMeter\u003c/a\u003e \u0026ndash; I\u0026rsquo;ve not seen \u003ca href=\"https://www.themoviedb.org/tv/95396-severance?language=en-GB\"\u003eSeverance\u003c/a\u003e, but this is a cool\nwalk-through of a prop made for the show.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur house is one of those \u0026ldquo;one socket in each room\u0026rdquo; type places. For a while\nI\u0026rsquo;ve been thinking about getting some sort of desktop power strip, and with\nthe monkeying about I\u0026rsquo;ve been doing with electronics the time came.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.amazon.co.uk/dp/B0DG5LK69Y\"\u003eThis nifty gadget\u003c/a\u003e looks pretty neat clamped to my desk and has USB-C power\ndelivery and USB-A ports too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt was my birthday this week. Meh.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://daringfireball.net/linked/2025/03/03/keith-web-on-mobile\"\u003eJeremy Keith on the Web on Mobile\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThere are mobile web proponents who are in denial about this state of\naffairs, who seek to place the blame at Apple’s feet for the fact that\nWebKit is the only rendering engine available on iOS. But WebKit’s\nlimitations have nothing to do with the reasons so many websites suck when\nexperienced on mobile devices. The mobile web sucks just as bad on Android.\nApple’s WebKit-only rule on iOS is just a useful scapegoat for the fact that\nmost websites, as experienced on phones, are designed and engineered to\nsuck.\u003c/p\u003e",
      "date_published": "2025-03-09T00:00:00+00:00",
      "date_modified": "2025-03-09T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/192-birds-are-tweeting/",
      "url": "https://elver.me/weeknotes/192-birds-are-tweeting/",
      "title": "Weeknotes 192: Birds are tweeting",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eBirds are tweeting. I\u0026rsquo;m not waking up in the dark. It must be spring.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn order to remove Twitter references from my blog (because of obvious\nreasons) I needed to install Ruby 2.7 (I know, I know, it’s very old) so I\ncould build the site using Middleman. I was expecting this to be an unpleasant\nexperience, but it installed very quickly and easily. Sometimes software does\nwork.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome \u003ca href=\"https://basicappleguy.com/basicappleblog/ultramarine-haze\"\u003elovely new gradient wallpapers\u003c/a\u003e from the Basic Apple Guy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/191-5-coupon/#:~:text=I%20plan%20on%20trying%20out%20some%20of%20these%20changes%20next%20week\"\u003eunreliable smart lock problem\u003c/a\u003e might be solved. I won\u0026rsquo;t know for real for\na few weeks, but it\u0026rsquo;s looking very promising. I only made a single\nconfiguration change in the end. The WiFi channel was set to \u0026ldquo;auto\u0026rdquo; and I\nchanged it to always be 11 (11 was as far away from the crowded channels as\npossible).\u003c/p\u003e\n\u003cp\u003eIn the UniFi app, for each device, there is an indicator that shows what the\n\u0026ldquo;WiFi Experience\u0026rdquo; is, expressed as a stacked bar chart. This bar used to be\nmulti-coloured, each colour representing a disconnect or DNS issue, or other\nWiFi issue of which their are many. The bar is now solid green indicating a\nWIN.\u003c/p\u003e\n\u003cp\u003eThe messages being logged every minute or so are also gone and have been\nreplaced with a single disconnect and reconnect message once a day which to me\nlooks like normal behaviour for this device.\u003c/p\u003e\n\u003cp\u003eWhilst in the UniFi app I took the opportunity to update the firmware on all\nnetwork devices, so that should be all the fiddling I do for now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe more I learn about soldering the clearer it becomes that to remove\ncomponents you often need to \u003cem\u003eadd\u003c/em\u003e before taking away. You might add flux, and\nthen add more solder, and then more flux to heat and remove. This feels like\nthe opposite of what you should do but it really works.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/191-5-coupon/#:~:text=I%20really%20hope%20it%20works\"\u003enew screen arrived\u003c/a\u003e and after some brief procrastination I tried it out,\nthis time on three separate Game Boy Colors. It doesn\u0026rsquo;t work 😩\u003c/p\u003e\n\u003cp\u003eWhen AliExpress seller sent the new screen they did not send a whole kit\n(which comprises screen, ribbon cable, and controller board). Given that the\nneither screen works on three different Game Boy Colors I\u0026rsquo;m suspicious that\nthe screen part is to blame, and it seems more likely that the controller\nboard is actually the cause of my woes. I checked the ribbon cable for\ncontinuity across its pins and visually inspected it, but it appears fine, so\nI don\u0026rsquo;t think it\u0026rsquo;s that.\u003c/p\u003e\n\u003cp\u003eThe seller agreed to send these parts if I paid postage (£3), which I thought\nwas fair enough at this point. I imagine they get a fair amount of people\ntrying it on because electrical components are fairly easy to break.\u003c/p\u003e\n\u003cp\u003eSo now we wait. Again. If it doesn\u0026rsquo;t work after this I might just throw\neverything in the bin.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter a long hiatus I\u0026rsquo;ve been using eBay \u003cem\u003ea lot\u003c/em\u003e. Whilst I like what the\nplatform affords, buying niche products from the comfort of my home, the\nactual website is pants. A prime example of what happens when there is no\ncompetition. Basic things like pages taking an age to load, and clicking on\nbuttons and links where nothing happens. And it’s not better than 20 years\nago, and dare I say worse than then.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMore Game Boys were delivered \u0026ndash; this time of the DS Lite variety. I have\nplans. Don\u0026rsquo;t judge me; I can do what I want.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/unkyulee/micro-journal\"\u003eMicro Journal: Distraction-Free Writing Device: WriterDeck\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI aimed to create a specialized writing device, focusing on the tactile\nexperience of mechanical keyboards. This device would be portable, with a\ncompact form factor, designed to enhance the writing process in a focused\nenvironment. The goal was to provide a distraction-free writing experience,\nallowing users to immerse themselves fully in their creative work.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://uprn.uk/\"\u003eUnique Property Reference Number\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis website allows you to look up all the publicly available data for any\nUPRN in Great Britain. Simply put the UPRN into the search box to see all\nthe information we have for that UPRN. Alternatively, search for a postcode\nto see all the UPRNs in the immediate vicinity.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e(You will \u003cem\u003ereally\u003c/em\u003e need your Ad Blocker for this website).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA friend told me about the \u003ca href=\"https://en.m.wikipedia.org/wiki/Game_Boy_Player\"\u003eNintendo Game Boy Player\u003c/a\u003e which allows you to play\nGame Boy games on the GameCube. The GameCube completely passed me by so I\nhadn\u0026rsquo;t heard of this before. Naturally, I now need one.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAt the weekend we visited to the West Country to see various friends (\u003ca href=\"/weeknotes/191-5-coupon/#:~:text=of%20course%2C%20to-,get%20my%20eyes%20tested,-.%20The%20prospect%20of\"\u003emy eyes\nare in good shape, thanks\u003c/a\u003e) hence the lateness of this post. The journey was\nremarkably stress-free, for which we can partly thank the glorious weather we\nhad from Thursday onwards.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s always a bit odd visiting various groups of people. For me this is a trip\naway, for them it\u0026rsquo;s a few hours in between their normal daily activities, so I\ncan be tricky to schedule and know if you\u0026rsquo;re outstaying your welcome. Still,\nit was nice to see everyone.\u003c/p\u003e\n\u003cp\u003eWe treated ourselves to a meal at our favourite restaurant whilst near\nBristol. The food scene in Bristol is still king imo, and I often miss it.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eBirds are tweeting. I\u0026rsquo;m not waking up in the dark. It must be spring.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn order to remove Twitter references from my blog (because of obvious\nreasons) I needed to install Ruby 2.7 (I know, I know, it’s very old) so I\ncould build the site using Middleman. I was expecting this to be an unpleasant\nexperience, but it installed very quickly and easily. Sometimes software does\nwork.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome \u003ca href=\"https://basicappleguy.com/basicappleblog/ultramarine-haze\"\u003elovely new gradient wallpapers\u003c/a\u003e from the Basic Apple Guy.\u003c/p\u003e",
      "date_published": "2025-03-02T00:00:00+00:00",
      "date_modified": "2025-03-02T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/191-5-coupon/",
      "url": "https://elver.me/weeknotes/191-5-coupon/",
      "title": "Weeknotes 191: 5% coupon",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I had a brand new experience. I nearly forgot to have dinner. This\nhas never happened in all my life.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGiven that the UK government is making ludicrous demands to have access to all\nof Apple\u0026rsquo;s customer\u0026rsquo;s data in the whole of world, I decided to turn on\n\u003ca href=\"https://support.apple.com/en-us/108756\"\u003eAdvanced Data Protection\u003c/a\u003e in iOS just to spite them. Fight the power!\u003c/p\u003e\n\u003cp\u003eUnfortunately, that didn\u0026rsquo;t last long as Apple have now turned off the feature\nfor new users of it. How long I will be able to keep hold of the feature\nremains to be seen.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/190-no-worky/#:~:text=power%20regulation%20board\"\u003epower regulation board I thought I\u0026rsquo;d identified last week\u003c/a\u003e as being the\ncause of the final GBC refusing to start arrived in the post this week. I\neagerly removed the existing broken board and started to solder the \u0026ldquo;new\u0026rdquo; one\nin it\u0026rsquo;s place when I noticed that one of the components on the board had a leg\nmissing 🙀 And it also had solder on it\u0026rsquo;s pad which made it look like it should\ndefinitely be connected. I ploughed ahead anyway, because I thought it better\nto test it in-place first before doing anything more drastic. It worked!\nIt turned on, and it made the famous Game Boy ding sound. I turned it off,\nconnected the screen, and it worked again. So hopefully that will stay\nworking. Win ✅.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe seller of the new AMOLED screen agreed \u003ca href=\"/weeknotes/190-no-worky/#:~:text=The%20new%20AMOLED%20screen%20and%20shell%20arrived\"\u003ethat it is probably faulty\u003c/a\u003e. I was\nnot looking forward to having this discussion with a seller in China fearing a\ndifficult lost in translation situation over a protracted timescale due to\ntime differences, but it was actually quite pleasant. After sending a photo\nand some videos they said they would send a replacement. Not sure when it will\nget here but I really hope it works 🤞\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAn eBay seller sent me a 5% coupon code for a job lot of Game Boys I was\nwatching and that is all it took for me to buy them. Why have you bought move\nGame Boys when you haven\u0026rsquo;t fixed the current set of Game Boys Jordan? That\u0026rsquo;s a\ngood question, and well argued, but hear me out \u0026ndash; I am \u003cem\u003eweak\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNext weekend we will be visiting the old country to visit some friends, and of\ncourse, to get my eyes tested. The prospect of several days in a Premier Inn\nis not filling me with joy, but it will hopefully be nice to see people.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn order to test Game Boys without having to reassemble them each time, and in\nlieu of a proper bench power supply, I bought some AA battery holders. They\nhave crocodile clips attached allowing easy connection to PCB battery\nterminals. They were also cheap and as a result they started falling apart\nfairly quickly and the wires kept becoming disconnected from the main unit.\u003c/p\u003e\n\u003cp\u003eThat\u0026rsquo;s ok, I fix things now! But first\u0026hellip;I break them a bit more. During the\ndisassembly to change the wires over I tore the pads that said wires need to\nconnect to from the tiny PCB. A good excuse to use my new grinding pen. I\nground the PCB back to expose new copper and soldered to that. I was pleased\nwith the result and the battery holders are now back in action.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.indiegogo.com/projects/pomera-full-suite-typewriter-for-focused-writing#/faq\"\u003ePomera - Full-Suite Typewriter For Focused Writing\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis device is giving me strong \u003ca href=\"https://en.wikipedia.org/wiki/Psion_Series_5\"\u003ePsion\u003c/a\u003e vibes but with much less\nfunctionality.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf I never see the sentence \u0026ldquo;Front Door has (dis|re)connected to Wi-Fi\u0026rdquo; it\nwill be too soon. My smart lock has served me well since it was installed a\nyear ago, with one issue. Occasionally it loses the plot and spirals into a\ndisconnect/reconnect meltdown which sometimes goes on for literally weeks.\nThen it\u0026rsquo;s fine for months.\u003c/p\u003e\n\u003cp\u003eThere is no way to turn off \u003cem\u003ejust\u003c/em\u003e those notifications either, you have to\nturn off \u003cem\u003eall\u003c/em\u003e the notifications which would mean not knowing when people\nenter the property.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t know what is causing this. I suspect whatever is WiFi chip it has is\njust pants (a technical term). I\u0026rsquo;ve done some research and there are a few\nthings which I can try: 1) Setting a dedicated WiFi channel instead of letting\nit auto-select; 2) Moving it to its own network with nothing else; and 3)\nChanging the WiFi channel to a less congested frequency.\u003c/p\u003e\n\u003cp\u003eAll seem reasonable to try, but administering this remotely, of course, is\nrisky. If I make a change to the network settings and it decides to not do the\nreconnecting part, then bad times. I plan on trying out some of these changes\nnext week so I can be on-site next weekend if required.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://developer.1password.com/docs/web/compatible-website-design/\"\u003e\u0026ldquo;You shouldn\u0026rsquo;t have to do anything special to support 1Password on your\nwebsite, as long as you develop your pages according to best practices\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSometimes I think the job market is improving, but then I keep reading things\nthat are very worrying. It\u0026rsquo;s true that I always feel unemployable and yet I\nhave worked for the last 10 years, but the threat of AI and the state of the\neconomy are not giving me good vibes.\u003c/p\u003e\n\u003cp\u003e(For the record, I don\u0026rsquo;t think AI will replace programmers, but a lot of\nbusiness people do which is a problem in the shorter term).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou\u0026rsquo;ll be relieved to know that the \u003ca href=\"/weeknotes/190-no-worky/#:~:text=lifetime%20warranty%20socks\"\u003enew socks were delivered\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I had a brand new experience. I nearly forgot to have dinner. This\nhas never happened in all my life.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGiven that the UK government is making ludicrous demands to have access to all\nof Apple\u0026rsquo;s customer\u0026rsquo;s data in the whole of world, I decided to turn on\n\u003ca href=\"https://support.apple.com/en-us/108756\"\u003eAdvanced Data Protection\u003c/a\u003e in iOS just to spite them. Fight the power!\u003c/p\u003e\n\u003cp\u003eUnfortunately, that didn\u0026rsquo;t last long as Apple have now turned off the feature\nfor new users of it. How long I will be able to keep hold of the feature\nremains to be seen.\u003c/p\u003e",
      "date_published": "2025-02-23T00:00:00+00:00",
      "date_modified": "2025-02-23T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/190-no-worky/",
      "url": "https://elver.me/weeknotes/190-no-worky/",
      "title": "Weeknotes 190: No worky",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAfter ignoring it for a couple of weeks I tested my keyboard and it no worky.\nI cannot lie, I feel a bit dejected by this as I felt I\u0026rsquo;d done a fairly good\njob for my \u003ca href=\"/weeknotes/184-keyboard-kaput/#:~:text=moving%20onto%20keyboard%202%20instead\"\u003e\u003cdel\u003efirst\u003c/del\u003e second time\u003c/a\u003e at soldering a keyboard. But apparently\nnot. I can\u0026rsquo;t face troubleshooting this at the moment.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBoth awful in their own ways, sure. But this is undeniably funny.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOpenAI CEO Sam Altman responds to Elon Musk\u0026rsquo;s nonprofit buyout offer: \u0026rsquo;no\nthank you but we will buy twitter for $9.74 billion if you want.'\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://usetapestry.com/\"\u003eTapestry from IconFactory\u003c/a\u003e is interesting. I really like the idea, but I\u0026rsquo;m\nnot sure it works for me. I couldn\u0026rsquo;t work out what was read and what was new.\nI will watch with interest though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThere was a hole in my lifetime warranty socks so I thought why not make a\nclaim. Am I running out of things to do? You be the judge.\u003c/p\u003e\n\u003cp\u003eThe manufacturer (\u003ca href=\"https://darntough.uk/\"\u003eDarn Tough\u003c/a\u003e since you ask) required that I send a photo of\nthe socks cut in half. I understand why, but doing so when the socks are fine\notherwise didn\u0026rsquo;t feel great. They will make good dusters.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome Game Boy wins and losses.\u003c/p\u003e\n\u003cp\u003eThe contrast wheel on a Game Boy Advance I acquired was visibly very rusty so\nI decided to replace it with a new one. I desoldered it, but unfortunately\nwhilst doing so the pads came off the board too (the pads are the gold bits\nthat components are soldered to). This means I have nothing to solder the\nreplacement component on to \u0026ndash; bad times. So a trace repair will be required.\nThis is a bit above my pay grade at the moment (and I need a couple of tools).\nStill, it\u0026rsquo;s a learning opportunity.\u003c/p\u003e\n\u003cp\u003e❌ Lose.\u003c/p\u003e\n\u003cp\u003eTwo out of three Game Boy Colors I have are now working. One was already\nworking so I can\u0026rsquo;t take credit for that, but another had a dodgy power switch\nwhich I cleaned out with Isopropyl Alcohol (99.9% pure) and it started\nworking. That one was relatively easy.\u003c/p\u003e\n\u003cp\u003e✅ Win.\u003c/p\u003e\n\u003cp\u003eThe new \u003ca href=\"https://en.wikipedia.org/wiki/AMOLED\"\u003eAMOLED\u003c/a\u003e screen and shell arrived for one of the Game Boy Colors. The\ninstall was fairly straightforward. You only need to solder two joints to hook\nup the power. And yet, it does not work. I\u0026rsquo;ve tried it on two different GBCs\nnow and the same result, so I\u0026rsquo;m wondering if it\u0026rsquo;s just faulty. Disappointing.\u003c/p\u003e\n\u003cp\u003e❌ Lose.\u003c/p\u003e\n\u003cp\u003eTaking another break from breaking things, I moved back to the remaining\nnon-working GBC. There were very small signs of life in this one. When you\nturned it on you would only get a quiet noise from the speaker. I cleaned the\npower switch and changed over the SMD capacitors, which I\u0026rsquo;ve not done before\nso that\u0026rsquo;s a win. I also changed the DC jack just because. Nothing.\u003c/p\u003e\n\u003cp\u003eGiven my lack of \u003cem\u003eactual\u003c/em\u003e electronics knowledge I thought I\u0026rsquo;d give A.I. a\nchance to guide me and with Claude\u0026rsquo;s help I managed to work out that the GBC\nis not getting the 5v it requires, and that something is wrong with the \u0026ldquo;power\nregulation board\u0026rdquo;. Whatever that is. You can\u0026rsquo;t typically buy a replacement for\nthese, but I managed to score one second-hand on eBay for a few quid. I\u0026rsquo;m\ngoing to try that and see what happens and if it springs to life go back and\ninspect the broken one more closely.\u003c/p\u003e\n\u003cp\u003e✅ Win.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jsomers.net/blog/speed-matters\"\u003eSpeed matters: Why working quickly is more important than it seems\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis is true of any to-do list that gets worked off too slowly. A malaise\ncreeps into it. You keep adding items that you never cross off. If that\nhappens enough, you might one day stop putting stuff onto the list.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFinally, something I fixed. We use an \u003ca href=\"https://support.soundcore.com/s/product/a085g000000Nly7AAC/soundcore-2\"\u003eAnker Soundcore 2 portable Bluetooth\nspeaker\u003c/a\u003e for bathroom tunes that has been unreliable for a while. It still\nworks great when it\u0026rsquo;s on. The issue is getting it to turn on. The power button\nwas not working.\u003c/p\u003e\n\u003cp\u003eSo, with ideas above my station (I\u0026rsquo;ve been watching a lot of YouTube fix\nvideos), I decided to attempt a repair. I\u0026rsquo;d opened the speaker a few weeks\nprevious after following a teardown video but I didn\u0026rsquo;t get very far with it\nother than knowing something was up with the button. This week I revisited and\nI noticed the button switch didn\u0026rsquo;t work when it was outside of the speaker\nhousing. On a whim I swapped out one of the other buttons into the power\nbutton position to see what would happen. It worked 🎉\u003c/p\u003e\n\u003cp\u003eDefinitely a knackered switch. I may purchase a replacement so all the buttons\ncan be working. Or I may not.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRecently I noticed that I\u0026rsquo;ve not checked my Mastodon or Bluesky accounts in a\nwhile. Now I know this is because I\u0026rsquo;m looking at Reddit instead, but I still\nthought it was interesting how quickly I fell out of the habit.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAfter ignoring it for a couple of weeks I tested my keyboard and it no worky.\nI cannot lie, I feel a bit dejected by this as I felt I\u0026rsquo;d done a fairly good\njob for my \u003ca href=\"/weeknotes/184-keyboard-kaput/#:~:text=moving%20onto%20keyboard%202%20instead\"\u003e\u003cdel\u003efirst\u003c/del\u003e second time\u003c/a\u003e at soldering a keyboard. But apparently\nnot. I can\u0026rsquo;t face troubleshooting this at the moment.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBoth awful in their own ways, sure. But this is undeniably funny.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOpenAI CEO Sam Altman responds to Elon Musk\u0026rsquo;s nonprofit buyout offer: \u0026rsquo;no\nthank you but we will buy twitter for $9.74 billion if you want.'\u003c/p\u003e",
      "date_published": "2025-02-16T00:00:00+00:00",
      "date_modified": "2025-02-16T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/189-voodoo-ape/",
      "url": "https://elver.me/weeknotes/189-voodoo-ape/",
      "title": "Weeknotes 189: Voodoo Ape",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I realised that \u003ca href=\"https://open.spotify.com/track/7H0MOWplwc6gf2AD1vTSYi?si=e15cb8b1435645e1\"\u003eVoodoo People\u003c/a\u003e by The Prodigy samples \u003ca href=\"https://open.spotify.com/track/0hUit24g1EIoATdKYWUiRj?si=474436c5a1c74348\"\u003eVery Ape\u003c/a\u003e by\nNirvana 🤯\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=oX0IgxDOlCk\"\u003eiPhone 16 Pro SSD Upgrade: From 128GB to 1TB\u003c/a\u003e \u0026ndash; This video was really\ninteresting to me. The part where they get out the CNC and start removing the\nold chip is wild. Worth a watch.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy old computer was serviced by the local Apple Store and seems to be fixed\nand with 100% healthy battery to boot. Credit to them, the service was good\nthroughout. Another thing ticked off my list.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEvery time I look at my pension retirement seems further away. Clearly I\u0026rsquo;m not\nanywhere close to retiring (I don\u0026rsquo;t actually like the idea of \u0026ldquo;retirement\u0026rdquo;\nbecause what would I do all day) but the time for thinking about retirement is\nnot a year before retiring, so here we are.\u003c/p\u003e\n\u003cp\u003eGiven that a lot of people are unable to do much about funding their\nretirement it\u0026rsquo;s good that I am a) able to; and b) doing so. Still, it can be\noverwhelming both in the amount you supposedly need to live comfortably, and\nin the intricacies of \u0026ldquo;investing\u0026rdquo;. When it comes to finances, unless you are a\ngazillionaire, financial advisors don\u0026rsquo;t really want to know you, so you\u0026rsquo;re\nleft with Doing Your Own Research ™. Which is terrifying, but also empowering\n(That empowerment part will entirely rely on what has happened in 20+ years\nfrom now \u0026ndash; stay tuned).\u003c/p\u003e\n\u003cp\u003eThis is all a long winded way of saying that I\u0026rsquo;ve been researching pensions\nand ISAs and what to put where. And importantly, how. I do feel that I\u0026rsquo;ve\ngained a better understanding of the whole area.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://furbo.org/2025/02/07/making-software-fun/\"\u003eMaking Software Fun\u003c/a\u003e \u0026ndash; There should be a lot more of this craft in computer\nprogramming.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eApple Notes is actually quite good. I have avoided it for years. At the\nbeginning because it wasn\u0026rsquo;t very good. And then it got better, but still not\ngood. It’s still not \u003cem\u003ethat\u003c/em\u003e good. The formatting feels random. Sometimes you\ncan\u0026rsquo;t unindent list items for no good reason.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s good because it\u0026rsquo;s \u003cem\u003ethere\u003c/em\u003e. It\u0026rsquo;s on my phone, and it\u0026rsquo;s on my laptop. And\nthe sync works. I still reach for other tools when I need more structure\n(Notion at the moment, unfortunately) but for making sure I get the\ninformation down. It\u0026rsquo;s always there.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMechanical keyboard sounds without the keyboard \u0026ndash; \u003ca href=\"https://tryklack.com/\"\u003eKlack\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSatisfying sound with every keystroke\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI stopped working on the \u003ca href=\"/weeknotes/188-storage-solutions/#:~:text=I%20started%20at%20the%20beginning%20with%20the%20first%20DMG%20Game%20Boy\"\u003efirst Game Boy\u003c/a\u003e I was fixing up because the last\nthing I had in mind for it was to try and fix the case colour. The front of\nthe case is a bit yellowed and doesn\u0026rsquo;t match the back which is a lighter shade\ncloser to that of the original grey. This can be achieved with a process \u003ca href=\"https://www.youtube.com/results?search_query=retrobrighting\"\u003emany\nhave experimented with\u003c/a\u003e called Retrobrighting. There are a few methods, but\nthe most popular works by submerging your yellowed case plastics into a bath\nof 11.99% Hydrogen Peroxide and shining UV lights on it for an indeterminate\namount of time.\u003c/p\u003e\n\u003cp\u003eThe first Game Boy wasn\u0026rsquo;t \u003cem\u003ethat\u003c/em\u003e yellow though, so it didn\u0026rsquo;t seem like the\ncorrect candidate to experiment on. So, with the threat of chemical burns and\npotential eye damage (and making it onto a list for weird online purchases) I\ndecided to give it a whirl with a much worse example of yellowing.\u003c/p\u003e\n\u003cp\u003eI got these two in a bundle on Vinted for the relatively bargain price of\n£55.59.\u003c/p\u003e\n\u003cp\u003eBefore\n\u003cimg src=\"/images/gameboys-before.jpg\" alt=\"Two Game Boy consoles before refurbishment\"\u003e\u003c/p\u003e\n\u003cp\u003eI only tried the process on the (can you guess?) left one. The right was in\nfairly good condition generally and only needed cleaning inside and out.\u003c/p\u003e\n\u003cp\u003eAfter\n\u003cimg src=\"/images/gameboys-after.jpg\" alt=\"Two Game Boy consoles after refurbishment\"\u003e\u003c/p\u003e\n\u003cp\u003eThese both have new glass screen lenses but everything else is original.\nPretty happy with how they came out.\u003c/p\u003e\n\u003cp\u003eNext I\u0026rsquo;ll be returning to the original now I have a bit of experience of how\nthe process works and what to expect to try and brighten it up a bit whilst I\nwait for my latest AliExpress order to arrive\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.visualmode.dev/a-decade-of-tils\"\u003eA Decade of TILs\u003c/a\u003e \u0026ndash; Josh\u0026rsquo;s TIL blog has inspired me (\u003ca href=\"/weeknotes/5-professional-bash-programmer/#:~:text=working%20on%20getting%20a%20TIL%20site%20up%20and%20running\"\u003enot enough\u003c/a\u003e \u003ca href=\"/weeknotes/180-the-secret-to-air-travel/#:~:text=more%20of%20a%20TIL%20type%20post\"\u003eto copy\nhim, yet\u003c/a\u003e) but to post these weeknotes regularly. A lot of what he says rings\ntrue as to why I\u0026rsquo;ve managed to keep up myself.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I realised that \u003ca href=\"https://open.spotify.com/track/7H0MOWplwc6gf2AD1vTSYi?si=e15cb8b1435645e1\"\u003eVoodoo People\u003c/a\u003e by The Prodigy samples \u003ca href=\"https://open.spotify.com/track/0hUit24g1EIoATdKYWUiRj?si=474436c5a1c74348\"\u003eVery Ape\u003c/a\u003e by\nNirvana 🤯\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=oX0IgxDOlCk\"\u003eiPhone 16 Pro SSD Upgrade: From 128GB to 1TB\u003c/a\u003e \u0026ndash; This video was really\ninteresting to me. The part where they get out the CNC and start removing the\nold chip is wild. Worth a watch.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy old computer was serviced by the local Apple Store and seems to be fixed\nand with 100% healthy battery to boot. Credit to them, the service was good\nthroughout. Another thing ticked off my list.\u003c/p\u003e",
      "date_published": "2025-02-09T00:00:00+00:00",
      "date_modified": "2025-02-09T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/188-storage-solutions/",
      "url": "https://elver.me/weeknotes/188-storage-solutions/",
      "title": "Weeknotes 188: Storage solutions",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou can trigger macOS \u003ca href=\"https://en.wikipedia.org/wiki/Shortcuts_(Apple)\"\u003eShortcuts\u003c/a\u003e \u003ca href=\"https://support.apple.com/en-gb/guide/shortcuts-mac/apd163eb9f95/mac#apd446fbe7fa\"\u003efrom the menubar\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIf you enable the option to \u0026ldquo;Pin in Menu Bar\u0026rdquo; for a Shortcut a clickable\nmenubar icon will appear which shows a menu from which you can execute the\nShortcut. It\u0026rsquo;s a shame that you don\u0026rsquo;t seem to be able to have an icon \u003cem\u003eper\nShortcut\u003c/em\u003e, which would make this a lot more appealing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNew pursuits demand new storage solutions. I have lots of bits and pieces that\nneed to be stored somewhere now. Like most things lately, it seems, this is\njust an excuse to exercise my capitalistic tendencies. B\u0026amp;M is your friend for\nsuch purchases.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHow will I find newly stored stuff?\u003c/p\u003e\n\u003cp\u003eAm I cool and do I own a label printer? Yes and YES. I do.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I was able to continue my Corne keyboard build now I had all \u003ca href=\"/weeknotes/186-approval-granted/#:~:text=parts%20that%20were%20missing%20for%20my%20keyboard%20project%20have%20arrived\"\u003ethe\nparts I needed\u003c/a\u003e. Although most of the delay was waiting for packages to\narrive, regrettably I found that I was procrastinating over starting the build\nagain since I\u0026rsquo;d taken a break from soldering and I didn\u0026rsquo;t want to fuck it.\u003c/p\u003e\n\u003cp\u003eWell, I fucked it.\u003c/p\u003e\n\u003cp\u003eThe next step was to solder the new sockets I bought to the PCB. I was\nexpecting this to be easy. You push the legs through holes in the PCB and\nsolder them to the board. When I did this it was a very tight fit such that\nthe socket stayed in place whilst I soldered. Or so I thought. I soldered all\nthe pins and then realised that the socket \u003cem\u003ehad\u003c/em\u003e slipped slightly. This is a\nproblem because the sockets \u003cem\u003eneed\u003c/em\u003e to be flush to accommodate the other\ncomponents on the board. Bugger.\u003c/p\u003e\n\u003cp\u003eI managed to remove the wonky sockets after a lot of trial and error, but it\ntook ages. And there\u0026rsquo;s a good chance I\u0026rsquo;ve damaged some of the traces on the\nboards too (it\u0026rsquo;s fairly easy to do if you scratch or scrape with a metal\nobject like tweezers).\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m trying not to be too hard on myself because I have learnt how you’re meant\nto do it now (you’re supposed to solder one leg, check for flushness, then\nsolder another leg diagonally across from the first, check flushness again,\nthen solder all the rest - this is what I did after and they are all flush on\nthe board) and I now have the sockets soldered.\u003c/p\u003e\n\u003cp\u003eWhether they\u0026rsquo;ll work or not is another matter. I\u0026rsquo;ve been putting off testing\nthem.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mikeandrianov.github.io/ant-background-job-processing-library\"\u003eIntroducing Ant: a simple background job processing library for Elixir\u003c/a\u003e \u0026ndash;\nit\u0026rsquo;s good to have options.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/180-the-secret-to-air-travel/#:~:text=Still%20haven%E2%80%99t%20set%20up%20the%20new%20computer\"\u003eYou already knew this\u003c/a\u003e, but I am a fool. I \u003cem\u003emade myself\u003c/em\u003e setup this new\ncomputer. How? I dunno. I used Migration Assistant to migrate over using a\nThunderbolt 4 cable and\u0026hellip;it just works. Everything just works. Even my SSH\nand gpg keys worked (with minor permission issues solved by a \u003ccode\u003echmod\u003c/code\u003e).\u003c/p\u003e\n\u003cp\u003eThe main reason I procrastinated over it for so long was that I just assumed\nit wouldn\u0026rsquo;t work. I am too used to computers. I was wrong. However I am yet to\nsetup any dev stuff because I don\u0026rsquo;t want to program computers at the moment.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://elver.me/uses/\"\u003e\u003ccode\u003e/uses\u003c/code\u003e\u003c/a\u003e is updated too.\u003c/p\u003e\n\u003cp\u003eThe screen is absolutely lovely. Size-wise, it feels \u003cem\u003emuch\u003c/em\u003e bigger whilst not\nactually taking up much more space. I swear it sounds better too, through\nAirPods Pro at least.\u003c/p\u003e\n\u003cp\u003eWill I learn? Will. I. Fuck.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWith my new computer setup it meant I could focus on fixing a couple of\nniggles with that old \u003cem\u003eheap\u003c/em\u003e I was using five minutes ago. Namely, the fact\nthat \u003ca href=\"/weeknotes/154-loathe-to-call-this-a-success/\"\u003eMocha-gate\u003c/a\u003e caused one of the ports to stop working, and also that the\nbattery is not holding the charge it once was.\u003c/p\u003e\n\u003cp\u003eI have AppleCare+, so I booked it into the nearest Apple Store to have it\nlooked at.\u003c/p\u003e\n\u003cp\u003eFor the port issue I thought it would be a case of replacing the USB-C port\n(which I \u003ca href=\"https://www.youtube.com/watch?v=bUd97uoBMBk\"\u003elearnt from a YouTube video\u003c/a\u003e meant replacing both ports as they come\non a single board) but when the technician ran a diagnostic on the computer it\nshowed that the ports are both working, but the battery needed replacing. I\ndon\u0026rsquo;t understand this, but who am I to argue. The fix is apparently to replace\nthe battery at no additional charge (not even an excess) which will hopefully\nfix \u003cem\u003eboth\u003c/em\u003e my issues in one go and cost me nothing. Excellent.\u003c/p\u003e\n\u003cp\u003eThe battery wasn\u0026rsquo;t in stock (which, incidentally, I think is incredible \u0026ndash;\nthis computer is 4 years old, how do you \u003cem\u003enot\u003c/em\u003e have a battery for this\nin-stock?!) so I had to take it back once the stock arrived. It\u0026rsquo;s with Apple\nnow and I should get it back in a week.\u003c/p\u003e\n\u003cp\u003eI was slightly disappointed in a way as I was looking forward to buying \u003ca href=\"https://www.ifixit.com/en-gb/products/macbook-air-13-late-2018-late-2020-usb-c-board\"\u003ethe\npart\u003c/a\u003e \u003ca href=\"https://www.aliexpress.com/item/1005005596121331.html\"\u003eon AliExpress\u003c/a\u003e and \u003ca href=\"https://www.ifixit.com/Guide/MacBook+Air+13-Inch+Late+2020+USB-C+Board+Replacement/142552\"\u003ehaving a go myself\u003c/a\u003e 🤭\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.macrumors.com/2025/01/29/openai-says-deepseek-used-its-models/\"\u003eOpenAI Alleges DeepSeek Used Its Models for AI Training\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe discovery centers around a technique called \u0026ldquo;distillation,\u0026rdquo; where\ndevelopers use outputs from larger AI models to train smaller ones. The\npractice is common in AI development, but OpenAI claims DeepSeek crossed a\nline by using it to build a rival model.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBoo, and I cannot emphasise this enough, \u003cem\u003ehoo\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe desperately need competition in the Ruby web framework space. \u003ca href=\"https://www.mikeperham.com/2025/01/17/sponsoring-hanami/\"\u003eMike Perham\nis sponsoring Hanami\u003c/a\u003e. I\u0026rsquo;m not sure what $12k can do but it\u0026rsquo;s a start and I\nhope I\u0026rsquo;m wrong.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFor those eager for Game Boy updates, I have news 👾👾👾\u003c/p\u003e\n\u003cp\u003eProcrastination took over, as usual. It seems obvious in hindsight that the\nthrill of buying cheap (ish) Game Boys on the Internet is a far easier way to\nobtain dopamine than the actual reality of having to work for it and fix them.\nAll of my projects are of my own devising and yet when it comes to work on\nthem I feel overwhelmed.\u003c/p\u003e\n\u003cp\u003eWhen you\u0026rsquo;ve bought 8 retro consoles and don\u0026rsquo;t possess any of the requisite\nskills to fix them, which one do you start with? Well, I started at the\nbeginning with the first DMG Game Boy I got on eBay.\u003c/p\u003e\n\u003cp\u003eThis console has a few ailments, but it’s not in terrible shape. Nearly all\nthe consoles I\u0026rsquo;ve bought are dirty and disgusting, so that is a given for this\none too, but it also had no sound and the screen was showing vertical lines on\nit where pixels should\u0026rsquo;ve been.\u003c/p\u003e\n\u003cp\u003eI decided to tackle the sound issue first as it felt like it would be easier.\nThere was sound if you plugged in headphones, but not from the speaker. It\nwasn\u0026rsquo;t necessarily a broken speaker though. A common issue that occurs with\nthese is that the headphone port gets corroded such that the console thinks\nthat headphones are always plugged in and that turns off the speaker. However\nthis wasn\u0026rsquo;t it; it \u003cem\u003ewas\u003c/em\u003e a broken speaker 😉 In the process I learnt how to\ncheck the headphone port and speaker for continuity using a multimeter.\nLearning this will make future repairs to other consoles much easier. I\ndesoldered the old speaker and soldered on a new one I\u0026rsquo;d already bought from\nAliExpress.\u003c/p\u003e\n\u003cp\u003eFixed sound ✅\u003c/p\u003e\n\u003cp\u003eThe screen was also a common failure. As these consoles are 30+ years old the\nconnection to the screen becomes degraded. This causes vertical lines on the\nscreen where nothing shows up. If you gently rub a soldering iron along the\nbottom of the screen you can bring the missing screen lines back to life,\nwhich is what I\u0026rsquo;ve done.\u003c/p\u003e\n\u003cp\u003eFixed screen ✅\u003c/p\u003e\n\u003cp\u003eNext up for this console is a good clean, maybe a \u003ca href=\"https://retr0bright.com\"\u003eretr0brite-ing\u003c/a\u003e (to\nde-yellow the plastics), and new screen lens.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOn \u003ca href=\"https://atp.fm/624\"\u003eATP 624\u003c/a\u003e Marco Arment said that Apple have \u0026ldquo;debilitating hubris\u0026rdquo; and I\nthink that is a \u003cem\u003eperfect\u003c/em\u003e description of them.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI attended a retro gaming fair on Sunday. Given my recent interest in the area\nit seemed like I should go along with it being so close. I\u0026rsquo;m glad I went and\nenjoyed myself, but I in and out in an hour.\u003c/p\u003e\n\u003cp\u003eIt was absolutely rammed with people. In retrospect this was partly my fault.\nThe tickets are timed, the idea being that the earlier you get into the event\nthe better pick of the goods on offer you have. I bought tickets for the first\ntime slot, so naturally is was really busy. It was so busy that looking at\nanything became a bit of a task.\u003c/p\u003e\n\u003cp\u003eThere wasn\u0026rsquo;t as much Nintendo Game Boy merchandise as I had imagined there\nmight be. When I think \u0026ldquo;retro\u0026rdquo;, I think \u0026ldquo;Game Boy\u0026rdquo;, but due to the passage of\ntime there are now \u003cem\u003emany\u003c/em\u003e, \u003cem\u003emany\u003c/em\u003e consoles that fit into that bracket\ncompeting for floor space.\u003c/p\u003e\n\u003cp\u003eI had also hoped that there might be parts and supplies for refurbing and\nmodding consoles, but unfortunately there was nothing like that for sale. I\nguess the people selling their wares at the fair are the ones who\u0026rsquo;ve already\ndone the refurbing and modding in order to sell the consoles on.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou can trigger macOS \u003ca href=\"https://en.wikipedia.org/wiki/Shortcuts_(Apple)\"\u003eShortcuts\u003c/a\u003e \u003ca href=\"https://support.apple.com/en-gb/guide/shortcuts-mac/apd163eb9f95/mac#apd446fbe7fa\"\u003efrom the menubar\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIf you enable the option to \u0026ldquo;Pin in Menu Bar\u0026rdquo; for a Shortcut a clickable\nmenubar icon will appear which shows a menu from which you can execute the\nShortcut. It\u0026rsquo;s a shame that you don\u0026rsquo;t seem to be able to have an icon \u003cem\u003eper\nShortcut\u003c/em\u003e, which would make this a lot more appealing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNew pursuits demand new storage solutions. I have lots of bits and pieces that\nneed to be stored somewhere now. Like most things lately, it seems, this is\njust an excuse to exercise my capitalistic tendencies. B\u0026amp;M is your friend for\nsuch purchases.\u003c/p\u003e",
      "date_published": "2025-02-02T00:00:00+00:00",
      "date_modified": "2025-02-02T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/187-oops-i-did-it-again/",
      "url": "https://elver.me/weeknotes/187-oops-i-did-it-again/",
      "title": "Weeknotes 187: Oops, I did it again",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://open.spotify.com/track/3vHqlBYlLgog7dOJn8K0Tu?si=cGh8AENCQOGXZCIipV72kg\"\u003eJarvis is still correct\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s a tonic to meet up with friends. You should do that, if you can.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA friend told me about \u003ca href=\"https://www.youtube.com/@OatsStudios/featured\"\u003ethe shorts\u003c/a\u003e by \u003ca href=\"https://en.m.wikipedia.org/wiki/Oats_Studios\"\u003eOats Studios\u003c/a\u003e, a studio started by\n\u003ca href=\"https://en.m.wikipedia.org/wiki/Neill_Blomkamp\"\u003eNeill Blomkamp\u003c/a\u003e. So far I\u0026rsquo;ve watched \u003ca href=\"https://www.themoviedb.org/movie/461955-rakka\"\u003eRakka\u003c/a\u003e, \u003ca href=\"https://www.themoviedb.org/movie/464111-zygote\"\u003eZygote\u003c/a\u003e, and \u003ca href=\"https://www.themoviedb.org/movie/485016-praetoria-part-one\"\u003ePraetoria\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eRakka and Zygote are impressively full-on. I think this format is perfect for\nme for me because they don\u0026rsquo;t demand the concentration a longer film needs.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://avi.im/blag/2024/sqlite-facts/\"\u003eCollection of insane and fun facts about SQLite\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThere are indeed a lot of \u0026ldquo;fun facts\u0026rdquo; about SQLite and in particular the way\nthe core developers operate.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUnlike most open source project that uses standard licenses (like MIT or\nGPL), SQLite does not come with a OSI-approved license. Instead, SQLite is\nreleased into the public domain and it has even fewer restrictions.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAs lot of software people think that you are somehow obliged to submit to\ntheir whims and release software as they desire. The SQLite team have chosen\nto do it their way. Are some of their modes of operation bit odd? Sure. But\nthey can choose to act as \u003cem\u003ethey\u003c/em\u003e please with \u003cem\u003etheir\u003c/em\u003e software that \u003cem\u003ethey\u003c/em\u003e wrote.\u003c/p\u003e\n\u003cp\u003eI found this fascinating too:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSQLite is so fast, they compete with fopen. For some use cases, you can use\nSQLite instead of a filesystem, that can be 35% faster.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSQLite can be faster than writing to disk!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.viewsonic.com/us/products/monitors/vp2788-5k-27-colorpro-5k-mac-compatible-monitor-with-100w-thunderbolt-4-usb-c-and-dci-p3-color-gamut.html\"\u003eAnother new\u003c/a\u003e \u003ca href=\"/weeknotes/186-approval-granted/#:~:text=New%20Apple%20display%20competitors\"\u003emonitor for the Mac user?\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/185-fabric-shaving/#:~:text=which%20led%20me%20to%20fall%20down%20said%20staircase\"\u003eOops, I did it again\u003c/a\u003e. I fell down some stairs. This time outside, and with\nadded mud and a bruised hip.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe have have some architects drawings for our upcoming house renovations and\nwe wanted to get some paper copies to hand out to contractors who might need\nthem. I found out that the local University\u0026rsquo;s printing department accept jobs\nfrom external customers, not just current students. This is very convenient\nwhen you need something printed in some format other than black and white A4\n\u0026ndash; it cost me £1.50 for 5 copies of A3 in colour \u0026ndash; very reasonable.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe took a copy of said documents to two different kitchen design appointments\n🥱 Status: Expense incoming.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt was the local monthly Ruby meetup this week. It\u0026rsquo;s always nice to see the\nfew (two) regular people who show up even though I frequently think that this\nshould be a \u003cem\u003eproper\u003c/em\u003e meetup with talks and pizza. It remains a bit of a catch\n22 anyway because I don\u0026rsquo;t think we can realistically put on a talk for an\naudience of two people.\u003c/p\u003e\n\u003cp\u003eThe truth is that I\u0026rsquo;m not really interested in Ruby (or computers) enough at\nthe moment to even think about giving my own talk, and that\u0026rsquo;s if I put aside\nmy aversion to public speaking (can 2 people be considered \u0026ldquo;public\u0026rdquo;?).\u003c/p\u003e\n\u003cp\u003eThe others who join me at this monthly meeting seem fine to continue with the\ncurrent situation, so maybe I just let it be.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis is interesting.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe computer, de-invented\nMeet DC-1. A new kind of computer, designed for deep focus and wellbeing.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://daylightcomputer.com/\"\u003ehttps://daylightcomputer.com/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI have developed a dangerous addiction \u0026ndash; buying non-working Nintendo Game\nBoys in some vain hope that I will be able to \u0026ldquo;fix\u0026rdquo; them. I currently own 7\nfairly shitty examples in various states of disassembly. Will I get any of\nthem working again?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStill don\u0026rsquo;t want to work for living.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://open.spotify.com/track/3vHqlBYlLgog7dOJn8K0Tu?si=cGh8AENCQOGXZCIipV72kg\"\u003eJarvis is still correct\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s a tonic to meet up with friends. You should do that, if you can.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA friend told me about \u003ca href=\"https://www.youtube.com/@OatsStudios/featured\"\u003ethe shorts\u003c/a\u003e by \u003ca href=\"https://en.m.wikipedia.org/wiki/Oats_Studios\"\u003eOats Studios\u003c/a\u003e, a studio started by\n\u003ca href=\"https://en.m.wikipedia.org/wiki/Neill_Blomkamp\"\u003eNeill Blomkamp\u003c/a\u003e. So far I\u0026rsquo;ve watched \u003ca href=\"https://www.themoviedb.org/movie/461955-rakka\"\u003eRakka\u003c/a\u003e, \u003ca href=\"https://www.themoviedb.org/movie/464111-zygote\"\u003eZygote\u003c/a\u003e, and \u003ca href=\"https://www.themoviedb.org/movie/485016-praetoria-part-one\"\u003ePraetoria\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eRakka and Zygote are impressively full-on. I think this format is perfect for\nme for me because they don\u0026rsquo;t demand the concentration a longer film needs.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://avi.im/blag/2024/sqlite-facts/\"\u003eCollection of insane and fun facts about SQLite\u003c/a\u003e\u003c/p\u003e",
      "date_published": "2025-01-26T00:00:00+00:00",
      "date_modified": "2025-01-26T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/186-approval-granted/",
      "url": "https://elver.me/weeknotes/186-approval-granted/",
      "title": "Weeknotes 186: Approval granted",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMy car was in the garage this week which stoked my anxiety somewhat. Before\nthey started any work the mechanic told me he was nervous about it, which\ndidn\u0026rsquo;t inspire confidence, but I did appreciate his candor. I got it back from\nthem a lot sooner than I was expecting though, so that was good.\u003c/p\u003e\n\u003cp\u003eWhen someone touches my car I am never convinced that the issue has been\nsorted even if it presents that way at first. So we shall see if weird noises\nreappear.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDownload age restricted videos from YouTube using \u003ccode\u003eyt-dlp\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe trick is \u003ccode\u003e--cookies-from-browser chrome\u003c/code\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eyt-dlp \u0026quot;https://www.youtube.com/watch?v=dQw4w9WgXcQ\u0026quot; --cookies-from-browser chrome\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eLog-in to YouTube from Chrome first, and when you run \u003ccode\u003eyt-dlp\u003c/code\u003e it will prompt\nto allow reading the cookies from Chrome and voila!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFor the first time in a while I took myself off to the cinema this week to\nwatch \u003ca href=\"https://www.themoviedb.org/movie/1013850-a-real-pain\"\u003eA Real Pain\u003c/a\u003e written and directed by \u003ca href=\"https://www.themoviedb.org/person/44735-jesse-eisenberg\"\u003eJesse Eisenberg\u003c/a\u003e. I really enjoyed\nit. I heard Eisenberg interviewed on a couple of podcasts (I guess marketing\nby podcast works) and he seems like a thoughtful guy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eJob advert:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe are seeking an experienced Ruby Developer with a strong background in\nHanami\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI bet you are. Do you know how many Ruby Developers there are with \u0026ldquo;strong\u0026rdquo;\nHanami experience? Probably like three, and they\u0026rsquo;re all core team members.\nThis person doesn\u0026rsquo;t exist.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/185-fabric-shaving/#:~:text=Anyway%2C%20that%E2%80%99s%20the%20story%20of%20how%20a%20man%20ordered%20%C2%A360%20worth%20of%20the%20same%20part%20out%20of%20sheer%20stubbornness\"\u003e(many) parts that were missing\u003c/a\u003e for my keyboard project have arrived (in\na surprisingly large box considering the contents) but I haven\u0026rsquo;t resumed the\nbuild yet. From a visual inspection they \u003cem\u003eseem\u003c/em\u003e to be correct, but the proof\nis in the \u003cdel\u003epudding\u003c/del\u003e soldering.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur planning application was approved without difficulty ✅\u003c/p\u003e\n\u003cp\u003eWe weren\u0026rsquo;t expecting any trouble but you never know when dealing with local\ncouncil bureaucrats.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI really should have been taking better care of my server. I know why I\nhaven\u0026rsquo;t taken care of it better \u0026ndash; fear of fubar. Changing things breaks\nthings. However, waiting a long time to change things breaks things \u003cem\u003emore\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eI installed \u003ca href=\"https://en.wikipedia.org/wiki/Ubuntu_version_history#1804\"\u003eUbuntu 18.04 LTS\u003c/a\u003e when it was the latest version, and have done\nlittle to it since. Despite the LTS naming tag, support for this version ran\nout in 2023. Which to be fair is 5 years of updates. I managed to pull all the\nlatest updates and upgrade the system.\u003c/p\u003e\n\u003cp\u003eWhat I haven\u0026rsquo;t yet done, but plan to, is upgrade the distro completely to the\nnext version and beyond. That is a job for next week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWent to a wedding on Saturday. When you don\u0026rsquo;t drink they get boring fast 🥱\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur new house has some eaves storage which we would like to start using, but\nit was a bit dirty and shabby in there. The space is fairly cold, but for what\nwe\u0026rsquo;re going to store in there that should be ok. Condensation is the enemy.\u003c/p\u003e\n\u003cp\u003eAs the space adjoins a bedroom we use as an office it seems like an\nopportunity to add some extra insulation on the wall between the eaves and\noffice. The office is actually decently warm already, but I don\u0026rsquo;t think it\ncan hurt to insulate it a bit more for a modest sum.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been doing some research and the advise is all over the place, but the\none thing I don\u0026rsquo;t want to do is make anything worse. The general consensus is\nthat if you do it wrong you could end up with condensation. And condensation\nis bad. V bad.\u003c/p\u003e\n\u003cp\u003eThe current plan is to use \u003ca href=\"https://en.wikipedia.org/wiki/Polyisocyanurate\"\u003ePIR\u003c/a\u003e insulation boards cut to size and pushed\nbetween the studs in the wall on the eaves side. That way we\u0026rsquo;re keeping the\neaves as a cold space, and just improving the insulating properties of the\nwall whilst still allowing everything to \u0026ldquo;breath\u0026rdquo;. It may be the start of\nsomething more, but easy does it.\u003c/p\u003e\n\u003cp\u003eWhen I get back into \u003ca href=\"/weeknotes/180-the-secret-to-air-travel/#:~:text=installing%20Home%20Assistant\"\u003eHome Automation mode\u003c/a\u003e I plan on installing\ntemperature/humidity sensors in both the office and eaves to monitor what\u0026rsquo;s\ngoing on, preferably before doing any insulating so we can hopefully compare\nbefore and after.\u003c/p\u003e\n\u003cp\u003eThe price of PIR boards is all over the place. To aid in deciding what to buy\nand from where I found a \u003ca href=\"https://www.opticutter.com/\"\u003esheet material calculator\u003c/a\u003e which has been very handy\nso far. You feed in the board sizes you need, and the available boards sizes\nfrom retailers, and it shows you how many boards you need and the most\nefficient way to cut them.\u003c/p\u003e\n\u003cp\u003eThis project feels like our first foray into home improvements that are coming\nat us fast. We have kitchen designer appointments booked for next week 🫣\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://airpodnoises.net/\"\u003eAirPod Noises\u003c/a\u003e \u0026ndash; Find our what your AirPods are trying to say.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://oban.pro/articles/oss-web-and-new-oban\"\u003eOpen Sourcing Oban Web\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYears ago we realized our customers needed a more complex set of tools.\nThus, we released Oban Pro. Pro is where the serious business happens now,\nand we want more people to have Web available from the start.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is a smart move.\u003c/p\u003e\n\u003cp\u003eAbsolutely tons of new features and improvements too including MySQL support\nso Oban now runs on Postgres, SQLite, and MySQL. Nice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNew Apple display competitors have \u003ca href=\"https://kuycon.us/monitors/G27-X/buy/\"\u003eentered\u003c/a\u003e \u003ca href=\"https://edgeup.asus.com/2025/get-a-stunningly-high-ppi-on-a-32-inch-screen-with-the-proart-display-6k-pa32qcv/\"\u003ethe\u003c/a\u003e chat. Via \u003ca href=\"https://atp.fm/622\"\u003eATP 622\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI still don\u0026rsquo;t want to work for a living. I\u0026rsquo;m pretty happy posting eBay parcels\nand pottering about.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMy car was in the garage this week which stoked my anxiety somewhat. Before\nthey started any work the mechanic told me he was nervous about it, which\ndidn\u0026rsquo;t inspire confidence, but I did appreciate his candor. I got it back from\nthem a lot sooner than I was expecting though, so that was good.\u003c/p\u003e\n\u003cp\u003eWhen someone touches my car I am never convinced that the issue has been\nsorted even if it presents that way at first. So we shall see if weird noises\nreappear.\u003c/p\u003e",
      "date_published": "2025-01-19T00:00:00+00:00",
      "date_modified": "2025-01-19T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/185-fabric-shaving/",
      "url": "https://elver.me/weeknotes/185-fabric-shaving/",
      "title": "Weeknotes 185: Fabric shaving",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eHaving a real Christmas Tree is like getting pregnant with your second child.\nYou totally forgot how awful it was the last time you did it, but did it again\nanyway. Stood up by an unreliable tree collector meant fighting with it\nmyself, and boy does chopping up an old Christmas Tree suck.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/The_Fall_(band)\"\u003eThe Fall\u003c/a\u003e have never really been for me. Or so I thought until, via Spotify\u0026rsquo;s\nDiscover Weekly, I heard \u003ca href=\"https://open.spotify.com/track/2sIaC5trbnNk748yBC8Stc\"\u003eMountain Energei\u003c/a\u003e and couldn\u0026rsquo;t stop listening. The\nmore you listen the more it hypnotises you.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen we moved into this new house we bought a \u0026ldquo;temporary\u0026rdquo; bed which we knew we\nwouldn\u0026rsquo;t be our forever bed, but would do for now. It was cheap. It is also,\nas it turns out, made out of cardboard in parts. This led to one of the legs\non my side not holding up and slowly disappearing into the \u0026ldquo;cardboard\u0026rdquo;\nheadboard. I didn\u0026rsquo;t expect much from this bed, but I did naively expect it to\nstay in the usual bed shape for longer than 8 months.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve attempted to shore it up with new metal legs from my mate Jeff. I doubt\nit will last forever, but hopefully for a few years at least.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMainstream banks are now catching up with features that challenger banks have\nhad forever. They\u0026rsquo;re still not always doing it particularly well mind. It\u0026rsquo;s\npretty scary to wake up on a Sunday morning to a notification saying Apple Pay\nis now available on your Apple Watch when you performed that action \u003cem\u003edays\u003c/em\u003e\nbefore.\u003c/p\u003e\n\u003cp\u003eThere is a point at which a notification becomes at best useless, and worst\ndamaging. A terrible user experience and surely impacting their customer\nsupport teams too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur staircase is steep and windy which led me to fall down said staircase.\nCalm down, it was only 6 steps, but I did land hard and some choice words were\nused. It\u0026rsquo;s not all bad news though. When you need an excuse to not go to the\ngym, sometimes it\u0026rsquo;s handed to you on a silver platter.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eProgress on my \u003ca href=\"/weeknotes/184-keyboard-kaput/#:~:text=keyboard%202%20instead\"\u003ekeyboard build\u003c/a\u003e has stalled because I didn\u0026rsquo;t have a couple of\nparts I thought I did \u0026ndash; two \u003ca href=\"https://www.littlekeyboards.com/products/ultra-low-profile-sockets\"\u003e12 pin ultra low profile sockets\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eWhen connecting micro-controllers to keyboards (or to any PCB) you can,\nbroadly speaking, choose to solder it directly to the PCB or solder a socket\nto the PCB and \u0026ldquo;socket\u0026rdquo; (push in) the micro-controller into it. This is what\nI \u003cem\u003edidn\u0026rsquo;t\u003c/em\u003e \u003ca href=\"/weeknotes/184-keyboard-kaput/#:~:text=before%20I%20soldered%20them%20into%20place\"\u003edo last time\u003c/a\u003e so when I needed to remove it I ended up damaging\nseveral parts. This time were doing things properly.\u003c/p\u003e\n\u003cp\u003eAcquiring said sockets is another matter entirely. True, this was mainly\ncaused by me being tight, but I\u0026rsquo;m sorry, I am not paying £36 in postage costs\nalone to send two tiny pieces of metal and plastic to the UK. Brexit fucking\nover UK-dwelling keyboard enthusiasts, no doubt. There are other suppliers\nwith less ridiculous postage costs, but still too expensive on principle.\u003c/p\u003e\n\u003cp\u003eIt has taken me considerable effort to try and work out \u003cem\u003ewhat\u003c/em\u003e I needed to buy\nand from \u003cem\u003ewhere\u003c/em\u003e. The original supplier didn\u0026rsquo;t specify manufacturer part\nnumbers (fair enough) so that was the first step. Once I had that, and with\nsome help, and over the course of a couple of days, I eventually worked out\nwhich parts I needed. Electronic component supplier websites expect that you\nknow what you\u0026rsquo;re talking about which makes them difficult for the novice (this\nguy) to use.\u003c/p\u003e\n\u003cp\u003eSuccess? Of a kind. Soon it became clear that the cost was comparable to the\noriginal supplier \u003cem\u003eunless\u003c/em\u003e you bought in bulk in order to qualify for free\npostage. Anyway, that\u0026rsquo;s the story of how a man ordered £60 worth of the same\npart out of sheer stubbornness. Take that \u0026ldquo;the man\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI bought a \u003ca href=\"https://www.amazon.co.uk/dp/B0BMF6JF8D\"\u003e\u0026ldquo;fabric shaver\u0026rdquo;\u003c/a\u003e; it\u0026rsquo;ll change your life. Trust.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eHaving a real Christmas Tree is like getting pregnant with your second child.\nYou totally forgot how awful it was the last time you did it, but did it again\nanyway. Stood up by an unreliable tree collector meant fighting with it\nmyself, and boy does chopping up an old Christmas Tree suck.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/The_Fall_(band)\"\u003eThe Fall\u003c/a\u003e have never really been for me. Or so I thought until, via Spotify\u0026rsquo;s\nDiscover Weekly, I heard \u003ca href=\"https://open.spotify.com/track/2sIaC5trbnNk748yBC8Stc\"\u003eMountain Energei\u003c/a\u003e and couldn\u0026rsquo;t stop listening. The\nmore you listen the more it hypnotises you.\u003c/p\u003e",
      "date_published": "2025-01-12T00:00:00+00:00",
      "date_modified": "2025-01-12T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/184-keyboard-kaput/",
      "url": "https://elver.me/weeknotes/184-keyboard-kaput/",
      "title": "Weeknotes 184: Keyboard kaput",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe saw \u003ca href=\"https://www.themoviedb.org/movie/516729-paddington-in-peru\"\u003ePaddington in Peru\u003c/a\u003e on Sunday. Very enjoyable despite the zoo-like\naudience. It doesn\u0026rsquo;t touch the first two for me though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fishshell.com/blog/rustport/\"\u003eFish 4.0: The Fish Of Theseus\u003c/a\u003e \u0026ndash; Why is fish being rewritten in Rust?\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFinally, subjectively, C++ isn’t drawing in the crowds. We have never had a\nlot of C++ contributors. Over the 11 years fish used C++, only 17 people\nhave at least 10 commits to the C++ code. We also don’t know a lot of people\nwho would love to work on a C++ codebase in their free time.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://antonz.org/stupid/\"\u003eI\u0026rsquo;m a programmer and I\u0026rsquo;m stupid\u003c/a\u003e \u0026ndash; I feel seen.\u003c/p\u003e\n\u003cp\u003eHave I given up or accepted reality?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/183-lazy-complete/#:~:text=soldering\"\u003enew favourite hobby continues\u003c/a\u003e with mixed success. I moved on to\npracticing SMD soldering. The soldering itself wasn\u0026rsquo;t too bad, I think I\u0026rsquo;m\ngetting the hang of that, the difficult part is dealing with such small\ncomponents and figuring out which way up things go. A lot of the components\nare tiny oblongs with no markings of any sort.\u003c/p\u003e\n\u003cp\u003eGiven that the soldering was going well I decided start building keyboard kit\n1 of 2. Putting everything together went fairly well, but when I tried\nflashing the micro controllers one of them would not respond. I mucked about\nwith it for a bit to no avail, so I decided to desolder it and test it alone.\nClearly, I should have tested these before I soldered them into place \u0026ndash; a\nlesson.\u003c/p\u003e\n\u003cp\u003eUnfortunately, the desoldering process did \u003cem\u003enot\u003c/em\u003e go to plan, and I failed to\nremove the micro controller without breaking it. And worse still, damaging one\nhalf of the keyboard PCB.\u003c/p\u003e\n\u003cp\u003eAnyway, keyboard kit number 1 is kaput for now. This one will be put down to\nexperience. It is potentially salvageable, but at a later date perhaps.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m moving onto keyboard 2 instead 😱\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://challahscript.com/what_i_wish_someone_told_me_about_postgres\"\u003eWhat I Wish Someone Told Me About Postgres\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe PostgreSQL folks also have a \u003ca href=\"https://wiki.postgresql.org/wiki/Don%27t_Do_This\"\u003eDon\u0026rsquo;t Do This\u003c/a\u003e page which has a lot of\ninteresting tidbits.\u003c/p\u003e\n\u003cp\u003eHave I read all of this? No.\u003c/p\u003e\n\u003cp\u003eWill I read it later when needed? Also likely no.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePostal tracking continues to amuse/confuse. Canada Post reported that \u003ca href=\"/weeknotes/182-secret-level/#:~:text=from%20Canada\"\u003ethe\nMegadesk\u003c/a\u003e would be delivered on the 6th January. Then changed their mind to\n14th. And it finally arrived early on the 30th December!\u003c/p\u003e\n\u003cp\u003eWatch this space to see if I can break a desk as well as a keyboard.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/182-secret-level/#:~:text=buying%20random%20stuff\"\u003eHome Assistant Voice Preview Edition\u003c/a\u003e arrived. I\u0026rsquo;ve put it on a shelf\nnext to all the other bits and bobs\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe woke up to snow today (Sunday). It was nice to see it blanket the city\nbefore it quickly turned to the usual brown slush.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNext week is the start of \u003cem\u003eproperly\u003c/em\u003e being off work. I have a list as long as\nmy arm for things to do, so I\u0026rsquo;m hoping that I can maintain motivation. I also\nhaven\u0026rsquo;t touched or looked at any code in about 3 weeks and I\u0026rsquo;m glad.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe saw \u003ca href=\"https://www.themoviedb.org/movie/516729-paddington-in-peru\"\u003ePaddington in Peru\u003c/a\u003e on Sunday. Very enjoyable despite the zoo-like\naudience. It doesn\u0026rsquo;t touch the first two for me though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fishshell.com/blog/rustport/\"\u003eFish 4.0: The Fish Of Theseus\u003c/a\u003e \u0026ndash; Why is fish being rewritten in Rust?\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFinally, subjectively, C++ isn’t drawing in the crowds. We have never had a\nlot of C++ contributors. Over the 11 years fish used C++, only 17 people\nhave at least 10 commits to the C++ code. We also don’t know a lot of people\nwho would love to work on a C++ codebase in their free time.\u003c/p\u003e",
      "date_published": "2025-01-05T00:00:00+00:00",
      "date_modified": "2025-01-05T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/183-lazy-complete/",
      "url": "https://elver.me/weeknotes/183-lazy-complete/",
      "title": "Weeknotes 183: Lazy complete",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/180-the-secret-to-air-travel/#:~:text=I%E2%80%99m%20making%20the%20move%20to%20lazy.nvim%20as%20my%20package%20manager\"\u003emove to lazy.nvim\u003c/a\u003e \u003ca href=\"https://github.com/jordelver/dotfiles/pull/2\"\u003eis complete\u003c/a\u003e. I\u0026rsquo;m mostly happy I\u0026rsquo;ve done this but\nthere are a few small things to work out. I decided to move ahead with the\nmerge anyway and sort them later/never.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI did \u003ca href=\"/weeknotes/182-secret-level/#:~:text=latest%20firmware\"\u003ere-install the POWKIDDY v10 and installed some games\u003c/a\u003e. It was a fairly\npainless process.\u003c/p\u003e\n\u003cp\u003eFor some reason it doesn\u0026rsquo;t seem to want to charge past 75% battery capacity.\nI\u0026rsquo;m not sure if I care enough to do anything about it yet. I will keep playing\nwith it and see what happens. The whole product is a fairly ramshackle affair,\nbut that is part of the appeal with these sort of things.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://usetrmnl.com/\"\u003eTRMNL\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTRMNL is an e-ink companion that helps you stay focused.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMust. Not. Buy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAmongst the \u003cem\u003emany\u003c/em\u003e projects I\u0026rsquo;ve added to my \u0026ldquo;whilst I\u0026rsquo;m taking a break\u0026rdquo; list\nis to finally build the keyboard I bought in 2020. In fact, I bought enough\nparts for two \u003cem\u003ealmost\u003c/em\u003e identical keyboards. \u0026ldquo;Two?\u0026rdquo; It doesn\u0026rsquo;t make sense to me\neither, but here we are.\u003c/p\u003e\n\u003cp\u003eTo that end, I\u0026rsquo;ve been practicing soldering with some cheap kits I bought for\nthe task. I procrastinated for ages, but enjoyed it once I got into it. So far\nthe kits have been through-hole component, which I think are generally\nconsidered easier to deal with. The keyboard parts are surface mount instead,\nso that is the next thing to try.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe long awaited \u003ca href=\"https://ghostty.org/\"\u003eGhostty terminal emulator\u003c/a\u003e has been released after a long\nprivate beta period. I\u0026rsquo;ve installed it, but I have no immediate plans to move\naway from iTerm 2. \u003ca href=\"https://mitchellh.com/writing/ghostty-1-0-reflection\"\u003eMitchell Hashimoto wrote about the experience\u003c/a\u003e of building\nit.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://swup.js.org/\"\u003eswup\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eVersatile and extensible page transition library for server-rendered websites\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI was initially pretty interested in this library. \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API\"\u003eView Transitions\u003c/a\u003e are a\nreally important part of moving away from the cancer that is the SPA, but when\nplaying with the demo it acted in a few strange broken ways which took the off\nshine pretty quickly.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ll keep it in-mind to try again should the need arise.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI managed to catch a cold whilst holiday. It \u003cem\u003epeaked\u003c/em\u003e on Christmas Day \u0026ndash; good\ntimes. Thankfully it was overall fairly mild, and Christmas was a quiet one\nanyway so it wasn\u0026rsquo;t too bad.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.seangoedecke.com/confidence/\"\u003eI don\u0026rsquo;t know how to build software and you don\u0026rsquo;t either\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe longer I work in tech, the less confident I get about any of these big\nquestions. I’ve seen enough things work that I thought were terrible ideas,\nand vice versa. In fact, I’m not convinced it’s even possible to be\njustifiably confident that there’s a right answer to these questions. Nobody\nknows!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis really resonated with me.\u003c/p\u003e\n\u003cp\u003eAs we become more experienced we understand that there are no correct answers.\nOnly trade-offs. This makes dealing with less experienced colleagues difficult\nas they are absolutely sure of their correctness. And to make it worse, they\nseem to be highly productive to their non-technical bosses due to their over\nabundance of confidence and Pull Requests containing hundreds of changes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI know it\u0026rsquo;s a cliché, but the amount of space taken up by old \u003ccode\u003enode_modules/\u003c/code\u003e\n(and to be fair, Rails log files) is crazy. I freed up ~20GB just by casually\nbrowsing the filesystem and deleting.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/180-the-secret-to-air-travel/#:~:text=I%E2%80%99m%20making%20the%20move%20to%20lazy.nvim%20as%20my%20package%20manager\"\u003emove to lazy.nvim\u003c/a\u003e \u003ca href=\"https://github.com/jordelver/dotfiles/pull/2\"\u003eis complete\u003c/a\u003e. I\u0026rsquo;m mostly happy I\u0026rsquo;ve done this but\nthere are a few small things to work out. I decided to move ahead with the\nmerge anyway and sort them later/never.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI did \u003ca href=\"/weeknotes/182-secret-level/#:~:text=latest%20firmware\"\u003ere-install the POWKIDDY v10 and installed some games\u003c/a\u003e. It was a fairly\npainless process.\u003c/p\u003e\n\u003cp\u003eFor some reason it doesn\u0026rsquo;t seem to want to charge past 75% battery capacity.\nI\u0026rsquo;m not sure if I care enough to do anything about it yet. I will keep playing\nwith it and see what happens. The whole product is a fairly ramshackle affair,\nbut that is part of the appeal with these sort of things.\u003c/p\u003e",
      "date_published": "2024-12-29T00:00:00+00:00",
      "date_modified": "2024-12-29T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/182-secret-level/",
      "url": "https://elver.me/weeknotes/182-secret-level/",
      "title": "Weeknotes 182: Secret level",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLast day at work on Thursday and also paid a week early. A Christmas miracle!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/180-the-secret-to-air-travel/#:~:text=hopeful%20this%20will%20mean%20a%20return%20to%20regular%20gyming\"\u003ereturn to the gym\u003c/a\u003e is going well. I\u0026rsquo;m starting to get back into a proper\nroutine now rather than just turning up to test the waters. Better still, the\ngym is completely closed until the new year 😄\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://simonwillison.net/2024/Dec/22/link-blog/\"\u003e\u0026ldquo;My approach to running a link blog\u0026rdquo;\u003c/a\u003e \u0026ndash; My plans to extend this \u0026ldquo;blog\u0026rdquo; are\nstill that, plans, but Simon has some great tips here that I\u0026rsquo;m likely to\ncopy soon.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBecause buying random stuff you don\u0026rsquo;t need when you have no income is clever I\nordered a \u003ca href=\"https://www.home-assistant.io/voice-pe/\"\u003eHome Assistant Voice Preview Edition\u003c/a\u003e on a whim. There\u0026rsquo;s a lot of\nwhimming going on.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/181-proc-composition/#:~:text=Retail%20therapy%20occurring\"\u003ePOWKIDDY V10 arrived\u003c/a\u003e but I barely had time to play with it before going\non holiday. It comes with an enormous amount of games, to the point that\nfinding anything is difficult and overwhelming. A reformat and re-install of\nthe latest firmware, and a hand-picked selection of games is in order very\nsoon.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe M-m-m-\u003ca href=\"/weeknotes/180-the-secret-to-air-travel/#:~:text=The%20order%20I%20made%20for%20a%20Megadesk%20was%20cancelled%20due%20to%20Canada%20Post%20being%20on%20strike\"\u003eMegadesk\u003c/a\u003e is back in-stock and now on a boat on it\u0026rsquo;s way from\nCanada. Hurrah!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChristmas market time \u0026ndash; the city of choice this year? Munich. We were very\nunprepared having booked the hotel and flights months ago in a rare moment of\nforesight and then having followed that up with absolutely nothing.\u003c/p\u003e\n\u003cp\u003eIt didn\u0026rsquo;t start well. During immigration the single person manning the queue\nsuddenly decided to completely remove the queue, for reasons unknownm and in\nthe process almost incite a riot. Really fun start to getting away from it\nall.\u003c/p\u003e\n\u003cp\u003eMunich is a very pretty city, but it rained for a large part of our time there\nwhich made it difficult to appreciate.\u003c/p\u003e\n\u003cp\u003eTraveling abroad really does bring to light my love of the British plug.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI lost weight whilst on holiday despite a completely sausage based diet. The\nhuman body is a mystery, but I\u0026rsquo;ll take it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy car was at the garage for an MOT and investigation into non-working air\nconditioning. It passed the MOT with flying colours, which is a relief. The\ninvestigation was less successful, so it will be going back in mid-January.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.reddit.com/r/elixir/comments/1hhc5qz/is_it_true_in_elixir_118_there_wont_be_any_more/\"\u003eJose Valim has confirmed\u003c/a\u003e that Elixir 1.18 IEx will have a \u003ca href=\"https://hexdocs.pm/iex/1.18/IEx.html#configure/1-auto-reloading\"\u003e\u003ccode\u003eauto_reload\u003c/code\u003e\nconfiguration option\u003c/a\u003e so recompilations are automatically reloaded.\u003c/p\u003e\n\u003cp\u003eThere are some subtleties which \u003ca href=\"https://arrowsmithlabs.com/blog/iex-configure-auto-reload\"\u003eGeorge Arrowsmith explains\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://youtu.be/-mFJ5rPbY_w?t=3297\"\u003eThe Creator Of Elixir - Top Shelf 7\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe are going to respect the newline\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd so we should.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNice tip on deriving \u003ccode\u003eInspect\u003c/code\u003e to get better output from Ecto models\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edefmodule\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003ePostline.Accounts.User\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#008080\"\u003e@derive\u003c/span\u003e {\u003cspan style=\"color:#458;font-weight:bold\"\u003eInspect\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003eonly\u003c/span\u003e: [\u003cspan style=\"color:#990073\"\u003e:id\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:email\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:first_name\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:last_name\u003c/span\u003e]}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003euse\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eEcto\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eSchema\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  schema \u003cspan style=\"color:#d14\"\u003e\u0026#34;users\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    field \u003cspan style=\"color:#990073\"\u003e:email\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:string\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    field \u003cspan style=\"color:#990073\"\u003e:first_name\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:string\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    field \u003cspan style=\"color:#990073\"\u003e:last_name\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:string\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    field \u003cspan style=\"color:#990073\"\u003e:avatar\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:string\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    field \u003cspan style=\"color:#990073\"\u003e:subscribed\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:boolean\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003edefault\u003c/span\u003e: \u003cspan style=\"color:#008080\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    field \u003cspan style=\"color:#990073\"\u003e:subscription\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:string\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    field \u003cspan style=\"color:#990073\"\u003e:role\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:atom\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003edefault\u003c/span\u003e: \u003cspan style=\"color:#990073\"\u003e:user\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    timestamps()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFrom \u003ca href=\"https://bsky.app/profile/jskalc.bsky.social/post/3lcitdcq4tg22\"\u003eJakub Skałecki\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.themoviedb.org/tv/261579-secret-level\"\u003eSecret level\u003c/a\u003e is very enjoyable. This series feels like it\u0026rsquo;s made for my\nshort attention span with the episodes being short. I particularly enjoyed\n\u003ca href=\"https://www.themoviedb.org/tv/261579-secret-level/season/1/episode/5\"\u003eEpisode 5, Warhammer 40,000: And They Shall Know No Fear\u003c/a\u003e. I do hope that\n\u003ca href=\"https://www.instagram.com/p/DDY_euNohPB/\"\u003eHenry Cavill\u003c/a\u003e can pull off a full series.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLast day at work on Thursday and also paid a week early. A Christmas miracle!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/180-the-secret-to-air-travel/#:~:text=hopeful%20this%20will%20mean%20a%20return%20to%20regular%20gyming\"\u003ereturn to the gym\u003c/a\u003e is going well. I\u0026rsquo;m starting to get back into a proper\nroutine now rather than just turning up to test the waters. Better still, the\ngym is completely closed until the new year 😄\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://simonwillison.net/2024/Dec/22/link-blog/\"\u003e\u0026ldquo;My approach to running a link blog\u0026rdquo;\u003c/a\u003e \u0026ndash; My plans to extend this \u0026ldquo;blog\u0026rdquo; are\nstill that, plans, but Simon has some great tips here that I\u0026rsquo;m likely to\ncopy soon.\u003c/p\u003e",
      "date_published": "2024-12-22T00:00:00+00:00",
      "date_modified": "2024-12-22T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/181-proc-composition/",
      "url": "https://elver.me/weeknotes/181-proc-composition/",
      "title": "Weeknotes 181: Proc composition",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFriends visited for a Christmas get together which was delightful because I\nwasn\u0026rsquo;t expecting it and I really appreciate the effort of driving 5 or 6\nhours. This did however lead to being uncomfortably full due to the sheer\namount of beige consumed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.adam-buxton.co.uk/podcasts/rhwkafw2z2x3xe6-6ysb3-pfp9n-6xxa2-jnpn5-2cacw-6cz8f-gx8fb-nkb87-c6mae-bd5zy-yby4r-6392t-jf5tm-ph55s-cktl3-dsw49-r8ccg-sj9we\"\u003eKim Deal was an absolute delight on Adam Buxton\u0026rsquo;s podcast\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDuring \u003ca href=\"/weeknotes/180-the-secret-to-air-travel/#:~:text=making%20the%20move%20to%20lazy.nvim\"\u003ethe move to lazy.nvim\u003c/a\u003e I discovered Neovim has \u003ccode\u003eset wrap\u003c/code\u003e on by\ndefault. Who are these monsters who want word wrap turned on \u003cem\u003eby default\u003c/em\u003e?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I was \u003ca href=\"https://x.com/RubyCademy/status/1865474663763099946\"\u003ereminded of Proc composition in Ruby\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThis is so cool. Check this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e strip \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#0086b3\"\u003eproc\u003c/span\u003e(\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#990073\"\u003e:strip\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e#\u0026lt;Proc:0x000000014dc3b830(\u0026amp;:strip) (lambda)\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e downcase \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#0086b3\"\u003eproc\u003c/span\u003e(\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#990073\"\u003e:downcase\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e#\u0026lt;Proc:0x000000016e0746e8(\u0026amp;:downcase) (lambda)\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e remove_alias \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#0086b3\"\u003eproc\u003c/span\u003e { _1\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003egsub(\u003cspan style=\"color:#009926\"\u003e/\\+.*@/\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;@\u0026#39;\u003c/span\u003e) }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e#\u0026lt;Proc:0x000000016dcfbed0 (starfish):14\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e email \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;   Test+alias@example.com   \u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;   Test+alias@example.com   \u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e (strip \u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e downcase \u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e remove_alias)\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ecall(email)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;test@example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI followed this until I got to the \u003ccode\u003e(strip \u0026gt;\u0026gt; downcase \u0026gt;\u0026gt; remove_alias)\u003c/code\u003e part.\nI\u0026rsquo;ve never seen \u003ccode\u003e\u0026gt;\u0026gt;\u003c/code\u003e used in this context so I was confused. This is\napparently the \u003ca href=\"https://ruby-doc.org/3.3.6/Proc.html#method-i-3E-3E\"\u003eproc composition operator\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eReturns a proc that is the composition of this proc and the given g. The\nreturned proc takes a variable number of arguments, calls this proc with\nthem then calls g with the result.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMore details about Proc composition over on \u003ca href=\"https://rubyreferences.github.io/rubychanges/2.6.html#proc-composition\"\u003eRuby Changes\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRails\u0026rsquo; \u003ccode\u003eActiveSupport::StringInquirer\u003c/code\u003e is cool.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e x \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eActiveSupport\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eStringInquirer\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enew(\u003cspan style=\"color:#d14\"\u003e\u0026#34;bluesky\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;bluesky\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e x\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ebluesky?\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e x\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efoobar?\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ca href=\"https://bsky.app/profile/jamie.schembri.me/post/3lcil7i4ay22c\"\u003ehttps://bsky.app/profile/jamie.schembri.me/post/3lcil7i4ay22c\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy audiobook listening hasn\u0026rsquo;t been going well. Mainly because I have so many\npodcasts to keep up with that poor Lord of the Rings is getting pushed back\nfarther and farther each day. However, it has not been helped by \u003ca href=\"https://prologue.audio/\"\u003ePrologue\u003c/a\u003e\nrandomly losing the place in the book and resetting my listening position back\nto the start. Good times.\u003c/p\u003e\n\u003cp\u003eCan I be bothered to try and scrub through the back to the position I left it\nlast? I\u0026rsquo;m not that far in, so it might not be too terrible, but will it happen\nagain?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNice overview of the \u003ca href=\"https://www.youtube.com/watch?v=Fe7Y152ak3Y\"\u003enew features in Elixir 1.18\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSyntax code highlighting is something that I\u0026rsquo;ve been meaning to enable on my\nweeknotes for ages, and this week I finally got to it. Check it 👇\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eFoo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003ebar\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#d14\"\u003e\u0026#34;and I\u0026#39;m Ruby!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI went through all previous weeknotes and made sure all the code snippets have\nthe correct language specified too.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m good to you.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI also added Next/Previous links at the bottom of each blog post \u0026ndash; crikey!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/neovim/neovim/pull/31031\"\u003eadd vim.lsp.config and vim.lsp.enable\u003c/a\u003e \u0026ndash; this seems great to me. I\u0026rsquo;ve seen\nsome detractors, but I haven\u0026rsquo;t fully embraced LSPs because of the overhead\ninvolved in setting it all up.\u003c/p\u003e\n\u003cp\u003eNot all Neovim users have the time or inclination to try and figure out how to\nmould the various Lua you need into something that works. If these new APIs\ncan help me set up an LSP more easily, I\u0026rsquo;m all for it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://stuartschechter.org/posts/password-history/\"\u003eHow some of the world\u0026rsquo;s most brilliant computer scientists got password\npolicies so wrong\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe\u0026rsquo;re gradually making this house look more homely, this week by acquiring a\nmirror from Facebook Marketplace and hanging said mirror. Drilling two holes\nin a wall was harder than necessary, but such is DIY. I hope it stays on the\nwall! Really pleased with it though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.honeybadger.io/blog/elixir-module-names/\"\u003eModule names in Elixir are actually Atoms\u003c/a\u003e underneath.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiex(\u003cspan style=\"color:#099\"\u003e1\u003c/span\u003e)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eGame.DynamicSupervisor\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#990073\"\u003e:\u0026#34;Elixir.Game.DynamicSupervisor\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eElixir converts all module names to Atoms prefixed with \u003ccode\u003eElixir.\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was talking to someone about needing to do a rename in a large Rails project\nthis week, and it\u0026rsquo;s requiring a lot of small, gradual, changes. In other\nruntimes/languages this would be a right-click, rename, deploy.\u003c/p\u003e\n\u003cp\u003eRuby is great, but everything is a trade-off, and I think we should be honest\nwith ourselves when it sucks.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/180-the-secret-to-air-travel/#:~:text=the%20next%20step%20was%20to%20go%20straight%20to%20AliExpress%20and%20buy%20a%20random%20variety%20of%20ZigBee%2Denabled%20gubbins\"\u003eAliExpress happened again\u003c/a\u003e. Retail therapy occurring in the form of a\n\u003ca href=\"https://powkiddy.com/en-uk/products/powkiddy-v10-handheld-game-console\"\u003ePOWKIDDY v10\u003c/a\u003e handheld console ala GameBoy which I\u0026rsquo;m sure I will play and\ncharge at \u003cem\u003eleast\u003c/em\u003e once.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCar goes into the garage tomorrow. Wish me luck!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFriends visited for a Christmas get together which was delightful because I\nwasn\u0026rsquo;t expecting it and I really appreciate the effort of driving 5 or 6\nhours. This did however lead to being uncomfortably full due to the sheer\namount of beige consumed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.adam-buxton.co.uk/podcasts/rhwkafw2z2x3xe6-6ysb3-pfp9n-6xxa2-jnpn5-2cacw-6cz8f-gx8fb-nkb87-c6mae-bd5zy-yby4r-6392t-jf5tm-ph55s-cktl3-dsw49-r8ccg-sj9we\"\u003eKim Deal was an absolute delight on Adam Buxton\u0026rsquo;s podcast\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDuring \u003ca href=\"/weeknotes/180-the-secret-to-air-travel/#:~:text=making%20the%20move%20to%20lazy.nvim\"\u003ethe move to lazy.nvim\u003c/a\u003e I discovered Neovim has \u003ccode\u003eset wrap\u003c/code\u003e on by\ndefault. Who are these monsters who want word wrap turned on \u003cem\u003eby default\u003c/em\u003e?\u003c/p\u003e",
      "date_published": "2024-12-15T00:00:00+00:00",
      "date_modified": "2024-12-15T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/180-the-secret-to-air-travel/",
      "url": "https://elver.me/weeknotes/180-the-secret-to-air-travel/",
      "title": "Weeknotes 180: The secret to air travel",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.themoviedb.org/movie/562-die-hard\"\u003e\u0026ldquo;You wanna know the secret to surviving air travel?\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStill haven\u0026rsquo;t \u003ca href=\"/weeknotes/177-an-afternoon-in-costa/#:~:text=yet%20to%20set%20it%20up\"\u003eset up the new computer\u003c/a\u003e. It feels quite disrespectful to leave\na new computer sat next to me unused for this long. However, I have started\nrefactoring my Neovim config as part of the move. If that\u0026rsquo;s not\nprocrastination, I don\u0026rsquo;t know what is.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m making the move to \u003ca href=\"https://github.com/folke/lazy.nvim\"\u003elazy.nvim\u003c/a\u003e as my package manager instead of packer. All\nthe cool kids are using it, and it does seem to genuinely allow for the more\nmodular setup I\u0026rsquo;ve been searching for.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://kezhenxu94.me/blog/lazyvim-project-specific-settings\"\u003eProject specific configurations in LazyVim with .lazy.lua\u003c/a\u003e \u0026ndash; lazy.nvim also\nhas project-level config support. Very useful for working on multiple projects\nat once.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of Neovim, \u003ca href=\"https://www.youtube.com/@teej_dv/videos\"\u003eTJ DeVries\u003c/a\u003e is on a great advent run on his YouTube\nchannel at the moment. Some really great content.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter quiting the last gym, which I didn\u0026rsquo;t, like I\u0026rsquo;ve been just not\nexercising. Clearly it\u0026rsquo;s good to exercise, so I\u0026rsquo;ve been evaluating\nalternatives for a while.\u003c/p\u003e\n\u003cp\u003eMy original shortlist had on it a gym even closer to me than the last\n(literally a 3 minute walk) but I discounted it at the time due to the\nperceived lack of equipment, and strange opening hours. But perfect is the\nenemy of good, so I decided to sign up for a day pass to see how it really is\nin practice.\u003c/p\u003e\n\u003cp\u003eThe reality is that the photos on the website are very out-of-date and the\nbreadth of equipment actually really quite good, and it was \u003cem\u003ecompletely\u003c/em\u003e\nempty. The staff said it is almost always empty, so I\u0026rsquo;m very hopeful this will\nmean a return to regular gyming.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/sasa1977/soul_of_erlang_and_elixir\"\u003eSasa Juric has re-written and released the demo\u003c/a\u003e from his great talk: \u003ca href=\"https://www.youtube.com/watch?v=JvBT4XBdoUE\"\u003eThe\nSoul of Erlang and Elixir\u003c/a\u003e. The talk is really worth watching.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePhilips eventually delivered the products I had bought. Awful customer\nservice, see \u003ca href=\"/weeknotes/178-bumper-issue/#:~:text=reminds%20me%20why%20Amazon%20reigns%20supreme\"\u003eAmazon\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eHowever, the products themselves are great so far. I fitted the \u003ca href=\"https://www.philips-hue.com/en-gb/p/lightstrips-play-gradient-lightstrip-for-pc/8719514434479\"\u003ePlay Gradient\nLightstrip\u003c/a\u003e to the back of my monitor (which I was hesitant to do, because\nsticking sticky stuff to the back of such a beautiful display feels bad) and\nit looks lovely \u0026ndash; just what I was after.\u003c/p\u003e\n\u003cp\u003eAt the moment it\u0026rsquo;s just setup directly via Bluetooth. I\u0026rsquo;m not sure people are\naware you don\u0026rsquo;t \u003cem\u003enecessarily\u003c/em\u003e need the hub. This allows control via the iOS\napp.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve yet to set up the \u003ca href=\"https://www.philips-hue.com/en-gb/p/hue-bridge/8719514342583\"\u003eHub\u003c/a\u003e and \u003ca href=\"https://www.philips-hue.com/en-gb/p/hue-white-and-colour-ambiance-lightstrip-plus-base-v4-2-metre/8718699703424\"\u003eLightstrip Plus\u003c/a\u003e I also purchased at the\nsame time, but I\u0026rsquo;ll get to that soon. Once I have the Hub going that will\nallow proper automation, and I can use the macOS menubar app, \u003ca href=\"https://apps.apple.com/us/app/hue-menu-bar-for-philips-hue/id1500678169\"\u003eHue Menu Bar\nfor Philips Hue\u003c/a\u003e, I bought to control monitor backlighting via software, and I\ncan also give the \u003ca href=\"https://www.philips-hue.com/en-in/explore-hue/propositions/entertainment/hue-sync\"\u003eHue Sync app\u003c/a\u003e a go to sync the light with the monitor\npicture.\u003c/p\u003e\n\u003cp\u003eIn my frustration with Philips I had also bought an additional lightstrip\ndirect from Amazon. The point being, I now have too many lightstrips in this\nhouse. Soon it will look like the nightmare disco in every room of the Philips\nadverts.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter ordering Philips Hue gear and installing Home Assistant, of course, the\nnext step was to go straight to \u003ca href=\"https://en.wikipedia.org/wiki/AliExpress\"\u003eAliExpress\u003c/a\u003e and buy a random variety of\nZigBee-enabled gubbins.\u003c/p\u003e\n\u003cp\u003eI got some \u003ca href=\"https://www.aliexpress.com/item/1005007484865151.html\"\u003etemperature and humidy sensors\u003c/a\u003e, some \u003ca href=\"https://www.aliexpress.com/item/1005007625460115.html\"\u003etemperature and humidity\nsensors with screens\u003c/a\u003e, a \u003ca href=\"https://www.aliexpress.com/item/1005006578221694.html\"\u003ehuman presence detector\u003c/a\u003e (!), and most importantly a\n\u003ca href=\"https://www.aliexpress.com/item/1005004942648430.html\"\u003eSMLIGHT SLZB-06M ZigBee co-ordinator\u003c/a\u003e to control everything.\u003c/p\u003e\n\u003cp\u003eI also bought \u003ca href=\"https://www.ikea.com/gb/en/p/tretakt-plug-smart-80556514/\"\u003esome plugs\u003c/a\u003e and a \u003ca href=\"https://www.ikea.com/gb/en/p/vallhorn-wireless-motion-sensor-smart-white-90504341/\"\u003emotion sensor\u003c/a\u003e from IKEA because cheap and\nreliable.\u003c/p\u003e\n\u003cp\u003eWill all this stuff work together? Fuck knows.\u003c/p\u003e\n\u003cp\u003eI plan to place another order because I am helpless.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about \u003ca href=\"https://hexdocs.pm/iex/IEx.Helpers.html#import_if_available/1\"\u003e\u003ccode\u003eimport_if_available\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUseful for attempting to import a module if it is available.\u003c/p\u003e\n\u003cp\u003eVia \u003ca href=\"https://blog.brettbeatty.com/2024_09_28_iex_any_helper.html\"\u003eIEx \u0026ldquo;any\u0026rdquo; Helper\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/179-tumultuous-week/#:~:text=Which%20is%20why%20I%E2%80%99ve%20bought\"\u003eorder I made for a Megadesk\u003c/a\u003e was cancelled due to Canada Post being on\nstrike. I\u0026rsquo;ve set a new reminder, but it seems unlikely that I\u0026rsquo;ll get one\nbefore Christmas now. Sadness.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://vereis.com/posts/disterl_inbox\"\u003eDistributed Erlang\u003c/a\u003e \u0026ndash; very nice explanation of Erlang in general, but its\ndistribution properties more specifically. I was also impressed with the \u003ca href=\"https://github.com/vereis/blog/commit/a0bf77480a8d6f5c227feeec6666d1041a8300ef\"\u003eCSS\nCRT effect\u003c/a\u003e in use, although it made me feel slightly queasy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFor as long as I can remember when enqueuing a job in Rails I would always\npass an ID into the job. When the job executed at a later time, I would grab\nthe ID, find the relevant model object and the go about my business.\u003c/p\u003e\n\u003cp\u003eSo it shocked me when a code review led to finding out that you can now pass\nan ActiveRecord object instead of just an ID. This works because of\n\u003ca href=\"https://github.com/rails/globalid/blob/main/README.md\"\u003e\u003ccode\u003eGlobalID\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eActive Job supports GlobalID for parameters. This makes it possible to pass\nlive Active Record objects to your job instead of class/id pairs, which you\nthen have to manually deserialize. Before, jobs would look like this:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis does clean up job code somewhat as you don\u0026rsquo;t need to do the manual\nfinding the record step. Rails constantly surprises.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://guides.rubyonrails.org/active_job_basics.html#globalid\"\u003ehttps://guides.rubyonrails.org/active_job_basics.html#globalid\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wasn\u0026rsquo;t expecting to hear Apex Twin on the latest series of the \u003ca href=\"https://en.wikipedia.org/wiki/The_Block_%28Australian_TV_series%29\"\u003eThe Block\u003c/a\u003e.\nNo, not \u003ca href=\"https://en.wikipedia.org/wiki/Come_to_Daddy_(song)\"\u003eCome to Daddy\u003c/a\u003e unfortunately - \u003ca href=\"https://en.wikipedia.org/wiki/Avril_14th\"\u003eAvril 14th\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://island94.org/2024/12/including-rails-view-helpers-concern\"\u003eIncluding Rails View Helpers is a concern\u003c/a\u003e \u0026ndash; This is something I see a lot,\nand Ruby makes it easy, just mixin all the things. Need one method? Include\nyour friend and mine, \u003ccode\u003einclude ApplicationHelper\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMissing your Apple Touch Bar?\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://eniacelec.com/\"\u003eFlexbar\u003c/a\u003e, A More Versatile \u0026amp; Fully Customizable Touch-Bar Solution\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHow long until someone slams their laptop shut with this inside it?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://hexdocs.pm/mix_test_interactive/readme.html\"\u003emix test.interactive\u003c/a\u003e \u0026ndash; An interactive test runner for ExUnit tests.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt allows you to easily switch between running all tests, stale tests, or\nfailed tests. Or, you can run only the tests whose filenames contain a\nsubstring.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://testdouble.com/insights/when-code-reviews-arent-mandatory\"\u003eWhat happens when code reviews aren’t mandatory? An experiment\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBridgeCare wanted to try a different approach. While established norms tell\nus to wait for review before merging, they were like - what if - what if we\ndidn\u0026rsquo;t require PRs to have sign-off before merging?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWe need to remember we once survived without PRs and without PR reviews.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBuilding trust with teammates through communication and consensus-building\nabout key/structural updates is essential\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eOh. Never mind.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://keathley.io/blog/sgp.html\"\u003eThe dangers of the Single Global Process\u003c/a\u003e \u0026ndash; An interesting article on the\ndangers of using a single global process in your Elixir app.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis is more of a TIL type post, I should \u003ca href=\"/weeknotes/5-professional-bash-programmer/#:~:text=I%E2%80%99m%20working%20on%20getting%20a%20TIL%20site%20up%20and%20running\"\u003estart that TIL site I spoke about in\n2021\u003c/a\u003e. Anyway, Elixir processes\u0026hellip;\u003c/p\u003e\n\u003cp\u003eEach Elixir process has a mailbox for messages. When a process is sent a\nmessage, it is stored in the mailbox until it is processed. Processing happens\nusing a \u003ccode\u003ereceive\u003c/code\u003e block, or we can flush the messages.\u003c/p\u003e\n\u003cp\u003eYou can see the messages a process has using \u003ccode\u003e:erlang.process_info\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiex(\u003cspan style=\"color:#099\"\u003e1\u003c/span\u003e)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#990073\"\u003e:erlang\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eprocess_info(self(), \u003cspan style=\"color:#990073\"\u003e:messages\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#990073\"\u003e:messages\u003c/span\u003e, []}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eself()\u003c/code\u003e returns the PID (Process Identifier) of the currently running\nprocess, in this case \u003ccode\u003eiex\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSend a message to the process.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiex(\u003cspan style=\"color:#099\"\u003e2\u003c/span\u003e)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e send(self(), {\u003cspan style=\"color:#990073\"\u003e:foo\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;bar\u0026#34;\u003c/span\u003e})\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#990073\"\u003e:foo\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;bar\u0026#34;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow the process has a message in it\u0026rsquo;s mailbox.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiex(\u003cspan style=\"color:#099\"\u003e3\u003c/span\u003e)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#990073\"\u003e:erlang\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eprocess_info(self(), \u003cspan style=\"color:#990073\"\u003e:messages\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#990073\"\u003e:messages\u003c/span\u003e, [\u003cspan style=\"color:#990073\"\u003efoo\u003c/span\u003e: \u003cspan style=\"color:#d14\"\u003e\u0026#34;bar\u0026#34;\u003c/span\u003e]}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFlush the messages.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiex(\u003cspan style=\"color:#099\"\u003e4\u003c/span\u003e)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e flush()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#990073\"\u003e:foo\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;bar\u0026#34;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#990073\"\u003e:ok\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBang and the message is gone.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiex(\u003cspan style=\"color:#099\"\u003e5\u003c/span\u003e)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#990073\"\u003e:erlang\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eprocess_info(self(), \u003cspan style=\"color:#990073\"\u003e:messages\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#990073\"\u003e:messages\u003c/span\u003e, []}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.metageek.com/training/resources/zigbee-wifi-coexistence/\"\u003eZigBee and Wi-Fi Coexistence\u003c/a\u003e \u0026ndash; useful for my current house project. Given\nthat ZigBee and Wi-Fi share space in the radio spectrum it\u0026rsquo;s worth being aware\nwhich frequencies can interfere with each other.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.phoenixframework.org/blog/phoenix-liveview-1.0-released?release=1.0\"\u003ePhoenix LiveView 1.0 was released!\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGot a real Christmas tree this year? Do yourself a favour and get down the\nMiddle of Lidl and buy a \u003ca href=\"https://de.wikipedia.org/wiki/Weihnachtsbaumst%C3%A4nder\"\u003eWeihnachtsbaumständer\u003c/a\u003e for the bargain price of\n£14.99. This thing is incredible.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.themoviedb.org/movie/562-die-hard\"\u003e\u0026ldquo;You wanna know the secret to surviving air travel?\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStill haven\u0026rsquo;t \u003ca href=\"/weeknotes/177-an-afternoon-in-costa/#:~:text=yet%20to%20set%20it%20up\"\u003eset up the new computer\u003c/a\u003e. It feels quite disrespectful to leave\na new computer sat next to me unused for this long. However, I have started\nrefactoring my Neovim config as part of the move. If that\u0026rsquo;s not\nprocrastination, I don\u0026rsquo;t know what is.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m making the move to \u003ca href=\"https://github.com/folke/lazy.nvim\"\u003elazy.nvim\u003c/a\u003e as my package manager instead of packer. All\nthe cool kids are using it, and it does seem to genuinely allow for the more\nmodular setup I\u0026rsquo;ve been searching for.\u003c/p\u003e",
      "date_published": "2024-12-08T00:00:00+00:00",
      "date_modified": "2024-12-08T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/179-tumultuous-week/",
      "url": "https://elver.me/weeknotes/179-tumultuous-week/",
      "title": "Weeknotes 179: Tumultuous week",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eStop sending me emails saying that my \u0026ldquo;statement is available\u0026rdquo; when it is, in\nfact, not available. If you haven\u0026rsquo;t processed the document yet, don\u0026rsquo;t send the\nemail. Looking at you Companies House and HMRC.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBlack Friday struck again! I bought a Yum Asia Panda Mini rice cooker. It will\npay for itself in literally some amount of years. And now I have an excellent\nexcuse to buy a fucking massive bag of rice, which I\u0026rsquo;ve been wanting to do for\nyears.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI took the time to actually learn what \u003ca href=\"https://hexdocs.pm/elixir/Module.html#module-impl-since-v1-5-0\"\u003e\u003ccode\u003e@impl true\u003c/code\u003e\u003c/a\u003e is for in Elixir this\nweek. Up to now I\u0026rsquo;ve just been scattering them about until the compiler was\nhappy 😆\u003c/p\u003e\n\u003cp\u003eBasically, it makes it clear the function you are implementing is a callback\nfrom a Behaviour, which makes the code more obvious.\u003c/p\u003e\n\u003cp\u003eThis \u003ca href=\"https://elixircasts.io/%40impl-attribute\"\u003eElixirCasts video\u003c/a\u003e explained it well.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI applied for a new business bank account this week and after the sign-up\nprocess, and application approval, they managed to issue me not the current\nand savings accounts I was expecting, but three different accounts.\u003c/p\u003e\n\u003cp\u003eCan you trust a bank who can\u0026rsquo;t correctly provision your bank account? I guess\nwe\u0026rsquo;ll see 😬\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother side project idea struck me this week which made me \u003cem\u003eeven less\u003c/em\u003e\ninterested in the \u003cem\u003ecurrent\u003c/em\u003e side project. I must finish something. I\u0026rsquo;m a bit\nstuck again, but I\u0026rsquo;ve made a plan for how to get unstuck.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/178-bumper-issue/#:~:text=Maybe%20next%20though%2C%20they%20could%20send%20the%20items%20I%20bought%20rather%20than%20a%20random%20item%20I%E2%80%99ve%20never%20heard%20of\"\u003ePhilips have failed to send the items I bought\u003c/a\u003e. Worse still, they can\u0026rsquo;t tell\nme when they will, but are still selling the same items on their online store.\u003c/p\u003e\n\u003cp\u003eAnd on top of that the incorrect items were picked up by courier at 4:30pm\nwhen I was given a 11am -\u0026gt; 1pm collection window, ruining my plans.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.yellowduck.be/posts/dynamic-order-by-using-phoenix-ecto\"\u003eDynamic order by using Phoenix Ecto\u003c/a\u003e \u0026ndash; informative post on ordering queries\nin Elixir\u0026rsquo;s Ecto.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://simonwillison.net/2024/Nov/27/storing-times-for-human-events/\"\u003eStoring times for human events\u003c/a\u003e \u0026ndash; Anyone who tells you \u0026ldquo;just store as UTC\u0026rdquo;\nhas not understood the complexities involved in times and timezones. Remember,\nhubris is rife in this industry. Being able to write a computer programme does\nnot make you infallible.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://bsky.app/profile/sasajuric.bsky.social/post/3lbsmdjncts2h\"\u003eSaša Jurić\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMy opinion on squash merge: don\u0026rsquo;t. This is the hill I\u0026rsquo;ll die on.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThere is no need to squash.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI rewrite the history of my work-in-progress branch a lot, with the intent\nof getting a nice history that helps reviewers \u0026amp; others. As much as\npossible, I try to do this constantly, along with coding, because a big\nhistory cleanup after all is done is usually more difficult.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eA lot of the replies to this thread are a bit disappointing.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve said it before and I\u0026rsquo;ll say it again \u0026ndash; empathy. For the reviewers, for\nfuture bug fixers. Showing the story of a change makes review so much easier.\nAll the information you found along the way to a code change is recorded in\nthe commit.\u003c/p\u003e\n\u003cp\u003eWhy would you throw this knowledge away by squashing? Let\u0026rsquo;s be honest, because\nyou didn\u0026rsquo;t bother to document any of it to start with.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://bsky.app/profile/hauleth.dev/post/3lbtmaxmxxs2k\"\u003eHauleth is more to the point\u003c/a\u003e, but correct:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSquash merges are dirty solution for people who cannot use rebase \u0026ldquo;merges\u0026rdquo;\nand cannot keep their commit history clean.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTumultuous week at work. It started by saying goodbye to a couple of\ncolleagues, and ended with me finding out I will need to say goodbye myself.\nThe silence from some has been deafening.\u003c/p\u003e\n\u003cp\u003eMy last day will actually be the end of December. I\u0026rsquo;ll be looking for work in\nthe new year.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.johnnunemaker.com/shrinking-a-postgres-table/\"\u003eShrinking a Postgres Table\u003c/a\u003e \u0026ndash; Some interesting techniques for reducing the\nsize of a Postgres table, but mostly a showcase for how you can use AI to talk\nover ideas. I\u0026rsquo;ve found this invaluable recently.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.yellowduck.be/posts/removing-query-string-parameters-from-a-url-given-a-prefix\"\u003eRemoving query string parameters from a URL given a prefix\u003c/a\u003e \u0026ndash; with Elixir.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI found a website this week which had \u0026ldquo;links\u0026rdquo; to \u0026ldquo;pages\u0026rdquo;, but no actual \u003ccode\u003e\u0026lt;a href=\u0026quot;\u0026quot;\u0026gt;\u003c/code\u003e in sight! JavaScript required to click on blog post pages? Come. On.\u003c/p\u003e\n\u003cp\u003eLet\u0026rsquo;s make proper websites still, yeah?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.yellowduck.be/posts/the-beauty-of-debugging-in-elixir-when-using-dbg\"\u003eThe beauty of debugging in Elixir when using dbg()\u003c/a\u003e reminded of the \u003ccode\u003edbg\u003c/code\u003e\nmacro which I apparently wrote about in \u003ca href=\"/weeknotes/56-performance-improvements/#:~:text=A%20macro%20that%20you%20can%20use%20on%20the%20end%20of%20a%20pipeline%20and%20it%20will%20output%20each%20value%20in%20turn\"\u003eWeeknotes 56\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;Elixir is cool!\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#998;font-style:italic\"\u003e#=\u0026gt; \u0026#34;Elixir is cool!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eString\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003etrim_trailing(\u003cspan style=\"color:#d14\"\u003e\u0026#34;!\u0026#34;\u003c/span\u003e) \u003cspan style=\"color:#998;font-style:italic\"\u003e#=\u0026gt; \u0026#34;Elixir is cool\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eString\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003esplit() \u003cspan style=\"color:#998;font-style:italic\"\u003e#=\u0026gt; [\u0026#34;Elixir\u0026#34;, \u0026#34;is\u0026#34;, \u0026#34;cool\u0026#34;]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eList\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efirst() \u003cspan style=\"color:#998;font-style:italic\"\u003e#=\u0026gt; \u0026#34;Elixir\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;Elixir\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jvns.ca/blog/2024/11/29/why-pipes-get-stuck-buffering/\"\u003eWhy pipes sometimes get \u0026ldquo;stuck\u0026rdquo;: buffering\u003c/a\u003e \u0026ndash; I\u0026rsquo;m pretty sure I\u0026rsquo;ve had this\nhappen to me and just had no idea what was going on, so it\u0026rsquo;s nice to finally\nknow what was going on.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe IKEA Bekant desk I use has served me well. The only thing is that it\ndoesn\u0026rsquo;t have any support for saved desk height positions. This might sound\nlazy, but raising and lowering to the exact height you want can get tiresome.\u003c/p\u003e\n\u003cp\u003eWhich is why I\u0026rsquo;ve bought a \u003ca href=\"https://www.tindie.com/products/gcormier/megadesk/\"\u003eMegadesk\u003c/a\u003e!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMegadesk is an open-source, drop in controller for the IKEA Bekant standing\ndesk\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI don\u0026rsquo;t plan on keeping the Bekant forever, it is feeling a bit old now, but\nin the mean time I can upgrade it with the Megadesk to breath some new life\ninto it.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eStop sending me emails saying that my \u0026ldquo;statement is available\u0026rdquo; when it is, in\nfact, not available. If you haven\u0026rsquo;t processed the document yet, don\u0026rsquo;t send the\nemail. Looking at you Companies House and HMRC.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBlack Friday struck again! I bought a Yum Asia Panda Mini rice cooker. It will\npay for itself in literally some amount of years. And now I have an excellent\nexcuse to buy a fucking massive bag of rice, which I\u0026rsquo;ve been wanting to do for\nyears.\u003c/p\u003e",
      "date_published": "2024-12-01T00:00:00+00:00",
      "date_modified": "2024-12-01T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/178-bumper-issue/",
      "url": "https://elver.me/weeknotes/178-bumper-issue/",
      "title": "Weeknotes 178: Bumper issue",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eBlimey it\u0026rsquo;s cold!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Christmas Present Buying Season once again reminds me why Amazon reigns\nsupreme \u0026ndash; delivery times from a lot of other companies are generally woeful.\nI understand that it must be nigh on impossible to compete with Amazon\u0026rsquo;s\nlogistics, but a lot of places are just like \u0026ldquo;you\u0026rsquo;ll get it one day,\nprobably\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis is a good \u003ca href=\"https://peterullrich.com/a-bluesky-starter-guide-for-elixir-devs\"\u003egetting started with Bluesky\u003c/a\u003e post should you wish to subject\nyourself to more of the same.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you have a folder in your macOS Dock did you know that you can open the\nfolder directly in Finder by \u003ckbd\u003eOpt\u003c/kbd\u003e + \u003ckbd\u003eCmd\u003c/kbd\u003e + clicking it?\nNeat!\u003c/p\u003e\n\u003cp\u003eHat tip to \u003ca href=\"https://atp.fm/\"\u003eATP\u003c/a\u003e 🎩\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://railsdesigner.com/rails-partial-features/\"\u003eRails\u0026rsquo; Partial Features You (didn\u0026rsquo;t) Know\u003c/a\u003e \u0026ndash; I didn\u0026rsquo;t know a lot of these\npoints. Good article, but you could argue that there are \u003cem\u003etoo many\u003c/em\u003e ways to\nrender partials, and actually a more explicit default would be better. Like a\nlot of the cool magic that draws people into Rails, we\u0026rsquo;d be better off without\nit. Probably.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis weeks I learnt about the new CSS function \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/light-dark\"\u003e\u003ccode\u003elight-dark()\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe light-dark() CSS \u003ccolor\u003e function enables setting two colors for a\nproperty - returning one of the two colors options by detecting if the\ndeveloper has set a light or dark color scheme or the user has requested\nlight or dark color theme - without needing to encase the theme colors\nwithin a prefers-color-scheme media feature query.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVia \u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://bsky.app/profile/kelseyhightower.com/post/3lbcmw4olzk24\"\u003eSQLite inside Postgres anyone?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eJust when I thought I\u0026rsquo;ve seen it all, a PostgreSQL extension shows up that\nallows you to embed a SQLite database inside a table.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eGet the best of both worlds 🤪\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBlack Friday got a hold of me and I ordered some \u003ca href=\"https://www.philips-hue.com/\"\u003ePhilips Hue\u003c/a\u003e gear. For the\nlast fews weeks (since it\u0026rsquo;s been getting really dark at 4pm 😢) I\u0026rsquo;ve been\nthinking about lighting in my office. If I were a better typist this wouldn\u0026rsquo;t\nbe a problem, but I\u0026rsquo;m not, so.\u003c/p\u003e\n\u003cp\u003eI bought a couple of light strips and a hub to experiment with. And, of\ncourse, I immediately installed \u003ca href=\"https://www.home-assistant.io/\"\u003eHome Assistant\u003c/a\u003e because this is now going to\nbecome my life. I need something to fill it up with anyway.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnd to immediately undermine my rant above about delivery times, fair play to\nPhilips for delivering the goods to me quickly \u0026ndash; within 2 days in fact. Maybe\nnext though, they could send the items I bought rather than a random item I\u0026rsquo;ve\nnever heard of. Keep trying guys.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dashbit.co/blog/remix-concurrent-submissions-flawed\"\u003eRemix\u0026rsquo;s concurrent submissions are fundamentally flawed (without causal\nordering)\u003c/a\u003e \u0026ndash; always interesting from José.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy partner\u0026rsquo;s car was in for a service last week. These days a lot of main\ndealers send you a text with a report of issues they\u0026rsquo;ve found \u0026ndash; how modern.\nYou might have received one yourself. You can then review the items and accept\nor reject the work items.\u003c/p\u003e\n\u003cp\u003eImagine our surprise when a basic service led to an \u0026ldquo;URGENT\u0026rdquo; work item (in\nred, no less) where they wanted to more or less replace the entire exhaust\nsystem because a hose had come lose.\u003c/p\u003e\n\u003cp\u003eThis system, under the guise of modernity, seems to be in-place purely to\nscare the shit out of you so you panic click \u0026ldquo;Accept\u0026rdquo; and they make a nice\npremium on top. They back-tracked pretty quickly when we applied even the\nsmallest amount of scrutiny, saying \u0026ldquo;I wouldn\u0026rsquo;t bother, it will be fine\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eI think we can safely file them under \u0026ldquo;Cheeky Fuckers\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://elixirforum.com/t/new-community-maintained-otp-builds-for-macos/67338\"\u003eNew community-maintained OTP builds for macOS\u003c/a\u003e \u0026ndash; this is great. I\u0026rsquo;ve had\ntrouble in the past with compiling new Erlang versions with all the niceties\nsuch as \u003ccode\u003ewx\u003c/code\u003e and \u003ccode\u003eobserver\u003c/code\u003e, so having pre-compiled versions with everything\nbuilt-in is excellent.\u003c/p\u003e\n\u003cp\u003eThere\u0026rsquo;s already an \u003ca href=\"https://github.com/michallepicki/asdf-erlang-prebuilt-macos\"\u003e\u003ccode\u003easdf\u003c/code\u003e plugin\u003c/a\u003e too ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe went to see \u003ca href=\"https://en.wikipedia.org/wiki/Ivo_Graham\"\u003eIvo Graham\u003c/a\u003e on Wednesday, supported by \u003ca href=\"https://linktr.ee/alexkealy\"\u003eAlex Kealy\u003c/a\u003e. Both acts\nwere great. Being within walking distance of this sort of thing is one benefit\nof moving. Ivo also reminded me of LCD Soundsystem\u0026rsquo;s \u003ca href=\"https://open.spotify.com/track/2cmRpmO04TLaKPzmAzySYZ\"\u003eDance Yerself Clean\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/elixir-lang/elixir/pull/14003\"\u003eMake protocol errors pretty\u003c/a\u003e \u0026ndash; A nice Elixir quality of life improvement for\nerrors messages.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve actually made some progress on my side project but it\u0026rsquo;s still been very\nlittle, which has resulted in the usual amount of shame, guilt, and\ndisappointment.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA colleague was experiencing macOS kernel panic on their new MacBook Pro M4\nwhen running \u003ccode\u003erails server\u003c/code\u003e. I\u0026rsquo;ve never managed to kernel panic a Mac as long\nas I can remember, so this was very surprising indeed.\u003c/p\u003e\n\u003cp\u003eIt seems to be an Apple issue though. They\u0026rsquo;ve \u003ca href=\"https://developer.apple.com/documentation/macos-release-notes/macos-15_2-release-notes#Kernel\"\u003efixed it in macOS Sequoia 15.2\nBeta 4\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFixed: Resolved an issue where running Ruby with YJIT enabled causes Mac\nwith M4 chip to kernel panic. (139714575) (FB15774033)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI was surprised to see Apple explicitly mention Ruby in the release notes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVia \u003ca href=\"https://simonwillison.net/2024/Nov/16/nuextract-15/\"\u003eSimon Willison\u0026rsquo;s blog\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNuExtract 1.5. Structured extraction - where an LLM helps turn unstructured\ntext (or image content) into structured data - remains one of the most\ndirectly useful applications of LLMs.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe had a brief discussion at work about how object-orientated our app Rails\nis. I don\u0026rsquo;t believe that most Rails apps are very object-orientated at all.\nMost Rails apps are Rails apps, not Ruby apps.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://noelrappin.com/blog/2024/11/object-constellations/\"\u003eObject Constellations\u003c/a\u003e by Noel Rappin illustrates some proper OO techniques\nfor removing conditionals. There are ups and downs, of course. Everything is a\ntrade-off 🤪.\u003c/p\u003e\n\u003cp\u003eThe gem linked in the article, \u003ca href=\"https://github.com/wohlgejm/null_associations\"\u003enull_associations\u003c/a\u003e, is a cool idea too.\u003c/p\u003e\n\u003cp\u003eAgain, this might be my problem, but I think I would get push-back if I were\nto introduce a \u003ccode\u003eNullUser\u003c/code\u003e class into projects I\u0026rsquo;ve worked on, which is \u003cem\u003emaybe\u003c/em\u003e\na shame.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eBlimey it\u0026rsquo;s cold!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Christmas Present Buying Season once again reminds me why Amazon reigns\nsupreme \u0026ndash; delivery times from a lot of other companies are generally woeful.\nI understand that it must be nigh on impossible to compete with Amazon\u0026rsquo;s\nlogistics, but a lot of places are just like \u0026ldquo;you\u0026rsquo;ll get it one day,\nprobably\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis is a good \u003ca href=\"https://peterullrich.com/a-bluesky-starter-guide-for-elixir-devs\"\u003egetting started with Bluesky\u003c/a\u003e post should you wish to subject\nyourself to more of the same.\u003c/p\u003e",
      "date_published": "2024-11-24T00:00:00+00:00",
      "date_modified": "2024-11-24T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/177-an-afternoon-in-costa/",
      "url": "https://elver.me/weeknotes/177-an-afternoon-in-costa/",
      "title": "Weeknotes 177: An afternoon in Costa",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe “journaling suggestion” notifications that iOS produces are continuing to\npaint a sad picture of my life - “An afternoon in Costa Coffee” is not\nsomething I would ordinarily feel I need to process via a journal.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI created a \u003ca href=\"https://en.wikipedia.org/wiki/Bluesky\"\u003eBluesky\u003c/a\u003e account. I\u0026rsquo;m nothing if not a hypocrite.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/175-dramatization-do-not-attempt/#:~:text=placed%20an%20order%20for%20a%20new%20M4%20MacBook\"\u003enew computer\u003c/a\u003e arrived after I missed the first attempt at delivery when the\ncouriers arrived outside of the delivery window I was given. I\u0026rsquo;ve yet to set\nit up other than to connect to the WiFi and run software updates.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI saw this \u003ca href=\"https://github.com/speedshop/ids_must_be_indexed/tree/main\"\u003eids_must_be_indexed\u003c/a\u003e GitHub workflow and because it\u0026rsquo;s written in\nBash it\u0026rsquo;s a very lightweight addition to any CI. It didn\u0026rsquo;t work for me on\nGitHub unfortunately.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/folke/snacks.nvim?tab=readme-ov-file\"\u003esnacks.nvim\u003c/a\u003e by folke. A similar idea to \u003ca href=\"https://github.com/echasnovski/mini.nvim\"\u003emini.nvim\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt sounds like the first version of an official Elixir LSP will be out with\nElixir 1.18.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe official Elixir LSP should be out with the next @elixirlang version, 1.18.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVia \u003ca href=\"https://x.com/NickGnd/status/1846103330352697455\"\u003e@NickGnd\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ronjeffries.com/articles/-x024/biot/-bs70/s/\"\u003eSmall Steps\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSome thoughts on choosing small steps. I think it’s always possible. Is it\nalways the right way to go? I issue a challenge to myself.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://justin.searls.co/mails/2024-10/#a-new-kind-of-job-market\"\u003eJustin Searls\u0026rsquo; essay on the current job market\u003c/a\u003e is an interesting read. I\nthink a lot of this rings true, and it made me reflect on my own position.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOne of my side project ideas a few months ago was to build a customer\ncommunication platform similar to Intercom \u0026ndash; not to start a business, but as\na real-life example of a project. I got as far as mocking-up a simple UI for\nthe \u0026ldquo;chat\u0026rdquo; interface, but didn\u0026rsquo;t go any further with it.\u003c/p\u003e\n\u003cp\u003eI would\u0026rsquo;ve chosen Elixir and Phoenix for this, for the reasons I\u0026rsquo;ve written\nabout before. If there was ever a \u003ca href=\"https://world.hey.com/dhh/the-one-person-framework-711e6318\"\u003eone person framework\u003c/a\u003e, this is it.\u003c/p\u003e\n\u003cp\u003eWell, it seems that someone else has been building such a thing called\n\u003ca href=\"https://github.com/papercups-io/papercups\"\u003ePapercups\u003c/a\u003e, in Elixir, but for the last few years and it has developed an\nimpressive amount of features. Check out \u003ca href=\"https://www.romaglushko.com/blog/papercups/\"\u003ethis interesting blog post the\nfeature set\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.campsite.com/blog/how-we-made-a-ruby-method-200x-faster\"\u003eHow we made a Ruby method 200x faster\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wrote some test cases with AI for the time this week. It was surprisingly\ngood at it. Of course I had to tweak and test them, but it took the grunt work\nout of the task.\u003c/p\u003e\n\u003cp\u003eWhen I come across some code which I’d like to refactor if it’s untested\ntheres an extra obstacle in the way of that change happening. If AI can help\nme quickly test it, that\u0026rsquo;s a good thing.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe “journaling suggestion” notifications that iOS produces are continuing to\npaint a sad picture of my life - “An afternoon in Costa Coffee” is not\nsomething I would ordinarily feel I need to process via a journal.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI created a \u003ca href=\"https://en.wikipedia.org/wiki/Bluesky\"\u003eBluesky\u003c/a\u003e account. I\u0026rsquo;m nothing if not a hypocrite.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/175-dramatization-do-not-attempt/#:~:text=placed%20an%20order%20for%20a%20new%20M4%20MacBook\"\u003enew computer\u003c/a\u003e arrived after I missed the first attempt at delivery when the\ncouriers arrived outside of the delivery window I was given. I\u0026rsquo;ve yet to set\nit up other than to connect to the WiFi and run software updates.\u003c/p\u003e",
      "date_published": "2024-11-17T00:00:00+00:00",
      "date_modified": "2024-11-17T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/176-not-renewed/",
      "url": "https://elver.me/weeknotes/176-not-renewed/",
      "title": "Weeknotes 176: Not renewed",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe spent the first few days of the week down south. I managed to catch up with\nseveral people I haven\u0026rsquo;t seen in a while, which was worth the trip. I was glad\nto get home though. I guess this is a good sign.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe plans we have for the house are starting to firm up. We now have drawings,\nwhich will soon be submitted to the council for planning approval. The\nbeginning of many headaches I fear.\u003c/p\u003e\n\u003cp\u003eThe amount of decision making that is going to be necessary for the\nrenovations to take place is a bit overwhelming.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI attended another local meetup group this week. It\u0026rsquo;s good to be getting back\ninto the swing of things. Having something to focus on that is regular is a\ngood thing for my routine.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHeroku is expensive, but \u003ca href=\"https://x.com/yongfook/status/1853047127947305364\"\u003ehe\u0026rsquo;s not wrong\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHot take: it’s trending right now but indiehackers launching on a VPS are\ncreating infra overhead for themselves that could be better spent on\nbuilding product or doing marketing.\u003c/p\u003e\n\u003cp\u003eIf you’re a solo founder I still think Heroku is the best fit, and I’ll die\non that hill.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.themoviedb.org/tv/204154-scavengers-reign\"\u003eScavengers Reign\u003c/a\u003e which I \u003ca href=\"/weeknotes/123-this-isnt-for-you-its-for-me/#:~:text=really%20good\"\u003ereally enjoyed last year\u003c/a\u003e has \u003ca href=\"https://www.instagram.com/p/DB-DuB5Se07/\"\u003eunfortunately not\nbeen renewed\u003c/a\u003e for second season. I hope they can get it off the ground some\nother way.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe new computer arrives tomorrow so I spent some time tidying up my dotfiles,\nwhich are in a constant state of flux as I try out random snippets of Lua I\nfound on the Internet.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome small progress on my new side project this week. I\u0026rsquo;ve been thinking about\nstarting a development journal of sorts, so I can get my thoughts down on\nprogress. I tend to see all problems as too difficult for me to solve, but if\nI do solve them then I attribute that to luck, or pick holes in the solution.\nMaybe writing down what has been done will help.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe spent the first few days of the week down south. I managed to catch up with\nseveral people I haven\u0026rsquo;t seen in a while, which was worth the trip. I was glad\nto get home though. I guess this is a good sign.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe plans we have for the house are starting to firm up. We now have drawings,\nwhich will soon be submitted to the council for planning approval. The\nbeginning of many headaches I fear.\u003c/p\u003e",
      "date_published": "2024-11-10T00:00:00+00:00",
      "date_modified": "2024-11-10T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/175-dramatization-do-not-attempt/",
      "url": "https://elver.me/weeknotes/175-dramatization-do-not-attempt/",
      "title": "Weeknotes 175: Dramatization. Do not attempt.",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI came down with a cold during our trip Edinburgh. This is what happens when\nyou leave the house. I\u0026rsquo;m feeling congested, but otherwise fine now though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter some deliberation about nano texture screen coatings I \u003ca href=\"/weeknotes/173-program-like-an-idiot/#:~:text=There%20are%20new%20computers%20due%20from%20Apple%20very%20soon\"\u003ebit the bullet\u003c/a\u003e\nand placed an order for a new M4 MacBook. I\u0026rsquo;ve gone for the Pro chip. The Max\njust seems so far beyond what I need, and with the configuration I\u0026rsquo;ve chosen\nI\u0026rsquo;ll still be tripling the RAM and doubling my disk space, so it\u0026rsquo;s a very nice\nupgrade. And of course, in black. It should arrive in just over a week.\u003c/p\u003e\n\u003cp\u003e(I didn\u0026rsquo;t opt for the nano texture based my current machine not having it and\nthat hasn\u0026rsquo;t been a problem for me).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe took a trip down south over the weekend to visit friends. It remains a long\nway to drive. We decided to stay in a Premier Inn instead of the old place. I\nstill feel weird about going back there.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs a fan of the \u003ca href=\"https://en.wikipedia.org/wiki/The_Lord_of_the_Rings_(film_series)\"\u003eThe Lord of the Rings films\u003c/a\u003e, I\u0026rsquo;ve been meaning to read the\nbooks for a long time. Unfortunately, I have the reading age of a small child,\nand when I previously tried to read them I got no where fast. Instead I\u0026rsquo;ve\ndecided to try the audiobook versions read by Andy Serkis.\u003c/p\u003e\n\u003cp\u003eIn the past I\u0026rsquo;ve attempted to use Apple Music for audiobooks, but the syncing\nof books it always a pain, and the app is not really suited to the task.\nInstead I\u0026rsquo;ve opted to co-opt Plex into the job combined with \u003ca href=\"https://apps.apple.com/us/app/prologue/id1459223267\"\u003ePrologue\u003c/a\u003e. I\u0026rsquo;ll\nsee how it goes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt \u003ca href=\"https://www.youtube.com/shorts/mKp30PNM_Q4\"\u003esounds like Oban Web\u003c/a\u003e is going to become an open source product. I think\nParker is correct that it will affect the adoption of Oban as a whole because\nOban Web is extremely compelling, and you often can\u0026rsquo;t afford to pay for it\nuntil your project is making money later\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFucking dark isn\u0026rsquo;t it? Better remind myself to take those Vitamin D\nsupplements.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI came down with a cold during our trip Edinburgh. This is what happens when\nyou leave the house. I\u0026rsquo;m feeling congested, but otherwise fine now though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter some deliberation about nano texture screen coatings I \u003ca href=\"/weeknotes/173-program-like-an-idiot/#:~:text=There%20are%20new%20computers%20due%20from%20Apple%20very%20soon\"\u003ebit the bullet\u003c/a\u003e\nand placed an order for a new M4 MacBook. I\u0026rsquo;ve gone for the Pro chip. The Max\njust seems so far beyond what I need, and with the configuration I\u0026rsquo;ve chosen\nI\u0026rsquo;ll still be tripling the RAM and doubling my disk space, so it\u0026rsquo;s a very nice\nupgrade. And of course, in black. It should arrive in just over a week.\u003c/p\u003e",
      "date_published": "2024-11-03T00:00:00+00:00",
      "date_modified": "2024-11-03T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/174-haggis-ruby/",
      "url": "https://elver.me/weeknotes/174-haggis-ruby/",
      "title": "Weeknotes 174: Haggis Ruby",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/173-program-like-an-idiot/#:~:text=unremarkable%20ticket%20I%20was%20working%20on%20suddenly%20became%20important\"\u003eThe work thing\u003c/a\u003e I was stressing about unnecessarily has now gone to\nproduction, so that\u0026rsquo;s that. For now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitchellh.com/writing/ghostty-is-coming\"\u003eGhostty 1.0 is Coming\u003c/a\u003e and I\u0026rsquo;m interested in trying it when it is released in\nDecember.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;\u003ca href=\"https://github.com/tris203/precognition.nvim\"\u003eprecognition.nvim\u003c/a\u003e assists with discovering motions (Both vertical and\nhorizontal) to navigate your current buffer \u0026ndash; I\u0026rsquo;m trying this out to try and\nget better at Motions.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://haggisruby.co.uk/\"\u003eHaggis Ruby\u003c/a\u003e was on Thursday this week, so I travelled up to Edinburgh on\nthe train Wednesday afternoon.\u003c/p\u003e\n\u003cp\u003eIt was, from my perspective, a great success! This shouldn\u0026rsquo;t be a massive\nsurprised given the heritage of the organisers. Very well attended, and it\nseemed to go off without a hitch.\u003c/p\u003e\n\u003cp\u003eI enjoyed this conference a lot more than my recent Rails World experience,\nand although I enjoyed the talks (in particular \u003ca href=\"https://rosa.codes/\"\u003eRosa Gutierrez\u0026rsquo;s on UTF-8\u003c/a\u003e),\nthe main reason was the opportunity to catch up with people I haven\u0026rsquo;t seen for\na long time. Past colleagues who I\u0026rsquo;ve never met in person; meetup attendees\nfrom long dissolved Ruby User Groups of past; you name it. Needless to say, it\nwas GREAT to catch-up.\u003c/p\u003e\n\u003cp\u003eLong may Haggis Ruby continue if for no reason than it selfishly gives me\nanother opportunity in the year, other than Brighton Ruby, to see people.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe took the opportunity of me being in Edinburgh already to extend the trip\n(as is my want) and do some sight seeing.\u003c/p\u003e\n\u003cp\u003eEdinburgh is a city full of amazing views. It feels like everywhere you look\nthere is something nice to look at. At least in the very centre, where we\nspent most of our time.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs you\u0026rsquo;ll know from \u003ca href=\"/weeknotes/153-overwhelmed/#:~:text=Rubocop\"\u003evarious\u003c/a\u003e \u003ca href=\"/weeknotes/154-loathe-to-call-this-a-success/#:~:text=Rubocop\"\u003etimes\u003c/a\u003e I\u0026rsquo;ve ranted about Rubocop, I think a lot\nof the defaults are, in a word, bonkers. They don\u0026rsquo;t reflect a lot of the\nidiomatic Ruby code I\u0026rsquo;ve seen through the years.\u003c/p\u003e\n\u003cp\u003eHowever, changing those defaults results in \u003ca href=\"https://en.wiktionary.org/wiki/bikeshedding\"\u003ebikeshedding\u003c/a\u003e and arguments (we\nshould just be using \u003ca href=\"https://github.com/standardrb/standard\"\u003estandard\u003c/a\u003e, alas). Still, I submitted a PR this week\nwhich changed the configuration of \u003ccode\u003eMetrics/MethodLength\u003c/code\u003e. It can treat\n\u003ca href=\"https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Metrics/MethodLength#:~:text=to%20fold%20with%20%E2%80%98-,CountAsOne,-%60.\"\u003eArray and Hash definitions as a single line\u003c/a\u003e when counting the method size,\nthis means that simple code that just returns either an array or hash is now\npossible even if it exceeds the overall length of the method.\u003c/p\u003e\n\u003cp\u003eI was expecting a lot of push back on this change, so imagine my surprise when\nit wasn\u0026rsquo;t just approved, but approved by several people with positive\nfeedback.\u003c/p\u003e\n\u003cp\u003eThe fact I thought it wasn\u0026rsquo;t going to go this way probably says more about my\npsychology than anything.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/173-program-like-an-idiot/#:~:text=unremarkable%20ticket%20I%20was%20working%20on%20suddenly%20became%20important\"\u003eThe work thing\u003c/a\u003e I was stressing about unnecessarily has now gone to\nproduction, so that\u0026rsquo;s that. For now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitchellh.com/writing/ghostty-is-coming\"\u003eGhostty 1.0 is Coming\u003c/a\u003e and I\u0026rsquo;m interested in trying it when it is released in\nDecember.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;\u003ca href=\"https://github.com/tris203/precognition.nvim\"\u003eprecognition.nvim\u003c/a\u003e assists with discovering motions (Both vertical and\nhorizontal) to navigate your current buffer \u0026ndash; I\u0026rsquo;m trying this out to try and\nget better at Motions.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://haggisruby.co.uk/\"\u003eHaggis Ruby\u003c/a\u003e was on Thursday this week, so I travelled up to Edinburgh on\nthe train Wednesday afternoon.\u003c/p\u003e",
      "date_published": "2024-10-27T00:00:00+00:00",
      "date_modified": "2024-10-27T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/173-program-like-an-idiot/",
      "url": "https://elver.me/weeknotes/173-program-like-an-idiot/",
      "title": "Weeknotes 173: Program like an idiot",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eBusy, busy week after an unremarkable ticket I was working on suddenly became\nimportant. It isn\u0026rsquo;t \u003cem\u003equite\u003c/em\u003e done yet, but it\u0026rsquo;s under control after some nice\ncollaboration. It\u0026rsquo;s good to feel supported occasionally after so much siloed\nworking.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=ea9reHDIrOo\"\u003e\u0026ldquo;Just program like you\u0026rsquo;re an idiot\u0026rdquo;\u003c/a\u003e \u0026ndash; amen!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://stdgems.org/\"\u003eRuby Standard Gems\u003c/a\u003e - A useful reference for which gems, and their versions,\nare installed in the Ruby standard library.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThere are new computers due from Apple very soon and I think I\u0026rsquo;m ready to\nupgrade. In a lot of ways the computer I\u0026rsquo;m using now, the MacBook Air M1\nbought in 2021, is still great for my needs. It never feels slow and I love\nthe portability.\u003c/p\u003e\n\u003cp\u003eHowever, there are two things that are not quite perfect 1) the battery is no\nlonger what is was. I\u0026rsquo;ve gone from literally \u003cem\u003enever\u003c/em\u003e worrying about power when\nI\u0026rsquo;m out and about, to having to be aware that I\u0026rsquo;m fully charged when I leave\nthe house and also sometimes charging on the go; and 2) since \u003ca href=\"/weeknotes/154-loathe-to-call-this-a-success/#:~:text=I%20knocked%20half%20an%20Oat%20Mocha%20over%20my%20computer\"\u003eMocha-gate\u003c/a\u003e one\nof the two USB-C ports does not work, and I could do with getting this\nproperly cleaned under AppleCare.\u003c/p\u003e\n\u003cp\u003eBut\u0026hellip;the new computers are apparently not Airs, and do I want to give up the\nextreme portability that I\u0026rsquo;ve enjoyed from this one?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.railsbump.org/\"\u003eRailsBump\u003c/a\u003e might be useful for checking whether the gems you\u0026rsquo;re using in your\nRails app are compatible with different Rails versions.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSam Stephenson released a productivity/concentration app a while ago called\n\u003ca href=\"https://n10.app/\"\u003eN10\u003c/a\u003e which I bought this week and I am trying it out. Sam has given so much\nto the community so I decided to give back in this small way.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;ParadeDB is a modern Elasticsearch alternative built on Postgres. Built for\nreal-time, update-heavy workloads.\u0026rdquo; \u0026ndash; this seems cool.\u003c/p\u003e\n\u003cp\u003eI was watching \u003ca href=\"https://www.youtube.com/watch?v=DIC9iJDrKBs\"\u003ethis interview with Jesse Hanley\u003c/a\u003e of \u003ca href=\"https://bentonow.com/\"\u003eBento\u003c/a\u003e this week where\nhe mentions that he does basically all his querying of data, with the\nexception of simple \u003ccode\u003eSELECT\u003c/code\u003es via primary key, via \u003ca href=\"https://en.wikipedia.org/wiki/Elasticsearch\"\u003eElasticsearch\u003c/a\u003e because\nthat\u0026rsquo;s what it is built for. An interesting technique and I\u0026rsquo;m glad it works\nfor him (the rest of interview is very interesting too), but I wonder if it\ncould all be done inside Postgres with \u003ca href=\"https://www.paradedb.com/\"\u003eParadeDB\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIncidentally, if you wanna use ParadeDB with Elixir\u0026rsquo;s Ecto you can do so with\n\u003ca href=\"https://moosie.us/paradex\"\u003eParadex\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://world.hey.com/dhh/passwords-have-problems-but-passkeys-have-more-95285df9%5D\"\u003ePasswords have problems, but passkeys have more\u003c/a\u003e \u0026ndash; I have to say I am\nlukewarm on passkeys too. (This agreement is becoming a worrying habit).\u003c/p\u003e\n\u003cp\u003eI have yet to create a single Passkey. I just don\u0026rsquo;t trust them yet, and as\n\u003ca href=\"https://daringfireball.net/linked/2024/10/17/dhh-argues-against-passkeys\"\u003eGruber has said\u003c/a\u003e (what is happening to me?) \u0026ndash; \u0026ldquo;if you’re using a proper\npassword manager, your passwords should all be unique and random\u0026rsquo; \u0026ndash; which is\nthe case for me. I currently see Passkeys as a way for me to potentially lose\naccess to an account, whilst having no upside.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.websitecarbon.com/\"\u003eCalculate the carbon footprint of your website\u003c/a\u003e \u0026ndash; I don\u0026rsquo;t wanna brag (I do)\nbut this website gets an A+. Simply create a text only website and you too can\nsave the world.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been exploring \u003ca href=\"https://en.wikipedia.org/wiki/Tindersticks\"\u003eTindersticks\u003c/a\u003e\u0026rsquo; back catalogue a bit this week. \u003ca href=\"https://open.spotify.com/track/24ZFJvPZB1viPZVkHLFLE6?si=0c94407857ae48aa\"\u003e\u0026ldquo;The Not\nKnowing\u0026rdquo;\u003c/a\u003e is lovely.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eBusy, busy week after an unremarkable ticket I was working on suddenly became\nimportant. It isn\u0026rsquo;t \u003cem\u003equite\u003c/em\u003e done yet, but it\u0026rsquo;s under control after some nice\ncollaboration. It\u0026rsquo;s good to feel supported occasionally after so much siloed\nworking.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=ea9reHDIrOo\"\u003e\u0026ldquo;Just program like you\u0026rsquo;re an idiot\u0026rdquo;\u003c/a\u003e \u0026ndash; amen!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://stdgems.org/\"\u003eRuby Standard Gems\u003c/a\u003e - A useful reference for which gems, and their versions,\nare installed in the Ruby standard library.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThere are new computers due from Apple very soon and I think I\u0026rsquo;m ready to\nupgrade. In a lot of ways the computer I\u0026rsquo;m using now, the MacBook Air M1\nbought in 2021, is still great for my needs. It never feels slow and I love\nthe portability.\u003c/p\u003e",
      "date_published": "2024-10-20T00:00:00+00:00",
      "date_modified": "2024-10-20T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/172-polygon-click-target/",
      "url": "https://elver.me/weeknotes/172-polygon-click-target/",
      "title": "Weeknotes 172: Polygon click target",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI finished off the second series of \u003ca href=\"/weeknotes/171-don-t-believe-all-the-hype/#:~:text=series%20from%202016%2C-,Flowers,-%2C%20is%20really%20good\"\u003eFlowers\u003c/a\u003e this week.\u003c/p\u003e\n\u003cp\u003eHonestly, it\u0026rsquo;s superb.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://buttondown.com/hillelwayne/archive/goodharts-law-in-software-engineering/\"\u003eGoodhart\u0026rsquo;s Law in Software Engineering\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen a measure becomes a target, it ceases to be a good measure.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHey 100% code coverage 👋\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://medium.com/@beard-programmer/service-objects-as-functions-a-functional-approach-to-build-business-flows-in-ruby-on-rails-bf34bf18331d\"\u003eService Objects as Functions: A functional approach to build business flows\nin Ruby on Rails\u003c/a\u003e \u0026ndash; I thought this was interesting.\u003c/p\u003e\n\u003cp\u003eIncidentally, I\u0026rsquo;ve been wondering how hard refactoring is in a non-OOP\nlanguage because I don\u0026rsquo;t have very much experience outside Ruby. When\nrefactoring with Ruby it feels like there are so many options, and choosing a\npath is difficult.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI have somehow managed to not know about \u003ca href=\"https://json5.org/\"\u003eJSON5\u003c/a\u003e, a \u003ca href=\"https://en.wikipedia.org/wiki/JSON#JSON5\"\u003esuperset of JSON\u003c/a\u003e which\nhas support for human features such as\u0026hellip;.comments! I\u0026rsquo;m not sure how wide\nspread it is though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=Df_K7pIsfvg\"\u003eCabel Sasser, Panic - XOXO Festival (2024)\u003c/a\u003e \u0026ndash; watch this please. Brought a\ntear to my eye.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI worked on some refactoring this week for the first time in a while and it\nfelt good. Some collaboration was also involved, so that was novel and very\nwelcome.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnd I  used Ruby\u0026rsquo;s \u003ccode\u003eEnumerable#tally\u003c/code\u003e for the first time in production code\ntoo. Very satisfying when you can leverage Ruby\u0026rsquo;s rich standard library.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://kk.org/thetechnium/1000-true-fans/\"\u003e1,000 True Fans\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAs far as I can tell there is nothing — no product, no idea, no desire —\nwithout a fan base on the internet. Every thing made, or thought of, can\ninterest at least one person in a million — it’s a low bar. Yet if even only\none out of million people were interested, that’s potentially 7,000 people\non the planet. That means that any 1-in-a-million appeal can find 1,000 true\nfans.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI heard about this article from \u003ca href=\"https://en.wikipedia.org/wiki/Tobias_L%C3%BCtke\"\u003eTobi Lütke\u003c/a\u003e during the \u003ca href=\"https://www.youtube.com/watch?v=zPBbHu-BKpQ\"\u003eFireside Chat with\nDHH and Matz at Rails World 2024\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://world.hey.com/dhh/automattic-is-doing-open-source-dirty-b95cf128\"\u003eAutomattic is doing open source dirty\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe terms of the deal are spelled out in the license agreement\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIf you set out a licence, and then someone follows that licence.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://walnut356.github.io/posts/language-documentation/\"\u003eWhy is language documentation still so terrible?\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eRust is given as a good example of language docs, and I wholeheartedly agree.\nThe Elixir docs are also excellent. Ruby\u0026rsquo;s are unfortunately not.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.kickstarter.com/projects/electr/ble-caberqu-a-digital-usb-c-to-usb-c-cable-tester?rdt_cid=4451609530094436111\"\u003eBLE caberQU: a digital USB-C to USB-C cable tester\u003c/a\u003e \u0026ndash; a version of the\n\u003ca href=\"/weeknotes/116-consumer-whore/#:~:text=To%20aid%20in%20that%20quest\"\u003ecable tester I already have\u003c/a\u003e but with a cool screen on it!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDid you know that it\u0026rsquo;s possible to have \u003ca href=\"https://css-tricks.com/the-many-ways-to-link-up-shapes-and-images-with-html-and-css/#aa-svg-shapes\"\u003enon-square click targets in HTML\u003c/a\u003e?\u003c/p\u003e\n\u003cp\u003eIn fact, for SVGs it\u0026rsquo;s as simple as putting a \u003ccode\u003e\u0026lt;a\u0026gt;\u003c/code\u003e around the particular path\nin question \u003cem\u003einside\u003c/em\u003e the SVG, and the target will automatically be the same\nshape.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI finished off the second series of \u003ca href=\"/weeknotes/171-don-t-believe-all-the-hype/#:~:text=series%20from%202016%2C-,Flowers,-%2C%20is%20really%20good\"\u003eFlowers\u003c/a\u003e this week.\u003c/p\u003e\n\u003cp\u003eHonestly, it\u0026rsquo;s superb.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://buttondown.com/hillelwayne/archive/goodharts-law-in-software-engineering/\"\u003eGoodhart\u0026rsquo;s Law in Software Engineering\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen a measure becomes a target, it ceases to be a good measure.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHey 100% code coverage 👋\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://medium.com/@beard-programmer/service-objects-as-functions-a-functional-approach-to-build-business-flows-in-ruby-on-rails-bf34bf18331d\"\u003eService Objects as Functions: A functional approach to build business flows\nin Ruby on Rails\u003c/a\u003e \u0026ndash; I thought this was interesting.\u003c/p\u003e\n\u003cp\u003eIncidentally, I\u0026rsquo;ve been wondering how hard refactoring is in a non-OOP\nlanguage because I don\u0026rsquo;t have very much experience outside Ruby. When\nrefactoring with Ruby it feels like there are so many options, and choosing a\npath is difficult.\u003c/p\u003e",
      "date_published": "2024-10-13T00:00:00+00:00",
      "date_modified": "2024-10-13T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/171-don-t-believe-all-the-hype/",
      "url": "https://elver.me/weeknotes/171-don-t-believe-all-the-hype/",
      "title": "Weeknotes 171: Don't believe all the hype",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/168-early-return/#:~:text=I%20bet%20that%20no%20one%20even%20checks%20it%20when%20I%20travel\"\u003eThey did check the passport!\u003c/a\u003e \u0026ndash; well, technically it was British Airways\nstaff that checked it before flying, but I still needed it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitchellh.com/writing/zig-donation\"\u003eMitchell Hashimoto has pledged\u003c/a\u003e to \u003ca href=\"https://ziglang.org/news/300k-from-mitchellh/\"\u003edonate £300k to the Zig Software\nFoundation\u003c/a\u003e. I might give Zig a go.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/169-text-objects/#:~:text=Rails%20World%20is%20next%20week\"\u003eAs you\u0026rsquo;ll be aware\u003c/a\u003e, I was at Rails World last week. With all the travelling\nI hadn\u0026rsquo;t had time to contemplate my thoughts. But I just about have now.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI didn\u0026rsquo;t have a \u003cem\u003egreat time\u003c/em\u003e, and I\u0026rsquo;m wondering if it\u0026rsquo;s them or me. Maybe\nthis is just not for me anymore.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eToronto was nice enough, but I wouldn\u0026rsquo;t feel the need to go back any time\nsoon. Having only ever been to Nova Scotia before it was a shock to the\nsystem.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTalks from Aaron Patterson and Justin Searls were the highlights for me.\nUnsurprising as they consistently deliver interesting talks well. I also\nenjoyed the various SQLite content.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI don\u0026rsquo;t know why conferences don\u0026rsquo;t make sure that the seating is comfortable\nbut I would imagine that it involves the difficulty in getting thousands of\nchairs in one place.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThere was a lot of emphasis on Rails being a one person framework, and in\nparticular the deployment of Rails with new tools like \u003ca href=\"https://kamal-deploy.org/\"\u003eKamal\u003c/a\u003e \u003ca href=\"https://dev.37signals.com/kamal-2/\"\u003enow on\nversion 2\u003c/a\u003e. However, some of the rhetoric leaves out of lot of subtly, as\nusual.\u003c/p\u003e\n\u003cp\u003eThe pricing of Heroku \u003cem\u003eis\u003c/em\u003e ridiculous in 2024, and you \u003cem\u003ecan\u003c/em\u003e rent a server\nat Hetzner with a lot of power for a lot less money these days. And Kamal\ndoes \u003cem\u003elook\u003c/em\u003e like (having not used it) it simplifies getting your Rails app\ndeployed.\u003c/p\u003e\n\u003cp\u003eBut ease of initial setup is not the only reason that people use a platform\nlike Heroku. Once you have setup your Linux VPS with Docker, and your\ncontainer is running, and serving your website, what about maintenance?\u003c/p\u003e\n\u003cp\u003eWho is patching the underlying host system? You. Who is rotating logs? You.\nWho is increasing the disk size when it runs out of space? You. Heroku do\nall that for you, and that\u0026rsquo;s why you pay.\u003c/p\u003e\n\u003cp\u003eWe hear about Shopify and GitHub all the time, but the majority of Rails\napps are tiny in comparison and using a VPS on Hetzner for that is a good\noption. Just don\u0026rsquo;t believe all the hype.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNext year the conference is back in Amsterdam, which is disappointing. If\nI\u0026rsquo;m going to pay a lot of money to attend an event I don\u0026rsquo;t even love then it\ncan at least be in a place I would like to visit. Or the very least\nsomewhere other than where it\u0026rsquo;s already been.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eApart from the conference itself we spent some extra time in Toronto, and at\nNiagara Falls.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been to the Falls before, but I was 5 years old at the time, so it was a\ngood as new experience for me. We did all the touristy stuff you would expect:\na night time boat trip to the Falls for the nightly fireworks, a visit to the\npower station, \u003ca href=\"https://en.wikipedia.org/wiki/Whirlpool_Aero_Car\"\u003ecable car\u003c/a\u003e across the \u003ca href=\"https://en.wikipedia.org/wiki/Niagara_Gorge\"\u003eNiagara Gorge\u003c/a\u003e, and white water walk by\nthe river \u0026ndash; a highlight!\u003c/p\u003e\n\u003cp\u003eI was glad to have visited, and glad to leave the madness.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhilst in Toronto I discovered the \u003ca href=\"https://en.wikipedia.org/wiki/London_fog_(drink)\"\u003eLondon Fog\u003c/a\u003e, and it\u0026rsquo;s cousin the Lavender\nFog (a London Fog with Lavender infused flavours).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRails 8 is to get an authentication generator \u0026ndash; \u003ca href=\"https://dashbit.co/blog/a-new-authentication-solution-for-phoenix\"\u003ewhat a good idea\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve thought of a new side project!\u003c/p\u003e\n\u003cp\u003eYeah, I know. I\u0026rsquo;ve already given up, don\u0026rsquo;t worry.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://departuremono.com/\"\u003eDeparture Mono\u003c/a\u003e [Via \u003ca href=\"https://simplebits.shop/\"\u003eSimple Bits\u003c/a\u003e newsletter]\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDeparture Mono is a monospaced pixel font with a lo-fi technical vibe\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eLovely website.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI booked to see Daniel Kitson again, solo this time, in Manchester. I hope\nno one \u003ca href=\"/weeknotes/151-dumbfounded/#:~:text=the%20whole%20event%20was%20ruined%20by%20a%20couple%20who%20tried%20to%20essentially%20bully%20us%20out%20of%20our%20seats\"\u003etries to steal my seat this time\u003c/a\u003e and that the PTSD doesn\u0026rsquo;t kick in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://justin.searls.co/shots/2024-10-04-07h02m01s/\"\u003eI hate code review less now\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBut instead of waiting hours for feedback I\u0026rsquo;m waiting for literal seconds.\nThere\u0026rsquo;s also zero ego, politics, or posturing. And while it does hallucinate\nbullshit, there\u0026rsquo;s far less of it than one can expect from bleary-eyed\ndevelopers squinting at the GitHub web UI looking for a way to score points.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eTruth.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe TV series from 2016, \u003ca href=\"https://www.themoviedb.org/tv/66230-flowers\"\u003eFlowers\u003c/a\u003e, is really good.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/168-early-return/#:~:text=I%20bet%20that%20no%20one%20even%20checks%20it%20when%20I%20travel\"\u003eThey did check the passport!\u003c/a\u003e \u0026ndash; well, technically it was British Airways\nstaff that checked it before flying, but I still needed it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitchellh.com/writing/zig-donation\"\u003eMitchell Hashimoto has pledged\u003c/a\u003e to \u003ca href=\"https://ziglang.org/news/300k-from-mitchellh/\"\u003edonate £300k to the Zig Software\nFoundation\u003c/a\u003e. I might give Zig a go.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/169-text-objects/#:~:text=Rails%20World%20is%20next%20week\"\u003eAs you\u0026rsquo;ll be aware\u003c/a\u003e, I was at Rails World last week. With all the travelling\nI hadn\u0026rsquo;t had time to contemplate my thoughts. But I just about have now.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI didn\u0026rsquo;t have a \u003cem\u003egreat time\u003c/em\u003e, and I\u0026rsquo;m wondering if it\u0026rsquo;s them or me. Maybe\nthis is just not for me anymore.\u003c/p\u003e",
      "date_published": "2024-10-06T00:00:00+00:00",
      "date_modified": "2024-10-06T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/170-check-yo-timezones/",
      "url": "https://elver.me/weeknotes/170-check-yo-timezones/",
      "title": "Weeknotes 170: Check yo timezones",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou think this is late, but no, check yo timezones.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m in Canada because I attended Rails World 2024 on Thursday and Friday. A\ngood opportunity to have a holiday. I\u0026rsquo;ll make an effort to summarize Rails\nWorld next week. Probably.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ia.net/topics/our-android-app-is-frozen-in-carbonite\"\u003eOur Android App is Frozen in Carbonite\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGoogle’s chaos makes Apple’s control seem reasonable.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://futurism.com/neoscope/paralyzed-man-exoskeleton-too-old\"\u003eParalyzed Man Unable to Walk After Maker of His Powered Exoskeleton Tells Him\nIt\u0026rsquo;s Now Obsolete\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFortunately, Lifeward eventually capitulated and Straight was able to get\nhis exoskeleton repaired — but that was only after an intense campaign in\nwhich he went on local TV, got highlighted in a horse industry publication,\nand gained steam on social media.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eOh course they did.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://openfreemap.org/\"\u003eOpenFreeMap\u003c/a\u003e \u0026ndash; OpenFreeMap lets you display custom maps on your website and\napps for free.\u003c/p\u003e\n\u003cp\u003eNo more broken Google Maps due to missing or expired API keys.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis Week I Learnt about \u003ca href=\"https://en.m.wikipedia.org/wiki/Lindy_effect\"\u003ethe Lindy effect\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe Lindy effect (also known as Lindy\u0026rsquo;s Law[1]) is a theorized phenomenon by\nwhich the future life expectancy of some non-perishable things, like a\ntechnology or an idea, is proportional to their current age. Thus, the Lindy\neffect proposes the longer a period something has survived to exist or be\nused in the present, the longer its remaining life expectancy.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e[Via \u003ca href=\"https://avdi.codes/how-to-cope-with-technology-fomo/\"\u003eHow to cope with technology FOMO\u003c/a\u003e].\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou think this is late, but no, check yo timezones.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m in Canada because I attended Rails World 2024 on Thursday and Friday. A\ngood opportunity to have a holiday. I\u0026rsquo;ll make an effort to summarize Rails\nWorld next week. Probably.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ia.net/topics/our-android-app-is-frozen-in-carbonite\"\u003eOur Android App is Frozen in Carbonite\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGoogle’s chaos makes Apple’s control seem reasonable.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://futurism.com/neoscope/paralyzed-man-exoskeleton-too-old\"\u003eParalyzed Man Unable to Walk After Maker of His Powered Exoskeleton Tells Him\nIt\u0026rsquo;s Now Obsolete\u003c/a\u003e\u003c/p\u003e",
      "date_published": "2024-09-29T00:00:00+00:00",
      "date_modified": "2024-09-29T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/169-text-objects/",
      "url": "https://elver.me/weeknotes/169-text-objects/",
      "title": "Weeknotes 169: Text objects",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTIL that \u003ca href=\"https://en.wikipedia.org/wiki/CockroachDB\"\u003eCockroachDB\u003c/a\u003e is Postgres compatible.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mastodon.social/@marcoarment/113176871729373771\"\u003eMarco Arment on Overcast\u0026rsquo;s episode deletion feature\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFor instance, when evaluating an episode past the limit for deletion:\u003c/p\u003e\n\u003cp\u003eWhat if it\u0026rsquo;s an old episode that I went back and added?\u003cbr\u003e\nWhat if I\u0026rsquo;ve partly listened to it?\u003cbr\u003e\nWhat if I partly listened, but never finished it? (How long ago? How much is left?)\u003cbr\u003e\nWhat if I\u0026rsquo;m currently listening to it?\u003cbr\u003e\nWhat if I\u0026rsquo;m listening to it, but on a device that hasn\u0026rsquo;t been used in a while?\u003cbr\u003e\nWhat if it\u0026rsquo;s downloaded to the Watch? (How recently has that watch been used for standalone playback?)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eEven features which sound simple are often not. Experienced developers know\nthis so when you\u0026rsquo;re building a \u0026ldquo;simple\u0026rdquo; feature and someone says \u0026ldquo;just do x\u0026rdquo;\nand they look at you like an idiot point them at this list of \u0026ldquo;what ifs\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://chromewebstore.google.com/detail/control-panel-for-twitter/kpmjjdhbcfebfjgdnpjagcndoelnidfj\"\u003eControl Panel for Twitter\u003c/a\u003e [Via \u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e again]\u003c/p\u003e\n\u003cp\u003eMake Twitter slightly less shit.\u003c/p\u003e\n\u003cp\u003eStill full o\u0026rsquo; grifters though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been frustrated this week dealing with an endless list of unhelpful\nidiots.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMaybe this is elitist or something, but I like that Mastodon is never going to\ntake off like Twitter did.\u003c/p\u003e\n\u003cp\u003eBack in 2007 when I joined Twitter is was full developers, programmers,\ndesigners, web types etc, and it was an interesting place. Then the rest of\nthe world found it and it got worse and worse until we got to where it is now.\u003c/p\u003e\n\u003cp\u003eMastodon is too difficult for the average person to join: What is an instance?\nWhere do I \u0026ldquo;sign up\u0026rdquo;? etc so it won\u0026rsquo;t ever grow like Twitter. And the\nfederated nature keeps it smaller whilst allowing, well, federation.\u003c/p\u003e\n\u003cp\u003eAnd I\u0026rsquo;m glad.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRails World is next week, and predictably, I can\u0026rsquo;t be arsed. I\u0026rsquo;m sure the trip\nwill be worth it in the end.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt was the third Ruby meetup I\u0026rsquo;ve been trying to organise this week. Back down\nto two of us this time. It was a little bit disappointing, but when the group\nis already small it only takes few dropouts to get here. I will try to get\nmore organised for the next one and hopefully we can turn it into something\nmore consistently attended.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which, I created a \u003ca href=\"https://yorkruby.org\"\u003ewebsite for said meetup\u003c/a\u003e. Still got it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Elixir ecosystem continues to impress. \u003ccode\u003eExUnit\u003c/code\u003e just got a new flag to\nhelp with tracking down intermittent test failures:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emix test --repeat-until-failure N\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eVia \u003ca href=\"https://www.elixirstreams.com/tips/mix-test-repeat-until-failure\"\u003eElixir Streams\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/elixir-lang/elixir/pull/13851\"\u003eSoft-deprecate Kernel.unless/2\u003c/a\u003e \u0026ndash; \u003ca href=\"/weeknotes/168-early-return/#:~:text=this%20is%20one%20of%20the%20few%20places%20I%20think%20unless%20is%20acceptable\"\u003edown with \u003ccode\u003eunless\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUsual story; I\u0026rsquo;m not using Neovim to it\u0026rsquo;s fullest. This time, \u003ca href=\"https://neovim.io/doc/user/usr_04.html#04.8\"\u003eText Objects\u003c/a\u003e.\nFor example, if your cursor position was in the middle of a paragraph of text,\nyou could type \u003ccode\u003evap\u003c/code\u003e to visually select the whole paragraph. It\u0026rsquo;s very cool.\u003c/p\u003e\n\u003cp\u003eHowever, sometimes some of the combinations are a bit tricky to type.\nParticularly when you want to involve your friend and mine, the curly brace \u0026ndash;\n\u003ccode\u003e{\u003c/code\u003e and \u003ccode\u003e}\u003c/code\u003e \u0026ndash; or in fact any character that requires \u003ckbd\u003eshift\u003c/kbd\u003e to\nreach it.\u003c/p\u003e\n\u003cp\u003eThankfully, I discovered that \u003ca href=\"https://github.com/echasnovski/mini.ai\"\u003e\u003ccode\u003emini.ai\u003c/code\u003e\u003c/a\u003e extends \u003ccode\u003ea\u003c/code\u003e/\u003ccode\u003ei\u003c/code\u003e textobjects to make\nthis easier by adding \u003ca href=\"https://github.com/echasnovski/mini.ai/blob/40e380a589d07ec2c856940c6422aafe5d949a0d/doc/mini-ai.txt#L118-L185\"\u003e\u003ccode\u003eaq\u003c/code\u003e/\u003ccode\u003eiq\u003c/code\u003e for quotes, and \u003ccode\u003eab\u003c/code\u003e/\u003ccode\u003eib\u003c/code\u003e for brackets\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;Quotes\u0026rdquo; includes \u003ccode\u003e\u0026quot;\u003c/code\u003e \u003ccode\u003e'\u003c/code\u003e \u003ccode\u003e`\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;Brackets\u0026rdquo; includes \u003ccode\u003e(\u003c/code\u003e \u003ccode\u003e)\u003c/code\u003e \u003ccode\u003e{\u003c/code\u003e \u003ccode\u003e}\u003c/code\u003e \u003ccode\u003e[\u003c/code\u003e \u003ccode\u003e]\u003c/code\u003e \u003ccode\u003e\u0026lt;\u003c/code\u003e \u003ccode\u003e\u0026gt;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eThis means that in the case of brackets, you can type \u003ccode\u003evab\u003c/code\u003e and it will select\nany text within any of the matching \u0026ldquo;bracket\u0026rdquo; characters above. Much less\ntyping and easier to use.\u003c/p\u003e\n\u003cp\u003eBut there\u0026rsquo;s more. I noticed whilst experimenting that \u003ccode\u003eam\u003c/code\u003e and \u003ccode\u003eim\u003c/code\u003e also\nworked for Ruby methods, so if you wanted to visually select the contents of a\nRuby method you could do \u003ccode\u003evim\u003c/code\u003e \u0026ndash; nice.\u003c/p\u003e\n\u003cp\u003eHowever, it wasn\u0026rsquo;t clear \u003cem\u003ewhy\u003c/em\u003e this worked, but I found that these \u003ca href=\"https://github.com/vim-ruby/vim-ruby/blob/f06f069ce67bdda6f2cd408f8859cdf031e5b6b4/doc/ft-ruby-plugin.txt#L58-L79\"\u003etext\nobjects are defined by the vim-ruby\u003c/a\u003e runtime files maintained by tpope. And\nit\u0026rsquo;s not only \u003ccode\u003eam\u003c/code\u003e and \u003ccode\u003eim\u003c/code\u003e that work, you can also do \u003ccode\u003eaM\u003c/code\u003e and \u003ccode\u003eiM\u003c/code\u003e for Ruby\nclasses!\u003c/p\u003e\n\u003cp\u003ePretty sure I\u0026rsquo;m going to be learning Vim forever.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTIL that \u003ca href=\"https://en.wikipedia.org/wiki/CockroachDB\"\u003eCockroachDB\u003c/a\u003e is Postgres compatible.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mastodon.social/@marcoarment/113176871729373771\"\u003eMarco Arment on Overcast\u0026rsquo;s episode deletion feature\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFor instance, when evaluating an episode past the limit for deletion:\u003c/p\u003e\n\u003cp\u003eWhat if it\u0026rsquo;s an old episode that I went back and added?\u003cbr\u003e\nWhat if I\u0026rsquo;ve partly listened to it?\u003cbr\u003e\nWhat if I partly listened, but never finished it? (How long ago? How much is left?)\u003cbr\u003e\nWhat if I\u0026rsquo;m currently listening to it?\u003cbr\u003e\nWhat if I\u0026rsquo;m listening to it, but on a device that hasn\u0026rsquo;t been used in a while?\u003cbr\u003e\nWhat if it\u0026rsquo;s downloaded to the Watch? (How recently has that watch been used for standalone playback?)\u003c/p\u003e",
      "date_published": "2024-09-22T00:00:00+00:00",
      "date_modified": "2024-09-22T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/168-early-return/",
      "url": "https://elver.me/weeknotes/168-early-return/",
      "title": "Weeknotes 168: Early return",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI signed up for a \u003ca href=\"https://www.brickeconomy.com/\"\u003eBrickEconomy\u003c/a\u003e account this week. I am cool.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_properties\"\u003eprivate properties in JavaScript\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eclass\u003c/span\u003e ClassWithPrivate {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a61717;background-color:#e3d2d2\"\u003e#\u003c/span\u003eprivateField;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a61717;background-color:#e3d2d2\"\u003e#\u003c/span\u003eprivateFieldWithInitializer \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#099\"\u003e42\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a61717;background-color:#e3d2d2\"\u003e#\u003c/span\u003eprivateMethod() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#998;font-style:italic\"\u003e//...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLeading with a \u003ccode\u003e#\u003c/code\u003e makes it private.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gpanders.com/blog/whats-new-in-neovim-0.10/\"\u003eWhat\u0026rsquo;s New in Neovim 0.10\u003c/a\u003e [via \u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003eNeovim content, which was once the nexus of this publication, has dwindled in\nrecent months. No longer, we\u0026rsquo;re back baby.\u003c/p\u003e\n\u003cp\u003eThis summary of what\u0026rsquo;s new in 0.10 was an interesting read, in particular, the\nbuilt-in commenting support which means I can remove a plugin.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe attended a \u0026ldquo;A Night at the Movies\u0026rdquo; this weekend. Classical renditions of\nfamous movie scores. It was a relaxing way to spend a couple of hours in\nbeautiful surroundings.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=aZ9Os8cP_gg\"\u003eBLADE RUNNER 2049 - \u0026ldquo;2048: Nowhere to Run\u0026rdquo; Short\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIf you liked \u003ca href=\"https://en.wikipedia.org/wiki/Blade_Runner_2049\"\u003eBlade Runner 2049\u003c/a\u003e, you might also like this short focussing on\nthe character \u003ca href=\"https://en.wikipedia.org/wiki/List_of_Blade_Runner_(franchise)_characters#Sapper_Morton\"\u003eSapper Morton\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://defector.com/neither-elon-musk-nor-anybody-else-will-ever-colonize-mars\"\u003eNeither Elon Musk Nor Anybody Else Will Ever Colonize Mars\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMars does not have a magnetosphere. Any discussion of humans ever settling\nthe red planet can stop right there, but of course it never does. Do you\nhave a low-cost plan for, uh, creating a gigantic active dynamo at Mars\u0026rsquo;s\ndead core? No? Well.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI guess we\u0026rsquo;re not going to Mars.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Canadian passport has arrived! Whilst I am relieved to now have it in my\npossession I bet that no one even checks it when I travel.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe early return. What is it about it that is so appealing?\u003c/p\u003e\n\u003cp\u003eI think that in Ruby it is loved because partly because it has a knack of\nmaking it read so damned nicely.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003efoo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003eunless\u003c/span\u003e something?\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#998;font-style:italic\"\u003e# do more stuff...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLook at it. It\u0026rsquo;s so pretty. (Incidentally, this is one of the few places I\nthink \u003ccode\u003eunless\u003c/code\u003e is acceptable).\u003c/p\u003e\n\u003cp\u003eThe thing is, people are going around early returning everything and it makes\ncode hard to read in many cases. In my view, early returns should be used for\nguard checks. Can this method run if this condition is false sort of stuff.\u003c/p\u003e\n\u003cp\u003eI often see the humble \u003ccode\u003eif\u003c/code\u003e/\u003ccode\u003eelse\u003c/code\u003e shunned in favour of the disjointed early\nreturn. If your whole method is a decision between two branches, don\u0026rsquo;t do\nthis:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003efoo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#990073\"\u003e:bar\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003eunless\u003c/span\u003e something?\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#990073\"\u003e:baz\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDo this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003efoo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e something?\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:baz\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:bar\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFuture readers will thank you.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitchellh.com/writing/zig-comptime-conditional-disable\"\u003eConditionally Disabling Code with Comptime in Zig\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eZig is interesting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLike every other week, this week I discovered another Ruby/Rails method which\nI sort of knew about, but haven\u0026rsquo;t really used. This one is simple:\n\u003ccode\u003eObject.in?\u003c/code\u003e for checking if something exists in an Enumerable.\u003c/p\u003e\n\u003cp\u003eThe traditional way would be something like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003ePRODUCT_CATEGORIES\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003einclude?(category)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBut the expression is a bit backwards in terms of how we think about what\nwe\u0026rsquo;re trying to achieve. \u003ccode\u003eObject.in?\u003c/code\u003e let\u0026rsquo;s you do this instead.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecategory\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ein?(\u003cspan style=\"color:#008080\"\u003ePRODUCT_CATEGORIES\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://island94.org/2024/09/the-novice-problem\"\u003eThe Novice Problem\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWill they exercise discretion and nuance? Will they have the ability to\nprioritize based on that information? Will they make appropriate tradeoffs?\n[No.]\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is the problem with linters. Rules will be followed without thinking\nabout whether they are appropriate.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI signed up for a \u003ca href=\"https://www.brickeconomy.com/\"\u003eBrickEconomy\u003c/a\u003e account this week. I am cool.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_properties\"\u003eprivate properties in JavaScript\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eclass\u003c/span\u003e ClassWithPrivate {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a61717;background-color:#e3d2d2\"\u003e#\u003c/span\u003eprivateField;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a61717;background-color:#e3d2d2\"\u003e#\u003c/span\u003eprivateFieldWithInitializer \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#099\"\u003e42\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a61717;background-color:#e3d2d2\"\u003e#\u003c/span\u003eprivateMethod() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#998;font-style:italic\"\u003e//...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLeading with a \u003ccode\u003e#\u003c/code\u003e makes it private.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gpanders.com/blog/whats-new-in-neovim-0.10/\"\u003eWhat\u0026rsquo;s New in Neovim 0.10\u003c/a\u003e [via \u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003eNeovim content, which was once the nexus of this publication, has dwindled in\nrecent months. No longer, we\u0026rsquo;re back baby.\u003c/p\u003e\n\u003cp\u003eThis summary of what\u0026rsquo;s new in 0.10 was an interesting read, in particular, the\nbuilt-in commenting support which means I can remove a plugin.\u003c/p\u003e",
      "date_published": "2024-09-15T00:00:00+00:00",
      "date_modified": "2024-09-15T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/167-bidirectional/",
      "url": "https://elver.me/weeknotes/167-bidirectional/",
      "title": "Weeknotes 167: Bidirectional",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eQuite grumpy this week. Strap in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOf course, donating blood is worthwhile if you are able. But in the last few\nyears the process has gotten so much worse. It used to be great end-to-end.\nThe website was convenient and easy to use. The staff were great. You didn\u0026rsquo;t\nhave to wait \u003cem\u003ethat long\u003c/em\u003e, and you got a \u003ca href=\"https://mcvities.co.uk/products/club\"\u003echocolate Orange Club biscuit\u003c/a\u003e at the\nend and some \u003ca href=\"https://www.youtube.com/watch?v=6B3so5iWyKw\"\u003eweak lemon drink\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eNow it\u0026rsquo;s gotten to the point where you can never be sure you will actually be\ndonating. Appointments are cancelled on the same day, seemingly randomly. If\nyou do make it to the local village hall the lack of staff mean that you end\nup waiting ages to donate. Or worse turned away at the door (non \u003ca href=\"https://www.blood.co.uk/why-give-blood/blood-types/o-positive-blood-type/\"\u003eO positive\u003c/a\u003e\nblood types in particular). Even the website mucks you about now.\u003c/p\u003e\n\u003cp\u003eAll whilst enduring endless begging texts and emails constantly asking you to\ndonate. I\u0026rsquo;m trying mate.\u003c/p\u003e\n\u003cp\u003eYou do still get a biscuit though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mikezornek.com/posts/2024/9/liveview-modules-must-end-in-live/\"\u003eLiveView Modules Must End in \u003ccode\u003eLive\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe drafted some simple LiveView demos with modules that did not end in Live,\nand things worked fine. I had a gut feeling that this was required, but I\ncould not put my finger on it.\u003c/p\u003e\n\u003cp\u003eToday, I was reminded when and why you need the Live suffix.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen you order postage stamps online, not only do the Royal Mail take 4 days\nto despatch said stamps, they also charge you for postage, which I find\nabsolutely mind-boggling.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/166-metal-framed/#:~:text=ordered%20a%20load%20more%20rando%20cables%20from%20Amazon\"\u003erando DisplayPort to Thunderbolt cables arrived\u003c/a\u003e; all 6 of \u0026rsquo;em. Not a\nsingle one worked. Great success.\u003c/p\u003e\n\u003cp\u003eI plugged the original (\u003cem\u003edeep breath\u003c/em\u003e) \u003ca href=\"https://www.amazon.co.uk/gp/product/B01LYD2Y19/\"\u003eCable Matters 32.4Gbps Bidirectional\nUSB C to DisplayPort 1.4 Cable\u003c/a\u003e back in, and this time the picture was\nperfect?! No visual artifacts at all.\u003c/p\u003e\n\u003cp\u003eEverything was hunky dory until I started to actually play a game. The game\nstarted, and the menus loaded, but as soon as it attempted to start the game\nitself the screen would go blank!\u003c/p\u003e\n\u003cp\u003eOn a hunch I disabled \u0026ldquo;G-Sync\u0026rdquo; in the Nvidia Control Panel settings and\neverything fell into place and I managed to play a game of Age of Empires IV\nwithout a single issue. Fucking computers, man.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m thinking that perhaps there was some sort of interference going on before.\nI had the cable routed next to some others, so it is possible. I will\ninvestigate further. Or I won\u0026rsquo;t because I can\u0026rsquo;t be bothered and I just wanna\nplay games once a year.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIs there something wrong with this?\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ rg 'rubocop:disable Metrics/MethodLength' | wc -l\n   433\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIf we chose to ignore is 433 times, is it useful?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had never heard of the \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/API/Web_Share_API\"\u003eWeb Share API\u003c/a\u003e until I read \u003ca href=\"https://farens.me/blog/implement-the-web-share-api-in-phoenix-liveview\"\u003eImplement the Web Share\nAPI in Phoenix LiveView\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe Web Share API provides a mechanism for sharing text, links, files, and\nother content to an arbitrary share target selected by the user.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSo, for example, in the context of iOS you can trigger the Share Sheet to\nshare content directly with installed apps.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://elixir-lang.org/blog/2024/08/28/typing-lists-and-tuples/\"\u003eTyping lists and tuples in Elixir\u003c/a\u003e by Jose Valim. Very interesting\nexplanation of the trade-offs required to make a type system work with Elixir.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://accu.org/\"\u003eACCU\u003c/a\u003e is not an organisation I had heard of before. It seems to have started\nas a C++ group, but is now more general computing/programming. There is a\nlocal group near me and I went along for the first time this week. They were a\nfriendly bunch, and I intend to go along again. The talk was on Ruby too.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eQuite grumpy this week. Strap in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOf course, donating blood is worthwhile if you are able. But in the last few\nyears the process has gotten so much worse. It used to be great end-to-end.\nThe website was convenient and easy to use. The staff were great. You didn\u0026rsquo;t\nhave to wait \u003cem\u003ethat long\u003c/em\u003e, and you got a \u003ca href=\"https://mcvities.co.uk/products/club\"\u003echocolate Orange Club biscuit\u003c/a\u003e at the\nend and some \u003ca href=\"https://www.youtube.com/watch?v=6B3so5iWyKw\"\u003eweak lemon drink\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eNow it\u0026rsquo;s gotten to the point where you can never be sure you will actually be\ndonating. Appointments are cancelled on the same day, seemingly randomly. If\nyou do make it to the local village hall the lack of staff mean that you end\nup waiting ages to donate. Or worse turned away at the door (non \u003ca href=\"https://www.blood.co.uk/why-give-blood/blood-types/o-positive-blood-type/\"\u003eO positive\u003c/a\u003e\nblood types in particular). Even the website mucks you about now.\u003c/p\u003e",
      "date_published": "2024-09-08T00:00:00+00:00",
      "date_modified": "2024-09-08T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/166-metal-framed/",
      "url": "https://elver.me/weeknotes/166-metal-framed/",
      "title": "Weeknotes 166: Metal-framed",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSomehow it is September. This is disappointing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.chiark.greenend.org.uk/~sgtatham/quasiblog/code-review-antipatterns/\"\u003eCode review antipatterns\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn this case, that’s to make the patch as good as possible, according to\nwhatever definition of ‘good’ the development team as a whole has agreed on.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWe recently discussed this at work. What is \u0026ldquo;good\u0026rdquo;?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur bed started squeaking. I knew this would happen because all metal-framed\nbeds eventually do. I didn\u0026rsquo;t know it was metal-framed when we bought it or I\nwould not have bought it. Anyway, how to stop it? I have no idea other than to\ntighten all the screws and bolts, and hope.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe joined a free, local, walking tour this weekend as a way to get to know\nsome more about our new home. It was led by a very dry humoured older\ngentlemen and was very informative. Time well spent.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn an effort to control eating I decided to do some meal prepping on Saturday.\nThis would give us a stock in the freezer for when we\u0026rsquo;re feeling particularly\nlazy \u0026ndash; laziness is when pizza is consumed. Good plan. Unfortunately I did not\nplan to remember to put the food in the freezer before going to bed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAre you aware how difficult it is to connect a PC to an Apple Studio Display?\nNo? Very difficult. It. Is. Tricky.\u003c/p\u003e\n\u003cp\u003eI had seemingly forgotten everything about this since \u003ca href=\"/weeknotes/124-show-me-your-feed/#:~:text=How%20do%20you%20plug%20a%20PC%20into%20an%20Apple%20Studio%20Display%3F\"\u003ewhen I tried last\ntime\u003c/a\u003e. The only evidence being a stack of only nondescript cables in my\ndrawer.\u003c/p\u003e\n\u003cp\u003eAfter trying many cables I did eventually get a picture on the Studio Display\nfrom my PC, but I had to reboot the monitor (a.k.a. unplug it, wait 20\nseconds, and re-plug it) with the PC connected in order to make it happen 🙄\u003c/p\u003e\n\u003cp\u003eDespite what was very obviously going to be a hassle every time I wanted to\nuse the PC, I was pleased that I had at least something showing on-screen.\nThat was until the flickering and visual artifacts showed up during \u003ca href=\"https://en.wikipedia.org/wiki/Age_of_Empires_IV\"\u003eAge of\nEmpires IV\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThere was a brief dalliance with the idea of getting a Thunderbolt 4 expansion\ncard to add to my PC which would allow a direct Thunderbolt to Thunderbolt\nconnection, but that was quickly over when I realised my motherboard does not\nhave the requisite connections to do so.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m at a bit of a loss now, so I\u0026rsquo;ve just ordered a load more rando cables from\nAmazon in the hope that one of them gives a better result.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI have been slowly continuing the \u003ca href=\"/weeknotes/160-many-small-queries/#:~:text=I%20bought%20High%20Performance%20SQLite%20video%20course%20to%20learn%20more%20about%20SQLite\"\u003eHigh Performance SQLite course I\npurchased\u003c/a\u003e. I\u0026rsquo;m finding it a bit of a slog to be honest, but not because the\ncontent isn\u0026rsquo;t good, because it is, I\u0026rsquo;ve just lost interest. I\u0026rsquo;m trying to\nwatch one video a day to get through it even though I\u0026rsquo;m not really taking in\nany of the information.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve only gone and read another book \u0026ndash; \u003ca href=\"https://www.goodreads.com/book/show/188543465-the-trading-game\"\u003eThe Trading Game by Gary Stevenson\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e2 out of 24 read ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSomehow it is September. This is disappointing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.chiark.greenend.org.uk/~sgtatham/quasiblog/code-review-antipatterns/\"\u003eCode review antipatterns\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn this case, that’s to make the patch as good as possible, according to\nwhatever definition of ‘good’ the development team as a whole has agreed on.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWe recently discussed this at work. What is \u0026ldquo;good\u0026rdquo;?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur bed started squeaking. I knew this would happen because all metal-framed\nbeds eventually do. I didn\u0026rsquo;t know it was metal-framed when we bought it or I\nwould not have bought it. Anyway, how to stop it? I have no idea other than to\ntighten all the screws and bolts, and hope.\u003c/p\u003e",
      "date_published": "2024-09-01T00:00:00+00:00",
      "date_modified": "2024-09-01T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/165-house-prints/",
      "url": "https://elver.me/weeknotes/165-house-prints/",
      "title": "Weeknotes 165: House prints",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve started a new side-project \u0026ndash; yadda, yadda. Of course I have. Already\nlosing interest.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/kaspth/active_record-associated_object\"\u003e\u003ccode\u003eActiveRecord::AssociatedObject\u003c/code\u003e\u003c/a\u003e seems interesting.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRails applications can end up with models that get way too big, and so far,\nthe Ruby community response has been Service Objects. But sometimes\napp/services can turn into another junk drawer that doesn\u0026rsquo;t help you build\nand make concepts for your Domain Model.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eActiveRecord::AssociatedObject\u003c/code\u003e takes that head on. Associated Objects are\na new domain concept, a context object, that\u0026rsquo;s meant to help you tease out\ncollaborator objects for your Active Record models.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://youtu.be/DGatl7bH2yQ?si=n27zAmGW7J3qNQfI\u0026amp;t=51\"\u003eKasper Timm Hansen (the author of the library) gave a talk at the Ruby\nTürkiyek group\u003c/a\u003e about it (I\u0026rsquo;ve yet to watch), and \u003ca href=\"https://garrettdimon.com/journal/posts/organizing-rails-code-with-activerecord-associated-objects\"\u003eGarrett Dimon also wrote\nabout it\u003c/a\u003e (I\u0026rsquo;ve yet to read \u0026ndash; lol).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSince moving I\u0026rsquo;ve been keen to get into the local Ruby \u0026ldquo;scene\u0026rdquo;. The only\nproblem being that there didn\u0026rsquo;t really seem to be one\u0026hellip;\u003c/p\u003e\n\u003cp\u003eWhen we were first thinking of moving I joined a local developer community in\nthe new area we had in our sights, and put a call out for Rubyists. Around\nhalf a dozen replied. It gave me hope. I never expected a large number of\npeople. Remember, Ruby is dying.\u003c/p\u003e\n\u003cp\u003eHowever since actually moving the response has been more tepid. So it was me,\nand a another guy. Is two people a \u0026ldquo;group\u0026rdquo;?\u003c/p\u003e\n\u003cp\u003eThere were a couple of things affecting this I think. People have forgotten,\nto an extent, about meeting-up since COVID, and it\u0026rsquo;s August \u0026ndash; classic school\nholidays territory. Not ideal timing to try and rekindle a group.\u003c/p\u003e\n\u003cp\u003eDo you know what though? I think we have an actual Ruby meetup on our hands\nnow. The group has now grown from 2 people to an impressive 5 in just a few\nweeks. We don\u0026rsquo;t have speakers, but we do have a group of people coming\ntogether to talk Ruby, and that\u0026rsquo;s pretty great. I hope we can keep it going.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTangentially, do you know how expensive Meetup.com is? I expected that it\nwould be free for upto 10 members or something, but no, straight into paid\nplans \u0026ndash; I\u0026rsquo;m reluctant to pay for it tbh.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe met up with the previous owner of our new house this week. Bit weird? He\nseemed like a good person in our dealings with him during the house buying\nprocess \u0026ndash; negotiation, but without any of the agro.\u003c/p\u003e\n\u003cp\u003e(Maybe we\u0026rsquo;ll find out the house is built out of straw later and change our\nminds!).\u003c/p\u003e\n\u003cp\u003eAnyway, his late wife, whose house it was originally, was a food historian and\ntook up painting in her later life. He wondered whether we\u0026rsquo;d like one of her\npaintings as a print for the house \u0026ndash; a bit of history carried through. It\nsounded life a wonderful idea to us, so we agreed and gratefully received two\nprints for the house.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDespite what some reviews have apparently said I enjoyed \u003ca href=\"https://www.themoviedb.org/movie/945961-alien-romulus\"\u003eAlien: Romulus\u003c/a\u003e. It\ndid seem to lose it\u0026rsquo;s way a bit, and I wasn\u0026rsquo;t sure to make of the finale, but\nI really enjoyed the world building and found it very entertaining.\u003c/p\u003e\n\u003cp\u003eAnd, get this, the cinema was good and there weren\u0026rsquo;t any people talking.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve got my \u003ca href=\"/weeknotes/164-endless-shrimp/#:~:text=Be%20there%20or%20be%20square\"\u003eticket to Haggis Ruby now\u003c/a\u003e, and train and hotel bookings to go\nalong with it. I haven\u0026rsquo;t been to Edinburgh since 2019 when I was there for\nwork, so I\u0026rsquo;m looking forward to visiting again. I expect it will be fucking\nfreezing.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve started a new side-project \u0026ndash; yadda, yadda. Of course I have. Already\nlosing interest.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/kaspth/active_record-associated_object\"\u003e\u003ccode\u003eActiveRecord::AssociatedObject\u003c/code\u003e\u003c/a\u003e seems interesting.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRails applications can end up with models that get way too big, and so far,\nthe Ruby community response has been Service Objects. But sometimes\napp/services can turn into another junk drawer that doesn\u0026rsquo;t help you build\nand make concepts for your Domain Model.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eActiveRecord::AssociatedObject\u003c/code\u003e takes that head on. Associated Objects are\na new domain concept, a context object, that\u0026rsquo;s meant to help you tease out\ncollaborator objects for your Active Record models.\u003c/p\u003e",
      "date_published": "2024-08-25T00:00:00+00:00",
      "date_modified": "2024-08-25T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/164-endless-shrimp/",
      "url": "https://elver.me/weeknotes/164-endless-shrimp/",
      "title": "Weeknotes 164: Endless shrimp",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ePosted on a Tuesday? Yes. No further comment.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter I don\u0026rsquo;t know how long I finished \u003ca href=\"https://www.goodreads.com/book/show/75531803-killing-thatcher\"\u003eKilling Thatcher by Rory Carroll\u003c/a\u003e. I\nhighly recommend it. This brings my books read this year total to an\nimpressive 1 book.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"https://monzo.com/pots\"\u003eMonzo Pots\u003c/a\u003e were looking a bit drab so I decided to spruce them up with\nsome custom images when I came across this \u003ca href=\"https://potimages.rknight.me/\"\u003eMonzo Pot Image Generator\u003c/a\u003e by Robb\nKnight.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ericportis.com/posts/2024/endless-shrimp-jesus/\"\u003eEndless Shrimp Jesus\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt’s not just that the folks who still have money to spare think AI is the\nnext big thing. It’s also that it’s much easier to invest a couple billion\nin something when you know you’re going to get a bunch of it right back.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is a very interesting theory as to why AI is so booming but everyone is\nstruggling in comparison.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://angelika.me/2024/08/12/how-to-add-css-rules-only-in-test-env-phoenix-app/\"\u003eHow to add CSS rules only in the test env in your Phoenix app\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://elixir-lang.org/blog/2024/08/15/welcome-elixir-language-server-team/\"\u003eAnnouncing the official Elixir Language Server team\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe current language server maintainers have agreed to move forward with a\nsingle Language Server Protocol project, relying on the strengths of each\nimplementation\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eOpen Source co-operation and leadership in action.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI bought some Sketchers this week. Either I\u0026rsquo;m on-brand, young, and vibrant, or\nI\u0026rsquo;ve reached middle age where I just want comfortable shoes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/2024/8/16/24221688/ikea-drones-us-warehouse\"\u003eIkea’s stock-counting warehouse drones will fly alongside workers in the US\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe Swedish furniture chain announced that the autonomous drones will soon\noperate alongside workers in its Perryville, Maryland\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eCan you imagine working in an Ikea warehouse with drones flying above your\nhead all day?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eContinuing improvements for SQLite in Rails with \u003ca href=\"https://github.com/rails/rails/pull/52562\"\u003eBulk insert fixtures on\nSQLite #52562\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;creating a single bulk insert per fixture table and making tests with\nSQLite considerably faster.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://haggisruby.co.uk/\"\u003eHaggis Ruby\u003c/a\u003e is happening! Be there or be square.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ePosted on a Tuesday? Yes. No further comment.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter I don\u0026rsquo;t know how long I finished \u003ca href=\"https://www.goodreads.com/book/show/75531803-killing-thatcher\"\u003eKilling Thatcher by Rory Carroll\u003c/a\u003e. I\nhighly recommend it. This brings my books read this year total to an\nimpressive 1 book.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"https://monzo.com/pots\"\u003eMonzo Pots\u003c/a\u003e were looking a bit drab so I decided to spruce them up with\nsome custom images when I came across this \u003ca href=\"https://potimages.rknight.me/\"\u003eMonzo Pot Image Generator\u003c/a\u003e by Robb\nKnight.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ericportis.com/posts/2024/endless-shrimp-jesus/\"\u003eEndless Shrimp Jesus\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt’s not just that the folks who still have money to spare think AI is the\nnext big thing. It’s also that it’s much easier to invest a couple billion\nin something when you know you’re going to get a bunch of it right back.\u003c/p\u003e",
      "date_published": "2024-08-18T00:00:00+00:00",
      "date_modified": "2024-08-18T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/163-slow-internet/",
      "url": "https://elver.me/weeknotes/163-slow-internet/",
      "title": "Weeknotes 163: Slow internet",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://toolshed.com/2024/07/greenfield.html\"\u003eGreenfield, Brownfield\u0026hellip; Blackfield? \u0026ndash; Andy Hunt\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOne of the things that we always forget is that software development is a\ncompletely human endeavor. The programming languages, the container\norchestration, the tech stack—all that is secondary. It’s all about us, as\npeople. And people have both history and future.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://rectangleapp.com/\"\u003eRectangle\u003c/a\u003e has served me well for many years, but since I\u0026rsquo;m using Raycast\nanyway, and it supports the same actions that I use in Rectangle, I thought it\nwas worth relying on one less app, so I\u0026rsquo;m no longer using it 👋\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://brr.fyi/posts/engineering-for-slow-internet\"\u003eEngineering for Slow Internet\u003c/a\u003e \u0026ndash; Of course, the South Pole is an extreme\nenvironment, but the issues raised in this article do affect all of us, to a\nlesser extent, often.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFrom my berthing room at the South Pole, it was about 750 milliseconds,\nround trip, for a packet to get to and from a terrestrial US destination.\nThis is about ten times the latency of a round trip between the US East and\nWest coasts (up to 75 ms). And it’s about thirty times the expected latency\nof a healthy connection from your home, on a terrestrial cable or fiber\nconnection, to most major content delivery networks (up to 25 ms).\u003c/p\u003e\n\u003cp\u003eSeriously, I can’t emphasize how jarring this is. At my apartment back home,\non GPON fiber, it’s about 3 ms roundtrip to Fastly, Cloudflare, CloudFront,\nAkamai, and Google. At the South Pole, the latency was over two hundred and\nfifty times greater.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.elixirstreams.com/tips/process-labels\"\u003eElixir \u0026amp; Erlang\u0026rsquo;s new process labels!\u003c/a\u003e \u0026ndash; Label Elixir processes to help\nidentify them when debugging or observing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe kitchen tap in our new place has a couple of problems: 1) it has been\ndripping since we moved in (and obviously much longer) which is very annoying\nin itself, and 2) it also has separate controls for hot and cold requiring us\nto carefully balance the two levers in order to not scold our hands like some\nsort of cave people.\u003c/p\u003e\n\u003cp\u003eThis week I decided that I\u0026rsquo;d had enough and bought a new tap to solve these\ntwo issues. I fitted it myself, and to my (and perhaps your) surprise it went\nvery well and worked first time. Result. I was quite proud of myself for not\nflooding the kitchen.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jobs.apple.com/en-us/details/200561949/sr-software-engineer-elixir-environmental-systems\"\u003eApple are hiring a Senior Elixir Software Engineer\u003c/a\u003e \u0026ndash; I don\u0026rsquo;t see many\nElixir jobs advertised very often, so this was surprising and welcome to see.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI met with a couple of Rubyists in the local area this week because I\u0026rsquo;m keen\nto try and get a Ruby user group going. There used to be one, but keeping\nmeetups going seems to require a fair amount of effort, and especially so\nafter the COVID years. It\u0026rsquo;s the wrong time of year to try and get something\ngoing really what with holidays in full swing, but we will see.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dockyard.com/blog/2024/06/27/self-healing-liveviews-fun-with-llms-and-the-beam\"\u003eSelf-Healing LiveViews: Fun with LLMs and the BEAM\u003c/a\u003e \u0026ndash; this is a fun\nexperiment into using LLMs to automatically repair broken code at runtime.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://evilmartians.com/chronicles/soft-deletion-with-postgresql-but-with-logic-on-the-database\"\u003eSoft deletion with PostgreSQL: but with logic on the database!\u003c/a\u003e \u0026ndash; this is\nvery cool, I had no idea this was possible with Postgres.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSo, how can we apply this particular approach to our problem? Actually, this\nis easily done: all we need to do is create a rule which changes the\ndeletions to updates.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eYou can rewrite queries using rules stored in the database.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eCREATE\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eRULE\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;_soft_deletion\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eAS\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eON\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eDELETE\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eTO\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;orders\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eDO\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eINSTEAD\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e(\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eUPDATE\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003eorders\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eSET\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003edeleted\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eWHERE\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003eid\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eold\u003c/span\u003e.id\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eAND\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eNOT\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003edeleted\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e);\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI\u0026rsquo;ve stayed away from logic in the database since my Microsoft SQL Server days\n(where it felt like too much logic was stored in the database) but this is\nundeniably cool.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://longform.asmartbear.com/impostor-syndrome/\"\u003eImpostor Syndrome: Why I felt like a fraud, and how I overcame it\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDon\u0026rsquo;t stop striving, just stop holding yourself to an impossible standard,\nand don\u0026rsquo;t worry what other people think.\u003c/p\u003e\n\u003cp\u003eThey’re not thinking about you at all.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMaybe there is \u003ca href=\"https://www.youtube.com/watch?v=yDvl4fZGk40\u0026amp;t=810s\"\u003esomething to learn about creative pursuits from Josh Homme\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen you expect anything from music, you expect too much. So, you play for\nyourself, you play to enjoy it, and you make the most it, for you. Period.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWhenever I want to build something I always have the other in mind. What will\nthey think? Will they like it? Will I be loved for it?\u003c/p\u003e\n\u003cp\u003ePerhaps it is enough to just \u003cem\u003emake it\u003c/em\u003e and \u003cem\u003eenjoy doing so\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://toolshed.com/2024/07/greenfield.html\"\u003eGreenfield, Brownfield\u0026hellip; Blackfield? \u0026ndash; Andy Hunt\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOne of the things that we always forget is that software development is a\ncompletely human endeavor. The programming languages, the container\norchestration, the tech stack—all that is secondary. It’s all about us, as\npeople. And people have both history and future.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://rectangleapp.com/\"\u003eRectangle\u003c/a\u003e has served me well for many years, but since I\u0026rsquo;m using Raycast\nanyway, and it supports the same actions that I use in Rectangle, I thought it\nwas worth relying on one less app, so I\u0026rsquo;m no longer using it 👋\u003c/p\u003e",
      "date_published": "2024-08-11T00:00:00+00:00",
      "date_modified": "2024-08-11T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/162-locked-out/",
      "url": "https://elver.me/weeknotes/162-locked-out/",
      "title": "Weeknotes 162: Locked out",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/rails/rails/pull/52480\"\u003eImplement the bin/rails boot command\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis is handy. I had an occasion to use something like this once. We had an\nissue where the Rails app did not boot in production mode. This is bad. We\ndecided to add a check in CI for it. This would\u0026rsquo;ve been useful for that.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI eventually managed to get my \u003ca href=\"/weeknotes/161-passport-shenanigans/#:~:text=get%20a%20Canadian%20passport%20before%20September!\"\u003epassport application\u003c/a\u003e notarized and sent off.\nThis whole process has cost me £452.85 \u003cem\u003eso far\u003c/em\u003e  😒\u003c/p\u003e\n\u003cp\u003eNow we wait.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://agiletechnicalexcellence.com/2024/07/22/chunks-and-beacons.html\"\u003eCode comprehension: Chunks and Beacons\u003c/a\u003e \u0026ndash; I found this interesting.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe talk about making source code readable and it turns out that this isn’t\njust stylistic interpretation; there is actual research into this topic. As\nwe read through the code, what we’re scanning for are chunks and beacons.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/fatkodima/active_record_tracer\"\u003eActiveRecordTracer\u003c/a\u003e \u0026ndash; For posterity, I\u0026rsquo;m sure to need this one day. I\nremember using some hacky solution before now, but this looks a lot nicer.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYou identified (or suspect) that the reason for the slowness of some code is\nActive Record, specifically lots of queries and/or loaded records. How do\nyou easily detect which queries, which records are loaded the most, and the\nsources of those? This tool to the rescue!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.mistys-internet.website/blog/blog/2024/07/12/github-is-starting-to-feel-like-legacy-software/\"\u003e\u0026ldquo;GitHub\u0026rdquo; Is Starting to Feel Like Legacy Software\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe problem wasn’t that the line I wanted wasn’t on the page—it’s that the\nwhole document wasn’t being rendered at once, so my browser’s builtin search\nbar just couldn’t find it. On a hunch, I tried disabling JavaScript entirely\nin the browser, and suddenly it started working again. GitHub is able to\nsend a fully server-side rendered version of the page, which actually works\nlike it should, but doesn’t do so unless JavaScript is completely\nunavailable.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI mean, really? It\u0026rsquo;s not that the page is so big that it can\u0026rsquo;t be reasonably\nrendered, it\u0026rsquo;s that the JavaScript can\u0026rsquo;t or won\u0026rsquo;t show the page.\u003c/p\u003e\n\u003cp\u003eI feel similar to this about Heroku too. There was a time when it innovated on\na weekly basis, but now it chugs. Nothing lasts forever.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI learnt about the \u003ca href=\"https://neovim.io/doc/user/cmdline.html#cmdline-window\"\u003e\u003ccode\u003ecmdline-window\u003c/code\u003e\u003c/a\u003e this week. I have, like a lot of vim\nfeatures, only ever accidentally invoked this in the past. But it looks to be\nvery useful.\u003c/p\u003e\n\u003cp\u003eWhen you run a command like a search and replace (\u003ccode\u003e:%s/foo/bar/\u003c/code\u003e) you can\u0026rsquo;t\nedit the command using regular vim features \u0026ndash; moving the cursor requires me\nto use the arrow keys, for example, like a heathen.\u003c/p\u003e\n\u003cp\u003eBy chance I came across \u003ca href=\"https://www.reddit.com/r/neovim/comments/1cnm60i/do_i_need_to_use_the_arrow_keys/\"\u003ethis Reddit thread on the exact problem\u003c/a\u003e, and it\nturns out that if you issue \u003ccode\u003eCTRL-f\u003c/code\u003e whilst editing a command it opens the\ncommand in the \u003ccode\u003ecmdline-window\u003c/code\u003e which allows the usual power of Vim to edit\ncommands, and when you\u0026rsquo;re ready to execute the command you hit \u003ccode\u003e\u0026lt;enter\u0026gt;\u003c/code\u003e ✅\u003c/p\u003e\n\u003cp\u003eHowever, I have a config peculiarity which I added some time a go, which\nalready uses \u003ccode\u003e\u0026lt;enter\u0026gt;\u003c/code\u003e to clear any search highlights. The config looks like\nthis:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e-- Clear search highlights when hitting \u0026lt;enter\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.keymap.set(\u003cspan style=\"color:#d14\"\u003e\u0026#39;n\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;\u0026lt;cr\u0026gt;\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;:nohlsearch\u0026lt;cr\u0026gt;\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSo I asked Claude 3.5 Sonnet how I could use enter to clear search highlights\nmost of the time, but not in the \u003ccode\u003ecmdline-window\u003c/code\u003e and it gave me this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e-- Clear search highlighting when hitting \u0026lt;enter\u0026gt; in normal mode,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e-- but not in the command-line window\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.keymap.set(\u003cspan style=\"color:#d14\"\u003e\u0026#39;n\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;\u0026lt;cr\u0026gt;\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e vim.fn.getcmdwintype() \u003cspan style=\"color:#000;font-weight:bold\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#000;font-weight:bold\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;:nohlsearch\u0026lt;cr\u0026gt;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#000;font-weight:bold\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;\u0026lt;cr\u0026gt;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e, { expr \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e })\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI\u0026rsquo;m not sure if this is the most idiomatic way to do this. But it works and\nseems reasonable enough.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe locked ourselves out of the house this week \u0026ndash; it was inevitable. Due to\nthe super speedy arrival of a locksmith, and his skill with a horseshoe shaped\npiece of aluminium pipe, we were back in without 25 minutes. And it only cost\nus £65, which I thought was very reasonable.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t feel particularly safe in the house now though given the ease with\nwhich he was able to gain entry 😬\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/rails/rails/pull/52480\"\u003eImplement the bin/rails boot command\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis is handy. I had an occasion to use something like this once. We had an\nissue where the Rails app did not boot in production mode. This is bad. We\ndecided to add a check in CI for it. This would\u0026rsquo;ve been useful for that.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI eventually managed to get my \u003ca href=\"/weeknotes/161-passport-shenanigans/#:~:text=get%20a%20Canadian%20passport%20before%20September!\"\u003epassport application\u003c/a\u003e notarized and sent off.\nThis whole process has cost me £452.85 \u003cem\u003eso far\u003c/em\u003e  😒\u003c/p\u003e",
      "date_published": "2024-08-04T00:00:00+00:00",
      "date_modified": "2024-08-04T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/161-passport-shenanigans/",
      "url": "https://elver.me/weeknotes/161-passport-shenanigans/",
      "title": "Weeknotes 161: Passport shenanigans",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI \u003ca href=\"/weeknotes/155-snag-a-sofa/#:~:text=I%20might%20consider%20upgrading%20to%20Sonama%20soon\"\u003eupgraded to macOS Sonama\u003c/a\u003e and it seems to have happened without incident.\nI\u0026rsquo;m always scared my development environment will be broken is some hard to\ndebug way (which would be bad because it would stop me earning) but all good\nso far.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePlaying around with a LiveView app this week I wondered why my LiveView kept\nfalling back to long polling instead of using a web socket. Long polling is an\nalternative transport for LiveViews for when websockets are blocked by\ncorporate networks and the like, and are far less efficient, but a necessary\nbackup.\u003c/p\u003e\n\u003cp\u003eApparently, this can happen in development mode, for reasons. There is a\nsession cookie called \u003ccode\u003ephx:longpoll\u003c/code\u003e. The solution is to clear that session\ncookie and the websocket will re-connect. It does happen with annoying\nregularity though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCounting values stored in a Postgres text array (\u003ccode\u003etext[]\u003c/code\u003e) column can be\nachieved by \u0026ldquo;unnesting\u0026rdquo; the values. This creates a row for each value stored\nin the text array column making counting easy.\u003c/p\u003e\n\u003cp\u003eGiven values like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e| locales                |\n|------------------------|\n| {en-US,en-GB,de,sv,nl} |\n| {en-GB}                |\n| {en-GB,nb}             |\n| {en-US}                |\n| {en-US}                |\n| {en-US}                |\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou write this query:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eSELECT\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003elocale,\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eCOUNT\u003c/span\u003e(\u003cspan style=\"color:#000;font-weight:bold\"\u003e*\u003c/span\u003e)\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eas\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003ecount\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eFROM\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003etable\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e,\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eunnest\u003c/span\u003e(locales)\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eas\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003elocale\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eGROUP\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eBY\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003elocale\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eORDER\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eBY\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003ecount\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eDESC\u003c/span\u003e;\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWhich yields this result:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e| locale | count |\n|--------|-------|\n| en-US  |     4 |\n| en-GB  |     3 |\n| sv     |     1 |\n| de     |     1 |\n| nl     |     1 |\n| nb     |     1 |\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eLovely stuff.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs you\u0026rsquo;ll know reader, I\u0026rsquo;m supposed to be \u003ca href=\"/weeknotes/150-cleanpods-pro/#:~:text=I%20am%20planning%20to%20attend%20RailsWorld%20in%20Toronto%20this%20September\"\u003etravelling to Canada in September\u003c/a\u003e\nfor RailsWorld and a short holiday.\u003c/p\u003e\n\u003cp\u003eIt seems that if you are a dual citizen of the UK and Canada (as I am) then\nyou need a Canadian passport in order to travel to Canada. I know this because\nI applied for an Electronic travel authorization and I was  denied me for\n\u0026ldquo;being a Canadian citizen\u0026rdquo; 🙄\u003c/p\u003e\n\u003cp\u003eThis is madness, right? I\u0026rsquo;ve been to Canada maybe 4 or 5 times and never had\nthis problem before, but \u003ca href=\"https://www.canada.ca/en/immigration-refugees-citizenship/services/visit-canada/dual-canadian-citizens-visit-canada.html\"\u003eit looks like the rules were changed in 2016\u003c/a\u003e and\nnow here I am.\u003c/p\u003e\n\u003cp\u003eSo now there is a mad scramble to get a Canadian passport before September!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen Rails is in development mode it will tell show a warning error page if\nyou have pending migrations aka migrations that need to be run. Normally this\nis what you want because the code you are running likely depends on that\ndatabase state being up-to-date.\u003c/p\u003e\n\u003cp\u003eHowever, this week I was fixing some migrations that weren\u0026rsquo;t inserting data\ncorrectly and I didn\u0026rsquo;t want all the other migrations to run because I was\nworking through them one-by-one.\u003c/p\u003e\n\u003cp\u003eYou can turn that pending migration check off with this in\n\u003ccode\u003econfig/environments/development.rb\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econfig\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eactive_record\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003emigration_error \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which, I\u0026rsquo;ve been writing way more SQL than usual this week. I\u0026rsquo;m\nsure I\u0026rsquo;ve mentioned this before but I don\u0026rsquo;t write a great deal of SQL,\nActiveRecord (the ORM) shields you from it most of the time. When I do, I\nstruggle a bit if I\u0026rsquo;m being honest.\u003c/p\u003e\n\u003cp\u003eThis is where AI comes in. I\u0026rsquo;ve had really great success with using \u003ca href=\"https://www.anthropic.com/news/claude-3-5-sonnet\"\u003eClaude\n3.5 Sonnet\u003c/a\u003e this week to help me get started with some fairly involved queries\nusing database features I have never used before. It\u0026rsquo;s not that it\u0026rsquo;s correct\nall the time, because it isn\u0026rsquo;t. But I struggle with \u003cem\u003estarting things\u003c/em\u003e. Using\nAI gets me started so that I can iterate on what it produces until I have a\nworking solution is a real life saver.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI finally bought a licence to \u003ca href=\"https://tableplus.com/\"\u003eTablePlus\u003c/a\u003e because I\u0026rsquo;ve been free-loading for\nlonger than I\u0026rsquo;d care to admit.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI \u003ca href=\"/weeknotes/155-snag-a-sofa/#:~:text=I%20might%20consider%20upgrading%20to%20Sonama%20soon\"\u003eupgraded to macOS Sonama\u003c/a\u003e and it seems to have happened without incident.\nI\u0026rsquo;m always scared my development environment will be broken is some hard to\ndebug way (which would be bad because it would stop me earning) but all good\nso far.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePlaying around with a LiveView app this week I wondered why my LiveView kept\nfalling back to long polling instead of using a web socket. Long polling is an\nalternative transport for LiveViews for when websockets are blocked by\ncorporate networks and the like, and are far less efficient, but a necessary\nbackup.\u003c/p\u003e",
      "date_published": "2024-07-28T00:00:00+00:00",
      "date_modified": "2024-07-28T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/160-many-small-queries/",
      "url": "https://elver.me/weeknotes/160-many-small-queries/",
      "title": "Weeknotes 160: Many small queries",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://encore.dev/blog/queueing\"\u003eQueueing \u0026ndash; An interactive study of queueing strategies\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eQueues are everywhere. We queue at bars, in restaurants, and at the bank.\nWhen you loaded this web page, the request to fetch it interacted with\ndozens of different queues on its way from your machine to the server this\npage is hosted on. Queues are fundamental.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI saw this a while ago, but it was nice to refresh my memory.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://codepen.io/plfstr/pen/zYqQeRw\"\u003eHTML Tags Memory Test\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHow many HTML tags can you remember? 114 to recall…\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI got 63\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.sqlite.org/np1queryprob.html\"\u003e\u0026ldquo;Many Small Queries Are Efficient In SQLite\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSQLite is not client/server, however. The SQLite database runs in the same\nprocess address space as the application. Queries do not involve message\nround-trips, only a function call. The latency of a single SQL query is\nfar less in SQLite. Hence, using a large number of queries with SQLite is\nnot the problem.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWhen you understand that SQLite \u003cem\u003eis\u003c/em\u003e your program this makes a lot of sense.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://uuid7.com/\"\u003eUUIDv7: The Time-Sortable Identifier for Modern Databases\u003c/a\u003e \u0026ndash; another UUID\ntype!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about the \u003ca href=\"https://www.fossil-scm.org/home/doc/trunk/www/index.wiki\"\u003eFossil\u003c/a\u003e source control system.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn addition to doing distributed version control like Git and Mercurial,\nFossil also supports bug tracking, wiki, forum, email alerts, chat, and\ntechnotes.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFind when a file was introduced in git\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit log --follow -- path/to/file\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://aaronfrancis.com/2024/youre-always-doing-something-wrong-21981fe7\"\u003eYou\u0026rsquo;re always doing something wrong\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYou have to keep going. Being occasionally wrong is a small price to pay.\nYour alternative is to watch your life tick by as you\u0026rsquo;re perfecting one last\nthing.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI bought \u003ca href=\"https://highperformancesqlite.com/\"\u003eHigh Performance SQLite\u003c/a\u003e video course to learn more about SQLite.\nIt\u0026rsquo;s very well made and I\u0026rsquo;ve learnt a lot so far. I\u0026rsquo;m looking forward to\ndelving into the more advanced topics.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSince \u003ca href=\"/weeknotes/154-loathe-to-call-this-a-success/#:~:text=I%20knocked%20half%20an%20Oat%20Mocha%20over%20my%20computer\"\u003eI poured coffee into my computer\u003c/a\u003e I decided that maybe I should be\ntaking backups a bit more seriously than I have been.\u003c/p\u003e\n\u003cp\u003eI already have cloud-based backups, but getting up-and-running from those\nwould take too long. In the past I had both a \u003ca href=\"https://en.wikipedia.org/wiki/Time_Machine_(macOS)\"\u003eTimeMachine\u003c/a\u003e backup and a full\ndisk clone but I stopped doing that for reasons I can\u0026rsquo;t remember.\u003c/p\u003e\n\u003cp\u003eWell, Amazon Prime Day came along, and with the help of \u003ca href=\"https://uk.camelcamelcamel.com/\"\u003eCamel Camel Camel\u003c/a\u003e I\ndecided to buy an external \u003ca href=\"https://en.wikipedia.org/wiki/NVM_Express\"\u003eNVMe\u003c/a\u003e SSD (\u003ca href=\"https://www.amazon.co.uk/dp/B08GS7748F\"\u003eSamsung 980 PRO\u003c/a\u003e) and external\nThunderbolt 4 enclosure (\u003ca href=\"https://www.amazon.co.uk/dp/B0BL6F56DP\"\u003eACASIS 40Gbps M.2 NVMe\u003c/a\u003e) to go along with it so I\ncould start cloning the disk again each night, but blimey.\u003c/p\u003e\n\u003cp\u003eI performed a manual test clone (using \u003ca href=\"https://www.shirt-pocket.com/SuperDuper/SuperDuperDescription.html\"\u003eSuperDuper!\u003c/a\u003e) and it completed without\nincident (I will schedule it later). However the enclosure got \u003cem\u003eextremely\u003c/em\u003e\nhot. From what I\u0026rsquo;ve read I think that\u0026rsquo;s fairly normal, and hopefully shouldn\u0026rsquo;t\nan issue as I will stick it to the underside of my desk.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=ovYbgbrQ-v8\"\u003eSuper-interesting interview with Chris Lattner creator of many things\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://marco.org/\"\u003eMarco Arment\u003c/a\u003e has been re-building his popular \u003ca href=\"https://overcast.fm/\"\u003eOvercast podcast app\u003c/a\u003e over\nthe past few years to modernise it and make it easier to work on. On \u003ca href=\"https://atp.fm/596\"\u003eATP 596\u003c/a\u003e\nhe mentioned how much the process had made him question his whole identity as\na programmer. It can be extremely comforting to hear someone so successful\nfeeling this way as I do this often (I even feel weird calling myself a\nprogrammer).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s finally been a good and \u003cem\u003eproper\u003c/em\u003e Summer this week, which is great because\nit gives me the opportunity to complain about how hot it has been.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://encore.dev/blog/queueing\"\u003eQueueing \u0026ndash; An interactive study of queueing strategies\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eQueues are everywhere. We queue at bars, in restaurants, and at the bank.\nWhen you loaded this web page, the request to fetch it interacted with\ndozens of different queues on its way from your machine to the server this\npage is hosted on. Queues are fundamental.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI saw this a while ago, but it was nice to refresh my memory.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://codepen.io/plfstr/pen/zYqQeRw\"\u003eHTML Tags Memory Test\u003c/a\u003e\u003c/p\u003e",
      "date_published": "2024-07-21T00:00:00+00:00",
      "date_modified": "2024-07-21T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/159-slow-software/",
      "url": "https://elver.me/weeknotes/159-slow-software/",
      "title": "Weeknotes 159: Slow software",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe weekend was dominated by a solo trip to Bristol for a standup comedy gig\nwith a friend. The idea of a train trip is always so much better in my head\nthan in reality.\u003c/p\u003e\n\u003cp\u003eOn the way down I had grand plans for the train. I would read, I would write,\nI would finish my work! Unfortunately, I just felt sick any time I tried any\nof that. On the way back, it was a different story. I actually \u003cem\u003edid\u003c/em\u003e get some\nstuff done. No idea why.\u003c/p\u003e\n\u003cp\u003eStill, I can recommend getting a cheap upgrade to First Class to make it\nbearable (First Class is, after all, what every seat should be). I used an app\ncalled \u003ca href=\"https://seatfrog.com/\"\u003eSeatfrog\u003c/a\u003e on the way down and paid £20. On the way back Seatfrog\ndidn\u0026rsquo;t have any upgrades available but I was still able to upgrade \u003cem\u003eon the\ntrain\u003c/em\u003e for even less, £17.50. It is more stressful though because you don\u0026rsquo;t\nknow if there will be availability, and you don\u0026rsquo;t know how much it will cost\nas that information is nowhere to be found on their website 🙄\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dice.camp/@uncanny_kate/112724979643603832\"\u003eKate Kirby on Mastodon\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe desperately need to start a Slow Software movement. High quality,\nintentionally designed, low defect software done at a quarter of the pace\nfor the same price. Because we\u0026rsquo;ve been destroying the mental health of\ndevelopers for the last quarter century, and what do we have to show for it\nbut a giant mess?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=qf0GqRz-c74\"\u003eSQLite\u0026rsquo;s WAL mode is fast fast\u003c/a\u003e \u0026ndash; introduction to what WAL mode is.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe super prolific \u003ca href=\"https://sindresorhus.com/\"\u003eSindre Sorhus\u003c/a\u003e has released yet another app \u0026ndash; \u003ca href=\"https://sindresorhus.com/online-check\"\u003eOnline\nCheck\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOnline status in your menu bar\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI could do with something like this as I fight to get online in various coffee\nestablishments. It requires Sonama though and I\u0026rsquo;m still on Ventura because I\u0026rsquo;m\ncool and relevant. I must upgrade.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://robertheaton.com/pyskywifi/\"\u003ePySkyWiFi: completely free, unbelievably stupid wi-fi on long-haul flights\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBut suddenly I realised that this was no ordinary button. This clickable\nrascal would allow me to access the entire internet through my airmiles\naccount. This would be slow. It would be unbelievably stupid. But it would\nwork.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI have a transatlantic flight coming up\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ludic.mataroa.blog/blog/on-burnout-mental-health-and-not-being-okay/\"\u003eOn Burnout, Mental Health, And Not Being Okay\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn \u003ca href=\"https://highperformancesqlite.com/watch/good-uses-for-sqlite\"\u003eGood uses for SQLite\u003c/a\u003e Aaron Francis made this comment on storing lots of\nsmall files in SQLite rather than directly on the filesystem.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;it\u0026rsquo;s better than having 1,000 and thousands and thousands of individual\nlittle files because putting all of those files in a SQLite database and\nreading out of there can be up to \u003cstrong\u003e35% faster\u003c/strong\u003e than going straight to the\ndisk. Let me say that again. Reading from a SQLite database can be 35\npercent faster than reading similar files from a disk.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis seems extremely counter-productive, but I guess that you avoid the\noverhead of opening and closing files on the file system in the same way that\nSQLite itself avoids network overhead by just being a file on disk rather than\na client/server architecture.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe weekend was dominated by a solo trip to Bristol for a standup comedy gig\nwith a friend. The idea of a train trip is always so much better in my head\nthan in reality.\u003c/p\u003e\n\u003cp\u003eOn the way down I had grand plans for the train. I would read, I would write,\nI would finish my work! Unfortunately, I just felt sick any time I tried any\nof that. On the way back, it was a different story. I actually \u003cem\u003edid\u003c/em\u003e get some\nstuff done. No idea why.\u003c/p\u003e",
      "date_published": "2024-07-14T00:00:00+00:00",
      "date_modified": "2024-07-14T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/158-difficult-job-control/",
      "url": "https://elver.me/weeknotes/158-difficult-job-control/",
      "title": "Weeknotes 158: Difficult job control",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eApparently I\u0026rsquo;ve been writing weeknotes every week for 3 years now! Maybe I can\nbe consistent.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://schmonz.com/2015/08/12/tdd-saved-my-brain/\"\u003eTDD saved my brain\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFor any given problem, I never quite totally believe I’ll be able to solve\nit. If I start at a whiteboard, I have to think, so I have to be smart, and\nI’m not sure when I’ll be done thinking, so it’s really hard to start.\nInstead, I make a to-do list: an even simpler one, with a single\ndumb-as-rocks failing test that points vaguely in a direction of some sort,\npossibly the wrong one, who knows. I don’t have to be smart to make it pass,\nso I can just do it, so I do do it. This helps me spend less time not\nstarting, and leaves me with much-needed momentum.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI could not relate to this more.\u003c/p\u003e\n\u003cp\u003eI hardly ever TDD because although I strongly believe in it as a practice,\ngetting a test setup can often be more difficult than writing then actual\nproduction code. However, I should remember to attempt this more often.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jamie.ideasasylum.com/2024/06/21/the-manager-s-unbearable-lack-of-endorphins\"\u003eThe manager’s unbearable lack of endorphins\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI’d feel competent, and valuable, and worthy and just good. It’s the best\nfeeling.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis blog post made me realize that the vast majority of the time I feel\nnothing from what I do.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI spent a surprising amount of time trying to figure out how to populate a\n\u003ccode\u003ejsonb\u003c/code\u003e column fixture because various Rails versions seem to have changed the\nway it should be done 🤔\u003c/p\u003e\n\u003cp\u003eFor a nested JSON object you can specify the key/values in YAML like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003etranslations:\n    en-US:\n      title: Title here\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eJulia Evans\u0026rsquo; \u003ca href=\"https://jvns.ca/blog/2024/07/03/reasons-to-use-job-control/#reason-3-running-a-command-while-using-vim\"\u003eReasons to use your shell\u0026rsquo;s job control\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI use \u003ccode\u003eCTRL-z\u003c/code\u003e and \u003ccode\u003efg\u003c/code\u003e \u003cem\u003ea lot\u003c/em\u003e during my normal programming workflow for the\nsame reasons as \u003cstrong\u003ereason 3\u003c/strong\u003e in this article (running a command while using\nvim).\u003c/p\u003e\n\u003cp\u003eThis is despite me using \u003ccode\u003etmux\u003c/code\u003e \u0026ndash; which takes a tiny bit longer to switch\nbetween windows. I imagine I could achieve a better workflow if I had some\nsort of custom keybindings setup in \u003ccode\u003etmux\u003c/code\u003e but I\u0026rsquo;ve always found it fairly\ninscrutable when it comes to configuration.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://akrabat.com/indenting-output-in-a-shell-script-with-pr/\"\u003eIndenting output in a shell script with pr\u003c/a\u003e \u0026ndash; Another day, another Unix\nutility I\u0026rsquo;ve never heard of.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week at work was very difficult. I really need to figure out how to get\nthings done without all the self-hatred. I felt like quitting and going to\nlive in the woods.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ladybird.org/announcement.html\"\u003eAnnouncing the Ladybird Browser Initiative\u003c/a\u003e \u0026ndash; a new web browser.\u003c/p\u003e\n\u003cp\u003eChris Wanstrath, GitHub co-founder:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe world needs an independent, open source browser free of corporate\ninterests.\u003c/p\u003e\n\u003cp\u003eToday @awesomekling and I are launching the Ladybird Browser Initiative, a\nnonprofit focused on @ladybirdbrowser, and my family is donating $1M.\u003c/p\u003e\n\u003cp\u003eJoin us in supporting a browser that supports you!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAndreas Kling:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLadybird uses a brand new engine based on web standards, without borrowing\nany code from other browsers. It started as a humble HTML viewer for the\nSerenityOS hobby project, but since then it\u0026rsquo;s grown into a full\ncross-platform browser project supporting Linux, macOS, and other Unix-like\nsystems.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHell of a task, this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about \u003ca href=\"https://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html#method-i-reflect_on_all_associations\"\u003e\u003ccode\u003e.reflect_on_all_associations\u003c/code\u003e\u003c/a\u003e which will return all associations\ndefined on an ActiveRecord model. I\u0026rsquo;ve needed this before, and thought this\nmust be new, but no, it has been in Rails for 20 years 😮\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(byebug) \u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ereflect_on_all_associations\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003emap(\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#990073\"\u003e:name\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#990073\"\u003e:client\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:versions\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:category\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:related\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:translations\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=Sw_Ze9zIafM\"\u003eEnd of Days Bolognese\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBolognese is an exercise in restraint\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI have finally booked my flights to Toronto in September ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eApparently I\u0026rsquo;ve been writing weeknotes every week for 3 years now! Maybe I can\nbe consistent.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://schmonz.com/2015/08/12/tdd-saved-my-brain/\"\u003eTDD saved my brain\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFor any given problem, I never quite totally believe I’ll be able to solve\nit. If I start at a whiteboard, I have to think, so I have to be smart, and\nI’m not sure when I’ll be done thinking, so it’s really hard to start.\nInstead, I make a to-do list: an even simpler one, with a single\ndumb-as-rocks failing test that points vaguely in a direction of some sort,\npossibly the wrong one, who knows. I don’t have to be smart to make it pass,\nso I can just do it, so I do do it. This helps me spend less time not\nstarting, and leaves me with much-needed momentum.\u003c/p\u003e",
      "date_published": "2024-07-07T00:00:00+00:00",
      "date_modified": "2024-07-07T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/157-anxiety-inducing-deadline/",
      "url": "https://elver.me/weeknotes/157-anxiety-inducing-deadline/",
      "title": "Weeknotes 157: Anxiety-inducing deadline",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI don\u0026rsquo;t want to sound like a broken record, but another busy week. The good\nnews is that hopefully all my commitments are now fulfilled for a while.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA friend and I went to see Foo Fighters during the week. The approx. 1 hour\njourney somehow took 4, so that was a lot of fun, but once we got there it was\nnice to engage with the event in quite a loose way where I just sat at the\nback and chilled out. This must be middle age.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was given an anxiety-inducing deadline out of nowhere this week. Setting\nexpectations is important, but setting them a week before something is due is\nnot OK.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t know why I\u0026rsquo;m so anxious all the time. I catastrophize that I\u0026rsquo;m going\nto get sacked and never work again, but the last 10 years of self employment\nwould seem to indicate that that is an unlikely event. None of this matters.\nStill, here we are.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOf course, the big event of the week was Brighton Ruby 2024. I travelled down\non Thursday afternoon and worked on the train. I was ready to have to take a\nhalf day off of work, but this was the first time that I have actually gotten\nwork done on the train due to having no one sat next to me, air conditioning,\nand access to a table. Of course, it was still late causing me to miss my\nconnection to Brighton.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI enjoyed Brighton Ruby far more than I had expected. Mainly, I think, because\nI didn\u0026rsquo;t \u003cem\u003ehave\u003c/em\u003e an expectations. Like not watching trailers for films, this is\nthe way.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThere was a talk about \u003ca href=\"https://github.com/oldmoe/litestack\"\u003eLitestack\u003c/a\u003e at Brighton Ruby.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLitestack is a Ruby gem that provides both Ruby and Ruby on Rails\napplications an all-in-one solution for web application data infrastructure.\nIt exploits the power and embeddedness of SQLite to deliver a full-fledged\nSQL database, a fast cache , a robust job queue, a reliable message broker,\na full text search engine and a metrics platform all in a single package.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThere has been a lot of noise about SQLite in the Rails community recently and\nbefore that with Elixir programmers (and Fly.io are big into it too). I\u0026rsquo;ve\nwritten about it before a few times and I\u0026rsquo;m still really interested in how we\ncan use it. It is still fascinating to me how technologies can sit on a\nshelf being mostly ignored for years before a sudden resurgence hits.\u003c/p\u003e\n\u003cp\u003eSomeone I spoke with at the conference said how they felt that using SQLite\n(which is essentially a single file on disk) felt wrong, and I can certainly\nunderstand that. It\u0026rsquo;s not rational or logical, but we\u0026rsquo;ve been using\nclient/server database systems for so long that using something else can feel\nweird.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA new Ruby conference was announced at Brighton Ruby. It will be in Edinburgh\nthis coming October, on the 24th. I will be going if I get a ticket because\nit\u0026rsquo;s so much closer to me now. And of course because I know the organisers.\nIt\u0026rsquo;s good to have another conference in the UK.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAbsolutely no plans this week \u0026ndash; yes!\u003c/p\u003e\n\u003cp\u003eBut shit loads of work to get done \u0026ndash; no!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI don\u0026rsquo;t want to sound like a broken record, but another busy week. The good\nnews is that hopefully all my commitments are now fulfilled for a while.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA friend and I went to see Foo Fighters during the week. The approx. 1 hour\njourney somehow took 4, so that was a lot of fun, but once we got there it was\nnice to engage with the event in quite a loose way where I just sat at the\nback and chilled out. This must be middle age.\u003c/p\u003e",
      "date_published": "2024-06-30T00:00:00+00:00",
      "date_modified": "2024-06-30T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/156-fatigue/",
      "url": "https://elver.me/weeknotes/156-fatigue/",
      "title": "Weeknotes 156: Fatigue",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOur first ever Tuesday posting! Oh dear.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://luminousmen.com/post/senior-engineer-fatigue\"\u003eSenior Engineer Fatigue\u003c/a\u003e \u0026ndash; I thought this was interesting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStill feeling super busy and stressed. I\u0026rsquo;m not good at being under pressure,\neven when that pressure is coming from my biggest inner critic. The lesson\nI\u0026rsquo;ve learnt is, never try.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=8reaJG7z-is\"\u003eI Visited Apple\u0026rsquo;s Secret iPhone Testing Labs!\u003c/a\u003e from MKBHD is super interesting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI briefly installed, and tried out, a new file manager \u0026ndash; \u003ca href=\"https://github.com/sxyazi/yazi\"\u003eyazi\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBlazing fast terminal file manager written in Rust, based on async I/O.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAs I said, not much time to play with it, but I will hopefully go back to it\nlater.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.ispreview.co.uk/index.php/2024/06/isp-bt-reveals-uk-broadband-traffic-for-first-euro-2024-matches.html\"\u003eISPreview had some interesting numbers\u003c/a\u003e on the traffic going through BT\u0026rsquo;s\nnetwork during the first Euro 2024 matches.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTotal network traffic: 15,664 TB of data, peaking at 18.5 Terabits per second.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWowsers 😮\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother visit to our new house this weekend. It was complicated, but nice, and\nI\u0026rsquo;m glad we made the effort. We visited Bridlington and Scarborough, both\nplaces I\u0026rsquo;ve never been before with mixed reviews.\u003c/p\u003e\n\u003cp\u003eHowever, the weekend of driving really did me in (🧟), and it has worried me\nabout how regularly I can do this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m very interested in the new Apple Passwords app. 1Password has fallen so\nfar \u0026ndash; it just doesn\u0026rsquo;t work most of the time. VCs man.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA super busy week (for me) this week coming up. Brighton Ruby is a highlight.\nI\u0026rsquo;m not quite ready for it, like every year. I did consider not going because\nI just feel I need a rest, but I will likely still go.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t like sitting around idle, and I don\u0026rsquo;t like being really busy. Where is\nthe happy medium?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOur first ever Tuesday posting! Oh dear.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://luminousmen.com/post/senior-engineer-fatigue\"\u003eSenior Engineer Fatigue\u003c/a\u003e \u0026ndash; I thought this was interesting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStill feeling super busy and stressed. I\u0026rsquo;m not good at being under pressure,\neven when that pressure is coming from my biggest inner critic. The lesson\nI\u0026rsquo;ve learnt is, never try.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=8reaJG7z-is\"\u003eI Visited Apple\u0026rsquo;s Secret iPhone Testing Labs!\u003c/a\u003e from MKBHD is super interesting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI briefly installed, and tried out, a new file manager \u0026ndash; \u003ca href=\"https://github.com/sxyazi/yazi\"\u003eyazi\u003c/a\u003e.\u003c/p\u003e",
      "date_published": "2024-06-23T00:00:00+00:00",
      "date_modified": "2024-06-23T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/155-snag-a-sofa/",
      "url": "https://elver.me/weeknotes/155-snag-a-sofa/",
      "title": "Weeknotes 155: Snag a sofa",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMood: Generally a bit fucked-off.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/154-loathe-to-call-this-a-success/#:~:text=I%20knocked%20half%20an%20Oat%20Mocha%20over%20my%20computer\"\u003eMocha-gate\u003c/a\u003e \u0026ndash; One of the USB-C ports is now being flaky. I\u0026rsquo;ve bought some\n\u0026ldquo;contact cleaner\u0026rdquo; to see if a little spray of that will do the job. Some keys\nstill sticking too. I\u0026rsquo;m typing in a particularly aggressive way as a result.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWork has been stressful this week. I am starting a larger piece of work and\nI\u0026rsquo;m paralysed. Why? I \u003cem\u003eknow\u003c/em\u003e that I can do this work, but I\u0026rsquo;m completely\nstuck. And this happens every time.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s hard to explain the toll it takes because obviously my life is easy in\nmany ways, but the affect on my self-esteem has been life-long and I\u0026rsquo;m really\nsick of it. I just want to work on stuff and make progress. I know rationally\nthat none of this matters, but it still causes great anguish for me and those\naround me.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m dreading next week; that will help.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/154-loathe-to-call-this-a-success/#:~:text=They%20tried%20to%20deliver%20it%20whilst%20I%20was%20away%20instead\"\u003elong-awaited chair\u003c/a\u003e arrived. I gave it a quick look over and it seems to\nbe a good replacement, but I haven\u0026rsquo;t had any time to set it up properly yet.\nIt seems like they\u0026rsquo;re letting me keep the old chair too \u0026ndash; CASHBACK.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe second set of guests visited this week. It was very nice to see them and\nwe had a good time. This was our first guests staying with us at the house,\nwhich was a bit weird as I\u0026rsquo;m not used to a full house.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe managed to snag a second sofa off of Facebook Marketplace and hired a van\nto go and pick it up. With the sofa, a new rug, and a lamp, the front room is\nfeeling a lot more homely than it was and allowed our house guests to sit\ndown.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA parental visit coming up this week (why did we arrange guests on consecutive\nweekends for a month?), but this time I will be doing the driving back and\nforth. It\u0026rsquo;s very nice to see everyone and I really appreciate the efforts\npeople have made, but I think we did a bad job at planning all these visits so\nclose together. I feel like a need to sit and stare at the wall for a bit.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDue to children being present during our last visit I decided to setup my\nNintendo Switch in an attempt to entertain them should it be necessary. They\ndidn\u0026rsquo;t seem bothered, but I have been playing it a bit instead, and with one\nof this batch of guests.\u003c/p\u003e\n\u003cp\u003eIt is undeniable how good \u003ca href=\"https://en.wikipedia.org/wiki/Mario_Kart_8\"\u003eMario Kart 8\u003c/a\u003e is.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.sansbullshitsans.com/\"\u003eSans Bullshit Sans\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe font that replaces every buzzword by a Comic Sans-styled censorship bar\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003emacOS Sequoia will soon be with us so I might consider upgrading to Sonama\nsoon ;)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMood: Generally a bit fucked-off.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/154-loathe-to-call-this-a-success/#:~:text=I%20knocked%20half%20an%20Oat%20Mocha%20over%20my%20computer\"\u003eMocha-gate\u003c/a\u003e \u0026ndash; One of the USB-C ports is now being flaky. I\u0026rsquo;ve bought some\n\u0026ldquo;contact cleaner\u0026rdquo; to see if a little spray of that will do the job. Some keys\nstill sticking too. I\u0026rsquo;m typing in a particularly aggressive way as a result.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWork has been stressful this week. I am starting a larger piece of work and\nI\u0026rsquo;m paralysed. Why? I \u003cem\u003eknow\u003c/em\u003e that I can do this work, but I\u0026rsquo;m completely\nstuck. And this happens every time.\u003c/p\u003e",
      "date_published": "2024-06-16T00:00:00+00:00",
      "date_modified": "2024-06-16T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/154-loathe-to-call-this-a-success/",
      "url": "https://elver.me/weeknotes/154-loathe-to-call-this-a-success/",
      "title": "Weeknotes 154: Loathe to call this a success",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou know when something is obviously going to be a problem, but the person\nyou\u0026rsquo;re talking to insists it will be fine? It was not fine.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/148-honeymoon-period/#:~:text=offered%20to%20replace%20the%20entire%20chair\"\u003eThe replacement chair\u003c/a\u003e was due to dispatch at the \u0026ldquo;end of May\u0026rdquo;. I was told I\nwould be notified of dispatch. Reader, they did not notify me. They tried to\ndeliver it whilst I was away instead.\u003c/p\u003e\n\u003cp\u003eAnd then sent me a passive aggressive email about me not being available to\ntake delivery.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSo after all the drama of my car breaking I drove for 5 hours on Sunday and\ndidn\u0026rsquo;t lose any coolant at all. I then took it to the garage the next day,\nwhere the mechanic couldn\u0026rsquo;t find \u003cem\u003eany\u003c/em\u003e leaks whatsoever.\u003c/p\u003e\n\u003cp\u003eIt seems that any leak that was present has been fixed by me adding some\nRadweld to the coolant system a few weeks previous. The inexplicable thing is\nwhy the previous garage thought there was a leak from the radiator. Hopefully\nit stays fixed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHowever, my partner\u0026rsquo;s car didn\u0026rsquo;t make the journey unscathed and developed\nit\u0026rsquo;s own set of problems. They too, then mysteriously disappeared. Cars, man.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI forgot to say last week that the \u003ca href=\"/weeknotes/152-your-seller/#:~:text=Perhaps%20that%20why%20our%20neighbour%20surreptitiously%20trespassed%20on%20our%20property%20and%20cut%20back%20our%20rose%20bush\"\u003etrespassing gardener\u003c/a\u003e returned, and this\ntime with a ladder!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;ll come as no surprise to you that I agree \u003ca href=\"https://ruby.social/@soulcutter/112495949162567841\"\u003ewith this\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLife before rubocop:\u003c/p\u003e\n\u003cp\u003eOnce in a while you’d come across some unusual formatting and it was\npossibly a small annoyance.\u003c/p\u003e\n\u003cp\u003eLife after rubocop:\u003c/p\u003e\n\u003cp\u003eConstant stream of “fix rubocop” commits, everyone finding their own bespoke\nworkflow trying to automate rubocopping, CI failing valid ruby because of\nits format, magic comments sprinkled across code, new versions of rubocop\ncontinuing to change code that has no problems into a form that a few people\n(who call themselves the community) thought was better\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is the bit that annoys me most.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewho call themselves the community\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eYou can change Rubocop rules, of course, but the problem is that a lot of\npeople have decided they are \u0026ldquo;best practice\u0026rdquo; as they\u0026rsquo;ve been decided by the\n\u0026ldquo;community\u0026rdquo; \u0026ndash; they haven\u0026rsquo;t. So many of the decisions are very un-rubyish at\nbest, and actively harmful at worse.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/standardrb/standard\"\u003eStandard Ruby\u003c/a\u003e makes it sane.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week has been very busy and stressful. It wouldn\u0026rsquo;t be so bad if the\nmajority of this stress wasn\u0026rsquo;t self-inflicted, but it absolutely was. The\nOther Place is almost ready, but now we\u0026rsquo;re being ghosted by the cleaners we\nhad set up and ready to go. Excellent.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOne of my jobs this week was to setup the \u003ca href=\"/weeknotes/153-overwhelmed/#:~:text=I%20received%20the%20tiny%20computer\"\u003enew Lenovo tiny PC\u003c/a\u003e to act as my\nUniFi controller.\u003c/p\u003e\n\u003cp\u003eBecause I was doing all this \u0026ldquo;on the move\u0026rdquo; I didn\u0026rsquo;t have a monitor to plug-in\nto the new PC for the initial Ubuntu install (it will run headless\nafterwards). Then I remembered \u003ca href=\"/weeknotes/129-autoexpand-on/#:~:text=It%20dawned%20on%20me%20this%20would%20be%20a%20good%20solution%20to%20my%20occasional%20need%20for%20a%20monitor%20that%20I%20can%20connect%20to%20various%20computers\"\u003emy experiment with Orion\u003c/a\u003e, which allows, with\nthe addition of a HDMI capture dongle, to plug any old PC into an iPad. I have\nan iPad ✅ I have a \u003ca href=\"https://www.amazon.co.uk/dp/B08Z3XDYQ7\"\u003eHDMI capture dongle\u003c/a\u003e ✅ This time, it worked really well.\nVery handy.\u003c/p\u003e\n\u003cp\u003eThe Ubuntu Server install was straightforward. I was pleasantly surprised to\nsee a section in the install wizard where it asks for your GitHub username so\nit can download your public key and configure SSH automatically.\u003c/p\u003e\n\u003cp\u003eThe VESA mount I bought also worked really well.\u003c/p\u003e\n\u003cp\u003eSetting up the software was easy too. The first thing I did was setup\nTailscale using their supplied installation script. This was stupidly easy to\ndo. In retrospect I should have setup Tailscale inside Docker like I have in\nthe past just so everything was in one place, but alas I forgot. Once I had\nTailscale installed I knew I could perform the rest of the configuration\nanywhere I happened to be.\u003c/p\u003e\n\u003cp\u003eFor the UniFi controller, I already had the Docker config from my old server\nso this was a case of installing Docker, and setting up that with some slight\ntweaks. Once the software was running in Docker I took a backup from the old\ncontroller and restored it in the new. Everything clicked into place with the\nexception that my devices didn\u0026rsquo;t automatically adopt because I had a hardcoded\nIP for the \u0026ldquo;Inform URL\u0026rdquo; setup in the web UI. Once I changed that value\neverything worked.\u003c/p\u003e\n\u003cp\u003eI am loathe to call this a success for fear of future failure, but it sure\nlooks like one so far.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://robindev.substack.com/p/cloudflare-took-down-our-website/comments\"\u003eCloudflare took down our website after trying to force us to pay 120k$ within 24h\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt felt like extortion. Pay us $120k until tomorrow or we destroy your business.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve always found the idea of handing over my DNS records to Cloudflare scary.\nHow would you use Cloudflare whilst mitigating their ability to extort you?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week it finally happened. I knocked half an Oat Mocha over my computer 😢\nA public breakdown then followed. The good news is that is still seems to work\nnormally. The bad news is that it smells of coffee and some of the keys are\nbecoming sticky, so we will see how it goes.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou know when something is obviously going to be a problem, but the person\nyou\u0026rsquo;re talking to insists it will be fine? It was not fine.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/148-honeymoon-period/#:~:text=offered%20to%20replace%20the%20entire%20chair\"\u003eThe replacement chair\u003c/a\u003e was due to dispatch at the \u0026ldquo;end of May\u0026rdquo;. I was told I\nwould be notified of dispatch. Reader, they did not notify me. They tried to\ndeliver it whilst I was away instead.\u003c/p\u003e\n\u003cp\u003eAnd then sent me a passive aggressive email about me not being available to\ntake delivery.\u003c/p\u003e",
      "date_published": "2024-06-09T00:00:00+00:00",
      "date_modified": "2024-06-09T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/153-overwhelmed/",
      "url": "https://elver.me/weeknotes/153-overwhelmed/",
      "title": "Weeknotes 153: Overwhelmed",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eCurrent status: Overwhelmed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe had our first visitors to the new house this week, which was great. One of\nmy fears was that I would never again see my friends so it was very nice to\nsee some! I\u0026rsquo;m still getting used to living here, so I\u0026rsquo;m not sure how good of a\ntour guide I was, but I did my best and I think a good time was had.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which, we bought a fuck-ton of houseplants to try and brighten up\nthe house and make it look lived in. I like having a lot of plants around,\nthey just don\u0026rsquo;t always like me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://slashpages.net/\"\u003eslash pages\u003c/a\u003e \u0026ndash; a nice round-up.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA guide to common pages you can add to your website\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI may implement a couple of these that I don\u0026rsquo;t already have.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe went to see our first gig since moving - a live version of the Adam Buxton\nPodcast of which I am a long time listener. It was a fun show, but ran really\nlong \u0026ndash; too much of a good thing. The venue was really hot. Like \u003cem\u003ereally\u003c/em\u003e hot.\nI\u0026rsquo;d hate to think what it must be like in the height of Summer. However, it is\nnice to be within walking distance of this sort of thing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDo you need a \u003ca href=\"https://hachyderm.io/@knickish/112510641342808484\"\u003eMastodon client for your PalmOS\u003c/a\u003e device?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI received the \u003ca href=\"/weeknotes/152-your-seller/#:~:text=I%E2%80%99ve%20bought%20a%20Lenovo%20ThinkCentre%20M900%20Tiny%20off%20eBay\"\u003etiny computer\u003c/a\u003e I decided to buy for my UniFi controller needs.\nFirst impressions are that it indeed very smol. And it turns on. I will\nevaluate it more this week coming. The VESA mount I ordered for it also arrive\nand looks suitable for installing the tiny computer in a cabinet I already\nhave setup.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe computer came with two DisplayPort ports, which I surprised me a bit.\nGuess who has every single display cable permutation except a DisplayPort to\nHDMI?\u003c/p\u003e\n\u003cp\u003e👉 This guy 👈\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHow to setup \u003ca href=\"https://optimum.ba/blog/feature-preview-pr-review-apps-on-fly-io\"\u003eHeroku-like review apps on Fly\u003c/a\u003e \u0026ndash; Heroku review apps are a\nkiller feature so this is a welcome guide.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI thought \u003ca href=\"https://joshfrankel.me/blog/destructuring-the-world-in-ruby/\"\u003ethis article on destructuring in Ruby\u003c/a\u003e was really interesting. The\nsyntax is still strange to me so I\u0026rsquo;ve barely used the feature. I expect the\nRubocop rules on my current project will have a problem with it for Very Good\nReasons anyway.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother visit at my old place next week - the final push hopefully. Each visit\nis a strange set of emotions.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eCurrent status: Overwhelmed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe had our first visitors to the new house this week, which was great. One of\nmy fears was that I would never again see my friends so it was very nice to\nsee some! I\u0026rsquo;m still getting used to living here, so I\u0026rsquo;m not sure how good of a\ntour guide I was, but I did my best and I think a good time was had.\u003c/p\u003e",
      "date_published": "2024-06-02T00:00:00+00:00",
      "date_modified": "2024-06-02T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/152-your-seller/",
      "url": "https://elver.me/weeknotes/152-your-seller/",
      "title": "Weeknotes 152: Your Seller",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://cssisntreal.com/\"\u003eCSS Isn’t Real\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026lsquo;I need a twelve column grid layout. It should be four columns on small\nscreens.\u0026rsquo; —  Statements dreamed up by the utterly Deranged\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e😆\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen I moved, my UniFi controller came with me, but the \u003ca href=\"https://uk.store.ui.com/uk/en/pro/category/all-cloud-keys-gateways/products/usg\"\u003eUSG\u003c/a\u003e and \u003ca href=\"https://uk.store.ui.com/uk/en/pro/category/all-cloud-keys-gateways/products/usg\"\u003eAP\u003c/a\u003e stayed\nwhere they are; there will be a future project to install new gear in the new\nplace. So my old network is now controller-less, which means no monitoring, no\nremote debugging, and crucially, no \u003ca href=\"https://en.wikipedia.org/wiki/Captive_portal\"\u003ecaptive portal\u003c/a\u003e capability.\u003c/p\u003e\n\u003cp\u003eSo I\u0026rsquo;ve been looking at how I run the controller, but on the cheap.\u003c/p\u003e\n\u003cp\u003eThere are a few options:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eHost on a \u003ca href=\"https://www.raspberrypi.com/products/raspberry-pi-4-model-b/\"\u003eRaspberry Pi\u003c/a\u003e \u0026ndash; this seems like a no-brainer, but I\u0026rsquo;ve read some\nthings that indicate they are not particularly reliable over the long-term\u003c/p\u003e\n\u003cp\u003eSD cards don\u0026rsquo;t like being constantly written to, or losing power in the\nmiddle of an I/O operation, and I don\u0026rsquo;t really want to have to muck about\nwith software workarounds.\u003c/p\u003e\n\u003cp\u003eBut, I \u003cem\u003edo\u003c/em\u003e have one of these (let\u0026rsquo;s be honest, I have several). So that\nwould be zero cost, but I don\u0026rsquo;t want to be having to fix it all the time.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemote hosting \u0026ndash; the controller software runs on a web host somewhere\noutside of the local network. Once the software is running you point your\nUniFi devices at a FQDN rather than an internal IP.\u003c/p\u003e\n\u003cp\u003eThere are a few commercial providers (\u003ca href=\"https://www.hostifi.com/\"\u003eHostiFi\u003c/a\u003e, \u003ca href=\"https://www.unihosted.com/\"\u003eUniHosted\u003c/a\u003e, and \u003ca href=\"https://uk.store.ui.com/uk/en/collections/unifi-accessory-tech-hosting-and-gateways-cloud/products/unifi-hosting\"\u003eUbiquiti\nthemselves\u003c/a\u003e) who offer this service, but you can always just install the\ncontroller software on a host such as Digital Ocean or Vultr instead.\u003c/p\u003e\n\u003cp\u003eI was already running the controller in Docker before, so this seems like\nsomething I could setup quite easily by using the same Docker config, but\nthere are downsides. I don\u0026rsquo;t want to pay an on-going cost for something that\nis little used, and I would prefer to not expose this sort of thing to the\nInternet.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBuy a dedicated hardware device from UniFi. They make various \u0026ldquo;Cloud Key\u0026rdquo;\nproducts which are dedicated to just running the controller software.\nHowever, pickings are slim.\u003c/p\u003e\n\u003cp\u003eThe \u003ca href=\"https://dl.ubnt.com/guides/UniFi/UniFi_Cloud_Key_UC-CK_QSG.pdf\"\u003e\u0026ldquo;Gen 1\u0026rdquo; Cloud Key\u003c/a\u003e is old and no longer supported. It won\u0026rsquo;t run the\nlatest controller software. \u003ca href=\"https://uk.store.ui.com/uk/en/pro/category/all-cloud-keys-gateways/products/unifi-cloudkey-plus\"\u003eCloudKey+ (gen2)\u003c/a\u003e is a bit too capable, and as\nsuch out of budget.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://uk.store.ui.com/uk/en/pro/category/all-unifi-cloud-gateways/products/ucg-ultra\"\u003eCloud Gateway Ultra\u003c/a\u003e seems like a good option, and would takeover the USG\u0026rsquo;s\nWAN duties which mean reconfiguring that. However, it is continually\nout-of-stock it seems. It\u0026rsquo;s also a bit more money than I want to spend.\nAlthough it may be possible to recoup some of that cost by selling the\nexisting USG, but I\u0026rsquo;m not sure how hard that would be (there are a lot of\nthem on eBay).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDedicated Linux box \u0026ndash; so that leaves us with our old friend the Linux box.\nThe problem with this option is the amount of choice. What hardware are we\ngoing to buy for this? It needs to be low power ideally, cheap enough to\nbuy, and small in size because it has to fit into an existing cabinet I have\nsetup.\u003c/p\u003e\n\u003cp\u003eThis has the benefit that I could install other stuff on it as well such as\nTailscale for subnet routing capabilities.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve bought a Lenovo ThinkCentre M900 Tiny off eBay. Is this a terrible\nidea? Only time will tell, but I\u0026rsquo;m hopeful.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.phoenixframework.org/blog/phoenix-liveview-1.0-released\"\u003ePhoenix LiveView 1.0-rc is here!\u003c/a\u003e 👏\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe inherited a well looked after garden when we moved. This is a bit daunting\nbecause we know nothing about gardening but now we need to keep it in good\nshape. Perhaps that why our neighbour surreptitiously trespassed on our\nproperty and cut back our rose bush.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/151-dumbfounded/#:~:text=hopefully%20I%E2%80%99ll%20trade%20shambolic%20customer%20service%20for%20honesty%2C%20low%20prices%2C%20and%20mechanical%20ability\"\u003ehope was misplaced\u003c/a\u003e and the car is still not fixed. After several phone\nfrustrating phone calls it became evident that the garage couldn\u0026rsquo;t fit me in\nuntil the 7th June, which would be nearly 5 weeks since it first went in, and\nnearly 7 since the original fault.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve decided to take it into the garage I used to use to coincide with a visit\nto my old flat. Hopefully they can sort it. I\u0026rsquo;ll be attempting to seal the\ncoolant system enough to get back down the motorway. Wish me luck.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had emails from Amazon Shipping about a package due for delivery. Subjects\ninclude the following sentences:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;Your package from Your Seller has shipped\u0026rdquo;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;Your Your Seller package is out for delivery\u0026rdquo;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;Your Your Seller package was delivered\u0026rdquo;\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe question is, who the fuck are \u0026ldquo;Your Seller\u0026rdquo;? There was literally no way to\nknow. So I have had a package delivered and not a clue what it is. Well done\neveryone.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/151-dumbfounded/#:~:text=Ruby%203.4.0%2Dpreview1%20is%20out\"\u003eLast week I mentioned\u003c/a\u003e about Ruby string literals now behaving as if they\nwere frozen.\u003c/p\u003e\n\u003cp\u003eXavier Noria wrote up a blog post to explain what this change means: \u003ca href=\"https://gist.github.com/fxn/bf4eed2505c76f4fca03ab48c43adc72\"\u003eRuby:\nThe future of frozen string literals\u003c/a\u003e. So, it is happening, but is going to\nrequire community effort.\u003c/p\u003e\n\u003cp\u003eVia \u003ca href=\"https://ruby.social/@benoit/112489435908965490\"\u003e@benoit@ruby.social\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://cssisntreal.com/\"\u003eCSS Isn’t Real\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026lsquo;I need a twelve column grid layout. It should be four columns on small\nscreens.\u0026rsquo; —  Statements dreamed up by the utterly Deranged\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e😆\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen I moved, my UniFi controller came with me, but the \u003ca href=\"https://uk.store.ui.com/uk/en/pro/category/all-cloud-keys-gateways/products/usg\"\u003eUSG\u003c/a\u003e and \u003ca href=\"https://uk.store.ui.com/uk/en/pro/category/all-cloud-keys-gateways/products/usg\"\u003eAP\u003c/a\u003e stayed\nwhere they are; there will be a future project to install new gear in the new\nplace. So my old network is now controller-less, which means no monitoring, no\nremote debugging, and crucially, no \u003ca href=\"https://en.wikipedia.org/wiki/Captive_portal\"\u003ecaptive portal\u003c/a\u003e capability.\u003c/p\u003e",
      "date_published": "2024-05-26T00:00:00+00:00",
      "date_modified": "2024-05-26T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/151-dumbfounded/",
      "url": "https://elver.me/weeknotes/151-dumbfounded/",
      "title": "Weeknotes 151: Dumbfounded",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eApparently \u003ca href=\"https://front-end.social/@stefan/112432321967368933\"\u003ewe don\u0026rsquo;t need \u003ccode\u003erel=noopener\u003c/code\u003e\u003c/a\u003e and I only started adding it\nrecently\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy car was at the garage until Friday when I decided to call for an update.\nApparently they left me a voicemail message even though I have voicemail\nturned off\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThe seeming good news is that the issue is apparently with a leaking radiator\nrather than some other part of the coolant system. The radiator is original so\nthe fact it has failed now it not really surprising, and it is on the lower\nend of the potential cost scale.\u003c/p\u003e\n\u003cp\u003eI think it\u0026rsquo;s clear that this garage is not the most efficient business, but\nhopefully I\u0026rsquo;ll trade shambolic customer service for honesty, low prices, and\nmechanical ability 🤞\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur bathroom now has a mirrored cabinet, and the bedroom a mirror; so the\nhouse is starting to become less annoying to live in. Thanks, IKEA.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you have multiple episodes of television series in a single file, you can\nname the file like \u003ccode\u003eShowName – s02e17-e18 – Optional_Info.ext\u003c/code\u003e so Plex\nidentifies it correctly.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe travelled down to London on Sunday to see \u003ca href=\"https://www.danielkitson.com/\"\u003eDaniel Kitson\u003c/a\u003e and \u003ca href=\"https://www.instagram.com/mrgavinosborn/\"\u003eGavin\nOsbourne\u003c/a\u003e perform \u003ca href=\"https://danielkitson.bandcamp.com/album/the-ballad-of-roger-and-grace-2006\"\u003eThe Ballad of Roger and Grace\u003c/a\u003e at \u003ca href=\"https://unionchapel.org.uk/\"\u003eUnion Chapel\u003c/a\u003e, which is\none of my absolute favourites, but I\u0026rsquo;d never seen it performed live.\u003c/p\u003e\n\u003cp\u003eUnfortunately, the whole event was ruined by a couple who tried to essentially\nbully us out of our seats. We queued and got seats on the end of a pew. Others\nfiled in and filled up the rest with the exception of two spaces next to us.\nThe couple arrived and sat down. My partner had gone to the toilet so left her\nbag on her seat. They asked me if I had \u0026ldquo;another coming\u0026rdquo; and that they had a\n\u0026ldquo;plus one\u0026rdquo; too and would there be space. I told them the seat was already\ntaken, so it didn\u0026rsquo;t look like there would be space.\u003c/p\u003e\n\u003cp\u003eNow, it\u0026rsquo;s worth pointing out that at this point there was \u003cem\u003eloads\u003c/em\u003e of other\nseating with 3 seats together to which the couple could have moved. They chose\nnot too.\u003c/p\u003e\n\u003cp\u003eThen, over the course of the next 45 minutes they continually tried various\ntactics to get us to allow their \u0026ldquo;plus one\u0026rdquo;, who had yet to arrive, to sit\nnext to them. Of course we\u0026rsquo;re happy to shift-up if the space allows, but there\nwas literally \u003cem\u003enowhere\u003c/em\u003e for this person to sit. The space simply did not\nexist.\u003c/p\u003e\n\u003cp\u003eAt one point the man told me I was \u0026ldquo;manspreading\u0026rdquo;. I was dumbfounded.\u003c/p\u003e\n\u003cp\u003eWhat is the right thing to do here? It\u0026rsquo;s seems like a no-win situation. If I\nmove  I\u0026rsquo;ve been bullied out of my seats and would be rightly annoyed. If I\nstand-up for myself, and stand my ground, the show is now ruined as I sit\nseething at the altercation.\u003c/p\u003e\n\u003cp\u003eWe left at the interval because 1) I couldn\u0026rsquo;t enjoy the show, and 2) I was\nworried about missing my train back as the show looked like it was going to\noverrun.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s left me a bit shaken to be honest.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://andycroll.com/ruby/railsconf-detroit-2024-cochairs-perspective/\"\u003eRailsconf Detroit 2024: A Co-chair’s Perspective\u003c/a\u003e \u0026ndash; Andy Croll reflects on\nthe penultimate RailsConf.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.mocoso.co.uk/posts/tech-debt-is-a-terrible-metaphor/\"\u003eTechnical Debt Is A Terrible Metaphor\u003c/a\u003e \u0026ndash; Some great points on technical debt\nbeing misunderstood. Programmers also constantly misunderstand the concept in\nthe same way that they say \u0026ldquo;refactor\u0026rdquo; instead of \u0026ldquo;change\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRuby 3.4.0-preview1 is out.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eString literals in files without a frozen_string_literal comment now behave\nas if they were frozen.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis stood out; I thought this wasn\u0026rsquo;t going to be happening, but apparently\nit is.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI used \u003ccode\u003erowspan\u003c/code\u003e on a HTML table this week for the first time since 1998.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eApparently \u003ca href=\"https://front-end.social/@stefan/112432321967368933\"\u003ewe don\u0026rsquo;t need \u003ccode\u003erel=noopener\u003c/code\u003e\u003c/a\u003e and I only started adding it\nrecently\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy car was at the garage until Friday when I decided to call for an update.\nApparently they left me a voicemail message even though I have voicemail\nturned off\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThe seeming good news is that the issue is apparently with a leaking radiator\nrather than some other part of the coolant system. The radiator is original so\nthe fact it has failed now it not really surprising, and it is on the lower\nend of the potential cost scale.\u003c/p\u003e",
      "date_published": "2024-05-19T00:00:00+00:00",
      "date_modified": "2024-05-19T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/150-cleanpods-pro/",
      "url": "https://elver.me/weeknotes/150-cleanpods-pro/",
      "title": "Weeknotes 150: CleanPods Pro",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNormally I recommend things to watch, but this time a warning. \u003ca href=\"https://www.themoviedb.org/movie/848326-rebel-moon-part-one-a-child-of-fire\"\u003eRebel Moon -\nPart One: A Child of Fire\u003c/a\u003e is not a good film, but \u003ca href=\"https://www.themoviedb.org/movie/934632-rebel-moon-part-two-the-scargiver\"\u003ePart Two\u003c/a\u003e is somehow even\nworse. I watched the first one because it looked like some space-fun. Just\ndon\u0026rsquo;t.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI washed my AirPods Pro case 🤦‍♂️. Once I found it amongst the clean, and\ndamp, clothes it immediately lit up and I was able to start charging my\nheadphones immediately 😮 That was several days ago and it is still working\nfine. Impressive from Apple.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.heroku.com/heroku-http2-public-beta\"\u003eImproved Heroku App Performance with HTTP/2\u003c/a\u003e \u0026ndash; Heroku now supports HTTP/2.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/148-honeymoon-period/#:~:text=Still%20no%20sign%20of%20our%20bed\"\u003eWe have a bed\u003c/a\u003e \u0026ndash; it\u0026rsquo;s \u003cem\u003efine\u003c/em\u003e. I discovered we\u0026rsquo;ve been sleeping on the wrong\nside of the mattress, but that the \u0026ldquo;wrong side\u0026rdquo; seems more comfortable\n🤷‍♂️. Again, never move.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStill car-less, so I took my first LNER train this week. It turned up early,\nand arrived at it\u0026rsquo;s destination on-time. My new normal will be LNER trains so\nI\u0026rsquo;m not sure if they are just better than GWR or if this was a fluke.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThere will \u003ca href=\"https://rubycentral.org/news/anewearforrubycentralevents/\"\u003eonly be one more RailsConf\u003c/a\u003e. This didn\u0026rsquo;t particularly surprise me\ngiven recent events in the world of Rails conferences. I\u0026rsquo;ve never been to a\nRailsConf and one of the reasons for that is they were always in the US.\nIronically, I am planning to attend RailsWorld in Toronto this September\n(which I am aware in not in the US).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Steve_Albini\"\u003eSteve Albini\u003c/a\u003e died this week way too soon.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe went to see a film at a brand new to us cinema \u0026ndash; \u003ca href=\"https://www.themoviedb.org/movie/653346-kingdom-of-the-planet-of-the-apes\"\u003eKingdom of the Planet of\nthe Apes\u003c/a\u003e. I thought the first half of the film was better than the second;\nthe ending just seemed to fizzle out and didn\u0026rsquo;t make sense.\u003c/p\u003e\n\u003cp\u003eHowever, the bigger issue, as usual, was the rest of the audience. Get this;\nthe people behind us talked constantly for the 30 minutes of adverts and\ntrailers, and then as the film comes on, \u003cem\u003ethat\u003c/em\u003e was the moment they chose to\nget up and go to the toilet. I will never understand some people.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI take the car in to the garage tomorrow \u0026ndash; pray for me.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNormally I recommend things to watch, but this time a warning. \u003ca href=\"https://www.themoviedb.org/movie/848326-rebel-moon-part-one-a-child-of-fire\"\u003eRebel Moon -\nPart One: A Child of Fire\u003c/a\u003e is not a good film, but \u003ca href=\"https://www.themoviedb.org/movie/934632-rebel-moon-part-two-the-scargiver\"\u003ePart Two\u003c/a\u003e is somehow even\nworse. I watched the first one because it looked like some space-fun. Just\ndon\u0026rsquo;t.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI washed my AirPods Pro case 🤦‍♂️. Once I found it amongst the clean, and\ndamp, clothes it immediately lit up and I was able to start charging my\nheadphones immediately 😮 That was several days ago and it is still working\nfine. Impressive from Apple.\u003c/p\u003e",
      "date_published": "2024-05-12T00:00:00+00:00",
      "date_modified": "2024-05-12T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/149-warning-light/",
      "url": "https://elver.me/weeknotes/149-warning-light/",
      "title": "Weeknotes 149: Warning light",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMy car decided to start losing coolant. About an hour away from home the\nwarning light came on. I\u0026rsquo;ve had this happen in many cars across many years. It\nhasn\u0026rsquo;t ended well in the past. Hopefully it doesn\u0026rsquo;t turn into a big and\nexpensive job. I will find out the week after next when it goes into the\ngarage.\u003c/p\u003e\n\u003cp\u003eMaybe it\u0026rsquo;s upset for \u003ca href=\"/weeknotes/148-honeymoon-period/#:~:text=I%20only%20used%20the%20car%20once\"\u003enot being driven\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDo you know what\u0026rsquo;s annoying? Programmers on a team asking \u0026ldquo;Do you know why we\ndid x?\u0026rdquo; but then never themselves writing anything down. Commit messages? Nah.\nOn the JIRA ticket? I haven\u0026rsquo;t got time!\u003c/p\u003e\n\u003cp\u003eThis is a solved problem in many cases if you can be arsed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://vfox.lhan.me/guides/intro.html\"\u003e\u003ccode\u003evfox\u003c/code\u003e\u003c/a\u003e \u0026ndash; I\u0026rsquo;m an \u003ccode\u003easdf\u003c/code\u003e user, but this new version manager might interest\nsome. It seems quite mature already. I\u0026rsquo;m not sure it offers enough for me to\nwant to switch at the moment.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you are using Ruby 3.3 I learnt \u003ca href=\"https://ruby.social/@tom/111692223737713163\"\u003eyou can limit backtraces\u003c/a\u003e to make them more\nreadable by exporting \u003ccode\u003eRUBYOPT=\u0026quot;--backtrace-limit=5\u0026quot;\u003c/code\u003e in your shell config of\nchoice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBack to the old place for a few days this week to sort out various things. I\u0026rsquo;m\nfeeling pretty overwhelmed with what feels like a never-ending list of tasks\nat the moment.\u003c/p\u003e\n\u003cp\u003eA visit from an electrician and a damp expert were the major highlights. They\n\u003cem\u003eboth\u003c/em\u003e turned up on-time and as expected! \u0026ndash; there are some good people\naround.\u003c/p\u003e\n\u003cp\u003eThe electrician replaced my gas hob with induction, and installed new smoke,\nheat and carbon monoxide alarms, so that should be hassle-free for the next\n10 years I\u0026rsquo;m sure.\u003c/p\u003e\n\u003cp\u003eThe damp expert was very knowledgeable and told me what I would need to do to\nfix the decoration issues I\u0026rsquo;ve had in the bedroom for a long time. The good\nnews is that there is no on-going issue with water ingress. The bad news is\nthat his estimate of costs was considerably more than I expected. So with that\nin-mind I decided, for now, to replace the damaged plasterboard, and will soon\npaint to make it liveable for now. I can\u0026rsquo;t do everything at once.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe also had a new second-hand three-piece suite delivered, which is grubby,\nbut comfortable. I think it will clean up ok.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI needed some keys cut this week, and handily a Timpsons had opened near me,\nso I thought I\u0026rsquo;d give it a go. 12 different keys, and four visits to the shop,\nresulted in zero working keys\u0026hellip;I got a refund and they were very nice, but I\ndidn\u0026rsquo;t expect getting some keys cut to turn into such a saga.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m looking forward to a quieter, and shorter, week.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMy car decided to start losing coolant. About an hour away from home the\nwarning light came on. I\u0026rsquo;ve had this happen in many cars across many years. It\nhasn\u0026rsquo;t ended well in the past. Hopefully it doesn\u0026rsquo;t turn into a big and\nexpensive job. I will find out the week after next when it goes into the\ngarage.\u003c/p\u003e\n\u003cp\u003eMaybe it\u0026rsquo;s upset for \u003ca href=\"/weeknotes/148-honeymoon-period/#:~:text=I%20only%20used%20the%20car%20once\"\u003enot being driven\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDo you know what\u0026rsquo;s annoying? Programmers on a team asking \u0026ldquo;Do you know why we\ndid x?\u0026rdquo; but then never themselves writing anything down. Commit messages? Nah.\nOn the JIRA ticket? I haven\u0026rsquo;t got time!\u003c/p\u003e",
      "date_published": "2024-05-05T00:00:00+00:00",
      "date_modified": "2024-05-05T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/148-honeymoon-period/",
      "url": "https://elver.me/weeknotes/148-honeymoon-period/",
      "title": "Weeknotes 148: Honeymoon period",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOn Monday we needed to drive back from our new house to collect our cars. Of\ncourse there was also more stuff to move. I hurt my back loading the car but\nluckily this was after the vast majority of the carrying had already been\ndone.\u003c/p\u003e\n\u003cp\u003eIt seemed fine on Tuesday. Is this a sign that my time in the gym has made me\nmore resilient to injury or do I need to spend even more time focussing on my\nback?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which, I have been to the gym 4 times this week as planned. I\u0026rsquo;m\npleased about that. I don\u0026rsquo;t love the gym I\u0026rsquo;ve joined but that was almost\ninevitable as all change is bad. I\u0026rsquo;m going to try it out for a few weeks and\nsee how it goes. At least I\u0026rsquo;m exercising in the meantime.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFood has been less successful, but not horrendous. Just too many bad foods\nrather than any bingeing behaviour. It\u0026rsquo;s hard to be super healthy when you\u0026rsquo;re\ndriving for hours and trying to find your forks.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs you\u0026rsquo;d expect, this week was dominated by moving-in activities.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe can now wash clothes as the washing machine is plumbed in and working\nwell ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/147-moving-is-a-hassle/#:~:text=The%20fridge%20we%20bought%20doesn%E2%80%99t%20fit%20in%20the%20gap%20available\"\u003efridge incident\u003c/a\u003e was resolved by some joiners who cut down the worktop\na tiny bit and removed a skirting board ✅\u003c/p\u003e\n\u003cp\u003eIt was a stressful experience as they enthusiastically started cutting\nwithin much consultation, but the worktop was left in a good state. However\nafter they left we discovered that the fridge was missing some paint from\nwhen they helpfully moved the appliance into place. Oh well.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTrip to IKEA (on a Saturday!) for random bits of \u0026ldquo;make do\u0026rdquo; furniture just to\nmake the place habitable for now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m experimenting with new shower heads because I\u0026rsquo;m a fun guy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStill no sign of our bed frame\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://tonsky.me/blog/centering/\"\u003eHardest Problem in Computer Science: Centering Things\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eEven if it’s hard. Even if tools make it inconvenient. Even if you have to\nsearch for solutions. Together, I trust, we can find our way back to putting\none rectangle inside another rectangle without messing it up.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhy do programmers love complexity? Most claim to hate it, and espouse their\ndesire to simplify. Until, that is, you try and replace their clever code with\nsomething simple.\u003c/p\u003e\n\u003cp\u003eThey\u0026rsquo;ll make excuses to justify what \u003cem\u003ethey want\u003c/em\u003e the code to be. They\u0026rsquo;ll cite\nreadability like its some form of objective measure. Readable doesn\u0026rsquo;t exist\nexcept for the original author of the code.\u003c/p\u003e\n\u003cp\u003eThe code isn\u0026rsquo;t just \u003cem\u003efor\u003c/em\u003e you. It\u0026rsquo;s for everyone else later who has to make a\nchange. Every time you\u0026rsquo;re clever, or overly concise, you\u0026rsquo;re making it harder\nto change.\u003c/p\u003e\n\u003cp\u003eThis \u003ca href=\"https://en.wiktionary.org/wiki/bikeshedding\"\u003ebikeshedding\u003c/a\u003e is burning me out again.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI discovered \u003ca href=\"https://github.com/mgkoenig/lyft\"\u003eLYFT\u003c/a\u003e \u003ca href=\"https://po-ru.com/2024/04/24/week-172-tear-down-this-wall\"\u003evia Paul Battley\u003c/a\u003e this week. It\u0026rsquo;s a hardware and software\nproject to replace the controller on IKEA Bekant desks to add features it\ndoesn\u0026rsquo;t have like presets. I am the owner of an IKEA Bekant so I might look\ninto this or other similar projects.\u003c/p\u003e\n\u003cp\u003eI had planned on replacing this desk in the next few years, but the in\nmeantime it would be nice to enhance it with more capabilities.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/124-show-me-your-feed/#:~:text=I%20bought%20a%20new%20office%20chair\"\u003enew chair\u003c/a\u003e started squeaking a month or so ago (can you sense a \u003ca href=\"/weeknotes/147-moving-is-a-hassle/#:~:text=shoes%20I%20bought%20squeak\"\u003etheme\u003c/a\u003e?)\nso I contacted Steelcase support to see what they could do. They surprisingly\noffered to replace the entire chair, which is the correct thing to do, but\nstill a surprise.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou\u0026rsquo;re not going to believe this \u0026ndash; another pair of shoes (a different brand)\nstarting squeaking!\u003c/p\u003e\n\u003cp\u003eYes, I\u0026rsquo;ve emailed them too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe move seems to be affecting my car usage as I had hoped and anticipated.\u003c/p\u003e\n\u003cp\u003eWe drove up on Monday and I only used the car once during the working week,\nand that was to pick up some large items from the supermarket which we\ncouldn\u0026rsquo;t reasonably carry whilst walking. Over the weekend we took a couple of\ntrips, and I\u0026rsquo;d expect this to be more the norm.\u003c/p\u003e\n\u003cp\u003eThe first week in a new place is not a normal week, so only time will tell\nwhat routine I settle into. The impulse to \u0026ldquo;just drive\u0026rdquo; is still in me after\n\u003cem\u003eneeding\u003c/em\u003e to drive to do almost anything before.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLess driving means my step count is increasing. I\u0026rsquo;m now getting around 4000\nsteps in before I start work just walking to the gym and back. This was often\nthe \u003cem\u003etotal\u003c/em\u003e amount of steps I would get in a day before 📈\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://okayfail.com/garden/youre-not-facebook-why-use-their-tools.html\"\u003eYou’re not Facebook. Why use their tools?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI have come to believe that “whatever Facebook does is an anti-pattern” is a\nmuch more useful heuristic.\u003c/p\u003e\n\u003cp\u003eMy reasoning goes like this: you are not Facebook.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI \u003ca href=\"/weeknotes/144-sneaky-backdoor/#:~:text=you%20are%20not%20Facebook\"\u003eobviously\u003c/a\u003e totally agree with this article.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThey can afford to pay developers obscene salaries to compensate for the\nmoral injury of working at Facebook\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI. Love. It.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe\u0026rsquo;re now moving in to the honeymoon period.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOn Monday we needed to drive back from our new house to collect our cars. Of\ncourse there was also more stuff to move. I hurt my back loading the car but\nluckily this was after the vast majority of the carrying had already been\ndone.\u003c/p\u003e\n\u003cp\u003eIt seemed fine on Tuesday. Is this a sign that my time in the gym has made me\nmore resilient to injury or do I need to spend even more time focussing on my\nback?\u003c/p\u003e",
      "date_published": "2024-04-28T00:00:00+00:00",
      "date_modified": "2024-04-28T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/147-moving-is-a-hassle/",
      "url": "https://elver.me/weeknotes/147-moving-is-a-hassle/",
      "title": "Weeknotes 147: Moving is a hassle",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/146-fancy-italian-tomatoes/#:~:text=storm\"\u003eI am the storm\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBecause I really haven\u0026rsquo;t had enough to do recently, this week I started\ncomplaining about things, specifically that the brand new Nike shoes I bought\nsqueak to an extremely annoying degree. Is this a defect in my gait or in\nthe manufacturing?\u003c/p\u003e\n\u003cp\u003eTo my surprise they refunded me. WIN.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.themoviedb.org/tv/209851-mammoth\"\u003eMammoth\u003c/a\u003e is really good fun. Give it a go, there are only three episodes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was let down by two different tradespeople on the same day. A new, but\nunsurprising, record.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAll about \u003cdel\u003ethat bass\u003c/del\u003e moving this week. We massively underestimated just how\nmuch work loading the van we hired would be. And I over packed many of the\nboxes which means I\u0026rsquo;m now a) knackered, and b) the owner of bruised arms.\u003c/p\u003e\n\u003cp\u003eWe arrived late at the house, and \u003cem\u003ejust\u003c/em\u003e managed to empty the van before it\ngot completely dark, with the smell of chocolate lingering on the air. We met\nsome of our new neighbours whilst sweaty and swearing at a sofa. They helped\nus get it in the house \u0026ndash; good sorts it seems.\u003c/p\u003e\n\u003cp\u003eThe fridge we bought doesn\u0026rsquo;t fit in the gap available, even though I measured\nit. So that\u0026rsquo;s good and I\u0026rsquo;m completely fine about it.\u003c/p\u003e\n\u003cp\u003eI also forgot to bring any tools with me which meant we couldn\u0026rsquo;t install the\nnew washing machine either. This. Is. Fine.\u003c/p\u003e\n\u003cp\u003eNo sooner had we arrived than we had to leave again to drop the van back to\nwhence it came. I was sad going back to the flat. The new place is not yet\nhome, but neither in the old place now. It’s not going away, but it \u003cem\u003eis\u003c/em\u003e\nchanging, but so am I, and hopefully for the better\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had a cracking sandwich on Saturday though, so it\u0026rsquo;s not all bad.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSo far, my new Internet seems to be working. Yodel decided to hang on to the\nrouter sent from the ISP for 5 days. No real reason, just zero attempts to\ndeliver. Yodel gonna Yodel I suppose. Still, the WiFi signal seems like it\u0026rsquo;s\ngoing to be decent enough \u003cem\u003efor now\u003c/em\u003e until I can get more organised.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMoving has really brought to light all the things I that order off Kickstarter\nand receive two years later 😆 I\u0026rsquo;m expecting a parcel \u003cem\u003esoon\u003c/em\u003e, apparently.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe finished \u003ca href=\"https://www.themoviedb.org/tv/106379-fallout\"\u003eFallout\u003c/a\u003e and it has been renewed for second series. Looking\nforward to it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf being excited about an easily accessible Amazon Locker near my house is\nwrong then I don\u0026rsquo;t wanna be right\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/146-fancy-italian-tomatoes/#:~:text=storm\"\u003eI am the storm\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBecause I really haven\u0026rsquo;t had enough to do recently, this week I started\ncomplaining about things, specifically that the brand new Nike shoes I bought\nsqueak to an extremely annoying degree. Is this a defect in my gait or in\nthe manufacturing?\u003c/p\u003e\n\u003cp\u003eTo my surprise they refunded me. WIN.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.themoviedb.org/tv/209851-mammoth\"\u003eMammoth\u003c/a\u003e is really good fun. Give it a go, there are only three episodes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was let down by two different tradespeople on the same day. A new, but\nunsurprising, record.\u003c/p\u003e",
      "date_published": "2024-04-21T00:00:00+00:00",
      "date_modified": "2024-04-21T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/146-fancy-italian-tomatoes/",
      "url": "https://elver.me/weeknotes/146-fancy-italian-tomatoes/",
      "title": "Weeknotes 146: Fancy Italian tomatoes",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe weeknotes have really suffered this week; can you guess why? The physical\nmove is a massive hassle, obviously, but it\u0026rsquo;s the admin and bureaucracy that\ngets you. Still, I am \u003cem\u003esort of\u003c/em\u003e getting excited about moving now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy Amazon account and debit card at getting absolutely hammered with stuff for\nthe new house 🔨\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn an attempt to continue my health and fitness progress I\u0026rsquo;ve signed up for a\nnew gym a 10 minute walk from my new house (I\u0026rsquo;m hoping this will mean at least\n\u003cem\u003esome\u003c/em\u003e steps each day). They happened to be running a special deal when I\nsigned up so I get my first month for £13, which is a nice way to see if it\nsuits me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been doing small, but tedious jobs around the flat this week. The flat,\nhas, in the past, suffered from some sort of water ingress as is evidenced by\npersistent water marks. We (all the residents in the building) had expensive\nchimney restoration done last year, and previous to that, a complete new flat\nroof.\u003c/p\u003e\n\u003cp\u003eStill, I have decoration issues inside which may be leading to something more\nas my attempts to \u0026ldquo;make it good\u0026rdquo; went downhill. I think I need an expert.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe started watching \u003ca href=\"https://www.themoviedb.org/tv/106379-fallout\"\u003eFallout\u003c/a\u003e and despite never having played the games I like\nit so far. Considering \u003ca href=\"https://www.themoviedb.org/movie/20766-the-road\"\u003eThe Road\u003c/a\u003e is one of my favourite films, anything with\na bit of apocalypse suits me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTaskmaster exposed me to \u003ca href=\"https://en.wikipedia.org/wiki/Sophie_Willan\"\u003eSophie Willan\u003c/a\u003e and I also started watching \u003ca href=\"https://en.wikipedia.org/wiki/Alma%27s_Not_Normal\"\u003eAlma\u0026rsquo;s\nNot Normal\u003c/a\u003e. Worth checking out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDespite being busy with loads of other stuff, I procrastinated enough to book\nmy hotel and train to \u003ca href=\"https://brightonruby.com/\"\u003eBrighton Ruby 2024 in June\u003c/a\u003e. I\u0026rsquo;m glad that\u0026rsquo;s sorted.\nI\u0026rsquo;m more interested in seeing friends than I am the conference tbh, but it\u0026rsquo;s\nbeen a constant for some years now, and I think that\u0026rsquo;s worth supporting. See\nyou then.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDon\u0026rsquo;t worry, I had still had time this week to uncontrollably, unnecessarily,\nworry about my current task at work. Sorted it now 🙄\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe attended a cookery course a few weeks ago which I seem to have forgotten to\nmention until now. One of the things we made was \u003ca href=\"https://en.wikipedia.org/wiki/Gnocchi\"\u003eGnoochi\u003c/a\u003e, which I\u0026rsquo;m\nambivalent to at best, but this turned out nice and we had a lot leftover to\nfreeze. So I made \u003ca href=\"https://www.foodiecrush.com/gnocchi-with-pomodoro-sauce/\"\u003ethis sauce\u003c/a\u003e to go with remainder this week \u0026ndash; recommended.\u003c/p\u003e\n\u003cp\u003eOf course, in order to do so these \u003ca href=\"https://www.amazon.co.uk/dp/B00UW9EFQY\"\u003efancy Italian tomatoes\u003c/a\u003e were absolutely\ncrucial to the success of the dish. I am a fool, but a happy one.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Great Move is next Friday. Will the weeknotes weather that storm?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe weeknotes have really suffered this week; can you guess why? The physical\nmove is a massive hassle, obviously, but it\u0026rsquo;s the admin and bureaucracy that\ngets you. Still, I am \u003cem\u003esort of\u003c/em\u003e getting excited about moving now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy Amazon account and debit card at getting absolutely hammered with stuff for\nthe new house 🔨\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn an attempt to continue my health and fitness progress I\u0026rsquo;ve signed up for a\nnew gym a 10 minute walk from my new house (I\u0026rsquo;m hoping this will mean at least\n\u003cem\u003esome\u003c/em\u003e steps each day). They happened to be running a special deal when I\nsigned up so I get my first month for £13, which is a nice way to see if it\nsuits me.\u003c/p\u003e",
      "date_published": "2024-04-14T00:00:00+00:00",
      "date_modified": "2024-04-14T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/145-completed-it-mate/",
      "url": "https://elver.me/weeknotes/145-completed-it-mate/",
      "title": "Weeknotes 145: Completed it mate",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAnother late weeknotes Jordan? \u0026lsquo;fraid so.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.pentagrid.ch/en/blog/ibis-hotel-check-in-terminal-keypad-code-leakage/\"\u003eIBIS hotel check-in terminal keypad-code leakage\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAfter a hacker congress in Hamburg, Pentagrid noticed that an IBIS Budget\nhotel check-in terminal leaked room keypad codes of almost half of the hotel\nrooms, when a users searches for a specific form of a non-alphanumeric\nbooking number.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd\u0026hellip;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWith a booking ID, guests can lookup their room number and keypad code.\nHowever, when entering a \u0026lsquo;\u0026mdash;\u0026mdash;\u0026rsquo; as booking ID, the check-in terminal lists\nother people\u0026rsquo;s bookings and keypad codes.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eOh dear.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/144-sneaky-backdoor/#:~:text=We%E2%80%99ve%20been%20catching%20up%20with%20The%20Bear\"\u003eFinished The Bear\u003c/a\u003e. Now I\u0026rsquo;m marking tupperware with green masking tape.\nBrilliant!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI needed to buy a new TV to leave behind when we move, so I\u0026rsquo;ve been scouring\n\u003ca href=\"https://www.hotukdeals.com/\"\u003ehotukdeals\u003c/a\u003e for something suitable. I finally settled on a \u003ca href=\"https://www.lg.com/uk/tvs-soundbars/smart-tvs/55ur78006lk/\"\u003eLG LED UR78 55\u0026quot;\n4K\u003c/a\u003e at the rather tidy price of £269.99, which I\u0026rsquo;m happy with. It isn\u0026rsquo;t nearly\nas good as the \u003ca href=\"https://www.philips.co.uk/c-p/55OLED754_12/oled-7-series-4k-uhd-oled-smart-tv-with-ambilight-3-sided/support\"\u003ePhilips\u003c/a\u003e I currently watch, but it\u0026rsquo;ll do for the intended\npurpose.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePRO-TIP: Don\u0026rsquo;t try and load your car with 25 flat pack cardboard boxes whilst\na storm named Kathleen is blowing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe completed on the new house \u003ca href=\"/weeknotes/144-sneaky-backdoor/#:~:text=Completion%20next%20week\"\u003eas planned\u003c/a\u003e this week. Despite the inevitable\nfaff and stress it was fairly straightforward in the end \u0026ndash; 3 months almost to\nthe day. We picked up the keys on Saturday and went for our first visit.\u003c/p\u003e\n\u003cp\u003eI was afraid I wouldn\u0026rsquo;t like the house after not having seen it for so long \u0026ndash;\na weird feeling. By the end of the visit I was happy and \u003cem\u003ealmost\u003c/em\u003e enthusiastic\nabout it.\u003c/p\u003e\n\u003cp\u003eHowever, the house has revealed to us just how much work needs doing. It\u0026rsquo;s\ncompletely liveable, but the list of self-imposed jobs is long.\u003c/p\u003e\n\u003cp\u003eThe previous owner left us a nice note, and the offer of an artwork his late\nwife had painted. A lovely gesture; but didn\u0026rsquo;t clean the oven. No one is\nperfect.\u003c/p\u003e\n\u003cp\u003eWe\u0026rsquo;ve hired a cleaning company to deep-clean before we properly move in\nbecause we\u0026rsquo;re part of the bourgeois middle classes now apparently, of which I\nam uncomfortable, but also because lazy.\u003c/p\u003e\n\u003cp\u003eWe move the majority of our stuff in a couple of weeks.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA new house is a good reason for a new gadget. I bought a \u003ca href=\"https://www.bosch-professional.com/gb/en/products/glm-40-0601072900\"\u003elaser tape\nmeasure\u003c/a\u003e. I \u003cem\u003eneed\u003c/em\u003e it for ALL THE MEASURING I\u0026rsquo;ll be doing!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.ispreview.co.uk/\"\u003eISPreview\u003c/a\u003e (my new favourite website) has a \u003ca href=\"https://www.ispreview.co.uk/index.php/2024/04/ipv6-and-cgnat-support-survey-of-uk-altnet-fttp-broadband-isps.html\"\u003enice overview of which ISPs\nsupport IPv6 and CGNAT\u003c/a\u003e \u0026ndash; a.k.a. how they give you an IP address for your\nbroadband connection. Generally, CGNAT = bad, IPv6 = good.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I learnt about the \u003ca href=\"https://en.wikipedia.org/wiki/Rhubarb_Triangle\"\u003eRhubarb Triangle\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe Rhubarb Triangle is a 9-square-mile (23 km2) area of West Yorkshire,\nEngland between Wakefield, Morley, and Rothwell famous for producing early\nforced rhubarb.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ePut the \u003ca href=\"https://experiencewakefield.co.uk/event/rhubarb-festival/\"\u003e21st February 2025 in your diary\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHealth-wise, I\u0026rsquo;ve been far more consistent with exercise (18 sessions in a\nrow) and diet (lost 10kg) recently (with the exception of this weekend as\ntravelling has made it difficult).\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m trying to get into a groove so that when I move, and am forced into new\nroutines, hopefully I can transition smoothly and continue a healthy lifestyle\njourney ™.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAnother late weeknotes Jordan? \u0026lsquo;fraid so.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.pentagrid.ch/en/blog/ibis-hotel-check-in-terminal-keypad-code-leakage/\"\u003eIBIS hotel check-in terminal keypad-code leakage\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAfter a hacker congress in Hamburg, Pentagrid noticed that an IBIS Budget\nhotel check-in terminal leaked room keypad codes of almost half of the hotel\nrooms, when a users searches for a specific form of a non-alphanumeric\nbooking number.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd\u0026hellip;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWith a booking ID, guests can lookup their room number and keypad code.\nHowever, when entering a \u0026lsquo;\u0026mdash;\u0026mdash;\u0026rsquo; as booking ID, the check-in terminal lists\nother people\u0026rsquo;s bookings and keypad codes.\u003c/p\u003e",
      "date_published": "2024-04-07T00:00:00+00:00",
      "date_modified": "2024-04-07T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/144-sneaky-backdoor/",
      "url": "https://elver.me/weeknotes/144-sneaky-backdoor/",
      "title": "Weeknotes 144: Sneaky backdoor",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou may have heard of security issue taking over the Internet this week.\nSomeone called Jia Tan seems to have been gradually sneaking a backdoor into\n\u003ccode\u003exz\u003c/code\u003e - a widely data compression library.\u003c/p\u003e\n\u003cp\u003eI haven\u0026rsquo;t kept up with everything but the things that stand out 1) it was\n\u003ca href=\"https://mastodon.social/@AndresFreundTec/112180083704606941\"\u003ediscovered by accident\u003c/a\u003e; 2) some automatic checks were sneakily disabled by\n\u003ca href=\"https://git.tukaani.org/?p=xz.git;a=commitdiff;h=328c52da8a2bbb81307644efdb58db2c422d9ba7\"\u003eadding a single period to the beginning of a line\u003c/a\u003e - would you have spotted\nthat in code review?\u003c/p\u003e\n\u003cp\u003eHere is a \u003ca href=\"https://boehs.org/node/everything-i-know-about-the-xz-backdoor\"\u003every exhaustive post detailing what\u0026rsquo;s happened\u003c/a\u003e by Evan Boehs.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDeposit transferred. Exchanged on Thursday. Completion next week. Let\u0026rsquo;s do\nthis!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://shkspr.mobi/blog/2024/03/theres-nothing-you-can-do-to-prevent-a-sim-swap-attack/\"\u003eThere’s nothing you can do to prevent a SIM-swap attack\u003c/a\u003e by Terence Eden is a\nvery scary prospect.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt is tempting to think that users are to blame for their own misfortune. If\nonly they\u0026rsquo;d had a stronger password! If only they didn\u0026rsquo;t re-use credentials!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI try to use an app-based 2nd factor when I can, but there are a lot of\nservices, especially important ones like banks, that will only send you an\nSMS.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/charmbracelet/freeze\"\u003eFreeze\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGenerate images of code and terminal output.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is \u003cem\u003echarming\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/ruby/ruby/commit/12be40ae6be78ac41e8e3f3c313cc6f63e7fa6c4\"\u003e\u0026ldquo;Chilled strings\u0026rdquo; are soon to be thing in Ruby\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAs a path toward enabling frozen string literals by default in the future,\nthis commit introduce \u0026ldquo;chilled strings\u0026rdquo;. From a user perspective chilled\nstrings pretend to be frozen, but on the first attempt to mutate them, they\nlose their frozen status and emit a warning rather than to raise a\n\u003ccode\u003eFrozenError\u003c/code\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI thought frozen strings were not happening, so this is an interesting\ndevelopment.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Rails docs are getting an overhaul and \u003ca href=\"https://edgeguides.rubyonrails.org/\"\u003ethey look promising so far\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe\u0026rsquo;ve been catching up with \u003ca href=\"https://www.themoviedb.org/tv/136315-the-bear\"\u003eThe Bear\u003c/a\u003e the last couple of weeks. I watched up\nto half way season 2 before but got distracted and never finished the series.\nThis is such good television.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.bitecode.dev/p/there-is-no-eu-cookie-banner-law\"\u003eThere is no EU cookie banner law\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;while people think terrible banners are legal requirements enforced from\nthe EU, most cookie banners are actually\u0026hellip; illegal according to the EU law.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHuh.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis situation is superbly paradoxical. And not just because Americans\ncomplaining about EU having too much influence outside of its border is peak\nirony.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e🔥\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fediverse.zachleat.com/@zachleat/112139706471681328\"\u003eFrom Zach Leatherman\u003c/a\u003e of \u003ca href=\"https://www.11ty.dev/\"\u003e11ty\u003c/a\u003e fame:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHere’s the source code between the doctype and the \u003ccode\u003e\u0026lt;title\u0026gt;\u003c/code\u003e for this site:\u003c/p\u003e\n\u003cp\u003e×26 \u003ccode\u003e\u0026lt;link rel=\u0026quot;preload\u0026quot;\u0026gt;\u003c/code\u003e\u003cbr\u003e\n×36 external \u003ccode\u003e\u0026lt;link rel=\u0026quot;stylesheet\u0026quot;\u0026gt;\u003c/code\u003e\u003cbr\u003e\n×91 external \u003ccode\u003e\u0026lt;script src\u0026gt;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eThis is not a nuanced point I’m making. We’re not debating the finer points\nof complicated web performance trade-offs. This is a very slow web site.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ePretty compelling, right?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStop GraphQL-ing, you are not Facebook.\u003c/p\u003e\n\u003cp\u003e(Yes, I did have to deal with GraphQL this week).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fly.io/phoenix-files/phoenix-dev-blog-server-logs-in-the-browser-console/\"\u003ePhoenix Dev Blog – Server logs in the browser console\u003c/a\u003e \u0026ndash; very nice.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLet’s collocate the server logs with the client logs! The first place you’re\ngoing to look while using the UI is the browser’s web console. Your UI\nframework logs and UI errors are already there and built into your workflow.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eYet another example of developer UX improvements in Phoenix apps.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou may have heard of security issue taking over the Internet this week.\nSomeone called Jia Tan seems to have been gradually sneaking a backdoor into\n\u003ccode\u003exz\u003c/code\u003e - a widely data compression library.\u003c/p\u003e\n\u003cp\u003eI haven\u0026rsquo;t kept up with everything but the things that stand out 1) it was\n\u003ca href=\"https://mastodon.social/@AndresFreundTec/112180083704606941\"\u003ediscovered by accident\u003c/a\u003e; 2) some automatic checks were sneakily disabled by\n\u003ca href=\"https://git.tukaani.org/?p=xz.git;a=commitdiff;h=328c52da8a2bbb81307644efdb58db2c422d9ba7\"\u003eadding a single period to the beginning of a line\u003c/a\u003e - would you have spotted\nthat in code review?\u003c/p\u003e",
      "date_published": "2024-03-31T00:00:00+00:00",
      "date_modified": "2024-03-31T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/143-swipe-down-to-die/",
      "url": "https://elver.me/weeknotes/143-swipe-down-to-die/",
      "title": "Weeknotes 143: Swipe down to die",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://indignity.substack.com/p/swipe-down-to-die\"\u003eSwipe down to die\u003c/a\u003e \u0026ndash; It seems a lot of car manufacturers are realising that\nphysical controls are good, actually. Except one.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWith your car rolling backwards out of control, simply turn your attention\nto the touchscreen—because there is no physical button to feel for—stab your\nfinger at the letter P, hit it precisely, and hold it there. What could be\neasier?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe arranged for a survey to be carried out last week at the new house. When\nbuying a house, it is nice to know if the house works.\u003c/p\u003e\n\u003cp\u003eThe company carrying out the survey ignored my pleas for an update for an\nENTIRE week, eventually responding without including the quote they blamed for\nthe delay.\u003c/p\u003e\n\u003cp\u003eDo you know what the quote looked like? It looked like a single line saying\n\u0026ldquo;Fix a thing £??? + VAT\u0026rdquo;. Then, they had the cheek to send their invoice\nrequiring payment \u003cem\u003ewithin one\u003c/em\u003e business day!\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ll be waiting a week to pay the invoice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEE continues to impress. I\u0026rsquo;ve been out and about this week and it has saved me\nfrom shitty coffee shop Wi-Fi a couple of times. Of course, my favourite\ncoffee shop still remains a blackspot, but the signal \u003cem\u003eis\u003c/em\u003e improved.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fosstodon.org/@AkaSci/112091847867604195\"\u003eDebugging Voyager 1\u003c/a\u003e when commands take 22.5 hours distance to reach the\ncomputer.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGood news from the Voyager 1 spacecraft that has been stuck sending a 0101\npattern since Nov 2023.\u003c/p\u003e\n\u003cp\u003eThe team has long suspected the root cause to be a corrupted area of memory\nin the FDS computer. On Mar 1, they sent some commands to make the FDS skip\naround sections of memory. The data stream rcvd 45 hours later looked\ndifferent and was decoded to contain a read-out of the entire FDS memory!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://motherduck.com/blog/perf-is-not-enough/\"\u003ePERF IS NOT ENOUGH\u003c/a\u003e \u0026ndash; interesting take on database performance.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePerformance in general, and general-purpose benchmarking in particular, is a\npoor way to choose a database. You’re better off making decisions based on\nease of use, ecosystem, velocity of updates, or how well it integrates with\nyour workflow.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe went over to Bath on Thursday to see Jonathan Pie at The Forum. It was very\nenjoyable, but very full on. Preaching to the choir, for sure, but it was a\nfun night out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA friend of mine had an idea for a SaaS web product. The product would need to\nexpose an endpoint to which JSON could be POSTed. It needs to be highly\navailable, and never drop a request. I find this very interesting.\u003c/p\u003e\n\u003cp\u003eIt made me think of \u003ca href=\"https://github.com/plausible/analytics/\"\u003ePlausible\u003c/a\u003e, a privacy friendly web analytics product\nwhich I use on my own websites. It\u0026rsquo;s written in Elixir, and is a very good\ncomparison problem space I think. Of course, Plausible has lots of features\nthat are a more traditional SaaS product, but the thing it needs to do very\nwell is ingest web analytics events and store them somewhere for later\nanalysis.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve never worked on, or been solely responsible for, a very highly available\nservice like this. To be honest, I find the idea a bit scary. But I also find\nit really interesting. How do you receive and persist loads of events like\nthis with no downtime?\u003c/p\u003e\n\u003cp\u003eWell, Elixir is about processes. They are not comparable to OS processes;\nthey\u0026rsquo;re far cheaper and lightweight. I looked at the Plausible source code and\nthe way they do it is to have an Elixir process which receives and buffers\nevents, and they periodically flush the events to disk (aka write them to a\ndatabase).\u003c/p\u003e\n\u003cp\u003eHow do you end up with certain magic numbers in a system like this? How many\nevents do you buffer, and how often do you choose to flush them to the\ndatabase? I have \u003cem\u003eno\u003c/em\u003e idea where to start.\u003c/p\u003e\n\u003cp\u003eI often look at software and assume that the end product is a result of\ngenius, but in reality it\u0026rsquo;s more than likely the result of trial and error.\nStart with buffering 100 events, test, and see what happens. How often should\nyou flush to disk? Choose a number of seconds, and test, test, test.\u003c/p\u003e\n\u003cp\u003eA realistic, repeatable, test script is your friend.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which\u0026hellip;I tried out \u003ca href=\"https://github.com/wg/wrk\"\u003e\u003ccode\u003ewrk\u003c/code\u003e\u003c/a\u003e and it seems really neat. You can\nscript your load tests using Lua.\u003c/p\u003e\n\u003cp\u003eStill, one of the biggest issues for me with load testing is coming up with\nrealistic numbers to use in tests. How many concurrent users? How many\nrequests? Tricky.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://indignity.substack.com/p/swipe-down-to-die\"\u003eSwipe down to die\u003c/a\u003e \u0026ndash; It seems a lot of car manufacturers are realising that\nphysical controls are good, actually. Except one.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWith your car rolling backwards out of control, simply turn your attention\nto the touchscreen—because there is no physical button to feel for—stab your\nfinger at the letter P, hit it precisely, and hold it there. What could be\neasier?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe arranged for a survey to be carried out last week at the new house. When\nbuying a house, it is nice to know if the house works.\u003c/p\u003e",
      "date_published": "2024-03-24T00:00:00+00:00",
      "date_modified": "2024-03-24T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/142-blazingly-fast-wi-fi/",
      "url": "https://elver.me/weeknotes/142-blazingly-fast-wi-fi/",
      "title": "Weeknotes 142: Blazingly fast Wi-Fi",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe house: One step forward. One step backward.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eApparently I\u0026rsquo;ve reached the age where I\u0026rsquo;m being randomly asked by the local GP\nto go in for annual blood tests 🤷‍♂️\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe new \u003ca href=\"https://techspecs.ui.com/unifi/wifi/u6-pro#datasheet\"\u003eU6 Pro AP\u003c/a\u003e \u003ca href=\"/weeknotes/141-waiting-for-the-line-to-settle/#:~:text=Buy%20a%20faster%20UniFi%20AP\"\u003eI ordered last week to try and boost my Wi-Fi speeds\u003c/a\u003e\narrived as scheduled on Monday. I ordered the U6 Pro because it was the\nfastest AP available that still worked on standard PoE. I haven\u0026rsquo;t been keeping\nup with the latest developments in PoE technology, but a new standard, PoE+,\nnow exists which can supply more power. I am not in the mood for upgrading\nswitches, so the choice was made.\u003c/p\u003e\n\u003cp\u003eIt was impressively easy to setup, of which I was very glad. I plugged it into\na PoE capable Ethernet cable and it sprung to life. After a brief booting up\nperiod I started getting notifications on my watch that it was ready to adopt\n(because I have the UniFi iOS installed on my phone). It updated itself to the\nlatest firmware and became available in the UniFi controller, and once I\nclicked \u0026ldquo;Adopt\u0026rdquo;, it was working. Slick.\u003c/p\u003e\n\u003cp\u003eSo did I achieve my goals of improving Wi-Fi speeds? Yes, but I did end up\nhaving to make some small configuration changes to do so. I changed the\nchannel width on the 5GHz network to 80MHz.\u003c/p\u003e\n\u003cp\u003eI ran some speed tests and I achieved 503.98Mbps in the front room around 2\nmetres from the AP, and 447.80Mbps in my office around 5/6 metres from the AP\nwith walls in the way.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://johnskinnerportfolio.com/blog/ruby_330_error.html\"\u003eOpenSSL error installing Ruby\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI am having a persistent problem installing Ruby. It is OpenSSL problem, one\nthat a lot of other people in the Ruby community also seem to be banging\ntheir heads against.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve experienced this and it can be extremely stressful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://social.jvns.ca/@b0rk/112078499917987668\"\u003eJulia Evans on git merges\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ea bunch of people have said that they feel embarrassed that they\u0026rsquo;re still\nconfused about which side of a merge conflict is which, even after many\nyears using git.\u003c/p\u003e\n\u003cp\u003eI want to say that I have a hard time with it too (and I am uh EXTREMELY\nconfident in my git skills at this point).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eOf the many things I like about Julia Evans, it\u0026rsquo;s her willingness to say she\ndoesn\u0026rsquo;t know something. This is very comforting in this\nyou-must-know-everything industry.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou know what really gets my goat? (I might have ranted about this before).\nThose of us who work on the web, know, and use URLs. The Uniform Resource\nLocator. The way we find our way to websites. So why, do so many of us insist\non sending cropped screenshots around when a URL is so much better? WHY?!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://tonsky.me/blog/js-bloat/\"\u003eJavaScript Bloat in 2024\u003c/a\u003e \u0026ndash; the sizes of websites today. Web developers\neverywhere hang your heads in shame.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCompare it to people who really care about performance — Pornhub, 1.4 MB\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNice one, Pornhub.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy smart lock kept notifying me that it had lost it\u0026rsquo;s Wi-Fi connection this\nweek. My heart sank. I really don\u0026rsquo;t need to be trying to fix Wi-Fi connectivity\nissues whilst 4 hours drive away, especially when that Wi-Fi controls access to\nthe building.\u003c/p\u003e\n\u003cp\u003eAlmost all the notifications happened on the same day, with a couple trickling\nin the day after. I know I\u0026rsquo;ve just changed my Access Point, but the sporadic\nnature of the notifications was the strangest thing.\u003c/p\u003e\n\u003cp\u003eAll quiet since then, so hopefully we can blame sunspots and move on.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs part of my new broadband, EE offer a discount on mobile contracts. \u003ca href=\"/weeknotes/109-payg-esim/#:~:text=Lyca%20Mobile%2C%20who%20piggyback%20on%20EE%20and%20offer%20PAYG%20with%20an%20eSIM\"\u003eI\u0026rsquo;ve\nflirted with the idea of moving to the EE network before\u003c/a\u003e, but this move meant\nfull unadulterated access to EE\u0026rsquo;s coverage and speed.\u003c/p\u003e\n\u003cp\u003eI have little doubt that Three remains the best for raw speed (I once tested\n970Mbps in Sheffield City centre) but the speed means nothing if you don\u0026rsquo;t\nhave a signal. And I was not having a signal quite a lot.\u003c/p\u003e\n\u003cp\u003eI was with SMARTY before which cost £10 a month for 60GB of data (which I\nnever used, but was a promotional offer). I\u0026rsquo;m now paying £16 a month with EE\nfor unlimited data (which I also won\u0026rsquo;t use).\u003c/p\u003e\n\u003cp\u003eThe number porting was a thankfully smooth process. Time will tell if the\ncoverage is overall better.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which, the broadband also comes with 6 months of Apple Music (So.\nMuch. Value!) so I\u0026rsquo;m also trialling that. I guess it shouldn\u0026rsquo;t be surprising\nthat moving away from Spotify is difficult.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI discovered that my toilet seat has a button that allows it to simply unclip\nfrom the main bowl. What a revelation.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe house: One step forward. One step backward.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eApparently I\u0026rsquo;ve reached the age where I\u0026rsquo;m being randomly asked by the local GP\nto go in for annual blood tests 🤷‍♂️\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe new \u003ca href=\"https://techspecs.ui.com/unifi/wifi/u6-pro#datasheet\"\u003eU6 Pro AP\u003c/a\u003e \u003ca href=\"/weeknotes/141-waiting-for-the-line-to-settle/#:~:text=Buy%20a%20faster%20UniFi%20AP\"\u003eI ordered last week to try and boost my Wi-Fi speeds\u003c/a\u003e\narrived as scheduled on Monday. I ordered the U6 Pro because it was the\nfastest AP available that still worked on standard PoE. I haven\u0026rsquo;t been keeping\nup with the latest developments in PoE technology, but a new standard, PoE+,\nnow exists which can supply more power. I am not in the mood for upgrading\nswitches, so the choice was made.\u003c/p\u003e",
      "date_published": "2024-03-17T00:00:00+00:00",
      "date_modified": "2024-03-17T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/141-waiting-for-the-line-to-settle/",
      "url": "https://elver.me/weeknotes/141-waiting-for-the-line-to-settle/",
      "title": "Weeknotes 141: Waiting for the line to settle",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/139-i-m-a-swiftie-now/#:~:text=Somewhat%20on%20a%20whim%20I%20decided%20to%20start%20learning%20Swift%20UI\"\u003eMy Swift UI learning\u003c/a\u003e has continued steadily. I will probably need a project\nto work on soon or I might lose interest. The issue is that I find made-up\nlearning projects difficult to commit to. I know that the learning is in and\nof itself the valuable part, but my brain still isn\u0026rsquo;t convinced. On the other\nhand I\u0026rsquo;m not experienced enough to take on any real work.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://xcodereleases.com/\"\u003eXcode Releases\u003c/a\u003e \u0026ndash; a handy website if you want to keep up with the latest\nXcode releases via various feed formats.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe got over one of the two remaining hurdles with the new house this week,\nwhich was a relief. Another one to go 🤞 I\u0026rsquo;m starting to become disillusioned\nwith our solicitor though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen my \u003ca href=\"/weeknotes/140-paint-factory/#:~:text=I%20now%20have%20fibre%20to%20the%20premises\"\u003enew broadband was installed last week\u003c/a\u003e I immediately ran a speed test\nto see what I was actually achieving in speed vs what was advertised. And I\nwas getting slightly below or above 500Mbps \u0026ndash; good times.\u003c/p\u003e\n\u003cp\u003eThe engineer stressed that leaving the ISP-supplied router plugged in until\nthe next day (Friday) would be a good idea for the \u0026ldquo;line to settle\u0026rdquo;, whatever\nthat means. I dutifully did so until Sunday when I had time to transition back\nto my usual over-the-top UniFi networking gear.\u003c/p\u003e\n\u003cp\u003eThis meant setting up my UniFi router to connect to EE\u0026rsquo;s network using \u003ca href=\"https://en.wikipedia.org/wiki/Point-to-Point_Protocol_over_Ethernet\"\u003ePPPoE\u003c/a\u003e.\nI expected a hassle, but I was pleasantly surprised upon plugging in my own\nequipment that everything just sprung into action. No username or password\nchanges. No configuration change at all. It just worked!\u003c/p\u003e\n\u003cp\u003eHowever the speedtest told a different story this time. Now I was only getting\nabout half of what I should ~250Mbps. Strange. I initially assumed that my\nUniFi gateway couldn\u0026rsquo;t handle the faster Internet speed so I turned off\ntraffic inspection which I\u0026rsquo;d read can slow things down, and Googled other\nsoftware fixes to no avail.\u003c/p\u003e\n\u003cp\u003eThen it dawned on me that I should try a speedtest using an Ethernet\nconnection to rule out Wi-Fi being the issue (I used the Speedtest tvOS app on\nmy Apple TV for this!). This confirmed Wi-Fi \u003cem\u003ewas\u003c/em\u003e the issue as I got my full\nInternet allowance via Ethernet.\u003c/p\u003e\n\u003cp\u003eSo the ISP router, supplied for free, can achieve better Wi-Fi performance that\nmy fancy UniFi gear, which shouldn\u0026rsquo;t be that surprising given that the UniFi\nAP is nearly 6 years old.\u003c/p\u003e\n\u003cp\u003eThere are two ways to go about fixing this: 1) Look at tweaking the existing\nAP configuration whilst having no idea what I\u0026rsquo;m doing, or 2) Buy a faster\nUniFi AP and hope. \u003ca href=\"https://techspecs.ui.com/unifi/wifi/u6-pro#datasheet\"\u003eThe new AP\u003c/a\u003e arrives next week.\u003c/p\u003e\n\u003cp\u003eIf it doesn\u0026rsquo;t fix the issue in a plug-and-play fashion I might return it and\ngo back to step 1.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI saw Dune 2 last Sunday. Better pacing, and things \u003cem\u003ehappen\u003c/em\u003e. I really enjoyed\nit and am looking forward to the next film. I also found out that a TV series,\n\u003ca href=\"https://www.themoviedb.org/tv/90228-dune-the-sisterhood\"\u003eDune: Prophecy\u003c/a\u003e, is currently being made!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.npr.org/sections/thesalt/2015/03/26/394339284/how-snobbery-helped-take-the-spice-out-of-european-cooking\"\u003eHow Snobbery Helped Take The Spice Out Of European Cooking\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBack in the Middle Ages, spices were really expensive, which meant that only\nthe upper class could afford them. But things started to change as Europeans\nbegan colonizing parts of India and the Americas.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWhat I took away from this is that snobbery has robbed me of eating Chicken\nTikka Masala for dinner every day.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs \u003ca href=\"/weeknotes/140-paint-factory/#:~:text=taken%20away%20on%20holiday\"\u003eI mentioned last week\u003c/a\u003e we were going away for a long weekend. The surprise\nlocation was Porto, Portugal. Porto must have the most changeable weather I\u0026rsquo;ve\never experienced which has made experiencing it a bit more difficult than we\nwould have liked. We\u0026rsquo;ve enjoyed our visit though.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/139-i-m-a-swiftie-now/#:~:text=Somewhat%20on%20a%20whim%20I%20decided%20to%20start%20learning%20Swift%20UI\"\u003eMy Swift UI learning\u003c/a\u003e has continued steadily. I will probably need a project\nto work on soon or I might lose interest. The issue is that I find made-up\nlearning projects difficult to commit to. I know that the learning is in and\nof itself the valuable part, but my brain still isn\u0026rsquo;t convinced. On the other\nhand I\u0026rsquo;m not experienced enough to take on any real work.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://xcodereleases.com/\"\u003eXcode Releases\u003c/a\u003e \u0026ndash; a handy website if you want to keep up with the latest\nXcode releases via various feed formats.\u003c/p\u003e",
      "date_published": "2024-03-10T00:00:00+00:00",
      "date_modified": "2024-03-10T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/140-paint-factory/",
      "url": "https://elver.me/weeknotes/140-paint-factory/",
      "title": "Weeknotes 140: Paint Factory",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/2024/3/1/24087666/apple-disable-iphone-web-apps-eu-reversal\"\u003eNow Apple says it won’t disable iPhone web apps in the EU\u003c/a\u003e \u0026ndash; great news. Now\nwe can all go back to not using PWAs as before.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe house purchase remains a constant anxiety. Hopefully we are approaching\nthe end, but every time we make progress something else crops up.\u003c/p\u003e\n\u003cp\u003eWaiting, waiting, waiting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAll \u003ca href=\"/weeknotes/135-planning-stages/#:~:text=guess%20what%E2%80%99s%20happened%3F-,Yep%2C%20FTTP%20is%20here,-and%20I%20can\"\u003ethis talk of  broadband\u003c/a\u003e led me to pull the plug and upgrade to FTTP,\nsaving money in the process. The installation was delayed a few days because\nthe first engineer didn\u0026rsquo;t have long enough ladders. The second engineer who\ncame a couple of days later didn\u0026rsquo;t use a ladder at all! Anyway, I now have\nfibre to the premises. I had to be restrained and not go for the 1.6Gbps\nvariation. Instead, I\u0026rsquo;m slumming it with a mere 500Mbps.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDan Cederholm over at \u003ca href=\"https://simplebits.shop/\"\u003eSimpleBits\u003c/a\u003e has released his new typeface, \u003ca href=\"https://simplebits.shop/products/paint-factory\"\u003ePaint\nFactory\u003c/a\u003e. It\u0026rsquo;s a beaut.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was sorry to hear of Dave Myers death this week. \u003ca href=\"https://www.theguardian.com/tv-and-radio/2024/feb/29/genuinely-groundbreaking-how-the-hairy-bikers-dave-myers-redefined-masculinity-on-british-tv\"\u003eThis is a lovely tribute\nto the man\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt was, in retrospect, a fairly accurate depiction of the perfect male\nfriendship.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/139-i-m-a-swiftie-now/#:~:text=Installing%20my%20new%20smart%20lock\"\u003eThe smart lock\u003c/a\u003e. I had to swallow my pride and call in an expert. He was\nstumped for quite a long time too, which did make me feel better. In the end\nhe slightly adjusted the positioning - and I mean slightly; barely a\nmillimetre - and it now appears to be working.\u003c/p\u003e\n\u003cp\u003eIt seems the tolerances for a working lock are quite precise. I\u0026rsquo;m glad it\u0026rsquo;s\nnow working for the bargain sum of £40. I still don\u0026rsquo;t fully trust it but will\nbe trying it out over the next few weeks.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eApparently Windows is suddenly a good OS for web development. I wonder what\ncould\u0026rsquo;ve prompted such a change of heart 🤔\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s my birthday next week (27 actually, thanks) and I\u0026rsquo;m being taken away on\nholiday so there will be a blissful 3 day week 👌\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/2024/3/1/24087666/apple-disable-iphone-web-apps-eu-reversal\"\u003eNow Apple says it won’t disable iPhone web apps in the EU\u003c/a\u003e \u0026ndash; great news. Now\nwe can all go back to not using PWAs as before.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe house purchase remains a constant anxiety. Hopefully we are approaching\nthe end, but every time we make progress something else crops up.\u003c/p\u003e\n\u003cp\u003eWaiting, waiting, waiting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAll \u003ca href=\"/weeknotes/135-planning-stages/#:~:text=guess%20what%E2%80%99s%20happened%3F-,Yep%2C%20FTTP%20is%20here,-and%20I%20can\"\u003ethis talk of  broadband\u003c/a\u003e led me to pull the plug and upgrade to FTTP,\nsaving money in the process. The installation was delayed a few days because\nthe first engineer didn\u0026rsquo;t have long enough ladders. The second engineer who\ncame a couple of days later didn\u0026rsquo;t use a ladder at all! Anyway, I now have\nfibre to the premises. I had to be restrained and not go for the 1.6Gbps\nvariation. Instead, I\u0026rsquo;m slumming it with a mere 500Mbps.\u003c/p\u003e",
      "date_published": "2024-03-03T00:00:00+00:00",
      "date_modified": "2024-03-03T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/139-i-m-a-swiftie-now/",
      "url": "https://elver.me/weeknotes/139-i-m-a-swiftie-now/",
      "title": "Weeknotes 139: I'm a Swiftie now",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eInstalling my new smart lock was very not easy, even with the skills of my\ngood friend helping. Let\u0026rsquo;s just say we managed to burn a small hole in the\ncarpet.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOk. I don\u0026rsquo;t have a clue about \u003ca href=\"https://mastodon.social/@fj/111969752716686597\"\u003ehow this works\u003c/a\u003e. I don\u0026rsquo;t math good.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDelighted to announce iMessage PQ3, our formally-verified protocol for\nend-to-end encryption that provides the strongest post-quantum protections\nagainst “Harvest Now, Decrypt Later” attackers by not only performing a\nquantum-secure key establishment, but also performing post-quantum ongoing\nrekeying.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI don\u0026rsquo;t use iMessage at all, but seems good.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSomewhat on a whim I decided to start learning Swift UI. And, by association,\nSwift I guess ;) Saying that, building UIs with Swift UI very much feels like\nusing a DSL so there is much to learn language-wise.\u003c/p\u003e\n\u003cp\u003eSome thoughts as a complete beginner:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve found it very approachable so far.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThere are a lot of very high-quality learning resources available.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFairly complex looking view stuff is very easy to achieve - I had something\nresembling an app UI very quickly. I expect the stuff that isn\u0026rsquo;t easy is\n\u003cem\u003every\u003c/em\u003e hard. We will see.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUsing XCode is not horrendous, but not great either. I have Vim keybindings\nturned on, but of course that means you only get default Vim behaviour, not\nthe countless muscle memory configurations I have added over the years, so\nit isn\u0026rsquo;t perfect.\u003c/p\u003e\n\u003cp\u003eIt crashes; often.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePreviews are very handy and provide really good feedback \u0026ndash; they also need\n\u0026ldquo;resuming\u0026rdquo; a lot when a build failed \u0026ndash; \u003ckbd\u003eOpt\u003c/kbd\u003e + \u003ckbd\u003eCmd\u003c/kbd\u003e +\n\u003ckbd\u003eP\u003c/kbd\u003e is your friend.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eProperty Wrappers are nice, and are used a lot.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSwift interpolation and closure variable syntax is weird.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://developer.apple.com/sf-symbols/\"\u003eSF Symbols\u003c/a\u003e are vast. It\u0026rsquo;s great to have this built-in, especially when\nlearning.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAny integrating with \u003ca href=\"https://developer.apple.com/documentation/uikit\"\u003eUIKit\u003c/a\u003e feels scary and opaque. Avoiding that for now.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSo far I don\u0026rsquo;t feel like a complete loser as I\u0026rsquo;m learning. I think it\u0026rsquo;s\nbecause this is definitely outside of my wheelhouse, so my usual expectation\nthat I should know everything doesn\u0026rsquo;t come into play.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLots of interesting \u003ca href=\"https://jvns.ca/blog/2024/02/16/popular-git-config-options/\"\u003egit configuration options compiled by Julia Evans\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/tummychow/git-absorb\"\u003e\u003ccode\u003egit-absorb\u003c/code\u003e\u003c/a\u003e looks cool. I want to try this but I haven\u0026rsquo;t needed it yet!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYou have a feature branch with a few commits. Your teammate reviewed the\nbranch and pointed out a few bugs. You have fixes for the bugs, but you\ndon\u0026rsquo;t want to shove them all into an opaque commit that says fixes, because\nyou believe in atomic commits.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLander was one of the first games I played. I remember it being very tricky.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLander was the very first game to be released for the ARM processor, and it\nis both a milestone and a masterpiece.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMark Moxon has created \u003ca href=\"https://lander.bbcelite.com/\"\u003ethis awesome website\u003c/a\u003e about\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis site contains reconstructed source code for Lander, David Braben\u0026rsquo;s epic\ngame for the Acorn Archimedes, with every single line documented and (for\nthe most part) explained.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI love this kind of deep dive.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe ending of True Detective didn\u0026rsquo;t quite wrap up things how I would have\nliked. They refer to previous series\u0026rsquo; and then don\u0026rsquo;t tie up the loose ends as\nfar as I could tell. Even so, I really enjoyed the series, but it doesn\u0026rsquo;t even\ncome close to the first (and neither do the others either).\u003c/p\u003e\n\u003cp\u003eA series 5 has been announced already.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mastodon.social/@stroughtonsmith/111970198404398471\"\u003e\u0026ldquo;We\u0026rsquo;re back to this again.\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis idea that we\u0026rsquo;re all thickos for clearing the launcher does indeed need to\nstop. I\u0026rsquo;m not closing apps because I\u0026rsquo;m saving precious iPhone memory; I\u0026rsquo;m\nclosing them so I can find things later!\u003c/p\u003e\n\u003cp\u003eThe UI is bad.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had to deal with a pretty difficult rebase this week. In the end, I failed.\u003c/p\u003e\n\u003cp\u003eUsually when I get conflicts during a rebase I will manually fix the conflict\nin Vim (\u003ca href=\"https://social.jvns.ca/@b0rk/111975796153138514\"\u003eincidentally it seems I am not alone\u003c/a\u003e). This is, for the most part,\neasy because code conflicts tend to be manageable in terms of the size of the\nchange. However, this conflict was caused my a very large (38k+ lines)\nautomated log file committed to the repo.\u003c/p\u003e\n\u003cp\u003eThe conflict markers contained such big chunks that I couldn\u0026rsquo;t visually see\nthe changes all at once which made choosing which part was correct very\ndifficult. I thought maybe this was the time to investigate a dedicated a\nmergetool, but after trying \u003ccode\u003evimdiff\u003c/code\u003e and VSCode I gave up.\u003c/p\u003e\n\u003cp\u003eIn the end I created a new branch and hacked it about until things were\nworking, but it did not feel satisfactory. This needs improvement.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"https://mastodon.social/@castropodcasts/111964488680823411\"\u003enew owners of Castro are communicating\u003c/a\u003e better.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYesterday we successfully deployed new appservers for Castro. This included\nthe first substantial code changes to the server in about a year. This\nmorning, \u0026ldquo;popular\u0026rdquo; feeds are the most up-to-date they\u0026rsquo;ve been since\nNovember.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWell done. I have re-subscribed, because this looks promising, and the\nalternatives are not good.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eInstalling my new smart lock was very not easy, even with the skills of my\ngood friend helping. Let\u0026rsquo;s just say we managed to burn a small hole in the\ncarpet.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOk. I don\u0026rsquo;t have a clue about \u003ca href=\"https://mastodon.social/@fj/111969752716686597\"\u003ehow this works\u003c/a\u003e. I don\u0026rsquo;t math good.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDelighted to announce iMessage PQ3, our formally-verified protocol for\nend-to-end encryption that provides the strongest post-quantum protections\nagainst “Harvest Now, Decrypt Later” attackers by not only performing a\nquantum-secure key establishment, but also performing post-quantum ongoing\nrekeying.\u003c/p\u003e",
      "date_published": "2024-02-25T00:00:00+00:00",
      "date_modified": "2024-02-25T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/138-minimum-version/",
      "url": "https://elver.me/weeknotes/138-minimum-version/",
      "title": "Weeknotes 138: Minimum version",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I\u0026rsquo;ve been making lists of drain, gutter, and woodworm experts. It\u0026rsquo;s\na lot of fun.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/rails/rails/pull/50505\"\u003eAdd allow_browser to set minimum versions for your application\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eShouldn\u0026rsquo;t a web framework default be what the majority of people using the\nframework would want rather than the whims of the few?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which, how\u0026rsquo;s that Progressive Web App plan going now that \u003ca href=\"https://www.theregister.com/2024/02/16/apple_web_apps/\"\u003eApple is\ncrippling them in the EU\u003c/a\u003e?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThese weeknotes use two different typefaces. I\u0026rsquo;ve self-hosted one of them\nsince the beginning because I bought it specifically but the other was hosted\non Google Fonts\u0026rsquo; CDN. I was always unsure (still am) about what is best\nperformance-wise.\u003c/p\u003e\n\u003cp\u003eAnyway, I am now self-hosting. I downloaded \u003ca href=\"https://fonts.google.com/specimen/Montserrat\"\u003eMontserrat from Google Fonts\u003c/a\u003e and\nthen converted the \u003ca href=\"https://en.wikipedia.org/wiki/TrueType\"\u003eTrueType\u003c/a\u003e to a \u003ca href=\"https://en.wikipedia.org/wiki/Web_Open_Font_Format\"\u003eWOFF\u003c/a\u003e like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ brew install woff2\n\n$ woff2_compress static/fonts/Montserrat-Bold.ttf\nProcessing static/fonts/Montserrat-Bold.ttf =\u0026gt; static/fonts/Montserrat-Bold.woff2\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe conversion shaves off quite a few bytes.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e193K Montserrat-Bold.ttf\n 61K Montserrat-Bold.woff2\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDid you know you should receive automatic compensation from your ISP \u003cem\u003eif\u003c/em\u003e they\nare signed up to the \u003ca href=\"https://www.ofcom.org.uk/phones-telecoms-and-internet/advice-for-consumers/costs-and-billing/automatic-compensation-need-know\"\u003eAutomatic compensation scheme\u003c/a\u003e? This includes failure to\ninstall a service on time, delays in fixing etc.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI bought my smart look this week. You\u0026rsquo;ll hear about it if I get locked out of\nmy house 👀\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy broadband searching led me to a term I\u0026rsquo;ve heard many times, but never\nreally understood \u0026ndash; Peering.\u003c/p\u003e\n\u003cp\u003eWhat is Peering? Well, the Internet is actually made up of lots of smaller\nnetworks. Getting from one place to another means the traffic needs to be\nrouted via many different networks. Without adequate peering agreements\ntraffic may have to flow through non-optimal routes.\u003c/p\u003e\n\u003cp\u003ePeering is generally an agreement between network providers to allow traffic\nto flow through their networks, improving resiliency and/or latency, as\ntraffic can now flow more directly.\u003c/p\u003e\n\u003cp\u003eYou can even lookup what peering an ISP has at PeeringDB. For example, \u003ca href=\"https://www.peeringdb.com/net/118\"\u003eyou\ncan see that BT have many peers\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe structural survey from last week has created a lot of admin in the form of\nasking for and gathering quotes for various checks, services, and works. This\nis home ownership.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI didn\u0026rsquo;t see \u003ca href=\"https://www.ispreview.co.uk/index.php/2024/02/revolut-becomes-first-uk-financial-institution-to-launch-esim.html\"\u003eRevolut being the company to introduce an eSIM\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://turso.tech/\"\u003e\u0026ldquo;Turso makes it easy to offer one database per tenant on your SaaS platform.\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis is kinda what Fly are aiming for too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOne of the core developers of nginx \u003ca href=\"http://freenginx.org/pipermail/nginx/2024-February/000000.html\"\u003ehas forked the project\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUnfortunately, some new non-technical management at F5 recently decided that\nthey know better how to run open source projects.  In particular, they\ndecided to interfere with security policy nginx uses for years, ignoring\nboth the policy and developers’ position.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://visualstudiomagazine.com/articles/2024/01/25/copilot-research.aspx\"\u003eNew GitHub Copilot Research Finds \u0026lsquo;Downward Pressure on Code Quality\u0026rsquo;\u003c/a\u003e \u0026ndash;\n\u003cem\u003eShocking\u003c/em\u003e news.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fly.io/blog/tigris-public-beta/\"\u003eFly.io are partnering with Tigris\u003c/a\u003e to give their customers access to an\nS3-compatible object store that is globally distributed by default.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI know how this looks for a lot of you. It looks like we’re partnering with\nTigris because we’re chicken, and we didn’t want to build something like\nthis. Well, guess what: you’re right!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI added a \u003ca href=\"https://www.jsonfeed.org/\"\u003eJSON Feed\u003c/a\u003e feed to this site this week. Why? I dunno. All the cool\nkids seem to be doing it, so I thought \u0026ldquo;why not?\u0026rdquo; \u0026ndash; it is accessible at\n\u003ca href=\"https://weeknotes.elver.me/feed.json\"\u003ehttps://weeknotes.elver.me/feed.json\u003c/a\u003e if you\u0026rsquo;re so inclined.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI can feel the pull of home automation. I feel it\u0026rsquo;s presence. Soon.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I\u0026rsquo;ve been making lists of drain, gutter, and woodworm experts. It\u0026rsquo;s\na lot of fun.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/rails/rails/pull/50505\"\u003eAdd allow_browser to set minimum versions for your application\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eShouldn\u0026rsquo;t a web framework default be what the majority of people using the\nframework would want rather than the whims of the few?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which, how\u0026rsquo;s that Progressive Web App plan going now that \u003ca href=\"https://www.theregister.com/2024/02/16/apple_web_apps/\"\u003eApple is\ncrippling them in the EU\u003c/a\u003e?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThese weeknotes use two different typefaces. I\u0026rsquo;ve self-hosted one of them\nsince the beginning because I bought it specifically but the other was hosted\non Google Fonts\u0026rsquo; CDN. I was always unsure (still am) about what is best\nperformance-wise.\u003c/p\u003e",
      "date_published": "2024-02-18T00:00:00+00:00",
      "date_modified": "2024-02-18T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/137-tune/",
      "url": "https://elver.me/weeknotes/137-tune/",
      "title": "Weeknotes 137: Tune",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I\u0026rsquo;ve been I\u0026rsquo;ve been borderline obsessed with \u003ca href=\"https://en.wikipedia.org/wiki/Yes_(McAlmont_%26_Butler_song)\"\u003eMcAlmont \u0026amp; Butlers'\nYes\u003c/a\u003e. Tune.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSlow week, link-wise, but a lot of admin has been underway. Never ending admin.\nIt\u0026rsquo;s a bit of a rollercoaster as some days it feels under control and then\nsomething else needs doing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m still \u003ca href=\"/weeknotes/135-planning-stages/#:~:text=The%20only%20real%20option%20at%20the%20new%20house%20is%201Gbps%20Virgin\"\u003eperiodically checking my new postcode\u003c/a\u003e against broadband providers\nwebsites.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI also bit the bullet and placed an order for 500Mbps fibre at my current\naddress \u0026ndash; it should be cheaper and faster. The installation is booked near to\nthe end of the month, so fingers crossed they can successfully install it and\nI can make my UniFi gear co-operate.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ground.news\"\u003eGround News\u003c/a\u003e \u0026ndash; A news website which shows the political leanings of the\nvarious sources reporting it. Interesting idea.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA FAQ section on your website is not a replacement for a well thought out\ninformation architecture. Please.\u003c/p\u003e\n\u003cp\u003e(Yes, it\u0026rsquo;s been necessary to browse \u003cem\u003ea lot\u003c/em\u003e of FAQs this week :-/).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYet another car service required this week. It went without incident; the\nworst part being the trudge into town in drizzle, and the bill when picking it\nup.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe structural survey we\u0026rsquo;d booked for the new house was moved forward due to a\ncancellation so we already have the results of that. I am yet to read it\nthoroughly, but there wasn\u0026rsquo;t anything to stop the purchase. But there are\nthings that need doing, but it\u0026rsquo;s better to know than not I guess.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTrue Detective Season 4 is still good, but I\u0026rsquo;m worried there is only a single\nepisode left and lots to wrap up still.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I\u0026rsquo;ve been I\u0026rsquo;ve been borderline obsessed with \u003ca href=\"https://en.wikipedia.org/wiki/Yes_(McAlmont_%26_Butler_song)\"\u003eMcAlmont \u0026amp; Butlers'\nYes\u003c/a\u003e. Tune.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSlow week, link-wise, but a lot of admin has been underway. Never ending admin.\nIt\u0026rsquo;s a bit of a rollercoaster as some days it feels under control and then\nsomething else needs doing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m still \u003ca href=\"/weeknotes/135-planning-stages/#:~:text=The%20only%20real%20option%20at%20the%20new%20house%20is%201Gbps%20Virgin\"\u003eperiodically checking my new postcode\u003c/a\u003e against broadband providers\nwebsites.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI also bit the bullet and placed an order for 500Mbps fibre at my current\naddress \u0026ndash; it should be cheaper and faster. The installation is booked near to\nthe end of the month, so fingers crossed they can successfully install it and\nI can make my UniFi gear co-operate.\u003c/p\u003e",
      "date_published": "2024-02-11T00:00:00+00:00",
      "date_modified": "2024-02-11T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/136-checkbox-love/",
      "url": "https://elver.me/weeknotes/136-checkbox-love/",
      "title": "Weeknotes 136: Checkbox love",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://tonsky.me/blog/checkbox/\"\u003eIn Loving Memory of Square Checkbox\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMastodon published a vulnerability this week \u0026ndash; \u003ca href=\"https://github.com/mastodon/mastodon/security/advisories/GHSA-3fjr-858r-92rw\"\u003eRemote user impersonation and\ntakeover\u003c/a\u003e. Seems pretty bad. Upgrade as soon as possible.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve spent a large amount of time this week researching smart locks. There are\na lot of different lock types, and trying to find something compatible with my\ndoor is proving tricky.\u003c/p\u003e\n\u003cp\u003eA lot of the reviews I\u0026rsquo;ve found are US focussed, but of course they have\ndifferent incompatible standards in North America. Here in the UK, the market\nseems to be dominated by cheaper locks built on the TTLock platform, a sort of\nSDK for building smart locks, and a lot of the lock hardware from different\nmanufacturers is almost identical apart from their logo. It\u0026rsquo;s very confusing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFinding detailed specifications of UniFi equipment, especially if it\u0026rsquo;s not\nsold anymore, is difficult. Thankfully, I found this \u003ca href=\"https://evanmccann.net/blog/ubiquiti/unifi-comparison-charts\"\u003eUniFi Network Comparison\nCharts\u003c/a\u003e page.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/orgs/community/discussions/16925\"\u003eGitHub apparently supports these blockquote extensions\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAlerts are an extension of Markdown used to emphasize critical information.\nOn GitHub, they are displayed with distinctive colors and icons to indicate\nthe importance of the content.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNice for making certain page elements more visible.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePRO TIP: Never fuck up a payment to HMRC. You will quickly regret your error\nafter having to ring them, be on hold for \u003cem\u003eages\u003c/em\u003e, and having to listen to them\n\u003cem\u003einsisting\u003c/em\u003e that there is \u0026ldquo;help available online\u0026rdquo; EVERY FIVE MINUTES!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://castro.fm/blog/castro-is-back\"\u003eA Fresh Start for Castro\u003c/a\u003e \u0026ndash; Castro has new owners!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe know that over the past few months Castro has not communicated well. The\nnew team\u0026rsquo;s #1 priority will be keeping our users informed. Starting today,\nall support emails will be answered in a timely manner.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWe\u0026rsquo;ll see.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://xeiaso.net/shitposts/no-way-to-prevent-this/CVE-2023-6246/\"\u003e\u0026ldquo;No way to prevent this\u0026rdquo; say users of only language where this regularly happens\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026lsquo;This was a terrible tragedy, but sometimes these things just happen and\nthere\u0026rsquo;s nothing anyone can do to stop them,\u0026rsquo; said programmer Willodean\nSantorella, echoing statements expressed by hundreds of thousands of\nprogrammers who use the only language where 90% of the world\u0026rsquo;s memory safety\nvulnerabilities have occurred in the last 50 years, and whose projects are\n20 times more likely to have security vulnerabilities.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e🤣\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.glyph.im/2024/01/unsigned-commits.html\"\u003eUnsigned Commits\u003c/a\u003e \u0026ndash; an interesting perspective on signing git commits. I\nsign my commits at the moment; maybe I should stop.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://arc.net/blog/arc-search\"\u003eArc Search on iOS\u003c/a\u003e is really good. It will \u0026ldquo;build\u0026rdquo; a webpage which is a\nsummary of whatever you search for. You have to check what it returns, this is\n\u003ca href=\"https://en.wikipedia.org/wiki/Large_language_model\"\u003eLLM\u003c/a\u003e generated I assume, but you have to do that anyway when manually\nsearching.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve seen discourse online along the lines of \u0026ldquo;Why don\u0026rsquo;t they stick to making\na good web browser?\u0026rdquo; \u0026ndash; I don\u0026rsquo;t understand this. Of course a good web browser\nis what we all want, but is there no room for something different? Some\ninnovation in what a web browser is?\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m looking forward to what the Arc team are planning on the desktop.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://tonsky.me/blog/checkbox/\"\u003eIn Loving Memory of Square Checkbox\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMastodon published a vulnerability this week \u0026ndash; \u003ca href=\"https://github.com/mastodon/mastodon/security/advisories/GHSA-3fjr-858r-92rw\"\u003eRemote user impersonation and\ntakeover\u003c/a\u003e. Seems pretty bad. Upgrade as soon as possible.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve spent a large amount of time this week researching smart locks. There are\na lot of different lock types, and trying to find something compatible with my\ndoor is proving tricky.\u003c/p\u003e\n\u003cp\u003eA lot of the reviews I\u0026rsquo;ve found are US focussed, but of course they have\ndifferent incompatible standards in North America. Here in the UK, the market\nseems to be dominated by cheaper locks built on the TTLock platform, a sort of\nSDK for building smart locks, and a lot of the lock hardware from different\nmanufacturers is almost identical apart from their logo. It\u0026rsquo;s very confusing.\u003c/p\u003e",
      "date_published": "2024-02-04T00:00:00+00:00",
      "date_modified": "2024-02-04T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/135-planning-stages/",
      "url": "https://elver.me/weeknotes/135-planning-stages/",
      "title": "Weeknotes 135: Planning stages",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSeason Two of \u003ca href=\"https://www.bbc.co.uk/sounds/brand/m0011cpr\"\u003eJon Ronson\u0026rsquo;s Things Fell Apart\u003c/a\u003e is now available and is as\ninteresting as ever.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEver since the first screeches of my \u003ca href=\"https://en.wikipedia.org/wiki/Modem#56_kbit.2Fs_technologies\"\u003e56k modem\u003c/a\u003e I’ve craved faster Internet\naccess. I waited and waited for ADSL to become available, and when it finally\nwas, it was a genuine revelation. I don\u0026rsquo;t think any speed could ever beat that\nfeeling now.\u003c/p\u003e\n\u003cp\u003eThe 70Mbps broadband I have at the moment has been fast enough to get work\ndone, and reliable. I\u0026rsquo;ve flirted with the idea of changing to Virgin where I\ncan currently get 1Gbps, but I\u0026rsquo;ve been waiting. Waiting to see if local\naltnets can change the game with symmetrical connections \u0026ndash; as fast up as\ndown. And so I\u0026rsquo;ve watched with interest over the last 5 or 6 years as my house\nhas fallen in and out of “planned” network building areas.\u003c/p\u003e\n\u003cp\u003eThen \u003ca href=\"https://en.wikipedia.org/wiki/Fiber_to_the_x\"\u003eFTTP\u003c/a\u003e was announced. I was \u0026ldquo;planned again. And then I wasn\u0026rsquo;t (not sure\nwhat happened there). Well, \u003ca href=\"/weeknotes/133-big-stressful-week/\"\u003enow that I\u0026rsquo;m moving\u003c/a\u003e, guess what\u0026rsquo;s happened? Yep,\nFTTP is here and I can now get 1.6Gbps down \u0026ndash; a speed that teenage me would\nhave lost his mind over.\u003c/p\u003e\n\u003cp\u003eWhat would you even do with 1.6Gbps? Listen, I would find a way to use it \u0026ndash;\n\u003ca href=\"https://www.computerworld.com/article/2534312/the--640k--quote-won-t-go-away----but-did-gates-really-say-it-.html\"\u003ehave some ambition, Bill\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe only real option at the new house is 1Gbps Virgin, which is great, but the\nlack of alternative is worrying. A different altnet, \u003ca href=\"https://cityfibre.com/\"\u003eCityFibre\u003c/a\u003e, brings the\npotential for even faster broadband to that area \u0026ndash; maybe up to 2.5Gbps\nsymmetrical 🤯\u003c/p\u003e\n\u003cp\u003eIt’s in the \u0026ldquo;planning\u0026rdquo; stages.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://zed.dev/blog/zed-is-now-open-source\"\u003eZed is now open source\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://greenallianceblog.org.uk/2023/12/22/my-heat-pump-a-personal-story-about-a-broken-heating-industry/\"\u003eThis blog post on getting heat pump installed\u003c/a\u003e did not encourage me to get one.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBoilers tend to ‘just work’, but with heat pumps, things like flow\ntemperatures, the width of your pipework, radiator size, heat stores and\nbuffers, and peak demand at design temperature can make the difference\nbetween cheap clean heat and a system that struggles. No consumer should\nhave to understand any of this, and the fact that I felt I had to is\ntestament to how immature the market is.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eOne day maybe.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.m.wikipedia.org/wiki/David_L._Mills\"\u003eDavid Mills\u003c/a\u003e, inventor of \u003ca href=\"https://en.m.wikipedia.org/wiki/Network_Time_Protocol\"\u003eNTP\u003c/a\u003e has died.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRIP the man who was the absolute incarnation of XKCD\u0026rsquo;s \u0026ldquo;one random dude\nholding up the entire internet\u0026rdquo;.  You may never have heard of David Mills,\nbut your entire goddamn world depends on what he did.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVia \u003ca href=\"https://m.blank.org/@memory/111783966091745984\"\u003e@memory@blank.org\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Post Office Horizon scandal continues and I listened to a \u003ca href=\"https://www.youtube.com/watch?v=MS_mNWGwHnQ\"\u003egood interview\nwith Nick Wallis\u003c/a\u003e who was involved in early reporting (and still is).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://hypercritical.co/2024/01/11/i-made-this\"\u003eI Made This\u003c/a\u003e by John Siracusa.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not 100% against AI, because I think it can be useful, but I am definitely\nwary of what is to come.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=hYd5etBpsO0\"\u003eYour Apple TV is a Subnet Router for Tailscale now!\u003c/a\u003e \u0026ndash; this is very cool.\nAllow access to local devices which can\u0026rsquo;t install Tailscale themselves via\nyour Apple TV.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe toner ran out on my Brother HL-L2350DW printer. In order to figure out how\nto change over the replacement I had to \u003ca href=\"https://www.youtube.com/watch?v=Qaxbt84v-6o\"\u003ewatch a YouTube video\u003c/a\u003e to and do a\nGoogle search 😆\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs part of the home buying process I was required to fill out \u0026ldquo;source of\nfunds\u0026rdquo; checks this week.\u003c/p\u003e\n\u003cp\u003eIt requires you to connect your back accounts via Open Banking and it will, it\nsays, find your \u0026ldquo;income\u0026rdquo; and flag all the transactions as such. Except for it\ndoesn\u0026rsquo;t, obviously. It just shows you a load of transactions it \u003cem\u003ethinks\u003c/em\u003e are\nincome and then you need to manually change all the incorrect guesses.\u003c/p\u003e\n\u003cp\u003eWhat a farce.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://public.digital/2024/01/12/avoiding-another-horizon\"\u003eAvoiding another Horizon scandal\u003c/a\u003e by Mike Bracken, former Chief Digital\nOfficer in charge of GDS.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBut it is important to stress - this is not simply an IT failure or one\nrogue supplier. This is an organisational and systemic failure. One where\nsenior officials and politicians did not get it right in ways that are\npredictable and repeated.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eKagi are giving away a t-shirt and sticker pack to their first 20,000 paying\nmembers.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNow, you may ask, why did we go through all this trouble and allocate nearly\na third of our investor-raised funds to produce and freely distribute 20,000\nt-shirts?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m totally up for stickers.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEpisode two of True Detective season 4 is still on-point 👌\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSeason Two of \u003ca href=\"https://www.bbc.co.uk/sounds/brand/m0011cpr\"\u003eJon Ronson\u0026rsquo;s Things Fell Apart\u003c/a\u003e is now available and is as\ninteresting as ever.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEver since the first screeches of my \u003ca href=\"https://en.wikipedia.org/wiki/Modem#56_kbit.2Fs_technologies\"\u003e56k modem\u003c/a\u003e I’ve craved faster Internet\naccess. I waited and waited for ADSL to become available, and when it finally\nwas, it was a genuine revelation. I don\u0026rsquo;t think any speed could ever beat that\nfeeling now.\u003c/p\u003e\n\u003cp\u003eThe 70Mbps broadband I have at the moment has been fast enough to get work\ndone, and reliable. I\u0026rsquo;ve flirted with the idea of changing to Virgin where I\ncan currently get 1Gbps, but I\u0026rsquo;ve been waiting. Waiting to see if local\naltnets can change the game with symmetrical connections \u0026ndash; as fast up as\ndown. And so I\u0026rsquo;ve watched with interest over the last 5 or 6 years as my house\nhas fallen in and out of “planned” network building areas.\u003c/p\u003e",
      "date_published": "2024-01-28T00:00:00+00:00",
      "date_modified": "2024-01-28T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/134-extinct-cheese/",
      "url": "https://elver.me/weeknotes/134-extinct-cheese/",
      "title": "Weeknotes 134: Extinct cheese",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve got so many small tasks to do at the moment that I\u0026rsquo;m feeling pretty\noverwhelmed at times.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe door button on my ancient microwave looked shabby. Years of pressing had\nworn away the fake metal finish revealing the black plastic beneath.\u003c/p\u003e\n\u003cp\u003eI thought replacing this button shouldn\u0026rsquo;t be too difficult, but finding the\nparts might be tricky. I got lucky though, so now I have rejuvenated\nmicrowave!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/True_Detective_(season_4)\"\u003eTrue Detective is back\u003c/a\u003e and it\u0026rsquo;s good!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSay what now?! (via \u003ca href=\"https://twitter.com/thomaspaulmann/status/1746923308694503482\"\u003e@thomaspaulmann\u003c/a\u003e)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTIL: If you prefix an emoji with \u0026ldquo;+\u0026rdquo; in @SlackHQ\n, you can react to the previous message\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI received an email from Monzo this week saying they were doing \u0026ldquo;Know Your\nCustomer\u0026rdquo; checks.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAs a regulated bank, from time to time we need to reach out to our customers\nto gain further information. We need to ask you some questions as part of\nour ongoing Know Your Customer (KYC) checks.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNaturally I thought this was fake, because why would a bank be asking me to\nsend sensitive personal information to them by email? We have banks who are\n\u003cem\u003etraining\u003c/em\u003e people to believe phishing emails. Neat.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://inessential.com/2024/01/17/corporations_are_not_to_be_loved\"\u003eCorporations Are Not To Be Loved by Brent Simmons\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBut I need to remember, now and again, that Apple is a corporation, and\ncorporations aren’t people, and they can’t love you back. You wouldn’t love\nGE or Exxon or Comcast — and you shouldn’t love Apple. It’s not an exception\nto the rule: there are no exceptions.\u003c/p\u003e\n\u003cp\u003eApple doesn’t care about you personally in the least tiny bit, and if you\nwere in their way somehow, they would do whatever their might — effectively\ninfinite compared to your own — enables them to deal with you.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSame goes for any business.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.newyorker.com/culture/annals-of-gastronomy/how-a-cheese-goes-extinct\"\u003eHow a Cheese Goes Extinct\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy UniFi controller software was both \u003ca href=\"https://github.com/linuxserver/docker-unifi-controller\"\u003eout-of-date and deprecated\u003c/a\u003e, so I\ndecided to upgrade and migrate in one step to \u003ca href=\"https://github.com/linuxserver/docker-unifi-network-application/\"\u003eunifi-network-application\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe new image uses an external MongoDB, which means a little more setup. \u003ca href=\"https://github.com/linuxserver/docker-unifi-network-application/issues/13\"\u003eAs\nsome people have pointed out\u003c/a\u003e it would be nice if the docs had a complete\nexample of how to setup MongoDB even though it was easy enough to figure out.\u003c/p\u003e\n\u003cp\u003eWhat wasn\u0026rsquo;t easy to figure out was why the UniFi controller was trying to\nconnect to MongoDB over TLS, as I thought I had told it not to by setting\n\u003ccode\u003eMONGO_TLS=false\u003c/code\u003e. Eventually I realised that it was because I must have had\nit set to \u003ccode\u003etrue\u003c/code\u003e when I first tried to start the container, and \u003ccode\u003eMONGO_TLS\u003c/code\u003e is\nonly evaluated on first run \u003ca href=\"https://github.com/linuxserver/docker-unifi-network-application?tab=readme-ov-file#parameters\"\u003e(as the docs say)\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eBut what does \u0026ldquo;evaluated on first run\u0026rdquo; mean, and how do you reset the state if\nyou do something wrong? When you start the container for the first time there\nis a shell script which inspects the values of various \u003ccode\u003eMONGO_*\u003c/code\u003e environment\nvariables. \u003ca href=\"https://github.com/linuxserver/docker-unifi-network-application/blob/48af2a584942b66b3d0bd139e0601ea1abbaee33/root/etc/s6-overlay/s6-rc.d/init-unifi-network-application-config/run#L45-L49\"\u003eThose are used to decide what the UniFi controller configuration\u003c/a\u003e\nfile should look like, and that is written to wherever you\u0026rsquo;ve set \u003ccode\u003e/config\u003c/code\u003e to\n(this is \u003ccode\u003e/opt/appdata/unifi\u003c/code\u003e in my case).\u003c/p\u003e\n\u003cp\u003eOnce I edited the config file directly to turn off TLS the rest was\nstraightforward. I restored a backup from the old controller and everything\nworked.\u003c/p\u003e\n\u003cp\u003eThis is my complete \u003ccode\u003edocker-compose.yml\u003c/code\u003e edits:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eunifi-db:\n  image: docker.io/mongo:4.4.27\n  container_name: unifi-db\n  volumes:\n    - /opt/appdata/mongodb/data:/data/db\n    - /opt/appdata/mongodb/init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro\n  restart: unless-stopped\n\nunifi-network-application:\n  image: lscr.io/linuxserver/unifi-network-application:latest\n  container_name: unifi-network-application\n  environment:\n    - PUID=1000\n    - PGID=1000\n    - TZ=Etc/UTC\n    - MONGO_USER=unifi\n    - MONGO_PASS=password\n    - MONGO_HOST=unifi-db\n    - MONGO_PORT=27017\n    - MONGO_DBNAME=unifi\n    # - MONGO_TLS= # Mongodb enable TLS. Only evaluated on first run.\n    # - MEM_LIMIT=1024 # Change the Java memory limit (in megabytes). Set to default to reset to default\n    # - MEM_STARTUP=1024 # Change the Java initial/minimum memory (in megabytes). Set to default to reset to default\n    # - MONGO_AUTHSOURCE= # Mongodb authSource. For Atlas set to admin. Defaults to MONGO_DBNAME. Only evaluated on first run.\n  volumes:\n    - /opt/appdata/unifi:/config\n  ports:\n    - 8443:8443 # UniFi web admin port\n    - 3478:3478/udp # UniFi STUN port\n    - 10001:10001/udp # Required for AP discovery\n    - 8080:8080 # Required for device communication\n    - 1900:1900/udp # Required for Make controller discoverable on L2 network option\n    - 8843:8843 # UniFi guest portal HTTPS redirect port\n    - 8880:8880 # UniFi guest portal HTTP redirect port\n    - 6789:6789 # For mobile throughput test\n    # - 5514:5514/udp # Remote syslog port\n  restart: unless-stopped\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA reminder that \u003ca href=\"https://docs.github.com/en/authentication/connecting-to-github-with-ssh/using-ssh-agent-forwarding\"\u003eSSH agent forwarding\u003c/a\u003e is very cool if you need to access a\ngit repo (in this case) from a remote host with which you don\u0026rsquo;t want to share\nSSH keys.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve got so many small tasks to do at the moment that I\u0026rsquo;m feeling pretty\noverwhelmed at times.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe door button on my ancient microwave looked shabby. Years of pressing had\nworn away the fake metal finish revealing the black plastic beneath.\u003c/p\u003e\n\u003cp\u003eI thought replacing this button shouldn\u0026rsquo;t be too difficult, but finding the\nparts might be tricky. I got lucky though, so now I have rejuvenated\nmicrowave!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/True_Detective_(season_4)\"\u003eTrue Detective is back\u003c/a\u003e and it\u0026rsquo;s good!\u003c/p\u003e",
      "date_published": "2024-01-21T00:00:00+00:00",
      "date_modified": "2024-01-21T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/133-big-stressful-week/",
      "url": "https://elver.me/weeknotes/133-big-stressful-week/",
      "title": "Weeknotes 133: Big, stressful, week",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eVim magic 🧙 Delete all lines that don\u0026rsquo;t start with \u003ccode\u003erails\u003c/code\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e:g!/^rails/d\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI\u0026rsquo;m a wizard, Harry.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy car was in the garage last week and whilst I was waiting for it I decided\nit might be nice if my \u003ca href=\"https://elver.me/uses/\"\u003e/uses page\u003c/a\u003e had a changelog. Not just a changelog, but\nan accompanying RSS feed too.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s total over-engineering, but fun over-engineering. I now keep a\nCHANGELOG.md (in \u003ca href=\"https://keepachangelog.com/en/1.1.0/\"\u003ekeep a changelog\u003c/a\u003e format) and I \u003cdel\u003ehacked together\u003c/del\u003e expertly\ncrafted a Ruby script to parse the Markdown and create an RSS feed from it.\u003c/p\u003e\n\u003cp\u003eSo \u003ca href=\"/uses/feed.rss\"\u003esubscribe NOW\u003c/a\u003e so you can keep track of when I buy an unnecessary new\nphone.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCastro \u003ca href=\"https://512pixels.net/2024/01/castro-is-having-another-very-bad-time/\"\u003ewent down \u003cem\u003eagain\u003c/em\u003e this week\u003c/a\u003e, with zero comms about it, \u003cem\u003eagain\u003c/em\u003e. They\nclearly haven\u0026rsquo;t learnt any lessons from the \u003ca href=\"/weeknotes/127-proper-cold/\"\u003eprevious outage\u003c/a\u003e. This time it\nwas a DNS issue.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m glad I\u0026rsquo;ve exported the OPML file of all my subscriptions, because I\nclearly need to move to something more reliable. I tried a few options last\ntime but nothing really stuck.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI briefly visited Swindon this weekend. I won\u0026rsquo;t be bothering with that again.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBig, stressful, week. We had an offer accepted on a house, so hopefully we\u0026rsquo;re\ngoing to be moving. Scrabbling to find a solicitor and mortgage was not how I\nwanted to start the week, but I was pleased with how quickly we managed to get\neverything up together.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m scared/stressed/excited about the prospect of the move. There\u0026rsquo;s a hell of\na lot of do, and lot to catastrophize about too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDo you want a hardware keyboard for your iPhone? \u0026ndash; \u003ca href=\"https://www.clicks.tech/product/clicks-for-iphone\"\u003eClicks Creator Keyboard\u003c/a\u003e.\nI\u0026rsquo;m not sure what is wrong with me either, but yes, I have ordered one of\nthese.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m feeling quite behind on everything.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eVim magic 🧙 Delete all lines that don\u0026rsquo;t start with \u003ccode\u003erails\u003c/code\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e:g!/^rails/d\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI\u0026rsquo;m a wizard, Harry.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy car was in the garage last week and whilst I was waiting for it I decided\nit might be nice if my \u003ca href=\"https://elver.me/uses/\"\u003e/uses page\u003c/a\u003e had a changelog. Not just a changelog, but\nan accompanying RSS feed too.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s total over-engineering, but fun over-engineering. I now keep a\nCHANGELOG.md (in \u003ca href=\"https://keepachangelog.com/en/1.1.0/\"\u003ekeep a changelog\u003c/a\u003e format) and I \u003cdel\u003ehacked together\u003c/del\u003e expertly\ncrafted a Ruby script to parse the Markdown and create an RSS feed from it.\u003c/p\u003e",
      "date_published": "2024-01-14T00:00:00+00:00",
      "date_modified": "2024-01-14T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/132-how-many-keys-do-you-have-left/",
      "url": "https://elver.me/weeknotes/132-how-many-keys-do-you-have-left/",
      "title": "Weeknotes 132: How many keys do you have left?",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eChristmas is over, thank fuck for that. Back to work; sort of. I caught a cold\ntowards the end of the week, stress induced (more on that another time), so I\ntook Friday off.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=7DKv5H5Frt0\"\u003eAfter ten years, it\u0026rsquo;s time to stop making videos\u003c/a\u003e \u0026ndash; Tom Scott has decided to\nend his video-a-week streak. Who can blame him for wanting to take a bit of a\nbreak? I\u0026rsquo;m glad he\u0026rsquo;s not giving up completely though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theatlantic.com/international/archive/2023/12/nord-stream-pipeline-attack-theories-suspects-investigation/676320/\"\u003eThe Most Consequential Act of Sabotage In Modern Times\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe destruction of the Nord Stream pipeline curtailed Europe’s reliance on\nRussian gas. But who was responsible?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is a fascinating read.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.wired.com/story/mirai-untold-story-three-young-hackers-web-killing-monster/?ueid=b4f3a6152578f90ffbdaa44714d0648d\"\u003eThe Mirai Confessions: Three Young Hackers Who Built a Web-Killing Monster\nFinally Tell Their Story\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was going to write up a \u0026ldquo;2023 in review\u0026rdquo; post as I\u0026rsquo;ve seen lots of people\ndoing. And, in fact, I wrote the majority of it, but it just felt like moaning\nso I\u0026rsquo;ve decided not to publish it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI \u003ca href=\"https://twitter.com/fatkodima/status/1740703726812406022\"\u003esaw this tip\u003c/a\u003e on speeding up your Rails test suite by \u0026ldquo;unlogged tables\u0026rdquo; in\nPostgres.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePostgreSQL allows the creation of “unlogged” tables, which do not record\ndata in the PostgreSQL Write-Ahead Log. This can make the tables faster,\nbut significantly increases the risk of data loss if the database crashes.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI tried this out at work but it didn\u0026rsquo;t have much affect. I think that\u0026rsquo;s\nbecause we use fixtures, which tend to be loaded all at once. If you use\nfactories you might find it has more benefit for you.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.crunchydata.com/blog/postgresl-unlogged-tables\"\u003eCrunchy Data have a good overview\u003c/a\u003e of \u0026ldquo;unlogged\u0026rdquo; tables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://keysleft.com/\"\u003ehow many keys do you have left?\u003c/a\u003e \u0026ndash; in a similar vein, you should probably\nstop reading this drivel.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://alexcabal.com/posts/standard-ebooks-and-classic-web-tech\"\u003eHow Standard Ebooks serves millions of requests per month with a 2GB VPS; or,\na paean to the classic web\u003c/a\u003e \u0026ndash; worth remembering that you don\u0026rsquo;t always need a\n\u0026ldquo;cloud\u0026rdquo; provider.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe went to see \u003ca href=\"https://www.imdb.com/title/tt13097932/\"\u003eOne Life\u003c/a\u003e on New Year\u0026rsquo;s Day and enjoyed it. There\u0026rsquo;s nothing\nparticularly stand-out about it, just a well told real story. From 20 minutes\nin I had tears in my eyes and by at the end I was making involuntary blubbing\nnoises.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Carol_%26_The_End_of_The_World\"\u003eCarol \u0026amp; The End of The World\u003c/a\u003e is a delightful new find. I\u0026rsquo;m two episodes in.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eChristmas is over, thank fuck for that. Back to work; sort of. I caught a cold\ntowards the end of the week, stress induced (more on that another time), so I\ntook Friday off.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=7DKv5H5Frt0\"\u003eAfter ten years, it\u0026rsquo;s time to stop making videos\u003c/a\u003e \u0026ndash; Tom Scott has decided to\nend his video-a-week streak. Who can blame him for wanting to take a bit of a\nbreak? I\u0026rsquo;m glad he\u0026rsquo;s not giving up completely though.\u003c/p\u003e",
      "date_published": "2024-01-07T00:00:00+00:00",
      "date_modified": "2024-01-07T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/131-a-lot-more-faff/",
      "url": "https://elver.me/weeknotes/131-a-lot-more-faff/",
      "title": "Weeknotes 131: A lot more faff",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAnother year almost over. Happy New Year.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBen Sheldon wrote up his \u003ca href=\"https://island94.org/2023/12/solid-queue-first-impressions\"\u003efirst impressions of Solid Queue\u003c/a\u003e now \u003ca href=\"https://dev.37signals.com/introducing-solid-queue/\"\u003eit has been\nreleased\u003c/a\u003e. tl;dr; He likes it.\u003c/p\u003e\n\u003cp\u003eGood Job, like \u003ca href=\"https://github.com/basecamp/solid_queue\"\u003eSolid Queue\u003c/a\u003e, uses the database to persist jobs. I keep\nhearing variations on \u0026ldquo;a database is not a queue\u0026rdquo;. The majority of apps are\nnot Shopify, so get a grip.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGoodJob is easy mode just targeting Postgres, because there are Advisory\nLocks and lots of Postgres-only niceties. I do not envy Solid Queue being\nmulti-database, because it has to implement a bunch of stuff with a coarser\ntoolbox.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis was \u003ca href=\"/weeknotes/122-closing-all-buffers/#:~:text=leans%20heavily%20on%20Postgres\"\u003ewhat I was interested in too\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.blog/2023-12-07-upgrading-github-com-to-mysql-8-0/\"\u003eUpgrading GitHub.com to MySQL 8.0\u003c/a\u003e \u0026ndash; GitHub have 8000 MySQL hosts! Scale of\nthis magnitude is hard for me to fathom.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://defector.com/youre-supposed-to-be-glad-your-tesla-is-a-brittle-heap-of-junk\"\u003eYou’re Supposed To Be Glad Your Tesla Is A Brittle Heap Of Junk\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLook, pal, all I can tell you is that I don\u0026rsquo;t know how to make the thing I\nsold you at great expense.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e😆\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been attempting to securely wipe my \u003ca href=\"/weeknotes/129-autoexpand-on/#:~:text=wanted%20to%20wipe%20the%20data%20from%20the%20disks\"\u003eold disks\u003c/a\u003e. It\u0026rsquo;s a lot more faff\nthan you might think.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://dban.org/\"\u003eDBAN\u003c/a\u003e used to be the defacto way to wipe data from disks, but it is\nunmaintained, and apparently \u003ca href=\"https://github.com/martijnvanbrummelen/nwipe\"\u003e\u003ccode\u003enwipe\u003c/code\u003e\u003c/a\u003e is the hot new thing. The easiest\nway to get \u003ccode\u003enwipe\u003c/code\u003e going seemed to be to creatable a \u003ca href=\"https://github.com/PartialVolume/shredos.x86_64\"\u003eShredos\u003c/a\u003e USB stick\nand boot from that, which I successfully did.\u003c/p\u003e\n\u003cp\u003eI knew the process was going to be time-consuming, and I didn\u0026rsquo;t want to tie up\nmy main computer whilst it was going on so I decided to hook up the drives to\na separate PC for the duration. This was wise. Even at the lowest security\nsetting, which just writes zeroes to the disk, it is estimated to take 40\nhours!\u003c/p\u003e\n\u003cp\u003eAt least I managed to hook up two disks at once. One via the \u003ca href=\"/weeknotes/129-autoexpand-on/#:~:text=bought%20this%20USB%20to%20SATA%20adapter\"\u003enew USB\ninterface I bought recently\u003c/a\u003e, and the other directly via SATA cable. Strangely\nthe USB interface seems faster, which I was not expecting. Computers are\nweird.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.bryanbraun.com/after-dark-css/all/flying-toasters.html\"\u003eFlying Toasters CSS\u003c/a\u003e via \u003ca href=\"https://mastodon.social/@dosnostalgic/111627384859481942\"\u003eAnatoly Shashkin\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=I2J2MzKjcqY\"\u003eChristina Warren takes are look at GitHub\u0026rsquo;s custom M1 macOS runners\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI don’t know why but it surprised me that they transplant the innards of a Mac\nMini to a rack compatible “sled”.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/129-autoexpand-on/#:~:text=It%20dawned%20on%20me%20this%20would%20be%20a%20good%20solution%20to%20my%20occasional%20need%20for%20a%20monitor%20that%20I%20can%20connect%20to%20various%20computers\"\u003eOrion/HDMI capture combo\u003c/a\u003e is not working out to be as handy as I\u0026rsquo;d\noriginally hoped. I hooked it up to a PC it doesn\u0026rsquo;t seem to show any output\nuntil it reaches Windows, which isn\u0026rsquo;t very helpful when you\u0026rsquo;re trying to get\ninto the BIOS :-/\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not sure where the problem lies; it could be something PC related. And\nlet\u0026rsquo;s face it, that\u0026rsquo;s fairly likely.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHave I done any more \u003ca href=\"/weeknotes/130-mid-level-vimmer/#:~:text=jsonb%20columns%20in%20Postgres\"\u003eexperimenting with \u003ccode\u003ejsonb\u003c/code\u003e columns in Postgres\u003c/a\u003e? You\nwon\u0026rsquo;t believe this, no. I haven\u0026rsquo;t.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theguardian.com/environment/ng-interactive/2023/dec/06/the-winterkeeper-steven-fuller-yellowstone-national-park\"\u003eThe Winterkeeper\u003c/a\u003e \u0026ndash; I enjoyed this mini-documentary about Yellowstone\nnational park.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSteven Fuller is a winter caretaker who has lived at Yellowstone national\npark for the past 50 years. As the cold weather approaches and the seasonal\ntransformation begins, he hunkers down in his remote mountain cabin. But\nFuller and Yellowstone face an uncertain future, with the climate crisis\nthreatening to forever change one of North America’s last great wildernesses\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdam Buxton had \u003ca href=\"https://www.adam-buxton.co.uk/podcasts/lpbk8k9zbhx54zt-8yl8m-mdzjc-whmf8-2lwfg-emz92-cxnlh-ghwwh-r34cb-sfwnb-kmjcj-x8cgn-gzmzx-xfpt5-x6cma-d8lbc-9adl4-5smea-llfek-a8j99-hzncc-gesss-kyfpd-8pz8g-e3fsz-4fmyk-snpb2-bxaxs-g389b-hfcsc\"\u003eDaudi Matsiko on this podcast\u003c/a\u003e recently and I just got around\nto listening today. \u003ca href=\"https://hellodaudi.bandcamp.com/track/fool-me-as-many-times-as-you-like-2\"\u003eThis is lovely\u003c/a\u003e. Enjoy!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAnother year almost over. Happy New Year.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBen Sheldon wrote up his \u003ca href=\"https://island94.org/2023/12/solid-queue-first-impressions\"\u003efirst impressions of Solid Queue\u003c/a\u003e now \u003ca href=\"https://dev.37signals.com/introducing-solid-queue/\"\u003eit has been\nreleased\u003c/a\u003e. tl;dr; He likes it.\u003c/p\u003e\n\u003cp\u003eGood Job, like \u003ca href=\"https://github.com/basecamp/solid_queue\"\u003eSolid Queue\u003c/a\u003e, uses the database to persist jobs. I keep\nhearing variations on \u0026ldquo;a database is not a queue\u0026rdquo;. The majority of apps are\nnot Shopify, so get a grip.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGoodJob is easy mode just targeting Postgres, because there are Advisory\nLocks and lots of Postgres-only niceties. I do not envy Solid Queue being\nmulti-database, because it has to implement a bunch of stuff with a coarser\ntoolbox.\u003c/p\u003e",
      "date_published": "2023-12-31T00:00:00+00:00",
      "date_modified": "2023-12-31T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/130-mid-level-vimmer/",
      "url": "https://elver.me/weeknotes/130-mid-level-vimmer/",
      "title": "Weeknotes 130: Mid-Level Vimmer",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eChristmas, again.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVery quiet week as I\u0026rsquo;ve been preparing for Christmas.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://elixir-lang.org/blog/2023/12/22/elixir-v1-16-0-released/\"\u003eElixir v1.16 has been released\u003c/a\u003e \u0026ndash; some nice improvements especially in\nregard to compiler output and documentation.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNative HTML toggle switches!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;the latest Safari Technology Preview missed the introduction of a native\n#HTML Switch widget via \u003ccode\u003e\u0026lt;input type=checkbox switch\u0026gt;\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSwitches have some usability issues, but people are going to use them and a\nnative version seems to make sense.\u003c/p\u003e\n\u003cp\u003eVia \u003ca href=\"https://indieweb.social/@anthony/111615784563058490\"\u003e@anthony@indieweb.social\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://johnwhiles.com/posts/vimming-pains\"\u003eThe Loneliness of the Mid-Level Vimmer\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBut there is a downside to Vimming. It\u0026rsquo;s a weird fringe interest, even\namongst software developers who are already a weird fringe group. Most\npeople who know what Vim is don\u0026rsquo;t know how to use it, are scared of it, and\nare happy to keep it that way.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://arstechnica.com/security/2023/12/hackers-can-break-ssh-channel-integrity-using-novel-data-corruption-attack/\"\u003eSSH protects the world’s most sensitive networks. It just got a lot weaker\u003c/a\u003e\n\u0026ndash; ruh roh. This sounds fairly bad.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been experimenting a bit with \u003ccode\u003ejsonb\u003c/code\u003e columns in Postgres. I\u0026rsquo;ve used them\na bit in the past but not for anything particularly involved. I was wondering\nwhether they can be used for a \u0026ldquo;custom fields\u0026rdquo; feature where the user can\ndefine additional database fields they want to save to sit alongside those\ndefined by the developer.\u003c/p\u003e\n\u003cp\u003eThe saving of the data is not really an issue as far as I can tell. The\nquerying is a bit more work. My immediate concern is speed. Is querying a lot\nof fields from a \u003ccode\u003ejsonb\u003c/code\u003e column going to cause performance issues? From what\nI\u0026rsquo;ve read the answer is \u0026ldquo;no\u0026rdquo; but I\u0026rsquo;d like to experiment with this myself.\u003c/p\u003e\n\u003cp\u003eThe are \u003cem\u003etons\u003c/em\u003e of \u003ccode\u003ejsonb_*\u003c/code\u003e functions to learn in Postgres.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://nooshu.com/blog/2023/12/12/govuk-cookie-banner-browser-privacy-and-security/\"\u003eGOV.UK Cookie banner and why it “won\u0026rsquo;t go away”\u003c/a\u003e \u0026ndash; the cookie banners on\n.gov.uk websites are far more involved than you might imagine. What a waste of\ntime they are.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eChristmas, again.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVery quiet week as I\u0026rsquo;ve been preparing for Christmas.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://elixir-lang.org/blog/2023/12/22/elixir-v1-16-0-released/\"\u003eElixir v1.16 has been released\u003c/a\u003e \u0026ndash; some nice improvements especially in\nregard to compiler output and documentation.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNative HTML toggle switches!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;the latest Safari Technology Preview missed the introduction of a native\n#HTML Switch widget via \u003ccode\u003e\u0026lt;input type=checkbox switch\u0026gt;\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSwitches have some usability issues, but people are going to use them and a\nnative version seems to make sense.\u003c/p\u003e",
      "date_published": "2023-12-24T00:00:00+00:00",
      "date_modified": "2023-12-24T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/129-autoexpand-on/",
      "url": "https://elver.me/weeknotes/129-autoexpand-on/",
      "title": "Weeknotes 129: autoexpand=on",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eHave you heard of \u003ca href=\"https://git-scm.com/docs/git-rerere\"\u003e\u003ccode\u003egit rerere\u003c/code\u003e\u003c/a\u003e?\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit-rerere - Reuse recorded resolution of conflicted merges\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou know when you rebase and have to fix the same conflicts over and over?\nWell this is supposed to help with that. It remembers what you did to fix each\nconflict and re-uses it.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m waiting for the opportune moment to try this out. I haven\u0026rsquo;t needed to do\nany gnarly rebases recently.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wish flying were \u003ca href=\"https://www.404media.co/no-record-of-russian-economist-who-flew-to-lax-without-a-ticket-didnt-remember-how-he-got-here/\"\u003ethis easy\u003c/a\u003e for me.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNo Record of \u0026lsquo;Russian Economist\u0026rsquo; Who Flew to LAX Without a Ticket, Didn\u0026rsquo;t\nRemember How He Got Here\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou know all those mandatory linting checks you have? They just train\nprogrammers to workaround linting checks. Does that make your codebase better?\u003c/p\u003e\n\u003cp\u003eAm I frustrated? \u003ccode\u003e# rubocop:enable IAmABit/Yeah\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was intrigued by \u003ca href=\"https://www.lux.camera/meet-orion/\"\u003eOrion\u003c/a\u003e after seeing it mentioned a lot. It dawned on me\nthis would be a good solution to my occasional need for a monitor that I can\nconnect to various computers. So I bought the \u003ca href=\"https://www.amazon.co.uk/dp/B08Z3XDYQ7\"\u003erecommended adaptor from\nAmazon\u003c/a\u003e and (\u003ca href=\"https://tomstu.art/weeknotes-205-call-it-even#:~:text=The%20adapter%20didn%E2%80%99t%20work%20so%20I%20returned%20it%20and%20deleted%20the%20app\"\u003eunlike Tom\u003c/a\u003e) it worked perfectly. Will I remember this when I\nneed a monitor twice a year? Doubtful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/128-jeff-bezos-rowing-boat/#:~:text=I%20kicked%20off%20the%20process%20this%20week\"\u003edisk upgrade that I started last week\u003c/a\u003e has finished and was a painless\nprocedure in the end. I \u003ca href=\"/blog/how-to-replace-a-failed-disk-in-a-zfs-mirror/\"\u003ereplaced each disk as if it had failed\u003c/a\u003e and let each\nresilver \u0026ndash; that took ages, but was easy.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI\u0026rsquo;m hoping that the new space is going to magically become available once\nall disks have been swapped out, but I\u0026rsquo;ll have to wait and see.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eReader, the space was \u003cem\u003enot\u003c/em\u003e automatically available. I needed to do some\n\u003cdel\u003enoodling\u003c/del\u003e careful configuration. I set \u003ccode\u003eautoexpand\u003c/code\u003e on, and rebooted, but\nthis didn\u0026rsquo;t see to do the trick on it\u0026rsquo;s own.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esudo zpool set autoexpand=on \u0026lt;pool\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI had to tell each vdev to expand, so I did this once for each new device.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esudo zpool online -e \u0026lt;pool\u0026gt; \u0026lt;vdev\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAnd \u003cem\u003ethen\u003c/em\u003e the new space became available. I now have 48TB of usable space.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of disks, I wanted to wipe the data from the disks I just replaced\nbut had no way to plug them into anything. I bought \u003ca href=\"https://www.amazon.co.uk/dp/B07S8MQVRZ\"\u003ethis USB to SATA adapter\u003c/a\u003e\nwhich allows plugging in 2.5 (and with a \u003ca href=\"https://www.amazon.co.uk/dp/B09QG4R1R4\"\u003e12V power supply\u003c/a\u003e) 3.5 disks via\nUSB-A.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve not done the actual wiping yet, but I will at least be able to physically\nconnect them when I get around to it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother comedy gig this week (they tend to come in groups, like buses), \u003ca href=\"https://en.wikipedia.org/wiki/John_Robins_%28comedian%29\"\u003eJohn\nRobins\u0026rsquo;\u003c/a\u003e Howl at the Bristol Beacon \u0026ndash; top vibes. This is my first trip to the\nBeacon since it was renovated. They\u0026rsquo;ve done a pretty nice job with the\nexception of not having stagged seating. Why all theatre spaces don\u0026rsquo;t have\nstaggered seating is\u0026hellip;staggering to me (this is my blog and I\u0026rsquo;ll tell as many\nDad jokes as I like).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs is my usual behaviour, I spent a full day worrying about a tiny issue at\nwork which was solved with a 30 second conversation the next day. Why am I\nlike this?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI respect what \u003ca href=\"https://signal.org/\"\u003eSignal\u003c/a\u003e are doing for secure messaging. But, for me, the app\nleaves a lot to be desired. Notifications just don\u0026rsquo;t work for me, which makes\nusing it very difficult. Anyone else?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eHave you heard of \u003ca href=\"https://git-scm.com/docs/git-rerere\"\u003e\u003ccode\u003egit rerere\u003c/code\u003e\u003c/a\u003e?\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit-rerere - Reuse recorded resolution of conflicted merges\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou know when you rebase and have to fix the same conflicts over and over?\nWell this is supposed to help with that. It remembers what you did to fix each\nconflict and re-uses it.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m waiting for the opportune moment to try this out. I haven\u0026rsquo;t needed to do\nany gnarly rebases recently.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wish flying were \u003ca href=\"https://www.404media.co/no-record-of-russian-economist-who-flew-to-lax-without-a-ticket-didnt-remember-how-he-got-here/\"\u003ethis easy\u003c/a\u003e for me.\u003c/p\u003e",
      "date_published": "2023-12-17T00:00:00+00:00",
      "date_modified": "2023-12-17T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/128-jeff-bezos-rowing-boat/",
      "url": "https://elver.me/weeknotes/128-jeff-bezos-rowing-boat/",
      "title": "Weeknotes 128: Jeff Bezos Rowing Boat",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI went to London for work on Monday. Of course my train home was cancelled 5\nminutes before it was due to leave on the homeward leg which meant I ended up\non a train headed for Swansea. Needless to say, I didn\u0026rsquo;t want to go to\nSwansea. Trains gonna train.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ln.hixie.ch/?count=1\u0026amp;start=1700627373\"\u003eReflecting on 18 years at Google\u003c/a\u003e \u0026ndash; Google has changed a bit.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou should \u003ca href=\"https://justin.searls.co/mails/2023-11/\"\u003eread Searls\u0026rsquo; blog\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;every time I looked closely at any of these wannabe Steve Jobs types, I\u0026rsquo;d\nbe repulsed to find their own work was drenched in mediocrity.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=XRpHIa-2XCE\"\u003eSimple, Non-Commercial, Open Source Notes\u003c/a\u003e \u0026ndash; I really enjoyed this video on\nthe various ways to take notes with free and open source software.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;if you\u0026rsquo;ve watched this whole video, you are lost\u0026hellip;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd he\u0026rsquo;s right, I am lost.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI thought I\u0026rsquo;d better actually start using the \u003ca href=\"/weeknotes/126-brown-butter/#:~:text=Western%20Digital%20have%20been%20reliable%20for%20me%20for%20since%20I%20bought%20the%20original%20disks%20in%202018%2C%20so%20when%20they%20started%20offering%2030%25%20off%20when%20you%20buy%202%20it%20was%20hard%20to%20resist%2C%20so%20I%20got%206%20new%20disks\"\u003ehard drives that I bought\nrecently\u003c/a\u003e so I kicked off the process this week. I\u0026rsquo;ve been putting it off\nbecause it\u0026rsquo;s scary.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m following the \u003ca href=\"/blog/how-to-replace-a-failed-disk-in-a-zfs-mirror/\"\u003eblog post which I wrote last time I did this\u003c/a\u003e for most\npart. I\u0026rsquo;ve yet to see the results as I\u0026rsquo;m currently resilvering disk 4 of 6.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m hoping that the new space is going to magically become available once all\ndisks have been swapped out, but I\u0026rsquo;ll have to wait and see.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://joanwestenberg.com/blog/the-block-button-is-the-ultimate-source-of-dopamine-use-it\"\u003eThe block button is the ultimate source of dopamine. Use it.\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThere\u0026rsquo;s a crucial difference between silencing someone and choosing not to\nengage with them. Blocking someone isn’t about denying them their right to\nspeak. It’s about asserting your right not to listen.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe went to \u003ca href=\"https://en.wikipedia.org/wiki/Gda%C5%84sk\"\u003eGdańsk, Poland\u003c/a\u003e for a long weekend, our third Polish city having\nalready visited Kraków and Wrocław in recent years. It was very nice. Both the\n\u003ca href=\"https://muzeum1939.pl/\"\u003eMuseum of the Second World War\u003c/a\u003e and the \u003ca href=\"http://www.ecs.gda.pl/\"\u003eEuropean Solidarity Centre\u003c/a\u003e museum\nwere excellent. Well worth the time.\u003c/p\u003e\n\u003cp\u003eThis trip was a lesson in paying more attention to the \u0026ldquo;Feels like\u0026rdquo;\ntemperatures of a weather forecast\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAny time on an aeroplane reveals just how little testing this industry is\ndoing without an active Internet connection. Spotify on iOS for example. The\niOS system dialog appears when you start the app, fine. To be expected I\nsuppose. It then is shown again at regular, but surprising, intervals whenever\nswitching back and forth.\u003c/p\u003e\n\u003cp\u003eHas no one at Spotify been on an aeroplane?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I discovered that you can hook into Ruby on Rails generators so you\ncan executed your own code after they run.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eApplication\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026lt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eRails\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eApplication\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  config\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003egenerators\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eafter_generate \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003efiles\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#998;font-style:italic\"\u003e# do things with the files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNice ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDo you need to launder some money? Apparently \u003ca href=\"https://indieweb.social/@web3isgreat/111546025046424341\"\u003e\u0026ldquo;hackers\u0026rdquo; are using MTG cards\u003c/a\u003e 😆\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUranium Finance hacker cashes out in Magic: The Gathering cards\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theguardian.com/food/2023/dec/02/the-weird-secretive-world-of-crisp-flavours\"\u003e\u0026ldquo;the weird, secretive world of crisp flavours\u0026rdquo;\u003c/a\u003e \u0026ndash; Find out why Paprika is so\npopular in Germany.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=VGhcSupkNs8\"\u003eJeff Bezos Rowing Boat\u003c/a\u003e by Bobby Fingers \u0026ndash; God this is good. Seriously,\nwatch this. The creativity is mind-blowing.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI went to London for work on Monday. Of course my train home was cancelled 5\nminutes before it was due to leave on the homeward leg which meant I ended up\non a train headed for Swansea. Needless to say, I didn\u0026rsquo;t want to go to\nSwansea. Trains gonna train.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ln.hixie.ch/?count=1\u0026amp;start=1700627373\"\u003eReflecting on 18 years at Google\u003c/a\u003e \u0026ndash; Google has changed a bit.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou should \u003ca href=\"https://justin.searls.co/mails/2023-11/\"\u003eread Searls\u0026rsquo; blog\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;every time I looked closely at any of these wannabe Steve Jobs types, I\u0026rsquo;d\nbe repulsed to find their own work was drenched in mediocrity.\u003c/p\u003e",
      "date_published": "2023-12-10T00:00:00+00:00",
      "date_modified": "2023-12-10T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/127-proper-cold/",
      "url": "https://elver.me/weeknotes/127-proper-cold/",
      "title": "Weeknotes 127: Proper cold",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA new feature in Rails \u0026ndash; \u003ca href=\"https://github.com/rails/rails/pull/49951\"\u003e\u003ccode\u003eErrorReporter#unexpected\u003c/code\u003e to report in production\nbut raise in development\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis method is intended for reporting violated assertions about\npreconditions, or similar cases that can and should be gracefully handled in\nproduction, but that aren\u0026rsquo;t supposed to happen.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy podcast player of choice, \u003ca href=\"https://castro.fm/\"\u003eCastro\u003c/a\u003e, had a FOUR DAY outage that ran into this\nweek. It was very inconvenient.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe\u0026rsquo;re aware of the current database issue and working hard to resolve this\nas quickly as possible.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eReally, the whole debacle is a lesson in how to communicate with your users\ni.e., you \u003cem\u003eshould\u003c/em\u003e communicate with your users. \u003ca href=\"https://twitter.com/CastroPodcasts/status/1729346575221366924\"\u003eOne or two tweets\u003c/a\u003e is not\nsufficient.\u003c/p\u003e\n\u003cp\u003eThe app changed hands a few years ago and since then it\u0026rsquo;s been going downhill,\nso this is disappointing, but not that surprising. Unfortunately, the design\nof a lot of other podcast players leaves a lot to be desired, at least to my\neyes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt was proper cold this week. I am woefully under prepared for it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUp (across?) to London on Thursday for \u003ca href=\"https://kinglearbranagh.com/\"\u003eKing Lear in the West End\u003c/a\u003e. I\u0026rsquo;ve never\nseen any Shakespeare before, and it wouldn\u0026rsquo;t be my first choice, but enjoyed\nwhat I understood of it.\u003c/p\u003e\n\u003cp\u003eThe journey back was very chaotic as our train was cancelled (due to\nindustrial action which wasn\u0026rsquo;t supposed to be happening), and we eventually,\nwith several hundred other people, managed to get aboard a train that headed\nin the general direction of home.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m pretty quick over a short distance, \u003cem\u003eif\u003c/em\u003e I\u0026rsquo;m running with a suitcase up a\ntrain platform.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m off to London for work tomorrow. Will I ever get back?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThree had a major outage whilst I was in London which affected Smarty, my\nmobile provider. Their handling of the incident was not good with much cutting\nand pasting of answers on Twitter.\u003c/p\u003e\n\u003cp\u003eI was looking to move anyway as their signal just cannot compare to EE. Seems\nnow is the time.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/tobi/status/1728524453854756883\"\u003eFrom Shopify\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eShopify’s egress processed 145 billion requests on Friday. App servers\nhandled peak of ~60 million requests per minute. Increase of 38%. Total GMV\nwas $4.1b, up by 22% from last year.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e😮\u003c/p\u003e\n\u003cp\u003eAnd \u003ca href=\"https://twitter.com/ShopifyEng/status/1729500628861223290\"\u003esome more details from Shopify Engineering\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe achieved 99.999+% uptime, handling 29.7 PB of data served from across our\ninfrastructure over the entire event! That’s over 5 TB/min\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBlimey!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe saw \u003ca href=\"https://www.imdb.com/title/tt13287846/\"\u003eNapoleon\u003c/a\u003e on Saturday. For all it\u0026rsquo;s incorrect history I enjoyed it well\nenough. The battle scenes were brutal. Too long though.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA new feature in Rails \u0026ndash; \u003ca href=\"https://github.com/rails/rails/pull/49951\"\u003e\u003ccode\u003eErrorReporter#unexpected\u003c/code\u003e to report in production\nbut raise in development\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis method is intended for reporting violated assertions about\npreconditions, or similar cases that can and should be gracefully handled in\nproduction, but that aren\u0026rsquo;t supposed to happen.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy podcast player of choice, \u003ca href=\"https://castro.fm/\"\u003eCastro\u003c/a\u003e, had a FOUR DAY outage that ran into this\nweek. It was very inconvenient.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe\u0026rsquo;re aware of the current database issue and working hard to resolve this\nas quickly as possible.\u003c/p\u003e",
      "date_published": "2023-12-03T00:00:00+00:00",
      "date_modified": "2023-12-03T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/126-brown-butter/",
      "url": "https://elver.me/weeknotes/126-brown-butter/",
      "title": "Weeknotes 126: Brown butter",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOk, why do Mince Pies have \u0026ldquo;brown butter\u0026rdquo; in them this year?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://simonhearne.com/2020/network-faster-than-cache/\"\u003eWhen Network is Faster than Cache\u003c/a\u003e \u0026ndash; some really impressive research.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThere is an assumption that cached assets are retrieved instantly and at\nzero cost. What we have discovered here is that there is in fact a cost to\nretrieving assets from cache based on the number of cached assets (not file\nsize) and the user\u0026rsquo;s devices.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eConcatenating / bundling your assets is probably still a good practice, even\non H/2 connections.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWell, there you go.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://rknight.me/using-svg-sprites/\"\u003eUsing SVG Sprites\u003c/a\u003e \u0026ndash; I didn\u0026rsquo;t know that SVG sprites where a thing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI \u003ca href=\"/weeknotes/119-airpods-pro-wanker/#:~:text=However%2C%20if%20you%20deploy%20to%20Heroku,works\"\u003epreviously mentioned\u003c/a\u003e that we couldn\u0026rsquo;t yet use bundler\u0026rsquo;s new ability to\nread your Ruby version number out of a file with \u003ccode\u003eruby file: '.ruby-version'\u003c/code\u003e\non Heroku.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHowever, if you deploy to Heroku there is a small spanner in the works. I\nhad no idea about this, but Heroku always uses certain versions of bundler\nwhen you deploy (currently 2.3.25), so we can’t use this new feature until\nthe Heroku buildpack is updated.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHowever, it now looks \u003ca href=\"https://github.com/heroku/heroku-buildpack-ruby/pull/1404\"\u003elike bundler might soon be updated on Heroku\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI know we should all be anti-Amazon, but the Christmas shopping season really\nbrings into \u003cem\u003esharp\u003c/em\u003e focus just how good they are at delivering goods vs almost\neveryone else.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI have been planning to upgrade the hard disks in my home file server for a\nwhile, and I\u0026rsquo;ve been keeping an eye on prices with Black Friday coming up.\u003c/p\u003e\n\u003cp\u003eWestern Digital have been reliable for me for since I bought the original\ndisks in 2018, so when they started offering 30% off when you buy 2 it was\nhard to resist, so I got 6 new disks\u0026hellip;\u003c/p\u003e\n\u003cp\u003eOne day I\u0026rsquo;d like to go all SSD, but I think \u003ca href=\"https://techhub.social/@cg32/111403284275629288\"\u003ewe\u0026rsquo;re a few years away from\nthat\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/105-back-under-the-dome/#:~:text=I%20heard%20about,like\"\u003eAs I\u0026rsquo;ve said before I\u0026rsquo;m trying out Kagi\u003c/a\u003e as my main search engine, and I was\npleasantly surprised to find that they are big users of Crystal.\u003c/p\u003e\n\u003cp\u003eVia \u003ca href=\"https://www.youtube.com/watch?v=r7t9xPajjTM\"\u003eZac Nowicki\u0026rsquo;s talk at CrystalConf 2023\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://johnwhiles.com/posts/programming-as-theory\"\u003eSuddenly, I Understand Software\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhy is it that when you join a company, the engineer who\u0026rsquo;s been there for\nyears seems like an incredible genius?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is really worth reading.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ronjeffries.com/articles/-y023/small-steps/\"\u003eRon Jeffries on taking smaller steps\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn my experience, when we shorten the time it takes to go from green back to\ngreen again, things go better. And I don’t mean shortening it from an hour\nto thirty minutes. I mean shortening it down and down and down, until we are\ncommitting our code every couple of minutes.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAs he says, the idea is simple, but the discipline is much harder.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOk, why do Mince Pies have \u0026ldquo;brown butter\u0026rdquo; in them this year?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://simonhearne.com/2020/network-faster-than-cache/\"\u003eWhen Network is Faster than Cache\u003c/a\u003e \u0026ndash; some really impressive research.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThere is an assumption that cached assets are retrieved instantly and at\nzero cost. What we have discovered here is that there is in fact a cost to\nretrieving assets from cache based on the number of cached assets (not file\nsize) and the user\u0026rsquo;s devices.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd:\u003c/p\u003e",
      "date_published": "2023-11-26T00:00:00+00:00",
      "date_modified": "2023-11-26T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/125-collaborator/",
      "url": "https://elver.me/weeknotes/125-collaborator/",
      "title": "Weeknotes 125: Collaborator",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.reddit.com/r/Rivian/comments/17usikn/202342_ota_update_issue/\"\u003e2023.42 OTA Update Issue\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe made an error with the 2023.42 OTA update - a fat finger where the wrong\nbuild with the wrong security certificates was sent out.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAwks 🫢\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.bbc.co.uk/programmes/m001rrhy\"\u003eThe Cows Are Mad\u003c/a\u003e \u0026ndash; I really enjoyed this terrifying story of \u0026ldquo;Mad cow\ndisease\u0026rdquo;. I remember it at the time, but didn\u0026rsquo;t really realise how scary it\nwas/is until much later.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eScience has still failed to definitively answer two major questions about\nmad cow disease - where did it come from and how did humans get it?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.naildrivin5.com/blog/2023/10/17/the-katz-conjecture-you-must-understand-what-an-abstraction-abstracts.html\"\u003eThe Katz Conjecture: You Must Understand What an Abstraction Abstracts\u003c/a\u003e by\nDavid Bryant Copeland\u003c/p\u003e\n\u003cp\u003eThese examples of leaky abstractions are really good. I\u0026rsquo;ve found it hard to\nput into words what a leaky abstraction is.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHowever, if you are really writing a reporting system with a ton of\ncomplicated joins across many tables, an ORM like Active Record might make\nthings worse. Complicated queries in Active Record are often more\ncomplicated than the SQL you’d need to run. But you wouldn’t know that if\nyou don’t know how to solve the problem with SQL.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve found myself writing a query by hand and then having to shoehorn it back\ninto an ActiveRecord many times.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://brightonruby.com/2023/twenty-years-of-ruby-in-five-minutes-paul-battley/\"\u003eTwenty Years of Ruby in Five Minutes\u003c/a\u003e \u0026ndash; this was my favourite talk at\nBrighton Ruby 2023. The lightning talks are almost always the best.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.learnwithjason.dev/blog/oklch-better-color-css-browser\"\u003eOKLCH for better color in the browser\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eTIL about the \u003ccode\u003eoklch\u003c/code\u003e colorspace coming to a web browser near you soon. \u003ca href=\"https://evilmartians.com/chronicles/oklch-in-css-why-quit-rgb-hsl\"\u003eEvil\nMartians have a great blog post\u003c/a\u003e that goes into loads of detail about this new\nway of specifying colors, most of which went over my head. But one thing is\nobvious \u0026ndash; the colours just look \u003cem\u003enicer\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/yhirano55/trace_location\"\u003eTraceLocation\u003c/a\u003e looks very neat for exploring unfamiliar Ruby code.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTraceLocation helps you trace the source location to ease reading huge\nopen-source libraries in Ruby.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVia \u003ca href=\"https://twitter.com/lucianghinda/status/1704099278849991027\"\u003eLucian Ghinda\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI knew we don\u0026rsquo;t get enough Vitamin D during the Winter in the UK, but I didn\u0026rsquo;t\nrealise that it was for so long.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://www.nhs.uk/conditions/vitamins-and-minerals/vitamin-d/\"\u003eBut between October and early March we do not make enough vitamin D from\nsunlight\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI used to take a supplement, but like other healthy life behaviours, I\nstopped. I\u0026rsquo;ve ordered some more and will start taking them ASAP.\u003c/p\u003e\n\u003cp\u003eStupid angle of the sun 🌞\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMaking a note of \u003ca href=\"https://github.com/sqlfluff/sqlfluff\"\u003esqlfluff\u003c/a\u003e should I need it one day.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA modular SQL linter and auto-formatter with support for multiple dialects\nand templated code.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI watched another of Andrew Courter\u0026rsquo;s videos, this time \u003ca href=\"https://www.youtube.com/watch?v=qN6BuJpsFbQ\"\u003eAutocommands in Neovim\u003c/a\u003e.\nAs a result I\u0026rsquo;ve added this autocommand to my config which highlights on yank\nshowing you what was yanked visually.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e-- Autocommands\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.api.nvim_create_augroup(\u003cspan style=\"color:#d14\"\u003e\u0026#34;custom_buffer\u0026#34;\u003c/span\u003e, { clear \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e })\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e-- Highlight yanks\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.api.nvim_create_autocmd(\u003cspan style=\"color:#d14\"\u003e\u0026#34;TextYankPost\u0026#34;\u003c/span\u003e, {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  group \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;custom_buffer\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  pattern \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;*\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  callback \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e() vim.highlight.on_yank { timeout \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#099\"\u003e200\u003c/span\u003e } \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e})\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI\u0026rsquo;m going to trial it for a bit.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wrote my first Elixir macro last week (I forgot to say).\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edefmodule\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eFoo.DocsHelper\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003edefmacro\u003c/span\u003e __using__(_) \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003equote\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e docs() \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        fetch_docs() \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u0026gt;\u003c/span\u003e render_markdown()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#000;font-weight:bold\"\u003edefp\u003c/span\u003e fetch_docs() \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        module \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003eunquote\u003c/span\u003e(__CALLER__\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003emodule)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        docs \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eCode\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efetch_docs(module)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#000;font-weight:bold\"\u003ecase\u003c/span\u003e docs \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          {_, _, _, _, %{\u003cspan style=\"color:#d14\"\u003e\u0026#34;en\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e moduledoc}, _, _} \u003cspan style=\"color:#000;font-weight:bold\"\u003e-\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            moduledoc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          _ \u003cspan style=\"color:#000;font-weight:bold\"\u003e-\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#008080\"\u003enil\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#000;font-weight:bold\"\u003edefp\u003c/span\u003e render_markdown(\u003cspan style=\"color:#008080\"\u003enil\u003c/span\u003e), \u003cspan style=\"color:#990073\"\u003edo\u003c/span\u003e: \u003cspan style=\"color:#008080\"\u003enil\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#000;font-weight:bold\"\u003edefp\u003c/span\u003e render_markdown(moduledoc) \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        moduledoc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eString\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003etrim()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eEarmark\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eas_html!()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003ePhoenix.HTML\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eraw()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTurns out that I didn\u0026rsquo;t need it in the end, but I still think it\u0026rsquo;s cool.\u003c/p\u003e\n\u003cp\u003eYou can \u003ccode\u003euse\u003c/code\u003e the module and it will add a \u003ccode\u003edocs/0\u003c/code\u003e function to your LiveView\nwhich reads the documentation from your \u003ccode\u003e@moduledoc\u003c/code\u003e and renders it as\nMarkdown.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edefmodule\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eFooWeb.BarLive\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#008080\"\u003e@moduledoc\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e  I am documentation\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e  \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003euse\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eFoo.DocsHelper\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e render(assigns) \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#d14\"\u003e~H\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e    \u0026lt;p\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e      \u0026lt;%= docs() %\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e    \u0026lt;/p\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e    \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNeat!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.appsignal.com/2023/11/07/validating-data-in-elixir-using-ecto-and-nimbleoptions.html\"\u003eValidating Data in Elixir: Using Ecto and NimbleOptions\u003c/a\u003e is a good\nintroduction to \u003ca href=\"https://hexdocs.pm/nimble_options/NimbleOptions.html\"\u003eNimbleOptions\u003c/a\u003e, which I hadn\u0026rsquo;t heard of before.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://railsatscale.com/2023-11-07-yjit-is-the-most-memory-efficient-ruby-jit/\"\u003eYJIT Is the Most Memory-Efficient Ruby JIT\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe YJIT team has spent a significant amount of effort optimizing YJIT so\nthat it doesn’t just show good peak performance numbers, but also does this\nwhile being memory-efficient. This effort has paid off, with YJIT having the\nleast memory overhead of any Ruby JIT, which has been crucial in enabling\nYJIT to handle Shopify’s SFR deployment.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eImpressive work on YJIT.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.threads.net/@quiverquantitative/post/CzcB-Gsgqow/\"\u003e\u0026ldquo;I built a trading bot that buys stocks that are being bought by politicians\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt is up 20% since it launched in May 2022.\nThe market has been flat during the same time period.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e😠\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe went to see \u003ca href=\"https://www.danielkitson.com/livestuff/2023/11/14/collaborator-a-work-in-progress-by-daniel-kitson-jw9dw-pmpx5-krgll\"\u003eDaniel Kitson\u0026rsquo;s new show, Collaborator\u003c/a\u003e this week. One of the\nmost anxiety-inducing hours of my life. He handed out scripts to everyone,\nsome speaking parts, some not. And then everyone put on a play! Thankfully,\nyou didn\u0026rsquo;t \u003cem\u003ehave\u003c/em\u003e to take part. It was amazing good!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitchellh.com/writing/github-changesets\"\u003eReorient GitHub Pull Requests Around Changesets\u003c/a\u003e \u0026ndash; some great points here!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.reddit.com/r/Rivian/comments/17usikn/202342_ota_update_issue/\"\u003e2023.42 OTA Update Issue\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe made an error with the 2023.42 OTA update - a fat finger where the wrong\nbuild with the wrong security certificates was sent out.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAwks 🫢\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.bbc.co.uk/programmes/m001rrhy\"\u003eThe Cows Are Mad\u003c/a\u003e \u0026ndash; I really enjoyed this terrifying story of \u0026ldquo;Mad cow\ndisease\u0026rdquo;. I remember it at the time, but didn\u0026rsquo;t really realise how scary it\nwas/is until much later.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eScience has still failed to definitively answer two major questions about\nmad cow disease - where did it come from and how did humans get it?\u003c/p\u003e",
      "date_published": "2023-11-19T00:00:00+00:00",
      "date_modified": "2023-11-19T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/124-show-me-your-feed/",
      "url": "https://elver.me/weeknotes/124-show-me-your-feed/",
      "title": "Weeknotes 124: Show me your feed",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI was prompted by \u003ca href=\"https://rknight.me/please-expose-your-rss/\"\u003ethis Rob Knight post\u003c/a\u003e to make the RSS feed for this website\nmore visible. Have a look. Up there \u003cspan style=\"display: inline-block;transform: rotate(25deg);\"\u003e👆\u003c/span\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://phoenixonrails.com/blog/why-im-in-the-tailwind-cult\"\u003eWhy I\u0026rsquo;m in the Tailwind cult\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMaster the art of Cascading Style Sheets - in particular the “cascading”\npart, which refers to the hierarchical system by which style rules are\ninherited or overridden - and you’ll be writing clean, composable, reusable,\nreadable, maintainable stylesheets that are a pleasure to work with and a\njoy to behold.\u003c/p\u003e\n\u003cp\u003eThat’s what they told me I would discover. But twenty years later, I’m still\nsearching.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve seen a lot of people framing the Tailwind debate as \u0026ldquo;just learn CSS\u0026rdquo;,\nwithout realising that a lot of people have tried that. CSS is \u003cem\u003enot perfect\u003c/em\u003e\nregardless of how many times you imply it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI bought a new office chair \u003ca href=\"/weeknotes/4-bye-bye-comfort-hello-hugo/#:~:text=the%20chair%20arrived\"\u003e(again)\u003c/a\u003e \u0026ndash; a \u003ca href=\"https://www.amazon.co.uk/Steelcase-Ergonomic-Adjustable-Comfortable-Upholstery/dp/B0B32WXV5N/?th=1\"\u003eSteelcase Gesture\u003c/a\u003e. The uPVC pipe\nholding up my previous Steelcase Leap V2 chair finally cracked.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve had my eye on one of these for a while (2 years+), but they were a bit\nhard to get hold of in the UK (only being sold by a couple of office\nsuppliers), but Amazon have started selling them now so I went for it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/11ty/eleventy/issues/3098\"\u003eUse tabs.\u003c/a\u003e \u0026ndash; a very ballsy move!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHow do you plug a PC into an Apple Studio Display? It\u0026rsquo;s not as easy as you\nmight think. I basically haven\u0026rsquo;t used my PC since I got the Apple monitor\nbecause I hadn\u0026rsquo;t solved this issue. I gave it a try this week.\u003c/p\u003e\n\u003cp\u003eThe PC has HDMI and DisplayPort \u003cstrong\u003eout\u003c/strong\u003e, and the Studio Display only has\nThunderbolt-4 \u003cstrong\u003ein\u003c/strong\u003e. \u003ca href=\"https://justin.searls.co/posts/connecting-a-gaming-pc-to-apple-studio-display/\"\u003eJustin Searls has a good blog post\u003c/a\u003e that was a great\nhelp figuring out which cable to buy. I will report back on which cables I\nbought and what did and didn\u0026rsquo;t work.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA new font from GitHub, \u003ca href=\"https://monaspace.githubnext.com/\"\u003eMonaspace\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/rails/rails/pull/49947\"\u003eYJIT will be enabled in Rails by default\u003c/a\u003e in a future release.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThere was many public reports of 15-25% latency improvements for Rails apps\nthat did enable Ruby 3.2 YJIT, and in 3.3 it\u0026rsquo;s even better.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn order to try our various Elixir stuff when I see it, I keep a Phoenix app\naround which I attempt to keep up-to-date, ready for experiments. I decided it\nwould be a good idea to document what the various experiments were and how\nthey worked, so I\u0026rsquo;ve been looking at using \u003ca href=\"https://hexdocs.pm/ex_doc/readme.html\"\u003e\u003ccode\u003eex_doc\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe \u003ca href=\"https://github.com/elixir-lang/elixir/releases/tag/v1.16.0-rc.0\"\u003eElixir v1.16.0-rc.0 release\u003c/a\u003e mentions that they have now added\n\u003ca href=\"https://mermaid.js.org/\"\u003eMermaid.js\u003c/a\u003e diagrams to the \u003ca href=\"https://hexdocs.pm/elixir/main/GenServer.html\"\u003e\u003ccode\u003eGenServer\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://hexdocs.pm/elixir/main/Supervisor.html\"\u003e\u003ccode\u003eSupervisor\u003c/code\u003e\u003c/a\u003e docs \u0026ndash; very\nnice, and I plan on doing the same to my \u003ccode\u003eex_doc\u003c/code\u003e generated pages.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFinally, we have started enriching our documentation with Mermaid.js\ndiagrams. You can find examples in the GenServer and Supervisor docs.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe Elixir documentation story continues to get better and better.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOn that note, I wanted to automatically build my docs. \u003ccode\u003efswatch\u003c/code\u003e seems to be\nthe new kid on the run-things-when-files-change block, so I tried that.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003efswatch -o docs/ | xargs -n1 -I{} mix docs\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIt works well. You could use this to run tests too.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI was prompted by \u003ca href=\"https://rknight.me/please-expose-your-rss/\"\u003ethis Rob Knight post\u003c/a\u003e to make the RSS feed for this website\nmore visible. Have a look. Up there \u003cspan style=\"display: inline-block;transform: rotate(25deg);\"\u003e👆\u003c/span\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://phoenixonrails.com/blog/why-im-in-the-tailwind-cult\"\u003eWhy I\u0026rsquo;m in the Tailwind cult\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMaster the art of Cascading Style Sheets - in particular the “cascading”\npart, which refers to the hierarchical system by which style rules are\ninherited or overridden - and you’ll be writing clean, composable, reusable,\nreadable, maintainable stylesheets that are a pleasure to work with and a\njoy to behold.\u003c/p\u003e",
      "date_published": "2023-11-12T00:00:00+00:00",
      "date_modified": "2023-11-12T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/123-this-isnt-for-you-its-for-me/",
      "url": "https://elver.me/weeknotes/123-this-isnt-for-you-its-for-me/",
      "title": "Weeknotes 123: This isn’t for you. It’s for me.",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.themoviedb.org/tv/204154-scavengers-reign\"\u003eScavengers Reign\u003c/a\u003e is really good. I devoured 9 episodes in a couple of days\nand can\u0026rsquo;t wait for the final 3 episodes of Season 1 next week.\u003c/p\u003e\n\u003cp\u003eThe series is based on the short \u003ca href=\"https://youtu.be/1TRzemJbUsw\"\u003eScavengers\u003c/a\u003e, from 2016. I haven\u0026rsquo;t watched\nyet because I\u0026rsquo;m avoiding spoilers, if any, but I will once I\u0026rsquo;ve finished the\nseries.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.sicpers.info/2023/10/ive-vastly-misunderstood-the-single-responsibility-principle/\"\u003eI’ve vastly misunderstood the Single Responsibility Principle\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe fact that I and so many others can hold a completely different view, for\nso long, in the face of such obvious contradictory evidence, tells us\nsomething about knowledge transfer in software engineering that we probably\nought to attend to.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMiles\u0026rsquo; \u003ca href=\"https://mileswoodroffe.com/articles/this-writing-experiment\"\u003eReflections on Writing\u003c/a\u003e caused me to reflect on my own \u0026ldquo;writing\u0026rdquo; on\nthe web.\u003c/p\u003e\n\u003cp\u003eI wanted to publish a blog for a long time. Blogging, believe it or not, was a\nbig deal in the past. Before Medium and Twitter, people wrote things on their\nown websites. And some were pretty famous for it. My \u003ca href=\"https://jordanelver.co.uk/blog/\"\u003emain blog\u003c/a\u003e has been\naround since 2008, but it is rarely updated. These weeknotes are the most\nconsistent I\u0026rsquo;ve ever been with publishing on the web. 123 times so far. Mostly\non a Sunday, occasionally on a Monday.\u003c/p\u003e\n\u003cp\u003eI didn\u0026rsquo;t post much before having weeknotes because I never thought I had\nanything particularly interesting to say. Why would anyone read what I wrote?\u003c/p\u003e\n\u003cp\u003eBut then I realised this blog isn\u0026rsquo;t for \u003cem\u003eyou\u003c/em\u003e. It\u0026rsquo;s for \u003cem\u003eme\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m still aware of the potential for an audience to read it, even though I try\nto forget (and can assure you that the audience is very much \u003cem\u003epotential\u003c/em\u003e at\nthis stage), but I write because it helps me process, remember, and engage\nwith the things I write about.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePlease add a feed to your blog. It\u0026rsquo;s not really a blog without a feed 😉\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ludic.mataroa.blog/blog/i-accidentally-saved-half-a-million-dollars/\"\u003eI Accidentally Saved Half A Million Dollars\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI would have been better off not doing anything. Let that be a lesson to\nyou. Do you hear me? I applied myself for five minutes against my own better\njudgement, had the greatest success of my career, and have immediately been\npunished for it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e😆\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve seen this \u003ca href=\"https://news.ycombinator.com/item?id=15659076\"\u003eHacker News comment\u003c/a\u003e pop-up a few times on social media but I\u0026rsquo;m\nrecording it here for posterity because I think it rings true.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eEntrepreneurship is like one of those carnival games where you throw darts\nor something.\u003c/p\u003e\n\u003cp\u003eMiddle class kids can afford one throw. Most miss. A few hit the target and\nget a small prize. A very few hit the center bullseye and get a bigger\nprize. Rags to riches! The American Dream lives on.\u003c/p\u003e\n\u003cp\u003eRich kids can afford many throws. If they want to, they can try over and\nover and over again until they hit something and feel good about themselves.\nSome keep going until they hit the center bullseye, then they give speeches\nor write blog posts about \u0026ldquo;meritocracy\u0026rdquo; and the salutary effects of hard\nwork.\u003c/p\u003e\n\u003cp\u003ePoor kids aren\u0026rsquo;t visiting the carnival. They\u0026rsquo;re the ones working it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFollowing on from my renewed interest in HTTP/2 and whether or not we can give\nup on bundling, I finally got around to reading \u003ca href=\"https://csswizardry.com/2023/10/the-three-c-concatenate-compress-cache/\"\u003eThe Three Cs: 🤝 Concatenate,\n🗜️ Compress, 🗳️ Cache\u003c/a\u003e and it\u0026rsquo;s really good.\u003c/p\u003e\n\u003cp\u003eThe affects of latency explained:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSay we have one file that takes 1,000ms to download with 100ms of latency.\nDownloading this one file takes:\u003c/p\u003e\n\u003cp\u003e(1 × 1000ms) + (1 × 100ms) = 1,100ms\u003c/p\u003e\n\u003cp\u003eLet’s say we chunk that file into 10 files, thus 10 requests each taking a\ntenth of a second, now we have:\u003c/p\u003e\n\u003cp\u003e(10 × 100ms) + (10 × 100ms) = 2,000ms\u003c/p\u003e\n\u003cp\u003eBecause we added ‘nine more instances of latency’, we’ve pushed the overall\ntime from 1.1s to 2s.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe conclusion: \u0026ldquo;Bundling is here to stay for a while.\u0026rdquo;. But it depends.\u003c/p\u003e\n\u003cp\u003eSidenote: I was very surprised to find that 66% of all websites are running\nHTTP/2.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Elixir team have been working hard on improving documentation, and the\nforthcoming Elixir 1.16 is looking great. \u003ca href=\"https://www.elixirstreams.com/tips/elixir-1-16-improved-docs\"\u003eGerman Velasco shows the new\nfeatures in this video\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.testdouble.com/posts/2023-10-10-16-things-you-believe-about-software\"\u003e16 things you believe about software: A retrospective on the Searls-Briggs\nType Indicator®\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;most developers seem to love long, detailed commit messages and\ncarefully-coiffed revision histories\u0026hellip;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe amount of times I\u0026rsquo;ve longed for an explanation as to \u003cem\u003ewhy\u003c/em\u003e something was\nchanged only to be met with \u0026ldquo;Changed x\u0026rdquo;. I wish this was my experience. But\nit\u0026rsquo;s not.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe hard thing about programming, it turns out, isn’t to spell out each step\nof complexity so computers will understand, but to organize it\ncomprehensibly so that humans will.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAmen to that. Hardly any of the systems I work on are trying to do this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI heard on the \u003ca href=\"https://changelog.com/podcast/562\"\u003eChangelog podcast episode 562\u003c/a\u003e that \u003ca href=\"https://ntfy.sh/\"\u003entfy\u003c/a\u003e, a service that\nlets you send notifications to your phone or desktop via scripts, runs using a\nSQLite database and \u003ca href=\"https://changelog.com/podcast/562#transcript-97\"\u003ecurrently sends nearly 700k messages\u003c/a\u003e a day. More SQLite\nusage in the wild.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDear reader, I have read a book (\u003ca href=\"https://www.goodreads.com/book/show/123669877-berserker\"\u003eBerserker! by Adrian Edmondson\u003c/a\u003e \u0026ndash; it was\ngood!). That makes 2 books in 2023, \u003cem\u003eso far\u003c/em\u003e. Only 22 to go to reach the\nself-imposed challenge I set upon myself at the start of the year.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome interesting discussion on \u003ca href=\"https://yagni.fm/episodes/friday-deploys-w-charity-majors\"\u003eFriday Deploys by Charity Majors and Matt\nSwanson on the YAGNI podcast\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIt reminded me of a place I used to work where we did quarterly releases. That\nwas bad enough, but for every change you made in that quarter you had to fill\nin a Word document that listed the files you\u0026rsquo;d changed\u0026hellip;\u003c/p\u003e\n\u003cp\u003eDid we have source control at the time? Yes, we did, \u003ca href=\"https://subversion.apache.org/\"\u003eSubversion\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe paperwork made people feel better, but did absolutely nothing to reduce\nrisk of the release being deployed to production. Like taking your shoes off\nat the airport.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOn the same podcast, Charity says \u0026ldquo;I think the cultural message though of\nyou\u0026rsquo;re writing tests therefore you\u0026rsquo;re safe is just not true\u0026rdquo; (Transcribed\nusing \u003ca href=\"https://news.livebook.dev/speech-to-text-with-whisper-timestamping-streaming-and-parallelism-oh-my---launch-week-2---day-2-36osSY\"\u003eLivebook Whisper Speech-to-Text\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003eI couldn\u0026rsquo;t agree with this more. They give you confidence that you\u0026rsquo;re \u003cem\u003esafer\u003c/em\u003e,\nbut they don\u0026rsquo;t reduce risk to zero. No change is fully safe.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.themoviedb.org/tv/204154-scavengers-reign\"\u003eScavengers Reign\u003c/a\u003e is really good. I devoured 9 episodes in a couple of days\nand can\u0026rsquo;t wait for the final 3 episodes of Season 1 next week.\u003c/p\u003e\n\u003cp\u003eThe series is based on the short \u003ca href=\"https://youtu.be/1TRzemJbUsw\"\u003eScavengers\u003c/a\u003e, from 2016. I haven\u0026rsquo;t watched\nyet because I\u0026rsquo;m avoiding spoilers, if any, but I will once I\u0026rsquo;ve finished the\nseries.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.sicpers.info/2023/10/ive-vastly-misunderstood-the-single-responsibility-principle/\"\u003eI’ve vastly misunderstood the Single Responsibility Principle\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe fact that I and so many others can hold a completely different view, for\nso long, in the face of such obvious contradictory evidence, tells us\nsomething about knowledge transfer in software engineering that we probably\nought to attend to.\u003c/p\u003e",
      "date_published": "2023-11-05T00:00:00+00:00",
      "date_modified": "2023-11-05T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/122-closing-all-buffers/",
      "url": "https://elver.me/weeknotes/122-closing-all-buffers/",
      "title": "Weeknotes 122: Closing all buffers",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://protomaps.com/\"\u003eProtomaps - A free and open source map of the world\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eProtomaps is an open source map of the world, deployable as a single static\nfile on cloud storage.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI will have to remember this next time I need a map.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://sqlite.org/wasm/doc/trunk/index.md\"\u003eHosting SQLite databases on Github Pages\u003c/a\u003e 🤯\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHosting a static website is much easier than a \u0026ldquo;real\u0026rdquo; server - there’s many\nfree and reliable options (like GitHub, GitLab Pages, Netlify, etc), and it\nscales to basically infinity without any effort. So I wrote a tool to be\nable to use a real SQL database in a statically hosted website!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis led to \u003ca href=\"https://sqlite.org/wasm/doc/trunk/index.md\"\u003eofficial support for Wasm from SQLite\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been \u003cdel\u003emucking about with\u003c/del\u003e improving my Neovim workflow a bit this week\n(or attempting to anyway) after I took part in some pairing with another\ndeveloper and found myself flailing about. As a result I learnt about\n\u003ccode\u003eiskeyword\u003c/code\u003e in Neovim.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eiskeyword\u003c/code\u003e tells Neovim what to consider a \u0026ldquo;word\u0026rdquo;. In particular this affects\nword motions using \u003ccode\u003ew\u003c/code\u003e and searching using \u003ccode\u003e*\u003c/code\u003e. When I am focussed on a word\nand hit \u003ccode\u003e*\u003c/code\u003e it searches for that word in the current buffer.\u003c/p\u003e\n\u003cp\u003eBy default \u003ccode\u003eiskeyword\u003c/code\u003e includes all the normal \u0026ldquo;word\u0026rdquo; characters you would\nexpect, but it can be useful for this setting to include other characters\ndependant on the context. For example, Ruby code often has methods which end\nwith \u003ccode\u003e?\u003c/code\u003e or \u003ccode\u003e!\u003c/code\u003e. In that case if you want to search for a method name which\nended with a \u003ccode\u003e?\u003c/code\u003e the default \u003ccode\u003eiskeyword\u003c/code\u003e setting would \u003cem\u003enot\u003c/em\u003e include it. (I\u0026rsquo;ve\nbeen working around this by visually selecting the whole method name and then\nhitting \u003ccode\u003e*\u003c/code\u003e, but this is slow and error prone).\u003c/p\u003e\n\u003cp\u003eSo, \u003ca href=\"https://github.com/jordelver/dotfiles/commit/1ab0f2211832d33ebecf74f3f54d5afda79a3f15\"\u003eI\u0026rsquo;ve included \u003ccode\u003e?\u003c/code\u003e and \u003ccode\u003e!\u003c/code\u003e in my \u003ccode\u003eiskeyword\u003c/code\u003e setting for Ruby files\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m slightly hesitant about this change because it feels like it could have\nfar reaching affects, but I will see how it goes. So far, so good. It\ncertainly seems to work.\u003c/p\u003e\n\u003cp\u003eReference: \u003ca href=\"https://vi.stackexchange.com/a/18508/28669\"\u003ehttps://vi.stackexchange.com/a/18508/28669\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve also been working on a way to clear out buffers I no longer need. Closing\nall buffers is easily achieved with \u003ccode\u003e:%bd\u003c/code\u003e, but I often only want to close\n\u003cem\u003esome\u003c/em\u003e and that is more of a hassle.\u003c/p\u003e\n\u003cp\u003eIt turns out that I already had \u003ca href=\"https://github.com/jordelver/dotfiles/blob/6af402ae0af31ab9f07301f8a46df09ea31cd298/config/nvim/lua/functions.lua#L35-L43\"\u003e\u003ccode\u003e:BD\u003c/code\u003e command\u003c/a\u003e which allowed fuzzy finding\nand deleting of buffers using \u003ccode\u003efzf\u003c/code\u003e, but I had forgotten about it, and now\nthat I\u0026rsquo;m all in on the Telescope lifestyle it would be good to have something\nthat fits in with that.\u003c/p\u003e\n\u003cp\u003eSo now \u003ca href=\"https://github.com/jordelver/dotfiles/commit/6af402ae0af31ab9f07301f8a46df09ea31cd298\"\u003eI can hit \u003ckbd\u003ectrl\u003c/kbd\u003e \u003ckbd\u003ed\u003c/kbd\u003e\u003c/a\u003e when using \u003ccode\u003eTelescope buffers\u003c/code\u003e\ncommand and buffers will be removed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://varnish-cache.org/docs/trunk/phk/h2againagainagain.html\"\u003eOn the deck-chairs of HTTP/2\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUnless you have solid numbers to show that H2 is truly improving things for\nyou and your clients, you should just turn it off.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSomeone is not a fan of HTTP/2.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://heather-buchel.com/blog/2023/10/why-your-web-design-sucks/\"\u003eIt\u0026rsquo;s 2023, here is why your web design sucks.\u003c/a\u003e It does, indeed, suck.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://island94.org/\"\u003eBen Sheldon\u003c/a\u003e of \u003ca href=\"https://github.com/bensheldon/good_job\"\u003eGoodJob\u003c/a\u003e \u003ca href=\"https://island94.org/2023/10/reflections-on-good-job-for-solid-queue\"\u003ereflects on job queue design\u003c/a\u003e in the context of\nRails including a new job queue by default called Solid Queue.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGoodJob targets the small and medium end of projects (though some big ones\nuse it too) and prioritizes operational simplicity over performance. That\nworks for me (and a lot of others!) but also isn’t really reflective of the\nscale of companies leading Rails development. There’s a tension here.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe reality is that \u003cem\u003ea lot\u003c/em\u003e of projects will probably be fine storing their\njobs in a database. Maybe not your Shopifys or your GitHubs, but lots of\npeople.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve not had the chance to use GoodJob, but it seems similar to \u003ca href=\"https://github.com/sorentwo/oban\"\u003eOban\u003c/a\u003e in that\nit leans heavily on Postgres-only features (although Oban also supports SQLite\nso I\u0026rsquo;m not sure what they do there?) so it will be interesting to see how this\nends up working with MySQL, which some big players are keen on.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGoodJob maintains a lot of bookkeeping, keeping job and granular execution\ndata around after execution so it can be inspected.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis has been my experience in my experiments with Oban. Being able to \u003cem\u003esee\u003c/em\u003e\nthe jobs after they have executed is massively helpful. With Sidekiq the jobs\njust disappear into the ether. This is surely by design to sell Sidekiq Pro,\nwhich is absolutely fair enough.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m definitely interested in seeing what Solid Queue might become.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBack to the gym properly this week after \u003cem\u003eseveral\u003c/em\u003e weeks off due to a\ncombination of laziness and travel 🏋️\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://protomaps.com/\"\u003eProtomaps - A free and open source map of the world\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eProtomaps is an open source map of the world, deployable as a single static\nfile on cloud storage.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI will have to remember this next time I need a map.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://sqlite.org/wasm/doc/trunk/index.md\"\u003eHosting SQLite databases on Github Pages\u003c/a\u003e 🤯\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHosting a static website is much easier than a \u0026ldquo;real\u0026rdquo; server - there’s many\nfree and reliable options (like GitHub, GitLab Pages, Netlify, etc), and it\nscales to basically infinity without any effort. So I wrote a tool to be\nable to use a real SQL database in a statically hosted website!\u003c/p\u003e",
      "date_published": "2023-10-29T00:00:00+00:00",
      "date_modified": "2023-10-29T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/121-self-closing-tag/",
      "url": "https://elver.me/weeknotes/121-self-closing-tag/",
      "title": "Weeknotes 121: Self closing tag",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIt was properly cold at one point this week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNot getting on with Slack\u0026rsquo;s new workspace dropdown selector thingy?\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ecmd\u003c/code\u003e-\u003ccode\u003eshift\u003c/code\u003e-\u003ccode\u003es\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eYou\u0026rsquo;re welcome (sorry, can\u0026rsquo;t remember where I saw this 🙈).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI remember the transition to XHTML and then onto HTML 5 but I have to admit\nthat I never really understood what was going on, just that it was \u0026ldquo;better\u0026rdquo;\nand more \u0026ldquo;correct\u0026rdquo; and could be \u0026ldquo;parsed\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eSo here I am now confused about why, and if, we should be self-closing tags\naka, your friend and mine:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u0026lt;tag /\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003ca href=\"https://jakearchibald.com/2023/against-self-closing-tags-in-html/\"\u003eJake Archibald\u003c/a\u003e and \u003ca href=\"https://remysharp.com/2023/10/09/why-i-stopped-loving-slashes-in-self-closing-tags\"\u003eRemy Sharp\u003c/a\u003e both had excellent articles on the subject.\nJake\u0026rsquo;s goes into the history of how we go into this situation, but also notes\nthat self-closing is not really required any more.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAnd that\u0026rsquo;s where things are today. /\u0026gt; is mostly meaningless in HTML\ndocuments, with foreign content being the exception.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWhich Remy agrees with:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn short, what I\u0026rsquo;m saying say is that the / character is completely and\nutterly redundant in HTML as a way of saying this is self closing. It has no\neffect and, effectively, is ignored.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBut he also points out that JSX is not really HTML.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe thing that\u0026rsquo;s easy to forget is that JSX is a language that only lives\ninside the React compilers. It looks like HTML but it\u0026rsquo;s not HTML, at all.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd\u0026hellip;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eReact and JSX specifically is to blame for putting this back into the\nmainstream development process as JSX offers this as a prerequisite of it\u0026rsquo;s\nlanguage.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m happy report with can blame React and JSX.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://world.hey.com/dhh/the-price-of-managed-cloud-services-4f33d67e\"\u003eThe price of managed cloud services\u003c/a\u003e by DHH.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBecause running things on premise is not a materially different scope of\nwork from running it in the cloud. That\u0026rsquo;s the whole premise behind our\noverall cloud exit: The team it takes to run our scale of operations in the\ncloud wasn\u0026rsquo;t any less than what it takes to run that same scale on our own\nhardware.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI can believe this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dashbit.co/blog/latency-rendering-liveview\"\u003eSupercharge your app: latency and rendering optimizations in Phoenix LiveView\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFascinating walk-through the optimisation the Phoenix team have made to\nLiveView over time. Chipping away bit by bit.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://bsd.network/@solene/111249266470247090\"\u003e\u003ccode\u003egit pull --autostash\u003c/code\u003e\u003c/a\u003e \u0026ndash; where have you been all my life?!\u003c/p\u003e\n\u003cp\u003eSaves the constant \u003ccode\u003egit stash\u003c/code\u003e, \u003ccode\u003egit pull\u003c/code\u003e, \u003ccode\u003egit stash pop\u003c/code\u003e 💃 dance that I do\nevery day. You can also configure this to be the default behaviour in your\nconfig file with \u003ccode\u003emerge.autoStash\u003c/code\u003e option.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ghuntley.com/fracture/\"\u003eVisual Studio Code is designed to fracture\u003c/a\u003e (via \u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003eMicrosoft gonna Microsoft. \u003ca href=\"https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguish\"\u003eEmbrace, extend, and extinguish\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notes.valdikss.org.ru/jabber.ru-mitm/\"\u003eEncrypted traffic interception on Hetzner and Linode targeting the largest\nRussian XMPP (Jabber) messaging service\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTL;DR: we have discovered XMPP (Jabber) instant messaging protocol encrypted\nTLS connection wiretapping (Man-in-the-Middle attack) of jabber.ru (aka\nxmpp.ru) service’s servers on Hetzner and Linode hosting providers in\nGermany.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://matklad.github.io/2023/10/18/obligations.html\"\u003eUnless Explicitly Specified Otherwise, Open Source Software With Users\nCarries Moral Obligations\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe subtle point here is, if I make an Open Source Project, push it to some\nforge, write a nice readme explaining why one would want to use it, provide\none-liner for installation, and publish builds to some package registries, I\nam already creating some expectations.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAs a non-maintainer who barely contributes, I agree with this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://open.spotify.com/album/2KqSL3vLfyVO7rrZJL9tUs\"\u003eSufjan Steven\u0026rsquo;s new album, Javelin\u003c/a\u003e, is 👌\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIt was properly cold at one point this week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNot getting on with Slack\u0026rsquo;s new workspace dropdown selector thingy?\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ecmd\u003c/code\u003e-\u003ccode\u003eshift\u003c/code\u003e-\u003ccode\u003es\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eYou\u0026rsquo;re welcome (sorry, can\u0026rsquo;t remember where I saw this 🙈).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI remember the transition to XHTML and then onto HTML 5 but I have to admit\nthat I never really understood what was going on, just that it was \u0026ldquo;better\u0026rdquo;\nand more \u0026ldquo;correct\u0026rdquo; and could be \u0026ldquo;parsed\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eSo here I am now confused about why, and if, we should be self-closing tags\naka, your friend and mine:\u003c/p\u003e",
      "date_published": "2023-10-22T00:00:00+00:00",
      "date_modified": "2023-10-22T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/120-maybe-both-sides-are-correct/",
      "url": "https://elver.me/weeknotes/120-maybe-both-sides-are-correct/",
      "title": "Weeknotes 120: Maybe both sides are correct",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou might have heard something on the \u003ca href=\"https://world.hey.com/dhh/you-can-t-get-faster-than-no-build-7a44131c\"\u003eInternet about HTTP/2 and no build\nJavaScript\u003c/a\u003e? (I saw \u003ca href=\"https://www.youtube.com/watch?v=iqXjGiQ_D-A\u0026amp;t=81s\"\u003ethe keynote at Rails World\u003c/a\u003e last week). I planned on\nwriting something more substantial but I haven’t got the facts or energy\nrequired.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=jKC0OQC5UDw\"\u003eThe Primeagen\u0026rsquo;s take is very fair\u003c/a\u003e \u0026ndash; \u0026ldquo;Maybe both sides are correct\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eSomeone in his Twitch stream: \u0026ldquo;Nuance? On the Internet?\u0026rdquo; \u0026ndash; I think that sums\nit up for me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn related news, you should be aware that \u003ca href=\"https://github.com/heroku/roadmap/issues/34#issuecomment-1739992565\"\u003eHTTP/2 is not yet supported on Heroku\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(You probably shouldn\u0026rsquo;t be serving assets from Heroku anyway).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cdel\u003eChicago trip next week 🪁\u003c/del\u003e\u003c/p\u003e\n\u003cp\u003eI managed to pick up a cold whilst in Amsterdam. Long story short, Chicago\ndidn\u0026rsquo;t happen 🫤\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you want to check whether you\u0026rsquo;ve enabled \u003ca href=\"https://docs.ruby-lang.org/en/master/yjit/yjit_md.html\"\u003eYJIT\u003c/a\u003e in your Ruby environment,\n\u003ca href=\"https://til.simplificator.com/posts/82\"\u003eyou can check from the console\u003c/a\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ irb\nirb(main):001:0\u0026gt; RubyVM::YJIT.enabled?\n=\u0026gt; true\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eJose Valim and team are had another \u003ca href=\"https://news.livebook.dev/label/45764\"\u003eLivebook \u0026ldquo;Launch Week\u0026rdquo;\u003c/a\u003e this week where\nthey unveiled some really nice new features: \u003ca href=\"https://news.livebook.dev/introducing-file-integration---launch-week-2---day-3-2HoFfa\"\u003eFile Integration\u003c/a\u003e and a\n\u003ca href=\"https://news.livebook.dev/remote-execution-smart-cell---launch-week-2---day-1-m3dv2\"\u003eRemote execution Smart cell\u003c/a\u003e were the highlights for me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://front-end.social/@jensimmons/111212178918345738\"\u003eJen Simmons tooted\u003c/a\u003e that the CSS Working Group are adding a new CSS rule to\nallow form input and textarea elements to grow, something normally you\u0026rsquo;d need\nJavaScript for.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYou know how, by default, the \u003ccode\u003e\u0026lt;textarea\u0026gt;\u003c/code\u003e field stays the same size when\npeople type sentences into the form field? The CSS Working Group is creating\na new CSS property so you can style a form field (\u003ccode\u003etext-area\u003c/code\u003e  and \u003ccode\u003einput\u003c/code\u003e)\nto grow fit its content —so you don’t have to use JavaScript to do this!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=pQ0CvjAJXz4\"\u003eBryan Hunter spoke at GigCityElixir23 about a project called Waterpark\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe project is a data pipeline of sorts for a healthcare company and has high\nrequirements for availability, which took them on a path towards an unusual\narchitecture where each patient is modelled as a process within the Erlang VM,\nand all data is stored with that process. A copy of each process is then\nreplicated, using distributed Elixir, across to to geographically different\nnodes to stand-by in case the original process dies. No database involved.\u003c/p\u003e\n\u003cp\u003eVery interesting 🧠\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA \u003ca href=\"https://www.reddit.com/r/neovim/comments/172fl46/set_spelloptionscamel/\"\u003epost on the Neovim subreddit drew my attention to \u003ccode\u003eset spelloptions=camel\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen a word is CamelCased, assume \u0026ldquo;Cased\u0026rdquo; is a separate word: every\nupper-case character in a word that comes after a lower case character\nindicates the start of a new word.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSo without \u003ccode\u003espelloptions=camel\u003c/code\u003e, \u0026ldquo;LiveBook\u0026rdquo; would be considered a spelling\nmistake, but with it, it is not. \u003ca href=\"https://github.com/jordelver/dotfiles/commit/15361a9ce5c4132f74e74687f0957f06eaa80111\"\u003eI\u0026rsquo;ve added it to my config\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://joshcollinsworth.com/blog/tailwind-is-smart-steering\"\u003eClassic rock, Mario Kart, and why we can\u0026rsquo;t agree on Tailwind\u003c/a\u003e \u0026ndash; an\ninteresting take on Tailwind CSS.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/chacon/status/1713442709409501388\"\u003eFrom Scott Chacon\u003c/a\u003e, one of the very first GitHub employees, on the naming of\n\u0026ldquo;Pull Request\u0026rdquo;.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFor those of you too young, the @github naming comes from this Git builtin:\n\u003ca href=\"https://git-scm.com/docs/git-request-pull\"\u003ehttps://git-scm.com/docs/git-request-pull\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI had no idea.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou might have heard something on the \u003ca href=\"https://world.hey.com/dhh/you-can-t-get-faster-than-no-build-7a44131c\"\u003eInternet about HTTP/2 and no build\nJavaScript\u003c/a\u003e? (I saw \u003ca href=\"https://www.youtube.com/watch?v=iqXjGiQ_D-A\u0026amp;t=81s\"\u003ethe keynote at Rails World\u003c/a\u003e last week). I planned on\nwriting something more substantial but I haven’t got the facts or energy\nrequired.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=jKC0OQC5UDw\"\u003eThe Primeagen\u0026rsquo;s take is very fair\u003c/a\u003e \u0026ndash; \u0026ldquo;Maybe both sides are correct\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eSomeone in his Twitch stream: \u0026ldquo;Nuance? On the Internet?\u0026rdquo; \u0026ndash; I think that sums\nit up for me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn related news, you should be aware that \u003ca href=\"https://github.com/heroku/roadmap/issues/34#issuecomment-1739992565\"\u003eHTTP/2 is not yet supported on Heroku\u003c/a\u003e.\u003c/p\u003e",
      "date_published": "2023-10-15T00:00:00+00:00",
      "date_modified": "2023-10-15T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/119-airpods-pro-wanker/",
      "url": "https://elver.me/weeknotes/119-airpods-pro-wanker/",
      "title": "Weeknotes 119: AirPods Pro wanker",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI attended \u003ca href=\"https://rubyonrails.org/world\"\u003eRails World\u003c/a\u003e in Amsterdam this week. I\u0026rsquo;m writing this in Schiphol\nAirport.\u003c/p\u003e\n\u003cp\u003eMixed feelings. There was some good stuff, some not so good stuff, and a few\ndisappointing things. I\u0026rsquo;m not sure how I feel about it at the moment.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI forgot to say last week, I’m now an AirPods Pro wanker. I decided to give\nthem a go because I wanted something with good sound-cancelling abilities for\nan upcoming flight.\u003c/p\u003e\n\u003cp\u003eI have to say, they’re really good. The sound cancelling is excellent. But the\nbest feature is the lack of friction using them. They are (almost) always\nconnected to the correct device somehow \u0026ndash; the opposite of my Sony\nWF-1000XM3\u0026rsquo;s which I hardly use as a result. Regular Bluetooth devices\nconstantly need pairing and unpairing. The AirPods are always just ready.\u003c/p\u003e\n\u003cp\u003eReally happy with them so far.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou know what? After using a USB-C iPhone for a couple of weeks it\u0026rsquo;s made me\nrealise that the Lightening connector was really quite good. The rounded\nedges. The satisfying snap into place. It’s just a shame it grew old and never\nworked outside of the Apple ecosystem.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m a regular listener of the \u003ca href=\"https://atp.fm/\"\u003eATP podcast\u003c/a\u003e, and one of the hosts, \u003ca href=\"https://www.caseyliss.com/2023/8/7/callsheet\"\u003eCasey\nLiss, recently released a new iOS app called Callsheet\u003c/a\u003e which is an\nalternative to IMDB. Basically, an ad-free, fast, \u003cem\u003enice\u003c/em\u003e experience. I was\nvery in the \u0026ldquo;Why would I pay for this app?\u0026rdquo; camp until I used it for a bit,\nand it became clear it was worth the yearly subscription.\u003c/p\u003e\n\u003cp\u003eAnyway, the reason I\u0026rsquo;m telling you all this is because \u003ca href=\"https://www.caseyliss.com/2023/9/20/callsheet-2023-4#:~:text=now%20shows%20what%20you%E2%80%99re%20actively%20playing%20in%20channels%20and%2C%20experimentally%2C%20plex\"\u003ehe recently released a\ncool integration with Plex\u003c/a\u003e. If you have something playing on Plex when you\nopen the app it automatically looks up what you\u0026rsquo;re watching and shows it at\nthe top of the app!\u003c/p\u003e\n\u003cp\u003e(If you have trouble getting it working, like I did, \u003ca href=\"https://mastodon.social/@caseyliss/111165429769180005\"\u003etry these instructions\non Mastodon\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe new \u003ccode\u003ePhoenix.LiveView.assign_async\u003c/code\u003e and \u003ccode\u003ePhoenix.Component.async_result\u003c/code\u003e\nfunctions in  LiveView 0.20.0 look to be very helpful.\u003c/p\u003e\n\u003cp\u003eThis is a nice guide \u0026ndash; \u003ca href=\"https://johnelmlabs.com/posts/async-assigns\"\u003eHow to Use LiveView\u0026rsquo;s Async Assigns\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs an \u003ccode\u003easdf\u003c/code\u003e user I like to keep a \u003ccode\u003e.tool-versions\u003c/code\u003e file in my projects. That\nway I can specify everything I need in one place. Typically, this might\ninclude Ruby, Elixir, PostreSQL, or Redis versions.\u003c/p\u003e\n\u003cp\u003eHowever, for Ruby projects you need to specify a Ruby version in the project\n\u003ccode\u003eGemfile\u003c/code\u003e. Now we need to update it in two places. Duplication of a version\nnumber is bad.\u003c/p\u003e\n\u003cp\u003eGood news! bundler now supports \u003ca href=\"https://github.com/rubygems/rubygems/pull/6876\"\u003ereading the version number from either a\n\u003ccode\u003e.ruby-version\u003c/code\u003e\u003c/a\u003e or \u003ca href=\"https://github.com/rubygems/rubygems/pull/6898\"\u003e\u003ccode\u003e.tool-versions\u003c/code\u003e\u003c/a\u003e file 😎\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eruby file: '.ruby-version'\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eHowever, if you deploy to Heroku there is a small spanner in the works. I had\nno idea about this, but \u003ca href=\"https://devcenter.heroku.com/articles/ruby-support#libraries\"\u003eHeroku always uses certain versions of \u003ccode\u003ebundler\u003c/code\u003e when\nyou deploy\u003c/a\u003e (currently \u003ccode\u003e2.3.25\u003c/code\u003e), so we can\u0026rsquo;t use this new feature until the\n\u003ca href=\"https://github.com/heroku/heroku-buildpack-ruby/blob/9d5d8c4732b6962e12981f5948ca72d7b40dca0a/lib/language_pack/helpers/bundler_wrapper.rb#L40\"\u003eHeroku buildpack is updated\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eWe can \u003ca href=\"https://andycroll.com/ruby/read-ruby-version-in-your-gemfile/\"\u003ework around it using this hack\u003c/a\u003e until \u003ccode\u003e\u0026gt;= 2.4.20\u003c/code\u003e is available.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eruby File.read(\u0026quot;.ruby-version\u0026quot;).strip\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNot perfect, but still better than having multiple Ruby version numbers in the\ncodebase.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://chanind.github.io/rails/2019/03/28/why-i-miss-rails.html\"\u003e\u0026ldquo;Why I miss Rails\u0026rdquo;\u003c/a\u003e. \u003ca href=\"https://jasoncharnes.com/\"\u003eJason Charnes\u003c/a\u003e mentioned this blog post in his\n\u003ca href=\"https://rubyonrails.org/world\"\u003eRails World\u003c/a\u003e talk.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAll these things that used to be easy in Rails take a fair bit of manual\neffort today because there’s not a standardized setup and eco-system. We’re\nspending a lot of time re-solving all these boilerplate issues that every\nweb app needs and everyone has already solved countless times before.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eRails is still here.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://herman.bearblog.dev/how-i-stay-motivated-as-a-solo-creator/\"\u003eHow I stay motivated as a solo-creator\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFor one, my income is somewhat tied to my productivity, and my productivity\nhighly correlates to my state of mind.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis is the most important point for me, and perhaps the hardest one to\nfulfil. When going down the early stages of product development the main\nquestion on my mind is \u0026ldquo;If this project works out, do I want to spend the\nnext few years working on it?\u0026rdquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSo, the trick is: work on something that interests you. Hopefully that can\ncrossover with something that makes money\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mastodon.social/@DiConX/111166456905357384\"\u003eSebastian Staacks is making a wooden Gameboy case\u003c/a\u003e. Looks awesome!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChicago trip next week 🪁\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI attended \u003ca href=\"https://rubyonrails.org/world\"\u003eRails World\u003c/a\u003e in Amsterdam this week. I\u0026rsquo;m writing this in Schiphol\nAirport.\u003c/p\u003e\n\u003cp\u003eMixed feelings. There was some good stuff, some not so good stuff, and a few\ndisappointing things. I\u0026rsquo;m not sure how I feel about it at the moment.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI forgot to say last week, I’m now an AirPods Pro wanker. I decided to give\nthem a go because I wanted something with good sound-cancelling abilities for\nan upcoming flight.\u003c/p\u003e",
      "date_published": "2023-10-08T00:00:00+00:00",
      "date_modified": "2023-10-08T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/118-grazing-the-tops-of-houses/",
      "url": "https://elver.me/weeknotes/118-grazing-the-tops-of-houses/",
      "title": "Weeknotes 118: Grazing the tops of houses",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI wanted to stash only a few files this week and it hadn\u0026rsquo;t occurred to me that\n\u003ccode\u003egit stash\u003c/code\u003e would take a \u003ccode\u003e--patch\u003c/code\u003e, but like many other \u003ccode\u003egit\u003c/code\u003e commands, it\ndoes (try out \u003ccode\u003eadd\u003c/code\u003e and \u003ccode\u003echeckout\u003c/code\u003e with \u003ccode\u003e--patch\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve had a balloon ride voucher (that was bought for a birthday present) ready\nto be used for about approximately 3 years. Because of COVID and cancellations\ndue to the weather (6 times!) it was still unused. This Monday the weather was\n\u003cem\u003ejust\u003c/em\u003e right and we managed to take the trip.\u003c/p\u003e\n\u003cp\u003eIt was was amazing. I wouldn\u0026rsquo;t say I\u0026rsquo;m scared of heights, but I am scared of\nfalling to my death. It was surprisingly calming though.\u003c/p\u003e\n\u003cp\u003eHowever, the end was almost better. As we were getting lower and lower, almost\ngrazing the tops of houses, people on the ground started to notice us and\nbegan coming  following the balloon to it\u0026rsquo;s landing place on a local playing\nfield. The pilot let the kids from the houses climb into the basket and got\nthem involved in packing up the balloon. They were all so excited. It was\nreally lovely. Some stories told at school the next day, for certain.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.railway.app/p/railway-v2#welcome-to-v2\"\u003eIntroducing Railway V2\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThey say the day you delete all the Kubernetes code from your codebase is\nthe day you truly start living\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e😆\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jenson.org/text/\"\u003eThe invisible problem by Scott Jenson\u003c/a\u003e had me nodding throughout.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhenever I explain my research at Google into mobile text editing, I’m\nusually met with blank stares or a slightly hostile “Everyone can edit text\non their phones, right? What’s the problem?”\u003c/p\u003e\n\u003cp\u003eText editing on mobile isn’t ok.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI find typing into my phone infuriating most of the time.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ruby.social/@garrettdimon/111098708322288267\"\u003e\u0026ldquo;Today\u0026rsquo;s obscure Rails discovery\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ccode\u003ehas_secure_password\u003c/code\u003e validates password character length using the string\u0026rsquo;s\ncharacter size (72) but the real limitation is driven by Bcrypt\u0026rsquo;s limit of\n72 \u003cem\u003ebytes\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eSo it\u0026rsquo;s possible to have a 72-character password that passes ActiveRecord\nvalidations but fails to satisfy BCrypt\u0026rsquo;s limit if one of the characters is\nmulti-byte.\u003c/p\u003e\n\u003cp\u003eUnfortunately, it seems that when this happens, it is not considered valid,\nbut an error is not added to the model\u0026rsquo;s errors.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGit tip! Find the history of a particular function/method/whatever in a file.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit log -L :method_name:path/to/file\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis is super handy because sometimes you are only interested in the history\nof a particular function, not the whole file.\u003c/p\u003e\n\u003cp\u003eFrom \u003ca href=\"https://dev.to/soniasingla/git-tracking-method-function-history-332g\"\u003eGit - Tracking method/function history\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI started watching \u003ca href=\"https://www.imdb.com/title/tt10574236/\"\u003eStation Eleven\u003c/a\u003e \u0026ndash; enjoying it so far. I also watched a\ncouple of films this week: \u003ca href=\"https://www.imdb.com/title/tt13957560/\"\u003eDumb Money\u003c/a\u003e and \u003ca href=\"https://www.imdb.com/title/tt11858890/\"\u003eThe Creator\u003c/a\u003e, I enjoyed both, but\nThe Creator stood out \u0026ndash; amazing world building.\u003c/p\u003e\n\u003cp\u003eYes, the \u003ca href=\"/weeknotes/117-nae-good-pal/#:~:text=this%20applies%20to%20the%20cinema%20too\"\u003eaudience were well behaved\u003c/a\u003e. Thanks for asking.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=giYbq4HmfGA\"\u003eElixirConf 2023 - José Valim - The foundations of the Elixir type system\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe type system being worked on by the Elixir team is exciting. It \u003cem\u003esounds\u003c/em\u003e\nlike they\u0026rsquo;ve found a nice balance between type safety and ease of use. At\nleast to my Type ignorant brain.\u003c/p\u003e\n\u003cp\u003eIt seems very intentional and will be gradual. I think a lot of people were\nworried that it would be a big-bang change and be forced on users, but it\ndoesn\u0026rsquo;t sound that way at all.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/90-collect-your-internet/#:~:text=i%E2%80%99m%20now%20using%20it%20full%20time\"\u003eArc update\u003c/a\u003e. I\u0026rsquo;m still using it full-time and loving it. However, I\u0026rsquo;m no\nlonger using it to save pages for reading later, the mobile app is just too\nflaky and often just doesn\u0026rsquo;t work, which is a real shame.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAmsterdam trip next week for Rails World. Two day week ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNo mention of weight loss or side project? Both fucked.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI wanted to stash only a few files this week and it hadn\u0026rsquo;t occurred to me that\n\u003ccode\u003egit stash\u003c/code\u003e would take a \u003ccode\u003e--patch\u003c/code\u003e, but like many other \u003ccode\u003egit\u003c/code\u003e commands, it\ndoes (try out \u003ccode\u003eadd\u003c/code\u003e and \u003ccode\u003echeckout\u003c/code\u003e with \u003ccode\u003e--patch\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve had a balloon ride voucher (that was bought for a birthday present) ready\nto be used for about approximately 3 years. Because of COVID and cancellations\ndue to the weather (6 times!) it was still unused. This Monday the weather was\n\u003cem\u003ejust\u003c/em\u003e right and we managed to take the trip.\u003c/p\u003e",
      "date_published": "2023-10-01T00:00:00+00:00",
      "date_modified": "2023-10-01T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/117-nae-good-pal/",
      "url": "https://elver.me/weeknotes/117-nae-good-pal/",
      "title": "Weeknotes 117: Nae good, pal",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theguardian.com/commentisfree/2023/sep/14/behaviour-music-gigs-live-shows\"\u003ePeople’s behaviour at music gigs is getting worse. I have three rules to\nsolve that | Simon Price\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eHard to argue with this.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e1. Shut Up. 2. Put Your Phone Away. 3. Don’t Be a Dick.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis applies to the cinema too, unfortunately.\u003c/p\u003e\n\u003cp\u003eMy only weapon against these selfish people is, as bourgeois as it may sound,\ngoing to the £18 a ticket cinema where the ratio of poorly behaved people\n\u003cem\u003etends\u003c/em\u003e to be better, but is still not certain. I\u0026rsquo;m guessing because £18 is a\nlot more money to waste than the fiver you spend in some cinemas.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://witchhazel.thea.codes/\"\u003eWitchhazel is a nice colourscheme\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA dark \u0026amp; feminine color scheme for Sublime, VS Code, JetBrains, Pygments,\nAtom, and Vim.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theguardian.com/business/2023/sep/18/post-office-horizon-scandal-victims-compensation\"\u003e\u0026ldquo;Post Office: Horizon scandal victims to receive £600,000 compensation each\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eNot enough.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAfter the scandal, it emerged that about £1.6m in bonus payments had been\nmade to executives. The progress of the Horizon inquiry was one of four\nmetrics on which bonus payments were awarded.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eDisgraceful. People died.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/Shopify/pitchfork/commit/38c0a16e45b92372b304893d857604f3984fb1af\"\u003e\u0026ldquo;Pitchfork is no longer experimental\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt has been running Shopify\u0026rsquo;s monolith for over 3 months now\nit is safe to assume major issues have been ironed out.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou can now \u003ca href=\"https://tailscale.com/blog/apple-tv/\"\u003erun Tailscale on your Apple TV\u003c/a\u003e. Presumably using this in\nconjunction with their \u003ca href=\"https://tailscale.com/kb/1218/nextdns/\"\u003eNextDNS\u003c/a\u003e and \u003ca href=\"https://tailscale.com/kb/1258/mullvad-exit-nodes/\"\u003eMullvad\u003c/a\u003e integrations opens up many\nviewing possibilities?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://signal.org/blog/pqxdh/\"\u003eSignal are rolling out a new version of their protocol, PQXDH\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe timeline for when a sufficiently powerful quantum computer may be\ncreated is a matter of great debate. On the low end, some argue it is only a\ncouple of years away. On the high end some say 30+ years, and there are even\nthose who assert that we may never solve the challenges necessary to make a\nquantum computer with enough coherent qubits to break the current public key\ncryptosystems. The middle ground seems to be around the 5 to 10 year time\nhorizon.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/tako8ki/frum\"\u003efrum, a new Ruby version manager\u003c/a\u003e written in, wait for it\u0026hellip;Rust.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://hachyderm.io/@tcook/111089002676039010\"\u003eiOS 17 can strip tracking params from URLs\u003c/a\u003e 👏\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eURLs in iOS 17 can be stripped of all tracking information appended to the\nend of the URL so that websites cannot track your browsing using URL\nidentifiers. This function is enabled auto-magically for private browsing in\niOS 17, but it can be turned on for all browsing.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=1u08QZyjguo\"\u003eGitlab DELETING Production Databases\u003c/a\u003e \u0026ndash; This made me feel physically sick.\u003c/p\u003e\n\u003cp\u003eThe \u003ca href=\"https://www.youtube.com/watch?v=1u08QZyjguo\u0026amp;t=54s\"\u003epoint about reviewing your PR inside the web browser\u003c/a\u003e is very true in my\nexperience. Something about seeing the code in a different context makes\nmistakes far more obvious. I nearly always publish PRs as soon as I can for\nthis reason.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dnsimple.com/r/d7a9918c2a5dd7\"\u003eDNSimple, whom I use for DNS\u003c/a\u003e, have launched new pricing which works out at\n$2 per month for me, instead of the $6 I\u0026rsquo;ve been paying. A compelling reason\nto stay as a customer.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWeight loss progress \u0026ndash; nae good, pal.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theguardian.com/commentisfree/2023/sep/14/behaviour-music-gigs-live-shows\"\u003ePeople’s behaviour at music gigs is getting worse. I have three rules to\nsolve that | Simon Price\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eHard to argue with this.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e1. Shut Up. 2. Put Your Phone Away. 3. Don’t Be a Dick.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis applies to the cinema too, unfortunately.\u003c/p\u003e\n\u003cp\u003eMy only weapon against these selfish people is, as bourgeois as it may sound,\ngoing to the £18 a ticket cinema where the ratio of poorly behaved people\n\u003cem\u003etends\u003c/em\u003e to be better, but is still not certain. I\u0026rsquo;m guessing because £18 is a\nlot more money to waste than the fiver you spend in some cinemas.\u003c/p\u003e",
      "date_published": "2023-09-24T00:00:00+00:00",
      "date_modified": "2023-09-24T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/116-consumer-whore/",
      "url": "https://elver.me/weeknotes/116-consumer-whore/",
      "title": "Weeknotes 116: Consumer whore",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFour days of this week were spent in Wrocław, Poland. It\u0026rsquo;s a pretty place with\nan interesting history. I would recommend it. Back to work on Friday.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFrom \u003ca href=\"https://hachyderm.io/@zcutlip/111059359380216265\"\u003ethis thread on Mastodon about toggling hidden files in Finder\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBut did you know you can use shift-command-. (dot or period) in Finder to\ntoggle hidden file visibility?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eCmd\u003c/kbd\u003e + \u003ckbd\u003e.\u003c/kbd\u003e \u0026ndash; I did not know that.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou can now \u003ca href=\"https://tailscale.com/blog/mullvad-integration/\"\u003eset a Mullvad VPN location as your Exit Node\u003c/a\u003e when connected to\nyour tailnet. I already use Mullvad and have paid up for a year so I won\u0026rsquo;t be\nswitching just yet, but I like the integration.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTailscale has partnered with Mullvad to make its global network of VPN\nservers available for our customers. You can now easily browse the web using\nany one of Mullvad’s available servers as a Tailscale exit node while\nmaintaining the user privacy that’s synonymous with Mullvad.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhen someone asks a question but they\u0026rsquo;re not getting an answer, offer a\nsuggestion even if you know it’s incorrect. Others will jump in to tell you\nyou’re wrong and the original poster will get their answer.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fractaledmind.github.io/about/\"\u003eStephen Margheim\u003c/a\u003e has written a \u003ca href=\"https://fractaledmind.github.io/2023/09/06/enhancing-rails-sqlite-branch-databases/#all-posts-in-this-series\"\u003eseries of blog posts about using SQLite\u003c/a\u003e\nwith Rails. Very informative. He\u0026rsquo;s also working on adding various improvements\nto Rails\u0026rsquo; SQLite adaptor.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI pre-ordered an iPhone 15 Pro because \u003ca href=\"https://www.youtube.com/watch?v=OjFxc75zuUE\"\u003eI\u0026rsquo;m a consumer whore\u003c/a\u003e (a process which\nwas incredibly bad).\u003c/p\u003e\n\u003cp\u003eNow I embark on an epic journey into the confusing world of USB-C cables \u0026ndash; a\ncable which often \u003cem\u003elooks\u003c/em\u003e the same but can have a myriad of different\nabilities. To aid in that quest, I also bought a \u003ca href=\"https://www.tindie.com/products/petl/usb-c-cable-tester-c2c-caberqu/\"\u003eUSB-C cable tester\u003c/a\u003e so I can\ncheck what existing cables I have (but mostly because I like buying weird\ncircuit boards on the Internet).\u003c/p\u003e\n\u003cp\u003eIt’s already proving quite difficult to buy a suitable USB-A to USB-C cable\nthat is both short and \u003ca href=\"https://en.wikipedia.org/wiki/USB_Implementers_Forum\"\u003eUSB-IF\u003c/a\u003e approved (I don\u0026rsquo;t want a cable to melt into my\nnew phone).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://retool.com/blog/mfa-isnt-mfa/\"\u003eWhen MFA isn\u0026rsquo;t actually MFA\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe caller claimed to be one of the members of the IT team, and deepfaked\nour employee’s actual voice.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis tale of social engineering is scary. Even when you think you\u0026rsquo;re doing\neverything right you can still get caught out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mastodon.social/@Elucidating/111065473508584712\"\u003e\u0026ldquo;Airbus open sourced their new cockpit font\u0026rdquo;\u003c/a\u003e \u0026ndash; \u003ca href=\"https://b612-font.com/\"\u003eB612 FONT FAMILY\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eB612 is an highly legible open source font family designed and tested to be\nused on aircraft cockpit screens.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/115-uncaught-typeerror-undefined-is-not-a-function/#:~:text=The%20trap%20of%20constantly%20tinkering%20config%20is%20a%20real%20problem%20and%20something%20i%E2%80%99ve%20fallen%20into\"\u003eI\u0026rsquo;m still not tinkering with my Neovim config\u003c/a\u003e by \u003ca href=\"https://github.com/jordelver/dotfiles/commit/e8c806356d71986662cda8510e68cccb3f2a1801\"\u003einstalling lualine.nvim\u003c/a\u003e\nas a fancy \u003ca href=\"https://neovim.io/doc/user/options.html#'statusline'\"\u003estatusline\u003c/a\u003e replacement. A very good use of time.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe weight loss is more of a \u0026ldquo;gain\u0026rdquo; at the moment :-/\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFour days of this week were spent in Wrocław, Poland. It\u0026rsquo;s a pretty place with\nan interesting history. I would recommend it. Back to work on Friday.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFrom \u003ca href=\"https://hachyderm.io/@zcutlip/111059359380216265\"\u003ethis thread on Mastodon about toggling hidden files in Finder\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBut did you know you can use shift-command-. (dot or period) in Finder to\ntoggle hidden file visibility?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eCmd\u003c/kbd\u003e + \u003ckbd\u003e.\u003c/kbd\u003e \u0026ndash; I did not know that.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou can now \u003ca href=\"https://tailscale.com/blog/mullvad-integration/\"\u003eset a Mullvad VPN location as your Exit Node\u003c/a\u003e when connected to\nyour tailnet. I already use Mullvad and have paid up for a year so I won\u0026rsquo;t be\nswitching just yet, but I like the integration.\u003c/p\u003e",
      "date_published": "2023-09-17T00:00:00+00:00",
      "date_modified": "2023-09-17T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/115-uncaught-typeerror-undefined-is-not-a-function/",
      "url": "https://elver.me/weeknotes/115-uncaught-typeerror-undefined-is-not-a-function/",
      "title": "Weeknotes 115: Uncaught TypeError undefined is not a function",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI wasn\u0026rsquo;t entirely correct about \u003ca href=\"/weeknotes/110-cowabunga/#:~:text=this%20week%20i%20discovered%20that%20you%20can%20move%20the%20macos%20picture%20in%20picture%20window%20(of%20whatever%20is%20currently%20playing)%20to%20any%20corner%20of%20the%20screen%20with%20a%20quick%20two%20finger%20flick%20gesture%20%E2%9C%8C%EF%B8%8F%20nice.\"\u003ebeing able to move the PiP window\u003c/a\u003e in macOS.\nIt turns out that it\u0026rsquo;s the Arc PiP window which can be moved easily. The one\nSafari doesn\u0026rsquo;t allow it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eZero side project progress. Not even Figma-ing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gomakethings.com/how-to-autocomplete-two-factor-authentication-codes-with-a-single-html-attribute/\"\u003eHow to autocomplete two-factor authentication codes with a single HTML attribute\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you manage an app that supports two-factor authentication, either through\nan app or SMS, you can make it easy for users to autocomplete their unique\ncode. The trick is a single HTML attribute: [autocomplete=\u0026ldquo;one-time-code\u0026rdquo;].\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eEasy peasy.\u003c/p\u003e\n\u003cp\u003eThere are \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete#values\"\u003emany other values available\u003c/a\u003e to \u003ccode\u003eautocomplete\u003c/code\u003e worth checking out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI discovered a misspelt word in a codebase recently. There is a surprisingly\namount of faff involved in fixing this in a Ruby on Rails project. In some\nprogramming environments this problem is a right click, rename, done.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=Ric2wHzPfcM\"\u003eThe Primeagean reacted\u003c/a\u003e to \u003ca href=\"https://twitter.com/nexxeln\"\u003enexxel\u003c/a\u003e\u0026rsquo;s article \u003ca href=\"https://www.nexxel.dev/blog/neovim-to-vscode\"\u003eWhy I Switched From Neovim To\nVSCode\u003c/a\u003e and I agree with all of his points. The trap of constantly tinkering\nconfig is a real problem and something I\u0026rsquo;ve fallen into. I need to focus on\nfixing real issues with my workflow rather than nice-to-haves. For example, I\ndon\u0026rsquo;t use any kind of folding at the moment, and that would be a basic, and\nnice thing to have worked out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSo, I\u0026rsquo;ve been tinkering with my Neovim config\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/jordelver/dotfiles/commit/c244539d785e30d149bb93566c1a0be17c286a63\"\u003eI\u0026rsquo;ve added the which-key plugin\u003c/a\u003e which helps with remembering keymaps. I\u0026rsquo;ve\nfound a lot of the friction in using new plugins comes from learning what the\nkeymaps are. I think this will help.\u003c/p\u003e\n\u003cp\u003eAnother improvement I\u0026rsquo;ve been wanting to make for ages (literally years) is\neasy access to a \u003ccode\u003erails console\u003c/code\u003e. I use \u003ccode\u003etmux\u003c/code\u003e so it makes sense to \u003ca href=\"https://github.com/jordelver/dotfiles/commit/4e8cec96f5b85ed298f24f4590daa26f9b63cf1a\"\u003eopen the\nREPL in a new \u003ccode\u003etmux\u003c/code\u003e split\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI thought this was going to be really tricky for some reason, but \u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e\nfigured it out in no time. Whilst I was at it I \u003ca href=\"https://github.com/jordelver/dotfiles/commit/8c5fa8c17a0513cca6425a2d1ec1305a6c6e9514\"\u003eadded quick access to \u003ccode\u003erails routes | fzf\u003c/code\u003e too\u003c/a\u003e in the same vein.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.newyorker.com/magazine/2023/08/21/the-hidden-cost-of-free-returns\"\u003eWhat Happens to All the Stuff We Return?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt’s probably not a coincidence that the world’s two biggest\nretailers—Walmart, with revenues of five hundred and seventy-three billion\ndollars in 2022, and Amazon, with four hundred and sixty-nine billion—also\noffer some of the easiest returns.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eReally interesting look into what happens with returns.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://interaktiv.morgenpost.de/klimawandel-hitze-meeresspiegel-wassermangel-stuerme-unbewohnbar/en.html\"\u003eMapping in 3D where the earth will become uninhabitable\u003c/a\u003e. Very cool\nvisualisation of where we won\u0026rsquo;t be able to live one day. Good times.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNeovim tips are back, baby!\u003c/p\u003e\n\u003cp\u003eYou can link a highlight group to another like this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.api.nvim_set_hl(\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;NewGroup\u0026#34;\u003c/span\u003e, { link \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;ExistingGroup\u0026#34;\u003c/span\u003e })\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFor example, I wanted the \u003ccode\u003eWhichKeyDesc\u003c/code\u003e group to be the same colour as\nStrings in my code, so I did this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.api.nvim_set_hl(\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;WhichKeyDesc\u0026#34;\u003c/span\u003e, { link \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;String\u0026#34;\u003c/span\u003e })\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf you want to browse all highlight groups and have \u003ca href=\"https://github.com/nvim-telescope/telescope.nvim\"\u003eTelescope\u003c/a\u003e you can use\n\u003ccode\u003e:Telescope highlights\u003c/code\u003e which lets you fuzzily search groups and shows them in\nthe colours/style defined within the group. Neat.\u003c/p\u003e\n\u003cp\u003eYou can also see which highlight groups apply to the word under the cursor by\nissuing \u003ccode\u003e:Inspect\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport for running Rails \u003ca href=\"https://github.com/rails/rails/pull/48950\"\u003esystem tests using Playwright was merged\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI enjoyed \u003ca href=\"https://www.youtube.com/watch?v=wIzwyyHolRs\"\u003ethis commentary\u003c/a\u003e on \u003ca href=\"https://htmx.org/essays/a-real-world-react-to-htmx-port/\"\u003eDavid Guillot\u0026rsquo;s 2022 Djangocon.eu talk on htmx\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eServer-side rendering, the one true way, seems to be gaining ground again and\nthe Reacters are unhappy. You can see the push back in the comments of the\nstream against a \u0026ldquo;non-JavaScript\u0026rdquo; approach. They know no better.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m glad to see some people realising how far off the path we\u0026rsquo;ve gone.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=Bv3YhGku92w\"\u003eRemoving TypeScript - Prime Reacts\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eFrom the comments:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDHH saying that Javascript is his second favorite programming language\nthrows up major red flags. This guy is nuts.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI paid for YouTube Premium for the first time. I am unhappy with how much it\ncosts, but it is very nice to not have any adverts. It\u0026rsquo;s a shame that that\u0026rsquo;s\nthe only benefit for me personally. If I used YouTube Music it would be better\nvalue.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI wasn\u0026rsquo;t entirely correct about \u003ca href=\"/weeknotes/110-cowabunga/#:~:text=this%20week%20i%20discovered%20that%20you%20can%20move%20the%20macos%20picture%20in%20picture%20window%20(of%20whatever%20is%20currently%20playing)%20to%20any%20corner%20of%20the%20screen%20with%20a%20quick%20two%20finger%20flick%20gesture%20%E2%9C%8C%EF%B8%8F%20nice.\"\u003ebeing able to move the PiP window\u003c/a\u003e in macOS.\nIt turns out that it\u0026rsquo;s the Arc PiP window which can be moved easily. The one\nSafari doesn\u0026rsquo;t allow it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eZero side project progress. Not even Figma-ing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gomakethings.com/how-to-autocomplete-two-factor-authentication-codes-with-a-single-html-attribute/\"\u003eHow to autocomplete two-factor authentication codes with a single HTML attribute\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you manage an app that supports two-factor authentication, either through\nan app or SMS, you can make it easy for users to autocomplete their unique\ncode. The trick is a single HTML attribute: [autocomplete=\u0026ldquo;one-time-code\u0026rdquo;].\u003c/p\u003e",
      "date_published": "2023-09-10T00:00:00+00:00",
      "date_modified": "2023-09-10T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/114-shadow-rule/",
      "url": "https://elver.me/weeknotes/114-shadow-rule/",
      "title": "Weeknotes 114: Shadow rule",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.newyorker.com/magazine/2023/08/28/elon-musks-shadow-rule\"\u003eElon Musk’s Shadow Rule | The New Yorker\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHow the U.S. government came to rely on the tech billionaire—and is now\nstruggling to rein him in.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI \u003ca href=\"/weeknotes/111-stealin-yo-keystrokes/#:~:text=I%E2%80%99ve%20noticed%20certain,generate%20anchor%20links\"\u003ementioned text linking to text fragments\u003c/a\u003e as few weeks ago. The only issue\nI\u0026rsquo;ve found is that creating the correct syntax for the links is fiddly and\nerror prone, but no more! \u003ca href=\"https://chaos.social/@rixx/110967103559545798\"\u003e@rixx found\u003c/a\u003e a \u003ca href=\"https://chrome.google.com/webstore/detail/link-to-text-fragment/pbcodcjpfjdpcineamnnmbkkmkdpajjg/\"\u003eChrome extension\u003c/a\u003e to help.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=Whqs8v1svyo\"\u003eWhy British cities make no sense\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI relate to \u003ca href=\"https://mastodon.social/@PadraigOCinneide/110974029153865780\"\u003ethis toot from Padraig\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI\u0026rsquo;m in the early stages of a solo project where sustaining my own enthusiasm\nover a few months is the main challenge\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMy enthusiasm has gone for the side project. But it was only ever supposed to\nbe about \u003cem\u003efinishing\u003c/em\u003e something. I\u0026rsquo;m not particularly in love with the idea, it\nwas only ever a clone with extra features.\u003c/p\u003e\n\u003cp\u003eOne of his ideas to keep moving is to keep a development journal. I think I\u0026rsquo;ll\ntry that. Writing things down often helps.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/wesbos/status/1696201171587809761\"\u003e\u0026ldquo;CSS Nesting just landed in Firefox 117 which puts it at 100% browser support!\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eGood news?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe weight loss has stalled somewhat. I haven\u0026rsquo;t been eating as well (some\nindulgences were planned) and I\u0026rsquo;ve struggled to get back on the straight and\nnarrow.\u003c/p\u003e\n\u003cp\u003eHowever, my weight has remained stable, so that\u0026rsquo;s a good indicator that some\nslips ups can be weathered. Again, trying to drop the perfectionism. One cake\ndoes not have to ruin everything.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI didn\u0026rsquo;t know that Rails\u0026rsquo; \u003ca href=\"https://ruby.social/@ste/110991109737184792\"\u003e\u003ccode\u003escope\u003c/code\u003e can accept a class\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you don\u0026rsquo;t know \u003ccode\u003escope\u003c/code\u003e accepts classes in place of blocks. so you can\norganize complex queries logic in their own class files.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVery nice. I suppose it makes sense when you think about it. I would imagine\nanything \u003ccode\u003ecall\u003c/code\u003e-able would work?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://arstechnica.com/security/2023/09/pii-leaked-after-sourcegraph-an-ai-driven-service-for-code-development-is-hacked/\"\u003eHacker gains admin control of Sourcegraph and gives free access to the\nmasses\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe hacker gained administrative access by obtaining an authentication key a\nSourcegraph developer accidentally included in a code published to a public\nSourcegraph instance hosted on Sourcegraph.com\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u0026ldquo;hacker\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.newyorker.com/magazine/2023/08/28/elon-musks-shadow-rule\"\u003eElon Musk’s Shadow Rule | The New Yorker\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHow the U.S. government came to rely on the tech billionaire—and is now\nstruggling to rein him in.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI \u003ca href=\"/weeknotes/111-stealin-yo-keystrokes/#:~:text=I%E2%80%99ve%20noticed%20certain,generate%20anchor%20links\"\u003ementioned text linking to text fragments\u003c/a\u003e as few weeks ago. The only issue\nI\u0026rsquo;ve found is that creating the correct syntax for the links is fiddly and\nerror prone, but no more! \u003ca href=\"https://chaos.social/@rixx/110967103559545798\"\u003e@rixx found\u003c/a\u003e a \u003ca href=\"https://chrome.google.com/webstore/detail/link-to-text-fragment/pbcodcjpfjdpcineamnnmbkkmkdpajjg/\"\u003eChrome extension\u003c/a\u003e to help.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=Whqs8v1svyo\"\u003eWhy British cities make no sense\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI relate to \u003ca href=\"https://mastodon.social/@PadraigOCinneide/110974029153865780\"\u003ethis toot from Padraig\u003c/a\u003e.\u003c/p\u003e",
      "date_published": "2023-09-03T00:00:00+00:00",
      "date_modified": "2023-09-03T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/113-figma-procrastination/",
      "url": "https://elver.me/weeknotes/113-figma-procrastination/",
      "title": "Weeknotes 113: Figma procrastination",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://wavesurfer-js.org/\"\u003eWavesurfer.js\u003c/a\u003e \u0026ndash; very nice.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWavesurfer.js is an open-source audio visualization library for creating\ninteractive, customizable waveforms.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother UTF-8 related question cropped up at work this week and yet again I\nseem to have completely forgotten anything I knew about file encoding.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=gmNSFqyg_Z8\"\u003eThe Beach Boys sing \u0026ldquo;Hurt\u0026rdquo; (AI)\u003c/a\u003e by There I Ruined It \u0026ndash; lovely stuff 👏\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBefore COVID I was travelling quite a bit, which was great. More recently\nthough the habit has fallen away, so I\u0026rsquo;m happy to be getting back on the\ntravel-horse (🤔) by having three trips planned between September and October.\nI\u0026rsquo;ll be visiting Wroclaw, Amsterdam, and Chicago. A travel heavy couple of\nmonths. I\u0026rsquo;m really looking forward to it!\u003c/p\u003e\n\u003cp\u003eYet more reason to lose the weight. Travelling as a tall overweight person is\nnot fun in my experience. Transatlantic flights can be very unpleasant\ngenerally, but worse when you\u0026rsquo;re completely wedged into a plane seat.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ijmacd.github.io/rfc3339-iso8601/\"\u003eRFC 3339 vs ISO 8601\u003c/a\u003e - Time. Is. Fun.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn the course of working on the side project I decided to learn how to use\nFigma. Years ago I was more into the design and frontend side of web\ndevelopment but then focussed on the backend for years.\u003c/p\u003e\n\u003cp\u003eIs this procrastination from actually getting the thing done? Yes,\nundoubtedly. But I\u0026rsquo;m also enjoying learning something that is outside of my\nnormal wheelhouse, and is also useful for my future endeavours. Better to do\nsomething than nothing, even if it isn\u0026rsquo;t \u003cem\u003etechnically\u003c/em\u003e necessary.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTalking of the side project, I seem to be extremely motivated exclusively\nafter 10pm, but zero motivation during the day. So that\u0026rsquo;s really great.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.letsjumpship.com/theres-work-for-you/\"\u003eThere\u0026rsquo;s work for you\u003c/a\u003e by Greg Story from Jump Ship!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI have zero trust that accepting a role provides any more security than\ndoing the same work as a consultant. Job security only exists as a facade.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eTruth.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/martinvonz/jj\"\u003eJujutsu is a Git-compatible DVCS\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt combines features from Git (data model, speed), Mercurial (anonymous\nbranching, simple CLI free from \u0026ldquo;the index\u0026rdquo;, revsets, powerful\nhistory-rewriting), and Pijul/Darcs (first-class conflicts), with features\nnot found in most of them (working-copy-as-a-commit, undo functionality,\nautomatic rebase, safe replication via rsync, Dropbox, or distributed file\nsystem).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ffmpeg.lav.io/\"\u003eFFmpeg Explorer\u003c/a\u003e \u0026ndash; very useful for figuring out FFmpeg filters.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA tool to help you explore FFmpeg filters.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eTurns out there are \u003cem\u003ea lot\u003c/em\u003e filters built-in to FFmpeg.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://wavesurfer-js.org/\"\u003eWavesurfer.js\u003c/a\u003e \u0026ndash; very nice.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWavesurfer.js is an open-source audio visualization library for creating\ninteractive, customizable waveforms.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother UTF-8 related question cropped up at work this week and yet again I\nseem to have completely forgotten anything I knew about file encoding.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=gmNSFqyg_Z8\"\u003eThe Beach Boys sing \u0026ldquo;Hurt\u0026rdquo; (AI)\u003c/a\u003e by There I Ruined It \u0026ndash; lovely stuff 👏\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBefore COVID I was travelling quite a bit, which was great. More recently\nthough the habit has fallen away, so I\u0026rsquo;m happy to be getting back on the\ntravel-horse (🤔) by having three trips planned between September and October.\nI\u0026rsquo;ll be visiting Wroclaw, Amsterdam, and Chicago. A travel heavy couple of\nmonths. I\u0026rsquo;m really looking forward to it!\u003c/p\u003e",
      "date_published": "2023-08-27T00:00:00+00:00",
      "date_modified": "2023-08-27T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/112-phone-box-for-a-pound/",
      "url": "https://elver.me/weeknotes/112-phone-box-for-a-pound/",
      "title": "Weeknotes 112: Phone box for a pound",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI learnt this week that you can \u003ca href=\"https://business.bt.com/public-sector/street-hubs/adopt-a-kiosk-scheme/\"\u003eadopt a phone box from BT for a £1\u003c/a\u003e!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://wiki.alopex.li/ElixirForCynicalCurmudgeons\"\u003eElixirForCynicalCurmudgeons\u003c/a\u003e is a bit of a rollercoaster. But in the end:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt’s been a long time since a programming language made me this happy.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSome really interesting explanations of how Elixir works.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA useful tool to show how colour contract can affect different visual\nimpairments \u0026ndash; \u003ca href=\"https://www.whocanuse.com/\"\u003ewhocanuse.com\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s a tool that brings attention and understanding to how color contrast\ncan affect different people with visual impairments.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs part of my \u003ca href=\"/weeknotes/111-stealin-yo-keystrokes/#:~:text=This%20week%20I've,cool\"\u003eTailscale experiments\u003c/a\u003e I\u0026rsquo;ve been slowly (really slowly) moving\nvarious Docker configuration into git as a \u003ccode\u003edocker-compose.yml\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eWhen making any configuration changes in a work environment I would make\nchanges locally, push them to test environments, and then push them to\nproduction once ready.\u003c/p\u003e\n\u003cp\u003eHowever, when fiddling with my local server it\u0026rsquo;s often quicker and easier to\nchange the config directly on the server. The git repo is cloned to the server\nitself and changes are pushed back to the repo on GitHub.\u003c/p\u003e\n\u003cp\u003eHow to authenticate with GitHub from the server? I don\u0026rsquo;t want any keys sitting\non my server. Sure, it\u0026rsquo;s inside my internal network, but it\u0026rsquo;s also available\nto the Internet.\u003c/p\u003e\n\u003cp\u003eI chose SSH Agent forwarding. This basically means that when you connect to\nanother machine, you can \u003cem\u003eforward\u003c/em\u003e your SSH agent so that your local keys work\nfrom the remote machine.\u003c/p\u003e\n\u003cp\u003eIn your local \u003ccode\u003e.ssh/config\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eHost \u0026lt;hostname\u0026gt;\n  HostName \u0026lt;hostname\u0026gt;\n  User \u0026lt;username\u0026gt;\n  IdentityFile ~/.ssh/\u0026lt;keyname\u0026gt;\n  ForwardAgent yes\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve also been trying out \u003ca href=\"https://tailscale.com/blog/sending-files-with-taildrop/\"\u003eTailscale\u0026rsquo;s Taildrop\u003c/a\u003e feature. It\u0026rsquo;s like Apple\u0026rsquo;s\n\u003ca href=\"https://en.wikipedia.org/wiki/AirDrop\"\u003eAirDrop\u003c/a\u003e but works across your whole tailnet. Pretty cool.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTaildrop is a feature that makes it easy to send files between your personal\ndevices on a Tailscale network. Unlike cloud-based file transfer services,\nTaildrop’s peer-to-peer design makes it well-suited for lots of kinds of\nfiles you might want to send:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eUnfortunately, it doesn\u0026rsquo;t seem to work with URL sharing. I often AirDrop\nmyself URLs from my iPhone so that\u0026rsquo;s a shame.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis is a \u003ca href=\"https://twitter.com/royalicing/status/1687271985548820480\"\u003enice tip from Patrick Smith\u003c/a\u003e: \u0026ldquo;write a test that ensures the\nversion in mix.exs matches the one in the readme’s installation instructions\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI spotted an interesting question on the software engineering Stack Exchange\nthis week: \u003ca href=\"https://softwareengineering.stackexchange.com/questions/376535/whats-the-phone-number-equivalent-of-example-org\"\u003e\u0026ldquo;What\u0026rsquo;s the phone number equivalent of example.org?\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jarvispowered.com/you-dont-hate-jira-you-hate-your-manager/\"\u003eYou don\u0026rsquo;t hate JIRA, you hate your manager\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis is an interesting take with some real home truths mingled in.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eJIRA does not replace the need for skilled managers and team leads that\nactually know what\u0026rsquo;s going on.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eTruth. But\u0026hellip;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLet\u0026rsquo;s be honest; it might not be your manager, it might be you. In some\nprojects I\u0026rsquo;ve worked on, no amount of tracking is welcomed.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve seen this. Hell, I\u0026rsquo;ve \u003cem\u003ebeen\u003c/em\u003e this too. Some people absolutely \u003cem\u003ehate\u003c/em\u003e the\nwhole premise of communicating their work: describing the problem, updating\nticket statuses, writing comments; they \u003cem\u003ehate\u003c/em\u003e it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDebian Linux turned 30 years old this week. Wow. It feels to me like Debian\nhas been around forever. Have a look at the \u003ca href=\"https://wiki.debian.org/DebianHistory?action=AttachFile\u0026amp;do=get\u0026amp;target=Debian-announcement-1993.txt\"\u003eannouncement email from 1993\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eVia \u003ca href=\"https://mastodon.social/@film_girl/110901180972880241\"\u003eChristina Warren\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRails tip: If you want to make a copy of an ActiveRecord model to be saved as\na separate row in the database, you can use \u003ccode\u003e#dup\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e foo \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efind(\u003cspan style=\"color:#099\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e new_foo \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e foo\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003edup\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e new_foo\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003esave\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e new_foo\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#099\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003e#dup\u003c/code\u003e will return an exact copy but with no \u003ccode\u003e#id\u003c/code\u003e set so if can be saved as\nnew.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNot a great week weightloss wise. I lost weight again, but I had a few slip\nups and didn\u0026rsquo;t always feel in control. We go again.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI learnt this week that you can \u003ca href=\"https://business.bt.com/public-sector/street-hubs/adopt-a-kiosk-scheme/\"\u003eadopt a phone box from BT for a £1\u003c/a\u003e!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://wiki.alopex.li/ElixirForCynicalCurmudgeons\"\u003eElixirForCynicalCurmudgeons\u003c/a\u003e is a bit of a rollercoaster. But in the end:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt’s been a long time since a programming language made me this happy.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSome really interesting explanations of how Elixir works.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA useful tool to show how colour contract can affect different visual\nimpairments \u0026ndash; \u003ca href=\"https://www.whocanuse.com/\"\u003ewhocanuse.com\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s a tool that brings attention and understanding to how color contrast\ncan affect different people with visual impairments.\u003c/p\u003e",
      "date_published": "2023-08-20T00:00:00+00:00",
      "date_modified": "2023-08-20T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/111-stealin-yo-keystrokes/",
      "url": "https://elver.me/weeknotes/111-stealin-yo-keystrokes/",
      "title": "Weeknotes 111: Stealin' yo keystrokes",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Id_Software\"\u003eid Software\u003c/a\u003e released the \u003ca href=\"https://github.com/id-Software/quake2-rerelease-dll/tree/main\"\u003eQuake II rerelease game source\u003c/a\u003e 🔥\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis repository contains the game code for the 2023 rerelease of Quake II\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI tried to load some MP3s onto my iPhone this week. What a fiasco. You\u0026rsquo;d think\nthat the settings would be in the Apple Music app, right? No, they\u0026rsquo;re in\nFinder :-/\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve noticed certain websites highlighting text when you click through to them\nfrom search results but assumed that some weird Javascript was at play, but\nno! It\u0026rsquo;s \u003ca href=\"https://wicg.github.io/scroll-to-text-fragment/\"\u003eURL Fragment Text Directives\u003c/a\u003e as Simon Willison explains in \u003ca href=\"https://til.simonwillison.net/html/scroll-to-text\"\u003eScroll\nto text fragments\u003c/a\u003e. I\u0026rsquo;m hoping to take advantage of this new standard here as\nI often want to link to previous pages but have struggled with Hugo\u0026rsquo;s\ninability to generate anchor links.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.bleepingcomputer.com/news/security/new-acoustic-attack-steals-data-from-keystrokes-with-95-percent-accuracy/\"\u003eNew acoustic attack steals data from keystrokes with 95% accuracy\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eStealing keystrokes by recording the sound they make.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSuch an attack severely affects the target\u0026rsquo;s data security, as it could leak\npeople\u0026rsquo;s passwords, discussions, messages, or other sensitive information to\nmalicious third parties.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMake sure to hum loudly whilst typing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWeight loss update. I\u0026rsquo;ve lost 11.3kg (24lbs) since 4th July. Not bad\nconsidering I\u0026rsquo;ve visited the curry house twice and Burger King once in that\ntime 😉\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I\u0026rsquo;ve been experimenting with \u003ca href=\"https://tailscale.com/\"\u003eTailscale\u003c/a\u003e on my home network. It\u0026rsquo;s\nbeen on my radar for a while but I never got around to trying it \u0026ndash; it\u0026rsquo;s very\ncool.\u003c/p\u003e\n\u003cp\u003eEvery device that you install Tailscale onto becomes part of a virtual private\nnetwork (courtesy of WireGuard) where each device can talk to one another like\nthey are local to each other. Tailscale is zero config. So far, everything\njust works. No forwarding ports on your router necessary.\u003c/p\u003e\n\u003cp\u003eThis is really nice if you run services within your network which you\u0026rsquo;d like\nto access remotely but you\u0026rsquo;d rather not expose those services to the Internet.\u003c/p\u003e\n\u003cp\u003eYou can also designate Tailscale nodes as being an \u003ca href=\"https://tailscale.com/kb/1103/exit-nodes/\"\u003e\u0026ldquo;Exit Node\u0026rdquo;\u003c/a\u003e which means\nthat when you\u0026rsquo;re connected to your tailnet you can choose to route all\ninternet traffic through your chosen Exit Node. If you have an Exit Node\ninside your home, and connected to your tailnet, you can use this as a\nreplacement for traditional VPN offerings but instead of connecting through\nyour VPN provider\u0026rsquo;s servers you route traffic through your home internet\nconnection.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://namechecker.vercel.app/\"\u003eName Checker\u003c/a\u003e is a cool little project if you\u0026rsquo;re thinking of starting\nsomething and want to know if the name is already taken.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://downfall.page/\"\u003eDownfall Attacks\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDownfall attacks targets a critical weakness found in billions of modern\nprocessors used in personal and cloud computers. This vulnerability,\nidentified as CVE-2022-40982, enables a user to access and steal data from\nother users who share the same computer.\u003c/p\u003e\n\u003cp\u003eFor instance, a malicious app obtained from an app store could use the\nDownfall attack to steal sensitive information like passwords, encryption\nkeys, and private data such as banking details, personal emails, and\nmessages.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI find vulnerabilities in CPUs fascinating. The fact that this is in\n\u003cem\u003ehardware\u003c/em\u003e is scary. No rolling out patches for this software. I guess you can\nworkaround it in userspace? I don\u0026rsquo;t know.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://zfs.rent/\"\u003ezfs.rent\u003c/a\u003e is neat. An online backup service where you can send zfs snapshots.\nI love the website. This is the web I want.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI usually use \u003ca href=\"https://fast.com\"\u003efast.com from Netflix\u003c/a\u003e to test Internet speeds but I became\naware of \u003ca href=\"https://speed.cloudflare.com/\"\u003eCloudflare\u0026rsquo;s Speed Test\u003c/a\u003e this week and it\u0026rsquo;s much more comprehensive.\nNot necessarily better, but it has more information.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupabase are working on a \u003ca href=\"https://github.com/supabase/postgres_lsp\"\u003eLSP for Postgres\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe side project has seen some action. I\u0026rsquo;m trying to let perfection go in the\nname of progress.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe way that IRB\u0026rsquo;s configuration files do not stack is annoying. Sometimes a\nproject I\u0026rsquo;m working on will have project specific irb file in order to provide\ndomain specific helpers etc, but if you have an \u003ccode\u003e~/.irbrc\u003c/code\u003e like I do it will\nbe ignored.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eIRB reads a personal initialization file when it’s invoked. IRB\nsearches a file in the following order and loads the first one\nfound.\n\n- $IRBRC (if $IRBRC is set)\n- $XDG_CONFIG_HOME/irb/irbrc (if $XDG_CONFIG_HOME is set)\n- ~/.irbrc\n- .config/irb/irbrc\n- .irbrc\n- irb.rc\n- _irbrc\n- $irbrc\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI realised this week that I can export a \u003ccode\u003eIRBRC\u003c/code\u003e environment variable pointing\nto the \u003ccode\u003eirbrc\u003c/code\u003e file I want, but I still can\u0026rsquo;t stack them, which is a shame.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhat if you need to know what your external IP address?\n\u003ca href=\"https://icanhazip.com/\"\u003ehttps://icanhazip.com/\u003c/a\u003e is a \u003ccode\u003ecurl\u003c/code\u003e away. There\u0026rsquo;s a \u003ca href=\"https://major.io/p/a-new-future-for-icanhazip/\"\u003enice write up of it\u0026rsquo;s\nhistory by it\u0026rsquo;s creator Major Hayden\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn 2021, the traffic I once received in a month started arriving in 24\nhours. The site went from a billion requests per day to 30-35 billion\nrequests per day over a weekend.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is a crazy amount of traffic from something that return an IP address as\ntext.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Id_Software\"\u003eid Software\u003c/a\u003e released the \u003ca href=\"https://github.com/id-Software/quake2-rerelease-dll/tree/main\"\u003eQuake II rerelease game source\u003c/a\u003e 🔥\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis repository contains the game code for the 2023 rerelease of Quake II\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI tried to load some MP3s onto my iPhone this week. What a fiasco. You\u0026rsquo;d think\nthat the settings would be in the Apple Music app, right? No, they\u0026rsquo;re in\nFinder :-/\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve noticed certain websites highlighting text when you click through to them\nfrom search results but assumed that some weird Javascript was at play, but\nno! It\u0026rsquo;s \u003ca href=\"https://wicg.github.io/scroll-to-text-fragment/\"\u003eURL Fragment Text Directives\u003c/a\u003e as Simon Willison explains in \u003ca href=\"https://til.simonwillison.net/html/scroll-to-text\"\u003eScroll\nto text fragments\u003c/a\u003e. I\u0026rsquo;m hoping to take advantage of this new standard here as\nI often want to link to previous pages but have struggled with Hugo\u0026rsquo;s\ninability to generate anchor links.\u003c/p\u003e",
      "date_published": "2023-08-13T00:00:00+00:00",
      "date_modified": "2023-08-13T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/110-cowabunga/",
      "url": "https://elver.me/weeknotes/110-cowabunga/",
      "title": "Weeknotes 110: Cowabunga",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe side project has fallen off a cliff. I\u0026rsquo;ve lost interest. I will try and\nprogress it next week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.zzzuckerberg.com/\"\u003eLegal Lullabies\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLull yourself to sleep with the soothing white noise of your favorite tech\ngiant’s terms of service. Close your eyes, drift away, or scroll down to\njoin the 1% of technology users that claim to have read em’ from beginning\nto end.*\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ePOST\u003c/code\u003e data to a URL using \u003ccode\u003ecurl\u003c/code\u003e and \u003ca href=\"https://catonmat.net/cookbooks/curl/make-curl-silent\"\u003estay completely silent \u003cem\u003eexcept\u003c/em\u003e when\nthere are errors\u003c/a\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ecurl -S -s -o /dev/null -d \u0026quot;Some data\u0026quot; https://example.com\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs you know, \u003ca href=\"/weeknotes/5-professional-bash-programmer/\"\u003eI\u0026rsquo;m a professional Bash programmer\u003c/a\u003e, so I was updating a script\nthis week to notify me (using \u003ca href=\"https://ntfy.sh/\"\u003e\u003ccode\u003entfy\u003c/code\u003e\u003c/a\u003e) when it finishes doing work. This\nallows me to have notifications going to my Apple devices via a simple \u003ccode\u003ecurl\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eI found myself once again asking \u0026ldquo;Why am I doing this?\u0026rdquo;. I have Ruby at my\ndisposal and it can do the basic things in a much saner way than Bash. But\nhere I am.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://computer.rip/2023-07-29-Free-Public-WiFi.html\"\u003eRemember Free Public Wi-Fi?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOnce, many years ago, I stayed on the 62nd floor of the Westin Peachtree\nPlaza in Atlanta, Georgia. This was in the age when the price of a hotel\nroom was directly correlated with the price of the Wi-Fi service, and as a\nhigh school student I was not prepared to pay in excess of $15 a day for the\ninternet. As I remember, a Motel 6 that was not blocks away but within line\nof sight ended up filling the role. But even up there, 62 floors from the\nground, there was false promise: Free Public Wi-Fi.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I discovered that you can move the macOS Picture in Picture window\n(of whatever is currently playing) to any corner of the screen with a quick\ntwo finger flick gesture ✌️ Nice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.bbc.co.uk/programmes/m001mssm\"\u003eMarianna in Conspiracyland\u003c/a\u003e. I enjoyed this recommendation by \u003ca href=\"https://discoliam.com\"\u003eDiscoliam\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhat happened to the people who fell down the rabbit hole into a world of\nconspiracy theories during the pandemic?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s very scary how quickly people can persuaded to believe utter nonsense.\nThe episodes are 15 minutes so you can zip through them.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jvns.ca/blog/2023/08/03/behind--hello-world/\"\u003eBehind \u0026ldquo;Hello World\u0026rdquo; on Linux\u003c/a\u003e from Julia Evans is very interesting. It\u0026rsquo;s\namazing that anything works at all really. Apart from the great explanation of\nwhat is going on technically, I love the way Julia is not afraid to say when\nshe doesn\u0026rsquo;t know something (which is not often!).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI watched the first episode of \u003ca href=\"https://en.wikipedia.org/wiki/Bridget_Christie\"\u003eBridget Christie\u003c/a\u003e\u0026rsquo;s new comedic drama \u003ca href=\"https://www.channel4.com/programmes/the-change\"\u003eThe\nChange\u003c/a\u003e after hearing about it \u003ca href=\"https://www.youtube.com/watch?v=P10FB8LAbec\"\u003eRichard Herrings\u0026rsquo;s podcast RHLSTP (rhlstp)\u003c/a\u003e\nand thought it was great.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://justin.searls.co/\"\u003eJustin Searls\u003c/a\u003e on \u003ca href=\"https://buttondown.email/searls/archive/where-did-july-go-heres-where/\"\u003ehis creative process\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA lot of people I run into—even people of similar privilege—have their own\ninteresting things to say but nevertheless seem to be waiting around for\npermission to say them.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m not sure I qualify as \u0026ldquo;interesting things to say\u0026rdquo; but these week notes\ndefinitely provide me with an outlet for expression which I\u0026rsquo;ve been missing up\nto now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://groups.google.com/g/vim_announce/c/tWahca9zkt4\"\u003eBram Moolenaar has passed away\u003c/a\u003e 😢 Vim has been a major apart of my daily\nlife since 2011. I still use Neovim today. Bram had a massive impact on\nsoftware, there\u0026rsquo;s no doubt about that. RIP.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve seen \u003ca href=\"https://www.imdb.com/title/tt1517268/\"\u003eBarbie\u003c/a\u003e, \u003ca href=\"https://www.imdb.com/title/tt15398776/\"\u003eOppenheimer\u003c/a\u003e, and \u003ca href=\"https://www.imdb.com/title/tt8589698/\"\u003eTeenage Mutant Ninja Turtles: Mutant\nMayhem\u003c/a\u003e in the last two weeks and all I have to say is TURTLE POWER! 🐢🔌\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe side project has fallen off a cliff. I\u0026rsquo;ve lost interest. I will try and\nprogress it next week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.zzzuckerberg.com/\"\u003eLegal Lullabies\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLull yourself to sleep with the soothing white noise of your favorite tech\ngiant’s terms of service. Close your eyes, drift away, or scroll down to\njoin the 1% of technology users that claim to have read em’ from beginning\nto end.*\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ePOST\u003c/code\u003e data to a URL using \u003ccode\u003ecurl\u003c/code\u003e and \u003ca href=\"https://catonmat.net/cookbooks/curl/make-curl-silent\"\u003estay completely silent \u003cem\u003eexcept\u003c/em\u003e when\nthere are errors\u003c/a\u003e.\u003c/p\u003e",
      "date_published": "2023-08-06T00:00:00+00:00",
      "date_modified": "2023-08-06T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/109-payg-esim/",
      "url": "https://elver.me/weeknotes/109-payg-esim/",
      "title": "Weeknotes 109: PAYG eSIM",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been watching \u003ca href=\"https://en.wikipedia.org/wiki/Steven_Soderbergh\"\u003eSteven Soderbergh\u003c/a\u003e\u0026rsquo;s new sci-fi comedy series \u003ca href=\"https://commandzseries.com/\"\u003eCommand Z\u003c/a\u003e.\nDirectly supporting something feels nice, and it\u0026rsquo;s thought provoking and well\nacted.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWeight loss update: It continues. The body works in mysterious ways insofar as\neating little does not always correlate with loss, but eating Curry and Naan\nbread does. Staying straight and true in the face of that is the hard part.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been using a couple of apps:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://crouton.app/\"\u003eCrouton\u003c/a\u003e for meal planning. Being organised with \u003cem\u003ewhat\u003c/em\u003e and \u003cem\u003ewhen\u003c/em\u003e is a\nbig help and Crouton is excellent at this. I wish I\u0026rsquo;d had this years ago.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.foodnoms.com/\"\u003eFoodNoms\u003c/a\u003e for calorie tracking, because let\u0026rsquo;s be honest, MyFitnessPal is\n\u003cem\u003eawful\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://arc.net/\"\u003eArc\u003c/a\u003e \u003ca href=\"https://arc.net/e/D25B2EEA-7506-4850-A169-3B2A00802889\"\u003econtinues to improve\u003c/a\u003e. You can now \u003ckbd\u003eOption\u003c/kbd\u003e click a link or\ntab and it will open in a vertical split which is something I want to do\nfrequently, so that\u0026rsquo;s nice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://garagehq.deuxfleurs.fr/\"\u003eGarage\u003c/a\u003e \u0026ndash; another S3-compatible object storage server.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAn open-source distributed object storage service tailored for self-hosting\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve had brief success using \u003ca href=\"https://en.wikipedia.org/wiki/MinIO\"\u003eMinIO\u003c/a\u003e for local development, so it\u0026rsquo;s nice to\nhave options.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDo you like being angry and disappointed? I recommend the \u003ca href=\"https://www.private-eye.co.uk/podcast\"\u003ePrivate Eye\npodcast, Page 94\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFancy \u003ca href=\"https://build-your-own.org/redis/\"\u003ebuilding your own Redis with C/C++\u003c/a\u003e? Not right now, but one day.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://community.influxdata.com/t/getting-weird-results-from-gcp-europe-west1/30615\"\u003e\u0026ldquo;Getting weird results from GCP europe-west1\u0026rdquo;\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eFile under \u0026ldquo;How not to discontinue a service\u0026rdquo;. It seems InfluxData\n\u0026ldquo;discontinued\u0026rdquo; a.k.a. deleted a whole region and a lot of customers didn\u0026rsquo;t get\na notification it was going to happen.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEdit MP3 tags (ask your parents) in the browser with \u003ca href=\"https://mp3tag.js.org/editor/\"\u003emp3tag.js\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs \u003ca href=\"/weeknotes/91-internet-frustration/\"\u003eyou may remember\u003c/a\u003e I was considering getting a backup mobile network\nprovider to help me stay online.\u003c/p\u003e\n\u003cp\u003eMy phone supports multiple SIMs using \u003ca href=\"https://en.wikipedia.org/wiki/ESIM\"\u003eeSIMs\u003c/a\u003e which means you don\u0026rsquo;t need\nmultiple physical SIM cards. Unfortunately not many UK networks support eSIM,\nand if they do, not in Pay As You Go format (I don\u0026rsquo;t want to be tied into a\nmonthly contract for a backup).\u003c/p\u003e\n\u003cp\u003eFortunately, my friend Karl introduced me to Lyca Mobile, who piggyback on EE\nand offer PAYG with an eSIM.\u003c/p\u003e\n\u003cp\u003eThe good:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s \u003cem\u003ecurrently\u003c/em\u003e super cheap - 89p per month for 6 months. I mean, that is\n\u003cem\u003echeap\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe performance is anecdotally better than my current network, Three, in\n\u003cem\u003emost\u003c/em\u003e places I have checked. Signal and download speeds are impressive.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe bad:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFor reasons, I had to buy a physical SIM and then transfer my number (and\nbundle) over to the eSIM \u0026ndash; it wasn\u0026rsquo;t clear how to do this, and an email to\nLyca Mobile support took 10 days to respond.\u003c/p\u003e\n\u003cp\u003eOnce I had a response it was easy to setup the eSIM on the iPhone - scan a\nQR code and away you go\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Lyca Mobile website is genuinely one of the worst I\u0026rsquo;ve ever used.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve had some weird shit happen with random numbers texting and calling me.\nI guess the number\u0026rsquo;s are recycled on a regular basis whereas I\u0026rsquo;ve had my\nnumber for years. It feels scummy, and it probably is, but it\u0026rsquo;s 89p.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe interesting:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe iOS network signal icon shows a split view for each network when you\nhave more than one SIM (physical or eSIM) installed. It\u0026rsquo;s both cool and\nslightly confusing. I wonder how this copes with more than 2 networks?\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI\u0026rsquo;m not sure what I\u0026rsquo;m going to do longer term, but I will trial these for a\nbit.\u003c/p\u003e\n\u003cp\u003eI really hope more networks start using eSIM and especially in combination\nwith PAYG deals so that it\u0026rsquo;s easy to have multiple options. For example, I\u0026rsquo;d\nbe keen to give Vodafone a go as I haven\u0026rsquo;t used them in years.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFlat White or Cortado? Lance Hedrick helps explain in \u003ca href=\"https://www.youtube.com/watch?v=M--Pj9jMXEM\"\u003eCAFE DRINKS EXPLAINED\u003c/a\u003e.\nBasically you get what the barista fancies making you.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.allthingsdistributed.com/2023/07/building-and-operating-a-pretty-big-storage-system.html\"\u003eBuilding and operating a pretty big storage system called S3\u003c/a\u003e \u0026ndash; a really\ninteresting talk on the scale that comes with building and operating Amazon\nS3.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAmazon S3 holds more than 280 trillion objects and averages over 100 million\nrequests per second\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e🤯 Ok then\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://adrianroselli.com/2023/07/blockquotes-in-screen-readers.html\"\u003eBlockquotes in Screen Readers\u003c/a\u003e \u0026ndash; How? Inconclusive.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dockyard.com/blog/2023/07/27/implementing-multiple-submit-buttons-with-liveview\"\u003eImplementing Multiple Submit Buttons with LiveView\u003c/a\u003e \u0026ndash; This is what I really\nlove about Elixir. Pattern matching allows separate implementations for each\naction in a really readable way.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy latest side project is on-going but with slightly less progress this week.\nI need to remind myself that even though \u0026ldquo;weeks have passed\u0026rdquo; I haven\u0026rsquo;t been\nconstantly working on it, so that\u0026rsquo;s not weeks of effort. And I\u0026rsquo;m finding my\nway with \u0026ldquo;best practices\u0026rdquo; in Elixir/Phoenix.\u003c/p\u003e\n\u003cp\u003eI have a situation where I enforce duplicate records at the database level\nwith a unique index \u0026ndash; good.\u003c/p\u003e\n\u003cp\u003eEcto has two options for this dealing with constraints as far as I know 1) you\ncan add a \u003ca href=\"https://hexdocs.pm/ecto/3.10.3/Ecto.Changeset.html#unique_constraint/2\"\u003e\u003ccode\u003eunique_constraint/2\u003c/code\u003e\u003c/a\u003e to your changeset and it will become an\nerror which you can deal with manually; or 2) you can leave that out and it\nwill be raised as an exception.\u003c/p\u003e\n\u003cp\u003eIn this case, you shouldn\u0026rsquo;t be able to perform this action through the UI, so\nit seems appropriate to let it raise and instead return the relevant HTTP\nstatus code.\u003c/p\u003e\n\u003cp\u003eThe second option lets us catch the constraint error raised by Ecto\n(\u003ccode\u003eEcto.ConstraintError\u003c/code\u003e) and raise a custom exception we have defined. We can\nthen handle that exception as we like.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e create_rating(user, attrs \\\\ %{}) \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003etry\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    %\u003cspan style=\"color:#458;font-weight:bold\"\u003eRating\u003c/span\u003e{\u003cspan style=\"color:#990073\"\u003euser_id\u003c/span\u003e: user\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eid}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eRating\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003echangeset(attrs)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eRepo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003einsert()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003erescue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#458;font-weight:bold\"\u003eEcto.ConstraintError\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e-\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      reraise \u003cspan style=\"color:#458;font-weight:bold\"\u003eErrors.DuplicateRatingError\u003c/span\u003e, __STACKTRACE__\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUsing \u003ca href=\"https://hexdocs.pm/elixir/Kernel.html#reraise/2\"\u003e\u003ccode\u003ereraise/2\u003c/code\u003e\u003c/a\u003e means we don\u0026rsquo;t lose any stacktrace as we would with\n\u003ccode\u003eraise\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eWe can define a custom exception and tell it what HTTP status to return when\nthis exception is raised within the plug pipeline.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edefmodule\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eErrors\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003edefmodule\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eDuplicateRatingError\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003edefexception\u003c/span\u003e [\u003cspan style=\"color:#990073\"\u003e:message\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003eplug_status\u003c/span\u003e: \u003cspan style=\"color:#099\"\u003e400\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTime and time again, Elixir and Phoenix provide a great solution.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAre you old or just cool? You might like \u003ca href=\"https://www.bbc.co.uk/iplayer/episode/m001p94d/radio-2-in-concert-blur-radio-2-in-concert\"\u003eBlur: Radio 2 In Concert\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been watching \u003ca href=\"https://en.wikipedia.org/wiki/Steven_Soderbergh\"\u003eSteven Soderbergh\u003c/a\u003e\u0026rsquo;s new sci-fi comedy series \u003ca href=\"https://commandzseries.com/\"\u003eCommand Z\u003c/a\u003e.\nDirectly supporting something feels nice, and it\u0026rsquo;s thought provoking and well\nacted.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWeight loss update: It continues. The body works in mysterious ways insofar as\neating little does not always correlate with loss, but eating Curry and Naan\nbread does. Staying straight and true in the face of that is the hard part.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been using a couple of apps:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://crouton.app/\"\u003eCrouton\u003c/a\u003e for meal planning. Being organised with \u003cem\u003ewhat\u003c/em\u003e and \u003cem\u003ewhen\u003c/em\u003e is a\nbig help and Crouton is excellent at this. I wish I\u0026rsquo;d had this years ago.\u003c/p\u003e",
      "date_published": "2023-07-30T00:00:00+00:00",
      "date_modified": "2023-07-30T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/108-unauthorized-device/",
      "url": "https://elver.me/weeknotes/108-unauthorized-device/",
      "title": "Weeknotes 108: Unauthorized device",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTIL you can turn off IRB autocompletion for the Rails console like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ebin/rails console -- --noautocomplete\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eA lot of effort seems to be going into IRB improvements in recent years, but I\nstill find that the completions always seems to get in the way.\u003c/p\u003e\n\u003cp\u003eYou can make it permanent by putting \u003ccode\u003eIRB.conf[:USE_AUTOCOMPLETE] = false\u003c/code\u003e in\nyour \u003ccode\u003e~/.irbrc\u003c/code\u003e config too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://floor796.com\"\u003eFloor796\u003c/a\u003e \u0026ndash; Mind-blowing 🤯\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFloor796 is an ever-expanding animation scene showing the life of the 796th\nfloor of the huge space station! The goal of the project is to create as\nhuge animation as possible, with many references to movies, games, anime and\nmemes.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHow do you run \u0026ldquo;data fixes\u0026rdquo; in production? Most places I\u0026rsquo;ve worked have a very\nlax attitude to changing data in production.\u003c/p\u003e\n\u003cp\u003eProgrammers spend ages diligently writing automated tests for code, and\nfollowing a strict code reviews process, but then just start issuing \u003ccode\u003eUPDATE\u003c/code\u003e\nstatements willy nilly directly against production databases.\u003c/p\u003e\n\u003cp\u003eI was reminded of the \u003ca href=\"https://github.com/Shopify/maintenance_tasks\"\u003e\u003ccode\u003emaintenance_tasks\u003c/code\u003e\u003c/a\u003e gem by Shopify by \u003ca href=\"https://harry.dev/\"\u003eHarry\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA Rails engine for queuing and managing maintenance tasks.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt has loads of nice features, but most importantly, you can write tests for\nthe changes you are making.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://identity.sweden.se/en/design-elements/typography\"\u003eSweden Sans\u003c/a\u003e typeface.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHeroku has been a constant presence during my time as a user of Rails and yet\nI never knew that the format of it\u0026rsquo;s log messages had a specific name,\n\u003ca href=\"https://brandur.org/logfmt\"\u003elogfmt\u003c/a\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eat=info method=GET path=/ host=mutelight.org fwd=\u0026quot;124.133.52.161\u0026quot;\ndyno=web.2 connect=4ms service=8ms status=200 bytes=1653\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer\"\u003eThe looming demise of the 10x developer\u003c/a\u003e \u0026ndash; Very interesting take.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAt the slightest discomfort when struggling to understand something, I’ll\ngrasp for any distraction that might offer me a momentary escape. When I do\nmanage to get traction, I inevitably find myself disagreeing with the\npremise or subversively trying to prove the authors wrong.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI feel seen\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://infosec.exchange/@letsencrypt/110724329057657300\"\u003eCrazy stat from Let\u0026rsquo;s Encrypt\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eToday we\u0026rsquo;ll likely issue 3+ million certs.\u003cbr\u003e\nThat\u0026rsquo;s 125,000 per hour.\u003cbr\u003e\n2,083 per minute.\u003cbr\u003e\n34 👏 every 👏 second 👏\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had a pretty scary experience today when I woke to find a \u0026ldquo;Device Added to\nYour Account\u0026rdquo; message on my phone and Mac. I have no real idea how this\nhappened, but it caused immediate panic.\u003c/p\u003e\n\u003cp\u003eThe new device was an Apple TV. I have \u003cem\u003ean\u003c/em\u003e Apple TV. Not \u003cem\u003etwo\u003c/em\u003e Apple TVs. I\nwas ruminating on it all day. I have sold an older Apple TV in the past but I\ncan\u0026rsquo;t quite remember to whom. I usually go down the eBay route, but I have\nalso traded hardware directly to Apple.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m wondering whether the \u0026ldquo;new\u0026rdquo; Apple TV was an old one of mine that has been\nfurther recycled somehow? I looked up the serial number from an old invoice\nand it \u003cem\u003ecould\u003c/em\u003e be the one, but of course, in the panic I didn\u0026rsquo;t properly\nrecord what was what.\u003c/p\u003e\n\u003cp\u003eSo far there is no sign so far of anything untoward having happened such as\nlogin attempts, or unauthorised purchases, but I\u0026rsquo;m still in a heightened state\nof anxiety over it. I won\u0026rsquo;t relax yet.\u003c/p\u003e\n\u003cp\u003eI have, of course, reset my Apple ID password and signed out of all active\nsessions. Other than that, I\u0026rsquo;m not sure what else I can do.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eProgress on my side project has been slow, but importantly, continuing. I\nmanaged to get a pretty big task completed this week, and two smaller tasks\nfollowed quickly in it\u0026rsquo;s wake.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTIL you can turn off IRB autocompletion for the Rails console like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ebin/rails console -- --noautocomplete\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eA lot of effort seems to be going into IRB improvements in recent years, but I\nstill find that the completions always seems to get in the way.\u003c/p\u003e\n\u003cp\u003eYou can make it permanent by putting \u003ccode\u003eIRB.conf[:USE_AUTOCOMPLETE] = false\u003c/code\u003e in\nyour \u003ccode\u003e~/.irbrc\u003c/code\u003e config too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://floor796.com\"\u003eFloor796\u003c/a\u003e \u0026ndash; Mind-blowing 🤯\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFloor796 is an ever-expanding animation scene showing the life of the 796th\nfloor of the huge space station! The goal of the project is to create as\nhuge animation as possible, with many references to movies, games, anime and\nmemes.\u003c/p\u003e",
      "date_published": "2023-07-23T00:00:00+00:00",
      "date_modified": "2023-07-23T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/107-internet-cafes-and-dependencies/",
      "url": "https://elver.me/weeknotes/107-internet-cafes-and-dependencies/",
      "title": "Weeknotes 107: Internet cafes and dependencies",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eStick this in your \u003ccode\u003e~/.irbrc\u003c/code\u003e 😎\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003epbcopy\u003c/span\u003e(data)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#008080\"\u003eIO\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003epopen(\u003cspan style=\"color:#d14\"\u003e\u0026#34;pbcopy\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;w\u0026#34;\u003c/span\u003e) { _1\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ewrite(data) }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;say you have a bunch of data in your ruby console and you want to get it\nto your clipboard. I used to always write it to a file, and then cat the\nfile to pbcopy, but then it occurred to me - ruby can pipe too\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://apenwarr.ca/log/20230605\"\u003eTech debt metaphor maximalism\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you take a single pull request (PR) that adds a new feature, and launch\nit without tests or documentation, you will definitely get the benefits of\nthat PR sooner.\u003c/p\u003e\n\u003cp\u003eEvery PR you try to write after that, before adding the tests and docs (ie.\nrepaying the debt) will be slower because you risk creating undetected bugs\nor running into undocumented edge cases.\u003c/p\u003e\n\u003cp\u003eIf you take a long time to pay off the debt, the slowdown in future launches\nwill outweigh the speedup from the first launch.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWorth the read.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCredit where it\u0026rsquo;s due. I reported my \u003ca href=\"/weeknotes/106-why-we-all-need-subtitles-now/\"\u003ebroadband issues\u003c/a\u003e to my ISP and they\nsorted the problem within the day. Everything seems much better now.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/images/bqm.png\" alt=\"Graph showing packet loss reducing over time\"\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHoly shit! Weeknotes with images.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eJavaScript dependencies \u0026ndash; how does anyone confidently upgrade them? It was my\njob to bump some packages due to security vulnerabilities this week and trying\nto do this with any sort of confidence is \u003cem\u003every\u003c/em\u003e difficult.\u003c/p\u003e\n\u003cp\u003eThe sheer amount of dependencies changed when upgrading a package is really\nscary. What do other people do? Upgrade the world and hope that the tests you\nhave catch any problems?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/dogsheep/pocket-to-sqlite\"\u003e\u003ccode\u003epocket-to-sqlite\u003c/code\u003e\u003c/a\u003e is a nice tool from Simon Willison to export the data\nfrom your Pocket account into a SQLite database.\u003c/p\u003e\n\u003cp\u003eA couple of teething troubles authenticating, but once I got over those it\ndownloaded everything with ease.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epocket-to-sqlite fetch pocket.db\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI\u0026rsquo;ve been a Pocket user for some time but recently stopped my subscription for\nvarious reasons. It started when they rewrote the site as an SPA (why?! 🤢)\nand continued with their unwillingness to fix an issue I had with the web UI\nin Safari which made it unusable for me (I\u0026rsquo;ve since moved on from Safari, but\ncome on, Safari is not some unknown browser).\u003c/p\u003e\n\u003cp\u003eStill, if you wanna export your data into a database, this is the way.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI sort of knew so called \u0026ldquo;Rightward Assignment\u0026rdquo; was a thing in Ruby, but\n\u003ca href=\"https://til.hashrocket.com/posts/8lykl50rsp-ruby-rightward-assignment-js-like-destructuring\"\u003eHashRocket reminded me\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eirb(main):\u003cspan style=\"color:#099\"\u003e001\u003c/span\u003e:\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e hsh \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e { \u003cspan style=\"color:#990073\"\u003ea\u003c/span\u003e: \u003cspan style=\"color:#099\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003eb\u003c/span\u003e: \u003cspan style=\"color:#099\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003ec\u003c/span\u003e: \u003cspan style=\"color:#099\"\u003e3\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003ed\u003c/span\u003e: \u003cspan style=\"color:#099\"\u003e4\u003c/span\u003e }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e {\u003cspan style=\"color:#990073\"\u003e:a\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:b\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:c\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e3\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:d\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e4\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eirb(main):\u003cspan style=\"color:#099\"\u003e002\u003c/span\u003e:\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e hsh \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e { \u003cspan style=\"color:#990073\"\u003ea\u003c/span\u003e:, \u003cspan style=\"color:#990073\"\u003eb\u003c/span\u003e:, \u003cspan style=\"color:#990073\"\u003ed\u003c/span\u003e: new_name }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003enil\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eirb(main):\u003cspan style=\"color:#099\"\u003e003\u003c/span\u003e:\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#0086b3\"\u003eputs\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003ea, b, new_name\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#099\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#099\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#099\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003enil\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThere are more examples at \u003ca href=\"https://rubyreferences.github.io/rubychanges/3.0.html#one-line-pattern-matching-with-\"\u003eRuby Changes\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe syntax is just a bit weird to me. I\u0026rsquo;ll look for opportunities to use it I\nguess, but it doesn\u0026rsquo;t feel intuitive.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.blog/2023-07-12-github-merge-queue-is-generally-available/\"\u003eGitHub merge queue is generally available\u003c/a\u003e \u0026ndash; this is very nice if you work\nin an environment with lots of merge activity. I\u0026rsquo;ve encountered this problem\nbefore and the constant tending of branches into production was exhausting so\nthis seems like a great thing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=k8gbDNGpv-I\"\u003eInside the secret world of NYC\u0026rsquo;s last internet cafes\u003c/a\u003e from The Browser\nCompany.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL that you can \u003ca href=\"https://github.blog/changelog/2022-08-23-ssh-commit-verification-now-supported/\"\u003esign git commits with SSH keys\u003c/a\u003e. I\u0026rsquo;ve been signing commits\nwith GPG for years, but it \u003cem\u003eis\u003c/em\u003e fiddly to setup.\u003c/p\u003e\n\u003cp\u003eHowever, it does sound like GPG still has more features.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGenerating a GPG signing key is more involved than generating an SSH key,\nbut GPG has features that SSH does not. A GPG key can expire or be revoked\nwhen no longer used. GitHub shows commits that were signed with such a key\nas \u0026ldquo;Verified\u0026rdquo; unless the key was marked as compromised. SSH keys don\u0026rsquo;t have\nthis capability.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI will stick with GPG I think, but it\u0026rsquo;s nice to have another option.\u003c/p\u003e\n\u003cp\u003eVia \u003ca href=\"https://blog.1password.com/git-commit-signing/\"\u003eSign your Git commits with 1Password\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I\u0026rsquo;ve been writing some background jobs for my side project using\n\u003ca href=\"https://github.com/sorentwo/oban\"\u003eOban\u003c/a\u003e. Oban has some really nice testing capabilities built-in. My jobs are\nfairly basic so far, but the experience has been great. And, most of all, I\u0026rsquo;m\nlearning new things.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/rixx/git-backdate\"\u003e\u003ccode\u003egit-backdate\u003c/code\u003e\u003c/a\u003e \u0026ndash; you know, for reasons.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egit-backdate helps you to change the date of one or multiple commits to a\nnew date or a range of dates.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre\u003e\u003ccode\u003egit backdate origin/main \u0026quot;3 days ago..today\u0026quot; --business-hours\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSimilar to the \u003ca href=\"/weeknotes/103-woefully-inadequate-standard-library/\"\u003eObject IDs I recently posted about\u003c/a\u003e, \u003ca href=\"https://github.com/jetpack-io/typeid\"\u003eTypeIDs are a similar\nidea\u003c/a\u003e with Stripe-like resource prefixes and you \u003ca href=\"https://github.com/sloanelybutsurely/typeid-elixir\"\u003ecan use them with Elixir\u003c/a\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003euser_2x4y6z8a0b1c2d3e4f5g6h7j8k\n└──┘ └────────────────────────┘\ntype    uuid suffix (base32)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI can see the benefit of prefixing with the resource type for debugging, sure.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/106-why-we-all-need-subtitles-now/\"\u003eThe weight loss\u003c/a\u003e is going well, \u003cem\u003ebut\u003c/em\u003e the first week is usually the easiest\nfor me \u0026ndash; full of enthusiasm for a new me, and the results are always\nencouraging from a body that is suddenly in a big calorie deficit.\u003c/p\u003e\n\u003cp\u003eNo graphs yet.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eStick this in your \u003ccode\u003e~/.irbrc\u003c/code\u003e 😎\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003epbcopy\u003c/span\u003e(data)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#008080\"\u003eIO\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003epopen(\u003cspan style=\"color:#d14\"\u003e\u0026#34;pbcopy\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;w\u0026#34;\u003c/span\u003e) { _1\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ewrite(data) }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;say you have a bunch of data in your ruby console and you want to get it\nto your clipboard. I used to always write it to a file, and then cat the\nfile to pbcopy, but then it occurred to me - ruby can pipe too\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://apenwarr.ca/log/20230605\"\u003eTech debt metaphor maximalism\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you take a single pull request (PR) that adds a new feature, and launch\nit without tests or documentation, you will definitely get the benefits of\nthat PR sooner.\u003c/p\u003e",
      "date_published": "2023-07-16T00:00:00+00:00",
      "date_modified": "2023-07-16T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/106-why-we-all-need-subtitles-now/",
      "url": "https://elver.me/weeknotes/106-why-we-all-need-subtitles-now/",
      "title": "Weeknotes 106: Why we all need subtitles now",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.newyorker.com/news/a-reporter-at-large/the-titan-submersible-was-an-accident-waiting-to-happen\"\u003e\u0026ldquo;The Titan Submersible Was \u0026lsquo;an Accident Waiting to Happen\u0026rsquo;\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSoon afterward, Rush asked OceanGate’s director of finance and\nadministration whether she’d like to take over as chief submersible pilot.\u003c/p\u003e\n\u003cp\u003e\u0026lsquo;It freaked me out that he would want me to be head pilot, since my\nbackground is in accounting\u0026rsquo; she told me.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ewtf?!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;I hereby \u003ca href=\"https://twitter.com/josevalim/status/1675900744954785796\"\u003eofficially announce\u003c/a\u003e the \u003ca href=\"https://elixir-lang.org/blog/2023/06/22/type-system-updates-research-dev/\"\u003eElixir type system effort is transitioning\nfrom research into development\u003c/a\u003e\u0026rdquo;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhile we have introduced a new syntax capable of expressing the semantics of\nthe new set-theoretic type system, the syntax is not final as there are\nstill no concrete plans for user-facing changes to the language.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s reassuring that user-facing changes are still up for discussion at this\ntime.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m attempting to lose some weight again. I wasn\u0026rsquo;t sure whether to talk about\nit here \u0026ndash; does acknowledging the attempt publicly make it more or less likely\nto be successful?\u003c/p\u003e\n\u003cp\u003eI know what to do. I just need to do it. I\u0026rsquo;m focussing on:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNot being perfect\u003c/li\u003e\n\u003cli\u003eBeing more organised with\u003c/li\u003e\n\u003cli\u003eRelying less on \u0026ldquo;will power\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf I stop talking about it you know what happened ;) If I\u0026rsquo;m \u0026ldquo;successful\u0026rdquo; there\nwill be self-congratulatory graphs.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fly.io/blog/litefs-cloud/\"\u003eLiteFS Cloud: Distributed SQLite with Managed Backups\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFly are adding a managed backup service for SQLite.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWell, that\u0026rsquo;s why we\u0026rsquo;re launching, in preview, LiteFS Cloud: backups and\nrestores for LiteFS, managed by Fly.io. It gives you painless and reliable\nbackups, with the equivalent of a snapshot every five minutes (8760\nsnapshots per month!), whether your database is hosted with us, or anywhere\nelse.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe\u0026rsquo;ll introduce pricing in the coming months, but for now LiteFS Cloud is in\npreview and is free to use. Please go check it out, and let us know how it\ngoes!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWorth a try for free.\u003c/p\u003e\n\u003cp\u003eThis is very exciting and \u003cem\u003ejust in time\u003c/em\u003e for a side project I\u0026rsquo;m working on.\nI\u0026rsquo;m interested in trying this very soon.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA GitHub UI discovery this week: If you mention a CVE identifier (common\nvulnerabilities and exposures), which looks something like this \u0026ndash;\n\u003ccode\u003eCVE-2023-26115\u003c/code\u003e \u0026ndash; in a Git commit message it will link to the GitHub\nAdvisory Database automatically 👌\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe tests for my aforementioned side project run in 0.6 seconds and almost all\nof them hit the database.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eFinished in 0.6 seconds (0.00s async, 0.6s sync)\n151 tests, 0 failures\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNot Ruby, of course \u0026ndash; I\u0026rsquo;m using Elixir and Phoenix. But the main benefit\ndoesn\u0026rsquo;t seem to step from those so much as using SQLite instead of Postgres so\nthere is no \u0026ldquo;setup Postgres\u0026rdquo; step during CI.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s early days, but the difference this makes is hard to put into words.\nUsing other languages really makes you aware of the issues with your everyday\ntools. Speed dictates how you test. I expect to do less mocking in Elixir\nbecause hitting the database and doing \u0026ldquo;real work\u0026rdquo; is less costly.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter years of a rock-solid internet connection in the last 6 weeks or so it\nhas become unreliable, so I wanted to setup some sort of monitoring.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve used \u003ca href=\"https://www.thinkbroadband.com/\"\u003ethinkbroadband\u003c/a\u003e\u0026rsquo;s \u003ca href=\"https://www.thinkbroadband.com/broadband/monitoring/quality\"\u003eBroadband Quality Meter (BQM)\u003c/a\u003e in the past, so\nit seemed to be the logical (only service I could find) choice. However, it\nwas tricky to setup and the tool was reporting 100% packet loss indicating\nthat I was not allowing ICMP on my internet router (a \u003ca href=\"https://uk.store.ui.com/uk/en/pro/category/all-cloud-keys-gateways/products/usg\"\u003eUniFi USG\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003eThankfully, I found a blog post detailing how to set it up (\u003ca href=\"https://www.eddgrant.com/blog/2020/10/01/enabling-wan-icmp-ping-on-a-unifi-security-gateway.html\"\u003eHow to allow ICMP\nping on a Unifi Security Gateway WAN Interface\u003c/a\u003e) and I\u0026rsquo;m now happily\nmonitoring how poor my internet connection is.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.anildash.com/2023/07/07/vc-qanon/\"\u003e\u0026ldquo;VC qanon\u0026rdquo; and the radicalization of the tech tycoons\u003c/a\u003e by Anil Dash.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;so they push each other further and further into extreme ideas because their\nentire careers have been predicated on the idea that they\u0026rsquo;re genius outliers\nwho can see things others can\u0026rsquo;t, and that their wealth is a reward for that\nimagined merit. \u0026lsquo;I must be smart, look how rich I am.\u0026rsquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=VYJtb2YXae8\"\u003eWhy we all need subtitles now\u003c/a\u003e \u0026ndash; Dammit downmixing, \u003cem\u003eshakes fist\u003c/em\u003e ✊\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.newyorker.com/news/a-reporter-at-large/the-titan-submersible-was-an-accident-waiting-to-happen\"\u003e\u0026ldquo;The Titan Submersible Was \u0026lsquo;an Accident Waiting to Happen\u0026rsquo;\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSoon afterward, Rush asked OceanGate’s director of finance and\nadministration whether she’d like to take over as chief submersible pilot.\u003c/p\u003e\n\u003cp\u003e\u0026lsquo;It freaked me out that he would want me to be head pilot, since my\nbackground is in accounting\u0026rsquo; she told me.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ewtf?!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;I hereby \u003ca href=\"https://twitter.com/josevalim/status/1675900744954785796\"\u003eofficially announce\u003c/a\u003e the \u003ca href=\"https://elixir-lang.org/blog/2023/06/22/type-system-updates-research-dev/\"\u003eElixir type system effort is transitioning\nfrom research into development\u003c/a\u003e\u0026rdquo;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhile we have introduced a new syntax capable of expressing the semantics of\nthe new set-theoretic type system, the syntax is not final as there are\nstill no concrete plans for user-facing changes to the language.\u003c/p\u003e",
      "date_published": "2023-07-09T00:00:00+00:00",
      "date_modified": "2023-07-09T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/105-back-under-the-dome/",
      "url": "https://elver.me/weeknotes/105-back-under-the-dome/",
      "title": "Weeknotes 105: Back under the Dome",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/mdn/yari/issues/9208\"\u003e\u0026ldquo;MDN can now automatically lie to people seeking technical information\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMDN\u0026rsquo;s new \u0026lsquo;ai explain\u0026rsquo; button on code blocks generates human-like text that\nmay be correct by happenstance, or may contain convincing falsehoods. this\nis a strange decision for a technical reference.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt does seem like a very odd thing to do.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA delightfully short work week so that I could attend \u003ca href=\"https://brightonruby.com/\"\u003eBrighton Ruby\u003c/a\u003e on\nFriday. Including this year I\u0026rsquo;ve attended all 8 times since the very\nbeginning. Time flies. Anecdotally, there seemed to be a more diverse\nspectrum of attendees this year too, which is encouraging.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m glad that it was back in the Brighton Dome. Last year\u0026rsquo;s was held elsewhere\nas it was the first one post COVID and I\u0026rsquo;m assuming there was some trepidation\nabout the appetite for in-person conferences. The Dome is just so much nicer\nand more spacious. It was well attended \u0026ndash; Ruby and Rails apparently still has\nsome life left after all these years being dead.\u003c/p\u003e\n\u003cp\u003eFor me, it was all about meeting up with friends and colleagues rather than\nthe talks themselves. It was great to see old and new work colleagues\nin-person after years of remote working through the pandemic.\u003c/p\u003e\n\u003cp\u003eSaying that, I really enjoyed \u003ca href=\"https://po-ru.com/\"\u003ePaul Battley\u0026rsquo;s\u003c/a\u003e \u003ca href=\"https://github.com/threedaymonk/back-in-my-day\"\u003e“Back in my day …”\u003c/a\u003e lightning\ntalk which was very well delivered and interesting.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis describes the modification of a program while travelling back in time\nfrom Ruby 3.2.2 (2023) to Ruby 1.6.8\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe lightning talks are always the best talks.\u003c/p\u003e\n\u003cp\u003eOh, and there were socks!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wanted to create a database diagram this week so I went Googling for tools.\nI don\u0026rsquo;t create them very often so I don\u0026rsquo;t have a go-to tool for the job, but I\ndid remember using \u003ca href=\"https://dbdiagram.io/\"\u003edbdiagram.io\u003c/a\u003e before when it appeared in my searches.\u003c/p\u003e\n\u003cp\u003eIt uses an easily learnt special syntax to define your diagram instead of\nbeing GUI-driven so you don\u0026rsquo;t get side-tracked lining up boxes, changing\ncolours, and generally not thinking about your database design.\u003c/p\u003e\n\u003cp\u003eI like it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI heard about \u003ca href=\"https://kagi.com/\"\u003eKagi\u003c/a\u003e this week so started using it to see what it\u0026rsquo;s like. I\nset it as default in Arc and Safari on iOS. Too early to comment on how\neffective it is yet, but first impressions are good. I would pay for search.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eApollo is finally a goner. It\u0026rsquo;s too early to tell exactly how this will affect\nmy Reddit usage. However, I won\u0026rsquo;t be able to supply the Neovim content \u003cem\u003eyou\ncrave\u003c/em\u003e without \u003ccode\u003e/r/neovim\u003c/code\u003e so I\u0026rsquo;ve subscribed to that Subreddit using RSS.\u003c/p\u003e\n\u003cp\u003eI think pushing ALL TEH THINGS to RSS is the way forward.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mastodon.social/@Migueldeicaza/110639808642224606\"\u003eMiguel de Icaza tooted this from @antirez\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTwitter is in desperate decline. And social media, in general, is in\nterrible shape. That\u0026rsquo;s our fault, dear friends. To exchange messages and\npictures is a trivial internet function, not unicorn worth: we killed IRC\nand NNTP, dismissed RSS, and now that\u0026rsquo;s the world we get.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI have \u003cem\u003esome\u003c/em\u003e sympathy for this argument. But consider IRC, the reason we have\nSlack and Discord is because IRC is a cryptic magic box that is hard to use.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy iOS Home Screen needs some re-organisation, but I genuinely can\u0026rsquo;t face the\nmassively frustrating hold-wiggle-drag dance that is still, somehow, required\nin 2023.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/mdn/yari/issues/9208\"\u003e\u0026ldquo;MDN can now automatically lie to people seeking technical information\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMDN\u0026rsquo;s new \u0026lsquo;ai explain\u0026rsquo; button on code blocks generates human-like text that\nmay be correct by happenstance, or may contain convincing falsehoods. this\nis a strange decision for a technical reference.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt does seem like a very odd thing to do.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA delightfully short work week so that I could attend \u003ca href=\"https://brightonruby.com/\"\u003eBrighton Ruby\u003c/a\u003e on\nFriday. Including this year I\u0026rsquo;ve attended all 8 times since the very\nbeginning. Time flies. Anecdotally, there seemed to be a more diverse\nspectrum of attendees this year too, which is encouraging.\u003c/p\u003e",
      "date_published": "2023-07-02T00:00:00+00:00",
      "date_modified": "2023-07-02T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/104-reboot-my-remote/",
      "url": "https://elver.me/weeknotes/104-reboot-my-remote/",
      "title": "Weeknotes 104: Reboot my remote",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eQuite a good week in terms of work. I made some changes that I was happy with.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had no idea \u003ca href=\"https://daringfireball.net/linked/2023/06/19/qr-codes-iphone\"\u003ethere is a built-in QR Code Scanner in iOS\u003c/a\u003e. I usually fumble\nfor the Camera app.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI couldn\u0026rsquo;t agree more with \u003ca href=\"https://hachyderm.io/@tom@ruby.social/110558830545193648\"\u003eTom Stuart\u0026rsquo;s toot about Conventional Commits\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn the past I’ve peacefully ignored Conventional Commits on the assumption\nthat it’s a harmless nuisance, but now that I’ve worked on projects that use\nit, I realise it’s a genuinely terrible idea which must be stopped at all\ncosts\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eOne of the major features of a commit is to communicate the change being made.\nDoes prefixing your commit subject with something a computer is going to use\nbenefit the humans involved?\u003c/p\u003e\n\u003cp\u003eI have a suspicion that those who like conventional commits are the same\npeople who fail to write decent commit messages.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy car has been making a weird noise which eventually turned out to be the\nengine cover under the car flapping about. It\u0026rsquo;s quite likely that when it was\nlast serviced the garage left out three bolts when putting things back\ntogether. Good times.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBrighton Ruby is next week; it should be nice to catch up with some people I\nhaven\u0026rsquo;t seen in a while. Hoping it\u0026rsquo;s not as sweaty as previous years.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003emacOS Sonoma was announced, so I decided it was time to upgrade to Ventura. I\nfeared that everything would stop working but it was surprisingly\nstraight-forward with the small exception of my Studio Display becoming\nunresponsive until I power cycled it 😬\u003c/p\u003e\n\u003cp\u003eThe \u0026ldquo;new\u0026rdquo; System Settings really is as bad as everyone has been saying this\nlast year. Genuinely awful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy Apple TV remote volume control buttons stopped working. I had to \u003ca href=\"https://support.apple.com/en-us/HT213437\"\u003ereboot it\nto fix the issue\u003c/a\u003e. I had to \u003cem\u003ereboot\u003c/em\u003e my TV remote.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eQuite a good week in terms of work. I made some changes that I was happy with.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had no idea \u003ca href=\"https://daringfireball.net/linked/2023/06/19/qr-codes-iphone\"\u003ethere is a built-in QR Code Scanner in iOS\u003c/a\u003e. I usually fumble\nfor the Camera app.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI couldn\u0026rsquo;t agree more with \u003ca href=\"https://hachyderm.io/@tom@ruby.social/110558830545193648\"\u003eTom Stuart\u0026rsquo;s toot about Conventional Commits\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn the past I’ve peacefully ignored Conventional Commits on the assumption\nthat it’s a harmless nuisance, but now that I’ve worked on projects that use\nit, I realise it’s a genuinely terrible idea which must be stopped at all\ncosts\u003c/p\u003e",
      "date_published": "2023-06-25T00:00:00+00:00",
      "date_modified": "2023-06-25T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/103-woefully-inadequate-standard-library/",
      "url": "https://elver.me/weeknotes/103-woefully-inadequate-standard-library/",
      "title": "Weeknotes 103: Woefully inadequate standard library",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://eev.ee/blog/2017/10/07/javascript-got-better-while-i-wasnt-looking/\"\u003eJavaScript got better while I wasn’t looking\u003c/a\u003e \u0026ndash; another great article from\nEevee.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;woefully inadequate standard library\u0026hellip;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eComing from Ruby, this is one of my biggest issues with JavaScript \u0026ndash; doing\n\u003cem\u003eanything\u003c/em\u003e seems to require a library.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSomeone is working on \u003ca href=\"https://github.com/elixir-lang/elixir/issues/12644\"\u003eimprovements to how Elixir outputs compiler diagnostics\u003c/a\u003e.\nIt looks very nice!\u003c/p\u003e\n\u003cp\u003eSide note: Look at how José Valim interacts with other people in his open\nsource projects. Compare this to, I don\u0026rsquo;t know\u0026hellip;some other well known web\nframeworks\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve become increasingly aware that I\u0026rsquo;m bad at asking for help. I feel I\nshould be able to do everything on my own.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn \u003ca href=\"/weeknotes/20-whiteboards-and-css/\"\u003eissue 20\u003c/a\u003e I said that I need to learn Flexbox and generally get up to\nspeed with more modern CSS. I did some learning then, but if I don\u0026rsquo;t use it, I\nforget it. This week I\u0026rsquo;ve been Flexbox-ing again but via Tailwind.\u003c/p\u003e\n\u003cp\u003eThe time it took me to figure out how to right align two \u003ccode\u003e\u0026lt;li\u0026gt;\u003c/code\u003es out of a\n\u003ccode\u003e\u0026lt;ul\u0026gt;\u003c/code\u003e was frustrating. And it didn\u0026rsquo;t involve Flexbox directly. Of course, I\nwill remember this \u0026ldquo;trick\u0026rdquo; next time, but should it need tricks?\u003c/p\u003e\n\u003cp\u003eI find modern CSS equal parts amazing and disappointing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://danschultzer.com/posts/prefixed-base62-uuidv7-object-ids-with-ecto\"\u003ePrefixed base62 UUIDv7 Object IDs with Ecto\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eNice walkthrough about how to add support for UUIDv7 to Ecto.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eObject IDs should carry context so we will add prefixes to the IDs:\n/accounts/acct_02tRrww6GFm4urcMhyQpAS.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe benefits of prefixing the ID with the resource type are clear, but they\nsure do look fugly.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGoogle have decided to start \u003ca href=\"https://developer.chrome.com/blog/chrome-for-testing/\"\u003eoffering a Chrome version just for testing\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYou want consistent, reproducible results across repeated test runs—but this\nmay not happen if the browser executable or binary decides to update itself\nin between two runs.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.val.town/\"\u003eval town\u003c/a\u003e \u0026ndash; cool idea.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf GitHub Gists could run\nAnd AWS Lambda were fun\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Reddit guy doesn\u0026rsquo;t seem to understand Reddit \u003cem\u003eat all\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI got a personal best on my bench press this week. A number I\u0026rsquo;ve wanted to get\nfor a while now. Most people would feel great having achieved this goal. I\nfelt nothing really. Slightly pleased was the most I could muster.\u003c/p\u003e\n\u003cp\u003eSome fellow gym goers encouraged me to go for it. And I made it. But I was\nannoyed. Annoyed that I achieved it with relative ease and that it took other\npeople pushing me to try at all. Could I have done this months ago if I\u0026rsquo;d just\ntried?\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m really struggling to get back on track with things at the moment. I feel\nlike I have so much time and opportunity for betterment but I\u0026rsquo;m not taking\nadvantage of that. I want to learn x, and y, but I don\u0026rsquo;t start. Or start and\nstop when it gets hard.\u003c/p\u003e\n\u003cp\u003eI have projects that I was enthusiastic about when I started them but as soon\nas they got hard my brain says \u0026ldquo;What\u0026rsquo;s the point in this anyway?\u0026rdquo;. I try\ntelling it to shut up, \u0026ldquo;there\u0026rsquo;s no point in anything, idiot\u0026rdquo;, but he always\nwins.\u003c/p\u003e\n\u003cp\u003eWhat is important? What \u003cem\u003eshould\u003c/em\u003e I be doing? And where do I start? Fucking\ntedious beyond measure.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI bought 3kg of frozen gooseberries online this week.\u003c/p\u003e\n\u003cp\u003eShut up. I like gooseberries.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://eev.ee/blog/2017/10/07/javascript-got-better-while-i-wasnt-looking/\"\u003eJavaScript got better while I wasn’t looking\u003c/a\u003e \u0026ndash; another great article from\nEevee.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;woefully inadequate standard library\u0026hellip;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eComing from Ruby, this is one of my biggest issues with JavaScript \u0026ndash; doing\n\u003cem\u003eanything\u003c/em\u003e seems to require a library.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSomeone is working on \u003ca href=\"https://github.com/elixir-lang/elixir/issues/12644\"\u003eimprovements to how Elixir outputs compiler diagnostics\u003c/a\u003e.\nIt looks very nice!\u003c/p\u003e\n\u003cp\u003eSide note: Look at how José Valim interacts with other people in his open\nsource projects. Compare this to, I don\u0026rsquo;t know\u0026hellip;some other well known web\nframeworks\u0026hellip;\u003c/p\u003e",
      "date_published": "2023-06-18T00:00:00+00:00",
      "date_modified": "2023-06-18T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/102-disappointing-behaviour-by-reddit/",
      "url": "https://elver.me/weeknotes/102-disappointing-behaviour-by-reddit/",
      "title": "Weeknotes 102: Disappointing behaviour by Reddit",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI was excited (and surprised, because I believed that Oban\u0026rsquo;s design relied\nheavily on Postgres-specific features) to see that \u003ca href=\"https://github.com/sorentwo/oban#running-with-sqlite3\"\u003eit gained SQLite support\u003c/a\u003e\nsince I last used it.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOban ships with engines for PostgreSQL and SQLite3. Both engines support the\nsame core functionality for a single node, while the Postgres engine is more\nadvanced and designed to run in a distributed environment.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m keen on using Oban in smaller projects and it\u0026rsquo;s great that you can start\nwith SQLite and migrate to Postgres later if you need or want to.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.reddit.com/r/ruby/comments/142b07v/cookpad_to_discontinue_ruby_interpreter/\"\u003e\u0026ldquo;Cookpad to discontinue Ruby interpreter development\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eSad to see.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/samselikoff/status/1666098717458583556\"\u003eHere\u0026rsquo;s a great UI tip\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHere\u0026rsquo;s a button everyone\u0026rsquo;s made: flashing loading state that depends on\nlatency of operation, layout shift, and ambiguity about whether operation\nwas successful\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ruby.social/@getajobmike/110508928399299518\"\u003e\u0026ldquo;We should stop using JavaScript\u0026rdquo; \u0026ndash; Douglas Crockford\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eOr maybe we shouldn\u0026rsquo;t have started at all\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.reddit.com/r/apolloapp/comments/144f6xm/apollo_will_close_down_on_june_30th_reddits/\"\u003eApollo will close down on June 30th\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eReddit’s recent decisions and actions have unfortunately made it impossible\nfor Apollo to continue.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThere has been \u003ca href=\"https://www.theverge.com/2023/6/9/23755640/reddit-api-changes-apps-apollo-shut-down-ama-spez-steve-huffman\"\u003emuch commentary\u003c/a\u003e on how awful Reddit have been, especially Steve\nHuffman (\u003ccode\u003e/u/spez\u003c/code\u003e) to Christian Selig. If you\u0026rsquo;re gonna lie perhaps make sure\nthere isn\u0026rsquo;t a full audio recording and transcript out in public beforehand.\u003c/p\u003e\n\u003cp\u003eI didn\u0026rsquo;t realise how much some users with different needs rely on the\naccessibility features of third-party apps to access Reddit at all. A big\nissue for those people.\u003c/p\u003e\n\u003cp\u003eVery disappointing behaviour by Reddit. Will I continue using Reddit? I dunno,\nthe addiction is real, but I still have LinkedIn.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://daringfireball.net/2023/06/first_impressions_of_vision_pro_and_visionos\"\u003eFirst Impressions of Vision Pro and VisionOS\u003c/a\u003e \u0026ndash; I\u0026rsquo;m keen to try it out but I\ndon\u0026rsquo;t currently see why I would want or need this, with the exception of\nwatching films on a plane 😄\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAn \u003ca href=\"https://twitter.com/pjullrich/status/1636275674779467776\"\u003eexample of migrating \u003ccode\u003ePhoenix.View\u003c/code\u003e to \u003ccode\u003ePhoenix.Component\u003c/code\u003e\u003c/a\u003e. I love the\nway everything is just functions. The magic is minimal.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve lost interest in \u003ca href=\"https://www.imdb.com/title/tt14688458/\"\u003eSilo\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was mucking about with Tailwind CSS animations a bit this week and found the\nfour built-in ones a bit lacking, so went looking for how to add more. I\ndiscovered that you can add your own re-usable animations through the\n\u003ccode\u003etailwind.config.js\u003c/code\u003e config file.\u003c/p\u003e\n\u003cp\u003eI grabbed a pre-defined animation from the \u003ca href=\"https://github.com/animate-css/animate.css\"\u003eAnimate.css\u003c/a\u003e project and munged it\ninto the Tailwind format.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blog.logrocket.com/creating-custom-animations-tailwind-css/\"\u003eLogRocket has written a blog post on the subject\u003c/a\u003e which I found very useful.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI was excited (and surprised, because I believed that Oban\u0026rsquo;s design relied\nheavily on Postgres-specific features) to see that \u003ca href=\"https://github.com/sorentwo/oban#running-with-sqlite3\"\u003eit gained SQLite support\u003c/a\u003e\nsince I last used it.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOban ships with engines for PostgreSQL and SQLite3. Both engines support the\nsame core functionality for a single node, while the Postgres engine is more\nadvanced and designed to run in a distributed environment.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m keen on using Oban in smaller projects and it\u0026rsquo;s great that you can start\nwith SQLite and migrate to Postgres later if you need or want to.\u003c/p\u003e",
      "date_published": "2023-06-11T00:00:00+00:00",
      "date_modified": "2023-06-11T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/101-ruby-itself/",
      "url": "https://elver.me/weeknotes/101-ruby-itself/",
      "title": "Weeknotes 101: Ruby itself",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eRuby apparently \u003ca href=\"https://twitter.com/alexandre_ruban/status/1663090551606988800\"\u003ehas an \u003ccode\u003eitself\u003c/code\u003e method\u003c/a\u003e. Ruby has a lot of methods.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e%\u003c/span\u003ei\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003efoo bar baz\u003cspan style=\"color:#000;font-weight:bold\"\u003e].\u003c/span\u003eindex_by(\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#990073\"\u003e:itself\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:foo\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#990073\"\u003e:foo\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:bar\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#990073\"\u003e:bar\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:baz\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#990073\"\u003e:baz\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA \u003ca href=\"https://twitter.com/ozziexsh/status/1662961744212561921\"\u003ecool thing about LiveBook\u003c/a\u003e which I knew but forgot.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ekeeping @livebookdev connected to your local phoenix app while developing is\na huge time saver\u003c/p\u003e\n\u003cp\u003eit\u0026rsquo;s so nice to quickly inspect ecto results and prototype modules without\nrefreshing your web app or going into iex\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m going to try this out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://phoenixframework.org/blog/phoenix-liveview-0.19-released\"\u003ePhoenix LiveView 0.19 released\u003c/a\u003e \u0026ndash; Lots of nice improvements.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI think we can agree that \u003ca href=\"https://www.businessinsider.com/credit-card-phone-theft-sim-swap-identity-theft-investigation-2023-4\"\u003ethis is terrifying\u0026hellip;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAfter gaining control of my phone, a hacker ripped me off for $10,000. The\nscam turned out to be brilliant — and terrifying.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wanted to get \u003ccode\u003e:AV\u003c/code\u003e from Rails.vim in Neovim for Elixir projects so I looked\nat adding the relevant \u003ca href=\"https://github.com/tpope/vim-projectionist\"\u003eprojectionist\u003c/a\u003e config. However, it turned out that I\nshould maybe be using \u003ca href=\"https://github.com/elixir-tools/elixir-tools.nvim\"\u003eelixir-tools.nvim\u003c/a\u003e instead which has projectionist\nsupport, but also many other things including ElixirLS which I hadn\u0026rsquo;t setup\nyet.\u003c/p\u003e\n\u003cp\u003eA note about setting up Elixir LS though: \u003ca href=\"https://github.com/elixir-lsp/elixir-ls/issues/886\"\u003eit does not currently work with\nthe recently released OTP 26\u003c/a\u003e, so I downgraded my project in the meantime\nuntil this is fixed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChristian Selig of \u003ca href=\"https://apolloapp.io/\"\u003eApollo\u003c/a\u003e was \u003ca href=\"https://www.reddit.com/r/apolloapp/comments/13ws4w3/had_a_call_with_reddit_to_discuss_pricing_bad/\"\u003eunfortunately wrong\u003c/a\u003e to be hopeful about\nReddit\u0026rsquo;s new API pricing.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHad a call with Reddit to discuss pricing. Bad news for third-party apps,\ntheir announced pricing is close to Twitter\u0026rsquo;s pricing, and Apollo would have\nto pay Reddit $20 million per year to keep running as-is.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eA shame for both Apollo and him personally. Companies build their userbase on\nthe back of third-party clients and inevitably screw them over once they\u0026rsquo;ve\ndone their job. See also Twitter.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLivebook development continues at pace \u0026ndash; \u003ca href=\"https://github.com/livebook-dev/livebook/pull/1936\"\u003eOverlay doctest results\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe now show doctests results directly in the editor in @livebookdev!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVia \u003ca href=\"https://twitter.com/josevalim/status/1663316201584443394\"\u003eJosé Valim\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.visionarycto.com/p/my-20-year-career-is-technical-debt\"\u003eMy 20 Year Career is Technical Debt or Deprecated\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t agree with a lot of the points in this article, but something stood\nout that is important.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThere is no such thing as perfect. Over time what was perfect today won’t be\nperfect in the future. Learn to live with less than perfect.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis, so much. I am \u003cem\u003eterrible\u003c/em\u003e at this. Perfectionism is a curse.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn my ever present quest to use non-mainstream tools and technologies I\nstarted looking at \u003ca href=\"https://wezfurlong.org/wezterm/\"\u003eWezTerm\u003c/a\u003e this week as a possible replacement for iTerm,\nwhich I\u0026rsquo;ve been happily using for years.\u003c/p\u003e\n\u003cp\u003eInitial thought, the the colours in WezTerm are not the same as in iTerm. Can\nI be bothered to start investigating that? I\u0026rsquo;m not sure I have the energy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=cG8iwK_6KIg\"\u003eDoomguy visits the BEAM: lightning talk\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eA really fun talk by André Albuquerque at ElixirConf EU 2023 that demonstrates\nthe various supervisor restart strategies available on the BEAM via Doom.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eRuby apparently \u003ca href=\"https://twitter.com/alexandre_ruban/status/1663090551606988800\"\u003ehas an \u003ccode\u003eitself\u003c/code\u003e method\u003c/a\u003e. Ruby has a lot of methods.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e%\u003c/span\u003ei\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003efoo bar baz\u003cspan style=\"color:#000;font-weight:bold\"\u003e].\u003c/span\u003eindex_by(\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#990073\"\u003e:itself\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:foo\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#990073\"\u003e:foo\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:bar\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#990073\"\u003e:bar\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:baz\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#990073\"\u003e:baz\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA \u003ca href=\"https://twitter.com/ozziexsh/status/1662961744212561921\"\u003ecool thing about LiveBook\u003c/a\u003e which I knew but forgot.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ekeeping @livebookdev connected to your local phoenix app while developing is\na huge time saver\u003c/p\u003e\n\u003cp\u003eit\u0026rsquo;s so nice to quickly inspect ecto results and prototype modules without\nrefreshing your web app or going into iex\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m going to try this out.\u003c/p\u003e",
      "date_published": "2023-06-04T00:00:00+00:00",
      "date_modified": "2023-06-04T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/100-one-hundred/",
      "url": "https://elver.me/weeknotes/100-one-hundred/",
      "title": "Weeknotes 100: One hundred",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWell, well. Here we are. 100 weeknotes published. I\u0026rsquo;ve really enjoyed the\nprocess of writing these. Mostly a link blog, occasionally something more\npersonal. But importantly, always once a week.\u003c/p\u003e\n\u003cp\u003eIt might not sound like much of an achievement to some, but for me, 100\ninstances of consistent effort is a pretty big deal. What is it about this\nactivity that has meant I\u0026rsquo;ve stuck with it?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReally tempted to order an \u003ca href=\"https://retro.remysharp.com/tag/ips/\"\u003eoriginal Gameboy from Remy\u003c/a\u003e 😬\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.reddit.com/r/television/comments/13ik0zn/david_simon_breaks_down_the_writers_strike_with/\"\u003eDavid Simon the writer\u0026rsquo;s strike\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDavid Simon breaks down the Writers Strike with the same elite storytelling\nas each season of The Wire\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m still getting used to \u003ca href=\"https://hexdocs.pm/phoenix_live_view/assigns-eex.html\"\u003eHEEx\u003c/a\u003e templates, and I was trying to add a\n\u003ccode\u003edisabled\u003c/code\u003e attribute to a \u003ccode\u003e\u0026lt;.button\u0026gt;\u003c/code\u003e component.\u003c/p\u003e\n\u003cp\u003eIf you return a string like this the value is interpolated.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u0026lt;.button type=\u0026quot;submit\u0026quot; disabled={\u0026quot;true\u0026quot;}\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eLike this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u0026lt;button type=\u0026quot;submit\u0026quot; disabled=\u0026quot;true\u0026quot;\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eHowever, it you return a boolean like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u0026lt;.button type=\u0026quot;submit\u0026quot; disabled={true}\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou get a valueless attribute.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u0026lt;button type=\u0026quot;submit\u0026quot; disabled\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis is what I normally want.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/simeji/jid\"\u003ejson incremental digger\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYou can drill down JSON interactively by using filtering queries like jq.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/96-compilation-problems/\"\u003eErlang woes\u003c/a\u003e definitely seem over with as I easily installed the latest\nErlang 26.0 and Elixir 1.14.4 released this week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m writing this from Copenhagen where we\u0026rsquo;re spending a long weekend. So now\nyou know why this week\u0026rsquo;s notes are shorter than usual 😉\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHere\u0026rsquo;s to one hundred more 🎉\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWell, well. Here we are. 100 weeknotes published. I\u0026rsquo;ve really enjoyed the\nprocess of writing these. Mostly a link blog, occasionally something more\npersonal. But importantly, always once a week.\u003c/p\u003e\n\u003cp\u003eIt might not sound like much of an achievement to some, but for me, 100\ninstances of consistent effort is a pretty big deal. What is it about this\nactivity that has meant I\u0026rsquo;ve stuck with it?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReally tempted to order an \u003ca href=\"https://retro.remysharp.com/tag/ips/\"\u003eoriginal Gameboy from Remy\u003c/a\u003e 😬\u003c/p\u003e",
      "date_published": "2023-05-28T00:00:00+00:00",
      "date_modified": "2023-05-28T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/99-css-nostalgia/",
      "url": "https://elver.me/weeknotes/99-css-nostalgia/",
      "title": "Weeknotes 99: CSS nostalgia",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://eev.ee/blog/2020/02/01/old-css-new-css/\"\u003eOld CSS, new CSS\u003c/a\u003e \u0026ndash; the nostalgia absolutely drips off this.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s pretty much as I remember it and a nice reminder.\u003c/p\u003e\n\u003cp\u003e(I should stop self-closing tags \u003ccode\u003e\u0026lt;br /\u0026gt;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRelevant content: \u003ca href=\"https://moderncss.dev/\"\u003eModern CSS Solutions for Old CSS Problems\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://testing.googleblog.com/2010/12/test-sizes.html?m=1\"\u003eTest Sizes\u003c/a\u003e \u0026ndash; Test types are indeed a difficult topic and poorly understood.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhat do you call a test that tests your application through its UI? An\nend-to-end test? A functional test? A system test? A selenium test?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eInteresting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI forgot to mention last week, I\u0026rsquo;m really enjoying \u003ca href=\"https://www.imdb.com/title/tt14688458/\"\u003eSilo\u003c/a\u003e from Apple TV+!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn Vim, you can replace the last search you made without retyping the word by\ndoing \u003ccode\u003e%s//replacement/\u003c/code\u003e 😮 This is useful when you\u0026rsquo;ve searched for the word\nunder the cursor with \u003ccode\u003e*\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEveryone is making fonts these days \u0026ndash; \u003ca href=\"https://github.com/intel/intel-one-mono\"\u003eIntel One Mono Typeface\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI learnt how to ignore a capture group this week. Sometimes you need to\n\u0026ldquo;capture\u0026rdquo; something but you\u0026rsquo;re not actually interested in using the value. It\nmay be necessary in order to make the regular expression match.\u003c/p\u003e\n\u003cp\u003eTake the string \u003ccode\u003e1.2.3-p123\u003c/code\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e(\\d+\\.\\d+\\.\\d+(-.+)?)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis regex will match the string and make \u003ccode\u003e-p123\u003c/code\u003e optional. But if the string\nyou\u0026rsquo;re matching doesn\u0026rsquo;t include \u003ccode\u003e-p123\u003c/code\u003e you will get an empty match group,\nwhich may be undesirable.\u003c/p\u003e\n\u003cp\u003eHowever, if you add \u003ccode\u003e?:\u003c/code\u003e like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e(\\d+\\.\\d+\\.\\d+(?:-.+)?)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe last capture group the optional capture will be omitted.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDid you know about the \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/webkitdirectory\"\u003e\u003ccode\u003ewebkitdirectory\u003c/code\u003e HTML attribute\u003c/a\u003e for inputs?\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e..indicates that the \u003ccode\u003e\u0026lt;input\u0026gt;\u003c/code\u003e element should let the user select\ndirectories instead of files. When a directory is selected, the directory\nand its entire hierarchy of contents are included in the set of selected\nitems.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.audible.co.uk/pd/The-Debutante-Audiobook/B0BV18S28C\"\u003eThe Debutante\u003c/a\u003e by Jon Ronson was a crazy, and good, listen.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.destroyallsoftware.com/compendium/types?share_key=baf6b67369843fa2\"\u003e\u0026ldquo;Types. For anyone who knows a programming language.\u0026rdquo;\u003c/a\u003e by Gary Bernhardt, is,\nas you\u0026rsquo;d expect, excellent. If you want to know about types, read this. As\nGary explains the terms used often means different things to different people.\nI will refer to this in the future, for sure.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was messing around with Tailwind CSS this week so decided to setup LSP\nsupport for it in Neovim. I\u0026rsquo;ve been putting this off for a while because I\nthought it was going to be difficult, but it was actually fairly easy.\u003c/p\u003e\n\u003cp\u003eSee \u003ca href=\"https://github.com/jordelver/dotfiles/commit/bbca0f9e521ee246d6fa6ec861483177c1a763b1\"\u003ethe commit in my dotfiles\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eLesson: stop putting things off.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=NhHi0OjHUMQ\"\u003eTech CEOs Rank Web Browsers (AI Tier List)\u003c/a\u003e by The Browser Company.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ldpreload.com/blog/names-to-reserve\"\u003eHostnames and usernames to reserve\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you\u0026rsquo;re setting up a service where people can register their own usernames\nto be used as a hostname (username.example.com), email address\n(\u003ca href=\"mailto:username@example.com\"\u003eusername@example.com\u003c/a\u003e), or URL path (example.com/username) within your\ndomain, there are some common names you should avoid letting the general\npublic register.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis never has never occurred to me, but spelt out, it makes sense.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=KrjL_TSOFrI\"\u003eLord of the Rings by Wes Anderson Trailer | The Whimsical Fellowship\u003c/a\u003e \u0026ndash;\nBravo!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://eev.ee/blog/2020/02/01/old-css-new-css/\"\u003eOld CSS, new CSS\u003c/a\u003e \u0026ndash; the nostalgia absolutely drips off this.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s pretty much as I remember it and a nice reminder.\u003c/p\u003e\n\u003cp\u003e(I should stop self-closing tags \u003ccode\u003e\u0026lt;br /\u0026gt;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRelevant content: \u003ca href=\"https://moderncss.dev/\"\u003eModern CSS Solutions for Old CSS Problems\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://testing.googleblog.com/2010/12/test-sizes.html?m=1\"\u003eTest Sizes\u003c/a\u003e \u0026ndash; Test types are indeed a difficult topic and poorly understood.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhat do you call a test that tests your application through its UI? An\nend-to-end test? A functional test? A system test? A selenium test?\u003c/p\u003e",
      "date_published": "2023-05-21T00:00:00+00:00",
      "date_modified": "2023-05-21T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/98-trauma-is-trauma/",
      "url": "https://elver.me/weeknotes/98-trauma-is-trauma/",
      "title": "Weeknotes 98: Trauma is trauma",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou can \u003ca href=\"https://www.akshaykhot.com/rails-inline-routes/\"\u003especify inline routes\u003c/a\u003e inside your Rails \u003ccode\u003econfig/routes.rb\u003c/code\u003e. Handy\nfor those times when you don\u0026rsquo;t want a full controller.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eget \u003cspan style=\"color:#d14\"\u003e\u0026#34;test\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003eto\u003c/span\u003e: \u003cspan style=\"color:#000;font-weight:bold\"\u003e-\u0026gt;\u003c/span\u003e(env) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e200\u003c/span\u003e, {}, \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;hello world\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChris McCord\u0026rsquo;s gives an nice overview of where LiveView has been and is going\nin his keynote at ElixirConf EU 2023 \u0026ndash; \u003ca href=\"https://www.youtube.com/watch?v=FADQAnq0RpA\"\u003eThe Road To LiveView 1.0\u003c/a\u003e. Solving\nthe nested form inputs issue is music to my ears. I\u0026rsquo;ve written this from\nscratch before and it was very not fun.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://attachment.zip\"\u003eattachment.zip\u003c/a\u003e (Via \u003ca href=\"https://phpc.social/@davidbisset/110362507505753653\"\u003e@davidbisset@phpc.social\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://kevinlang.me/phoenix-liveview-navigation-regressions/\"\u003ePhoenix LiveView Navigation Regressions\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLiveView excels for complex UI logic, or things like live updates. For\nback-office applications it is hard to be beat. In other words, proper\napplications that would’ve otherwise needed an SPA to implement. But for\nbasic blogs or documentation sites, I recommend instead to continue to use\nnormal views.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eYep. I personally think using it for anything that would be an SPA is a valid\nchoice, but for normal web pages? No.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"https://www.reddit.com/r/ruby/comments/13evzry/chrome_considers_gems_to_be_dangerous/\"\u003eRubygems website was blocked by Firefox and Chrome this week\u003c/a\u003e by being\nincluded in the Google Safe Browsing database.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/hopsoft/model_probe\"\u003eModelProbe\u003c/a\u003e for ActiveRecord looks neat.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eColorized table info for columns, types, nullables, indexes\u0026hellip; and the\nactual DDL used by the database to create the table. All this and more with\nModelProbe!\u003c/p\u003e\n\u003cp\u003eGet a clear picture of your model\u0026rsquo;s underlying schema with beautiful and\ninformative schema introspection.\nGenerate model class definitions with a well organized, logical structure.\nCreate sensible text fixture stubs.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNext time I have the need for anything Docker I\u0026rsquo;m going to check out\n\u003ca href=\"https://orbstack.dev/\"\u003eOrbStack\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRun Docker and Linux on your Mac seamlessly and efficiently. Docker Desktop\nalternative that helps you work faster.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://grayduck.mn/2023/04/17/refresh-vs-long-lived-access-tokens/\"\u003eRefresh vs. Long-lived Access Tokens\u003c/a\u003e \u0026ndash; This is a really good read on why we\nhave moved towards a refresh token world. Refresh tokens are annoying, for\nsure, but there are reasons.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhy would you want to use long-lived refresh tokens that generate\nshort-lived access tokens as commonly seen in OAuth 2.0, versus long-lived\naccess tokens? Aren’t you simply replacing one long-lived token with\nanother?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/rubyatscale/singed\"\u003eSinged\u003c/a\u003e seems like an easy way to get hold of a flamegraph. I\u0026rsquo;ve briefly used\nstackprof and speedscope recently and it was a bit of faff getting going.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSinged makes it easy to get a flamegraph anywhere in your code base. It\nwraps profiling your code with stackprof or rbspy, and then launching\nspeedscope to view it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis certainly looks easier.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=JBvc7Ny4iUk\"\u003eTrauma is Trauma by Kevin Smith\u003c/a\u003e hit me hard. Worth watching.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eYou can \u003ca href=\"https://www.akshaykhot.com/rails-inline-routes/\"\u003especify inline routes\u003c/a\u003e inside your Rails \u003ccode\u003econfig/routes.rb\u003c/code\u003e. Handy\nfor those times when you don\u0026rsquo;t want a full controller.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eget \u003cspan style=\"color:#d14\"\u003e\u0026#34;test\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003eto\u003c/span\u003e: \u003cspan style=\"color:#000;font-weight:bold\"\u003e-\u0026gt;\u003c/span\u003e(env) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e200\u003c/span\u003e, {}, \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;hello world\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChris McCord\u0026rsquo;s gives an nice overview of where LiveView has been and is going\nin his keynote at ElixirConf EU 2023 \u0026ndash; \u003ca href=\"https://www.youtube.com/watch?v=FADQAnq0RpA\"\u003eThe Road To LiveView 1.0\u003c/a\u003e. Solving\nthe nested form inputs issue is music to my ears. I\u0026rsquo;ve written this from\nscratch before and it was very not fun.\u003c/p\u003e",
      "date_published": "2023-05-14T00:00:00+00:00",
      "date_modified": "2023-05-14T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/97-resolved-issues/",
      "url": "https://elver.me/weeknotes/97-resolved-issues/",
      "title": "Weeknotes 97: Resolved issues",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAdd translations to your app with ChatGPT with \u003ca href=\"https://github.com/obie/instant18n/\"\u003einstant18n\u003c/a\u003e?\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUses the power of OpenAI\u0026rsquo;s GPT large language AI models to generate\ntranslations for your application.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://rubycentral.org/#/portal/signup\"\u003eRuby Central are launching memberships\u003c/a\u003e. I think most Ruby developers would\nsay that supporting Ruby Central is a good idea \u0026ndash; support the work that\nenables your work. It makes sense.\u003c/p\u003e\n\u003cp\u003ePerhaps I\u0026rsquo;m cheap, but to me the membership prices seem to be set at what\nsomeone \u003cem\u003eshould\u003c/em\u003e pay rather than what they \u003cem\u003ewill\u003c/em\u003e pay. The starting membership\nis $25. Surely making the first tier $10 a month moves it into cup of coffee,\nsignup without thinking, no-brainer territory? Chuck in a couple of stickers\nwhen you sign-up (like the EFF do) and you get more people involved overall?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/96-compilation-problems/\"\u003ecompilation issues I mentioned last week\u003c/a\u003e are thankfully now resolved\nafter re-installing all the things including \u003ca href=\"https://brew.sh/\"\u003eHomebrew\u003c/a\u003e and \u003ca href=\"https://asdf-vm.com/\"\u003easdf\u003c/a\u003e managed\ntools.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://justsimply.dev/\"\u003eJustSimply.dev\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eScan your technical writing for words such as easy, painless,\nstraightforward, trivial, simple and just. Chances are your writing will be\nclearer as a result of removing them.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Chris_Lattner\"\u003eChris Lattner\u003c/a\u003e\u0026rsquo;s (of \u003ca href=\"https://en.wikipedia.org/wiki/LLVM\"\u003eLLVM\u003c/a\u003e fame) startup, \u003ca href=\"https://www.modular.com/\"\u003eModular\u003c/a\u003e, are working on a new\nPython compatible programming language called \u003ca href=\"https://docs.modular.com/mojo/\"\u003eMojo\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMojo is a new programming language that bridges the gap between research and\nproduction by combining the best of Python syntax with systems programming\nand metaprogramming.\u003c/p\u003e\n\u003cp\u003eWith Mojo, you can write portable code that’s faster than C and seamlessly\ninter-op with the Python ecosystem.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI found some debugging helpers in depths of the current codebase I\u0026rsquo;m working\non at the moment. One of them was using \u003ca href=\"https://github.com/sonota88/anbt-sql-formatter\"\u003esonota88/anbt-sql-formatter\u003c/a\u003e to show\nthe SQL of a query. It makes it so much easier to see what\u0026rsquo;s going on than a\nsuper long hundred character string.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jakeworth.com/frozen-string-comment-yagni/\"\u003eRuby\u0026rsquo;s Frozen String Comment: YAGNI\u003c/a\u003e \u0026ndash; I have to admit that I was once that\nguy who threw  \u003ccode\u003efrozen_string_literal: true\u003c/code\u003e magic comments into codebases\nwith gay abandon. There is certainly confusion about it. Perhaps now is the\ntime to stop.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ntfy.sh/\"\u003entfy\u003c/a\u003e looks great! I was up-and-running in no time. There are a few different\nservices that use, \u003ca href=\"https://pushover.net/\"\u003epushover\u003c/a\u003e is one I\u0026rsquo;m most familiar with, but the design of\nntfy is very nice. Worth a look if you want to send yourself notifications\nfrom scripts and the like.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://justingarrison.com/blog/2023-04-24-mastodon-is-doomed/\"\u003eThe Mastodon people hoped for is doomed\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mastodon.social/@gruber/110314445390262849\"\u003eGruber on Mastodon and Bluesky\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI like Mastodon, especially using @ivory, and I love the community I’m in\nhere. And maybe our community will stay here. What makes Mastodon good for\nus nerds is that all the non-nerds aren’t here.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is what I realised recently. The Twitter of 2007 was a place full of\ninteresting tech stuff, and then everyone else joined and it slowly devolved\ninto the mess we have now. If Mastodon stays nerd-only I will be happy with\nthat.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eShopify, after bragging about hiring 2000 developers in 2022, have cut their\nworkforce by 20%. I\u0026rsquo;m sad for the people who work there 😢\u003c/p\u003e\n\u003cp\u003eTheir stock price shot up in response\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://livebook.dev/\"\u003eLivebook\u003c/a\u003e has been on my radar for a while, but I hadn\u0026rsquo;t been following along\nvery closely. When it was first released I thought it was cool, but I didn\u0026rsquo;t\nreally feel like I needed it. Well, I watched the videos Jose Valim put\ntogether for \u003ca href=\"https://news.livebook.dev/deploy-notebooks-as-apps-quality-of-life-upgrades---launch-week-1---day-1-2OTEWI\"\u003eLivebook Launch Week\u003c/a\u003e, and wow, this thing is off the hook.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAdd translations to your app with ChatGPT with \u003ca href=\"https://github.com/obie/instant18n/\"\u003einstant18n\u003c/a\u003e?\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUses the power of OpenAI\u0026rsquo;s GPT large language AI models to generate\ntranslations for your application.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://rubycentral.org/#/portal/signup\"\u003eRuby Central are launching memberships\u003c/a\u003e. I think most Ruby developers would\nsay that supporting Ruby Central is a good idea \u0026ndash; support the work that\nenables your work. It makes sense.\u003c/p\u003e\n\u003cp\u003ePerhaps I\u0026rsquo;m cheap, but to me the membership prices seem to be set at what\nsomeone \u003cem\u003eshould\u003c/em\u003e pay rather than what they \u003cem\u003ewill\u003c/em\u003e pay. The starting membership\nis $25. Surely making the first tier $10 a month moves it into cup of coffee,\nsignup without thinking, no-brainer territory? Chuck in a couple of stickers\nwhen you sign-up (like the EFF do) and you get more people involved overall?\u003c/p\u003e",
      "date_published": "2023-05-07T00:00:00+00:00",
      "date_modified": "2023-05-07T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/96-compilation-problems/",
      "url": "https://elver.me/weeknotes/96-compilation-problems/",
      "title": "Weeknotes 96: Compilation problems",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://betterprogramming.pub/why-chatgpt-wont-replace-coders-just-yet-87487a9dda4e\"\u003e\u0026ldquo;Why ChatGPT Won’t Replace Coders Just Yet\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe “bullshit” problem turns up in code, too\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFor a while now I\u0026rsquo;ve experienced compilation issues when installing new Erlang\nversions with \u003ca href=\"https://github.com/asdf-vm/asdf\"\u003easdf\u003c/a\u003e. Which is annoying because I often want to quickly try\nout some of the new improvements to the Elixir ecosystem and ending up in a\n\u003ccode\u003e./configure\u003c/code\u003e debugging session is no fun.\u003c/p\u003e\n\u003cp\u003eAfter digging in \u003cem\u003ea bit\u003c/em\u003e it seems that the Erlang \u003ccode\u003econfigure\u003c/code\u003e step thinks that\nthis machine is \u003ccode\u003ex86_64\u003c/code\u003e, which it isn\u0026rsquo;t. I\u0026rsquo;m fairly sure this is down to me\nusing Rosetta 2 (\u003ccode\u003ex86\u003c/code\u003e emulation) when I set everything up. Back when I got\nthis machine there were various teething issues, also compilation related,\nwith getting my Ruby projects up and running, so I setup iTerm is be run under\nRosetta and everything started working.\u003c/p\u003e\n\u003cp\u003eHowever, I think now is the time to start anew and remove any emulation. A lot\nof Ruby issues have been ironed out, and it might just fix my Erlang problems\ntoo. Watch this space.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDid you know you can find out whether a file starts with a \u003ca href=\"https://en.wikipedia.org/wiki/Byte_order_mark\"\u003eBOM\u003c/a\u003e by using\n\u003ccode\u003exxd\u003c/code\u003e and seeing what the first three bytes are?\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003exxd -l 3 -p path/to/file\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIf they are \u003ccode\u003eefbbbf\u003c/code\u003e then you have found a BOM.\u003c/p\u003e\n\u003cp\u003eWhy, yes. I have been reading \u003ca href=\"https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/\"\u003eThe Absolute Minimum Every Software Developer\nAbsolutely, Positively Must Know About Unicode and Character Sets (No\nExcuses!)\u003c/a\u003e. Again.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI listened to \u003ca href=\"https://www.thefp.com/witchtrials\"\u003eThe Witch Trials of J.K. Rowling\u003c/a\u003e audio documentary. The fact\nthat I hesitated to even include that fact here should give you an idea of\njust how contentious the issue is.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome feedback on a recent PR of mine prompted a small investigation into how\nthe default ordering of records works with ActiveRecord. So a reminder.\u003c/p\u003e\n\u003cp\u003eA standard \u003ccode\u003eorder(name: :asc)\u003c/code\u003e is going to order like this.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eAnnabel\nBarry\nChristoph\nannabel\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eUsing SQL with \u003ccode\u003eLOWER\u003c/code\u003e like \u003ccode\u003eorder(\u0026quot;LOWER(name) ASC\u0026quot;)\u003c/code\u003e is going to get you\nsomething more sensible in \u003cem\u003emost\u003c/em\u003e cases.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eAnnabel\nannabel\nBarry\nChristoph\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIf you change the column datatype to \u003ca href=\"https://www.postgresql.org/docs/current/citext.html\"\u003e\u003ccode\u003ecitext\u003c/code\u003e\u003c/a\u003e you get something different\nagain.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eannabel\nAnnabel\nBarry\nChristoph\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWhich is correct depends on you 😉\u003c/p\u003e\n\u003cp\u003eI know a previous colleague, and current friend, suggested in the past that\nall email columns, in particular, should be \u003ccode\u003ecitext\u003c/code\u003e to save the constant\ncalls to \u003ccode\u003eString#downcase\u003c/code\u003e or \u003ccode\u003eLOWER(field)\u003c/code\u003e before comparison. I think\nthere\u0026rsquo;s something in that.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.nitrokey.com/news/2023/smartphones-popular-qualcomm-chip-secretly-share-private-information-us-chip-maker\"\u003eSmartphones With Popular Qualcomm Chip Secretly Share Private\nInformation With US Chip-Maker\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis is possible because the Qualcomm chipset itself sends the data,\ncircumventing any potential Android operating system setting and protection\nmechanisms.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e🔥 This is fine 🔥\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://betterprogramming.pub/why-chatgpt-wont-replace-coders-just-yet-87487a9dda4e\"\u003e\u0026ldquo;Why ChatGPT Won’t Replace Coders Just Yet\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe “bullshit” problem turns up in code, too\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFor a while now I\u0026rsquo;ve experienced compilation issues when installing new Erlang\nversions with \u003ca href=\"https://github.com/asdf-vm/asdf\"\u003easdf\u003c/a\u003e. Which is annoying because I often want to quickly try\nout some of the new improvements to the Elixir ecosystem and ending up in a\n\u003ccode\u003e./configure\u003c/code\u003e debugging session is no fun.\u003c/p\u003e\n\u003cp\u003eAfter digging in \u003cem\u003ea bit\u003c/em\u003e it seems that the Erlang \u003ccode\u003econfigure\u003c/code\u003e step thinks that\nthis machine is \u003ccode\u003ex86_64\u003c/code\u003e, which it isn\u0026rsquo;t. I\u0026rsquo;m fairly sure this is down to me\nusing Rosetta 2 (\u003ccode\u003ex86\u003c/code\u003e emulation) when I set everything up. Back when I got\nthis machine there were various teething issues, also compilation related,\nwith getting my Ruby projects up and running, so I setup iTerm is be run under\nRosetta and everything started working.\u003c/p\u003e",
      "date_published": "2023-04-30T00:00:00+00:00",
      "date_modified": "2023-04-30T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/95-pragmatic-conclusion/",
      "url": "https://elver.me/weeknotes/95-pragmatic-conclusion/",
      "title": "Weeknotes 95: Pragmatic conclusion",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe task I was stressing about is now done and dusted so I can put that behind\nme, and I worked four days this week 👌\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReddit are going to \u003ca href=\"https://www.reddit.com/r/programming/comments/12r0xyz/reddit_will_begin_charging_for_access_to_its_api/\"\u003estart charging for their API\u003c/a\u003e. The beginning of the end?\nWhat will I do with all my time? The \u003ca href=\"https://www.reddit.com/r/apolloapp/comments/12ram0f/had_a_few_calls_with_reddit_today_about_the/\"\u003eauthor of Apollo seems cautiously\noptimistic\u003c/a\u003e that this change might be a good thing 🤞\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://betterprogramming.pub/why-i-stopped-using-sorbet-in-all-my-ruby-projects-9366bf6dd116\"\u003eWhy I Stopped Using Sorbet in All My Ruby Projects\u003c/a\u003e \u0026ndash; An interesting take on\nusing Sorbet.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMullvad were \u003ca href=\"https://mullvad.net/en/blog/2023/4/20/mullvad-vpn-was-subject-to-a-search-warrant-customer-data-not-compromised/\"\u003evisited by the Swedish Police\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMullvad have been operating our VPN service for over 14 years. This is the\nfirst time our offices have been visited with a search warrant.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDo you remember how \u003ca href=\"https://lodash.com/\"\u003elodash\u003c/a\u003e made JavaScript bearable back in the day? You\nmight be interested in \u003ca href=\"https://thescottyjam.github.io/snap.js/\"\u003eVanilla JavaScript replacements\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(Via \u003ca href=\"https://twitter.com/nghuuphuoc/status/1637242613366501376\"\u003ePhuoc Nguyen\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy Gandi to \u003ca href=\"https://porkbun.com/\"\u003ePorkbun\u003c/a\u003e migration is complete. I transferred 4 domains this week\nand it was a straight forward process. I slightly concerned as I haven\u0026rsquo;t\ntransferred a domain for years, but the instructions on Porkbun\u0026rsquo;s website were\nhelpful.\u003c/p\u003e\n\u003cp\u003eI had a small support query and it took literally 2 minutes to get a response\nvia online chat. Extremely impressive.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis blog post from GitHub \u0026ndash; \u003ca href=\"https://github.blog/2023-04-06-building-github-with-ruby-and-rails/\"\u003eBuilding GitHub with Ruby and Rails\u003c/a\u003e \u0026ndash; shows\nhow they keep on top of Rails and Ruby upgrades. Chipping away, rather than\nbig bang upgrades is the way.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eEvery Monday a scheduled GitHub Action workflow triggers an automated pull\nrequest, which bumps our Rails version to the latest commit on the Rails\nmain branch for that day.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter nearly 10 years of Vim usage I\u0026rsquo;ve only recently started using tabs and\nI\u0026rsquo;m still not sure I\u0026rsquo;m doing it right since reading \u003ca href=\"https://joshldavis.com/2014/04/05/vim-tab-madness-buffers-vs-tabs/\"\u003eVim Tab Madness. Buffers\nvs Tabs\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jemma.dev/about-me/\"\u003eJemma Issroff\u0026rsquo;s\u003c/a\u003e blog post \u0026ndash; \u003ca href=\"https://jemma.dev/blog/irb-measure\"\u003eIRB\u0026rsquo;s Built-in Measure\u003c/a\u003e \u0026ndash; shows off the\nprofiling capabilities now built-in to Ruby 3. A really nice feature. Be sure\nto check out \u003ca href=\"https://jemma.dev/blog/irb-custom-measure-procedures\"\u003epart 2\u003c/a\u003e as well where she shows how to add a custom measurement\nfor \u003ca href=\"https://www.speedscope.app/\"\u003eSpeedscope\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThoughtbot\u0026rsquo;s \u003ca href=\"https://github.com/thoughtbot/hotwire-example-template\"\u003eHotwire Example Template\u003c/a\u003e repo looks like a great resource for\nfiguring out how to use Hotwire. Loads of easy to follow examples. One to\nbookmark for later.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fly.io/phoenix-files/can-phoenix-safely-use-the-zip-module/\"\u003eCan Phoenix Safely Use the Zip Module?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis post explores the OTP :zip module and tests it against two different\ntypes of zip attacks so we can learn how to safely use zip in our Elixir\napplications.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eConclusion: Be careful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs someone who once really enjoyed cycling, and is thinking of getting back\ninto it, I was intrigued by \u003ca href=\"https://www.youtube.com/watch?v=rhzH6mEpIps\"\u003eI don\u0026rsquo;t usually wear a bike helmet. Does that\nmake me an idiot?\u003c/a\u003e. I thought it reached a pragmatic conclusion.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe task I was stressing about is now done and dusted so I can put that behind\nme, and I worked four days this week 👌\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReddit are going to \u003ca href=\"https://www.reddit.com/r/programming/comments/12r0xyz/reddit_will_begin_charging_for_access_to_its_api/\"\u003estart charging for their API\u003c/a\u003e. The beginning of the end?\nWhat will I do with all my time? The \u003ca href=\"https://www.reddit.com/r/apolloapp/comments/12ram0f/had_a_few_calls_with_reddit_today_about_the/\"\u003eauthor of Apollo seems cautiously\noptimistic\u003c/a\u003e that this change might be a good thing 🤞\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://betterprogramming.pub/why-i-stopped-using-sorbet-in-all-my-ruby-projects-9366bf6dd116\"\u003eWhy I Stopped Using Sorbet in All My Ruby Projects\u003c/a\u003e \u0026ndash; An interesting take on\nusing Sorbet.\u003c/p\u003e",
      "date_published": "2023-04-23T00:00:00+00:00",
      "date_modified": "2023-04-23T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/94-work-related-anguish/",
      "url": "https://elver.me/weeknotes/94-work-related-anguish/",
      "title": "Weeknotes 94: Work related anguish",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://flowbite.com/\"\u003eFlowbite\u003c/a\u003e is a component framework for Tailwind CSS. Some components are\nfree, whilst others are available at a cost. Seems like a nice toolkit to keep\nin mind.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had cause to work with some CSV files in Neovim this week. I don\u0026rsquo;t do that\nvery often but I remembered that I\u0026rsquo;d installed a plugin \u0026ndash;\n\u003ca href=\"https://github.com/mechatroner/rainbow_csv\"\u003emechatroner/rainbow_csv\u003c/a\u003e \u0026ndash; to help with this before.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRainbow CSV - Vim plugin: Highlight columns in CSV and TSV files and run\nqueries in SQL-like language\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt can do various clever things, but I mainly used \u003ccode\u003e:RainbowAlign\u003c/code\u003e and\n\u003ccode\u003e:RainbowShrink\u003c/code\u003e to try and make sense of the files.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was wrong about the \u003ccode\u003eModel.none\u003c/code\u003e method from Rails that \u003ca href=\"/weeknotes/93-autonomy-is-good/\"\u003eI wrote about last\nweek\u003c/a\u003e. It doesn\u0026rsquo;t do what I thought. Carry on.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe work issue that was causing me anguish should hopefully be nearly over.\nI\u0026rsquo;m now in the hands of the PR reviewer once again. I need to stop beating\nmyself up. It\u0026rsquo;s only ever counter-productive.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.akshaykhot.com/accessing-hash-values-like-methods/\"\u003eHow to Access Hash Values with Methods Using OrderedOptions\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econfig \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eActiveSupport\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eOrderedOptions\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enew\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e# set the values\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econfig\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eapi_key \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;my-api-key\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econfig\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eapi_secret \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;my-api-secret\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e# access the values\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econfig\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eapi_key  \u003cspan style=\"color:#998;font-style:italic\"\u003e# =\u0026gt; \u0026#39;my-api-key\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econfig\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eapi_secret \u003cspan style=\"color:#998;font-style:italic\"\u003e# =\u0026gt; \u0026#39;my-api-secret\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eA neat API which I always forget about. I\u0026rsquo;ve avoided Rails specific additions\nlike this in the past, and I think that has been a mistake.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eArc is \u003ca href=\"/weeknotes/93-autonomy-is-good/\"\u003enot yet replacing my Pocket use\u003c/a\u003e due to a bug in Arc on iOS 🥲 I\u0026rsquo;m\nstill loving it on desktop.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother shorter week next week 👌\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://flowbite.com/\"\u003eFlowbite\u003c/a\u003e is a component framework for Tailwind CSS. Some components are\nfree, whilst others are available at a cost. Seems like a nice toolkit to keep\nin mind.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had cause to work with some CSV files in Neovim this week. I don\u0026rsquo;t do that\nvery often but I remembered that I\u0026rsquo;d installed a plugin \u0026ndash;\n\u003ca href=\"https://github.com/mechatroner/rainbow_csv\"\u003emechatroner/rainbow_csv\u003c/a\u003e \u0026ndash; to help with this before.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRainbow CSV - Vim plugin: Highlight columns in CSV and TSV files and run\nqueries in SQL-like language\u003c/p\u003e",
      "date_published": "2023-04-16T00:00:00+00:00",
      "date_modified": "2023-04-16T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/93-autonomy-is-good/",
      "url": "https://elver.me/weeknotes/93-autonomy-is-good/",
      "title": "Weeknotes 93: Autonomy is good",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://programmingisterrible.com/post/176657481103/repeat-yourself-do-more-than-one-thing-and\"\u003eRepeat yourself, do more than one thing, and rewrite everything\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNo-one enjoys writing boilerplate. The more straightforward it is to write,\nthe duller it is to summon into a text editor.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is great; I found myself nodding my way through it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePhone doesn\u0026rsquo;t have signal after travelling in a car. Toggle \u0026ldquo;Airplane Mode\u0026rdquo; in\na vain attempt to gain a signal. If it\u0026rsquo;s really stubborn, turn the \u003cem\u003ewhole\u003c/em\u003e\nphone off and on again. Is it the phone? Is it the network carrier?\u003c/p\u003e\n\u003cp\u003eComputer won\u0026rsquo;t connect to WiFi. Disconnect the VPN so the captive portal can\nask for my personal information. Type \u0026ldquo;google.com\u0026rdquo; into a browser to see if\nit\u0026rsquo;s \u003cem\u003eactually\u003c/em\u003e connected. The VPN has done something awful to the networking\nstack. Disconnect, reconnect, toggle Wi-Fi on and off.\u003c/p\u003e\n\u003cp\u003eIs it now normal to have to turn anything wireless on and off again to make\nthem work?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI found myself wanting to conditionally build a query this week. When I\u0026rsquo;m\nnormally building this sort of thing it\u0026rsquo;s to filter a large collection by\nadding a serious of \u003ccode\u003ewhere\u003c/code\u003e clauses,\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003equery \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eModel\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eall\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003equery \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e query\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ewhere(\u003cspan style=\"color:#990073\"\u003esome\u003c/span\u003e: condition) \u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e condition\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003epresent?\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003equery \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e query\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ewhere(\u003cspan style=\"color:#990073\"\u003eother\u003c/span\u003e: thing) \u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e thing\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003epresent?\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003equery\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIn this case I was trying to find a single record. Because of that I didn\u0026rsquo;t\nwant to start with \u003ccode\u003eModel.all\u003c/code\u003e because I risked returning a random record from\nthe collection. I wanted a \u003ccode\u003eModel\u003c/code\u003e or \u003ccode\u003enil\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eModel\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enone\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003equery \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e query\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ewhere(\u003cspan style=\"color:#990073\"\u003esome\u003c/span\u003e: condition) \u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e condition\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003epresent?\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003equery \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e query\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ewhere(\u003cspan style=\"color:#990073\"\u003eother\u003c/span\u003e: thing) \u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e thing\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003epresent?\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003equery\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efirst\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m doing some work on my \u0026ldquo;homelab\u0026rdquo; moving quite a lot of software to Docker\ncontainers \u0026ndash; for which Docker is \u003cem\u003eideal\u003c/em\u003e \u0026ndash; and it prompted me to investigate\nhow Docker networking works. I knew you could route traffic for one container\nthrough another, but I didn\u0026rsquo;t know that a container can have more than one\nnetwork attached.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eArc is the new Neovim \u0026ndash; I think there\u0026rsquo;s a possibility that Arc might end up\nreplacing my Pocket use. Because of the organisational tools Arc has, and the\nnew mobile app, I\u0026rsquo;m finding myself just sending/moving/sharing a page into\ncertain spaces.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAutonomy is good, but it leaves a space that my brain wants to fill with\nanxiety, worry, imposter syndrome. Sometimes feels like you can\u0026rsquo;t win 😅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy bathroom renovation is complete ✅ Another thing ticked off.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://waxy.org/2023/04/the-bitcoin-whitepaper-is-hidden-in-every-modern-copy-of-macos/\"\u003eThe Bitcoin Whitepaper Is Hidden in Every Modern Copy of macOS\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhile trying to fix my printer today, I discovered that a PDF copy of\nSatoshi Nakamoto’s Bitcoin whitepaper apparently shipped with every copy of\nmacOS since Mojave in 2018.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHave you ever been working on something for a period of time and then realise,\ntowards the end, that the approach is incorrect? Yeah, that. This is the\nreality of software development sometimes, but it doesn\u0026rsquo;t stop it stoking the\nfire of imposter syndrome. It also ruined the long bank holiday for me a bit.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://kentindell.github.io/2023/04/03/can-injection/\"\u003eCAN Injection: keyless car theft\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis is a detective story about how a car was stolen - and how it uncovered\nan epidemic of high-tech car theft.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI got a new PB on my trap bar deadlift and bench press this week, so that\u0026rsquo;s\nsomething to be pleased about 💪 Small wins.\u003c/p\u003e\n\u003cp\u003eIf only I could stop eating myself to death.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://programmingisterrible.com/post/176657481103/repeat-yourself-do-more-than-one-thing-and\"\u003eRepeat yourself, do more than one thing, and rewrite everything\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNo-one enjoys writing boilerplate. The more straightforward it is to write,\nthe duller it is to summon into a text editor.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is great; I found myself nodding my way through it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePhone doesn\u0026rsquo;t have signal after travelling in a car. Toggle \u0026ldquo;Airplane Mode\u0026rdquo; in\na vain attempt to gain a signal. If it\u0026rsquo;s really stubborn, turn the \u003cem\u003ewhole\u003c/em\u003e\nphone off and on again. Is it the phone? Is it the network carrier?\u003c/p\u003e",
      "date_published": "2023-04-09T00:00:00+00:00",
      "date_modified": "2023-04-09T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/92-trillions-of-messages/",
      "url": "https://elver.me/weeknotes/92-trillions-of-messages/",
      "title": "Weeknotes 92: Trillions of messages",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://vimtricks.com/p/quickly-access-project-notes/\"\u003eTIL about Vim\u0026rsquo;s \u003ccode\u003e:drop\u003c/code\u003e command\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eVim will open the file if it’s not already open, or jump to the open buffer\nif it is.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is useful for my new note taking config.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m trying to train myself to use \u003ccode\u003e:AV\u003c/code\u003e from Rails.vim. \u003ccode\u003e:AV\u003c/code\u003e will open the\n\u0026ldquo;alternative\u0026rdquo; file for the current file in a vertical split \u0026ndash; that usually\nmeans the matching test file.\u003c/p\u003e\n\u003cp\u003eI realised that those new splits open to the left of the current one. I would\nprefer it on the right. I \u003ccode\u003eset splitright\u003c/code\u003e and hey presto! I \u003ca href=\"https://github.com/jordelver/dotfiles/blob/07faadeb78f8eaa365c7571ee3300a15ed5d52e3/config/nvim/lua/options.lua#L64-L65\"\u003ealready have\nsplitbelow set\u003c/a\u003e, so I\u0026rsquo;m not sure why I didn\u0026rsquo;t already have \u003ccode\u003esplitright\u003c/code\u003e too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://nohello.net/\"\u003e\u0026ldquo;please don\u0026rsquo;t say just hello in chat\u0026rdquo;\u003c/a\u003e 😆\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePlaywright has a \u003ca href=\"https://github.com/microsoft/playwright/releases/tag/v1.32.0\"\u003enew \u0026ldquo;UI Mode\u0026rdquo; in version 1.32.0\u003c/a\u003e, which I\u0026rsquo;m assuming makes it\nmuch more attractive to people migrating from Cypress, which has had this for\na long time.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve only briefly used Playwright to compare it to an existing Cypress test\nsuite and I liked it. The API seemed more straight forward and it was faster.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://discord.com/blog/how-discord-stores-trillions-of-messages\"\u003e\u0026ldquo;How Discord stores trillions of messages\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn 2017, we ran 12 Cassandra nodes, storing billions of messages.\u003c/p\u003e\n\u003cp\u003eAt the beginning of 2022, it had 177 nodes with trillions of messages.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWoah.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMost importantly, however, it lets us say we rewrote it in Rust (meme cred\nis very important).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e🤣\u003c/p\u003e\n\u003cp\u003eReally interesting write-up.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport for \u003ca href=\"https://blog.saeloun.com/2023/03/28/improve-support-for-namespaces\"\u003enamespaces will be much improved in Rails 7.1\u003c/a\u003e thanks to\n\u003ca href=\"https://github.com/fxn/zeitwerk\"\u003eZeitwerk\u003c/a\u003e. Auto-loading behaviour has been confusing me over the years, so\nthis is great news.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eInternal tools \u0026ndash; who has time for them? Most places I\u0026rsquo;ve worked have been on\nthe smaller side and building internal tools was never something that time\ncould be spent on. The team I\u0026rsquo;m currently working with have clearly spent a\nlot of time working on tools for all parts of the business.\u003c/p\u003e\n\u003cp\u003eGiving developers the tools to easily investigate bugs is saving a lot of time\nand money in the long run, but they are a hard sell in most businesses due to\ntheir benefits being hard to quantify.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://tailscale.com/blog/tailscale-funnel-beta/\"\u003eTailscale Funnel now available in beta\u003c/a\u003e \u0026ndash; A replacement for \u003ca href=\"https://ngrok.com/\"\u003e\u003ccode\u003engrok\u003c/code\u003e\u003c/a\u003e if\nyou\u0026rsquo;re using Tailscale already.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://cabel.com/2023/03/27/apple-passwords-deserve-an-app/\"\u003e\u0026ldquo;Apple Passwords Deserve An App\u0026rdquo;\u003c/a\u003e \u0026ndash; honestly, I kinda knew some of this was\nbuilt-in, but I have literally no idea where to start. 1Password still works\nfor me, but I share the same fears that others do about their VC money. As a\nresult I\u0026rsquo;m still on 1Password 7.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e(Bonus Panic UI Tip: people can’t/won’t read more than three (3) lines of\nstatic descriptive text.)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve been saying this for years. No one is reading your text, sorry.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve started using \u003ca href=\"https://noiz.io/\"\u003eNoizio\u003c/a\u003e again to try and get me into a focus mode more\nquickly.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTry macOS Noizio app for better productivity. Ease of choosing and blending\nthe ambient sounds into a mixture that will perfectly fit your mood.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe way you can mix and match sounds is great.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://vimtricks.com/p/quickly-access-project-notes/\"\u003eTIL about Vim\u0026rsquo;s \u003ccode\u003e:drop\u003c/code\u003e command\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eVim will open the file if it’s not already open, or jump to the open buffer\nif it is.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is useful for my new note taking config.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m trying to train myself to use \u003ccode\u003e:AV\u003c/code\u003e from Rails.vim. \u003ccode\u003e:AV\u003c/code\u003e will open the\n\u0026ldquo;alternative\u0026rdquo; file for the current file in a vertical split \u0026ndash; that usually\nmeans the matching test file.\u003c/p\u003e\n\u003cp\u003eI realised that those new splits open to the left of the current one. I would\nprefer it on the right. I \u003ccode\u003eset splitright\u003c/code\u003e and hey presto! I \u003ca href=\"https://github.com/jordelver/dotfiles/blob/07faadeb78f8eaa365c7571ee3300a15ed5d52e3/config/nvim/lua/options.lua#L64-L65\"\u003ealready have\nsplitbelow set\u003c/a\u003e, so I\u0026rsquo;m not sure why I didn\u0026rsquo;t already have \u003ccode\u003esplitright\u003c/code\u003e too.\u003c/p\u003e",
      "date_published": "2023-04-02T00:00:00+00:00",
      "date_modified": "2023-04-02T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/91-internet-frustration/",
      "url": "https://elver.me/weeknotes/91-internet-frustration/",
      "title": "Weeknotes 91: Internet frustration",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key/\"\u003e\u0026ldquo;We updated our RSA SSH host key\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAt approximately 05:00 UTC on March 24, out of an abundance of caution, we\nreplaced our RSA SSH host key used to secure Git operations for GitHub.com.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://martinheinz.dev/blog/92\"\u003e\u0026ldquo;Why I Will Never Use Alpine Linux Ever Again\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHowever, the little differences can cause all the grief. Some of it stems\nfrom how musl (and therefore also Alpine) handles DNS (it\u0026rsquo;s always DNS),\nmore specifically, musl (by design) doesn\u0026rsquo;t support DNS-over-TCP.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVery interesting write up of potential issues with Alpine Linux because\nthey use musl instead of glibc. This sounds like the sort of issue that\nwouldn\u0026rsquo;t be a problem until everything was on fire 🔥\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Gordon_Moore\"\u003eGordon Moore\u003c/a\u003e, Intel Co-Founder, and originator of \u003ca href=\"https://en.wikipedia.org/wiki/Moore%27s_law\"\u003eMoore\u0026rsquo;s Law\u003c/a\u003e, has died.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy bathroom is being renovated at the moment so I\u0026rsquo;ve been spending a lot of\ntime out of the house in cafes. This means internet frustration: captive\nportals, bad signal, tethering dropouts. You name it. To try and stay online I\nwondered whether it\u0026rsquo;s worth getting some sort of backup SIM on another\nnetwork. I don\u0026rsquo;t even know if this makes sense or not?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe more I see \u003ccode\u003e# rubocop:disable\u003c/code\u003e comments in a codebase the more I dislike\nthem. When you can ignore the complexity of your code by wrapping it in a \u003ccode\u003e# rubocop:disable\u003c/code\u003e then what have you achieved other than littering the codebase\nwith ugly comments?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFrom \u003ca href=\"https://mastodon.social/@sstephenson/110078920824980379\"\u003eSam Stephenson\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;still processing the impossibly good news that the NLRB has ruled\nnon-disparagement clauses in separation agreements to be illegal and\n\u003cem\u003eretroactively void\u003c/em\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e👀\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDid you know that Rails includes \u003ca href=\"https://github.com/rails/rails/blob/main/activestorage/lib/active_storage/analyzer/image_analyzer.rb\"\u003eimage\u003c/a\u003e, \u003ca href=\"https://github.com/rails/rails/blob/main/activestorage/lib/active_storage/analyzer/audio_analyzer.rb\"\u003eaudio\u003c/a\u003e, and \u003ca href=\"https://github.com/rails/rails/blob/main/activestorage/lib/active_storage/analyzer/video_analyzer.rb\"\u003evideo\u003c/a\u003e analyzers\nbuilt-in?! I don\u0026rsquo;t know why I was so surprised at this. Probably because I\u0026rsquo;ve\nseen it re-implemented in a few codebases?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://hachyderm.io/@mononcqc/110073337791217700\"\u003eFred Hebert\u0026hellip;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe are releasing the well-poisoning machine, because if we don\u0026rsquo;t do it\nfirst, someone else with even worse morals might do it faster.\u003c/p\u003e\n\u003cp\u003eBy being the first people to poison the well, we can know exactly what kind\nof toxins will be in the water such that we understand the symptoms when we\ninevitably make the whole village sick from it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mastodon.social/@searls/110067742412968330\"\u003eGreat point from @searls\u003c/a\u003e. I have been guilty of this 🙈\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;if it\u0026rsquo;s a pain to set up a development environment, then you SHOULD blow it\nup more often as feedback to force you to make it easier.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.reddit.com/r/neovim/comments/121otka/a_nice_telescope_surprise/\"\u003eTelescope tip\u003c/a\u003e \u0026ndash; when using \u003ca href=\"https://github.com/nvim-telescope/telescope.nvim#file-pickers\"\u003eLive Grep\u003c/a\u003e you can fuzzily refine the results\nby typing the path/filename. Whilst the Live Grep picker is already open hit\n\u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eSpace\u003c/kbd\u003e to show the prompt.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key/\"\u003e\u0026ldquo;We updated our RSA SSH host key\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAt approximately 05:00 UTC on March 24, out of an abundance of caution, we\nreplaced our RSA SSH host key used to secure Git operations for GitHub.com.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://martinheinz.dev/blog/92\"\u003e\u0026ldquo;Why I Will Never Use Alpine Linux Ever Again\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHowever, the little differences can cause all the grief. Some of it stems\nfrom how musl (and therefore also Alpine) handles DNS (it\u0026rsquo;s always DNS),\nmore specifically, musl (by design) doesn\u0026rsquo;t support DNS-over-TCP.\u003c/p\u003e",
      "date_published": "2023-03-26T00:00:00+00:00",
      "date_modified": "2023-03-26T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/90-collect-your-internet/",
      "url": "https://elver.me/weeknotes/90-collect-your-internet/",
      "title": "Weeknotes 90: Collect your Internet",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://arc.net/\"\u003eArc\u003c/a\u003e from \u003ca href=\"https://thebrowser.company/\"\u003eThe Browser Company\u003c/a\u003e continues to impress and I\u0026rsquo;m now using it\nfull time. Organisation-wise, it\u0026rsquo;s a game changer - a single window for\n\u003cem\u003eeverything\u003c/em\u003e. The muscle memory developed from years of other browsers is hard\nto beat though, so I\u0026rsquo;m occasionally tripping myself up.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m excited to see what their mobile browser might look. Also, Easel is cool,\nsee \u003ca href=\"https://youtu.be/ukquBSOpmTk\"\u003eCollect Your Internet with Easel\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.phoenixframework.org/blog/whisper-speech-to-text-phoenix\"\u003eEmbed and broadcast Whisper speech-to-text in your Phoenix app in 15 minutes\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn this screencast, I show just how quickly we can add audio transcription\nto the open-source LiveBeats application we saw in a previous video. There’s\nno third-party APIs to call out to, no background jobs to kick off, and no\nJavaScript to write. The only external dependency is ffmpeg.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ePretty incredible\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://sive.rs/slow\"\u003eI’m a very slow thinker\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI’m a disappointing person to try to debate or attack. I just have nothing\nto say in the moment, except maybe, “Good point.” Then a few days later,\nafter thinking about it a lot, I have a response.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnxious first week of work, but mostly self-induced. I was happy with how it\nwent, and with what I contributed given it was my first week. My brain has me\nthinking this was a fluke, but I\u0026rsquo;m hoping to prove it wrong.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=QHi479xN_po\"\u003eBobby Fingers\u0026rsquo; Michael Jackson on Fire Diorama\u003c/a\u003e (via \u003ca href=\"https://tomstu.art/weeknotes-167-good-pencils\"\u003eTom Stuart\u003c/a\u003e) \u0026ndash; I don\u0026rsquo;t\nknow what to say about this other than it\u0026rsquo;s \u003cem\u003ewell\u003c/em\u003e worth your time.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://arc.net/\"\u003eArc\u003c/a\u003e from \u003ca href=\"https://thebrowser.company/\"\u003eThe Browser Company\u003c/a\u003e continues to impress and I\u0026rsquo;m now using it\nfull time. Organisation-wise, it\u0026rsquo;s a game changer - a single window for\n\u003cem\u003eeverything\u003c/em\u003e. The muscle memory developed from years of other browsers is hard\nto beat though, so I\u0026rsquo;m occasionally tripping myself up.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m excited to see what their mobile browser might look. Also, Easel is cool,\nsee \u003ca href=\"https://youtu.be/ukquBSOpmTk\"\u003eCollect Your Internet with Easel\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.phoenixframework.org/blog/whisper-speech-to-text-phoenix\"\u003eEmbed and broadcast Whisper speech-to-text in your Phoenix app in 15 minutes\u003c/a\u003e\u003c/p\u003e",
      "date_published": "2023-03-19T00:00:00+00:00",
      "date_modified": "2023-03-19T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/89-massive-disappointment/",
      "url": "https://elver.me/weeknotes/89-massive-disappointment/",
      "title": "Weeknotes 89: Massive disappointment",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s cool that \u003ca href=\"https://www.brompton.com/\"\u003eBrompton\u003c/a\u003e are \u003ca href=\"https://www.youtube.com/watch?v=MBXYZ7vHmXw\"\u003eusing Raspberry Pis and Python to power the\nproduction stations in their factory\u003c/a\u003e. I do agree with a couple of the\ncomments on the video though, they gloss over the software aspects massively\n(the video is only 3 minutes tbf!) and it would be interesting to know more\ndetails.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://williamkennedy.ninja/javascript/2022/05/03/in-defence-of-the-single-page-application/\"\u003e\u0026ldquo;In defence of the Single Page Application\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e😆\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFurther to my \u003ca href=\"/weeknotes/88-hardcoded-strings/\"\u003epost last week regarding Gandi being bought/sold\u003c/a\u003e, there were a\ncouple of threads on \u003ca href=\"https://lobste.rs/s/flcpop/what_domain_registrar_is_worth_using\"\u003elobste.rs\u003c/a\u003e and the \u003ca href=\"https://news.ycombinator.com/item?id=35080777\"\u003eorange site\u003c/a\u003e which are worth a look.\u003c/p\u003e\n\u003cp\u003eIn particular, I thought about adding \u003ca href=\"https://aws.amazon.com/route53/pricing/#Domain_Names\"\u003eAWS\u0026rsquo; Route 53\u003c/a\u003e to my list of\nalternatives, but \u003ca href=\"https://news.ycombinator.com/item?id=35082232\"\u003eRoute 53 actually use Gandi for domain registration\u003c/a\u003e (\u003ca href=\"https://aws.amazon.com/route53/domain-registration-agreement/#2._Registrar_and_Registry_Operator.\"\u003eAWS\nRegistration Agreement\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother managed PostgreSQL provider to consider \u0026ndash; \u003ca href=\"https://aiven.io/postgresql\"\u003eAiven\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://community.fly.io/t/reliability-its-not-great/11253\"\u003eFly\u0026rsquo;s transparency in the growing pains they are experiencing\u003c/a\u003e is admirable,\nand makes me trust them even more. I might not feel that way if I had an\nimportant application deployed there. But I don\u0026rsquo;t.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI published my \u003ca href=\"https://github.com/hrsh7th/nvim-cmp\"\u003e\u003ccode\u003envim-cmp\u003c/code\u003e\u003c/a\u003e Jira source, \u003ca href=\"https://github.com/jordelver/cmp-jira\"\u003e\u003ccode\u003ecmp-jira\u003c/code\u003e\u003c/a\u003e, after a bit of tidying.\nI hope to iron out any issues when I start using it in anger.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://webstack.dancroak.com/\"\u003ewebstack \u0026ndash; A project to prototype web stacks\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eAn interesting comparison of \u003ca href=\"https://www.heroku.com/\"\u003eHeroku\u003c/a\u003e, \u003ca href=\"https://fly.io/\"\u003eFly.io\u003c/a\u003e, \u003ca href=\"https://northflank.com/\"\u003eNorthflank\u003c/a\u003e, \u003ca href=\"https://railway.app/\"\u003eRailway\u003c/a\u003e,\n\u003ca href=\"https://render.com/\"\u003eRender\u003c/a\u003e, and \u003ca href=\"https://vercel.com/\"\u003eVercel\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eSomething that surprised me:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMulti-region Postgres read replicas performs even better than multi-region\nSQLite.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://better-mobile-inputs.netlify.app/\"\u003eBuild a Better Mobile Input\u003c/a\u003e (\u003ca href=\"https://remysharp.com/links/2023-03-01-3bff24a5\"\u003eVia Remy Sharp\u003c/a\u003e). A nice interactive view of\nhow the \u003ccode\u003etype\u003c/code\u003e, \u003ccode\u003einputmode\u003c/code\u003e, and \u003ccode\u003eautocomplete\u003c/code\u003e attributes can affect a web\nform.\u003c/p\u003e\n\u003cp\u003eThe lack of care regarding this is a personal bug bear of mine.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI thought it was about time I learnt how \u003ca href=\"https://github.com/hotwired/turbo-rails\"\u003eTurbo\u003c/a\u003e works so I\u0026rsquo;ve been working\nthrough \u003ca href=\"https://www.hotrails.dev/\"\u003ethe Hotrails Turbo Rails tutorial\u003c/a\u003e. I already understand a lot of the concepts\nbut found reading the text tiring and I\u0026rsquo;m not sure how much I\u0026rsquo;m taking in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/color\"\u003e\u003ccode\u003e\u0026lt;input type=\u0026quot;color\u0026quot;\u0026gt;\u003c/code\u003e\u003c/a\u003e \u003ca href=\"https://friend.camp/@darius/109939932494486502\"\u003eis a thing\u003c/a\u003e. And it\u0026rsquo;s a \u003ca href=\"https://caniuse.com/input-color\"\u003ething that works\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIf you need something a bit more, there is \u003ca href=\"https://github.com/web-padawan/vanilla-colorful\"\u003eweb-padawan/vanilla-colorful\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFrom \u003ca href=\"https://ruby.social/@iainbeeston/109978483279539154\"\u003eIain Beeston\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn Ruby on Rails 7+ you can set \u003ccode\u003econfig.server_timing = true\u003c/code\u003e in\n\u003ccode\u003econfig/environments/development.rb\u003c/code\u003e and Google Chrome will show the time\ntaken for rendering and database queries in the networking tab of the Chrome\ndevtools\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ePretty neat.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI am starting a new contract tomorrow. I\u0026rsquo;ve been trying to not let the anxiety\ntake over too much. Can I do this? Am I actually a computer programmer? Will I\nbe a massive disappointment? I guess we\u0026rsquo;ll see.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn preparation for said new contract, note taking has once again reared it\u0026rsquo;s\nhead so I\u0026rsquo;ve been hacking together some Lua helpers for my Neovim config to\nhelp with that. My general motivation is single keybinding access to my most\nused notes. Quite basic at the moment, but working-ish.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s cool that \u003ca href=\"https://www.brompton.com/\"\u003eBrompton\u003c/a\u003e are \u003ca href=\"https://www.youtube.com/watch?v=MBXYZ7vHmXw\"\u003eusing Raspberry Pis and Python to power the\nproduction stations in their factory\u003c/a\u003e. I do agree with a couple of the\ncomments on the video though, they gloss over the software aspects massively\n(the video is only 3 minutes tbf!) and it would be interesting to know more\ndetails.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://williamkennedy.ninja/javascript/2022/05/03/in-defence-of-the-single-page-application/\"\u003e\u0026ldquo;In defence of the Single Page Application\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e😆\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFurther to my \u003ca href=\"/weeknotes/88-hardcoded-strings/\"\u003epost last week regarding Gandi being bought/sold\u003c/a\u003e, there were a\ncouple of threads on \u003ca href=\"https://lobste.rs/s/flcpop/what_domain_registrar_is_worth_using\"\u003elobste.rs\u003c/a\u003e and the \u003ca href=\"https://news.ycombinator.com/item?id=35080777\"\u003eorange site\u003c/a\u003e which are worth a look.\u003c/p\u003e",
      "date_published": "2023-03-12T00:00:00+00:00",
      "date_modified": "2023-03-12T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/88-hardcoded-strings/",
      "url": "https://elver.me/weeknotes/88-hardcoded-strings/",
      "title": "Weeknotes 88: Hardcoded strings",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://cabel.com/2023/02/25/the-courtyard/\"\u003eThe Courtyard\u003c/a\u003e by Cabel Sasser\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhatever you’re working on right now, whatever it might be, I ask: try to\nleave a little space for a courtyard.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/ruby/power_assert\"\u003epower_assert\u003c/a\u003e is interesting.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePower Assert shows each value of variables and method calls in the\nexpression. It is useful for testing, providing which value wasn\u0026rsquo;t correct\nwhen the condition is not satisfied.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre\u003e\u003ccode\u003eFailure:\n   assert { 3.times.to_a.include?(3) }\n              |     |    |\n              |     |    false\n              |     [0, 1, 2]\n              #\u0026lt;Enumerator: 3:times\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHost your own Mastodon server with \u003ca href=\"https://github.com/cloudflare/wildebeest\"\u003eWildebeest\u003c/a\u003e \u003ca href=\"https://blog.cloudflare.com/welcome-to-wildebeest-the-fediverse-on-cloudflare/\"\u003efrom Cloudflare\u003c/a\u003e, I suppose.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI heard that \u003ca href=\"https://www.gandi.net/\"\u003eGandi\u003c/a\u003e, my domain registrar of choice \u003ca href=\"https://exquisite.social/@h3artbl33d/109927449357481623\"\u003ehave been bought\u003c/a\u003e by some\nless that great guys.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe TL;DR: if you have any trust or whatsoever in Gandi, you should\nseriously reconsider.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI decided to compile a list of alternatives for the TLDs I own.\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eProvider\u003c/th\u003e\n          \u003cth\u003e.co.uk\u003c/th\u003e\n          \u003cth\u003e.me\u003c/th\u003e\n          \u003cth\u003e.com\u003c/th\u003e\n          \u003cth\u003e.co\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ca href=\"https://www.cloudflare.com/products/registrar/\"\u003eCloudflare\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e$4.76\u003c/td\u003e\n          \u003ctd\u003e$12.55\u003c/td\u003e\n          \u003ctd\u003e$9.15\u003c/td\u003e\n          \u003ctd\u003e$22.00\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ca href=\"https://porkbun.com/\"\u003ePorkbun\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e$5.96\u003c/td\u003e\n          \u003ctd\u003e$14.85\u003c/td\u003e\n          \u003ctd\u003e$9.73\u003c/td\u003e\n          \u003ctd\u003e$22.97\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ca href=\"https://aws.amazon.com/route53/pricing/#Domain_Names\"\u003eAWS\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e$9.00\u003c/td\u003e\n          \u003ctd\u003e$25.00\u003c/td\u003e\n          \u003ctd\u003e$13.00\u003c/td\u003e\n          \u003ctd\u003e$25.00\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ca href=\"https://dnsimple.com/tlds\"\u003eDNSimple\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e$10.00\u003c/td\u003e\n          \u003ctd\u003e$25.00\u003c/td\u003e\n          \u003ctd\u003e$14.50\u003c/td\u003e\n          \u003ctd\u003e$30.00\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ca href=\"https://www.gandi.net/\"\u003eGandi\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e$11.36\u003c/td\u003e\n          \u003ctd\u003e$22.20\u003c/td\u003e\n          \u003ctd\u003e$19.87\u003c/td\u003e\n          \u003ctd\u003e$42.08\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eClearly, Cloudflare come out on top in terms of price, but Porkbun are only\nvery slightly more expensive \u003cem\u003eand\u003c/em\u003e are called Porkbun.\u003c/p\u003e\n\u003cp\u003eThe main thing I\u0026rsquo;ve learnt is that I\u0026rsquo;ve been overpaying for domain renewals.\nGet in touch if any have other decent options. I\u0026rsquo;m not moving anything just\nyet.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy experiment with using \u003ca href=\"https://arc.net/\"\u003eArc\u003c/a\u003e is paying off. I really like it, although there\nwas/is a learning curve. More or less every other browser I\u0026rsquo;ve used is tabs\nalong the top, web page below. It\u0026rsquo;s been that way for a long time. Arc is not\nlike that so breaking the muscle memory is hard.\u003c/p\u003e\n\u003cp\u003eSome thoughts:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSplits are really great \u0026ndash; horizontal or vertical. If you have a tiling\nwindow manager (or something like one) you can achieve a similar result,\nbut having it all inside Arc makes managing multiple windows easier.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFont rendering is not as nice as Safari.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAutomatic Picture-in-Picture when watching YouTube is brilliant. When you\nnavigate away from a playing YouTube video it will pop out to PiP\nautomatically.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCopying the page URL with \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eCmd\u003c/kbd\u003e + \u003ckbd\u003ec\u003c/kbd\u003e\nremoves any tracking querystring 👌\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://phoenixframework.org/blog/phoenix-1.7-final-released\"\u003ePhoenix 1.7.0 released was released\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eVerified Routes are more exciting to me than maybe they should be. I\u0026rsquo;ve never\nliked route helpers (and this applies to Rails too). I can\u0026rsquo;t remember what the\nfunction is called or what arguments it takes.\u003c/p\u003e\n\u003cp\u003ePerhaps I\u0026rsquo;m old school, but I want to \u003cem\u003esee\u003c/em\u003e the URL, and helpers obfuscate my\nview of it. Instead constant running of \u003ccode\u003erake routes | fzf\u003c/code\u003e is necessary (and\nslow) to figure out what I need.\u003c/p\u003e\n\u003cp\u003eVerified Routes are the best of both worlds: hardcoded string URLs but with\ncompile time checks so you don\u0026rsquo;t get them wrong.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://fly.io/phoenix-files/phoenix-dev-blog-streams/\"\u003eStreams are cool\u003c/a\u003e and obviously a big deal too ;)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about Ruby\u0026rsquo;s \u003ca href=\"https://rubyapi.org/3.2/o/kernel#method-i-j\"\u003e\u003ccode\u003eKernel#j\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://rubyapi.org/3.2/o/kernel#method-i-jj\"\u003e\u003ccode\u003eKernel#jj\u003c/code\u003e\u003c/a\u003e methods. (Via \u003ca href=\"https://til.hashrocket.com/posts/kfys8edbgn-pretty-print-json-in-ruby\"\u003eHaskrocket\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003eEasily pretty print hashes are JSON.\u003c/p\u003e\n\u003cp\u003eI initially couldn\u0026rsquo;t get this working until I realised that you need to\nrequire \u0026ldquo;json\u0026rdquo; to make the methods available.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eirb(main):\u003cspan style=\"color:#099\"\u003e001\u003c/span\u003e:\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#0086b3\"\u003erequire\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eirb(main):\u003cspan style=\"color:#099\"\u003e002\u003c/span\u003e:\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e j({\u003cspan style=\"color:#990073\"\u003efoo\u003c/span\u003e: \u003cspan style=\"color:#d14\"\u003e\u0026#34;bar\u0026#34;\u003c/span\u003e})\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#d14\"\u003e\u0026#34;foo\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#990073\"\u003e:\u0026#34;bar\u0026#34;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003enil\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eirb(main):\u003cspan style=\"color:#099\"\u003e003\u003c/span\u003e:\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e jj({\u003cspan style=\"color:#990073\"\u003efoo\u003c/span\u003e: \u003cspan style=\"color:#d14\"\u003e\u0026#34;bar\u0026#34;\u003c/span\u003e})\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;foo\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#d14\"\u003e\u0026#34;bar\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003enil\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL that PostgreSQL is named so because it was a successor to the \u003ca href=\"https://en.wikipedia.org/wiki/Ingres_(database)\"\u003eIngres\ndatabase\u003c/a\u003e, so was \u003cem\u003epost\u003c/em\u003e Ingres.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt was originally named POSTGRES, referring to its origins as a successor to\nthe Ingres database developed at the University of California, Berkeley. In\n1996, the project was renamed to PostgreSQL to reflect its support for SQL.\nAfter a review in 2007, the development team decided to keep the name\nPostgreSQL and the alias Postgres.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://cabel.com/2023/02/25/the-courtyard/\"\u003eThe Courtyard\u003c/a\u003e by Cabel Sasser\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhatever you’re working on right now, whatever it might be, I ask: try to\nleave a little space for a courtyard.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/ruby/power_assert\"\u003epower_assert\u003c/a\u003e is interesting.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePower Assert shows each value of variables and method calls in the\nexpression. It is useful for testing, providing which value wasn\u0026rsquo;t correct\nwhen the condition is not satisfied.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre\u003e\u003ccode\u003eFailure:\n   assert { 3.times.to_a.include?(3) }\n              |     |    |\n              |     |    false\n              |     [0, 1, 2]\n              #\u0026lt;Enumerator: 3:times\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHost your own Mastodon server with \u003ca href=\"https://github.com/cloudflare/wildebeest\"\u003eWildebeest\u003c/a\u003e \u003ca href=\"https://blog.cloudflare.com/welcome-to-wildebeest-the-fediverse-on-cloudflare/\"\u003efrom Cloudflare\u003c/a\u003e, I suppose.\u003c/p\u003e",
      "date_published": "2023-03-05T00:00:00+00:00",
      "date_modified": "2023-03-05T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/87-verified-links/",
      "url": "https://elver.me/weeknotes/87-verified-links/",
      "title": "Weeknotes 87: Verified links",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDevelopment environment improvements were on the agenda this week. Mainly\nsetting up LSP, and various completions using \u003ca href=\"https://github.com/hrsh7th/nvim-cmp\"\u003e\u003ccode\u003envim-cmp\u003c/code\u003e\u003c/a\u003e. This has been on\nmy TODO list for a \u003cem\u003elong\u003c/em\u003e time but I think I have the basics configured now:\nRuby completions using \u003ca href=\"https://solargraph.org/\"\u003esolargraph\u003c/a\u003e, and \u003ca href=\"https://github.com/petertriho/cmp-git\"\u003egit\u003c/a\u003e with commit, PR, and issues\nrefs.\u003c/p\u003e\n\u003cp\u003eI even started hacking on my own \u003ca href=\"https://github.com/hrsh7th/nvim-cmp/wiki/List-of-sources\"\u003e\u003ccode\u003envim-cmp\u003c/code\u003e source\u003c/a\u003e for Jira tickets and have\nit mostly working with the exception of not fully understanding how the\ntriggering of the source works. I plan on adding other ticketing systems as\nand when the need arises.\u003c/p\u003e\n\u003cp\u003eOver time, with some \u003cem\u003ereal\u003c/em\u003e work, I\u0026rsquo;m sure it will need tweaking.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/86-lurking-in-your-phone-and-car/\"\u003eLast week I wrote mentioned Twitter discontinuing 2FA by SMS\u003c/a\u003e, and cited a\nblog post by Ricky Mondello. In that article they mention that \u003ca href=\"https://developer.apple.com/passkeys/\"\u003ePasskeys\u003c/a\u003e are\nwhere we want to be eventually. If, like me, you didn\u0026rsquo;t understand how they\nwork take a \u003ca href=\"https://developer.apple.com/videos/play/wwdc2022/102/?time=2638\"\u003elook at this short video Ricky presented\u003c/a\u003e as part of a WWDC\nsession.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI verified the links on my Mastodon profile. There are \u003ca href=\"https://docs.joinmastodon.org/user/profile/#verification\"\u003etwo methods to chose\nfrom\u003c/a\u003e. I went with adding a \u003ccode\u003e\u0026lt;link\u0026gt;\u003c/code\u003e element like this to various websites of\nmine:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u0026lt;link rel=\u0026quot;me\u0026quot; href=\u0026quot;https://hachyderm.io/@jordelver\u0026quot; /\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eEasy peasy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/39-burning-bridges/\"\u003eAfter\u003c/a\u003e \u003ca href=\"/weeknotes/53-continuously-stream/\"\u003etalking\u003c/a\u003e \u003ca href=\"/weeknotes/86-lurking-in-your-phone-and-car/\"\u003eabout\u003c/a\u003e \u003ca href=\"https://www.sqlite.org/\"\u003eSQLite\u003c/a\u003e \u003ca href=\"/weeknotes/87-verified-links/\"\u003equite a bit\u003c/a\u003e I decided to try out a Rails\napp with SQLite in \u0026ldquo;production\u0026rdquo;. And Fly is the obvious choice given their\n\u003ca href=\"https://fly.io/blog/all-in-on-sqlite-litestream/\"\u003einterest in pushing SQLite to the edges\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eFiring up a new Rails app, something I hardly ever do, was surprisingly\ndelightful. (Perhaps it\u0026rsquo;s all those creaky old codebases I\u0026rsquo;m sick of rather\nthan Rails after all 😉).\u003c/p\u003e\n\u003cp\u003eA few niggles, but getting a brand-new-does-nothing app running on Fly was a\nnice experience. The problem with this default approach is that database will\nbe wiped on each deploy as the VM is pulled and replaced. What you need is a\npersistent volume where you can put the db file and mount in each app when\nstarted. This too, was easy by \u003ca href=\"https://fly.io/docs/rails/advanced-guides/sqlite3/\"\u003efollowing the Fly docs\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eSo there it is. SQLite running in production. True, it\u0026rsquo;s no real test, but I\nthink it might be the start of something.\u003c/p\u003e\n\u003cp\u003eBackups and restores are the missing piece at the moment. \u003ca href=\"https://litestream.io/getting-started/\"\u003eLitestream streaming\nto S3 seems to be the way\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;How I use ChatGPT to improve my executive functioning and productivity\u0026rdquo; \u0026ndash;\nseems to me that ChatGPT has many benefits if you understand the limitations.\nFor someone like me, who often struggles with starting, I can see a\nconversation with ChatGPT being a great help. Even if it lies and talks shit.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDevelopment environment improvements were on the agenda this week. Mainly\nsetting up LSP, and various completions using \u003ca href=\"https://github.com/hrsh7th/nvim-cmp\"\u003e\u003ccode\u003envim-cmp\u003c/code\u003e\u003c/a\u003e. This has been on\nmy TODO list for a \u003cem\u003elong\u003c/em\u003e time but I think I have the basics configured now:\nRuby completions using \u003ca href=\"https://solargraph.org/\"\u003esolargraph\u003c/a\u003e, and \u003ca href=\"https://github.com/petertriho/cmp-git\"\u003egit\u003c/a\u003e with commit, PR, and issues\nrefs.\u003c/p\u003e\n\u003cp\u003eI even started hacking on my own \u003ca href=\"https://github.com/hrsh7th/nvim-cmp/wiki/List-of-sources\"\u003e\u003ccode\u003envim-cmp\u003c/code\u003e source\u003c/a\u003e for Jira tickets and have\nit mostly working with the exception of not fully understanding how the\ntriggering of the source works. I plan on adding other ticketing systems as\nand when the need arises.\u003c/p\u003e",
      "date_published": "2023-02-26T00:00:00+00:00",
      "date_modified": "2023-02-26T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/86-lurking-in-your-phone-and-car/",
      "url": "https://elver.me/weeknotes/86-lurking-in-your-phone-and-car/",
      "title": "Weeknotes 86: Lurking in your phone and car",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=c4OyfL5o7DU\"\u003eNeovim in 100 Seconds\u003c/a\u003e \u0026ndash; A nice intro into what Neovim actually is in only\n100 seconds. Via \u003ca href=\"https://www.reddit.com/r/neovim/comments/1134xcz/neovim_in_100_seconds/\"\u003er/neovim\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUseful tool for testing webhooks \u0026ndash; \u003ca href=\"https://webhook.site/\"\u003eWebhook.site\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWebhook.site lets you easily inspect, test and automate (with the visual\nCustom Actions builder, or WebhookScript) any incoming HTTP request or\ne-mail.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFrom \u003ca href=\"https://twitter.com/karrisaarinen/status/1623857893090152448\"\u003eKarri Saarinen\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen Microsoft leadership feels like GitHub layoffs are not bad enough, they\nhave to increase the pain by forcing people to use MS Teams on their 4y old\nlaptops.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHaven\u0026rsquo;t they suffered enough?\u003c/p\u003e\n\u003cp\u003eI only recently used Teams for the first time. Verdict: Not good.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/zcutlip/prefsniff\"\u003ePrefsniff\u003c/a\u003e from \u003ca href=\"https://hachyderm.io/@zcutlip/109835828713687560\"\u003eZachary Cutlip\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eprefsniff is a utility to watch macOS plist files for changes, and then\nautogenerate the defaults command to apply those changes. Its intended use\nis to have prefsniff watch a plist file while setting a system or\napplication preference. The resulting defaults command can then be added to\na shell script or incorporated into a configuration management system such\nas Ansible.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVery nice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNeed to left pad a string in Lua? \u003ca href=\"https://github.com/tjdevries/leftpad.nvim\"\u003eleftpad.nvim\u003c/a\u003e to the rescue. 👀\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.unixsheikh.com/articles/sqlite-the-only-database-you-will-ever-need-in-most-cases.html\"\u003e\u0026ldquo;SQLite the only database you will ever need in most cases\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eSQLite is probably lurking in your mobile phone and your car.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt is a popular choice as embedded database software for storage in\napplication software, such as web browsers and mobile phones, and it is the\nmost widely deployed database engine in the world.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve \u003ca href=\"/weeknotes/39-burning-bridges/\"\u003ewritten about\u003c/a\u003e \u003ca href=\"/weeknotes/53-continuously-stream/\"\u003eSQLite before\u003c/a\u003e, and the renaissance around it\u0026rsquo;s use with\nweb applications. I\u0026rsquo;ve never questioned the client/server architecture of\npopular database software, I just assumed \u0026ldquo;that\u0026rsquo;s the way it has to be\u0026rdquo;, but\nfor 99% of apps it sounds viable.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI have run SQLite as a web application database with thousands concurrent\nwrites every second, coming from different HTTP requests, without any delays\nor issues. This is because even on a very busy site, the hardware is\nextremely fast and fully capable of handling that.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m seriously considering trying this out for any web side projects. The cost\nof database hosting is often an issue for side projects. Web hosting can be\nhad for peanuts.\u003c/p\u003e\n\u003cp\u003eWhen using Rails (or any ORM, probably), moving to a client-server database\nlike Postgres later, as needed, should be trivial for \u003cem\u003emost\u003c/em\u003e applications.\u003c/p\u003e\n\u003cp\u003eSaying all of that, I think convincing most teams that SQLite is a viable\nalternative would be very difficult.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://brightonruby.com\"\u003eBrighton Ruby 2023\u003c/a\u003e is ON. Ticket purchased (I think maybe last week, but\nwho\u0026rsquo;s checking).\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/53-continuously-stream/\"\u003eI do hope it returns to the Dome next year\u003c/a\u003e\u0026hellip;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt is. Nice 👌\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://matklad.github.io/2023/02/12/a-love-letter-to-deno.html\"\u003e\u0026quot;\u0026lt;3 Deno\u0026quot;\u003c/a\u003e by \u003ca href=\"https://matklad.github.io\"\u003ematklad\u003c/a\u003e is interesting read on Deno, which I\u0026rsquo;ve tried and\nfailed to see the point of.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe only big drawback of Deno is the language — all this runtime awesomeness\nis tied to TypeScript.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTwitter are planning to \u003ca href=\"https://blog.twitter.com/en_us/topics/product/2023/an-update-on-two-factor-authentication-using-sms-on-twitter\"\u003erestrict 2FA (Two Factor Authentication) using SMS to\nTwitter Blue subscribers only\u003c/a\u003e. It\u0026rsquo;s important to note that it is only SMS at\nthis time, not authenticator apps.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://rmondello.com/2023/02/18/twitter-sms-2fa/\"\u003eRicky Mondello has a very written piece on why it\u0026rsquo;s dangerous\u003c/a\u003e. In\nparticular, I like Ricky\u0026rsquo;s point about how people often say that SMS 2FA\nshould not be used, but like everything in security its a trade-off.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;we should not and cannot consider the effectiveness of a security\nmitigation without also considering its usability and its effectiveness. The\n“most secure” authentication scheme in the world will be limited in its\nimpact by how accessible and user-friendly it is.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://localghost.dev/blog/painting-the-whole-beetle-an-adventure-in-learning-to-learn/\"\u003ePainting the whole beetle: an adventure in learning to learn\u003c/a\u003e \u0026ndash; I feel\npersonally attacked.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"https://github.com/joemasilotti/railsdevs.com/pull/778#issuecomment-1433389625\"\u003esmall contribution to RailsDevs was merged\u003c/a\u003e this week after a couple of\nchanges. Pleased about that.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=c4OyfL5o7DU\"\u003eNeovim in 100 Seconds\u003c/a\u003e \u0026ndash; A nice intro into what Neovim actually is in only\n100 seconds. Via \u003ca href=\"https://www.reddit.com/r/neovim/comments/1134xcz/neovim_in_100_seconds/\"\u003er/neovim\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUseful tool for testing webhooks \u0026ndash; \u003ca href=\"https://webhook.site/\"\u003eWebhook.site\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWebhook.site lets you easily inspect, test and automate (with the visual\nCustom Actions builder, or WebhookScript) any incoming HTTP request or\ne-mail.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFrom \u003ca href=\"https://twitter.com/karrisaarinen/status/1623857893090152448\"\u003eKarri Saarinen\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen Microsoft leadership feels like GitHub layoffs are not bad enough, they\nhave to increase the pain by forcing people to use MS Teams on their 4y old\nlaptops.\u003c/p\u003e",
      "date_published": "2023-02-19T00:00:00+00:00",
      "date_modified": "2023-02-19T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/85-frontend-drama/",
      "url": "https://elver.me/weeknotes/85-frontend-drama/",
      "title": "Weeknotes 85: Frontend drama",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eConsider writing your \u003ca href=\"https://github.com/orgs/community/discussions/8518#discussioncomment-4867611\"\u003efeature request as a poem\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNot a lot of work on \u003ccode\u003ereceiptgo\u003c/code\u003e, \u003cem\u003eshock\u003c/em\u003e. I have a list of features I want to\nbuild, but not a great deal of motivation. Saying that, I might have figured\nout how to move it forward, and I did do a bit of code reorganisation.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/evilmartians/evil-seed\"\u003eEvilSeed\u003c/a\u003e looks potentially useful.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA Gem for creating partial anonymized dumps of your database using your app\nmodel relations.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI finally setup a Mastodon alias using \u003ca href=\"https://webfinger.net\"\u003ewebfinger\u003c/a\u003e. This has been a barrier to\nusing Mastodon as I don\u0026rsquo;t want to be tied to a single instance. But an alias\nallows more flexibility.\u003c/p\u003e\n\u003cp\u003eThere are many blog posts giving advice on how to implement webfinger, but\neventually followed \u003ca href=\"https://blog.netnerds.net/2022/11/alias-mastodon-github-pages/\"\u003ethis guide\u003c/a\u003e for the simplicity of the solution.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eelver.me\u003c/code\u003e is hosted on GitHub Pages, so I just needed to add a JSON file with\nthe correct contents in \u003ccode\u003e.well-known/webfinger/index.json\u003c/code\u003e and that should be\nenough.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e  {\n      \u0026quot;subject\u0026quot;:\u0026quot;acct:jordelver@hachyderm.io\u0026quot;,\n      \u0026quot;aliases\u0026quot;:\n      [\n          \u0026quot;https://hachyderm.io/@jordelver\u0026quot;,\n          \u0026quot;https://hachyderm.io/users/jordelver\u0026quot;,\n          \u0026quot;jordelver@hachyderm.io\u0026quot;\n      ],\n      \u0026quot;links\u0026quot;:\n      [\n          {\n              \u0026quot;rel\u0026quot;:\u0026quot;http://webfinger.net/rel/profile-page\u0026quot;,\n              \u0026quot;type\u0026quot;:\u0026quot;text/html\u0026quot;,\n              \u0026quot;href\u0026quot;:\u0026quot;https://hachyderm.io/@jordelver\u0026quot;\n          },\n          {\n              \u0026quot;rel\u0026quot;:\u0026quot;self\u0026quot;,\n              \u0026quot;type\u0026quot;:\u0026quot;application/activity+json\u0026quot;,\n              \u0026quot;href\u0026quot;:\u0026quot;https://hachyderm.io/users/jordelver\u0026quot;\n          },\n          {\n              \u0026quot;rel\u0026quot;:\u0026quot;http://ostatus.org/schema/1.0/subscribe\u0026quot;,\n              \u0026quot;template\u0026quot;:\u0026quot;https://hachyderm.io/authorize_interaction?uri={uri}\u0026quot;\n          }\n      ]\n  }\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHow do you feel about your standard library shelling out to Perl?\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ec is nice because there\u0026rsquo;s no hidden costs, you see every malloc and free,\nand know that the standard library doesn\u0026rsquo;t do shenanigans behind your back\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre\u003e\u003ccode\u003echar *cmd = \u0026quot;/usr/bin/perl -e 'print join(chr(0), @ARGV), chr(0)' -- \u0026quot;;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/steveklabnik/status/1622307745138446337\"\u003ehttps://twitter.com/steveklabnik/status/1622307745138446337\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI decided to sign up for \u003ca href=\"https://railsdevs.com\"\u003eRailsDevs\u003c/a\u003e account. I have no idea on whether it\nwill be effective. We\u0026rsquo;ll see. I noticed that there was nowhere to enter my\nMastodon handle, so I \u003ca href=\"https://github.com/joemasilotti/railsdevs.com/pull/778\"\u003esubmitted a PR\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/siaw23/status/1623053158774611991\"\u003eExplain your queries with Rails 7.1\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFrontend drama, \u003ca href=\"https://infrequently.org/2023/02/the-market-for-lemons/\"\u003eAlex Russell\u0026rsquo;s The Market for Lemons\u003c/a\u003e, a scathing evaluation\nof frontend frameworks (\u003cem\u003eahem\u003c/em\u003e, React), and Seldo\u0026rsquo;s rebuttal, \u003ca href=\"https://seldo.com/posts/the_case_for_frameworks\"\u003eThe case for\nframeworks\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eConsider writing your \u003ca href=\"https://github.com/orgs/community/discussions/8518#discussioncomment-4867611\"\u003efeature request as a poem\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNot a lot of work on \u003ccode\u003ereceiptgo\u003c/code\u003e, \u003cem\u003eshock\u003c/em\u003e. I have a list of features I want to\nbuild, but not a great deal of motivation. Saying that, I might have figured\nout how to move it forward, and I did do a bit of code reorganisation.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/evilmartians/evil-seed\"\u003eEvilSeed\u003c/a\u003e looks potentially useful.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA Gem for creating partial anonymized dumps of your database using your app\nmodel relations.\u003c/p\u003e",
      "date_published": "2023-02-12T00:00:00+00:00",
      "date_modified": "2023-02-12T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/84-rewrite-it-in-rust/",
      "url": "https://elver.me/weeknotes/84-rewrite-it-in-rust/",
      "title": "Weeknotes 84: Rewrite it in Rust",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLast two working days this week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFish, my shell of choice, is being \u003ca href=\"https://github.com/fish-shell/fish-shell/pull/9512\"\u003ere-written in Rust\u003c/a\u003e. I think it\u0026rsquo;s hard to\nargue with \u003ca href=\"https://github.com/fish-shell/fish-shell/pull/9512#issuecomment-1410820102\"\u003etheir reasoning\u003c/a\u003e as popular as it is to complain about \u0026ldquo;everything\nbeing re-written in Rust\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThere was an interesting discussion about USB-C power delivery standards on\n\u003ca href=\"https://atp.fm/520\"\u003eATP this week\u003c/a\u003e. Specifically why USB-C charging does and does not work in\ndifferent scenarios.\u003c/p\u003e\n\u003cp\u003eWorth a listen if, like me, you find the various peculiarities confusing.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.akshaykhot.com/ruby-difference-nested-modules-syntax/\"\u003eNested Modules in Ruby\u003c/a\u003e \u0026ndash; Ruby modules defined in two different ways do\n\u003cem\u003enot\u003c/em\u003e have identical behaviour. In my experience Rubyists often don\u0026rsquo;t know\nthis, which is bad.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Neovim content you crave is back!\u003c/p\u003e\n\u003cp\u003eBind \u003ccode\u003e\u0026lt;leader\u0026gt;fmc\u003c/code\u003e (find my commits) to fuzzily find \u003cem\u003emy\u003c/em\u003e Git commits only.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.keymap.set(\u003cspan style=\"color:#d14\"\u003e\u0026#39;n\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;\u0026lt;Leader\u0026gt;fmc\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e ()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    require(\u003cspan style=\"color:#d14\"\u003e\u0026#34;telescope.builtin\u0026#34;\u003c/span\u003e).git_commits({ git_command \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e { \u003cspan style=\"color:#d14\"\u003e\u0026#34;git\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;log\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;--pretty=oneline\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;--abbrev-commit\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;--author=Joe Blogs\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;--\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;.\u0026#34;\u003c/span\u003e }})\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e, { noremap \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e })\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI\u0026rsquo;ve been using this to figure out wtf I\u0026rsquo;ve been doing for the last two years.\nYes, updating my CV.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy car was not content with the thousands of pounds spent on it recently. It\ndecided to develop the most annoying rattle under the glovebox which was\nextremely annoying, and also difficult to pinpoint. It was seriously driving\nme nuts. Just when I thought it was gone it would come back.\u003c/p\u003e\n\u003cp\u003eI decided to start taking small parts of car apart myself to try and fix it\nafter completely losing faith in the \u0026ldquo;professionals\u0026rdquo; who I\u0026rsquo;ve been dealing\nwith recently.\u003c/p\u003e\n\u003cp\u003eWell, would you believe it, I think it\u0026rsquo;s fixed.\u003c/p\u003e\n\u003cp\u003eThe culprit was a bolt not done up tight enough behind the glovebox. Probably\nleft slack by the aforementioned pros. I pray it stays fixed.\u003c/p\u003e\n\u003cp\u003eThe greatest achievement of the week. By far.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe macOS WhatsApp I \u003ca href=\"/weeknotes/83-rusty-programmer/\"\u003ementioned recently\u003c/a\u003e is working well for me. A few\nfeatures missing, but does almost everything I need and hovers around 90MB.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSPOILER\u003c/strong\u003e The \u003ca href=\"https://www.imdb.com/title/tt3581920/\"\u003emost recent\u003c/a\u003e \u003ca href=\"https://www.imdb.com/title/tt3581920/\"\u003eThe Last Of Us\u003c/a\u003e episode has really cemented how\ngreat the show is. The acting performances were something else. I\u0026rsquo;ve seen\nnothing but praise for this episode, and yet it only garners a 7.9 on IMDB\nwhilst the previous two episodes both get 9.2. I think we know why.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe new \u003ca href=\"https://www.youtube.com/watch?v=GOjV01brFQg\"\u003eBackground Tool in CleanShot 4.5\u003c/a\u003e looks great.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/kdeldycke/awesome-falsehood\"\u003eAwesome Falsehood\u003c/a\u003e \u0026ndash; I\u0026rsquo;m linking this to hopefully remember it!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA curated list of falsehoods programmers believe in.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis should be mandatory reading for every programmer who says they can\nvalidate an email address \u0026ndash; I\u0026rsquo;m so sick of having that conversation.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://zverok.space\"\u003eVictor Shepelev\u003c/a\u003e continues to do great work maintaining \u003ca href=\"https://rubyreferences.github.io/rubychanges/\"\u003eRuby Changes\u003c/a\u003e by\nwriting up the \u003ca href=\"https://rubyreferences.github.io/rubychanges/3.2.html\"\u003echanges for Ruby 3.2\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThere are a tons of changes listed, and they don\u0026rsquo;t even include the big YJIT\nstuff that\u0026rsquo;s been happening recently, but the change that stood out for me was\nthe addition \u003ca href=\"https://bugs.ruby-lang.org/issues/18822\"\u003e\u003ccode\u003eCGI.escapeURIComponent\u003c/code\u003e to the standard library\u003c/a\u003e which is very\nwelcome, but baffling.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLast two working days this week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFish, my shell of choice, is being \u003ca href=\"https://github.com/fish-shell/fish-shell/pull/9512\"\u003ere-written in Rust\u003c/a\u003e. I think it\u0026rsquo;s hard to\nargue with \u003ca href=\"https://github.com/fish-shell/fish-shell/pull/9512#issuecomment-1410820102\"\u003etheir reasoning\u003c/a\u003e as popular as it is to complain about \u0026ldquo;everything\nbeing re-written in Rust\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThere was an interesting discussion about USB-C power delivery standards on\n\u003ca href=\"https://atp.fm/520\"\u003eATP this week\u003c/a\u003e. Specifically why USB-C charging does and does not work in\ndifferent scenarios.\u003c/p\u003e\n\u003cp\u003eWorth a listen if, like me, you find the various peculiarities confusing.\u003c/p\u003e",
      "date_published": "2023-02-05T00:00:00+00:00",
      "date_modified": "2023-02-05T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/83-rusty-programmer/",
      "url": "https://elver.me/weeknotes/83-rusty-programmer/",
      "title": "Weeknotes 83: Rusty programmer",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI took myself to see \u003ca href=\"https://www.imdb.com/title/tt14402146/\"\u003eEmpire of Light\u003c/a\u003e on Thursday. I thought it was\nabsolutely wonderful and really enjoyed it. I\u0026rsquo;m surprised it didn\u0026rsquo;t get a\nhigher rating on IMDB. Olivia Coleman was great as always but everyone put in\na great performance.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been enjoying \u003ca href=\"https://www.imdb.com/title/tt3581920/\"\u003eThe Last Of Us\u003c/a\u003e TV adaption.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://tapbots.com/\"\u003eTapbots\u003c/a\u003e have released their much anticipated \u003ca href=\"https://tapbots.com/ivory/\"\u003eMastodon client Ivory\u003c/a\u003e. This\nmight actually finally get me using Mastodon. Twitter has been all kinds of\nbroken for me the last few weeks.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe new \u003ca href=\"https://faq.whatsapp.com/451924530376167/\"\u003eWhatsApp for macOS\u003c/a\u003e is \u003ca href=\"https://www.theverge.com/2023/1/24/23568872/whatsapp-macos-catalyst-app-ipad\"\u003eavailable in beta\u003c/a\u003e. I gave up on their\nhorrendous Electron app some time ago so I hope this is better.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpent a while trying to justify the purchase of a rice cooker. It pays for\nitself in under a year!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/82-man-in-the-middle/\"\u003eLast week I set myself a challenge\u003c/a\u003e to complete the MVP of a side project in\none week. Because of the condensed time frame I needed to be quite strict on\nwhat was achievable. Mostly to not overwhelm myself, which is a problem.\u003c/p\u003e\n\u003cp\u003eI use the RingGo parking mobile app regularly and often need to download the\nreceipts afterwards. Their app only lets you download a single receipt at a\ntime. This is tedious and time-consuming. So I wanted to build something that\ncould download more than one receipt at a time.\u003c/p\u003e\n\u003cp\u003eEnter \u003ca href=\"https://github.com/jordelver/receiptgo\"\u003ereceiptgo\u003c/a\u003e, a command line app written in Rust.\u003c/p\u003e\n\u003cp\u003eIn it\u0026rsquo;s current state you can authenticate with RingGo and download the latest\n5 receipts in one go. The basics are in place.\u003c/p\u003e\n\u003cp\u003eI remembered more Rust than I anticipated I would, but I\u0026rsquo;m sure an experienced\nRust programmer would shudder at some of the code.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s not quite at the usable stage for me at the moment. That\u0026rsquo;s mostly because\nI\u0026rsquo;m not really sure how I want to use it. Do I want it to be fully automatic\nor more manual and interactive?\u003c/p\u003e\n\u003cp\u003eRegardless, I plan on improving it, and I\u0026rsquo;m pretty happy that I mostly\nachieved my aim.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://brightonruby.com/\"\u003eBrighton Ruby\u003c/a\u003e conference are already selling tickets! I go every year so I\nwent ahead and bought one. June 30th 2023 \u0026ndash; save the date. Something to look\nforward to.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTwo more days of work next week\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI took myself to see \u003ca href=\"https://www.imdb.com/title/tt14402146/\"\u003eEmpire of Light\u003c/a\u003e on Thursday. I thought it was\nabsolutely wonderful and really enjoyed it. I\u0026rsquo;m surprised it didn\u0026rsquo;t get a\nhigher rating on IMDB. Olivia Coleman was great as always but everyone put in\na great performance.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been enjoying \u003ca href=\"https://www.imdb.com/title/tt3581920/\"\u003eThe Last Of Us\u003c/a\u003e TV adaption.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://tapbots.com/\"\u003eTapbots\u003c/a\u003e have released their much anticipated \u003ca href=\"https://tapbots.com/ivory/\"\u003eMastodon client Ivory\u003c/a\u003e. This\nmight actually finally get me using Mastodon. Twitter has been all kinds of\nbroken for me the last few weeks.\u003c/p\u003e",
      "date_published": "2023-01-29T00:00:00+00:00",
      "date_modified": "2023-01-29T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/82-man-in-the-middle/",
      "url": "https://elver.me/weeknotes/82-man-in-the-middle/",
      "title": "Weeknotes 82: Man In The Middle",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jessitron.com/2022/12/19/import-utility-from-stackoverflow/\"\u003eimport { utility} from StackOverflow\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen you want a simple utility function that isn’t part of the standard\nlibrary, what do you do?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ePractical, pragmatic, advice from Jessitron.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theredhandfiles.com/chat-gpt-what-do-you-think/\"\u003eNick Cave is not a fan of\u003c/a\u003e \u003ca href=\"https://openai.com/blog/chatgpt/\"\u003eChatGPT\u003c/a\u003e for songwriting.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;with all the love and respect in the world, this song is bullshit, a\ngrotesque mockery of what it is to be human\u0026hellip;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m feeling increasingly overwhelmed with pretty much everything at the\nmoment. The car troubles that seem to have been dominating my life recently\n\u003cem\u003eseem\u003c/em\u003e to be fixed, but even typing that feels like tempting fate.\u003c/p\u003e\n\u003cp\u003eThe week started badly, but did get gradually better, and ended well. So\nthere\u0026rsquo;s that.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy podcast listening library is expanding again. It\u0026rsquo;s not sustainable\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.bbc.co.uk/programmes/b07ktd2g/episodes/downloads\"\u003eDavid Baddiel Tries To Understand\u003c/a\u003e is lighthearted and interesting listen.\nBut most importantly, usually around 15 minutes. A breath of fresh air in a\nsea of 2+ hour podcasts I\u0026rsquo;m already subscribed to.\u003c/p\u003e\n\u003cp\u003eA reincarnation of their Fan Club podcast, \u003ca href=\"https://twitter.com/TheNickHelm\"\u003eNick Helm\u003c/a\u003e and \u003ca href=\"https://twitter.com/NatMetcalfe\"\u003eNathanial\nMetcalfe\u003c/a\u003e\u0026rsquo;s \u003ca href=\"https://shows.acast.com/the-jcas-present-nick-nat-consume-and-obey\"\u003eConsume and Obey\u003c/a\u003e launched over Christmas. I\u0026rsquo;m glad to have them\nback. It\u0026rsquo;s as chaotic and rambling as ever. And I love it for that.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theregister.com/2023/01/16/basecamp_37signals_cloud_bill/\"\u003e\u0026ldquo;Basecamp details \u0026lsquo;obscene\u0026rsquo; $3.2 million bill that caused it to quit the cloud\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/dhh/status/1613508201953038337\"\u003eDHH on Basecamp\u0026rsquo;s AWS spend\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe spent $3,201,564.24 on cloud in 2022 at @37signals , mostly AWS.\n$907,837.83 on S3. $473,196.30 on RDS. $519,959.60 on OpenSearch.\n$123,852.30 on Elasticache.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd, \u003ca href=\"https://twitter.com/dhh/status/1613558939760689153\"\u003ehe compares it to buying their own hardware\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eContrast that with just this one example of insanely powerful iron you can\nbuy from Dell.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNot really comparing apples with apples though, is it. And conveniently leaves\nout the cost of the people.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWith the way Twitter\u0026rsquo;s going I\u0026rsquo;m really starting to regret linking to it so\noften.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy open source \u003ca href=\"https://github.com/nvim-telescope/telescope.nvim/pull/2341\"\u003econtributions\u003c/a\u003e continue to impress.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://mitmproxy.org\"\u003e\u003ccode\u003emitmproxy\u003c/code\u003e\u003c/a\u003e is \u003cem\u003every\u003c/em\u003e cool. I had it setup and inspecting traffic coming\nfrom my iPhone in minutes. It\u0026rsquo;s capable of much more but the basics were great\nfor me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhich brings me to my latest side project. Will I complete this one? I\u0026rsquo;m\n\u003cem\u003ereally\u003c/em\u003e going to try to complete the MVP \u003cem\u003ethis week\u003c/em\u003e. I believe the scope is\nsmall enough, but I\u0026rsquo;m probably already hampering my ability to do so by\ndeciding to write it in Rust. I will just have to accept working over good.\u003c/p\u003e\n\u003cp\u003eAsk me next Sunday whether I have achieved my goal.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jessitron.com/2022/12/19/import-utility-from-stackoverflow/\"\u003eimport { utility} from StackOverflow\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen you want a simple utility function that isn’t part of the standard\nlibrary, what do you do?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ePractical, pragmatic, advice from Jessitron.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theredhandfiles.com/chat-gpt-what-do-you-think/\"\u003eNick Cave is not a fan of\u003c/a\u003e \u003ca href=\"https://openai.com/blog/chatgpt/\"\u003eChatGPT\u003c/a\u003e for songwriting.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;with all the love and respect in the world, this song is bullshit, a\ngrotesque mockery of what it is to be human\u0026hellip;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m feeling increasingly overwhelmed with pretty much everything at the\nmoment. The car troubles that seem to have been dominating my life recently\n\u003cem\u003eseem\u003c/em\u003e to be fixed, but even typing that feels like tempting fate.\u003c/p\u003e",
      "date_published": "2023-01-22T00:00:00+00:00",
      "date_modified": "2023-01-22T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/81-platform-douchery/",
      "url": "https://elver.me/weeknotes/81-platform-douchery/",
      "title": "Weeknotes 81: Platform douchery",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFrom \u003ca href=\"https://twitter.com/kddnewton/status/1613225554236551168\"\u003eKevin Newton\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn Ruby, the expression in the rescue clause that captures a variable can be\na method call. That method call doesn\u0026rsquo;t actually need to exist though,\nbecause it automatically has = appended to it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eCool.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you rebase a lot, like I do, then it worth reminding ourselves that you\ndon\u0026rsquo;t need to constantly change branch. I am in the habit of changing to\n\u003ccode\u003emain\u003c/code\u003e, getting all the new changes, then changing back, and finally rebasing.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBefore\u003c/strong\u003e (from branch \u003ccode\u003efeature_a\u003c/code\u003e)\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit stash\ngit checkout main\ngit pull\ngit checkout feature_a\ngit rebase main\ngit stash pop\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis isn\u0026rsquo;t necessary.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAfter\u003c/strong\u003e (from branch \u003ccode\u003efeature_a\u003c/code\u003e)\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit fetch origin main\ngit stash\ngit rebase origin/main\ngit stash pop\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou don\u0026rsquo;t need to change branch to rebase.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was working on direct-to-S3 uploads this week, something I\u0026rsquo;ve never done\nbefore. I didn\u0026rsquo;t want to touch the production Amazon AWS account whilst doing\nso because these things often require a lot of tweaking, and then you don\u0026rsquo;t\nhave the correct permissions\u0026hellip;blah.\u003c/p\u003e\n\u003cp\u003eInstead, I installed \u003ca href=\"https://en.wikipedia.org/wiki/MinIO\"\u003eMinIO\u003c/a\u003e, an S3 API compatible storage server and pointed\nmy app at that. It was up and running in no time using a simple \u003ccode\u003ebrew install minio/stable/minio\u003c/code\u003e and comes with an easy-to-use web console. I\u0026rsquo;m going to\nkeep it in-mind for future testing, perhaps including automated tests that\nneed to hit a real server.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn yet another of douchery Musk seems to have \u003ca href=\"https://daringfireball.net/linked/2023/01/14/information-twitter-slack-confirmation\"\u003estopped third party clients\nworking with the platform\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBut pulling the plug on these clients and ghosting everyone on\ncommunications about it is so absurdly disrespectful. Zero respect for the\nusers for those apps, zero respect for the developers behind them — many of\nwhom had been building on the Twitter platform for 10-15 years\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBut, Tapbots are working on a Mastodon client called \u003ca href=\"https://tapbots.com/ivory/\"\u003eIvory\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eKevin Chen wrote a \u003ca href=\"https://kevinchen.co/blog/rewind-ai-app-teardown/\"\u003every thorough breakdown of how Rewind works\u003c/a\u003e. Apple have\ndone a \u003cem\u003elot\u003c/em\u003e of the heavy lifting with their clever built-in APIs. Interesting\nhow a statically linked \u003ccode\u003effmpeg\u003c/code\u003e is included. \u003ccode\u003effmpeg\u003c/code\u003e is everywhere. The\namount of businesses built on Bash scripts calling \u003ccode\u003effmpeg\u003c/code\u003e is far greater\nthan you\u0026rsquo;d imagine.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.reddit.com/r/programming/comments/10asxy6/comment/j476ike/\"\u003eProgramming Interviews Turn Normal People into A-Holes\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe problem with programming interviews is every asshole programmer thinks\nthey know how to conduct one well with no training or forethought.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe were away in Madrid in the later part of the week. In fact, I\u0026rsquo;m writing\nthis in the airport waiting to fly home.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFrom \u003ca href=\"https://twitter.com/kddnewton/status/1613225554236551168\"\u003eKevin Newton\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn Ruby, the expression in the rescue clause that captures a variable can be\na method call. That method call doesn\u0026rsquo;t actually need to exist though,\nbecause it automatically has = appended to it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eCool.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you rebase a lot, like I do, then it worth reminding ourselves that you\ndon\u0026rsquo;t need to constantly change branch. I am in the habit of changing to\n\u003ccode\u003emain\u003c/code\u003e, getting all the new changes, then changing back, and finally rebasing.\u003c/p\u003e",
      "date_published": "2023-01-15T00:00:00+00:00",
      "date_modified": "2023-01-15T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/80-if-err-nil/",
      "url": "https://elver.me/weeknotes/80-if-err-nil/",
      "title": "Weeknotes 80: if err != nil",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis was the best \u0026ldquo;back to work\u0026rdquo; after Christmas that I\u0026rsquo;ve had in a while.\nChiefly because I was only working 3 days. What a difference. Two days a week\nfor the rest of January, I could get used to this. But it can\u0026rsquo;t last,  I\u0026rsquo;ll be\nlooking to start something new in February or March. Spread the word!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL You can subscribe to Google Alerts using RSS 👌\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGo has never appealed to me. All that \u003ccode\u003eif err != nil\u003c/code\u003e business in a supposedly\nmodern language. However, it is very popular and I have considered learning it\nfor that reason.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://fasterthanli.me/about\"\u003eAmos\u003c/a\u003e has written an interesting follow up, \u003ca href=\"https://fasterthanli.me/articles/lies-we-tell-ourselves-to-keep-using-golang\"\u003eLies we tell ourselves to keep\nusing Golang\u003c/a\u003e, to \u003ca href=\"https://fasterthanli.me/articles/i-want-off-mr-golangs-wild-ride\"\u003eI want off Mr. Golang\u0026rsquo;s Wild Ride\u003c/a\u003e and it is very\ncompelling. I don\u0026rsquo;t understand all of the technical details, but his\nobservations on the arguments people make to dismiss any criticism of Go are\nright on.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen you don\u0026rsquo;t want to hear something, one easy way to not have to think\nabout it at all is to convince yourself that whoever is saying it is\nincompetent, or that they have ulterior motives.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI copied a lot of the \u003ca href=\"https://github.com/nvim-lua/kickstart.nvim/\"\u003ekickstart.nvim config\u003c/a\u003e that I \u003ca href=\"/weeknotes/78-ho-ho-ho/\"\u003efound the other day\u003c/a\u003e. It\nwas fairly straight forward to setup, but if I\u0026rsquo;m honest I\u0026rsquo;m now left with\nquite an overwhelming learning curve. I will need to learn and tweak to get\nthe most out of it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://apps.apple.com/app/apple-store/id1504940162\"\u003eRocketSim for Xcode Simulator\u003c/a\u003e \u0026ndash; this is interesting, a third party iOS\nsimulator. I don\u0026rsquo;t have the need for the simulator an awful lot but I was\nintrigued at this being offered outside of Apple. Might be worth a look if you\nuse the Simulator a lot.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI know WhatsApp is not most secure messaging app, but I still find it the best\napp to \u003cem\u003euse\u003c/em\u003e, and the majority of people I message still favour it. It can\nonly be positive that Meta have \u003ca href=\"https://blog.whatsapp.com/connecting-to-whatsapp-by-proxy\"\u003eintroduced proxy support\u003c/a\u003e for people who live\nunder oppressive regimes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFor those who want an Apple Display but can\u0026rsquo;t stomach Apple\u0026rsquo;s pricing take a\nlook at these two serious alternatives from \u003ca href=\"https://www.macrumors.com/2023/01/02/ces-2023-samsung-monitors/\"\u003eSamsung with their ViewFinity S9\u003c/a\u003e\nand \u003ca href=\"https://www.macrumors.com/2023/01/04/dell-6k-inch-take-on-pro-display-xdr/\"\u003eDell\u003c/a\u003e with the \u003ca href=\"https://www.dell.com/en-us/blog/dell-technologies-introduces-more-world-s-first-s-collaboration-tools/\"\u003eUltraSharp 32 6K\u003c/a\u003e. Pricing has not yet been announced,\nbut they surely can\u0026rsquo;t be more than Apple\u0026rsquo;s offerings.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/23543094/creative-sim-wong-hoo-sound-blaster-obituary-death\"\u003eCreative founder Sim Wong Hoo, the man behind Sound Blaster, has died\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt might seem hard for younger readers to believe, but there was a time that\ncomputer sound wasn’t guaranteed. If you wanted to plug in headphones or\nspeakers that could do more than bloops or bleeps, you probably needed a\nsound card.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe Sound Blaster was a big deal back in the day.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://daringfireball.net/linked/2023/01/06/swedish-car-button-study\"\u003eStudy suggests that hardware buttons in cars are safer and quicker to use\nthan touchscreens\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI am nearly certain that everyone knows this is true, especially the\ndesigners at car companies. The reason that cars are largely switching to\nmostly touchscreen controls is the same reason phones switched — software is\nmore flexible than hardware. Cars today do more than cars from 2005 did. But\nin the same way that all phones still have some hardware buttons (volume,\npower, mute), cars should too. The trick is getting the balance right. \u003cstrong\u003eA\ncouple of recent cars I’ve driven have definitely gotten that balance\nwrong.\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWould you like to read a long and interesting thread about \u003ca href=\"https://www.imdb.com/title/tt0082198/\"\u003eConan The\nBarbarian\u003c/a\u003e? \u003ca href=\"https://twitter.com/hradzka/status/1611489902570639361\"\u003eWell, you\u0026rsquo;re in luck.\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis was the best \u0026ldquo;back to work\u0026rdquo; after Christmas that I\u0026rsquo;ve had in a while.\nChiefly because I was only working 3 days. What a difference. Two days a week\nfor the rest of January, I could get used to this. But it can\u0026rsquo;t last,  I\u0026rsquo;ll be\nlooking to start something new in February or March. Spread the word!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL You can subscribe to Google Alerts using RSS 👌\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGo has never appealed to me. All that \u003ccode\u003eif err != nil\u003c/code\u003e business in a supposedly\nmodern language. However, it is very popular and I have considered learning it\nfor that reason.\u003c/p\u003e",
      "date_published": "2023-01-08T00:00:00+00:00",
      "date_modified": "2023-01-08T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/79-nothing-much-going-on/",
      "url": "https://elver.me/weeknotes/79-nothing-much-going-on/",
      "title": "Weeknotes 79: Nothing much going on",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.karlsutt.com/articles/communicating-effectively-as-a-developer/\"\u003eHow to communicate effectively as a developer\u003c/a\u003e is really great (via \u003ca href=\"https://chriscoyier.net/2022/12/28/watch-out-for-low-resolution-writing/\"\u003eChris\nCoyier\u003c/a\u003e).\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCommunicating effectively as an engineer means empathically increasing the\nresolution of your writing.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eEmpathy is often lacking in the workplace.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI saw \u003ca href=\"https://www.imdb.com/title/tt1630029/\"\u003eAvatar: The Way of Water\u003c/a\u003e on Boxing Day, which was visually stunning\nbut ultimately a bit boring. I fell asleep.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTenderlove wrote a \u003ca href=\"https://shopify.engineering/ruby-rails-year-in-review-2022\"\u003eYear in Review 2022\u003c/a\u003e for Ruby and Rails. Lots of\ninteresting improvements have made their way into Ruby this year. I\u0026rsquo;m\nparticularly interested to see the various developer experience improvements\nlike \u003ca href=\"https://github.com/ruby/error_highlight\"\u003e\u003ccode\u003eerror_highlight\u003c/code\u003e\u003c/a\u003e (and \u003ca href=\"https://github.com/rails/rails/pull/45818/\"\u003eintegration with Rails\u003c/a\u003e) and \u003ca href=\"https://github.com/shopify/ruby-lsp\"\u003eRuby LSP\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theguardian.com/commentisfree/2022/dec/27/wood-burning-stove-environment-home-toxins\"\u003eMy burning shame: I fitted my house with three wood-burning stoves\u003c/a\u003e \u0026ndash; You\nmight want to reconsider that wood burning stove.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNothing much going on between Christmas and New Year as you\u0026rsquo;d expect. In the\nlead up to 10 days off I had many ideas about all the productive things I\nwould do. Instead, I sat and watched telly, doomscrolled, and worried. Good\ntimes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBring on 2023, I suppose.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.karlsutt.com/articles/communicating-effectively-as-a-developer/\"\u003eHow to communicate effectively as a developer\u003c/a\u003e is really great (via \u003ca href=\"https://chriscoyier.net/2022/12/28/watch-out-for-low-resolution-writing/\"\u003eChris\nCoyier\u003c/a\u003e).\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCommunicating effectively as an engineer means empathically increasing the\nresolution of your writing.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eEmpathy is often lacking in the workplace.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI saw \u003ca href=\"https://www.imdb.com/title/tt1630029/\"\u003eAvatar: The Way of Water\u003c/a\u003e on Boxing Day, which was visually stunning\nbut ultimately a bit boring. I fell asleep.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTenderlove wrote a \u003ca href=\"https://shopify.engineering/ruby-rails-year-in-review-2022\"\u003eYear in Review 2022\u003c/a\u003e for Ruby and Rails. Lots of\ninteresting improvements have made their way into Ruby this year. I\u0026rsquo;m\nparticularly interested to see the various developer experience improvements\nlike \u003ca href=\"https://github.com/ruby/error_highlight\"\u003e\u003ccode\u003eerror_highlight\u003c/code\u003e\u003c/a\u003e (and \u003ca href=\"https://github.com/rails/rails/pull/45818/\"\u003eintegration with Rails\u003c/a\u003e) and \u003ca href=\"https://github.com/shopify/ruby-lsp\"\u003eRuby LSP\u003c/a\u003e.\u003c/p\u003e",
      "date_published": "2023-01-01T00:00:00+00:00",
      "date_modified": "2023-01-01T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/78-ho-ho-ho/",
      "url": "https://elver.me/weeknotes/78-ho-ho-ho/",
      "title": "Weeknotes 78: Ho, Ho, Ho",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about \u003ca href=\"https://dhall-lang.org/\"\u003ethe Dhall configuration language\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn \u0026ldquo;that\u0026rsquo;s a lot of data\u0026rdquo; \u003ca href=\"https://www.thinkbroadband.com/news/9404-new-record-for-traffic-over-openreach-network-on-sunday-11th-december-2022\"\u003enews\u003c/a\u003e\u0026hellip;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe new record of 229 PetaBytes of data transferred during the day is 7\nPetaBytes higher than the previous record set on Sunday 5th December 2021,\nso a year and a week ago.\u003c/p\u003e\n\u003cp\u003eThis is traffic across the Openreach network so includes a mixture of\ntechnologies such as VDSL2, G.fast and FTTP and a large group of ISP the\nlargest of which are BT, Sky, TalkTalk, Vodafone and Zen Internet.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Ruby and Rails world is heavily library-focussed via Rubygems. That is, we\nhave a requirement, and we tend to reach for a library which meets it and\neverything is handled \u003cem\u003ewithin\u003c/em\u003e the library.\u003c/p\u003e\n\u003cp\u003eOther ecosystems, like Elixir, are less focussed on libraries to do everything\noften just providing generators to get your started. Once you\u0026rsquo;ve generated the\ncode it\u0026rsquo;s up to you to maintain it, but in exchange you deal with less magic\nand version upgrade problems.\u003c/p\u003e\n\u003cp\u003eThat\u0026rsquo;s why \u003ca href=\"https://codewithrails.com/rails-authentication\"\u003eA better way to handle user authentication in Rails\u003c/a\u003e is\ninteresting. It too follows the \u0026ldquo;we\u0026rsquo;ll generate it for you\u0026rdquo; approach and\nrelies upon a lot of the build-in Rails helpers to do so.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/garybernhardt/status/1605634916653289472\"\u003e\u0026ldquo;Caching is frequently a lie\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIncidentally, we recently stopped caching node_modules in Heroku. That sped\ndeploys up by a full minute. On Heroku, saving/restoring node_modules\nto/from cache takes 2-3x as long as just installing everything from scratch.\nCaching is frequently a lie.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s often assumed that caching will automatically makes things faster but\nthat is not always the case.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTJ Devries made \u003ca href=\"https://www.youtube.com/watch?v=stqUbv-5u2s\"\u003eEffective Neovim: Instant IDE\u003c/a\u003e which introduces\n\u003ca href=\"https://github.com/nvim-lua/kickstart.nvim\"\u003ekickstart.nvim\u003c/a\u003e, a \u0026ldquo;A starting point for Neovim\u0026rdquo;. A lot of good stuff to\nlearn from.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRuby 3.2, \u003ca href=\"https://www.ruby-lang.org/en/news/2022/12/25/ruby-3-2-0-released/\"\u003ereleased today\u003c/a\u003e, \u003ca href=\"https://twitter.com/paracycle/status/1605706226007941122\"\u003ehas been running at Shopify\u003c/a\u003e and the performance\nimprovements are impressive.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe headline feature that we\u0026rsquo;re all very excited about is YJIT. The YJIT\nversion in Ruby 3.2 is now labeled as production-ready, since we\u0026rsquo;ve been\nable to solve the biggest production drawback, which was the large memory\noverhead of the previous YJIT release.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMerry Christmas!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about \u003ca href=\"https://dhall-lang.org/\"\u003ethe Dhall configuration language\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn \u0026ldquo;that\u0026rsquo;s a lot of data\u0026rdquo; \u003ca href=\"https://www.thinkbroadband.com/news/9404-new-record-for-traffic-over-openreach-network-on-sunday-11th-december-2022\"\u003enews\u003c/a\u003e\u0026hellip;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe new record of 229 PetaBytes of data transferred during the day is 7\nPetaBytes higher than the previous record set on Sunday 5th December 2021,\nso a year and a week ago.\u003c/p\u003e\n\u003cp\u003eThis is traffic across the Openreach network so includes a mixture of\ntechnologies such as VDSL2, G.fast and FTTP and a large group of ISP the\nlargest of which are BT, Sky, TalkTalk, Vodafone and Zen Internet.\u003c/p\u003e",
      "date_published": "2022-12-25T00:00:00+00:00",
      "date_modified": "2022-12-25T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/77-compiler-collaboration/",
      "url": "https://elver.me/weeknotes/77-compiler-collaboration/",
      "title": "Weeknotes 77: Compiler collaboration",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis video - \u003ca href=\"https://www.youtube.com/watch?v=CJtvnepMVAU\"\u003eRust Is Easy (The COMPILER teaches you!)\u003c/a\u003e - makes a\ngood point about just how good the Rust compiler is. Saying that, I still\ndon\u0026rsquo;t know what to do most of the time!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://til.hashrocket.com/posts/aoulxej8zd-ruby-memoization-with-nil-values\"\u003eRuby memoization with nil values\u003c/a\u003e. Sprinkling \u003ccode\u003e||=\u003c/code\u003e around your codebase with\nwild abandon might not be doing what you think.\u003c/p\u003e\n\u003cp\u003eFor my own benefit, I\u0026rsquo;ll copy the example here.\u003c/p\u003e\n\u003cp\u003eInstead of.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003eticket\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#008080\"\u003e@ticket\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e||=\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eTicket\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efind_by(\u003cspan style=\"color:#990073\"\u003eowner\u003c/span\u003e:)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYou might need.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003eticket\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003e@ticket\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e defined?(\u003cspan style=\"color:#008080\"\u003e@ticket\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#008080\"\u003e@ticket\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eTicket\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efind_by(\u003cspan style=\"color:#990073\"\u003eowner\u003c/span\u003e:)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://kobrakai.de/kolumne/one-to-many-liveview-form\"\u003eOne-to-Many LiveView Form\u003c/a\u003e \u0026ndash; great tips on implementing dynamic one-to-many\nforms with LiveView. Unfortunately a bit late for me as I\u0026rsquo;ve been doing\nsomething similar, but some useful tips nonetheless.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.jim-nielsen.com/2022/what-work-looks-like/\"\u003eWhat “Work” Looks Like\u003c/a\u003e and \u003ca href=\"https://paulitaylor.com/2022/05/06/the-case-against-collaboration/\"\u003eThe Case Against Collaboration\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe idea that collaboration is the absolute best way to work is pervasive. You\ncan understand why, it just \u003cem\u003esounds\u003c/em\u003e like the right thing to do. But not\nalways. Agreeing with \u003cem\u003eany\u003c/em\u003e of this article feels like heresy. Should it?\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIntroverts have some of the best ideas but often don’t feel very comfortable\ntalking openly about them in a group setting.\u003c/p\u003e\n\u003cp\u003eExtroverts are only too willing to share their ideas (in fact they rarely\nshut up about them) but are sometimes reluctant to listen to good ideas\nproposed by others.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMany thoughtful points on what \u0026ldquo;collaboration\u0026rdquo; is.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s not been a great week to be honest. Car repair-related stress, general\nlow mood, and work anxiety all culminating in catching a cold (I think?!)\nwhich took me out of action for most of the week. Motivation is also an issue\nin this run up to Christmas.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis video - \u003ca href=\"https://www.youtube.com/watch?v=CJtvnepMVAU\"\u003eRust Is Easy (The COMPILER teaches you!)\u003c/a\u003e - makes a\ngood point about just how good the Rust compiler is. Saying that, I still\ndon\u0026rsquo;t know what to do most of the time!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://til.hashrocket.com/posts/aoulxej8zd-ruby-memoization-with-nil-values\"\u003eRuby memoization with nil values\u003c/a\u003e. Sprinkling \u003ccode\u003e||=\u003c/code\u003e around your codebase with\nwild abandon might not be doing what you think.\u003c/p\u003e\n\u003cp\u003eFor my own benefit, I\u0026rsquo;ll copy the example here.\u003c/p\u003e\n\u003cp\u003eInstead of.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003eticket\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#008080\"\u003e@ticket\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e||=\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eTicket\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efind_by(\u003cspan style=\"color:#990073\"\u003eowner\u003c/span\u003e:)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYou might need.\u003c/p\u003e",
      "date_published": "2022-12-18T00:00:00+00:00",
      "date_modified": "2022-12-18T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/76-a-heart-that-works/",
      "url": "https://elver.me/weeknotes/76-a-heart-that-works/",
      "title": "Weeknotes 76: A Heart That Works",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA slightly shorter week again. Away at the weekend visiting family.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI watched my first two Christmas films of year \u0026ndash; \u003ca href=\"https://www.imdb.com/title/tt12003946/\"\u003eViolent Night\u003c/a\u003e, and \u003ca href=\"https://www.imdb.com/title/tt13623136/\"\u003eThe\nGuardians of the Galaxy: Holiday Special\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI enjoyed them both, but David Harbour in Violent Night does a great job of\nbeing a jaded Santa Claus.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s that time of year again \u0026ndash; \u003ca href=\"https://adventofcode.com\"\u003eAdvent of Code\u003c/a\u003e. The code required for Advent\nof Code is so far removed from the code I write daily. I don\u0026rsquo;t know what that\nsays. Nothing I write at \u0026ldquo;work\u0026rdquo; approaches \u0026ldquo;algorithm\u0026rdquo;. Maybe it should.\u003c/p\u003e\n\u003cp\u003eI have enjoyed attempting Advent of Code in the past, but not sure I\u0026rsquo;m up for\nit this year.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI enjoyed \u003ca href=\"https://www.goodreads.com/book/show/61295403-a-heart-that-works\"\u003eA Heart That Works\u003c/a\u003e by Rob Delaney. It was brave, and funny, and\ntragic. I can\u0026rsquo;t even begin to imagine their pain.\u003c/p\u003e\n\u003cp\u003eIf you\u0026rsquo;re a parent, I would give it a miss.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI re-mapped the \u003ca href=\"https://twitter.com/raycastapp/status/1599433373042155520\"\u003eRaycast Emoji picker to the macOS default\u003c/a\u003e which is\n\u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eCmd\u003c/kbd\u003e + \u003ckbd\u003eSpace\u003c/kbd\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA reminder that there are \u003ca href=\"https://twitter.com/tobias_petry/status/1599656866392715265\"\u003edata types available\u003c/a\u003e specifically for \u003ca href=\"https://www.postgresql.org/docs/current/datatype-net-types.html\"\u003estoring IP\nand Mac addresses\u003c/a\u003e in Postgres (and other databases).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTerrible news this week that \u003ca href=\"https://chrisseaton.com\"\u003eChris Seaton\u003c/a\u003e, of \u003ca href=\"https://github.com/oracle/truffleruby\"\u003eTruffleRuby\u003c/a\u003e fame, has died.\n\u003ca href=\"http://tenderlovemaking.com/2022/12/07/in-memory-of-a-giant.html\"\u003eTenderlove\u003c/a\u003e and \u003ca href=\"https://blog.testdouble.com/posts/2022-12-07-the-best-kind-of-brilliant/\"\u003eSearls\u003c/a\u003e both wrote nice tributes. Such a shame.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://openai.com/blog/chatgpt/\"\u003eChatGPT\u003c/a\u003e is genuinely amazing. Yes, it probably can\u0026rsquo;t be trusted to be 100%\ncorrect, especially in terms of code correctness, but for generating ideas, or\njumping off points, it seems incredibly valuable.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA slightly shorter week again. Away at the weekend visiting family.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI watched my first two Christmas films of year \u0026ndash; \u003ca href=\"https://www.imdb.com/title/tt12003946/\"\u003eViolent Night\u003c/a\u003e, and \u003ca href=\"https://www.imdb.com/title/tt13623136/\"\u003eThe\nGuardians of the Galaxy: Holiday Special\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI enjoyed them both, but David Harbour in Violent Night does a great job of\nbeing a jaded Santa Claus.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s that time of year again \u0026ndash; \u003ca href=\"https://adventofcode.com\"\u003eAdvent of Code\u003c/a\u003e. The code required for Advent\nof Code is so far removed from the code I write daily. I don\u0026rsquo;t know what that\nsays. Nothing I write at \u0026ldquo;work\u0026rdquo; approaches \u0026ldquo;algorithm\u0026rdquo;. Maybe it should.\u003c/p\u003e",
      "date_published": "2022-12-11T00:00:00+00:00",
      "date_modified": "2022-12-11T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/75-court-et-doux/",
      "url": "https://elver.me/weeknotes/75-court-et-doux/",
      "title": "Weeknotes 75: Court et doux",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI still haven\u0026rsquo;t embraced Mastodon, but I do plan to.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ooh.directory/\"\u003eOoh.directory\u003c/a\u003e \u0026ndash; so delightfully old-school.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFor years I’ve seen people moan that “nobody blogs any more”, all while my\nfeed reader was overflowing with new blogposts I never had time to read. I\nwant to demonstrate that there are lots and lots of people blogging, about\nall kinds of subjects!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVia \u003ca href=\"https://daringfireball.net/linked/2022/12/01/ooh-directory\"\u003eDaring Fireball\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wish you could comment directly on Git commit messages in GitHub. In fact, I\nwish you could comment on code that hasn\u0026rsquo;t changed too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA short 3 day working week culminating in 4 days in Paris. Very nice. I\nhaven\u0026rsquo;t been to France in 20+ years, which is a bit weird when you think about\nit, given how close it is.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ll be changing my working pattern to part-time in January, so that should\nease me into the new year nicely.\u003c/p\u003e\n\u003cp\u003eThings to do: rest, focus on personal development, attend to my health.\u003c/p\u003e\n\u003cp\u003eThings \u003cem\u003enot\u003c/em\u003e to do: worry incessantly about never working again.\u003c/p\u003e\n\u003cp\u003eIf you need Ruby/Rails help from February let me know.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/blog/how-to-replace-a-failed-disk-in-a-zfs-mirror/\"\u003eMy blog post on replacing a failed drive in a ZFS storage pool\u003c/a\u003e helped out\n\u003ca href=\"https://twitter.com/Chris_0606/status/1597676742134890497\"\u003esomeone else\u003c/a\u003e. It\u0026rsquo;s nice when something you wrote down for yourself helps\nothers.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.reddit.com/r/neovim/comments/zb6lhb/highlighted_vimdoc_codeblocks_now_in_master/\"\u003eSyntax highlighting in vimdoc codeblocks\u003c/a\u003e in Neovim is cool.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI still haven\u0026rsquo;t embraced Mastodon, but I do plan to.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://ooh.directory/\"\u003eOoh.directory\u003c/a\u003e \u0026ndash; so delightfully old-school.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFor years I’ve seen people moan that “nobody blogs any more”, all while my\nfeed reader was overflowing with new blogposts I never had time to read. I\nwant to demonstrate that there are lots and lots of people blogging, about\nall kinds of subjects!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVia \u003ca href=\"https://daringfireball.net/linked/2022/12/01/ooh-directory\"\u003eDaring Fireball\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wish you could comment directly on Git commit messages in GitHub. In fact, I\nwish you could comment on code that hasn\u0026rsquo;t changed too.\u003c/p\u003e",
      "date_published": "2022-12-04T00:00:00+00:00",
      "date_modified": "2022-12-04T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/74-burnout-lag/",
      "url": "https://elver.me/weeknotes/74-burnout-lag/",
      "title": "Weeknotes 74: Burnout lag",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=ZBduBppB8r0\"\u003eAn Antidote to Burnout\u003c/a\u003e - be thankful. It\u0026rsquo;s so hard to remember this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI have been using Vim (and now Neovim) for Ruby on Rails development for many\nyears but I\u0026rsquo;ve never taken full advantage of \u003ca href=\"https://github.com/tpope/vim-rails\"\u003e\u003ccode\u003erails.vim\u003c/code\u003e\u003c/a\u003e even though it was\ninstalled the whole time.\u003c/p\u003e\n\u003cp\u003eThe concept of \u003ca href=\"https://github.com/tpope/vim-rails/blob/a6d2bac95b446a5c23eff4638eca164b0d77454a/doc/rails.txt#L93\"\u003ealternative and related files\u003c/a\u003e is very nice. Since having found\nfuzzy finders I\u0026rsquo;ve always relied upon them to open files, but actually, in a lot\nof cases files can be opened more easily using \u003ccode\u003erails.vim\u003c/code\u003e supplied functions\nlike \u003ccode\u003e:A\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe canonical example is opening a test related to the current file. This is\nsomething I do constantly, and that can now be replaced with \u003ccode\u003e:AV\u003c/code\u003e - open\nalternative file, the RSpec spec, in a vertical split - rather than opening\nthe fuzzer finder.\u003c/p\u003e\n\u003cp\u003eThe support it adds to \u003ccode\u003egf\u003c/code\u003e is also amazing. You can go from \u003ccode\u003ehas_many :items\u003c/code\u003e\nto \u003ccode\u003eapp/models/item.rb\u003c/code\u003e in two characters.\u003c/p\u003e\n\u003cp\u003eI plan to continue trying these out as I think they can improve my workflow a\nlot. Perhaps some new keybindings are in order once I get used to them.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"https://www.postgresqltutorial.com/postgresql-window-function/postgresql-lag-function/\"\u003e\u003ccode\u003eLAG\u003c/code\u003e\u003c/a\u003e Postgres function seems useful.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePostgreSQL LAG() function provides access to a row that comes before the\ncurrent row at a specified physical offset. In other words, from the current\nrow the LAG() function can access data of the previous row, or the row\nbefore the previous row, and so on.\u003c/p\u003e\n\u003cp\u003eThe LAG() function will be very useful for comparing the values of the\ncurrent and the previous row.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVia \u003ca href=\"https://twitter.com/jnunemaker/status/1594683289498968068\"\u003eJohn Nunemaker\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/terrastruct/d2\"\u003eD2\u003c/a\u003e - A diagrams as text tool like \u003ca href=\"https://github.com/mermaid-js/mermaid\"\u003eMermaid\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eD2 is a modern diagram scripting language that turns text to diagrams.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe syntax is more pleasing to me than Mermaid. Something to try the next time\nI need to draw a diagram.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAn \u003ca href=\"https://medium.com/@kris-nova/hachyderm-infrastructure-74f518bc7472\"\u003einteresting post about the infrastructure required to keep the popular\nHachyderm\u003c/a\u003e \u003ca href=\"https://hachyderm.io/\"\u003eMastodon instance\u003c/a\u003e running.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m watching the progress of the \u003ca href=\"https://developer.chrome.com/docs/web-platform/view-transitions/\"\u003eView Transition API\u003c/a\u003e with interest.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe View Transition API makes it easy to change the DOM in a single step,\nwhile creating an animated transition between the two states.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI hope that this will make \u003cem\u003emany\u003c/em\u003e \u003ca href=\"https://developer.mozilla.org/en-US/docs/Glossary/SPA\"\u003eSPAs\u003c/a\u003e pointless.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theregister.com/2022/10/29/kathleen_booth_obit/\"\u003eKathleen Booth, the inventor of assembly language has died\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eProfessor Kathleen Booth, one of the last of the early British computing\npioneers, has died. She was 100.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI had shamefully never heard of her until now, another in a long list of\nforgotten women.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI noticed that my \u003ca href=\"https://www.raycast.com/jordelver/search-hex\"\u003eSearch Hex Raycast extension\u003c/a\u003e \u003ca href=\"https://twitter.com/naetnums/status/1595511815160664089\"\u003egot mentioned on Twitter\u003c/a\u003e\nthis week. It\u0026rsquo;s nice to know that something I built has at \u003cem\u003eleast\u003c/em\u003e one user 😆\nThat tiny feeling of validation makes it worth making.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/styrmis/status/1595908400747286528\"\u003eStefan Magnuson\u003c/a\u003e recorded a \u003ca href=\"https://www.youtube.com/watch?v=syQ_hN6_K1o\"\u003egreat video\u003c/a\u003e on using \u003ca href=\"https://github.com/vim-test/vim-test\"\u003evim-test\u003c/a\u003e. I have\n\u003ca href=\"https://github.com/jordelver/dotfiles/blob/master/config/nvim/lua/plugins.lua#L74-L81\"\u003eexperience with vim-test\u003c/a\u003e, but stopped using it. I can\u0026rsquo;t remember why so I\u0026rsquo;m\ngoing to give it another go, I think I might need to tweak my setup slightly.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://sqlfordevs.com/ghost-conditions-for-unindexed-columns\"\u003eThis is an interesting database tip\u003c/a\u003e about how to coax the database to use an\nindex by adding extra conditions.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePerfect indexes can not be created for every query because of their\noverhead. Adding ghost conditions to those queries may lead to the database\nusing better indexes.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA slightly less good week than last. A lot less code written, but many\nproduction deployments without incident. I\u0026rsquo;m always surprised when things go\nwell. In fact, I feel like the karma police will come and brake something to\npunish me for admitting this! 😆\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=ZBduBppB8r0\"\u003eAn Antidote to Burnout\u003c/a\u003e - be thankful. It\u0026rsquo;s so hard to remember this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI have been using Vim (and now Neovim) for Ruby on Rails development for many\nyears but I\u0026rsquo;ve never taken full advantage of \u003ca href=\"https://github.com/tpope/vim-rails\"\u003e\u003ccode\u003erails.vim\u003c/code\u003e\u003c/a\u003e even though it was\ninstalled the whole time.\u003c/p\u003e\n\u003cp\u003eThe concept of \u003ca href=\"https://github.com/tpope/vim-rails/blob/a6d2bac95b446a5c23eff4638eca164b0d77454a/doc/rails.txt#L93\"\u003ealternative and related files\u003c/a\u003e is very nice. Since having found\nfuzzy finders I\u0026rsquo;ve always relied upon them to open files, but actually, in a lot\nof cases files can be opened more easily using \u003ccode\u003erails.vim\u003c/code\u003e supplied functions\nlike \u003ccode\u003e:A\u003c/code\u003e.\u003c/p\u003e",
      "date_published": "2022-11-27T00:00:00+00:00",
      "date_modified": "2022-11-27T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/73-poorly-batched-rpcs/",
      "url": "https://elver.me/weeknotes/73-poorly-batched-rpcs/",
      "title": "Weeknotes 73: Poorly batched RPCs",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.reddit.com/r/neovim/comments/yzfpx3/til_you_can_type_lua_code_instead_of_lua/?utm_source=pocket_saves\"\u003eNice trick to show the result of a Lua expression in Neovim\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:lua = 1 + 1\u003c/code\u003e instead of \u003ccode\u003e:lua print(vim.inspect(1 + 1))\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had a very productive, and satisfying week 😮 I have a task to figure out\nwhy this happened and how to replicate it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://priceops.org\"\u003eThe 5 Pillars of PriceOps\u003c/a\u003e found via \u003ca href=\"https://www.tier.run\"\u003etier\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe 5 Pillars of PriceOps define a methodology for pricing model definition\nand implementation that supports iteration, safety, and organizational\nalignment.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve seen startups struggle with this conundrum before so it\u0026rsquo;s really nice to\nsee something like this formalised and written down. \u003ccode\u003etier\u003c/code\u003e itself looks neat\nfor managing everything.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA single tool to configure, orchestrate and manage your entire billing\nstack.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL that \u003ccode\u003eexrc\u003c/code\u003e is a feature of Neovim that allows have project specific\nconfiguration. \u003ca href=\"https://github.com/neovim/neovim/pull/10177\"\u003eIt \u003cem\u003ewas\u003c/em\u003e deprecated\u003c/a\u003e but brought back to life in PR \u003ca href=\"https://github.com/neovim/neovim/pull/20956\"\u003e#20956\u003c/a\u003e\n🙌 It doesn\u0026rsquo;t work with \u003ccode\u003einit.lua\u003c/code\u003e though at the moment 😥 But there might be\nwork to make this work in \u003ca href=\"https://github.com/neovim/neovim/pull/13503\"\u003e#13503\u003c/a\u003e 🙌 🎢\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Fred_Brooks\"\u003eFred Brooks\u003c/a\u003e of \u003ca href=\"https://en.wikipedia.org/wiki/The_Mythical_Man-Month\"\u003eThe Mythical Man-Month\u003c/a\u003e \u003ca href=\"https://inuh.net/@robpike/109362926916656811\"\u003edied\u003c/a\u003e on the 17th November 2022 😢\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate on the \u003ca href=\"/weeknotes/71-absolute-fire/\"\u003eJPEG XL debacle from a couple of weeks ago\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/jonsneyers/status/1592797329773694976\"\u003eJon Sneyers\u003c/a\u003e explains (\u003ca href=\"https://discoliam.com\"\u003evia Discoliam\u003c/a\u003e).\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFundamentally, the reason why Chrome decided to remove JPEG XL is that\nthere\u0026rsquo;s a conflict of interest.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd\u0026hellip;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe problem is that several people in the Chrome team — including some at\nhigh-ranking gatekeeper positions — are also AVIF contributors/proponents.\nThis clouds their judgement since they are basically prosecutor, judge and\nexecutioner at the same time.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePixel art as \u003ca href=\"https://twitter.com/poof_eth/status/1590932197644865537\"\u003e\u0026ldquo;false nostalgia\u0026rdquo;\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLast week\u0026rsquo;s listen to Adam Wiggins\u0026rsquo; Changelog episodes rekindled my interest\nin \u003ca href=\"https://museapp.com\"\u003eMuse\u003c/a\u003e, his latest project. I\u0026rsquo;d heard of it before but never really used\nit for whatever reason.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/19-burn-brightly/\"\u003eI bought an iPad Mini and Apple Pencil a while ago\u003c/a\u003e to help with learning,\nthinking, planning, that sort of thing, but it\u0026rsquo;s mainly sat unused because I\ncouldn\u0026rsquo;t find a workflow that clicked for me.\u003c/p\u003e\n\u003cp\u003eSo I gave Muse is a go and I really like it. I used it in a planning session\nfor the first time and found it useful considering that I didn\u0026rsquo;t really know\nwhat I was doing, and was learning as I went. That\u0026rsquo;s a good result.\u003c/p\u003e\n\u003cp\u003eI would like better drawing tools, but that\u0026rsquo;s not yet been a hindrance for me.\nI hope progress continues and I am going to move to a paid plan to get access\nto a larger drawing canvas.\u003c/p\u003e\n\u003cp\u003eApple is also about to release \u003ca href=\"https://www.macrumors.com/guide/freeform-app-features/\"\u003eFreeform with iPadOS 16.2\u003c/a\u003e (Thanks, \u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e!)\nso that is another interesting contender. I expect Apple will do the bear\nminimum with it though, as they tend to, but I will try it when it comes out.\u003c/p\u003e\n\u003cp\u003eThe iPad Mini screen is a bit too small though, so watch this space for an\nextravagant larger screen iPad purchase in the near future 😬\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI really wish \u003ca href=\"https://www.notion.so\"\u003eNotion\u003c/a\u003e would stay logged in for more than 5 minutes, it\u0026rsquo;s very\nannoying, especially since they don\u0026rsquo;t have username/password login which my\npassword manager could easily fill in for me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLet\u0026rsquo;s talk about Acast. Who, in their right mind, is listening to a podcast,\nand then sitting through TWO MINUTES of adverts at the end?!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=0Cu6EbELZ6I\"\u003eWhy There\u0026rsquo;s No Such Thing as a Good Billionaire\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/designcoursecom/status/1592979755686825984\"\u003eThe Math Behind Nesting Rounded Corners\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe Math Behind Nesting Rounded Corners is the math behind nesting rounded\ncorners. To nest one circle inside of another, the inner circle needs a\nsmaller radius than the outer circle.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://rubyonrails.org/foundation\"\u003eThe Rails Foundation\u003c/a\u003e seems like a good thing to me. I\u0026rsquo;ve noticed a few\nskeptics online, we will see I guess.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTo improve the documentation, education, marketing, and events of our\nframework to the benefit of all new and existing Rails developers, and to\nensure a prosperous ecosystem that continues to improve for decades to come.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.reddit.com/r/neovim/comments/yzfpx3/til_you_can_type_lua_code_instead_of_lua/?utm_source=pocket_saves\"\u003eNice trick to show the result of a Lua expression in Neovim\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:lua = 1 + 1\u003c/code\u003e instead of \u003ccode\u003e:lua print(vim.inspect(1 + 1))\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI had a very productive, and satisfying week 😮 I have a task to figure out\nwhy this happened and how to replicate it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://priceops.org\"\u003eThe 5 Pillars of PriceOps\u003c/a\u003e found via \u003ca href=\"https://www.tier.run\"\u003etier\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe 5 Pillars of PriceOps define a methodology for pricing model definition\nand implementation that supports iteration, safety, and organizational\nalignment.\u003c/p\u003e",
      "date_published": "2022-11-20T00:00:00+00:00",
      "date_modified": "2022-11-20T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/72-disco-safari/",
      "url": "https://elver.me/weeknotes/72-disco-safari/",
      "title": "Weeknotes 72: Disco Safari",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://discoliam.com\"\u003eDiscoliam\u003c/a\u003e educated me in the ways of smooth-scrolling using only CSS.\n\u003ca href=\"https://caniuse.com/css-scroll-behavior\"\u003eBrowser support is good\u003c/a\u003e with the \u003ca href=\"https://bugs.webkit.org/show_bug.cgi?id=179379\"\u003eexception of an annoying bug in mobile\nSafari\u003c/a\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003escrolling-behaviour: smooth;\nscrolling-padding-top: 100px;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSmooth scrolling without JavaScript. Yes, please.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.rewind.ai\"\u003eRewind\u003c/a\u003e - Equal parts terrifying and really cool.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFind anything you’ve seen, said, or heard\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThere was a good discussion about it on \u003ca href=\"https://atp.fm/507\"\u003eATP 507\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/adamlyttleapps/status/1589228855738486785\"\u003e\u0026ldquo;What framework do you use for building cross-platform apps?\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI was surprised at how many mentions of \u003ca href=\"https://flutter.dev\"\u003eFlutter\u003c/a\u003e there were vs \u003ca href=\"https://reactnative.dev\"\u003eReact\nNative\u003c/a\u003e. I\u0026rsquo;ve never heard anyone say they were building anything with Flutter,\nbut several companies I know are using React Native. I would\u0026rsquo;ve expected\n\u003ca href=\"https://dart.dev\"\u003eDart\u003c/a\u003e to be a bigger barrier.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://phoenixframework.org/blog/phoenix-1.7-released\"\u003eThe release of Phoenix 1.7 is close\u003c/a\u003e. The \u003ca href=\"https://gist.github.com/chrismccord/00a6ea2a96bc57df0cce526bd20af8a7\"\u003eupgrade guide\u003c/a\u003e is available.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been working on my side project a bit. Slow going. Every problem is 100%\nmy fault. Every solution is luck.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/searls/status/1590113592438726656\"\u003eJustin Searls on his guidance counsellor\u003c/a\u003e 😁\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMass layoffs at huge tech firms reminds me of my guidance counselor\u0026rsquo;s advice\nduring the dot-com bust: \u0026ldquo;whatever you do, don\u0026rsquo;t major in computers\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eNothing could make me surer there would be a shortage. 4 years later I\ngraduated in CS with ~16 classmates and endless opportunity.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI got access to \u003ca href=\"https://arc.net\"\u003eArc\u003c/a\u003e. It\u0026rsquo;s interesting so far. I\u0026rsquo;m going to try it out this\nweek coming.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI do have \u003cem\u003esome\u003c/em\u003e sympathy for \u003ca href=\"https://twitter.com/textfiles/status/1590399315289444353\"\u003ethis argument\u003c/a\u003e (although I probably wouldn\u0026rsquo;t\nhave communicated it \u003cem\u003equite\u003c/em\u003e like this).\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI have a very special message to the 11,000 Facebook people being laid off:\nYou absolutely deserve it. Facebook was, and is, one of the most profoundly\nevil companies in the world, certainly one of the most specifically evil\nbecause it frames itself as a simple social app.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWorking at Facebook, especially as a programmer, is a hugely privileged\nposition to be in. Getting a job at Facebook is not easy. You\u0026rsquo;re probably a\nvery smart person, who has many options available to you. You\u0026rsquo;ll be paid huge\namounts of money. I find it hard to believe that you couldn\u0026rsquo;t get a job almost\n\u003cem\u003eanywhere\u003c/em\u003e else. But you chose Facebook.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://po-ru.com/2022/11/09/the-mirror-of-perseus\"\u003eMore reasons to not use MySQL\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOn closer inspection, the database record had the date set to an impossible\n0000-00-00. Gee, thanks, MySQL.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother option for managed Postgres - \u003ca href=\"https://neon.tech\"\u003eNeon\u003c/a\u003e. I\u0026rsquo;ve requested early access to\ngive it a go. It sounds like it has similar features to \u003ca href=\"https://planetscale.com\"\u003ePlanetScale\u003c/a\u003e but\nPostgres instead of MySQL.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://adamwiggins.com\"\u003eAdam Wiggins\u003c/a\u003e (co-founder and former CTO of Heroku) was on \u003ca href=\"https://changelog.com\"\u003eThe Changelog\u003c/a\u003e\nfor a two-part interview (\u003ca href=\"https://changelog.com/podcast/513\"\u003eone\u003c/a\u003e / \u003ca href=\"https://changelog.com/podcast/514\"\u003etwo\u003c/a\u003e). I still use \u003ca href=\"https://www.heroku.com\"\u003eHeroku\u003c/a\u003e to this day,\nand it remains the best-in-class developer experience for deploying Ruby on\nRails apps. I found both parts of the interview really interesting.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://discoliam.com\"\u003eDiscoliam\u003c/a\u003e educated me in the ways of smooth-scrolling using only CSS.\n\u003ca href=\"https://caniuse.com/css-scroll-behavior\"\u003eBrowser support is good\u003c/a\u003e with the \u003ca href=\"https://bugs.webkit.org/show_bug.cgi?id=179379\"\u003eexception of an annoying bug in mobile\nSafari\u003c/a\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003escrolling-behaviour: smooth;\nscrolling-padding-top: 100px;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSmooth scrolling without JavaScript. Yes, please.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.rewind.ai\"\u003eRewind\u003c/a\u003e - Equal parts terrifying and really cool.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFind anything you’ve seen, said, or heard\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThere was a good discussion about it on \u003ca href=\"https://atp.fm/507\"\u003eATP 507\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/adamlyttleapps/status/1589228855738486785\"\u003e\u0026ldquo;What framework do you use for building cross-platform apps?\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI was surprised at how many mentions of \u003ca href=\"https://flutter.dev\"\u003eFlutter\u003c/a\u003e there were vs \u003ca href=\"https://reactnative.dev\"\u003eReact\nNative\u003c/a\u003e. I\u0026rsquo;ve never heard anyone say they were building anything with Flutter,\nbut several companies I know are using React Native. I would\u0026rsquo;ve expected\n\u003ca href=\"https://dart.dev\"\u003eDart\u003c/a\u003e to be a bigger barrier.\u003c/p\u003e",
      "date_published": "2022-11-13T00:00:00+00:00",
      "date_modified": "2022-11-13T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/71-absolute-fire/",
      "url": "https://elver.me/weeknotes/71-absolute-fire/",
      "title": "Weeknotes 71: Absolute Fire",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/2022/10/28/23428132/elon-musk-twitter-acquisition-problems-speech-moderation\"\u003e\u0026ldquo;Welcome to hell, Elon\u0026rdquo;\u003c/a\u003e is absolute fire 🔥\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSo you can make all the promises about “free speech” you want, but the dull\nreality is that you still have to ban a bunch of legal speech if you want to\nmake money. And when you start doing that, your creepy new right-wing\nfanboys are going to viciously turn on you, just like they turn on every\nother social network that realizes the same essential truth.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVPN update: I \u003ca href=\"/weeknotes/51-inevitable-and-immortal/\"\u003ementioned a while ago\u003c/a\u003e that I would be trying out some\ndifferent VPNs, one of which was \u003ca href=\"https://mullvad.net/en/\"\u003eMullvad VPN\u003c/a\u003e and I\u0026rsquo;m currently three weeks\ninto trying it.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGood:\u003c/strong\u003e it connects \u003cem\u003ereally\u003c/em\u003e quickly and seems fast - NordVPN and ProtonVPN\nwould often take a while to connect. \u003cstrong\u003eBad:\u003c/strong\u003e I don\u0026rsquo;t love the app design, I\nwish it were a bit more Mac-like. It\u0026rsquo;s the most expensive.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wrote a \u003cem\u003etiny\u003c/em\u003e bit of CSS is week and was both surprised at how far it\u0026rsquo;s\ncome whilst also being astounded at how the simplest of things are still\ndifficult.\u003c/p\u003e\n\u003cp\u003eThis is cool, but still not universally supported.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ebody:has(\u0026gt; .foo) {\n  # Apply rule to body if it has a direct descendant .foo\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI used to really like doing frontend work earlier in my career, but it has\nrather taken a back seat in recent years with most of my work being purely\nbackend. It\u0026rsquo;s something I\u0026rsquo;d like to do more of, but it getting back into it is\noverwhelming.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s really important that everyone on a team feels like have input into\nmaking a difference. Without that, no matter how conscientious the developer,\nthey will eventually get sick feeling ignored, and, if not careful, a culture\nof not caring can develop.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Google Chrome team decided, for some unfathomable reason, to remove\nsupport for the new JPEG XL format.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThere is not enough interest from the entire ecosystem to continue\nexperimenting with JPEG XL\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eYou can see from the \u003ca href=\"https://bugs.chromium.org/p/chromium/issues/detail?id=1178058#c84\"\u003eChromium bug thread\u003c/a\u003e that this decision is crazy.\nSupport from other browser vendors is also incomplete, but when you have most\nof the market it does send the wrong signal.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAll that overtime you\u0026rsquo;re doing for free isn\u0026rsquo;t doing your colleagues any\nfavours 😉\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI consumed a couple interesting takes on Git commit messages recently.\u003c/p\u003e\n\u003cp\u003eFirstly, a new podcast, \u003ca href=\"https://yagni.fm/episodes/detailed-commit-messages-chris-toomey\"\u003eYAGNI\u003c/a\u003e, hosted by \u003ca href=\"https://twitter.com/_swanson\"\u003eMatt Swanson\u003c/a\u003e with guest \u003ca href=\"https://twitter.com/christoomey\"\u003eChris\nToomey\u003c/a\u003e. Chris mentioned that you might as well note down all the context\nwhich you built whilst working on a problem, or it\u0026rsquo;s lost. A great point.\u003c/p\u003e\n\u003cp\u003eSecondly, \u003ca href=\"https://simonwillison.net/2022/Oct/29/the-perfect-commit/\"\u003eThe Perfect Commit\u003c/a\u003e by Simon Willison. He talks about keeping the\ndocumentation in the same repo, which I think is a great idea, but I\u0026rsquo;m not\nsure how actionable it is for most teams.\u003c/p\u003e\n\u003cp\u003eBoth had interesting points even though I didn\u0026rsquo;t agree with all.\u003c/p\u003e\n\u003cp\u003eMost people are not even writing decent commit subjects, never mind the whole\nmessage, which is my experience tends to be empty almost all of the time. We\ncan do better.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/2022/10/28/23428132/elon-musk-twitter-acquisition-problems-speech-moderation\"\u003e\u0026ldquo;Welcome to hell, Elon\u0026rdquo;\u003c/a\u003e is absolute fire 🔥\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSo you can make all the promises about “free speech” you want, but the dull\nreality is that you still have to ban a bunch of legal speech if you want to\nmake money. And when you start doing that, your creepy new right-wing\nfanboys are going to viciously turn on you, just like they turn on every\nother social network that realizes the same essential truth.\u003c/p\u003e",
      "date_published": "2022-11-06T00:00:00+00:00",
      "date_modified": "2022-11-06T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/70-crunchy-slump/",
      "url": "https://elver.me/weeknotes/70-crunchy-slump/",
      "title": "Weeknotes 70: Crunchy Slump",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.crunchydata.com/blog/making-postgres-more-afforable-new-low-cost-plans-on-crunchy-bridge\"\u003eCrunchy Data launched cheaper Postgres plans recently\u003c/a\u003e. Better still, not\nonly are their cheap plan a reasonable cost, you can suspend your databases\nand you don\u0026rsquo;t pay whilst they are suspended. And, if you don\u0026rsquo;t spend over $5\nyou don\u0026rsquo;t pay anything at all! It definitely removes a barrier to starting a\nnew project.\u003c/p\u003e\n\u003cp\u003eI did experience some on-boarding issues, but support were very responsive and\npleasant to deal with, and seems receptive to feedback.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe project I was working on is now complete, so on to something new. Time for\nthe anxiety to change direction 😅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFor the Elixir inclined, \u003ca href=\"https://github.com/Shimmur/checker_cab\"\u003e\u003ccode\u003echecker_cab\u003c/code\u003e\u003c/a\u003e looks to be a useful addition to\n\u003ccode\u003eex_unit\u003c/code\u003e test suites.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eChecker Cab facilitates deep map comparisons within unit tests.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt adds a \u003ccode\u003eassert_values_for\u003c/code\u003e function which can be used to assert against\nmaps in a cleaner way.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://imgproxy.net/\"\u003eimgproxy\u003c/a\u003e from \u003ca href=\"https://evilmartians.com\"\u003eEvil Martians\u003c/a\u003e looks great.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eimgproxy is a fast and secure standalone server for resizing and converting\nremote images. The guiding principles behind imgproxy are security, speed,\nand simplicity.\u003c/p\u003e\n\u003cp\u003eimgproxy is able to quickly and easily resize images on the fly, and it\u0026rsquo;s\nwell-equipped to handle a large amount of image resizing. imgproxy is a\nfast, secure replacement for all the image resizing code inside your web\napplication (such as resizing libraries, or code that calls ImageMagick or\nGraphicsMagic).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThere\u0026rsquo;s also a Ruby library, \u003ca href=\"https://github.com/imgproxy/imgproxy.rb\"\u003eimgproxy.rb\u003c/a\u003e, to help with generating the URLs.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;Motivation Slumps\u0026rdquo; on \u003ca href=\"https://www.relay.fm/radar/253\"\u003eUnder the Radar #253\u003c/a\u003e was a reassuring listen.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFeeling unmotivated, inspiration vs. motivation, and techniques to get\nmoving again.\u003c/p\u003e\n\u003cp\u003eBe kind to yourself.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eTo hear that Marco and David suffer from the same lack of motivation even with\nvery successful, visible, apps on a major platform was encouraging.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://world.hey.com/dhh/why-we-re-leaving-the-cloud-654b47e0\"\u003e\u0026ldquo;Why we\u0026rsquo;re leaving the cloud\u0026rdquo;\u003c/a\u003e - DHH again.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAnyone who thinks running a major service like HEY or Basecamp in the cloud\nis \u0026ldquo;simple\u0026rdquo; has clearly never tried. Some things are simpler, others more\ncomplex, but on the whole, I\u0026rsquo;ve yet to hear of organizations at our scale\nbeing able to materially shrink their operations team, just because they\nmoved to the cloud.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHe has a point here I think. The cloud has many benefits, and you might take\nadvantage of those, but saving money on staff won\u0026rsquo;t be one of them.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fly.io/phoenix-files/shut-down-idle-phoenix-app/\"\u003eA nice trick to shutdown a Phoenix app when it\u0026rsquo;s not being used\u003c/a\u003e by Chris\nMcCord.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/defrag_fable/status/1584594934006681600\"\u003eA considerable milestone\u003c/a\u003e for \u003ca href=\"https://github.com/penelopezone/rubyfmt\"\u003e\u003ccode\u003erubyfmt\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e100% of Stripe\u0026rsquo;s Ruby codebase, which is the largest single Ruby codebase in\nthe world, is now autoformatted with Rubyfmt. We\u0026rsquo;ll be upstreaming the\nchanges we made soon. I\u0026rsquo;m very excited.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://getoban.pro/articles/oban-starts-where-tasks-end\"\u003eParker Selbert wrote \u0026ldquo;Oban Starts Where Tasks End\u0026rdquo;\u003c/a\u003e that details \u003cem\u003ewhy\u003c/em\u003e we\nneed a background job tool when Elixir has an excellent concurrency story.\nI have struggled to fully understand/explain this to myself and others.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBurgeoning Elixirists frequently ask, “Who needs background jobs in Elixir?\nIsn’t that what Task.start/1 is for?” Not quite. Let’s examine why a Task is\nthe wrong level of abstraction for critical background work.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHe explains when \u003ca href=\"https://hexdocs.pm/elixir/Task.html\"\u003e\u003ccode\u003eTask\u003c/code\u003e\u003c/a\u003e or lower level functions are appropriate, and when a\nfull background job processing system is a better choice.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.crunchydata.com/blog/making-postgres-more-afforable-new-low-cost-plans-on-crunchy-bridge\"\u003eCrunchy Data launched cheaper Postgres plans recently\u003c/a\u003e. Better still, not\nonly are their cheap plan a reasonable cost, you can suspend your databases\nand you don\u0026rsquo;t pay whilst they are suspended. And, if you don\u0026rsquo;t spend over $5\nyou don\u0026rsquo;t pay anything at all! It definitely removes a barrier to starting a\nnew project.\u003c/p\u003e\n\u003cp\u003eI did experience some on-boarding issues, but support were very responsive and\npleasant to deal with, and seems receptive to feedback.\u003c/p\u003e",
      "date_published": "2022-10-30T00:00:00+00:00",
      "date_modified": "2022-10-30T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/69-gotta-catch-em-all/",
      "url": "https://elver.me/weeknotes/69-gotta-catch-em-all/",
      "title": "Weeknotes 69: Gotta catch 'em all",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eVery good point by \u003ca href=\"https://twitter.com/chriskottom/status/1581979176315523073\"\u003eChris Kottom\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAnytime you introduce a network boundary anywhere in your stack, you raise\ncomplexity 3x.  They\u0026rsquo;re harder to develop, harder to test, harder to deploy,\nand harder to support.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWhen someone in a meeting says \u0026ldquo;we\u0026rsquo;ll just make a request to the API\u0026rdquo; increase\nyour time estimate.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDogmatic \u003ca href=\"https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it\"\u003eYAGNI\u003c/a\u003e is bad. Some things are worth doing before you need them, and\n\u003ca href=\"https://lukeplant.me.uk/blog/posts/yagni-exceptions/\"\u003eLuke Plant has a good list in \u0026ldquo;YAGNI exceptions\u0026rdquo;\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been pillow shopping. I bought three of various types to try them out,\nknowing that I could lean on the supplier\u0026rsquo;s 30-day refund policy to return the\nones I didn\u0026rsquo;t like.\u003c/p\u003e\n\u003cp\u003eThen the supplier went into administration.\u003c/p\u003e\n\u003cp\u003eSo now I have three pillows.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWant to generate a CSS gradient? Try \u003ca href=\"https://csshero.org/mesher/\"\u003eMesher by CSS Hero\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://daringfireball.net/linked/2022/10/21/dhh-twitter-headcount\"\u003eDHH might have a point\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen WhatsApp was sold to Facebook in 2014, it had almost half a billion\nmonthly users, but a team of just 50 people running everything. Compare this\nto Twitter, which today has a staff of 7,500 to manage half the number of\nusers. Yet Musk is the crazy one here for suggesting that maybe Twitter\ncould operate with a mere TWO THOUSAND employees? Please.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRegular reminder.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWork relationships can be cordial! Your peers are in the same boat, you owe\nthem solidarity. Your manager can like you, and you can like them, connect\nas humans. But at no point should you lose sight that the second having you\nin is no longer profitable, you\u0026rsquo;re out.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/fasterthanlime/status/1581650396002783234\"\u003ehttps://twitter.com/fasterthanlime/status/1581650396002783234\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRecently I setup a Neovim key mapping to grep for the word under the cursor\nusing \u003ccode\u003eTelescope grep_string\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.keymap.set(\u003cspan style=\"color:#d14\"\u003e\u0026#39;n\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;\u0026lt;Leader\u0026gt;fw\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;\u0026lt;cmd\u0026gt;Telescope grep_string\u0026lt;cr\u0026gt;\u0026#39;\u003c/span\u003e, { noremap \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e })\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003e\u0026lt;leader\u0026gt;fw\u003c/code\u003e will grep for the word, show the results, and allow filtering.\u003c/p\u003e\n\u003cp\u003eWith the recent change in Neovim 0.8 to allow using \u003ccode\u003e*\u003c/code\u003e with visual\nselections (as I wrote about \u003ca href=\"/weeknotes/68-disclosure-widget/\"\u003elast week\u003c/a\u003e) I thought it would be nice to allow\nvisual selections with \u003ccode\u003eTelescope grep_string\u003c/code\u003e too.\u003c/p\u003e\n\u003cp\u003eThis is easily accomplished by mapping the same command in \u003ccode\u003eVisual\u003c/code\u003e mode.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim.keymap.set(\u003cspan style=\"color:#d14\"\u003e\u0026#39;v\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;\u0026lt;Leader\u0026gt;fw\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;\u0026lt;cmd\u0026gt;Telescope grep_string\u0026lt;cr\u0026gt;\u0026#39;\u003c/span\u003e, { noremap \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e })\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://wix-ux.com/when-life-gives-you-lemons-write-better-error-messages-46c5223e1a2f\"\u003e\u0026ldquo;When life gives you lemons, write better error messages\u0026rdquo;\u003c/a\u003e from Wix is a great\nreminder of how important error messages are, and they provide some great\nexamples of \u0026ldquo;good\u0026rdquo; and \u0026ldquo;bad\u0026rdquo; messages.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/dylanatsmith/status/1582112625479286784\"\u003eDylan Smith from GitHub is looking to fix the wonky yellow progress spinner\u003c/a\u003e\nyou see in the GitHub UI. I wish I\u0026rsquo;d never noticed this because now I can\u0026rsquo;t\nunsee it.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWho’s the expert I should talk to about browser rendering, SVG, and CSS\nanimation? I’m weeks and weeks down the rabbit hole on a visual bug in\n@GitHub and I’m dying to know \u003cem\u003ewhy\u003c/em\u003e it happens.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThere are some interesting replies in the Twitter thread and the \u003ca href=\"https://codepen.io/dylanatsmith/pen/MWQNvmw\"\u003ecomparisons\nCodePen\u003c/a\u003e is worth a look. It seems like it was fixed by breaking the single\nSVG into pieces and only animating one of them.\u003c/p\u003e\n\u003cp\u003eWeb browsers are weird.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://deck-24abcd.netlify.app\"\u003eGotta catch \u0026rsquo;em all\u003c/a\u003e \u0026ndash; Be \u003ca href=\"https://github.com/simeydotme/pokemon-cards-css/blob/main/static/cards.css\"\u003escared\u003c/a\u003e of the CSS.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eVery good point by \u003ca href=\"https://twitter.com/chriskottom/status/1581979176315523073\"\u003eChris Kottom\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAnytime you introduce a network boundary anywhere in your stack, you raise\ncomplexity 3x.  They\u0026rsquo;re harder to develop, harder to test, harder to deploy,\nand harder to support.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWhen someone in a meeting says \u0026ldquo;we\u0026rsquo;ll just make a request to the API\u0026rdquo; increase\nyour time estimate.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDogmatic \u003ca href=\"https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it\"\u003eYAGNI\u003c/a\u003e is bad. Some things are worth doing before you need them, and\n\u003ca href=\"https://lukeplant.me.uk/blog/posts/yagni-exceptions/\"\u003eLuke Plant has a good list in \u0026ldquo;YAGNI exceptions\u0026rdquo;\u003c/a\u003e.\u003c/p\u003e",
      "date_published": "2022-10-23T00:00:00+00:00",
      "date_modified": "2022-10-23T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/68-disclosure-widget/",
      "url": "https://elver.me/weeknotes/68-disclosure-widget/",
      "title": "Weeknotes 68: Disclosure widget",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNeovim 0.8 was released recently and includes a new option called \u003ccode\u003ecmdheight\u003c/code\u003e,\nwhich, if set to \u003ccode\u003e0\u003c/code\u003e, hides the command-line unless in-use. A nice way to\nfree up some vertical space.\u003c/p\u003e\n\u003cp\u003e(Via \u003ca href=\"https://www.reddit.com/r/neovim/comments/xsstqk/neovim_08_whats_new/\"\u003eNeovim 0.8: What\u0026rsquo;s new?\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e told me about the \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details#browser_compatibility\"\u003e\u003ccode\u003e\u0026lt;details\u0026gt;\u003c/code\u003e HTML element\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe \u003ccode\u003e\u0026lt;details\u0026gt;\u003c/code\u003e HTML element creates a disclosure widget in which information\nis visible only when the widget is toggled into an \u0026ldquo;open\u0026rdquo; state. A summary\nor label must be provided using the \u003ccode\u003e\u0026lt;summary\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ePretty handy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ccode\u003e*\u003c/code\u003e key in Neovim is used for searching the word under the cursor. Since\nNeovim 0.8 it now works with visual selections too, which comes in handy when\nyou want to search for more complex strings.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://playwright.dev\"\u003ePlaywright\u003c/a\u003e is an end-to-end testing tool ala \u003ca href=\"https://www.cypress.io\"\u003eCypress\u003c/a\u003e. We\u0026rsquo;ve been thinking\nabout moving to it for it\u0026rsquo;s speed, and ability to run tests in different\nbrowsers in parallel. From my limited experience I\u0026rsquo;m a fan.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOn the subject of testing. I\u0026rsquo;ve decided that flake-free end-to-end tests\n(that are actually useful) are more or less impossible to create.\nRetry-ability is key.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/_byroot/status/1577647475686514689\"\u003eJean Boussier doesn\u0026rsquo;t seem to sleep\u003c/a\u003e. \u003ca href=\"https://github.com/Shopify/pitchfork\"\u003epitchfork\u003c/a\u003e, a new Ruby HTTP server\noption is now in pre-release.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI finally released the first (pre)version of pitchfork.\u003c/p\u003e\n\u003cp\u003eA new Ruby HTTP Server optimized for latency and memory usage\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe memory savings sound impressive!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGit 2.38 introduced a new \u003ccode\u003e--update-refs\u003c/code\u003e feature which I learnt about from\n\u003ca href=\"https://github.blog/2022-10-03-highlights-from-git-2-38/\"\u003eGitHub\u0026rsquo;s blog\u003c/a\u003e. If you find yourself following a workflow where you have\nbranches that branch from each other in order to incrementally ship a feature\nyou might find that \u003ccode\u003e--update-refs\u003c/code\u003e makes your life easier.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emain -\u0026gt; feature_a -\u0026gt; feature_b -\u0026gt; feature_c\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSay you have a commit that exists on all feature branches and it needs to\nchange. If you make the change on \u003ccode\u003efeature_a\u003c/code\u003e you need to manually rebase each\nbranch based on \u003ccode\u003efeature_a\u003c/code\u003e because the commit sha will have changed.\u003c/p\u003e\n\u003cp\u003eWith \u003ccode\u003e-update-refs\u003c/code\u003e you can make the change on \u003ccode\u003efeature_c\u003c/code\u003e and have the\nchanges propagated down to \u003ccode\u003efeature_a\u003c/code\u003e and \u003ccode\u003efeature_b\u003c/code\u003e automatically.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://thebrowser.company\"\u003eThe Browser Company\u003c/a\u003e are building a new web browser called \u003ca href=\"https://arc.net\"\u003eArc\u003c/a\u003e. We\ndefinitely need competition in the web browser market, so it will be\ninteresting to see what comes of this. Will it use an existing rendering\nengine or something completely new? I\u0026rsquo;m interested to see.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"https://www.raycast.com/jordelver/search-hex\"\u003eRaycast extension to search Hex\u003c/a\u003e that I \u003ca href=\"/weeknotes/67-set-theoretic-types/\"\u003ementioned last week\u003c/a\u003e was accepted\ninto the Raycast Store, so that\u0026rsquo;s cool 🥳\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNeovim 0.8 was released recently and includes a new option called \u003ccode\u003ecmdheight\u003c/code\u003e,\nwhich, if set to \u003ccode\u003e0\u003c/code\u003e, hides the command-line unless in-use. A nice way to\nfree up some vertical space.\u003c/p\u003e\n\u003cp\u003e(Via \u003ca href=\"https://www.reddit.com/r/neovim/comments/xsstqk/neovim_08_whats_new/\"\u003eNeovim 0.8: What\u0026rsquo;s new?\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e told me about the \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details#browser_compatibility\"\u003e\u003ccode\u003e\u0026lt;details\u0026gt;\u003c/code\u003e HTML element\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe \u003ccode\u003e\u0026lt;details\u0026gt;\u003c/code\u003e HTML element creates a disclosure widget in which information\nis visible only when the widget is toggled into an \u0026ldquo;open\u0026rdquo; state. A summary\nor label must be provided using the \u003ccode\u003e\u0026lt;summary\u0026gt;\u003c/code\u003e element.\u003c/p\u003e",
      "date_published": "2022-10-16T00:00:00+00:00",
      "date_modified": "2022-10-16T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/67-set-theoretic-types/",
      "url": "https://elver.me/weeknotes/67-set-theoretic-types/",
      "title": "Weeknotes 67: Set-Theoretic types",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI was \u003ca href=\"/weeknotes/47-arbitrary-commands/\"\u003eexcited back in May\u003c/a\u003e that \u003ca href=\"https://github.com/rails/rails/pull/45035\"\u003einitial support for pattern matching against\nActive Models was merged into Rails\u003c/a\u003e, but it seems that \u003ca href=\"https://github.com/rails/rails/pull/45553\"\u003eit was later\nreverted\u003c/a\u003e \u003ca href=\"https://twitter.com/kddnewton/status/1577244992720240641\"\u003edue to concerns over whether the interface was correct\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eHope is not lost though, \u003ca href=\"https://github.com/rails/rails/pull/45070\"\u003eanother PR is in progress\u003c/a\u003e, although discussion\nstalled back in August.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI attended a children\u0026rsquo;s dance show which included the opening monologue of\n\u003ca href=\"https://www.imdb.com/title/tt2184339/\"\u003eThe Purge\u003c/a\u003e. Yeah, bit weird.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eJosé Valim\u0026rsquo;s article on the possible introduction of types into Elixir is an\ninteresting read \u0026ndash; \u003ca href=\"https://elixir-lang.org/blog/2022/10/05/my-future-with-elixir-set-theoretic-types/\"\u003eMy Future with Elixir: set-theoretic types\u003c/a\u003e. The approach\nseems pragmatic, and it will be interesting to see where it goes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;The problem is that arrogance and shyness look exactly the same.\u0026rdquo; \u0026ndash; Russell\nHoward on the \u003ca href=\"https://castro.fm/episode/vSUySf\"\u003eMoon Under Water podcast\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI am looking for a decent visual diffing tool on macOS. Years ago I used\n\u003ca href=\"https://kaleidoscope.app\"\u003eKaleidoscope\u003c/a\u003e as a paid user but I believe it was sold and now costs $149! I\nhave no problem paying for software, but I don\u0026rsquo;t use a visual diffing tool\nvery often so it\u0026rsquo;s quite a lot to pay.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"https://jordanelver.co.uk\"\u003epersonal website blog\u003c/a\u003e has been somewhat neglected of late, partly due to\n\u003cem\u003ethese here\u003c/em\u003e weeknotes, but also because it used an old version of \u003ca href=\"http://middlemanapp.com\"\u003eMiddleman\u003c/a\u003e\nwhich I hadn\u0026rsquo;t kept up-to-date, and it became difficult to work with. Well, I\nmanaged to breath new life into it this week after upgrading various gems and\nfighting with native extensions. Great success!\u003c/p\u003e\n\u003cp\u003eAt some point it needs redesigning, organising, amalgamating (with this site\nperhaps?) but I will continue to publish over there for now despite its flaws.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I learnt about rfc5785 \u0026ndash; \u003ca href=\"https://www.rfc-editor.org/rfc/rfc5785\"\u003eDefining Well-Known Uniform Resource\nIdentifiers (URIs)\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt is increasingly common for Web-based protocols to require the discovery\nof policy or other information about a host (\u0026ldquo;site-wide metadata\u0026rdquo;) before\nmaking a request.\u003c/p\u003e\n\u003cp\u003eWhen this happens, it is common to designate a \u0026ldquo;well-known location\u0026rdquo; for\nsuch data, so that it can be easily located.  However, this approach has the\ndrawback of risking collisions, both with other such designated \u0026ldquo;well-known\nlocations\u0026rdquo; and with pre-existing resources.\u003c/p\u003e\n\u003cp\u003eTo address this, this memo defines a path prefix in HTTP(S) URIs for these\n\u0026ldquo;well-known locations\u0026rdquo;, \u0026ldquo;/.well-known/\u0026rdquo;.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome interesting perspectives in \u003ca href=\"https://apibakery.com/blog/tech/no-jwt/\"\u003e\u0026ldquo;Why you should not use JWT\u0026rdquo;\u003c/a\u003e. I can\u0026rsquo;t help\nbut feel that JWTs are overkill in most situations.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTobias Petry\u0026rsquo;s database tips continue to be great. \u003ca href=\"https://twitter.com/tobias_petry/status/1577609056797204482\"\u003eYou can define date ranges\nthat don\u0026rsquo;t overlap through database constraints\u003c/a\u003e \u0026ndash; neat! I\u0026rsquo;ll try and\nremember that one. No MySQL support though but Postgres has you covered.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wrote a \u003ca href=\"https://github.com/raycast/extensions/pull/3149\"\u003eRaycast extension for searching for Hex packages\u003c/a\u003e this week. Bit of\na side tangent from the other side projects I \u003cem\u003eshould\u0026rsquo;ve\u003c/em\u003e been working on, but\nI\u0026rsquo;m pretty pleased with it. I took the existing Rubygems extension and munged\nit about. Using another extension as a basis is a big leg up. I learn far\nbetter from examples so the tons of \u003ca href=\"https://github.com/raycast/extensions\"\u003eexisting extensions in Raycast\u0026rsquo;s repo\u003c/a\u003e\nare a great help.\u003c/p\u003e\n\u003cp\u003eIt hasn\u0026rsquo;t been reviewed or accepted into the Raycast Store yet so 🤞\u003c/p\u003e\n\u003cp\u003eI also used Figma for the first time because I\u0026rsquo;m young, and relevant. I guess\nAdobe will be ruining it soon so it\u0026rsquo;s nice to give a try before that happens.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eAdds TypeScript, React, and Figma to CV\u003c/em\u003e 😉\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI was \u003ca href=\"/weeknotes/47-arbitrary-commands/\"\u003eexcited back in May\u003c/a\u003e that \u003ca href=\"https://github.com/rails/rails/pull/45035\"\u003einitial support for pattern matching against\nActive Models was merged into Rails\u003c/a\u003e, but it seems that \u003ca href=\"https://github.com/rails/rails/pull/45553\"\u003eit was later\nreverted\u003c/a\u003e \u003ca href=\"https://twitter.com/kddnewton/status/1577244992720240641\"\u003edue to concerns over whether the interface was correct\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eHope is not lost though, \u003ca href=\"https://github.com/rails/rails/pull/45070\"\u003eanother PR is in progress\u003c/a\u003e, although discussion\nstalled back in August.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI attended a children\u0026rsquo;s dance show which included the opening monologue of\n\u003ca href=\"https://www.imdb.com/title/tt2184339/\"\u003eThe Purge\u003c/a\u003e. Yeah, bit weird.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eJosé Valim\u0026rsquo;s article on the possible introduction of types into Elixir is an\ninteresting read \u0026ndash; \u003ca href=\"https://elixir-lang.org/blog/2022/10/05/my-future-with-elixir-set-theoretic-types/\"\u003eMy Future with Elixir: set-theoretic types\u003c/a\u003e. The approach\nseems pragmatic, and it will be interesting to see where it goes.\u003c/p\u003e",
      "date_published": "2022-10-09T00:00:00+00:00",
      "date_modified": "2022-10-09T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/66-quick-look-dynamic-island/",
      "url": "https://elver.me/weeknotes/66-quick-look-dynamic-island/",
      "title": "Weeknotes 66: Quick look, Dynamic Island",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m still not taking notes. Let\u0026rsquo;s never speak of it again.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFinally, I have found a solution to the majority of my Quick Look plugins\nbeing broken since moving to an M1 Mac \u0026ndash; \u003ca href=\"https://github.com/sbarex/SourceCodeSyntaxHighlight\"\u003eSyntax Highlight\u003c/a\u003e. This is really\nwell done, supporting loads of languages and is very configurable.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou can tell Active Record to not lazily load associations by default using\nstrict loading (since Rails 6).\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSets the record to strict_loading mode. This will raise an error if the\nrecord tries to lazily load an association.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eVia \u003ca href=\"https://twitter.com/th1agofm/status/1574709902517440512\"\u003eThiago Massa\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/hellojctoon/status/1573348473176723456\"\u003eThe best use of the Dynamic Island\u003c/a\u003e so far.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been trying to revive a side project written in Elixir and Phoenix that I\nstarted two and a half years ago 😅 How time flies. It was barely an\nexperiment but now I\u0026rsquo;m looking to actually make it work.\u003c/p\u003e\n\u003cp\u003eI decided to update Phoenix. A lot has changed, in particular with \u003ca href=\"https://github.com/phoenixframework/phoenix_live_view\"\u003eLiveView\u003c/a\u003e.\nThe upgrade itself was easy, and everything was working afterwards with\nminimal changes, but I decided to try and bring all the defaults up-to-date\ntoo.\u003c/p\u003e\n\u003cp\u003eThe best way I could think to do that was to install the latest Phoenix\ngenerator and generate a new application with the same name in a different\ndirectory. That let me diff the two directories to see what has changed in the\ncode that the generator\u0026hellip;generates. Porting the changes over then became\nfairly straight forward.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fourble.co.uk\"\u003eFourble\u003c/a\u003e is a cool idea.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFourble turns lists of .mp3 files into podcasts. Point it at some audio\nfiles hosted anywhere online, and it\u0026rsquo;ll turn them into a podcast feed which\nyou can subscribe to and share.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/ruby/ruby/pull/6353\"\u003eRuby just had a native immutable value object implementation merged\u003c/a\u003e 🥳\u003c/p\u003e\n\u003cp\u003eI \u003ca href=\"https://github.com/ruby/ruby/blob/master/doc/contributing/building_ruby.md\"\u003edownloaded and built Ruby \u003ccode\u003emaster\u003c/code\u003e\u003c/a\u003e to have a play (which wasn\u0026rsquo;t as\ndifficult as I had imagined after a small hiccup with needing to install\n\u003ccode\u003elibyaml\u003c/code\u003e).\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eirb(main):\u003cspan style=\"color:#099\"\u003e001\u003c/span\u003e:\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003ePerson\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eData\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003edefine(\u003cspan style=\"color:#990073\"\u003e:firstname\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:lastname\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003ePerson\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eirb(main):\u003cspan style=\"color:#099\"\u003e002\u003c/span\u003e:\u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003ePerson\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enew\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(irb):\u003cspan style=\"color:#099\"\u003e2\u003c/span\u003e\u003cspan style=\"color:#990073\"\u003e:in\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e`initialize\u0026#39;: missing keywords: :firstname, :lastname (ArgumentError)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003eirb(main):003:0\u0026gt; person = Person.new(firstname: \u0026#34;Frodo\u0026#34;, lastname: \u0026#34;Baggins\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e=\u0026gt; #\u0026lt;data Person:...\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003eirb(main):004:0\u0026gt; person.inspect\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e=\u0026gt; \u0026#34;#\u0026lt;data Person firstname=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003eFrodo\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e, lastname=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003eBaggins\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026gt;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003eirb(main):005:0\u0026gt; person.firstname\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e=\u0026gt; \u0026#34;Frodo\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003eirb(main):006:0\u0026gt; person.firstname = \u0026#34;Bob\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e(irb):6:in `\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026lt;\u003c/span\u003emain\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;: undefined method `firstname=\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003efor\u003c/span\u003e \u003cspan style=\"color:#998;font-style:italic\"\u003e#\u0026lt;data Person firstname=\u0026#34;Frodo\u0026#34;, lastname=\u0026#34;Baggins\u0026#34;\u0026gt; (NoMethodError)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThere have been various third party libraries to fulfill this need in past\nyears, but I hope having something built-in will mean value objects are\nadopted more. Installing a third party gem will always have more resistance to\nuse.\u003c/p\u003e\n\u003cp\u003eIt looks like \u003ca href=\"https://twitter.com/zverok\"\u003ezverok\u003c/a\u003e has been \u003ca href=\"https://bugs.ruby-lang.org/issues/16122\"\u003eworking on this for 3 years\u003c/a\u003e 😮\u003c/p\u003e\n\u003cp\u003eI guess this will be in Ruby 3.2.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e🔥\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf I could only copy one feature of an existing language when creating a new\none, I would copy Javascript\u0026rsquo;s ability to have its users completely ignore\nall of its flaws.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/teej_dv/status/1576296405945094147\"\u003ehttps://twitter.com/teej_dv/status/1576296405945094147\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m still not taking notes. Let\u0026rsquo;s never speak of it again.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFinally, I have found a solution to the majority of my Quick Look plugins\nbeing broken since moving to an M1 Mac \u0026ndash; \u003ca href=\"https://github.com/sbarex/SourceCodeSyntaxHighlight\"\u003eSyntax Highlight\u003c/a\u003e. This is really\nwell done, supporting loads of languages and is very configurable.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou can tell Active Record to not lazily load associations by default using\nstrict loading (since Rails 6).\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSets the record to strict_loading mode. This will raise an error if the\nrecord tries to lazily load an association.\u003c/p\u003e",
      "date_published": "2022-10-02T00:00:00+00:00",
      "date_modified": "2022-10-02T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/65-verified-debugging-schedule/",
      "url": "https://elver.me/weeknotes/65-verified-debugging-schedule/",
      "title": "Weeknotes 65: Verified debugging schedule",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/petergyang/status/1573489316147306496\"\u003e\u0026ldquo;Kids are using AI to write essays and get straight As\u0026rdquo;\u003c/a\u003e. I\u0026rsquo;m not even mad. I\ndon\u0026rsquo;t know which service/AI is being used, but \u003ca href=\"https://jenni.ai\"\u003eI tried out Jenni\u003c/a\u003e and was\nimpressed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m not very good at SQL. I just don\u0026rsquo;t use it enough in its raw form due to\nORM usage. However, I used a \u003ccode\u003eHAVING\u003c/code\u003e clause this week, and it\u0026rsquo;s handy so\nI\u0026rsquo;m documenting it here.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eSELECT\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003eowner_id,\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eCOUNT\u003c/span\u003e(owner_id)\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eFROM\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003eevents\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eGROUP\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eBY\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003eowner_id\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eHAVING\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eCOUNT\u003c/span\u003e(owner_id)\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#099\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFind all events with more than 1 row. I used this to diagnose a duplicate data\nissue.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis is very nice feature in iOS 16 (via \u003ca href=\"https://twitter.com/rvroo/status/1571415269817335808\"\u003e@RvRoo\u003c/a\u003e)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eJust discovered that the iOS 16 edit menu for text includes conversions.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIf you select a unit amount such as 1/4 inch the popover menu will show the\nconversation to metric automatically. It also works with currencies.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/chris_mccord/status/1554478915477028864\"\u003eChris McCord announced\u003c/a\u003e that \u003ca href=\"https://github.com/phoenixframework/phoenix/blob/master/CHANGELOG.md#introduction-of-verified-routes\"\u003ePhoenix 1.7 will include a new Verified Routes\nfeature\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePhoenix 1.7 includes a new Phoenix.VerifiedRoutes feature which provides ~p\nfor route generation with compile-time verification.\u003c/p\u003e\n\u003cp\u003eUse of the sigil_p macro allows paths and URLs throughout your application\nto be compile-time verified against your Phoenix router(s). For example the\nfollowing path and URL usages:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve often found using path helpers troublesome, both in Phoenix and Rails. I\noften forget the names, arity, and argument order. \u003ca href=\"https://github.com/phoenixframework/phoenix/blob/master/guides/routing.md#verified-routes\"\u003eVerified Routes\u003c/a\u003e look very\nmuch to be the best of both worlds \u0026ndash; build routes as strings, but\ncompile-time checks to make sure the path exists.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYet another interesting video from \u003ca href=\"https://www.youtube.com/watch?v=GMS0JvS7W1Y\"\u003eTJ Devries on \u003ccode\u003evim.schedule\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eNeovim is not multi-threaded, but has an event loop. \u003ccode\u003evim.schedule\u003c/code\u003e allows you\nto schedule a function to be run at the next opportunity. But as TJ explains,\nit is deterministic \u0026ndash; you can work out when it will be run.\u003c/p\u003e\n\u003cp\u003eIt seems that some Neovim APIs can\u0026rsquo;t be accessed in certain situations, and\nthat is when you might use \u003ccode\u003evim.schedule\u003c/code\u003e. TJ explains it better than I.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.meetup.com/south-west-ruby/\"\u003eSouth West Ruby\u003c/a\u003e took place this week. It was a great turn out, with two\ngreat talks by Ksenija Vasjko and \u003ca href=\"https://twitter.com/_st0012\"\u003eStan Lo\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eSonja spoke about various Rails tips, of which one was the new \u003ccode\u003eload_async\u003c/code\u003e\nfeature coming in Rails 7 \u0026ndash; I\u0026rsquo;m keen to see what sort of impact that can have\non loading times.\u003c/p\u003e\n\u003cp\u003eStan spoke about \u003ca href=\"https://github.com/ruby/debug\"\u003eruby/debug\u003c/a\u003e, the newest Ruby debugger. Historically I\u0026rsquo;ve\nbeen very poor at adopting and using debuggers. \u003ca href=\"https://tenderlovemaking.com/2016/02/05/i-am-a-puts-debuggerer.html\"\u003eI have been a \u003ccode\u003eputs\u003c/code\u003e\ndebugger\u003c/a\u003e. Early on in my Ruby career the focus on testing was so great that I\nonly ever used them in a very basic way, but Stan\u0026rsquo;s talk has me interested in\nlearning more.\u003c/p\u003e\n\u003cp\u003eStan has written a blog post on \u003ca href=\"https://st0012.dev/from-byebug-to-ruby-debug\"\u003emigrating from ByeBug\u003c/a\u003e and a \u003ca href=\"https://st0012.dev/ruby-debug-cheatsheet\"\u003euseful\ncheatsheet\u003c/a\u003e too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://phoenixframework.org/blog/phoenix-liveview-0.18-released\"\u003eLiveView 0.18 was released\u003c/a\u003e. Some nice new features \u0026ndash; Declarative Assigns\nand Slots, HEEx HTML Formatter, and Accessibility improvements.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/isainstars/status/1573361835893751808\"\u003eDebug with Mario sounds in Visual Studio\u003c/a\u003e \u0026ndash; lovely work.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/petergyang/status/1573489316147306496\"\u003e\u0026ldquo;Kids are using AI to write essays and get straight As\u0026rdquo;\u003c/a\u003e. I\u0026rsquo;m not even mad. I\ndon\u0026rsquo;t know which service/AI is being used, but \u003ca href=\"https://jenni.ai\"\u003eI tried out Jenni\u003c/a\u003e and was\nimpressed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m not very good at SQL. I just don\u0026rsquo;t use it enough in its raw form due to\nORM usage. However, I used a \u003ccode\u003eHAVING\u003c/code\u003e clause this week, and it\u0026rsquo;s handy so\nI\u0026rsquo;m documenting it here.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eSELECT\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003eowner_id,\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eCOUNT\u003c/span\u003e(owner_id)\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eFROM\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003eevents\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eGROUP\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eBY\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003eowner_id\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eHAVING\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eCOUNT\u003c/span\u003e(owner_id)\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#099\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFind all events with more than 1 row. I used this to diagnose a duplicate data\nissue.\u003c/p\u003e",
      "date_published": "2022-09-25T00:00:00+00:00",
      "date_modified": "2022-09-25T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/64-handy-functions/",
      "url": "https://elver.me/weeknotes/64-handy-functions/",
      "title": "Weeknotes 64: Handy functions",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMoving around in Vim is one of its great strengths. Except for command line\nmode, which I\u0026rsquo;ve always struggled with \u0026ndash; it doesn\u0026rsquo;t seem to allow normal Vim\nmovements. You can, however, move the cursor left and right with your normal\narrow keys, but you can move one word at a time by adding \u003ccode\u003e\u0026lt;shift\u0026gt;\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wrote my first ever \u003ca href=\"https://en.wikipedia.org/wiki/List_of_macOS_components#Automator\"\u003eAutomator Quick Action\u003c/a\u003e 🤯 When I\u0026rsquo;m filing away\npaperwork I always manually prepend the filename with the date. For example\n\u003ccode\u003efilename.pdf\u003c/code\u003e would become \u003ccode\u003e2022-09-18-filename.pdf\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eI thought there must be a better way than manually adding the date, and there\nis, the \u0026ldquo;Rename Finder Items: Add Date or Time\u0026rdquo; Action hooked up as a \u0026ldquo;Quick\nAction\u0026rdquo; in Finder.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNotetaking, the forever project, is still on-going. I\u0026rsquo;m lost in the woods with\nit right now, but I have learnt a few new things about Lua which I will share\nhere.\u003c/p\u003e\n\u003cp\u003eCheck a file exists using in Neovim\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e vim.loop.fs_stat(\u003cspan style=\"color:#d14\"\u003e\u0026#34;path/to/file\u0026#34;\u003c/span\u003e) \u003cspan style=\"color:#000;font-weight:bold\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#998;font-style:italic\"\u003e-- it exists\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eHere is a handy function to get the current git branch\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e-- https://www.reddit.com/r/neovim/comments/uz3ofs/heres_a_function_to_grab_the_name_of_the_current/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003ecurrent_branch_name\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003elocal\u003c/span\u003e git \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e vim.fn.system(\u003cspan style=\"color:#d14\"\u003e\u0026#34;git rev-parse --is-inside-work-tree 2\u0026gt; /dev/null\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e git \u003cspan style=\"color:#000;font-weight:bold\"\u003e~=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003elocal\u003c/span\u003e branch \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e vim.fn.system(\u003cspan style=\"color:#d14\"\u003e\u0026#34;git branch --show-current | tr -d \u0026#39;\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003ereturn\u003c/span\u003e branch\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eGet the length of a string by prepending a \u003ccode\u003e#\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003elocal\u003c/span\u003e name \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Dave\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e#\u003c/span\u003ename \u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#099\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  print(\u003cspan style=\"color:#d14\"\u003e\u0026#34;Hello, Dave\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI\u0026rsquo;ve started reading \u003ca href=\"https://pragprog.com/titles/btlang/seven-languages-in-seven-weeks/\"\u003eSeven Languages in Seven Weeks\u003c/a\u003e, too, of which the first\nchapter is about Lua, so I hope to pick up some new tricks in the coming\nweeks.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePlanetScale are offering a \u003ca href=\"https://planetscale.com/mysql-for-developers\"\u003efree MySQL database course for developers\u003c/a\u003e. I\nhaven\u0026rsquo;t used MySQL for a long time, but the reference to \u003ca href=\"https://xkcd.com/327/\"\u003eLittle Bobby Tables\u003c/a\u003e\nnearly made me sign up.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTalking of MySQL\u0026hellip;this is the first time in a long time that MySQL has had\na feature that I wish Postgres did \u0026ndash; \u003ca href=\"https://twitter.com/tobias_petry/status/1569957951238017024\"\u003emaking an index invisible before\ndeletion\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDeleting an unused index is still a risky operation: If you are wrong (and\nit is still needed) the database will become slow. Before deleting it, you\ncan make the index invisible first and make it visible again instantly if\nyou still need it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI agree with \u003ca href=\"https://twitter.com/strzibnyj\"\u003eJosef Strzibny\u003c/a\u003e on all points in \u003ca href=\"https://nts.strzibny.name/why-not-rspec/\"\u003e\u0026ldquo;Why I don\u0026rsquo;t enjoy RSpec all that\nmuch\u0026rdquo;\u003c/a\u003e, especially the parts about \u0026ldquo;Indirect references\u0026rdquo;. RSpec tests always\nstart off looking great, DRY, neat, tidy. Until they grow and grow as they\ntend to at which point you have slow, difficult to grok, tests.\u003c/p\u003e\n\u003cp\u003eI almost exclusively use RSpec. And I know it better than minitest. Why?\nBecause it\u0026rsquo;s the default in 99% of projects I work on. I think Rails shipping\nwith minitest tests is the right thing to do, but I would bet one of the first\nthing most developers do is install RSpec.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which, \u003ca href=\"https://twitter.com/searls/status/1570471265944866816\"\u003e@searls describes everything wrong with RSpec\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe DSL provides numerous ways to structure tests and everyone has a\ndifferent opinion (subject is great, subject is evil, let is good/bad,\nnesting is good/bad), leading to terrific inconsistency on projects as\nindividuals express their own favorite way on the specs they write unless\nyou dictate a style in a really authoritarian way\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnd, \u003ca href=\"https://twitter.com/searls/status/1570509265101791232\"\u003ehe continues (this is like a greatest hits) regarding Rails and OOP\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAs soon as anything resembling feature behavior or \u0026ldquo;business logic\u0026rdquo; or real\nwork, I get the hell out of dodge and into a PORO that I control and that\nlives in a namespace in app/lib.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHonestly, I don\u0026rsquo;t do this. But I wish I could.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI accidentally came across Live Text on macOS Monterey this week. I reading\nsome text from a screenshot and realised I could select it with my mouse. A\nvery nice feature and complementary to \u003ca href=\"/weeknotes/32-what-a-pushover/\"\u003eCleanshot\u0026rsquo;s OCRing capability\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother project milestone passed by this week. The end is in sight.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMoving around in Vim is one of its great strengths. Except for command line\nmode, which I\u0026rsquo;ve always struggled with \u0026ndash; it doesn\u0026rsquo;t seem to allow normal Vim\nmovements. You can, however, move the cursor left and right with your normal\narrow keys, but you can move one word at a time by adding \u003ccode\u003e\u0026lt;shift\u0026gt;\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wrote my first ever \u003ca href=\"https://en.wikipedia.org/wiki/List_of_macOS_components#Automator\"\u003eAutomator Quick Action\u003c/a\u003e 🤯 When I\u0026rsquo;m filing away\npaperwork I always manually prepend the filename with the date. For example\n\u003ccode\u003efilename.pdf\u003c/code\u003e would become \u003ccode\u003e2022-09-18-filename.pdf\u003c/code\u003e.\u003c/p\u003e",
      "date_published": "2022-09-18T00:00:00+00:00",
      "date_modified": "2022-09-18T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/63-line-up-with-mathematical-precision/",
      "url": "https://elver.me/weeknotes/63-line-up-with-mathematical-precision/",
      "title": "Weeknotes 63: Line up with mathematical precision",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ePlease, I beg you \u0026ndash; \u003ccode\u003es/Github/GitHub/\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI found a use for \u003ca href=\"https://api.rubyonrails.org/v7.0.3/classes/ActiveRecord/Batches.html#method-i-find_in_batches\"\u003eActiveRecord\u0026rsquo;s \u003ccode\u003efind_in_batches\u003c/code\u003e\u003c/a\u003e this week. I started off\nwith \u003ccode\u003efind_each\u003c/code\u003e to run a backfill over thousands of records, but ended up\nwanting to splay the jobs out so ended up using \u003ccode\u003efind_in_batches\u003c/code\u003e which will\nreturn the records you need and the batch number.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efind_in_batches\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ewith_index \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003egroup, batch\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#0086b3\"\u003eputs\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Processing group \u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e#{\u003c/span\u003ebatch\u003cspan style=\"color:#d14\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  group\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eeach \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003efoo\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#998;font-style:italic\"\u003e# do something with `foo`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA would hazard a guess that a lot of Heroku customers take advantage of Review\nApps, and Review Apps are configured using \u003ccode\u003eapp.json\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSomewhat confusingly they don\u0026rsquo;t respect the plan you specify in your\n\u003ccode\u003eapp.json\u003c/code\u003e. The addons configured default to whatever the free plan is. If you\nwant something other than the default you need to contact Heroku support who\ncan enable that for you.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you\u0026rsquo;re into Elixir, or curious, you should definitely take a look at this\n\u003ca href=\"https://www.humblebundle.com/books/elixir-programming-pragmatic-programmers-books\"\u003eHumble Bundle of Elixir Books\u003c/a\u003e. I already own quite of few of these books,\nbut even so, it\u0026rsquo;s still a bargain and you\u0026rsquo;re also donating to charity, which\nis nice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe had need to start auditing our \u003ccode\u003erails console\u003c/code\u003e activity this week. It\u0026rsquo;s\ncrazy how many companies won\u0026rsquo;t give you access to a database but are happy to\ngive you unfettered access to \u003ccode\u003erails console\u003c/code\u003e. There are a couple of gems from\n\u003ca href=\"https://github.com/basecamp/\"\u003eBasecamp\u003c/a\u003e that we hope can help: \u003ca href=\"https://github.com/basecamp/console1984\"\u003e\u003ccode\u003econsole1984\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://github.com/basecamp/audits1984\"\u003e\u003ccode\u003eaudits1984\u003c/code\u003e\u003c/a\u003e. We\u0026rsquo;ve\nyet to install them, but they look promising.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNot more Neovim plugins! Yes, always.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/nvim-treesitter/nvim-treesitter-context\"\u003e\u003ccode\u003envim-treesitter-context\u003c/code\u003e\u003c/a\u003e is nice. It shows you the context of current\nclass, method, whatever that you\u0026rsquo;re in as you navigate the file. So, say you\nhave a method that takes up more than the available screen real estate, it\nwill show the first line of the method at the top of the screen so you know\nwhich method you\u0026rsquo;re in as the buffer scrolls.\u003c/p\u003e\n\u003cp\u003eHat tip to \u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e for clueing me in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003egit commit -m\u003c/code\u003e should be banned. Yeah, I said it. And \u003ccode\u003egit commit -a\u003c/code\u003e whilst\nyou\u0026rsquo;re at it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI learnt that you can add and commit a file in one go using \u003ccode\u003egit commit path/to/file\u003c/code\u003e \u0026ndash; add that to the ban list too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/tobias_petry/status/1567445606586621953\"\u003eTobias Petry tweeted\u003c/a\u003e about a Postgres extension I hadn\u0026rsquo;t heard of \u0026ndash; \u003ca href=\"https://www.postgresql.org/docs/current/ltree.html\"\u003eltree\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDid you know there are alternative ways of storing trees in a database\nwithout a parent_id and many queries to get all ancestors/children or the\ncomplex nested set concept?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe extension is available on Heroku in case you were wondering. They have \u003ca href=\"https://devcenter.heroku.com/articles/heroku-postgres-extensions-postgis-full-text-search\"\u003ea\nsurprising amount of extensions available\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://patshaughnessy.net/2017/12/11/trying-to-represent-a-tree-structure-using-postgres\"\u003ePat Shaughnessy has a series of blog posts on ltree\u003c/a\u003e which look very in-depth\nbut I\u0026rsquo;ve only had time to give them a cursory look.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"https://www.raycast.com/MisakiCoca/link-cleaner\"\u003eLink Cleaner extension for Raycast\u003c/a\u003e has been making my life easier when\npreparing links for these weeknotes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was under the mistaken impression that the \u003ccode\u003earch\u003c/code\u003e utility on macOS was for\nrunning programs under different architectures on an Apple Silicon CPU. But,\nno. It\u0026rsquo;s slightly more subtle than that:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf Rosetta is installed, the system will run x64 binaries automatically, you\ndon’t need arch\u003c/p\u003e\n\u003cp\u003earch is only required if you want to force the use of a specific version in\nan \u003cstrong\u003euniversal binary\u003c/strong\u003e (containing both x64 and arm code), e.g. to run the\nx64 version of a binary if it relies on plugins only available in x64.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e(From: \u003ca href=\"https://apple.stackexchange.com/a/423917\"\u003eHow am I running x86_64 programs without arch on Apple Silicon?\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA colleague set the env var \u003ccode\u003eDISABLE_DATABASE_ENVIRONMENT_CHECK\u003c/code\u003e\nthis week. I\u0026rsquo;ve never seen it used before so my interest was peaked.\nApparently, it \u003ca href=\"https://www.bigbinary.com/blog/rails-5-prevents-destructive-action-on-production-db\"\u003edisables Rails\u0026rsquo; built-in environment checking\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eWhen you first migrate your database the environment is written to a row in\nthe \u003ccode\u003ear_internal_metadata\u003c/code\u003e database table. If that value is \u003ccode\u003e\u0026quot;production\u0026quot;\u003c/code\u003e and\nyou try and run a destructive action like \u003ccode\u003edb:schema:load\u003c/code\u003e Rails will raise an\nexception preventing you from destroying your database \u0026ndash; nice feature.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/lilykonings/status/1567317037126680576\"\u003eLily Konings is right on\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTiny design detail: nested border radii look really funky if they\u0026rsquo;re the\nsame. To maintain the same curvature, the outer radius = inner radius +\npadding.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI see this a lot and it drives me mad.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRelated, the new \u003ca href=\"https://twitter.com/sdw/status/1568056259060047873\"\u003eiPhone 14 Dynamic Island doesn\u0026rsquo;t quite line up\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyou’ll never be able to unsee this, enjoy your new iPhone folks, I will be\nin the corner screaming into a pillow\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHowever, this take is wrong imo. Lining things up with mathematical precision\nis not always what looks best.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI finished \u003ca href=\"https://www.imdb.com/title/tt14452776/\"\u003eThe Bear\u003c/a\u003e this week \u0026ndash; loved it! It\u0026rsquo;s a good job the episodes are\nshort as it\u0026rsquo;s a pretty intense watch for a show about a sandwich shop.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCharles Petzold on \u003ca href=\"http://www.charlespetzold.com/blog/2022/09/The-Changes-for-the-2nd-Edition-of-Code.html\"\u003eThe Changes for the 2nd Edition of “Code”\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSo it goes. The only consolation is that I’m not the only person in the\nworld forced into using JavaScript. There are literally millions.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://shapeof.com/archives/2022/9/changes_for_the_2nd_edition_of_code.html\"\u003eGus Mueller\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis made me laugh.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e😅\u003c/p\u003e\n\u003cp\u003e(Via \u003ca href=\"https://shapeof.com/archives/2022/9/changes_for_the_2nd_edition_of_code.html\"\u003eThe Shape of Everything\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ePlease, I beg you \u0026ndash; \u003ccode\u003es/Github/GitHub/\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI found a use for \u003ca href=\"https://api.rubyonrails.org/v7.0.3/classes/ActiveRecord/Batches.html#method-i-find_in_batches\"\u003eActiveRecord\u0026rsquo;s \u003ccode\u003efind_in_batches\u003c/code\u003e\u003c/a\u003e this week. I started off\nwith \u003ccode\u003efind_each\u003c/code\u003e to run a backfill over thousands of records, but ended up\nwanting to splay the jobs out so ended up using \u003ccode\u003efind_in_batches\u003c/code\u003e which will\nreturn the records you need and the batch number.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efind_in_batches\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ewith_index \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003egroup, batch\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#0086b3\"\u003eputs\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Processing group \u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e#{\u003c/span\u003ebatch\u003cspan style=\"color:#d14\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  group\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eeach \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003efoo\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#998;font-style:italic\"\u003e# do something with `foo`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA would hazard a guess that a lot of Heroku customers take advantage of Review\nApps, and Review Apps are configured using \u003ccode\u003eapp.json\u003c/code\u003e.\u003c/p\u003e",
      "date_published": "2022-09-11T00:00:00+00:00",
      "date_modified": "2022-09-11T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/62-rockstar-developer/",
      "url": "https://elver.me/weeknotes/62-rockstar-developer/",
      "title": "Weeknotes 62: Rockstar Developer",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://elixir-lang.org/blog/2022/09/01/elixir-v1-14-0-released/\"\u003eElixir v1.14 was released\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://2022.elixirconf.com\"\u003eElixirConf 2022\u003c/a\u003e took place Aug 30 - Sep 2 and \u003ca href=\"https://dockyard.com\"\u003eDockYard\u003c/a\u003e announced various\nnew initiatives, but two caught my eye. \u003ca href=\"https://github.com/BeaconCMS/beacon\"\u003eBeacon\u003c/a\u003e, a new CMS built using\n\u003ca href=\"https://github.com/phoenixframework/phoenix_live_view\"\u003eLiveView\u003c/a\u003e, and \u003ca href=\"https://native.live\"\u003eLiveView Native\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLiveView Native empowers developers to build native and web applications\nseamlessly with Phoenix\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m keen to seen how both of these develop.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eGOOD NEWS\u003c/strong\u003e The painting has finally been finished! \u003cstrong\u003eBAD NEWS\u003c/strong\u003e We spent\nthe bank holiday weekend painting. \u003cstrong\u003eGOOD NEWS\u003c/strong\u003e It\u0026rsquo;s a four days week!\u003c/p\u003e\n\u003cp\u003eOverall, good news.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/riverscuomo\"\u003eRivers Cuomo has a GitHub profile\u003c/a\u003e. The only valid use of Rockstar Developer.\u003c/p\u003e\n\u003cp\u003e(Via \u003ca href=\"https://twitter.com/_davideast/status/1565872899029979137\"\u003eDavid East\u003c/a\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe fallout from Heroku\u0026rsquo;s canning of their free tier is somewhat predictable\n\u0026ndash; lots of people trying to find new homes for their apps. We are spoilt for\nchoice in some ways, but I\u0026rsquo;m not sure that any of the available options have\nthe ease of Heroku (I have yet to try them though, so take that as you will).\u003c/p\u003e\n\u003cp\u003eThe amount of people espousing \u0026ldquo;just get a $5 VPS\u0026rdquo; are completely missing the\npoint, as usual. These options have always been available, and are a great\nchoice for many people, but they \u003cem\u003eare not\u003c/em\u003e what Heroku offers. In particular,\nHeroku Postgres is something not easily replicated on a \u0026ldquo;$5 VPS\u0026rdquo;. I would be\nkeen to know about options in that area.\u003c/p\u003e\n\u003cp\u003eBoth \u003ca href=\"https://twitter.com/nicalpi/status/1564283776674537472\"\u003eNic Alpi\u003c/a\u003e and \u003ca href=\"https://twitter.com/purpleriver_dev/status/1565324010136690689\"\u003ePhil Reynolds\u003c/a\u003e tweeted about their experiences trying out\ndifferent providers \u0026ndash; worth a read if you\u0026rsquo;re planning a move.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI found out about \u003ca href=\"https://www.postgresql.org/docs/current/rangetypes.html\"\u003ePostgreSQL range types\u003c/a\u003e this week.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRange types are data types representing a range of values of some element\ntype (called the range\u0026rsquo;s subtype). For instance, ranges of timestamp might\nbe used to represent the ranges of time that a meeting room is reserved.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ePretty neat. Even better, \u003ca href=\"https://guides.rubyonrails.org/active_record_postgresql.html#range-types\"\u003eRails has support for them\u003c/a\u003e, and maps the values to\n\u003ca href=\"https://rubyapi.org/3.1/o/range\"\u003e\u003ccode\u003eRange\u003c/code\u003e\u003c/a\u003e objects in Ruby-land.\u003c/p\u003e\n\u003cp\u003eI think years of Rails has held back the use of great database features. This\nis definitely changing though with Rails supporting a lot of new cool new\nstuff.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.getrevue.co/profile/vim_tricks/issues/search-in-visual-selection-1332992\"\u003eSearch without a visual selection\u003c/a\u003e using \u003ccode\u003e/\\%V\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t think I\u0026rsquo;ll ever \u003cem\u003eknow\u003c/em\u003e Vim\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eJust as I realised we can use \u003ca href=\"https://en.wikipedia.org/wiki/WebP\"\u003eWebP\u003c/a\u003e \u003ca href=\"https://caniuse.com/?search=webp\"\u003enow\u003c/a\u003e I hear about \u003ca href=\"https://en.wikipedia.org/wiki/AVIF\"\u003eAVIF\u003c/a\u003e 😅\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://elixir-lang.org/blog/2022/09/01/elixir-v1-14-0-released/\"\u003eElixir v1.14 was released\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://2022.elixirconf.com\"\u003eElixirConf 2022\u003c/a\u003e took place Aug 30 - Sep 2 and \u003ca href=\"https://dockyard.com\"\u003eDockYard\u003c/a\u003e announced various\nnew initiatives, but two caught my eye. \u003ca href=\"https://github.com/BeaconCMS/beacon\"\u003eBeacon\u003c/a\u003e, a new CMS built using\n\u003ca href=\"https://github.com/phoenixframework/phoenix_live_view\"\u003eLiveView\u003c/a\u003e, and \u003ca href=\"https://native.live\"\u003eLiveView Native\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLiveView Native empowers developers to build native and web applications\nseamlessly with Phoenix\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m keen to seen how both of these develop.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eGOOD NEWS\u003c/strong\u003e The painting has finally been finished! \u003cstrong\u003eBAD NEWS\u003c/strong\u003e We spent\nthe bank holiday weekend painting. \u003cstrong\u003eGOOD NEWS\u003c/strong\u003e It\u0026rsquo;s a four days week!\u003c/p\u003e",
      "date_published": "2022-09-04T00:00:00+00:00",
      "date_modified": "2022-09-04T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/61-data-breach/",
      "url": "https://elver.me/weeknotes/61-data-breach/",
      "title": "Weeknotes 61: Data breach",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/rayredacted/status/1562914396732801025\"\u003e30TB SSD for $29?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHave you ever heard the expression “if it sounds too good to be true, it\nprobably is”?  Well AliExpress is currently advertising a 30 Terabyte SSD\nfor $29\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/2022/8/24/23319570/plex-security-breach-exposes-usernames-emails-passwords\"\u003ePlex had a data breach\u003c/a\u003e this week which prompted me to reset my password.\nNothing too concerning as I have unique passwords for everything. However,\nresetting my password led to me being unable to connect my local Plex server.\nPretty soon I was editing XML on the server to \u0026ldquo;reclaim\u0026rdquo; it 😬\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI don\u0026rsquo;t advocate working weekends or in the evenings. However, I think each\nperson needs to decide what is best for them, where possible. And I sometimes\nget blocked and work better outside of the working week, so last Sunday I did\nsome preparatory work for the following day. This made my Monday\nimmeasurably better than a normal Monday.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/junegunn\"\u003ejunegunn\u003c/a\u003e recently released \u003ca href=\"https://github.com/junegunn/fzf-git.sh\"\u003efzf-git.sh\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ebash and zsh key bindings for Git objects, powered by fzf.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBeing a big fan of \u003ca href=\"https://github.com/junegunn/fzf\"\u003e\u003ccode\u003efzf\u003c/code\u003e\u003c/a\u003e I was intrigued, but soon discovered only bash and\nzsh were supported 😢 But I then realised that, presumably, the reason for no\nfish support is that it \u003cem\u003ealready\u003c/em\u003e has amazing built-in completion that shows\ncommit objects.\u003c/p\u003e\n\u003cp\u003eLike most of the tools I use regularly I feel like I\u0026rsquo;m not using them to their\nfullest, so I took some time to refresh my memory with some fish things\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA few of fish tips:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eWhen you\u0026rsquo;re paging a set of completion results you can trigger a search\nfield by typing \u003ccode\u003eCTRL-s\u003c/code\u003e. This lets you further filter down what is\nreturned.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou can eschew \u003ccode\u003ecd\u003c/code\u003e by just typing a path and hitting enter.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fishshell.com/docs/current/cmds/fish_config.html\"\u003e\u003ccode\u003efish_config\u003c/code\u003e\u003c/a\u003e is very cool. A web interface for configuring fish. I don\u0026rsquo;t\nuse this much directly, but it\u0026rsquo;s very useful for playing around.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI used \u003ca href=\"https://blog.saeloun.com/2019/12/04/ruby-2-7-adds-new-operator-for-arguments-forwarding.html\"\u003eRuby\u0026rsquo;s argument forwarding syntax\u003c/a\u003e this week. Introduced in Ruby 2.7\n(!).\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003efoo\u003c/span\u003e(\u003cspan style=\"color:#000;font-weight:bold\"\u003e...\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  bar(\u003cspan style=\"color:#000;font-weight:bold\"\u003e...\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis is very handy for lowering cognitive load when all you want to do is pass\nthrough arguments. Especially keyword arguments which are visually wordy.\u003c/p\u003e\n\u003cp\u003eWhen new Ruby features come out I often can\u0026rsquo;t use them because my projects\nwill be on an older Ruby. Then I forget for years. And then I write an entry\nin my weeknotes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/aristocratos/btop\"\u003e\u003ccode\u003ebtop++\u003c/code\u003e\u003c/a\u003e is a very cool system resources monitor.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTJ Devries explains how to write basic queries for Treesitter in \u003ca href=\"https://www.youtube.com/watch?v=v3o9YaHBM4Q\"\u003e\u0026ldquo;Magically\nformat embedded languages in Neovim\u0026rdquo;\u003c/a\u003e. He makes it looks easy, of course, but\nit also looks very achievable to do something like this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCoincidently, I came across the \u003ca href=\"https://github.com/nvim-treesitter/playground\"\u003eTreesitter Playground plugin\u003c/a\u003e for neovim,\nwhich TJ demonstrates in the aforementioned video. It\u0026rsquo;s very cool. It shows\nthe live Treesitter generated AST for the current document. The visual nature\nhas helped me understand Treesitter.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA fairly big milestone was reached on a project I\u0026rsquo;m working on this week. I\nwas really pleased, not only for the progress that has been made, but for how\nsmoothly it has gone. (Oh course, I don\u0026rsquo;t like to celebrate too much for\nfear of everything going wrong.)\u003c/p\u003e\n\u003cp\u003eIt didn\u0026rsquo;t get the reception I was hoping for. So it goes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHeroku are discontinuing their free plans \u0026ndash; a sad day. I guess we knew this\nday would come eventually. This seems like a self-own by Salesforce but I\nsuspect they just don\u0026rsquo;t care about the little guy anymore. As \u003ca href=\"https://twitter.com/getajobmike/status/1562827836096126977\"\u003eMike Perham\npointed out\u003c/a\u003e, most projects start small on free Dynos and end up paying\nconsiderable amounts to Heroku later, it seems very short-sighted to me.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/film_girl/status/1562842159027744774\"\u003eChristina Warren won the Internet with her tweet\u003c/a\u003e 🤣\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHeroku. More like Seppuku, am I right?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL Rails models can be made read only by implementing \u003ccode\u003e#readonly?\u003c/code\u003e. This\nstops them being updated.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eFooBar\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003ereadonly?\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePreviously you could bypass this restriction using \u003ca href=\"https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-touch\"\u003e\u003ccode\u003e#touch\u003c/code\u003e\u003c/a\u003e or\n\u003ca href=\"https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_columns\"\u003e\u003ccode\u003e#update_columns\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://blog.saeloun.com/2022/08/24/readonly-touch-update-attr-fix.html\"\u003ebut not any more\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/rayredacted/status/1562914396732801025\"\u003e30TB SSD for $29?\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHave you ever heard the expression “if it sounds too good to be true, it\nprobably is”?  Well AliExpress is currently advertising a 30 Terabyte SSD\nfor $29\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.theverge.com/2022/8/24/23319570/plex-security-breach-exposes-usernames-emails-passwords\"\u003ePlex had a data breach\u003c/a\u003e this week which prompted me to reset my password.\nNothing too concerning as I have unique passwords for everything. However,\nresetting my password led to me being unable to connect my local Plex server.\nPretty soon I was editing XML on the server to \u0026ldquo;reclaim\u0026rdquo; it 😬\u003c/p\u003e",
      "date_published": "2022-08-28T00:00:00+00:00",
      "date_modified": "2022-08-28T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/60-massive-savings/",
      "url": "https://elver.me/weeknotes/60-massive-savings/",
      "title": "Weeknotes 60: Massive savings",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA much better week than last. Surprising how a few days off and some good\nchats with a trusted colleague can improve things. Still, I\u0026rsquo;m very keen to get\noff of my current project and onto something new. I need a change.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about the \u003ca href=\"https://github.com/facebook/zstd\"\u003e\u003ccode\u003eZStandard\u003c/code\u003e\u003c/a\u003e (also known as \u003ccode\u003ezstd\u003c/code\u003e) compression algorithm from\nFacebook (via \u003ca href=\"https://twitter.com/danluu/status/1560831128914649088\"\u003eDan Luu\u003c/a\u003e). The savings to be had seem impressive.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/adrianco/status/1560854827810361345\"\u003eAdrian Cockcroft\u003c/a\u003e replied saying Amazon saved 30% at S3, which was later\nclarified by \u003ca href=\"https://www.reddit.com/r/programming/comments/wtd61q/comment/il4uu67/\"\u003esomeone else on Reddit\u003c/a\u003e that the savings were on internal\nlogs rather than data stored. I don\u0026rsquo;t know who is correct, but the savings\nare impressive nonetheless.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve started taking my USB-chargeable desk fan to coffee shops. I don\u0026rsquo;t know\nwhy I didn\u0026rsquo;t think of this before. Easily transportable, and takes the edge\noff stuffy buildings. I\u0026rsquo;m cool (literally).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI switched over to \u003ca href=\"https://github.com/lewis6991/gitsigns.nvim\"\u003eGitsigns\u003c/a\u003e from \u003ca href=\"https://github.com/airblade/vim-gitgutter\"\u003egit-gutter\u003c/a\u003e. I prefer the visual style of\nGitsigns, but it does seem buggier for me so far \u0026ndash; not updating when it\nshould etc. I will persevere for a while to see if things work out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/axelvc/template-string.nvim\"\u003eTemplate String Converter\u003c/a\u003e is a simple Neovim plugin which converts regular\nquotes in JavaScript to backtick template strings when you interpolate values\n\u0026ndash; a nice little feature if you write JavaScript or TypeScript.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t think I\u0026rsquo;ll get around to using this any time soon, I\u0026rsquo;m not currently\nwriting much JavaScript, but \u003ca href=\"/weeknotes/57-crimping-automatically/\"\u003eas I\u0026rsquo;ve said before\u003c/a\u003e the really cool thing is\nhow easily this seems to have been achieved with relatively little code.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI installed \u003ca href=\"https://github.com/stevearc/aerial.nvim\"\u003eAerial\u003c/a\u003e in order to get an overview of RSpec test files (which\noften get long and unwieldy). There are so many interesting plugins these\ndays that it can be overwhelming as nearly every plugin comes with some amount\nof learning required.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been hearing about \u003ca href=\"https://github.com/tree-sitter/tree-sitter\"\u003eTreesitter\u003c/a\u003e for a long time but never really grokked\nwhy it was important. Many plugins are now taking advantage of Treesitter to\nget a better understanding of the code they might be operating on.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTree-sitter is a parser generator tool and an incremental parsing library.\nIt can build a concrete syntax tree for a source file and efficiently update\nthe syntax tree as the source file is edited.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNeovim integrates this library using \u003ca href=\"https://github.com/nvim-treesitter/nvim-treesitter\"\u003envim-treesitter\u003c/a\u003e and you can install\nsupport for your favourite programming language using \u003ccode\u003e:TSInstall\u003c/code\u003e.  For\nexample, \u003ccode\u003e:TSInstall ruby\u003c/code\u003e. I will be trying to take advantage more in the\nfuture.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTalking of installing plugins and playing around with Treesitter. I am\ncurrently experiencing a weird issue when editing files where I suddenly\ncan\u0026rsquo;t navigate within the file \u0026ndash; very strange.\u003c/p\u003e\n\u003cp\u003eCurrent potential suspects are: Aerial, installing the Ruby treesitter module\nusing \u003ccode\u003e:TSInstall ruby\u003c/code\u003e, or Gitsigns. These are all things I recently changed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/stefanjudis/status/1558824620039585795\"\u003e\u0026ldquo;TIL you can force push git branches with \u003ccode\u003e+\u003c/code\u003e.\u0026rdquo;\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eAt first, I was like \u0026ldquo;this is cool\u0026rdquo;, but now I\u0026rsquo;ve decided this is a pretty\nterrible idea to save a few characters.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/farazamiruddin/status/1553184620472156160\"\u003efaraz on Twitter\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSince joining Netflix, it\u0026rsquo;s been an adjustment not following a software\ndevelopment process.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ePart of me thinks this sounds great. The other part thinks it would lead to\nutter chaos. However, I do sometimes wonder whether we\u0026rsquo;re all just \u003ca href=\"https://en.wikipedia.org/wiki/Cargo_cult_programming\"\u003ecargo\nculting\u003c/a\u003e the least worst process we could come up with\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt looks like Autumn outside with trees already losing their leaves. This is\nunfortunate since it\u0026rsquo;s August, and apparently caused by the tree going into\nshock 😟\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA much better week than last. Surprising how a few days off and some good\nchats with a trusted colleague can improve things. Still, I\u0026rsquo;m very keen to get\noff of my current project and onto something new. I need a change.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about the \u003ca href=\"https://github.com/facebook/zstd\"\u003e\u003ccode\u003eZStandard\u003c/code\u003e\u003c/a\u003e (also known as \u003ccode\u003ezstd\u003c/code\u003e) compression algorithm from\nFacebook (via \u003ca href=\"https://twitter.com/danluu/status/1560831128914649088\"\u003eDan Luu\u003c/a\u003e). The savings to be had seem impressive.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/adrianco/status/1560854827810361345\"\u003eAdrian Cockcroft\u003c/a\u003e replied saying Amazon saved 30% at S3, which was later\nclarified by \u003ca href=\"https://www.reddit.com/r/programming/comments/wtd61q/comment/il4uu67/\"\u003esomeone else on Reddit\u003c/a\u003e that the savings were on internal\nlogs rather than data stored. I don\u0026rsquo;t know who is correct, but the savings\nare impressive nonetheless.\u003c/p\u003e",
      "date_published": "2022-08-21T00:00:00+00:00",
      "date_modified": "2022-08-21T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/59-the-llama-s-ass-etc/",
      "url": "https://elver.me/weeknotes/59-the-llama-s-ass-etc/",
      "title": "Weeknotes 59: The Llama's ass etc",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.bleepingcomputer.com/news/software/winamp-releases-new-version-after-four-years-in-development/\"\u003eWinamp is back?!\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://api.rubyonrails.org/classes/ActiveRecord/SignedId.html\"\u003e\u003ccode\u003eActiveRecord::SignedId\u003c/code\u003e\u003c/a\u003e seems neat (via \u003ca href=\"https://twitter.com/afomera/status/1557033868372324353\"\u003eAndrea Fomera\u003c/a\u003e).\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMaking a signed id with a purpose and expiration is the feature from Rails\nmore people should know about.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIndeed, I didn\u0026rsquo;t know Rails had this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI got access to \u003ca href=\"https://openai.com/dall-e-2/\"\u003eDALL-E 2\u003c/a\u003e this week. I\u0026rsquo;ve been fairly uninterested in \u0026ldquo;A.I.\u0026rdquo;\nup until now but I have to say I was impressed by what it can produce. I could\nsee it being really useful for generating ideas.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDALL-E 2 is a new AI system that can create realistic images and art from\ndescription in natural language.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI briefly moved web browser to Firefox this week. Safari has been slow for me\nfor quite a while, and it was becoming untenable. That was until I found the\n\u0026ldquo;Limit IP Address Tracking\u0026rdquo; checkbox in the Network System Preferences.\nUnchecking that option \u003cem\u003eseems\u003c/em\u003e to have revived Safari 🤞\u003c/p\u003e\n\u003cp\u003ePeople are often surprised that I\u0026rsquo;m a Safari user, but it\u0026rsquo;s is so much more\nMac-like than Chrome or Firefox. And both of those browsers lack the \u0026ldquo;Look Up\u0026rdquo;\nfeature that I constantly use.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wasn\u0026rsquo;t feeling very well this week so I decided to take Wednesday to Friday\noff. I spent those days worrying, so that was a good use of time.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been refactoring my Neovim config to make it more modular. I have several\nthings that I want to add which will require a lot of config, and the current\nconfig is already a bit of a mess.\u003c/p\u003e\n\u003cp\u003eI decided to move to \u003ca href=\"https://github.com/wbthomason/packer.nvim\"\u003ePacker\u003c/a\u003e from \u003ca href=\"https://github.com/junegunn/vim-plug\"\u003evim-plug\u003c/a\u003e first, as is seemed more\nextensible and has a more flexible configuration, which I hoped would allow me\nto split things up a bit. I think I\u0026rsquo;ve succeeded in cleaning my plugin\ndefinitions, so that\u0026rsquo;s a good start.\u003c/p\u003e\n\u003cp\u003eI plan on splitting out the remaining config next.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.bleepingcomputer.com/news/software/winamp-releases-new-version-after-four-years-in-development/\"\u003eWinamp is back?!\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://api.rubyonrails.org/classes/ActiveRecord/SignedId.html\"\u003e\u003ccode\u003eActiveRecord::SignedId\u003c/code\u003e\u003c/a\u003e seems neat (via \u003ca href=\"https://twitter.com/afomera/status/1557033868372324353\"\u003eAndrea Fomera\u003c/a\u003e).\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMaking a signed id with a purpose and expiration is the feature from Rails\nmore people should know about.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIndeed, I didn\u0026rsquo;t know Rails had this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI got access to \u003ca href=\"https://openai.com/dall-e-2/\"\u003eDALL-E 2\u003c/a\u003e this week. I\u0026rsquo;ve been fairly uninterested in \u0026ldquo;A.I.\u0026rdquo;\nup until now but I have to say I was impressed by what it can produce. I could\nsee it being really useful for generating ideas.\u003c/p\u003e",
      "date_published": "2022-08-14T00:00:00+00:00",
      "date_modified": "2022-08-14T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/58-unproductive-content-scroller/",
      "url": "https://elver.me/weeknotes/58-unproductive-content-scroller/",
      "title": "Weeknotes 58: Unproductive content scroller",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMore amazing CSS from \u003ca href=\"https://twitter.com/jh3yy\"\u003eJhey\u003c/a\u003e in \u003ca href=\"https://codepen.io/jh3y/pen/gOeXgXv\"\u003ethese\u003c/a\u003e \u003ca href=\"https://codepen.io/jh3y/pen/KKoRXbV\"\u003etwo\u003c/a\u003e CSS-only content scrollers 🤩\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI updated my \u003ca href=\"https://elver.me/uses/\"\u003e/uses\u003c/a\u003e page with details of my home server setup.\u003c/p\u003e\n\u003cp\u003eThe old school \u0026ldquo;design\u0026rdquo; of the page was bit \u003cem\u003etoo\u003c/em\u003e old skool, so I made a small\ntweak to give the page a maximum width specified with \u003ccode\u003ech\u003c/code\u003e units. How modern.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHugo introduced a feature called \u0026ldquo;Render Hooks\u0026rdquo; in \u003ca href=\"https://github.com/gohugoio/hugo/releases/tag/v0.62.0\"\u003eversion 0.62.0\u003c/a\u003e. I\u0026rsquo;ve been\nlooking for a way to output anchor IDs for list items allowing me to link\ndirectly to them and being able to hook into the rendering lifecycle sounded\npromising. The bad news is that there is no support for list items 😢\u003c/p\u003e\n\u003cp\u003eWhich is why I\u0026rsquo;m interested in this PR: \u003ca href=\"https://github.com/gohugoio/hugo/pull/9858\"\u003eListitem render hook #9858\u003c/a\u003e. So now I\nwait to see if it makes any progress towards being merged.\u003c/p\u003e\n\u003cp\u003eThere doesn\u0026rsquo;t seem to be any way, save for forking the whole of Hugo, to\ncreate a plugin, so I will just have to wait.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother great video from TJ DeVries this week \u0026ndash; \u003ca href=\"https://www.youtube.com/watch?v=HlfjpstqXwE\"\u003eExecute \u003cstrong\u003eanything\u003c/strong\u003e in\nneovim (now customizable)\u003c/a\u003e. I learnt how to pass callback functions as local\nfunctions, how to accept user input, and how to create user commands that can\nbe called like other \u003ccode\u003eEx\u003c/code\u003e commands. Like and subscribe.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThere was an \u003ca href=\"https://elixirforum.com/t/phx-long-term-project-updates/49228\"\u003einteresting question asked on the Elixir Forum recently\u003c/a\u003e about\nhow to keep generated Phoenix applications up-to-date.\u003c/p\u003e\n\u003cp\u003eSeveral tools were suggested that I\u0026rsquo;d not heard of before \u0026ndash; \u003ca href=\"https://www.phoenixdiff.org/\"\u003ephoenixdiff.org\u003c/a\u003e\nand \u003ca href=\"https://utils.zest.dev/gendiff\"\u003egendiff\u003c/a\u003e. Very useful when you need them.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt hasn\u0026rsquo;t been a massively productive week. Some weeks are like that, but I\nhad the day off on Wednesday, and travel either side, which certainly didn\u0026rsquo;t\nhelp. However, I think project fatigue and lack of any break are the more\nlikely culprits.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou know in macOS when you drag something onto top of something else it does\nthat little cool animation which takes far too long? Well, \u003ca href=\"https://www.reddit.com/r/MacOS/comments/wg6p2t/is_there_a_way_to_increase_the_speed_of_this/\"\u003eyou can change the\nspeed of that animation\u003c/a\u003e \u0026ndash; nice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/shuding_/status/1552438750470340610\"\u003eShu on Twitter demonstrates some cool fade-in animations\u003c/a\u003e. I made my \u003ca href=\"https://codepen.io/jordelver/pen/XWEqKjZ\"\u003eown\nexample to refer to\u003c/a\u003e in the future.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe setup scheduled Slack reminders for the team last week and they are very\nuseful. Stop answering the same team questions all the time \u0026ndash; schedule a\nreminder instead.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/rails/rails/commits?author=jordelver\"\u003eI\u0026rsquo;m a Rails contributor now\u003c/a\u003e. You. Are. Welcome.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMore amazing CSS from \u003ca href=\"https://twitter.com/jh3yy\"\u003eJhey\u003c/a\u003e in \u003ca href=\"https://codepen.io/jh3y/pen/gOeXgXv\"\u003ethese\u003c/a\u003e \u003ca href=\"https://codepen.io/jh3y/pen/KKoRXbV\"\u003etwo\u003c/a\u003e CSS-only content scrollers 🤩\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI updated my \u003ca href=\"https://elver.me/uses/\"\u003e/uses\u003c/a\u003e page with details of my home server setup.\u003c/p\u003e\n\u003cp\u003eThe old school \u0026ldquo;design\u0026rdquo; of the page was bit \u003cem\u003etoo\u003c/em\u003e old skool, so I made a small\ntweak to give the page a maximum width specified with \u003ccode\u003ech\u003c/code\u003e units. How modern.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHugo introduced a feature called \u0026ldquo;Render Hooks\u0026rdquo; in \u003ca href=\"https://github.com/gohugoio/hugo/releases/tag/v0.62.0\"\u003eversion 0.62.0\u003c/a\u003e. I\u0026rsquo;ve been\nlooking for a way to output anchor IDs for list items allowing me to link\ndirectly to them and being able to hook into the rendering lifecycle sounded\npromising. The bad news is that there is no support for list items 😢\u003c/p\u003e",
      "date_published": "2022-08-07T00:00:00+00:00",
      "date_modified": "2022-08-07T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/57-crimping-automatically/",
      "url": "https://elver.me/weeknotes/57-crimping-automatically/",
      "title": "Weeknotes 57: Crimping automatically",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUse \u003ccode\u003egit switch --orphan \u0026lt;new branch\u0026gt;\u003c/code\u003e to create a new empty branch which\nshares no history with the parent branch.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://stackoverflow.com/a/34100189/120615\"\u003ehttps://stackoverflow.com/a/34100189/120615\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you\u0026rsquo;re using \u003ca href=\"https://viewcomponent.org\"\u003eViewComponents\u003c/a\u003e you might find \u003ca href=\"https://github.com/allmarkedup/lookbook\"\u003eLookbook\u003c/a\u003e useful.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLookbook gives ViewComponent-based projects a ready-to-go development UI for\nnavigating, inspecting and interacting with component previews.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI needed to re-locate my wifi access point after moving some furniture around.\nI\u0026rsquo;ve wanted to ceiling mount it for a while so this was a good opportunity.\nBut how to run a cable? Luckily it\u0026rsquo;s \u003ca href=\"https://en.wikipedia.org/wiki/Power_over_Ethernet\"\u003ePoE\u003c/a\u003e so I only needed to run a network\ncable via the loft, but pretty soon I was chasing out the wall to install a\nnetwork socket too!\u003c/p\u003e\n\u003cp\u003eAll of this means that I\u0026rsquo;m now the proud owner of a \u003cem\u003esecond\u003c/em\u003e \u003ca href=\"https://www.amazon.co.uk/gp/product/B07VZTN6YK/\"\u003eRJ-45 crimping\ntool\u003c/a\u003e (I already have one, but this one does \u003ca href=\"https://www.amazon.co.uk/gp/product/B07W4V6W6W/\"\u003epass-through RJ-45 plugs\u003c/a\u003e, which\nare far easier to deal with).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI recently discovered \u003ca href=\"https://www.youtube.com/watch?v=utMD5GDkLk8\"\u003eNineteen Hundred And Eighty Five\u003c/a\u003e by \u003ca href=\"https://en.wikipedia.org/wiki/Paul_McCartney_and_Wings\"\u003eWings\u003c/a\u003e. What a\ntune!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/teej_dv\"\u003eTJ DeVries\u003c/a\u003e published a great video on how to \u003ca href=\"https://www.youtube.com/watch?v=9gUatBHuXE0\"\u003eRun Code Automatically in\nNeovim\u003c/a\u003e. I found the content itself really useful, but the thing that really\nstood out to me was how great the Lua APIs are.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAppend to the bottom of a buffer using \u003ccode\u003envim_buf_set_lines\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003evim.api.nvim_buf_set_lines(bufnr, -1, -1, false, { \u0026quot;foo\u0026quot;, \u0026quot;bar\u0026quot; })\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWill write\u0026hellip;\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003efoo\nbar\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u0026hellip;to the bottom of the buffer.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe posts on this website are written in Markdown, using reference-style\nlinks which means I can wrap the link text in square brackets and then list\nthe URLs at the bottom of the page. I really like this as it stops the main\ntext getting cluttered up with URLs.\u003c/p\u003e\n\u003cp\u003eUnfortunately, I left a broken link in last week\u0026rsquo;s entry and only noticed days\nlater. This led me to have a think of how I can prevent this in the future \u0026ndash;\nI came up with two approaches.\u003c/p\u003e\n\u003cp\u003e1) I wrote \u003ca href=\"https://github.com/jordelver/weeknotes/commit/90f86a9b87951bf323a832a06d5f61c49c5fbd62\"\u003esome JavaScript to highlight links without a URL\u003c/a\u003e in bright\nyellow. The JavaScript is only executed during development.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e{{ if .Site.IsServer }}\n\u0026lt;script\u0026gt;\n  function highlightMissingLinks() {\n    const article = document.querySelector(\u0026quot;article\u0026quot;);\n    const text = article.innerHTML;\n    article.innerHTML = text.replace(/\\[(.*?)\\]/g, \u0026quot;\u0026lt;span style='background: yellow;'\u0026gt;[$1]\u0026lt;/span\u0026gt;\u0026quot;);\n  };\n\n  window.addEventListener(\u0026quot;load\u0026quot;, highlightMissingLinks);\n\u0026lt;/script\u0026gt;\n{{ end }}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e2) I setup a GitHub Action that runs \u003ca href=\"https://github.com/igorshubovych/markdownlint-cli\"\u003e\u003ccode\u003emarkdownlint\u003c/code\u003e\u003c/a\u003e against changed\nMarkdown files. \u003ccode\u003emarkdownlint\u003c/code\u003e will check a whole host of violations, one of\nwhich is broken links. I\u0026rsquo;m leaving all rules enabled for now and will see it\nthey need tweaking over time.\u003c/p\u003e\n\u003cp\u003eI started off using \u003ca href=\"https://github.com/marketplace/actions/super-linter\"\u003e\u003ccode\u003esuper-linter\u003c/code\u003e from GitHub\u003c/a\u003e, but it took over 2 minutes\nto run even though I only enabled Markdown linting, which I guess is fair\nenough given that \u003ca href=\"https://github.com/marketplace/actions/super-linter#supported-linters\"\u003eit has ALL TEH LINTERS\u003c/a\u003e pre-installed.\u003c/p\u003e\n\u003cp\u003eThen I changed to a slightly more home-grown solution using a\n\u003ca href=\"https://github.com/marketplace/actions/markdownlint-cli\"\u003e\u003ccode\u003emarkdownlint\u003c/code\u003e-only action\u003c/a\u003e in combination with the \u003ca href=\"https://github.com/marketplace/actions/changed-files\"\u003e\u003ccode\u003echanged-files\u003c/code\u003e action\u003c/a\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ename: Lint\n\non:\n  pull_request:\n    branches: [main]\n\njobs:\n  build:\n    name: Markdown\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v2\n        with:\n          fetch-depth: 0\n\n      - name: Get changed files\n        id: changed-files\n        uses: tj-actions/changed-files@v24\n        with:\n          files: content/*.md\n\n      - name: Lint Markdown\n        if: steps.changed-files.outputs.any_changed == 'true'\n        uses: nosborn/github-action-markdown-cli@v3.1.0\n        with:\n          files: ${{ steps.changed-files.outputs.all_changed_files }}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis post will be the first to be checked, so I will see how it goes!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been working on the TIL (Today I Learned) site that I said I was making\nin \u003ca href=\"/weeknotes/5-professional-bash-programmer/\"\u003eWeeknotes 5\u003c/a\u003e 😄 Watch this space!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRecently it occurred to me that I\u0026rsquo;d never seen a \u003ca href=\"https://en.wikipedia.org/wiki/5G\"\u003e5G\u003c/a\u003e symbol on my iPhone even\nthough my carrier added support earlier this year and I am often in 5G\ncoverage areas.\u003c/p\u003e\n\u003cp\u003eWell, it turns out that you have to enable it in the iOS Settings under\n\u003ccode\u003eMobile Data -\u0026gt; Mobile Data Options -\u0026gt; Voice \u0026amp; Data -\u0026gt; 5G On\u003c/code\u003e. The first test\nI did at \u003ca href=\"https://fast.com\"\u003efast.com\u003c/a\u003e, whilst travelling in a car, resulted in an average of\n690Mbps 😮\u003c/p\u003e\n\u003cp\u003eIt really is quite astonishing.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUse \u003ccode\u003egit switch --orphan \u0026lt;new branch\u0026gt;\u003c/code\u003e to create a new empty branch which\nshares no history with the parent branch.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://stackoverflow.com/a/34100189/120615\"\u003ehttps://stackoverflow.com/a/34100189/120615\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you\u0026rsquo;re using \u003ca href=\"https://viewcomponent.org\"\u003eViewComponents\u003c/a\u003e you might find \u003ca href=\"https://github.com/allmarkedup/lookbook\"\u003eLookbook\u003c/a\u003e useful.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLookbook gives ViewComponent-based projects a ready-to-go development UI for\nnavigating, inspecting and interacting with component previews.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI needed to re-locate my wifi access point after moving some furniture around.\nI\u0026rsquo;ve wanted to ceiling mount it for a while so this was a good opportunity.\nBut how to run a cable? Luckily it\u0026rsquo;s \u003ca href=\"https://en.wikipedia.org/wiki/Power_over_Ethernet\"\u003ePoE\u003c/a\u003e so I only needed to run a network\ncable via the loft, but pretty soon I was chasing out the wall to install a\nnetwork socket too!\u003c/p\u003e",
      "date_published": "2022-07-31T00:00:00+00:00",
      "date_modified": "2022-07-31T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/56-performance-improvements/",
      "url": "https://elver.me/weeknotes/56-performance-improvements/",
      "title": "Weeknotes 56: Performance improvements",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe leaks are fixed. Bathroom still in pieces.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI setup the air conditioner. It was a bit \u003cem\u003etoo\u003c/em\u003e cold if anything. Sorry,\nPlanet. I\u0026rsquo;ve never said the phrase \u0026ldquo;Oh, there\u0026rsquo;s a nice breeze\u0026rdquo; as much as this\nweek.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter \u003ca href=\"/weeknotes/53-continuously-stream/\"\u003ecomplaining recently\u003c/a\u003e about the poor Ruby docs experience I found \u003ca href=\"https://rubyapi.org/\"\u003eRuby\nAPI\u003c/a\u003e this week by \u003ca href=\"https://twitter.com/oceanicpanda\"\u003eColby Swandale\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRuby API makes it easy and fast to search or browse the Ruby language API\ndocs\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI haven\u0026rsquo;t had a lot of time to use it so far but I\u0026rsquo;ve very interested in\nseeing where it goes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/51-inevitable-and-immortal/\"\u003eexperiments with different VPN providers\u003c/a\u003e continues. \u003ca href=\"https://protonvpn.com\"\u003eProtonVPN\u003c/a\u003e is very\nfast to connect and I\u0026rsquo;m pretty happen with it so far. I would still like to\ntry out \u003ca href=\"https://mullvad.net/en/\"\u003eMullvad\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eClean up your branch remotes with \u003ccode\u003egit remote prune origin\u003c/code\u003e. Use \u003ccode\u003e--dry-run\u003c/code\u003e\nfirst to double check what will be removed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/blog/fixing-commits-with-git-commit-fixup-and-git-rebase-autosquash/\"\u003eMy article on using Git fixup commits\u003c/a\u003e got linked to from the \u003ca href=\"https://github.blog/2022-06-30-write-better-commits-build-better-projects/\"\u003eGitHub blog\u003c/a\u003e\n\u0026ndash; pretty exciting. I only noticed because I happened to log into my analytics\n(which I never do) and noticed a spike. It is encouraging to actually think\nthat someone is reading what I wrote (however shoddy that writing is).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/_byroot\"\u003eJean Boussier\u003c/a\u003e wrote that he\u0026rsquo;d \u003ca href=\"https://twitter.com/_byroot/status/1549329642095579138\"\u003eimproved Ruby \u003ccode\u003eString#\u0026lt;\u0026lt;\u003c/code\u003e performance by 30%\u003c/a\u003e\nand brought that improvement over to Rails with \u003ca href=\"https://github.com/rails/rails/pull/45614\"\u003e\u0026ldquo;Speedup\nActionView::OutputBuffer\u0026rdquo;\u003c/a\u003e too 🔥\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAll this to say that Rails apps using ERB views should hopefully notice a\nnice perf improvement with Rails 7.1 and Ruby 3.2. I\u0026rsquo;d love to give an\nactual figure but thats\u0026rsquo; heavily dependent on the templates, so your mileage\nmay vary.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHe then \u003ca href=\"https://twitter.com/_byroot/status/1550119824524599298\"\u003efollowed up with\u003c/a\u003e a further improvement!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI merged a third String#\u0026laquo; optimization. Overall it\u0026rsquo;s now 65% faster for\nUTF-8.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eGreat work! It always surprises me when someone manages to squeeze out these\nperformance gains like this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother \u003ca href=\"https://twitter.com/whatyouhide/status/1549295894721445888\"\u003enew feature in Elixir \u003ccode\u003emain\u003c/code\u003e \u0026ndash; \u003ccode\u003edbg\u003c/code\u003e\u003c/a\u003e. A macro that you can use on\nthe end of a pipeline and it will output each value in turn \u0026ndash; very cool.\nLovely work by \u003ca href=\"https://twitter.com/whatyouhide/status/1549295894721445888\"\u003eAndrea Leopardi\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e__ENV__\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efile\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eString\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003esplit(\u003cspan style=\"color:#d14\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003etrim\u003c/span\u003e: \u003cspan style=\"color:#008080\"\u003etrue\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eList\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003elast()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eFile\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eexists?()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u0026gt;\u003c/span\u003e dbg()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCheck out the examples in the Twitter thread.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFor a unit test I needed a value from a predefined list, but it could only be\nused once as the database column had a unique constraint. We\u0026rsquo;re using\n\u003ca href=\"https://github.com/ffaker/ffaker\"\u003e\u003ccode\u003eFFaker\u003c/code\u003e\u003c/a\u003e in this project and it was surprisingly easy to create my own\n\u003ccode\u003eFFaker\u003c/code\u003e module.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003emodule\u003c/span\u003e \u003cspan style=\"color:#555\"\u003eFFaker\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003emodule\u003c/span\u003e \u003cspan style=\"color:#555\"\u003eFoo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003eextend\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eModuleUtils\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003eextend\u003c/span\u003e \u003cspan style=\"color:#0086b3\"\u003eself\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#008080\"\u003eDATA\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;Foo\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;Bar\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;Baz\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003efoo_bar_or_baz\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      fetch_sample(\u003cspan style=\"color:#008080\"\u003eDATA\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCalling \u003ccode\u003eFFaker::Foo.foo_bar_or_baz\u003c/code\u003e will return a value on each invocation.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e pry(main)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eFFaker\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eunique\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efoo_bar_or_baz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Bar\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e2\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e pry(main)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eFFaker\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eunique\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efoo_bar_or_baz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Foo\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e pry(main)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eFFaker\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eunique\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efoo_bar_or_baz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Baz\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e4\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e pry(main)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eFFaker\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eunique\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efoo_bar_or_baz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Bar\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAdding \u003ccode\u003eunique\u003c/code\u003e to \u003ccode\u003eFFaker::Foo.unique.foo_bar_or_baz\u003c/code\u003e will fail after it has\nrun out of values.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e pry(main)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eFFaker\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eunique\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efoo_bar_or_baz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Bar\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e2\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e pry(main)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eFFaker\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eunique\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efoo_bar_or_baz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Baz\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e pry(main)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eFFaker\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eunique\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efoo_bar_or_baz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Foo\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e4\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e pry(main)\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eFFaker\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eunique\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003efoo_bar_or_baz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eFFaker\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eUniqueUtils\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#990073\"\u003eRetryLimitExceeded\u003c/span\u003e: \u003cspan style=\"color:#008080\"\u003eFFaker\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eUniqueUtils\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eRetryLimitExceeded\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/53-continuously-stream/\"\u003eexperiment with difftastic\u003c/a\u003e is over.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLooking for better Internets? \u003ca href=\"https://bidb.uk/\"\u003eBetter Internet Dashboard\u003c/a\u003e does a nice job of\nshowing the various developments happening in your local area.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/avdi/status/1550575149363220480\"\u003eThoughts on YAML by Avdi Grimm\u003c/a\u003e (found via \u003ca href=\"https://twitter.com/geeksam/status/1550610569543254017\"\u003eSam Livingston-Gray\u003c/a\u003e).\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYAML is a wonderful serialization for computers to \u003cem\u003ewrite\u003c/em\u003e and humans to\n\u003cem\u003eread\u003c/em\u003e. And maybe, occasionally, with great trepidation\u0026hellip; to \u003cem\u003etweak\u003c/em\u003e. E.g.\nRuby\u0026rsquo;s YAML::Store is a terrific, under-appreciated tool for small-scale\npersistence.\u003c/p\u003e\n\u003cp\u003eYAML should not be composed by humans.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ePeople love to hate on YAML. I\u0026rsquo;ve never had any particular problem with it,\nbut then again I\u0026rsquo;ve only used it in fairly primitive ways. I\u0026rsquo;m sure the\nproblems with YAML exist, but for me it\u0026rsquo;s a good choice a lot of the time.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe leaks are fixed. Bathroom still in pieces.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI setup the air conditioner. It was a bit \u003cem\u003etoo\u003c/em\u003e cold if anything. Sorry,\nPlanet. I\u0026rsquo;ve never said the phrase \u0026ldquo;Oh, there\u0026rsquo;s a nice breeze\u0026rdquo; as much as this\nweek.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter \u003ca href=\"/weeknotes/53-continuously-stream/\"\u003ecomplaining recently\u003c/a\u003e about the poor Ruby docs experience I found \u003ca href=\"https://rubyapi.org/\"\u003eRuby\nAPI\u003c/a\u003e this week by \u003ca href=\"https://twitter.com/oceanicpanda\"\u003eColby Swandale\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRuby API makes it easy and fast to search or browse the Ruby language API\ndocs\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI haven\u0026rsquo;t had a lot of time to use it so far but I\u0026rsquo;ve very interested in\nseeing where it goes.\u003c/p\u003e",
      "date_published": "2022-07-24T00:00:00+00:00",
      "date_modified": "2022-07-24T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/55-leaking/",
      "url": "https://elver.me/weeknotes/55-leaking/",
      "title": "Weeknotes 55: Leaking",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWater leak. Bathroom partially destroyed during investigation. Gas leak.\nHeating engineer can\u0026rsquo;t find leak. Madness/olfactory failure? Cold shower. It\u0026rsquo;s\nbeen a lot.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/josevalim/status/1546880156177932289\"\u003eElixir v1.14 will have line-by-line breakpoints!\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://news.ycombinator.com/item?id=32028511\"\u003eCan I suggest you check the firmware on your SSD\u0026hellip;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLet me narrow my guess: They hit 4 years, 206 days and 16 hours . . . or 40,000 hours.\u003cbr\u003e\nAnd that they were sold by HP or Dell, and manufactured by SanDisk.\u003cbr\u003e\nDo I win a prize?\u003cbr\u003e\n(None of us win prizes on this one).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/zverok\"\u003e@zverok\u003c/a\u003e is maintaining \u003ca href=\"https://rubyreferences.github.io/rubychanges/\"\u003ethis really nice overview of changes to the Ruby\nlanguage over time\u003c/a\u003e. I didn\u0026rsquo;t know about a lot of the things I read here.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA very brief list of new significant features that emerged in Ruby\nprogramming language since version 2.0 (2013).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/robzolkos/status/1546580353418248193\"\u003eNice tip from Rob Zolkos\u003c/a\u003e to check that all Ruby classes will be found and\nloaded in production.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI recommend running \u003ccode\u003ebin/rails zeitwerk:check\u003c/code\u003e in your CI environment.  Just\na good sanity check that all classes will load ok once deployed to\nproduction.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/ekuber/status/1547763625057591296\"\u003eInteresting replies to this\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you tried Rust and stopped using it, why did you stop and what would make\nyou try again?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGit has been improving it\u0026rsquo;s UX in recent years. This still catches me out\noften so is a welcome change.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWith the newest version of Git 2.37.0, you can run just \u0026ldquo;git push\u0026rdquo; to push\nnew branches. No more \u0026ldquo;\u0026ndash;set-upstream origin\u0026rdquo;. Enable with:\u003c/p\u003e\n\u003cp\u003egit config \u0026ndash;global \u0026ndash;add \u0026ndash;bool push.autoSetupRemote true\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/ji/status/1546948817462800384\"\u003ehttps://twitter.com/ji/status/1546948817462800384\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve started writing a simple Neovim plugin so I\u0026rsquo;ve been learning a bit about\nLua and the Neovim API. Take all this with a pinch of salt as I am probably\nwrong about a lot of this 😁\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThere seems to be a common pattern used to implement \u0026ldquo;modules\u0026rdquo; as Lua\ndoesn\u0026rsquo;t have them built-in.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003elocal\u003c/span\u003e M \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e {}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eM.foo \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e(opts)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#998;font-style:italic\"\u003e-- do something\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003ereturn\u003c/span\u003e M\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLua code for a plugin goes into \u003ccode\u003elua/\u003c/code\u003e. You can reference other files using\na dot \u003ccode\u003e.\u003c/code\u003e or slash \u003ccode\u003e/\u003c/code\u003e, but the dot seems more common.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003elua/foo.lua\nlua/bar/init.lua\nlua/bar/baz.lua\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eCan be required like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003erequire(\u0026quot;foo\u0026quot;)\nrequire(\u0026quot;bar\u0026quot;)\nrequire(\u0026quot;bar.baz\u0026quot;)\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou can use \u003ccode\u003e:lua\u003c/code\u003e to run Lua code directly.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLua doesn\u0026rsquo;t have regexes in the stdlib, but has \u0026ldquo;patterns\u0026rdquo; which can get you\nmost of the way. I\u0026rsquo;ve been using \u003ca href=\"https://gitspartv.github.io/lua-patterns/\"\u003eLua Patterns Viewer\u003c/a\u003e to help get to grips\nwith them.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou can use \u003ca href=\"https://github.com/nvim-lua/plenary.nvim#plenarytest_harness\"\u003e\u003ccode\u003eplenary.test_harness\u003c/code\u003e\u003c/a\u003e to \u003ca href=\"https://github.com/nvim-lua/plenary.nvim/blob/master/TESTS_README.md\"\u003ewrite tests\u003c/a\u003e!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWant to make a HTTP request from your plugin? \u003ca href=\"https://github.com/nvim-lua/plenary.nvim/blob/master/lua/plenary/curl.lua\"\u003e\u003ccode\u003eplenary.curl\u003c/code\u003e\u003c/a\u003e is a \u003ccode\u003ecurl\u003c/code\u003e\nwrapper that is surprisingly easy to use, so far.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/nvim-lua/plenary.nvim\"\u003eplenary.nvim\u003c/a\u003e is great in general. Thank you \u003ca href=\"https://github.com/tjdevries\"\u003e@tjdevries\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLua is slightly weird, but feels more like a programming language that I can\nactually use, which I can\u0026rsquo;t say for Vimscript. Ask me again in a few weeks!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI use GitHub-style Markdown for keeping notes and heavily use the checkbox\nnotation like this:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e- [ ] Do something\n- [x] Something I\u0026#39;ve done\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhich is why I was excited to find \u003ca href=\"https://github.com/jkramer/vim-checkbox\"\u003e\u003ccode\u003evim-checkbox\u003c/code\u003e\u003c/a\u003e via \u003ca href=\"https://newsletters.feedbinusercontent.com/a10/a106cfb9b682b00d98130faa8d57944967ddb1d2.html\"\u003eVimTricks\u003c/a\u003e this week.\nIt lets you type \u003ccode\u003e\u0026lt;leader\u0026gt;tt\u003c/code\u003e to toggle checkboxes from anywhere on the\ncurrent line.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe heat this week has not be conducive to getting work done. I can\u0026rsquo;t wait for\nit to be over.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWater leak. Bathroom partially destroyed during investigation. Gas leak.\nHeating engineer can\u0026rsquo;t find leak. Madness/olfactory failure? Cold shower. It\u0026rsquo;s\nbeen a lot.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/josevalim/status/1546880156177932289\"\u003eElixir v1.14 will have line-by-line breakpoints!\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://news.ycombinator.com/item?id=32028511\"\u003eCan I suggest you check the firmware on your SSD\u0026hellip;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLet me narrow my guess: They hit 4 years, 206 days and 16 hours . . . or 40,000 hours.\u003cbr\u003e\nAnd that they were sold by HP or Dell, and manufactured by SanDisk.\u003cbr\u003e\nDo I win a prize?\u003cbr\u003e\n(None of us win prizes on this one).\u003c/p\u003e",
      "date_published": "2022-07-17T00:00:00+00:00",
      "date_modified": "2022-07-17T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/54-launch-week/",
      "url": "https://elver.me/weeknotes/54-launch-week/",
      "title": "Weeknotes 54: Launch week",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe project I\u0026rsquo;ve been working on for many weeks launched and went well. There\nare some things that can be tweaked and improved upon, but I was pretty happy\nfor the most part.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://modalzmodalzmodalz.com\"\u003emodalzmodalzmodalz.com\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAll the reasons you might not need to use a modal!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s hard to disagree with these points \u0026ndash; modals are often awful. I think the\nmessage is somewhat lost by the barely readable typeface\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe have \u003ca href=\"https://devcenter.heroku.com/articles/preboot\"\u003ePreboot\u003c/a\u003e turned on which means deployments can take a few minutes to\nswitch over to new dynos, and you it can be tricky to know which version of\nthe code is live. In order to help with knowing what is live, I made a change\nto include the deployed Git SHA in both a metatag in the HTML and as a HTTP\nheader for non-HTML requests.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of which, I then wrote a \u003ca href=\"https://fishshell.com\"\u003efish\u003c/a\u003e \u003ca href=\"https://gist.github.com/jordelver/c628243c51eafddc0e2f2b98de42d3e3\"\u003eshell script\u003c/a\u003e to poll the website\nand check for a version change. This means I can make a deployment, run the\nscript in the background, and it will speak \u0026ldquo;New version deployed\u0026rdquo; (using\n\u003ccode\u003esay\u003c/code\u003e) once it has rolled out.\u003c/p\u003e\n\u003cp\u003eI decided to use \u003ccode\u003efish\u003c/code\u003e for this one as it\u0026rsquo;s the shell I use interactively. It\nworks well, and the code is readable enough, but it does make distributing to\nthe team more difficult. I have considered that maybe I should brush up on\nBash for scripts.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.meetup.com/south-west-ruby/events/286689720/\"\u003eSouth West Ruby\u003c/a\u003e continues to run a more regular schedule after the pandemic.\nThis one included a great talk on \u003ca href=\"https://en.wikipedia.org/wiki/Domain-driven_design\"\u003eDomain Driven Design\u003c/a\u003e by \u003ca href=\"https://twitter.com/morricegavin\"\u003eGavin Morrice\u003c/a\u003e.\nIt turns out that I\u0026rsquo;ve been doing a lot of DDD things already, but I wasn\u0026rsquo;t\nnecessarily aware of it!\u003c/p\u003e\n\u003cp\u003eThere was also another opportunity to see \u0026ldquo;Even Fuller Stack Ruby\u0026rdquo; by\n\u003ca href=\"https://twitter.com/mckelvaney\"\u003eMichael McKelvaney\u003c/a\u003e where he showed all the interesting ways in which he has\nused Ruby in a non-Rails context \u0026ndash; quite unusual these days as Ruby has\nbecome a synonym for Rails.\u003c/p\u003e\n\u003cp\u003eIt was heartening to meet and speak with \u003cem\u003eseveral\u003c/em\u003e people who were brand new\nto Ruby. Some having come from other languages, and some via bootcamps. So\nmuch for Ruby being dead.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI really like Elixir but I\u0026rsquo;ve found testing it difficult in some ways. Not\nbecause something is wrong with Elixir (in fact, \u003ca href=\"https://hexdocs.pm/ex_unit/ExUnit.html\"\u003eExUnit\u003c/a\u003e is \u003cem\u003eexcellent\u003c/em\u003e, and\nElixir is mostly just functions and immutable state so testing is very easy in\nmost cases) but because I bring my Ruby testing baggage to it and things are\ndifferent. I bought \u003ca href=\"https://pragprog.com/titles/lmelixir/testing-elixir/\"\u003eTesting Elixir\u003c/a\u003e this week to do some learnin'.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://rubycentral.org/ruby-shield\"\u003eRuby Central announces Ruby Shield, a partnership between Ruby Central and Shopify\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eShopify is committing $1 million USD to Ruby Central over four years, in\naddition to committing dedicated Engineering effort from Shopify’s Ruby and\nRails Infrastructure team.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis seems like good news to me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe folks at \u003ca href=\"https://swmansion.com/\"\u003eSoftware Mansion\u003c/a\u003e have released a new \u003ca href=\"https://github.com/membraneframework/membrane_rtmp_plugin/\"\u003eRTMP plugin\u003c/a\u003e for the\n\u003ca href=\"https://membrane.stream\"\u003eMembrane Multimedia Framework\u003c/a\u003e which is pretty exciting to me. It means you\ncan receive an RTMP stream and have it processed by Membrane. I want to spend\nsome time experimenting with it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNow we\u0026rsquo;re painting.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe project I\u0026rsquo;ve been working on for many weeks launched and went well. There\nare some things that can be tweaked and improved upon, but I was pretty happy\nfor the most part.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://modalzmodalzmodalz.com\"\u003emodalzmodalzmodalz.com\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAll the reasons you might not need to use a modal!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s hard to disagree with these points \u0026ndash; modals are often awful. I think the\nmessage is somewhat lost by the barely readable typeface\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe have \u003ca href=\"https://devcenter.heroku.com/articles/preboot\"\u003ePreboot\u003c/a\u003e turned on which means deployments can take a few minutes to\nswitch over to new dynos, and you it can be tricky to know which version of\nthe code is live. In order to help with knowing what is live, I made a change\nto include the deployed Git SHA in both a metatag in the HTML and as a HTTP\nheader for non-HTML requests.\u003c/p\u003e",
      "date_published": "2022-07-10T00:00:00+00:00",
      "date_modified": "2022-07-10T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/53-continuously-stream/",
      "url": "https://elver.me/weeknotes/53-continuously-stream/",
      "title": "Weeknotes 53: Continuously stream",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m trying out \u003ca href=\"https://github.com/Wilfred/difftastic\"\u003edifftastic\u003c/a\u003e on the recommendation of a colleague.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDifftastic is a structural diff tool that understands syntax. It supports\nover 20 programming languages and when it works, it\u0026rsquo;s fantastic.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eStill evaluating/getting used to it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe started watching Strangers Things and have made it through 2 series so far.\nI like it. I \u003cem\u003ethink\u003c/em\u003e I\u0026rsquo;ve seen Series 1 before but have absolutely no\nrecollection of it so it has been brand new to me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://brightonruby.com\"\u003eBrighton Ruby\u003c/a\u003e was this week and I had forgotten how to conference. The last\none was in 2019.\u003c/p\u003e\n\u003cp\u003eAndy asked everyone how many Brighton Ruby\u0026rsquo;s they\u0026rsquo;d been to, and I had no idea\nat the time, so when I got home I double checked. Turns out, \u003cem\u003eall seven\u003c/em\u003e of\nthem 😮. The first one being in 2014 \u0026ndash; doesn\u0026rsquo;t time fly. Stop it, Time.\u003c/p\u003e\n\u003cp\u003eI managed to catch a cold just \u003cem\u003ebefore\u003c/em\u003e the conference so that I was at peak\ncold during the day itself. Well done, me. Still, it was nice to be back and\nit\u0026rsquo;s clear that the appetite for a Ruby conference in the UK is still going\nstrong.\u003c/p\u003e\n\u003cp\u003eHighlights for me were:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://hawksley.org\"\u003eJoel Hawksley\u003c/a\u003e from GitHub spoke about design systems and CSS in \u003ca href=\"https://hawksley.org/2022/03/01/conference-proposal-breaking-up-with-the-bundle.html\"\u003eBreaking\nup with the bundle\u003c/a\u003e. As you\u0026rsquo;d expect GitHub has a lot of CSS, and managing\nit is quite a task.\u003c/p\u003e\n\u003cp\u003eCSS at scale is a hard problem, and one technique they used was to write\ntests that outputted the computed styles for a component, and wrote\nassertions against them \u0026ndash; neat stuff.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eInstance variables by \u003ca href=\"https://jemma.dev\"\u003eJemma Issroff\u003c/a\u003e was very interesting. It’s good to\nknow there is still a lot of work, using decade-old ideas, going on to\nimprove Ruby at the levels which I hardly ever see or deal with.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/has_many_books\"\u003eEmma Barnes\u003c/a\u003e gave a great talk with a key message that working code is the\nbest code, and that you never know the context under which it was written.\nVery well delivered.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/jcinnamond\"\u003eJohn Cinnamond\u003c/a\u003e gave a talk with some examples of the \u003ca href=\"https://en.wikipedia.org/wiki/Monad_(functional_programming)#An_example:_Maybe\"\u003e\u003ccode\u003eMaybe\u003c/code\u003e monad\u003c/a\u003e using\nHaskell code. It reminded of my recent exposure to Rust with it\u0026rsquo;s \u003ca href=\"https://doc.rust-lang.org/std/option/\"\u003eOption\u003c/a\u003e\nand \u003ca href=\"https://doc.rust-lang.org/std/result/\"\u003eResult\u003c/a\u003e types, and that I should try out some Haskell.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://tomstu.art/\"\u003eTom Stuart\u003c/a\u003e’s talk on Ruby pattern matching has definitely made me want to\nstart using it in my own code. I was never compelled to try it before.\nHaving used Elixir\u0026rsquo;s pattern matching a bit it was not very exciting in\ncomparison. But it\u0026rsquo;s what we have, and Tom convinced me I should try it out.\nI’m pretty sure the “experimental” warnings that Ruby emits will have put an\nawful lot of people off, including me.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOverall a great conference. I do hope it returns to the \u003ca href=\"https://brightondome.org\"\u003eDome\u003c/a\u003e next year if\nthere is enough interest, but I totally understand why the venue was different\nthis year.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFirst weeknotes with nested bullets \u0026ndash; that\u0026rsquo;s exciting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI only worked 2 days this week, but it sure didn\u0026rsquo;t feel like it. Conference\ngoing is tiring, so I don\u0026rsquo;t feel like I\u0026rsquo;ve had 3 days off work.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI keep hearing interesting things about \u003ca href=\"https://www.sqlite.org/index.html\"\u003eSQLite\u003c/a\u003e. One of those things was the\n\u003ca href=\"https://litestream.io\"\u003eLitestream\u003c/a\u003e project by \u003ca href=\"https://twitter.com/benbjohnson\"\u003eBen Johnson\u003c/a\u003e on \u003ca href=\"https://podcast.thinkingelixir.com/101\"\u003eThinking Elixir episode 101\u003c/a\u003e, which\nallows SQLite to be replicated across servers, and can continuously stream\nbackups to cloud storage.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eContinuously stream SQLite changes to AWS S3, Azure Blob Storage, Google\nCloud Storage, SFTP, or NFS. Quickly recover to the point of failure if your\nserver goes down.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://fly.io/blog/all-in-on-sqlite-litestream/\"\u003eLitestream was recently acquired by Fly.io\u003c/a\u003e, who are seemingly keen to deploy\nSQLite closer to users. Seems like a very good fit.\u003c/p\u003e\n\u003cp\u003eGiven the right use-case, I would definitely consider SQLite in the future. I\nwonder how many Rails apps \u003cem\u003ereally need\u003c/em\u003e Postgres or MySQL and if they could\nbe quite happy using SQLite?\u003c/p\u003e\n\u003cp\u003eI suspect SQLite powers a lot of things we use every day that are\nunacknowledged.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI forgot that I bought a \u003ca href=\"https://kbdfans.com/products/rgb-knob\"\u003eRGB Knob\u003c/a\u003e in a group buy so it was a nice surprise\nwhen I got a shipping notification for it! It arrived early this week. As a\npiece of hardware, it\u0026rsquo;s a lovely thing. As a useful device, I\u0026rsquo;m not so sure,\nbut I\u0026rsquo;m still playing around with it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSadly, I have to agree with a lot of these \u003ca href=\"https://www.reddit.com/r/ruby/comments/viadq5/stack_overflow_developer_survey_2022_results_bad/idtyko3/\"\u003epoints\u003c/a\u003e, \u003ca href=\"https://twitter.com/solnic29a/status/1541698292110819334\"\u003evia Peter Solnica\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eRuby\u0026rsquo;s documentation is \u003cem\u003eso\u003c/em\u003e far behind Elixir and Rust. It\u0026rsquo;s actively bad in\na lot of cases, and, of course, any criticism is met with the usual \u0026ldquo;open a\nPR\u0026rdquo; response.\u003c/p\u003e\n\u003cp\u003eI still like Ruby a lot, but there are other things out there, and some of\nthem are \u003cem\u003ebetter\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis might be handy if you need to match UUIDs in tests \u0026ndash; \u003ca href=\"https://github.com/dpep/rspec-uuid\"\u003eRSpec matcher for\nUUIDs\u003c/a\u003e. Saves reinventing the wheel each time.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eit { is_expected.to be_a_uuid }\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.destroyallsoftware.com/talks/the-birth-and-death-of-javascript\"\u003eThe Birth \u0026amp; Death of JavaScript\u003c/a\u003e by Gary Bernhardt \u0026ndash; I will never get tired\nof this talk. I should re-watch every year.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m trying out \u003ca href=\"https://github.com/Wilfred/difftastic\"\u003edifftastic\u003c/a\u003e on the recommendation of a colleague.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDifftastic is a structural diff tool that understands syntax. It supports\nover 20 programming languages and when it works, it\u0026rsquo;s fantastic.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eStill evaluating/getting used to it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe started watching Strangers Things and have made it through 2 series so far.\nI like it. I \u003cem\u003ethink\u003c/em\u003e I\u0026rsquo;ve seen Series 1 before but have absolutely no\nrecollection of it so it has been brand new to me.\u003c/p\u003e",
      "date_published": "2022-07-03T00:00:00+00:00",
      "date_modified": "2022-07-03T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/52-low-latency-co-pilot/",
      "url": "https://elver.me/weeknotes/52-low-latency-co-pilot/",
      "title": "Weeknotes 52: Low latency co-pilot",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA whole year of weeknotes! They said it couldn\u0026rsquo;t be done.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/schneems/status/1540319786474823680\"\u003eSchneems asking some interesting questions\u003c/a\u003e about the future of Ruby. First\nwe couldn\u0026rsquo;t scale, now we\u0026rsquo;re dead \u0026ndash; shame, really.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGitHub released \u003ca href=\"https://github.com/features/copilot/\"\u003eCo-Pilot\u003c/a\u003e this week. Maybe I\u0026rsquo;m naive, but I didn\u0026rsquo;t realise it\nwould be a paid-for service. And that does change my feelings about it\nsomewhat.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNice post from \u003ca href=\"https://www.bannerbear.com/blog/technical-mistakes-i-made-growing-a-saas-to-k-mrr/\"\u003eBannerbear about the technical mistakes they\u0026rsquo;ve made\u003c/a\u003e along the\nway to a successful business.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFor example, I didn\u0026rsquo;t lean on any shiny new technology, I just used the tech\nthat I know best: Ruby on Rails.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI agree with this point, if you want to build a business you should probably\nuse the technology you know really well. For side projects I\u0026rsquo;ve often decided\nto use technology that I \u003cem\u003edon\u0026rsquo;t\u003c/em\u003e know well, and then get frustrated when I\ncan\u0026rsquo;t do something simple.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDo. It. Yourself. My powers (and confidence) grows.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI don\u0026rsquo;t totally understand this.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/benj_fry/status/1538257150631235584\"\u003eOmg, is this for real??? Apple dropped the bitcode requirement for iOS!\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBut, it seems that \u003ca href=\"https://github.com/rust-lang/rust/issues/35968#issuecomment-1148183215\"\u003eApple\u0026rsquo;s decision to change their policy\u003c/a\u003e will allow software\nwritten in Rust to be distributed on the App Store, and run on Apple devices\n\u0026ndash; which is cool.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNice to see the \u003ca href=\"https://blog.rubygems.org/2022/06/13/making-packages-more-secure.html\"\u003eRubygems team tackling software supply chain security\u003c/a\u003e with\nMFA. The approach is pragmatic too \u0026ndash; starting with the packages most likely\nto be attacked.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eStarting today (June 13, 2022), the maintainers of at least the top 100\nRubyGems packages will begin to see warnings on the RubyGems command-line\ntool and website if MFA is not enabled on their accounts. Anybody who\nmaintains a gem with more than 165 million downloads will see this\nrecommendation.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis week I learnt that you can supply a block to RSpec\u0026rsquo;s \u003ccode\u003eraise_error\u003c/code\u003e which\nallows you to set expectations on the error raised. I used this to test a\ncustom exception class.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexpect {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eBar\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ecall\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eto raise_error { \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003eerror\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  expect(error)\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eto be_a(\u003cspan style=\"color:#008080\"\u003eSomeErrorClass\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  expect(error\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003emessage)\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eto match(\u003cspan style=\"color:#009926\"\u003e/some message/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  expect(error\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003econtext)\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eto \u003cspan style=\"color:#000;font-weight:bold\"\u003einclude\u003c/span\u003e(\u003cspan style=\"color:#009926\"\u003e/some context/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been using \u003ca href=\"https://pop.com\"\u003ePop\u003c/a\u003e for pairing this week. It works pretty well. Low\nlatency, and very responsive. But it would be better if the UI would stay out\nof the way a bit more. That\u0026rsquo;s something I like about \u003ca href=\"https://tuple.app\"\u003eTuple\u003c/a\u003e, it just sits in\nthe macOS menu bar.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://brightonruby.com\"\u003eBrighton Ruby\u003c/a\u003e is back next week \u0026ndash; it feels like a long time since I was\nlast in Brighton for the conference. Like pretty much everything I ever book,\nI can\u0026rsquo;t really be bothered to go, but I suspect I will have a good time once I\nget there. Hopefully the trains run!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA whole year of weeknotes! They said it couldn\u0026rsquo;t be done.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/schneems/status/1540319786474823680\"\u003eSchneems asking some interesting questions\u003c/a\u003e about the future of Ruby. First\nwe couldn\u0026rsquo;t scale, now we\u0026rsquo;re dead \u0026ndash; shame, really.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGitHub released \u003ca href=\"https://github.com/features/copilot/\"\u003eCo-Pilot\u003c/a\u003e this week. Maybe I\u0026rsquo;m naive, but I didn\u0026rsquo;t realise it\nwould be a paid-for service. And that does change my feelings about it\nsomewhat.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNice post from \u003ca href=\"https://www.bannerbear.com/blog/technical-mistakes-i-made-growing-a-saas-to-k-mrr/\"\u003eBannerbear about the technical mistakes they\u0026rsquo;ve made\u003c/a\u003e along the\nway to a successful business.\u003c/p\u003e",
      "date_published": "2022-06-26T00:00:00+00:00",
      "date_modified": "2022-06-26T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/51-inevitable-and-immortal/",
      "url": "https://elver.me/weeknotes/51-inevitable-and-immortal/",
      "title": "Weeknotes 51: Inevitable and immortal",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTIL You can get the number of \u003ca href=\"https://ruby-doc.org/core-3.1.2/Proc.html#method-i-arity\"\u003earguments supplied to a block in Ruby\u003c/a\u003e. Via\n\u003ca href=\"https://twitter.com/kaspth/status/1537932553218236419\"\u003eKasper Timm Hansen\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"https://nordvpn.com\"\u003eNordVPN\u003c/a\u003e subscription expired and I decided to try out other options. The\ncurrent short list includes \u003ca href=\"https://mullvad.net/en/\"\u003eMullvad\u003c/a\u003e and \u003ca href=\"https://protonvpn.com\"\u003eProtonVPN\u003c/a\u003e \u0026ndash; ProtonVPN have a free\nplan so I\u0026rsquo;m trying that first.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUseful \u003ccode\u003ebundler\u003c/code\u003e \u003ca href=\"https://twitter.com/getajobmike/status/1536394614256504832\"\u003edebugging tip from Mike Perham\u003c/a\u003e. Use \u003ccode\u003eDEBUG=1\u003c/code\u003e to get more\ninformation when bundling goes wrong.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSomeone recommended \u003ca href=\"https://diabloimmortal.blizzard.com/en-gb/\"\u003eDiablo Immortal\u003c/a\u003e to me and I\u0026rsquo;ve been enjoying playing it\nthis week - I hardly play games any more so it was nice to get back into it.\nThe Internet is unhappy about \u0026ldquo;micro transactions\u0026rdquo; within the game, but I\u0026rsquo;ve\nmanaged to play without spending any money.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI got access to \u003ca href=\"https://github.blog/2021-12-08-improving-github-code-search/\"\u003eGitHub code search\u003c/a\u003e this week.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eInitially, we’re creating a separate interface for the new code search as we\nbuild it out, but once we’re happy with the feedback and are ready for wider\nadoption, we will integrate it into the main github.com experience.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI totally understand why it\u0026rsquo;s not built into the main GitHub interface at the\nmoment, but it does mean that I forget about it. Hence why I\u0026rsquo;ve barely used it\nso far.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNew editor alert \u0026ndash; \u003ca href=\"https://zed.dev/\"\u003eZed\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA lightning-fast, collaborative code editor written in Rust.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI \u003ca href=\"https://www.youtube.com/watch?v=Uo08uS904Rg\"\u003ewatched a couple of ADHD videos\u003c/a\u003e this week. I\u0026rsquo;ve gotta say, they really\nresonated with me. The perfectionism. The all or nothing approach. The guilt.\u003c/p\u003e\n\u003cp\u003eThe \u003ca href=\"https://www.youtube.com/watch?v=hlObsAeFNVk\"\u003esecond video\u003c/a\u003e describes some coping strategies. I\u0026rsquo;ve inadvertently learnt\nsome of these I think. Changing my environment is something I\u0026rsquo;ve started doing\n\u0026ndash; if I\u0026rsquo;m struggling to get something done I will travel to a local coffee\nshop, this removes me from my current, unproductive environment, and I get the\nadded bonus of thinking time whilst I travel. Of course, this comes with\nguilt. Pointless guilt.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t know whether I have some form of ADHD, but I certainly have a lot of\nthe symptoms.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://rubyonrails.org/2022/6/13/rails-discord-server-is-now-open-to-the-public\"\u003eRails Discord server is now open to the public\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eToday, we are opening a Discord server to allow contributors to help each\nother and lower the overhead of communicating with new contributors.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI never thought I\u0026rsquo;d see this, but I welcome it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGitHub are \u003ca href=\"https://github.blog/2022-06-08-sunsetting-atom/\"\u003esunsetting Atom\u003c/a\u003e. I suppose this was inevitable given the\npopularity of VS Code. Perhaps we should be surprised it didn\u0026rsquo;t happen sooner?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTIL You can get the number of \u003ca href=\"https://ruby-doc.org/core-3.1.2/Proc.html#method-i-arity\"\u003earguments supplied to a block in Ruby\u003c/a\u003e. Via\n\u003ca href=\"https://twitter.com/kaspth/status/1537932553218236419\"\u003eKasper Timm Hansen\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"https://nordvpn.com\"\u003eNordVPN\u003c/a\u003e subscription expired and I decided to try out other options. The\ncurrent short list includes \u003ca href=\"https://mullvad.net/en/\"\u003eMullvad\u003c/a\u003e and \u003ca href=\"https://protonvpn.com\"\u003eProtonVPN\u003c/a\u003e \u0026ndash; ProtonVPN have a free\nplan so I\u0026rsquo;m trying that first.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUseful \u003ccode\u003ebundler\u003c/code\u003e \u003ca href=\"https://twitter.com/getajobmike/status/1536394614256504832\"\u003edebugging tip from Mike Perham\u003c/a\u003e. Use \u003ccode\u003eDEBUG=1\u003c/code\u003e to get more\ninformation when bundling goes wrong.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSomeone recommended \u003ca href=\"https://diabloimmortal.blizzard.com/en-gb/\"\u003eDiablo Immortal\u003c/a\u003e to me and I\u0026rsquo;ve been enjoying playing it\nthis week - I hardly play games any more so it was nice to get back into it.\nThe Internet is unhappy about \u0026ldquo;micro transactions\u0026rdquo; within the game, but I\u0026rsquo;ve\nmanaged to play without spending any money.\u003c/p\u003e",
      "date_published": "2022-06-19T00:00:00+00:00",
      "date_modified": "2022-06-19T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/50-circuit-board-coaster/",
      "url": "https://elver.me/weeknotes/50-circuit-board-coaster/",
      "title": "Weeknotes 50: Circuit board coaster",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been doing DIY this week. I hate DIY.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://appleinsider.com/articles/22/06/09/apples-2023-carplay-is-an-apple-car-preview---and-is-scaring-detroit\"\u003eApple announcing that they plan to extend CarPlay\u003c/a\u003e so that it can take over\nthe entire instrument cluster is interesting, and not surprising.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not sure how I feel about \u003ca href=\"https://en.wikipedia.org/wiki/CarPlay\"\u003eCarPlay\u003c/a\u003e for all teh things, but I would\ncertainly like it to extend further than it currently does. It would be great\nif the \u0026ldquo;virtual cockpit\u0026rdquo; in my car could show Google or Apple maps instead of\njust the built-in sat nav, for example.\u003c/p\u003e\n\u003cp\u003eWe will have to wait until 2023 to see.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.etsy.com/uk/listing/1221694261/vim-cheat-sheet-on-a-high-quality-board\"\u003eVim cheat sheet circuit board coasters?\u003c/a\u003e Yes, please!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/josevalim/status/1535008937640181760\"\u003eExciting times for Elixir ahead\u003c/a\u003e. After doing a bit of Rust, the benefit of\ntypes has become more apparent to me.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eToday during my @ElixirConfEU keynote I announced there is an ongoing PhD\nscholarship for researching and developing a type system powered by\nset-theoretic types for Elixir.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://getoban.pro/articles/one-million-jobs-a-minute-with-oban\"\u003e\u0026ldquo;One Million Jobs a Minute with Oban\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe total time to complete 1m jobs decreases steadily until it bottoms out\nat around 2,000 concurrently. After that point fetching slows down, the BEAM\ngets overloaded, and overall processing time starts to rise. But, when\nconcurrency is set to 2,000 it completes in 30 seconds—that’s two million\njobs a minute.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI was told for years how slow the database is, and that every query is a\ncrime, but these sort of numbers put that to bed. Turns out modern databases\nare really fast, and Oban makes really good use of that.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.blog/changelog/2022-05-31-improved-verification-of-historic-git-commit-signatures/\"\u003eGitHub are changing the way they verify signed commits\u003c/a\u003e. I\u0026rsquo;ve been signing\ncommits for a while, but I haven\u0026rsquo;t yet had to revoke a key so I wasn\u0026rsquo;t\nentirely sure what would happen 😬\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGitHub will now verify Git commit signatures and show commits as \u0026ldquo;Verified\u0026rdquo;\neven if their public GPG signing keys are expired or revoked (but not\ncompromised).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis clears things up. Via \u003ca href=\"https://tomstu.art/weeknotes-126-normal-and-convenient\"\u003eTom Stuart\u0026rsquo;s weeknotes\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/padolsey\"\u003eJames Padolsey\u003c/a\u003e discovered that \u003ca href=\"https://twitter.com/padolsey/status/1533509877666140160\"\u003eiOS has a built-in background sound feature\u003c/a\u003e\nthat can play various whitenoise and nature sounds.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve had a Spotify playlist like this for ages, but it\u0026rsquo;s nice to have\nsomething to fallback on that\u0026rsquo;s always available. It would be nice if Apple\nincreased the amount of sounds available.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://trunk.io\"\u003eTrunk\u003c/a\u003e runs all the linters.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTrunk simplifies checking, testing, and merging your code, allowing you to\nfocus on writing features instead of babysitting PRs.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSetting up linting is tedious, maybe this makes it less so?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been doing DIY this week. I hate DIY.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://appleinsider.com/articles/22/06/09/apples-2023-carplay-is-an-apple-car-preview---and-is-scaring-detroit\"\u003eApple announcing that they plan to extend CarPlay\u003c/a\u003e so that it can take over\nthe entire instrument cluster is interesting, and not surprising.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not sure how I feel about \u003ca href=\"https://en.wikipedia.org/wiki/CarPlay\"\u003eCarPlay\u003c/a\u003e for all teh things, but I would\ncertainly like it to extend further than it currently does. It would be great\nif the \u0026ldquo;virtual cockpit\u0026rdquo; in my car could show Google or Apple maps instead of\njust the built-in sat nav, for example.\u003c/p\u003e",
      "date_published": "2022-06-12T00:00:00+00:00",
      "date_modified": "2022-06-12T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/49-short-week/",
      "url": "https://elver.me/weeknotes/49-short-week/",
      "title": "Weeknotes 49: Short week",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA short, but tiring, week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fullstaqruby.org/\"\u003eFullstaq Ruby\u003c/a\u003e \u0026ndash; a new Ruby edition focussed on lowering memory usage and\nimproving performance by \u003ca href=\"https://twitter.com/honglilai\"\u003eHongli Lai\u003c/a\u003e of \u003ca href=\"https://www.phusionpassenger.com\"\u003ePhusion Passenger\u003c/a\u003e fame.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFullstaq Ruby is an MRI-based Ruby distribution that\u0026rsquo;s optimized for server\nproduction use cases. It is compiled with the Jemalloc and malloc_trim\npatches, allowing lower memory usage and higher performance.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAn interesting write up of the \u003ca href=\"https://www.craigkerstiens.com/2022/05/18/unfinished-business-with-postgres/\"\u003ehistory of Postgres at Heroku by Craig\nKerstiens\u003c/a\u003e. I think a lot of people take the achievements of Heroku for\ngranted.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;\u003ca href=\"https://astrid.tech/2022/04/05/1/dead-tlds/\"\u003eWhat happens to TLDs when their country stops existing?\u003c/a\u003e\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eIP addresses only from now on?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI came across neat CSS tips via Twitter this week: \u003ca href=\"https://twitter.com/steve8708/status/1531388545960583168\"\u003esmooth, snapping,\ncarousels\u003c/a\u003e by \u003ca href=\"https://twitter.com/steve8708\"\u003eSteve Sewell\u003c/a\u003e, \u003ca href=\"https://twitter.com/jh3yy/status/1532145806278533120\"\u003epure CSS image zooming\u003c/a\u003e by \u003ca href=\"https://twitter.com/jh3yy\"\u003eJhey Tompkins\u003c/a\u003e, and\nthis lovely \u003ca href=\"https://twitter.com/ChallengesCss/status/1533032841029763072\"\u003eimage-less background using conic-gradient\u003c/a\u003e by \u003ca href=\"https://twitter.com/ChallengesCss\"\u003eTemani Afif\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://greg.molnar.io/blog/rails-magic-breakdown-1-day-ago/\"\u003eRails magic breakdown: 1.day.ago\u003c/a\u003e \u0026ndash; Nice explanation of how code such as\n\u003ccode\u003e1.day.ago\u003c/code\u003e actually works.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/antumbral/status/1533262803489783810\"\u003elol computers\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSomeone tagged literally every person with access to the Unreal Engine\ngithub repo in a spam PR and it\u0026rsquo;s generating so many emails per comment\n(upwards of 380k) that the notification emails are like 15 minutes behind\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI installed a neat \u003ca href=\"https://www.raycast.com/aleks/search-rubygems\"\u003eRubygems Raycast extension\u003c/a\u003e this week. Handy!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/andrewculver/status/1529516497919365120\"\u003eA question by Andrew Culver\u003c/a\u003e on Twitter.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhat\u0026rsquo;s the best vanilla JS alternative to Select2? No jQuery, no React, no\nnothing.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSome nice responses in the thread \u0026ndash; worth remembering, but is this something\nwe can more easily build ourselves these days without relying on libraries?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA short, but tiring, week.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://fullstaqruby.org/\"\u003eFullstaq Ruby\u003c/a\u003e \u0026ndash; a new Ruby edition focussed on lowering memory usage and\nimproving performance by \u003ca href=\"https://twitter.com/honglilai\"\u003eHongli Lai\u003c/a\u003e of \u003ca href=\"https://www.phusionpassenger.com\"\u003ePhusion Passenger\u003c/a\u003e fame.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFullstaq Ruby is an MRI-based Ruby distribution that\u0026rsquo;s optimized for server\nproduction use cases. It is compiled with the Jemalloc and malloc_trim\npatches, allowing lower memory usage and higher performance.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAn interesting write up of the \u003ca href=\"https://www.craigkerstiens.com/2022/05/18/unfinished-business-with-postgres/\"\u003ehistory of Postgres at Heroku by Craig\nKerstiens\u003c/a\u003e. I think a lot of people take the achievements of Heroku for\ngranted.\u003c/p\u003e",
      "date_published": "2022-06-05T00:00:00+00:00",
      "date_modified": "2022-06-05T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/48-bad-actor/",
      "url": "https://elver.me/weeknotes/48-bad-actor/",
      "title": "Weeknotes 48: Bad actor",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://bugs.ruby-lang.org/issues/14602\"\u003e\u0026ldquo;Version of dig that raises error if a key is not present\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eNaming things is hard.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe security \u003ca href=\"https://github.blog/2022-04-15-security-alert-stolen-oauth-user-tokens/\"\u003eincident that GitHub\u003c/a\u003e and \u003ca href=\"https://status.heroku.com/incidents/2413\"\u003eHeroku announced\u003c/a\u003e way back in April,\nin which OAuth tokens were stolen, \u003ca href=\"https://github.blog/2022-05-26-npm-security-update-oauth-tokens/\"\u003ehas now been resolved\u003c/a\u003e. Hurrah!\u003c/p\u003e\n\u003cp\u003eOne side affect of GitHub and Heroku\u0026rsquo;s investigation was that the \u003ca href=\"https://devcenter.heroku.com/articles/github-integration\"\u003eHeroku\nGitHub integration\u003c/a\u003e was turned off. This affected many teams, I\u0026rsquo;m sure, and we\nwere no different, disrupting our deployment pipeline and use of \u003ca href=\"https://devcenter.heroku.com/articles/github-integration-review-apps\"\u003ereview\napps\u003c/a\u003e. It caused a lot of hassle, but I believe they did the right thing.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.blog/2022-05-26-npm-security-update-oauth-tokens/\"\u003eGitHub have written up their analysis\u003c/a\u003e of what the bad actor was able to do\n\u0026ndash; seems bad, but could of been worse?\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve found the amount of people immediately ready to jump ship amusing. That\nnew shiny platform you now favour will likely have issues like this one day.\nNo one is free from these attacks. I\u0026rsquo;m not saying don\u0026rsquo;t hold Heroku to\naccount, but your hot take hosting recommendations on Twitter might be\nslightly overzealous.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSaying that, I\u0026rsquo;m nothing if not a hypocrite.\u003c/p\u003e\n\u003cp\u003eSome alternative hosting options are always worth knowing about: \u003ca href=\"https://render.com\"\u003eRender\u003c/a\u003e,\n\u003ca href=\"https://railway.app\"\u003eRailway\u003c/a\u003e, and of course, \u003ca href=\"https://fly.io\"\u003eFly\u003c/a\u003e all seem to be popular. There are a surprising\namount of new hosting companies popping up these days.\u003c/p\u003e\n\u003cp\u003e(AWS or GCP native options have been excluded, because have you ever tried to\nget started with those services?!).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"https://helix-editor.com/news/release-22-05-highlights/\"\u003eHelix Editor\u003c/a\u003e is interesting and they have just released a new version. I\nthink it would take a lot to move me off of Neovim at this point, but\ncompetition is good.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMicrosoft Teams keeps doing \u003cem\u003esomething\u003c/em\u003e that makes my webcam completely\ninaccessible necessitating a system \u003cstrong\u003erestart\u003c/strong\u003e \u0026ndash; terrible state of affairs.\nI\u0026rsquo;ve never used Teams before, and I don\u0026rsquo;t recommend it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI hooked up the \u003ca href=\"https://www.ruby-lang.org/en/feeds/news.rss\"\u003eRuby News\u003c/a\u003e and \u003ca href=\"http://feeds.feedburner.com/herokuchangelog\"\u003eHeroku Changelog\u003c/a\u003e RSS feeds to be posted into\nSlack. Useful for seeing when things change that we rely on. I subscribe to\nthese personally (in \u003ca href=\"https://netnewswire.com\"\u003eNetNewsWire\u003c/a\u003e/\u003ca href=\"https://feedbin.com\"\u003eFeedbin\u003c/a\u003e) but it\u0026rsquo;s nice for the whole team\nto be aware.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGitHub are now supporting \u003ca href=\"https://github.blog/changelog/2022-05-19-updates-to-markdown-pasting-on-github/\"\u003epasting onto selected text\u003c/a\u003e to create links in\nMarkdown. This is a nice improvement that brings GitHub into line with other\nservices such as Jira and Trello.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/starsandrobots/status/1529083932142194690\"\u003eInteresting point about copy/paste\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe pasteboard/clipboard memory buffer on a computer is the most difficult\nthing I regularly use which functionally has no UI.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMy friend \u003ca href=\"https://twitter.com/mynameisharry/status/1529086750278270977\"\u003eHarry pointed out that he likes to use Alfred\u003c/a\u003e for searching the\nclipboard, something I\u0026rsquo;m trying to use \u003ca href=\"https://www.raycast.com\"\u003eRaycast\u003c/a\u003e for.\u003c/p\u003e\n\u003cp\u003eAnd then \u003ca href=\"https://twitter.com/enf/status/1529148078917160960\"\u003ethis bombshell\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eEvery version of the Mac Finder since 1984 has had a \u0026ldquo;Show Clipboard\u0026rdquo;\ncommand on the Edit menu that you could in theory use to keep a window open\nto make the state visible, but basically no one knows that it exists\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;m part of the club that had \u003cem\u003eno\u003c/em\u003e idea that this existed!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://rails-hosting.com/2022/#legacy-vs-greenfield\"\u003eRails is dead\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://bugs.ruby-lang.org/issues/14602\"\u003e\u0026ldquo;Version of dig that raises error if a key is not present\u0026rdquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eNaming things is hard.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe security \u003ca href=\"https://github.blog/2022-04-15-security-alert-stolen-oauth-user-tokens/\"\u003eincident that GitHub\u003c/a\u003e and \u003ca href=\"https://status.heroku.com/incidents/2413\"\u003eHeroku announced\u003c/a\u003e way back in April,\nin which OAuth tokens were stolen, \u003ca href=\"https://github.blog/2022-05-26-npm-security-update-oauth-tokens/\"\u003ehas now been resolved\u003c/a\u003e. Hurrah!\u003c/p\u003e\n\u003cp\u003eOne side affect of GitHub and Heroku\u0026rsquo;s investigation was that the \u003ca href=\"https://devcenter.heroku.com/articles/github-integration\"\u003eHeroku\nGitHub integration\u003c/a\u003e was turned off. This affected many teams, I\u0026rsquo;m sure, and we\nwere no different, disrupting our deployment pipeline and use of \u003ca href=\"https://devcenter.heroku.com/articles/github-integration-review-apps\"\u003ereview\napps\u003c/a\u003e. It caused a lot of hassle, but I believe they did the right thing.\u003c/p\u003e",
      "date_published": "2022-05-29T00:00:00+00:00",
      "date_modified": "2022-05-29T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/47-arbitrary-commands/",
      "url": "https://elver.me/weeknotes/47-arbitrary-commands/",
      "title": "Weeknotes 47: Arbitrary commands",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/sindresorhus/status/1527528976666992641\"\u003eSimon B. Støvring noticed\u003c/a\u003e that his \u003ca href=\"https://github.com/simonbs/runestone\"\u003eRunestone repo\u003c/a\u003e was trending on GitHub\nfor the C language, but the project itself is Swift. This is caused by\nvendoreding dependencies included via submodules. The solution, as \u003ca href=\"https://twitter.com/sindresorhus/status/1527528976666992641\"\u003eindicated\nby Sindre Sorhus\u003c/a\u003e, is to set the dependencies as vendored using the\n\u003ccode\u003e.gitattributes\u003c/code\u003e \u003ca href=\"https://github.com/github/linguist/blob/master/docs/overrides.md\"\u003efile that Linquist uses\u003c/a\u003e to determine the language of a\nrepo.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/rails/rails/issues/45117\"\u003e\u0026ldquo;ComparisonValidator example code does not work\u0026rdquo;\u003c/a\u003e \u0026ndash; I was confused by this\nbehaviour recently.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003ePerson\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026lt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eActiveRecord\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eBase\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  validates_comparison_of \u003cspan style=\"color:#990073\"\u003e:birth_date\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003eless_than_or_equal_to\u003c/span\u003e: \u003cspan style=\"color:#000;font-weight:bold\"\u003e-\u0026gt;\u003c/span\u003e { \u003cspan style=\"color:#008080\"\u003eDate\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003etoday }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWhich will result in a \u003ccode\u003eActiveRecord::RecordInvalid\u003c/code\u003e with this message:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eBirth date wrong number of arguments (given 1, expected 0)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou must remember to supply an argument for the record instance when using a\nlambda like \u003ccode\u003e-\u0026gt;(_person) { Date.today }\u003c/code\u003e, but soon this won\u0026rsquo;t be necessary\nsince \u003ca href=\"https://github.com/fatkodima\"\u003e@fatkodima\u003c/a\u003e made this change: \u003ca href=\"https://github.com/rails/rails/pull/45118\"\u003eMake validators accept lambdas without\nrecord argument\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGary Bernhardt \u003ca href=\"https://www.executeprogram.com/blog/the-code-is-the-to-do-list\"\u003ewrites about a neat way of tracking TODOs in a project\u003c/a\u003e (\u003ca href=\"https://twitter.com/steveklabnik/status/1527528638152904705\"\u003evia\nSteve Klabnik\u003c/a\u003e) \u0026ndash; have them fail the linter. Ironic that I post this after my\nappeal to \u003ca href=\"/weeknotes/46-appease-the-linter/\"\u003enot appease the linter last week\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/veganstraightedge\"\u003eShane Becker follows up with\u003c/a\u003e \u003ca href=\"https://twitter.com/searls\"\u003e@searls\u0026rsquo;\u003c/a\u003e \u003ca href=\"https://github.com/searls/todo_or_die\"\u003e\u003ccode\u003etodo_or_die\u003c/code\u003e\u003c/a\u003e gem for Ruby which\nhas a similar vibe but different approach.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;\u003ca href=\"https://github.com/rails/rails/pull/45035\"\u003eProvide pattern matching for ActiveModel #45035\u003c/a\u003e\u0026rdquo;. Even though Ruby\u0026rsquo;s pattern\nmatching seems a bit awkward to me (to be fair, I haven\u0026rsquo;t had much of an\nopportunity to use it yet due to my project\u0026rsquo;s Ruby version) this is cool.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eCurrent\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003euser\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003ein\u003c/span\u003e { \u003cspan style=\"color:#990073\"\u003esuperuser\u003c/span\u003e: \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;Thanks for logging in. You are a superuser.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003ein\u003c/span\u003e { \u003cspan style=\"color:#990073\"\u003eadmin\u003c/span\u003e: \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e, \u003cspan style=\"color:#0086b3\"\u003ename\u003c/span\u003e: }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;Thanks for logging in, admin \u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e#{\u003c/span\u003e\u003cspan style=\"color:#0086b3\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003ein\u003c/span\u003e { \u003cspan style=\"color:#0086b3\"\u003ename\u003c/span\u003e: }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;Welcome, \u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e#{\u003c/span\u003e\u003cspan style=\"color:#0086b3\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was updating some documentation for Rake tasks this week. You use the \u003ccode\u003edesc\u003c/code\u003e\nmethod to document tasks and they can be listed with \u003ccode\u003e-T\u003c/code\u003e (\u003ccode\u003e--tasks\u003c/code\u003e) and \u003ccode\u003e-D\u003c/code\u003e\n(\u003ccode\u003e--describe\u003c/code\u003e).\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e-T\u003c/code\u003e will show an abbreviated description - just the first line of the\ndescription, whilst \u003ccode\u003e-D\u003c/code\u003e will show the full, multi-line, description.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://getoban.pro/oban/jobs\"\u003eCheckout just how cool the Oban Pro dashboard\u003c/a\u003e is 😎 This is what is possible\nusing LiveView, PubSub etc with Elixir and Phoenix.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL about the \u003ca href=\"https://puppet.com/docs/puppet/5.5/lang_template_erb.html\"\u003eslightly lesser used ERB delimiters\u003c/a\u003e. I never remember that \u003ccode\u003e\u0026lt;%-\u003c/code\u003e\nwill trim the preceding indentation, and \u003ccode\u003e-%\u0026gt;\u003c/code\u003e trims the following line break.\nI\u0026rsquo;ve only been using ERB for multiple years, so give me a break.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.arkency.com/keep-your-team-up-to-date-on-production-data-changes/\"\u003eKeep your team up to date on production data changes\u003c/a\u003e is a really nice idea\n\u0026ndash; hack IRB in production to output all commands to Slack so there\u0026rsquo;s\nvisibility of what is being done.\u003c/p\u003e\n\u003cp\u003eThis has been a problem everywhere I have worked to some degree. Rigorous\ntesting, PR reviews, and manual testing, but then allowing arbitrary commands\nto be run in production!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/sindresorhus/status/1527528976666992641\"\u003eSimon B. Støvring noticed\u003c/a\u003e that his \u003ca href=\"https://github.com/simonbs/runestone\"\u003eRunestone repo\u003c/a\u003e was trending on GitHub\nfor the C language, but the project itself is Swift. This is caused by\nvendoreding dependencies included via submodules. The solution, as \u003ca href=\"https://twitter.com/sindresorhus/status/1527528976666992641\"\u003eindicated\nby Sindre Sorhus\u003c/a\u003e, is to set the dependencies as vendored using the\n\u003ccode\u003e.gitattributes\u003c/code\u003e \u003ca href=\"https://github.com/github/linguist/blob/master/docs/overrides.md\"\u003efile that Linquist uses\u003c/a\u003e to determine the language of a\nrepo.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/rails/rails/issues/45117\"\u003e\u0026ldquo;ComparisonValidator example code does not work\u0026rdquo;\u003c/a\u003e \u0026ndash; I was confused by this\nbehaviour recently.\u003c/p\u003e",
      "date_published": "2022-05-22T00:00:00+00:00",
      "date_modified": "2022-05-22T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/46-appease-the-linter/",
      "url": "https://elver.me/weeknotes/46-appease-the-linter/",
      "title": "Weeknotes 46: Appease the linter",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIf you want to write tests for rendered HTML you might find it tricky to\nassert against the text because the tags will get in the way.\u003c/p\u003e\n\u003cp\u003eTo \u003ca href=\"https://stackoverflow.com/a/2505170/120615\"\u003eworkaround this\u003c/a\u003e you can extract the text using \u003ca href=\"https://nokogiri.org\"\u003eNokogiri\u003c/a\u003e like so:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e[1] pry(main)\u0026gt; html = \u0026quot;\u0026lt;b\u0026gt;I'm bold\u0026lt;/b\u0026gt;\u0026quot;\n=\u0026gt; \u0026quot;\u0026lt;b\u0026gt;I'm bold\u0026lt;/b\u0026gt;\u0026quot;\n[2] pry(main)\u0026gt; Nokogiri::HTML(html).text\n=\u0026gt; \u0026quot;I'm bold\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFile under \u003ca href=\"https://twitter.com/adamwathan/status/1523345746421985281\"\u003e\u0026quot;\u0026hellip;so preoccupied with whether they could, they didn\u0026rsquo;t stop to think\nif they should\u0026quot;\u003c/a\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e‹div class=\u0026quot;[\u0026amp;*: nth-child(2)]: text-red-500 [\u0026amp;\u0026gt;*[data-potato]]:italic\u0026quot;\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI flip-flop about Tailwind often, but I\u0026rsquo;m really not sure about this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/Steve8708/status/1523793487572783104\"\u003e\u0026ldquo;The \u003ccode\u003edownload\u003c/code\u003e attribute in HTML at a glance\u0026rdquo;\u003c/a\u003e \u0026ndash; Never heard of this, looks\nhandy, and \u003ca href=\"https://caniuse.com/?search=download\"\u003ebrowser support is very good\u003c/a\u003e. Do I even computer?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/40-less-work-more-learning/\"\u003eI wrote recently about discovering NanoIDs\u003c/a\u003e. This week I was introduced to\n\u003ca href=\"https://hashids.org\"\u003eHashIDs\u003c/a\u003e, which are similar but can be decoded back to their source integer.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHashids is a small open-source library that generates short, unique,\nnon-sequential ids from numbers.\u003c/p\u003e\n\u003cp\u003eIt converts numbers like 347 into strings like “yr8”, or array of numbers\nlike [27, 986] into “3kTMd”.\u003c/p\u003e\n\u003cp\u003eYou can also decode those ids back. This is useful in bundling several\nparameters into one or simply using them as short UIDs.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGitHub\u0026rsquo;s \u0026ldquo;Authorize Slack\u0026rdquo; button in their settings page doesn\u0026rsquo;t do anything\nin Safari. Click, nothing. Good times. Works in Chrome though doesn\u0026rsquo;t it\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI prototyped a quick way to render a linked table of contents for Markdown\nfiles this week. I used \u003ca href=\"https://github.com/vmg/redcarpet\"\u003eRedcarpet\u003c/a\u003e because it ranked high in my Google search\n😉\u003c/p\u003e\n\u003cp\u003eYou need to pass the \u003ccode\u003eHTML_TOC\u003c/code\u003e renderer when rendering.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erenderer \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eRedcarpet\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eRender\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eHTML_TOC\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enew(\u003cspan style=\"color:#990073\"\u003enesting_level\u003c/span\u003e: \u003cspan style=\"color:#099\"\u003e2\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e..\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e5\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eRedcarpet\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eMarkdown\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enew(renderer)\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003erender(\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026lt;\u003c/span\u003emarkdown\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis will output a link for each header in the document, letting you link\ndirectly to them. Handily, you can tell Redcarpet to only take into account\nMarkdown headers of a certain range. For example, this ignores \u003ccode\u003e\u0026lt;h1\u0026gt;\u003c/code\u003es but\noutputs all the others.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe side project is progressing now, by which I mean \u0026ldquo;procrastinating by\nreading about JavaScript animations\u0026rdquo; instead of doing what actually needs to\nbe done.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRun the linter. Consider the linter. But, please, do not appease the linter.\nIt\u0026rsquo;s a computer, and is \u003cem\u003eoften\u003c/em\u003e wrong.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIf you want to write tests for rendered HTML you might find it tricky to\nassert against the text because the tags will get in the way.\u003c/p\u003e\n\u003cp\u003eTo \u003ca href=\"https://stackoverflow.com/a/2505170/120615\"\u003eworkaround this\u003c/a\u003e you can extract the text using \u003ca href=\"https://nokogiri.org\"\u003eNokogiri\u003c/a\u003e like so:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e[1] pry(main)\u0026gt; html = \u0026quot;\u0026lt;b\u0026gt;I'm bold\u0026lt;/b\u0026gt;\u0026quot;\n=\u0026gt; \u0026quot;\u0026lt;b\u0026gt;I'm bold\u0026lt;/b\u0026gt;\u0026quot;\n[2] pry(main)\u0026gt; Nokogiri::HTML(html).text\n=\u0026gt; \u0026quot;I'm bold\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFile under \u003ca href=\"https://twitter.com/adamwathan/status/1523345746421985281\"\u003e\u0026quot;\u0026hellip;so preoccupied with whether they could, they didn\u0026rsquo;t stop to think\nif they should\u0026quot;\u003c/a\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e‹div class=\u0026quot;[\u0026amp;*: nth-child(2)]: text-red-500 [\u0026amp;\u0026gt;*[data-potato]]:italic\u0026quot;\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI flip-flop about Tailwind often, but I\u0026rsquo;m really not sure about this.\u003c/p\u003e",
      "date_published": "2022-05-15T00:00:00+00:00",
      "date_modified": "2022-05-15T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/45-control-the-source/",
      "url": "https://elver.me/weeknotes/45-control-the-source/",
      "title": "Weeknotes 45: Control the source",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAfter \u003ca href=\"/weeknotes/43-retry-anyway/\"\u003ebeing introduced to it recently\u003c/a\u003e I actually used \u003ca href=\"https://github.com/palkan/anyway_config\"\u003eAnyway Config\u003c/a\u003e this\nweek to encapsulate some configuration. I\u0026rsquo;m sold on the idea. It enabled me to\ntidy up some config, and tested too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI usually rely heavily on the \u003ca href=\"https://slack.github.com\"\u003eGitHub Slack integration\u003c/a\u003e. Unfortunately, it\nrefuses to work on my current project\u0026rsquo;s repo \u0026ndash; very strange. It\u0026rsquo;s messing up\nmy workflow. These things are great until they stop working and become\ncompletely opaque.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/dailydevtips1/status/1521450635194949632\"\u003eHave you ever used any other version control than Git?\u003c/a\u003e \u0026ndash; This had me\nthinking.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t \u003cem\u003ethink\u003c/em\u003e I ever used \u003ca href=\"http://cvs.nongnu.org\"\u003eCVS\u003c/a\u003e, I was a bit too young and beardless for\nthat. So my first introduction to source control was \u003ca href=\"https://en.wikipedia.org/wiki/Microsoft_Visual_SourceSafe\"\u003eVisual SourceSafe\u003c/a\u003e \u0026ndash;\ngenuinely awful. When \u003ca href=\"https://subversion.apache.org\"\u003eSubversion\u003c/a\u003e (and \u003ca href=\"https://tortoisesvn.net\"\u003eTortoiseSVN\u003c/a\u003e) came along it was a\nbreath of fresh air. Then a new job dictated a move to Microsoft\u0026rsquo;s TFS (now\ncalled \u003ca href=\"https://en.wikipedia.org/wiki/Azure_DevOps_Server\"\u003eAzure DevOps Server\u003c/a\u003e) \u0026ndash; also awful, but modern awful.\nAnd finally \u003ca href=\"https://git-scm.com\"\u003eGit\u003c/a\u003e, a game changer.\u003c/p\u003e\n\u003cp\u003eIs Git perfect? Nope. But it\u0026rsquo;s served me well for years and mostly stays\nout of my way.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/jmhodges/status/1522282897905840128\"\u003eGraphQL is a trap\u003c/a\u003e according to \u003ca href=\"https://twitter.com/jmhodges\"\u003eJeff Hodges\u003c/a\u003e. Full disclosure, I\u0026rsquo;ve never\nused \u003ca href=\"https://graphql.org\"\u003eGraphQL\u003c/a\u003e, but I can see how it appeals to the those consuming it.\u003c/p\u003e\n\u003cp\u003eJeff seems to have a lot of experience with GraphQL and he makes some good\npoints. Everything is a trade-off.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNo progress on the side project. I did attempt to start it up again but\ncouldn\u0026rsquo;t remember what I was even trying to achieve 😞\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAfter \u003ca href=\"/weeknotes/43-retry-anyway/\"\u003ebeing introduced to it recently\u003c/a\u003e I actually used \u003ca href=\"https://github.com/palkan/anyway_config\"\u003eAnyway Config\u003c/a\u003e this\nweek to encapsulate some configuration. I\u0026rsquo;m sold on the idea. It enabled me to\ntidy up some config, and tested too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI usually rely heavily on the \u003ca href=\"https://slack.github.com\"\u003eGitHub Slack integration\u003c/a\u003e. Unfortunately, it\nrefuses to work on my current project\u0026rsquo;s repo \u0026ndash; very strange. It\u0026rsquo;s messing up\nmy workflow. These things are great until they stop working and become\ncompletely opaque.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/dailydevtips1/status/1521450635194949632\"\u003eHave you ever used any other version control than Git?\u003c/a\u003e \u0026ndash; This had me\nthinking.\u003c/p\u003e",
      "date_published": "2022-05-08T00:00:00+00:00",
      "date_modified": "2022-05-08T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/44-slow-progress/",
      "url": "https://elver.me/weeknotes/44-slow-progress/",
      "title": "Weeknotes 44: Slow progress",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/github/status/1520056081329893376\"\u003eGitHub now supports code navigation for Elixir repos\u003c/a\u003e. Neat!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI didn\u0026rsquo;t know \u003ca href=\"https://twitter.com/wintermeyer/status/1520290074012889089\"\u003eyou can pass relative dates to Git\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egit reset \u0026ndash;hard main@{5.days.ago}\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBut\u0026hellip;I\u0026rsquo;m not sure I would ever want to? The imprecision worries me. Surely you\nknow \u003cem\u003ewhich\u003c/em\u003e point in time you want to return to?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSlow progress on the \u003ca href=\"/weeknotes/43-retry-anyway/\"\u003eside project I spoke of last week\u003c/a\u003e. I fear it might not\nget done like the myriad other projects I\u0026rsquo;ve started over the years. Staying\ninterested in my side projects remains a problem. It usually starts at the\npoint at which they get hard.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eCTRL-o\u003c/code\u003e in Vim takes you back to the last place you were before you moved.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL that \u003ca href=\"https://dashbit.co/blog/automatic-and-manual-ecto-migrations\"\u003eEcto allows has a \u003ccode\u003e--migrations-path\u003c/code\u003e option\u003c/a\u003e so you can split up\nmigrations by type, or organise them as you please. As \u003ca href=\"https://twitter.com/solnic29a/status/1518958268714004481\"\u003ePeter Solnica\u003c/a\u003e says:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis is \u003cem\u003ereally nice\u003c/em\u003e because you can easily split migrations into various\ngroups (ie schema changes, data changes etc\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve seen quite a lot of chat on Twitter in recent months advocating that most\nof your tests should be higher level acceptance tests \u0026ndash; tests that test what\nthe end user does from the top down. These types of test are a great idea, and\nvery valuable, but the idea that they should make up the majority of your test\nsuite is extremely misguided.\u003c/p\u003e\n\u003cp\u003eTrying to refactor a complex codebase with these tests alone is very\ndifficult. Acceptance tests are slower to run, more likely to break, and\nharder to debug.\u003c/p\u003e\n\u003cp\u003eWe need to stop being so dogmatic. Higher level acceptance tests are one part\nof the testing toolbox, not the only tests you need.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIt\u0026rsquo;s a shame you can\u0026rsquo;t start an adhoc review on GitHub without a PR. I\noccasionally want to communicate about existing code without having any new\ncode, but this isn\u0026rsquo;t possible unfortunately.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/psliwka/vim-dirtytalk\"\u003evim-dirtytalk: spellcheck dictionary for programmers\u003c/a\u003e \u0026ndash; This is a cool idea.\nI\u0026rsquo;m constantly adding obscure programming words to my personal dictionary, and\nthis would obviate that.\u003c/p\u003e\n\u003cp\u003eUnfortunately, I couldn\u0026rsquo;t get it to work with Neovim using the default\ninstallation instructions \u0026ndash; it seems to only be compatible with Vim 😞 \u003ca href=\"https://github.com/psliwka/vim-dirtytalk/issues/1#issuecomment-1114194179\"\u003eI\nworked around the issue though\u003c/a\u003e. Hopefully it gets updated to work with both\nVim and Neovim.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/github/status/1520056081329893376\"\u003eGitHub now supports code navigation for Elixir repos\u003c/a\u003e. Neat!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI didn\u0026rsquo;t know \u003ca href=\"https://twitter.com/wintermeyer/status/1520290074012889089\"\u003eyou can pass relative dates to Git\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egit reset \u0026ndash;hard main@{5.days.ago}\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBut\u0026hellip;I\u0026rsquo;m not sure I would ever want to? The imprecision worries me. Surely you\nknow \u003cem\u003ewhich\u003c/em\u003e point in time you want to return to?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSlow progress on the \u003ca href=\"/weeknotes/43-retry-anyway/\"\u003eside project I spoke of last week\u003c/a\u003e. I fear it might not\nget done like the myriad other projects I\u0026rsquo;ve started over the years. Staying\ninterested in my side projects remains a problem. It usually starts at the\npoint at which they get hard.\u003c/p\u003e",
      "date_published": "2022-05-01T00:00:00+00:00",
      "date_modified": "2022-05-01T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/43-retry-anyway/",
      "url": "https://elver.me/weeknotes/43-retry-anyway/",
      "title": "Weeknotes 43: Retry anyway",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAn interesting deep dive into how \u003ca href=\"https://www.mitchellhanberg.com/how-eex-turns-your-template-into-html/\"\u003eHow EEx Turns Your Template Into HTML\u003c/a\u003e by\n\u003ca href=\"https://twitter.com/mitchhanberg\"\u003eMitchell Hanberg\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was introduced to \u003ca href=\"https://github.com/palkan/anyway_config\"\u003eAnyway Config\u003c/a\u003e from Evil Martians this week. It\u0026rsquo;s been\naround since 2015 but this was the first time I\u0026rsquo;d heard of it.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAnyway Config is a configuration library for Ruby gems and applications.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe core idea is that you encapsulate configuration values in objects rather\nthan just reaching into the global \u003ccode\u003eENV\u003c/code\u003e like almost all my projects up to now\nhave done (with the exception of \u003cem\u003ethat\u003c/em\u003e one project that just committed\nproduction values into git 🙀).\u003c/p\u003e\n\u003cp\u003eYou can read configuration values from many different sources: YAML, TOML,\nRails\u0026rsquo; encrypted credential files, environment variables etc. And they cascade\nallowing them to be overridden, which is useful in development.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve written my own configuration classes before, but you do tend to reinvent\nthe wheel each time, and of course, not everyone on the project does the same\nthing, so having some formalization seems like a good idea.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe recent \u003ca href=\"https://github.blog/2022-04-15-security-alert-stolen-oauth-user-tokens/\"\u003eGitHub\u003c/a\u003e/\u003ca href=\"https://status.heroku.com/incidents/2413\"\u003eHeroku\u003c/a\u003e OAuth token related issues have been an eye\nopener for some. It continues to cause some issues for us, but workarounds are\nin-place. Maybe those production secrets in Git weren\u0026rsquo;t such a good idea after\nall? 😉\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSimon Willison is building cool things again, this time \u003ca href=\"https://simonwillison.net/2022/Apr/18/covid-sewage/\"\u003ea Covid sewage\nTwitter bot\u003c/a\u003e that takes a screenshot of Covid sewage data and \u003ca href=\"https://twitter.com/covidsewage\"\u003etweets it out\n@covidsewerage\u003c/a\u003e. Apart from the technical side of things, I had no idea that\nit was possible to get information about Covid prevalence via sewerage water.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m using \u003ca href=\"https://github.com/teamon/tesla\"\u003eTesla\u003c/a\u003e on a side project.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTesla is an HTTP client loosely based on Faraday. It embraces the concept of\nmiddleware when processing the request/response cycle.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBeing influenced by \u003ca href=\"https://github.com/lostisland/faraday\"\u003eRuby\u0026rsquo;s Faraday\u003c/a\u003e is no bad thing as I\u0026rsquo;m a fan of that\nlibrary. It has suited my needs so far, worth a try if you\u0026rsquo;re looking for an\nElixir HTTP client.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://davidcel.is/posts/stop-validating-email-addresses-with-regex/\"\u003eStop Validating Email Addresses With Regex\u003c/a\u003e \u0026ndash; a compelling argument. There\nis no such thing as checking for an email, only increasingly more complex, but\nincorrect, regexes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/hopsoft/status/1517586369521979392\"\u003eHow many of y\u0026rsquo;all knew that Ruby has a native retry mechanism?\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI was vaguely aware, but have never used or seen it used in a codebase.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAn interesting deep dive into how \u003ca href=\"https://www.mitchellhanberg.com/how-eex-turns-your-template-into-html/\"\u003eHow EEx Turns Your Template Into HTML\u003c/a\u003e by\n\u003ca href=\"https://twitter.com/mitchhanberg\"\u003eMitchell Hanberg\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was introduced to \u003ca href=\"https://github.com/palkan/anyway_config\"\u003eAnyway Config\u003c/a\u003e from Evil Martians this week. It\u0026rsquo;s been\naround since 2015 but this was the first time I\u0026rsquo;d heard of it.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAnyway Config is a configuration library for Ruby gems and applications.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe core idea is that you encapsulate configuration values in objects rather\nthan just reaching into the global \u003ccode\u003eENV\u003c/code\u003e like almost all my projects up to now\nhave done (with the exception of \u003cem\u003ethat\u003c/em\u003e one project that just committed\nproduction values into git 🙀).\u003c/p\u003e",
      "date_published": "2022-04-24T00:00:00+00:00",
      "date_modified": "2022-04-24T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/42-standarderror/",
      "url": "https://elver.me/weeknotes/42-standarderror/",
      "title": "Weeknotes 42: StandardError",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://til.hashrocket.com/posts/zwoz3m7eie-lock-screen-keyboard-shortcut-on-osx\"\u003eHashrocket\u0026rsquo;s TIL site\u003c/a\u003e is great (I\u0026rsquo;m surprised I haven\u0026rsquo;t linked to it yet as\nI read it a lot). This time I learnt that you can do \u003ca href=\"https://til.hashrocket.com/posts/zwoz3m7eie-lock-screen-keyboard-shortcut-on-osx\"\u003e\u003ccode\u003eCtrl\u003c/code\u003e + \u003ccode\u003eCommand\u003c/code\u003e +\n\u003ccode\u003eQ\u003c/code\u003e\u003c/a\u003e to lock your Mac.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was listening to a recent \u003ca href=\"https://remoteruby.transistor.fm\"\u003eRemote Ruby\u003c/a\u003e episode \u0026ndash; \u003ca href=\"https://remoteruby.transistor.fm/171\"\u003eParsers, Interpreters,\nand YJIT with Kevin Newton\u003c/a\u003e \u0026ndash; on the recommendation of my friend \u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e and\nreally enjoyed it. They covered several topics but the formatter related chat\nhad me thinking about the impact of using formatting tools.\u003c/p\u003e\n\u003cp\u003eIn general, I\u0026rsquo;m a fan of formatters \u0026ndash; they are good for learning (I\u0026rsquo;ve found\n\u003ca href=\"https://github.com/rust-lang/rustfmt\"\u003e\u003ccode\u003erustfmt\u003c/code\u003e\u003c/a\u003e helpful when learning Rust) and they can reduce endless\n\u003ca href=\"https://en.wiktionary.org/wiki/bikeshedding#English\"\u003ebikeshedding\u003c/a\u003e when reviewing PRs. However, as long term Rubyist I\u0026rsquo;m not sure\nhow I feel about being forced to write Ruby in a certain way.\u003c/p\u003e\n\u003cp\u003eIf a formatter had been around when Ruby was becoming popular would \u003ca href=\"https://en.wikipedia.org/wiki/Domain-specific_language\"\u003eDSLs\u003c/a\u003e such\nas those used in RSpec and Sinatra have become so popular? And would that have\nbeen good or bad?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI learnt this week that \u003ca href=\"https://ruby-doc.org/core-2.7.5/Exception.html#class-Exception-label-Defaults\"\u003e\u003ccode\u003erescue\u003c/code\u003e in Ruby defaults to \u003ccode\u003eStandardError\u003c/code\u003e\u003c/a\u003e. I\nthink this behaviour has changed. I\u0026rsquo;m sure that it used to be the case that\nrescuing without specifying the exception class was a very bad idea because it\nwould include things like syntax errors.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTwo Ruby statements have default exception classes:\u003cbr\u003e\nraise: defaults to RuntimeError.\u003cbr\u003e\nrescue: defaults to StandardError.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThat seems to no longer be a problem, but I can\u0026rsquo;t help thinking that maybe it\nis worth being explicit and always choosing \u003ccode\u003eStandardError\u003c/code\u003e if something more\nspecific is unavailable.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://evilmartians.com\"\u003eEvil Martians\u003c/a\u003e released a font! \u0026ndash; \u003ca href=\"https://github.com/evilmartians/mono\"\u003eMartian Mono\u003c/a\u003e. It\u0026rsquo;s really nice, but I\nthink I\u0026rsquo;m sticking with \u003ca href=\"https://www.jetbrains.com/lp/mono/\"\u003eJetBrains Mono\u003c/a\u003e for now.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was aware of \u003ca href=\"https://www.raycast.com\"\u003eRaycast\u003c/a\u003e when it first came out, but I was already using\nAlfred, and I didn\u0026rsquo;t really give it a good try. Well, a colleague brought it\nto my attention again recently and I\u0026rsquo;ve given it more of a chance this time.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s really good. I don\u0026rsquo;t know why, but it \u003cem\u003eclicks\u003c/em\u003e with me more than Alfred\never has. Although a long time user of Alfred I never became a power user and\nended up using it as a better Spotlight.\u003c/p\u003e\n\u003cp\u003eStand-out Raycast extensions for me are those for \u003ca href=\"https://www.raycast.com/raycast/github\"\u003eGitHub\u003c/a\u003e and \u003ca href=\"https://www.raycast.com/raycast/jira\"\u003eJira\u003c/a\u003e. Especially\nJira as I can lookup issues faster than loading the website (which is a sad\nstate of affairs, but here we are).\u003c/p\u003e\n\u003cp\u003eMy only worry is that it is free for individuals, so will it still be around\nin a few years?\u003c/p\u003e\n\u003cp\u003eWorth checking out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn my experience people don\u0026rsquo;t tend to write unit tests for Rails helpers as\nmuch as they do for \u0026ldquo;other\u0026rdquo; code. Which is weird because those same people\nalso love to make Rails helpers do all sorts of crazy stuff that shouldn\u0026rsquo;t be\nin a helper - like querying the database.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/jasonswett/status/1514257942715023362\"\u003eJason is correct\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOnly add memoization if a) you\u0026rsquo;re sure it\u0026rsquo;s needed and b) you have a plan to\nmeasure the before/after performance.\nOtherwise you\u0026rsquo;re not optimizing, you\u0026rsquo;re just randomly doing stuff.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eDon\u0026rsquo;t automatically chuck in a \u003ccode\u003e@foo ||= \u0026quot;bar\u0026quot;\u003c/code\u003e just because memoization is\nconvenient in Ruby.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://www.panozzaj.com/blog/2016/03/21/ignore-urls-and-acroynms-while-spell-checking-vim/\"\u003eIgnore URLs and Acroynms While Spell-checking Vim\u003c/a\u003e \u0026ndash; a useful tip on how to\nstop URLs showing up as spelling errors in Vim. This had been bugging me for a\nwhile.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esyn match UrlNoSpell '\\w\\+:\\/\\/[^[:space:]]\\+' contains=@NoSpell\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI can\u0026rsquo;t quite figure out how to make it happy inside my now Lua-based\nconfig, but it works in a regular Vimscript configuration file.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://lexical.dev/\"\u003eLexical\u003c/a\u003e looks promising.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAn extensible text editor framework that does things differently\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eReact only at the moment, designed to work with other frameworks in the future\ntoo.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://oozou.com/blog/custom-attribute-types-in-rails-5-77\"\u003eCustom Attribute Types in Rails 5+\u003c/a\u003e \u0026ndash; I\u0026rsquo;ve never used the Rails Attribute\nAPIs directly. Maybe I should be?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://til.hashrocket.com/posts/zwoz3m7eie-lock-screen-keyboard-shortcut-on-osx\"\u003eHashrocket\u0026rsquo;s TIL site\u003c/a\u003e is great (I\u0026rsquo;m surprised I haven\u0026rsquo;t linked to it yet as\nI read it a lot). This time I learnt that you can do \u003ca href=\"https://til.hashrocket.com/posts/zwoz3m7eie-lock-screen-keyboard-shortcut-on-osx\"\u003e\u003ccode\u003eCtrl\u003c/code\u003e + \u003ccode\u003eCommand\u003c/code\u003e +\n\u003ccode\u003eQ\u003c/code\u003e\u003c/a\u003e to lock your Mac.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was listening to a recent \u003ca href=\"https://remoteruby.transistor.fm\"\u003eRemote Ruby\u003c/a\u003e episode \u0026ndash; \u003ca href=\"https://remoteruby.transistor.fm/171\"\u003eParsers, Interpreters,\nand YJIT with Kevin Newton\u003c/a\u003e \u0026ndash; on the recommendation of my friend \u003ca href=\"https://harry.dev\"\u003eHarry\u003c/a\u003e and\nreally enjoyed it. They covered several topics but the formatter related chat\nhad me thinking about the impact of using formatting tools.\u003c/p\u003e",
      "date_published": "2022-04-17T00:00:00+00:00",
      "date_modified": "2022-04-17T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/41-a-ludicrous-display/",
      "url": "https://elver.me/weeknotes/41-a-ludicrous-display/",
      "title": "Weeknotes 41: A Ludicrous Display",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWell, \u003ca href=\"/weeknotes/37-sticker-me/\"\u003eI bought one\u003c/a\u003e \u0026ndash; an \u003ca href=\"https://www.apple.com/uk/studio-display/\"\u003eApple Studio Display\u003c/a\u003e. And it turned up (early)\nyesterday. I was pretty anxious about this purchase. They\u0026rsquo;re not cheap, and I\nwas also concerned about wobble and reflection.\u003c/p\u003e\n\u003cp\u003eI mounted it on my monitor arm and I\u0026rsquo;d say the wobble is a \u003cem\u003elittle\u003c/em\u003e bit better\nthan my current display, probably because it weighs less. I think I can deal\nwith it for now, but ultimately I want to stop it, which I think is going to\nmean either a new desk or monitor arm, or both.\u003c/p\u003e\n\u003cp\u003eThe reflection is about as much as I was expecting given my experience with\nthe \u003ca href=\"https://en.wikipedia.org/wiki/Apple_Cinema_Display#LED_Cinema_Display\"\u003eApple LED Cinema Display\u003c/a\u003e. I decided to go with the normal glass because\nI was worried about cleaning the Nano-texture glass, and reports of \u003cem\u003eslightly\u003c/em\u003e\npoorer image quality. The day I set it up was a particularly sunny day, so\nhopefully it\u0026rsquo;s the most it will be.\u003c/p\u003e\n\u003cp\u003eThe webcam does look a bit crap, it\u0026rsquo;s true. I will see if a software update\nwith fix it, but I think I\u0026rsquo;ve made peace with the idea that it\u0026rsquo;s actually\nquite nice that my current (better quality) webcam can be positioned much more\neasily \u0026ndash; something I\u0026rsquo;ve realised I do more often than I thought. I bought\nthis monitor knowing nothing of the webcam, so I\u0026rsquo;m not too worried.\u003c/p\u003e\n\u003cp\u003eNow, the good.\u003c/p\u003e\n\u003cp\u003eThe speakers sound really good. Like, \u003cem\u003ereally\u003c/em\u003e good. I will probably never use\nthem. I\u0026rsquo;m a headphones at my desk kind of guy.\u003c/p\u003e\n\u003cp\u003eI have yet to test the built-in microphone, so I\u0026rsquo;m unsure if I\u0026rsquo;ll end up\nusing that.\u003c/p\u003e\n\u003cp\u003eIt looks \u003cem\u003elovely\u003c/em\u003e, both physically, and image-wise \u0026ndash; it looks as good as I\u0026rsquo;d\nhoped. This is ultimately what I care about the most so I\u0026rsquo;m very happy with\nthat. Read about why this matters to me and others in \u003ca href=\"https://bjango.com/articles/macexternaldisplays2/\"\u003eMac external displays\nfor designers and developers, part 2\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome days I feel like giving up on Safari \u0026ndash; this is one reason 👇\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLately I\u0026rsquo;ve noticed several websites being really slow or not loading at all\nin Safari but working fine in Chrome. Unchecking this fixed it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/soffes\"\u003eSam Soffes\u003c/a\u003e has been suffering from this too, and \u003ca href=\"https://twitter.com/soffes/status/1512613255033856005\"\u003eproffers a potential\nsolution\u003c/a\u003e. I have turned the option off for now, but it\u0026rsquo;s too soon to tell\nwhether it has fixed anything.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCloudflare have an interesting feature \u0026ndash; \u003ca href=\"https://support.cloudflare.com/hc/en-us/articles/200168236-Configuring-Cloudflare-IP-Geolocation\"\u003eCloudflare IP Geolocation\u003c/a\u003e \u0026ndash; to\ncapture a user\u0026rsquo;s ISO 3166-1 country code and pass it on via a \u003ccode\u003eCF-IpCountry\u003c/code\u003e\nheader that you can grab and use in your app. Useful for basic geolocating.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCloudflare can include the country code of the visitor\u0026rsquo;s IP (in ISO 3166-1\nAlpha 2 format) with each request between Cloudflare and the upstream origin\nweb server. This allows site administrators to capture their visitor\u0026rsquo;s IP\nlocation in server logging and/or application logic.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI started working with a new client this week. So far, so good. It has been\nreally nice to have some good collaboration via code reviews. Something I\u0026rsquo;ve\nmissed. I really should have taken a week off first though \u0026ndash; I am tired.\nLuckily there is a long weekend coming up, which I\u0026rsquo;ve elongated by a day each\nside and we\u0026rsquo;ll be going away for a break 😎\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was surprised/delighted to see that the new client I\u0026rsquo;m working with keep\nmeeting notes. Yes, notes. Of a meeting. For each meeting. You know, so the\nattendees have some idea of what the point was later. What a novel idea!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/joemasilotti/status/1511329054892257287\"\u003e\u0026ldquo;Wait\u0026hellip;what?\u0026rdquo;\u003c/a\u003e \u0026ndash; my thoughts exactly. I had no idea a \u003ccode\u003eform\u003c/code\u003e attribute\nexisted for inputs. The original \u003ca href=\"https://www.smashingmagazine.com/2022/03/html-attributes-you-never-use/#the-form-attribute-for-form-fields\"\u003eSmashing Magazine article\u003c/a\u003e explains it best.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn most cases, you’re going to nest your form inputs and controls inside a\n\u003ccode\u003e\u0026lt;form\u0026gt;\u003c/code\u003e element. But if your app or layout requires something a little\ndifferent, you have the option to put a form input anywhere you want and\nassociate it with any \u003cform\u003e element — even one that’s not the element’s\nparent.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://wrapbook.engineering/we-re-wrote-every-view.html\"\u003eUsing feature flags to rewrite every view in our Rails app\u003c/a\u003e \u0026ndash; Nice post\nabout how wrapbook rewrote a lot of their UI behind a feature flag. I\nparticularly like their idea of running the test suite using a GitHub Action\nmatrix in the before and after states.\u003c/p\u003e\n\u003cp\u003eI wonder whether they could have used \u003ca href=\"/weeknotes/38-tips-tips-tips/\"\u003eRails variants as I wrote about\nrecently\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBe nice. Treat people well. \u003ca href=\"https://www.youtube.com/watch?v=1uYWYWPc9HU\"\u003eOr this is what you\u0026rsquo;ll get\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWell, \u003ca href=\"/weeknotes/37-sticker-me/\"\u003eI bought one\u003c/a\u003e \u0026ndash; an \u003ca href=\"https://www.apple.com/uk/studio-display/\"\u003eApple Studio Display\u003c/a\u003e. And it turned up (early)\nyesterday. I was pretty anxious about this purchase. They\u0026rsquo;re not cheap, and I\nwas also concerned about wobble and reflection.\u003c/p\u003e\n\u003cp\u003eI mounted it on my monitor arm and I\u0026rsquo;d say the wobble is a \u003cem\u003elittle\u003c/em\u003e bit better\nthan my current display, probably because it weighs less. I think I can deal\nwith it for now, but ultimately I want to stop it, which I think is going to\nmean either a new desk or monitor arm, or both.\u003c/p\u003e",
      "date_published": "2022-04-10T00:00:00+00:00",
      "date_modified": "2022-04-10T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/40-less-work-more-learning/",
      "url": "https://elver.me/weeknotes/40-less-work-more-learning/",
      "title": "Weeknotes 40: Less work. More learning.",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIt would be really nice if I could mark certain repos/organisations on GitHub\nas \u0026ldquo;work\u0026rdquo; and turn off notifications for those over the weekend. Is it\npossible without a separate account?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/TylerAYoung/status/1508413319178297352\"\u003eNice tip for making doctests easier to write\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTIL Elixir\u0026rsquo;s doctests support an \u003ccode\u003eimport: true\u003c/code\u003e flag so that you don\u0026rsquo;t have\nto write out the full module name in your doctests.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWhen I last wrote some \u003ca href=\"https://elixir-lang.org/getting-started/mix-otp/docs-tests-and-with.html#doctests\"\u003eElixir doctests\u003c/a\u003e I remember this being a problem. I\nwould often have modules nested several layers deep which made referencing\nthem in the test difficult.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/CodeEditApp/CodeEdit\"\u003eCodeEdit\u003c/a\u003e, a new code editor for macOS \u0026ndash; not yet released.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHowever, comparable editors are built on Electron. This is a huge limitation\nbecause it cannot utilize all system resources to its fullest potential.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eShots fired, but not wrong. Electron is used for a lot of reasons, but\nperformance isn\u0026rsquo;t one of them.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://planetscale.com/blog/why-we-chose-nanoids-for-planetscales-api\"\u003eWhy we chose NanoIDs for PlanetScale\u0026rsquo;s API\u003c/a\u003e \u0026ndash; this is the first time I\u0026rsquo;ve\nheard about NanoIDs. Basically, a more URL-friendly alternative to UUIDs,\nwhich tend to be cumbersome and ugly.\u003c/p\u003e\n\u003cp\u003eMost of the systems I\u0026rsquo;ve used still use auto-incrementing integers for\ndatabase records, and sometimes a UUID against the record that can be shared\nmore readily between front and back ends where an identifier needs to be\npassed into another system.\u003c/p\u003e\n\u003cp\u003eThe idea of an identifier in a system having a collision terrifies me. But as\nyou can see from the \u003ca href=\"https://zelark.github.io/nano-id-cc/\"\u003eNano ID Collision Calculator\u003c/a\u003e the probability is\nactually much less than I anticipated.\u003c/p\u003e\n\u003cp\u003eFor example, if you create 1000 IDs per second, using this alphabet -\n\u003ccode\u003e0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\u003c/code\u003e - at 21\ncharacters long, the probability of having a collision is 1% in ~30 million\nyears. Those odds seem good.\u003c/p\u003e\n\u003cp\u003eAnd as well as the \u003ca href=\"https://github.com/ai/nanoid\"\u003eJavaScript support\u003c/a\u003e, there are also client libraries for\n\u003ca href=\"https://github.com/radeno/nanoid.rb\"\u003eRuby\u003c/a\u003e, \u003ca href=\"https://docs.rs/nanoid/latest/nanoid/\"\u003eRust\u003c/a\u003e, and \u003ca href=\"https://hexdocs.pm/nanoid/Nanoid.html\"\u003eElixir\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve read quite a lot of criticism of NanoIDs, some of it fair, but an awful\nlot seemed to miss the main selling point, readability.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.johnwhiles.com/posts/work.html\"\u003eMaybe you should do less \u0026lsquo;work\u0026rsquo;\u003c/a\u003e by John Whiles \u0026ndash; I mean, maybe? This is the\nsort of thing a lot of people do, but never talk about.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://jvns.ca/blog/2017/08/06/learning-at-work/\"\u003eLearning at work\u003c/a\u003e by Julia Evans. Related to the above.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMy view is that it’s my job to take time out of my workday to learn things.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eYou shouldn\u0026rsquo;t be expected to learn everything outside of work, when the work\n\u003cem\u003eis\u003c/em\u003e constant learning.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://planetscale.com/blog/generics-can-make-your-go-code-slower\"\u003eGenerics can make your Go code slower\u003c/a\u003e. I don\u0026rsquo;t know Go. I don\u0026rsquo;t really want\nto, but I found this article (what I understood of it) very interesting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve written about Fly a few times, but their blog output is consistently\ninteresting, and this is no different \u0026ndash; \u003ca href=\"https://fly.io/blog/a-foolish-consistency/\"\u003eA Foolish Consistency: Consul at\nFly.io\u003c/a\u003e by \u003ca href=\"https://twitter.com/tqbf/status/1509211018777534465\"\u003eThomas H. Ptacek\u003c/a\u003e. The things they have to do to wrangle VMs on\nmultiple continents is crazy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDo you want your digits to take up the same space regardless of number?\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;if your font supports it, you can use \u003ccode\u003efont-variant-numeric: tabular-nums\u003c/code\u003e in your CSS to keep your numerals the same width and prevent\nshifting layout.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/xdesro/status/1508172487347036169\"\u003ehttps://twitter.com/xdesro/status/1508172487347036169\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI stalled moving \u003ca href=\"https://github.com/jordelver/dotfiles/tree/master/config/nvim\"\u003emy Vim config\u003c/a\u003e over to \u003ca href=\"https://www.lua.org\"\u003eLua\u003c/a\u003e but made progress this week \u0026ndash;\n\u003cem\u003enearly\u003c/em\u003e done.\u003c/p\u003e\n\u003cp\u003eI figured that I rely on so many Neovim-only plugins now that there is\nprobably no going back to regular ol\u0026rsquo; Vim, so I might as well fully embrace\nthe new world.\u003c/p\u003e\n\u003cp\u003eLua feels a lot more like something I could write myself, it makes basic\nsense as a language, whereas Vimscript has always felt weird to me, a bit like\ntrying to do something in Bash.\u003c/p\u003e\n\u003cp\u003eThe move is a work in progress as not all Neovim APIs are available from Lua\nat the moment (as they are in Vimscript), but there are fairly good\nworkarounds.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIt would be really nice if I could mark certain repos/organisations on GitHub\nas \u0026ldquo;work\u0026rdquo; and turn off notifications for those over the weekend. Is it\npossible without a separate account?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/TylerAYoung/status/1508413319178297352\"\u003eNice tip for making doctests easier to write\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTIL Elixir\u0026rsquo;s doctests support an \u003ccode\u003eimport: true\u003c/code\u003e flag so that you don\u0026rsquo;t have\nto write out the full module name in your doctests.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWhen I last wrote some \u003ca href=\"https://elixir-lang.org/getting-started/mix-otp/docs-tests-and-with.html#doctests\"\u003eElixir doctests\u003c/a\u003e I remember this being a problem. I\nwould often have modules nested several layers deep which made referencing\nthem in the test difficult.\u003c/p\u003e",
      "date_published": "2022-04-03T00:00:00+00:00",
      "date_modified": "2022-04-03T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/39-burning-bridges/",
      "url": "https://elver.me/weeknotes/39-burning-bridges/",
      "title": "Weeknotes 39: Burning Bridges",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI used \u003ca href=\"https://relishapp.com/rspec/rspec-mocks/docs/working-with-legacy-code/message-chains\"\u003eRSpec\u0026rsquo;s \u003ccode\u003ereceive_message_chain\u003c/code\u003e\u003c/a\u003e this week for the first time. I\u0026rsquo;m not\nsure how I\u0026rsquo;ve managed to avoid it for all these years. I generally consider it\na code smell, as do the RSpec docs, but sometimes it\u0026rsquo;s the most\nsensible/readable way forward. In this case, stubbing an object over which I\nhave no control.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://brightonruby.com\"\u003eBrighton Ruby conference\u003c/a\u003e is back this year and I managed to bag myself a\nticket from the second batch. I\u0026rsquo;m really looking forward to it after a few\nyears off. I\u0026rsquo;ve been going since 2014 apparently!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFormerly remote-first companies might find that their new office doesn\u0026rsquo;t fix\ntheir communication issues, but actually makes them worse.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://gist.github.com/mcrumm/98059439c673be7e0484589162a54a01\"\u003eDeploying to Fly.io with SQLite\u003c/a\u003e by \u003ca href=\"https://twitter.com/mcrumm\"\u003eMicheal Crumm\u003c/a\u003e shows how to deploy a\nPhoenix app to Fly with SQLite instead of Postgres. Once you know how it\u0026rsquo;s not\nthat hard. I will be bookmarking this for the future.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m trying to improve my development workflow and part of that is perhaps\nmoving my vim config into lua, or certainly using a lot more lua than I\ncurrently do.  I was browsing \u003ca href=\"https://github.com/tjdevries/config_manager\"\u003eTJ DeVries\u0026rsquo; dotfiles\u003c/a\u003e and came across \u003ccode\u003epcall\u003c/code\u003e -\nwhat is \u003ccode\u003epcall\u003c/code\u003e?\u003c/p\u003e\n\u003cp\u003eTurns out that it\u0026rsquo;s \u003ca href=\"https://www.lua.org/pil/8.4.html\"\u003ehow Lua does error handling\u003c/a\u003e, or part of how it does it.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFor many applications, you do not need to do any error handling in Lua.\nUsually, the application program does this handling. All Lua activities\nstart from a call by the application, usually asking Lua to run a chunk. If\nthere is any error, this call returns an error code and the application can\ntake appropriate actions. In the case of the stand-alone interpreter, its\nmain loop just prints the error message and continues showing the prompt and\nrunning the commands.\u003c/p\u003e\n\u003cp\u003eIf you need to handle errors in Lua, you should use the pcall function\n(protected call) to encapsulate your code.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFrom the wall of my local coffee shop.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen one burns one\u0026rsquo;s bridges, what a very nice fire it makes.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u0026ndash; Dylan Thomas\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI used \u003ca href=\"https://relishapp.com/rspec/rspec-mocks/docs/working-with-legacy-code/message-chains\"\u003eRSpec\u0026rsquo;s \u003ccode\u003ereceive_message_chain\u003c/code\u003e\u003c/a\u003e this week for the first time. I\u0026rsquo;m not\nsure how I\u0026rsquo;ve managed to avoid it for all these years. I generally consider it\na code smell, as do the RSpec docs, but sometimes it\u0026rsquo;s the most\nsensible/readable way forward. In this case, stubbing an object over which I\nhave no control.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://brightonruby.com\"\u003eBrighton Ruby conference\u003c/a\u003e is back this year and I managed to bag myself a\nticket from the second batch. I\u0026rsquo;m really looking forward to it after a few\nyears off. I\u0026rsquo;ve been going since 2014 apparently!\u003c/p\u003e",
      "date_published": "2022-03-27T00:00:00+00:00",
      "date_modified": "2022-03-27T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/38-tips-tips-tips/",
      "url": "https://elver.me/weeknotes/38-tips-tips-tips/",
      "title": "Weeknotes 38: Tips, tips, tips",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI learnt of the \u003ca href=\"https://twitter.com/KevinJPowell/status/1504421195516727301\"\u003e\u003ccode\u003e\u0026lt;dialog\u0026gt;\u003c/code\u003e element this week via Kevin Powell\u003c/a\u003e. A native modal\nwith associated JavaScript API \u0026ndash; very cool!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhile it isn\u0026rsquo;t fully supported yet, we\u0026rsquo;re getting very close to the dialog\nelement being in all modern browsers!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is great, but there\u0026rsquo;s a part of me that can\u0026rsquo;t quite believe that this is\nonly a thing that we can maybe, possibly, start using in 2022. How long have\nwe needed modals? The Web moves both too slowly and too quickly at once.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/websebdev/status/1502785256335855620\"\u003eSebastien Auriault with a useful tip\u003c/a\u003e about Rails template variants. I had no\nidea this feature existed \u0026ndash; I keep discovering new Rails features despite\nhaving used the framework for 10+ years at this point \u0026ndash; and it looks useful\nin circumstances where you definitely need separate templates.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI believe that a team should try and communicate \u0026ldquo;in public\u0026rdquo; as much as\npossible because it has a lot of benefits. Information can be picked up by the\nteam organically reducing knowledge silos. People can chip-in and help out if\nthe someone else is not available. Etc, etc.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s so hard to stop myself slipping back into communicating over DMs\nthough\u0026hellip;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/simonw\"\u003eSimon Willison\u003c/a\u003e is constantly finding new and interesting ways to use \u003ca href=\"https://github.com/features/actions\"\u003eGitHub\nActions\u003c/a\u003e. He recently created a new tool called \u003ca href=\"https://github.com/simonw/shot-scraper\"\u003e\u003ccode\u003eshot-scraper\u003c/code\u003e\u003c/a\u003e for screen\nscraping that uses \u003ca href=\"https://playwright.dev\"\u003ePlaywright\u003c/a\u003e under the hood, and has now combined that with\na new \u003ca href=\"https://simonwillison.net/2022/Mar/14/shot-scraper-template/\"\u003eGitHub repo template\u003c/a\u003e that makes setting up automated screen scraping\neasy.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/simonw\"\u003eHis Twitter\u003c/a\u003e and \u003ca href=\"https://simonwillison.net\"\u003ewebsite\u003c/a\u003e are well worth following.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/channel/UCd3dNckv1Za2coSaHGHl5aA\"\u003eTJ DeVries\u003c/a\u003e continues to release great videos on the latest and greatest in\nNeovim. This time 2 minutes on a \u003ca href=\"https://www.youtube.com/watch?v=jH5PNvJIa6o\"\u003ebrand new feature: Global Statusline\u003c/a\u003e. Looks\npretty neat. You see a lot of Redditers moaning about people posting\nvideo-only content, many preferring written descriptions, but I find video\nsummaries like this extremely helpful. Bravo, TJ!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/hauleth/status/1502281780421873664\"\u003eNice tip\u003c/a\u003e from \u003ca href=\"https://twitter.com/hauleth\"\u003e@hauleth\u003c/a\u003e on making \u0026ldquo;lockfiles\u0026rdquo; such as \u003ccode\u003eGemfile.lock\u003c/code\u003e,\n\u003ccode\u003emix.lock\u003c/code\u003e, \u003ccode\u003epackage-lock.json\u003c/code\u003e, and \u003ccode\u003eyarn.lock\u003c/code\u003e less of a hassle to merge by\nsetting the \u003ccode\u003emerge=binary\u003c/code\u003e attribute against those file types in\n\u003ccode\u003e~/.config/git/attributes\u003c/code\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt will force Git to treat lock file as a binary file, which mean that it\nwill not modify the file with conflict markers while still marking file as a\nconflict in stage. Then you can \u0026ldquo;resolve conflicts\u0026rdquo; via mix deps.get/mix\ndeps.update\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTIL: You can reset the commit date of an existing commit using \u003ccode\u003egit commit --amend --date=now\u003c/code\u003e. If you made some work-in-progress commits over time, but\nyou want to bring the dates up-to-date after a rebase this is useful.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI learnt of the \u003ca href=\"https://twitter.com/KevinJPowell/status/1504421195516727301\"\u003e\u003ccode\u003e\u0026lt;dialog\u0026gt;\u003c/code\u003e element this week via Kevin Powell\u003c/a\u003e. A native modal\nwith associated JavaScript API \u0026ndash; very cool!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhile it isn\u0026rsquo;t fully supported yet, we\u0026rsquo;re getting very close to the dialog\nelement being in all modern browsers!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis is great, but there\u0026rsquo;s a part of me that can\u0026rsquo;t quite believe that this is\nonly a thing that we can maybe, possibly, start using in 2022. How long have\nwe needed modals? The Web moves both too slowly and too quickly at once.\u003c/p\u003e",
      "date_published": "2022-03-20T00:00:00+00:00",
      "date_modified": "2022-03-20T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/37-sticker-me/",
      "url": "https://elver.me/weeknotes/37-sticker-me/",
      "title": "Weeknotes 37: Sticker me",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe BBC seem to be putting a time-wall up in front of a lot of my favourite\npodcasts forcing me to use BBC Sounds, a poorly implemented podcast app, if I\nwant to listen to topical shows in a timely manner. Great job BBC. I\u0026rsquo;m not\nsure what has motivated this move, there are a couple that spring to mind, but\nit\u0026rsquo;s very inconvenient.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/YS-L/csvlens\"\u003e\u003ccode\u003ecsvlens\u003c/code\u003e\u003c/a\u003e is a nice tool to view CSV files in the terminal.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecsvlens is a CSV file viewer in the command line. It is similar to less but\nmade for CSV.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eApple finally released a new monitor this week \u0026ndash; \u003ca href=\"https://www.apple.com/uk/studio-display/\"\u003eApple Studio Display\u003c/a\u003e. I\ncannot overstate just \u003cem\u003ehow long\u003c/em\u003e I\u0026rsquo;ve been waiting for Apple to release a\nproduct like this. Actually I can, since November 2016, when I retired my\ntrusty \u003ca href=\"https://en.wikipedia.org/wiki/Apple_Cinema_Display#LED_Cinema_Display\"\u003eLED Cinema Display\u003c/a\u003e \u0026ndash; the finest monitor I\u0026rsquo;ve ever owned.\u003c/p\u003e\n\u003cp\u003eThe \u003ca href=\"https://www.apple.com/uk/pro-display-xdr/\"\u003ePro Display XDR\u003c/a\u003e is the closest they\u0026rsquo;ve come, but\u0026hellip;the price. I\u0026rsquo;d be\nlying if I said I hadn\u0026rsquo;t considered it, but I couldn\u0026rsquo;t bring myself to part\nwith the best part of £5k!\u003c/p\u003e\n\u003cp\u003eThe new display has the quality panel of the LG 5K but wrapped in nice,\nnon-plastic, enclosure with other niceties like the webcam and speakers.\nMostly I just hope it works well, unlike the LG 5K which has been plagued with\n\u0026ldquo;it works for me\u0026rdquo; issues throughout it\u0026rsquo;s life.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"https://www.nytimes.com/interactive/2022/podcasts/trojan-horse-affair.html\"\u003eTrojan Horse Letter\u003c/a\u003e podcast is a good listen. There seems to have been\nsome rebuking of the findings, but I have yet to finish it, so I will catch up\nwith those afterwards.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI \u003ca href=\"https://twitter.com/charmcli/status/1501665167746101248\"\u003ebagged myself some stickers\u003c/a\u003e this week. I\u0026rsquo;m a sucker for a sticker. I was\nalready aware of the various cli stuff \u003ca href=\"https://charm.sh\"\u003eCharm\u003c/a\u003e have been working on for a\nwhile now, but this giveaway has achieved its aim and drawn me in to have\nanother look.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHeroku seem to have come to their senses and are \u003ca href=\"https://devcenter.heroku.com/changelog-items/2364\"\u003elengthening the session times\u003c/a\u003e\non their dashboard. Logging into the dashboard every single day gets tiresome.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ethe default web session length will increase from 12 hours to 24 hours. In\naddition, users with Multi-Factor Authentication (MFA) enabled have their\nweb sessions extended an additional 24 hours when they are active on the\nHeroku Dashboard. MFA-enabled users’ sessions can be extended up to 10 days\n(240 hours).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt sounds like MFA-enabled user sessions get sessions that last up to 10 days?\nThe docs are not clearly written to me.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA \u003ca href=\"https://twitter.com/jenistyping/status/1499852188348125184\"\u003evaluable lesson\u003c/a\u003e that I learnt recently.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDon\u0026rsquo;t burn yourself out trying to change the culture of an organization\nwhere you are not in a position of power.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe BBC seem to be putting a time-wall up in front of a lot of my favourite\npodcasts forcing me to use BBC Sounds, a poorly implemented podcast app, if I\nwant to listen to topical shows in a timely manner. Great job BBC. I\u0026rsquo;m not\nsure what has motivated this move, there are a couple that spring to mind, but\nit\u0026rsquo;s very inconvenient.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/YS-L/csvlens\"\u003e\u003ccode\u003ecsvlens\u003c/code\u003e\u003c/a\u003e is a nice tool to view CSV files in the terminal.\u003c/p\u003e",
      "date_published": "2022-03-13T00:00:00+00:00",
      "date_modified": "2022-03-13T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/36-time-keeping-new-and-old/",
      "url": "https://elver.me/weeknotes/36-time-keeping-new-and-old/",
      "title": "Weeknotes 36: Time keeping new and old",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFeature flags are great. They enable you to roll out features slowly, or test\nin production, but they are \u003cem\u003enot\u003c/em\u003e free.\u003c/p\u003e\n\u003cp\u003eThey add complexity. They require extra work. They add tech debt. Worth\nremembering.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been looking for a good note taking system for a long time. At the moment\nmy \u0026ldquo;work notes\u0026rdquo; consists of a massive \u003ccode\u003eTODO.md\u003c/code\u003e, which has been surprisingly\neffective. The area were is really falls down is quick notes. I often want to\nnote down how I did a thing, or things to remember for these weeknotes. But\nthere is a lot of friction involved in that at the moment.\u003c/p\u003e\n\u003cp\u003eI heard about \u003ca href=\"https://zettelkasten.de/introduction/\"\u003eZettelkasten\u003c/a\u003e a while ago, and like the idea, but have failed\nto integrate it into my life in anyway. So this week I\u0026rsquo;ve been playing with\n\u003ca href=\"https://github.com/mickael-menu/zk/\"\u003e\u003ccode\u003ezk\u003c/code\u003e\u003c/a\u003e which is a notetaking cli app with Vim integration via \u003ca href=\"https://github.com/mickael-menu/zk-nvim\"\u003ezk-nvim\u003c/a\u003e. I\u0026rsquo;m\nvery hopeful that this can work for me, but I\u0026rsquo;m still setting it up and\nexperimenting.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI felt really let down this week. A decision was made, but it wasn\u0026rsquo;t the\noutcome that bothered me, although disappointing, it was the way in which it\nwas handled.\u003c/p\u003e\n\u003cp\u003eTurns out some people are only nice to you when they need you.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI tried out \u003ca href=\"https://cron.com\"\u003eCron\u003c/a\u003e (no, not that \u003ccode\u003ecron\u003c/code\u003e) this week. I\u0026rsquo;m not a heavy calendar\nuser, but I do want quick access to my Zoom meetings and Cron happens to do a\ngreat job of that. It has a neat menubar widget that shows all upcoming\nmeetings, and when a meeting is about to start it pops up a button to join. No\nmore \u0026ldquo;open a web browser in a random tab to start the meeting\u0026rdquo; mess.\u003c/p\u003e\n\u003cp\u003eHowever, Cron uses nearly a gig of memory on my computer 😮 This seems like a\nlot to just sit there and notify me of meetings? Of course, Cron is an\nElectron app.\u003c/p\u003e\n\u003cp\u003eEvaluating Cron reminded of Fantasical on desktop though. I\u0026rsquo;ve been an iOS\nuser of Fantasical for years and love it, but I\u0026rsquo;ve never tried the desktop\nversion. It has a similar meeting widget and only uses ~320MB so there is a\nnice saving there.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI finally wrote a \u003ca href=\"https://elver.me/uses\"\u003e/uses page\u003c/a\u003e. I\u0026rsquo;ve had this on my TODO list for a while\nnow, but a conversation with my friend prompted me to finish it off. Please\ndelight in just how \u003cem\u003eold skool\u003c/em\u003e the web page is.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e👆 I used a neat little tool called \u003ca href=\"https://github.com/kpym/gm\"\u003e\u003ccode\u003egm\u003c/code\u003e\u003c/a\u003e to build the page. I considered\njust going FULL HTML MODE, but there are absolutely \u003cem\u003etons\u003c/em\u003e of links on the\npage and it gets boring really quickly manually linking them all up. Markdown\nexcels at this.\u003c/p\u003e\n\u003cp\u003eHugo has been doing a great job for this website but it requires setup, and I\ndidn\u0026rsquo;t want that for a quick and dirty page. \u003ccode\u003egm\u003c/code\u003e is a thin wrapper around the\n\u003ca href=\"https://github.com/yuin/goldmark\"\u003eGoldmark\u003c/a\u003e Markdown library that Hugo uses, which is ideal as I\u0026rsquo;ve been very\nhappy with it in that context.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.youtube.com/watch?v=If61baWF4GE\"\u003eWhy Russia is Invading Ukraine\u003c/a\u003e \u0026ndash; I found this video really helpful in\nunderstanding what is currently going on.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFeature flags are great. They enable you to roll out features slowly, or test\nin production, but they are \u003cem\u003enot\u003c/em\u003e free.\u003c/p\u003e\n\u003cp\u003eThey add complexity. They require extra work. They add tech debt. Worth\nremembering.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been looking for a good note taking system for a long time. At the moment\nmy \u0026ldquo;work notes\u0026rdquo; consists of a massive \u003ccode\u003eTODO.md\u003c/code\u003e, which has been surprisingly\neffective. The area were is really falls down is quick notes. I often want to\nnote down how I did a thing, or things to remember for these weeknotes. But\nthere is a lot of friction involved in that at the moment.\u003c/p\u003e",
      "date_published": "2022-03-06T00:00:00+00:00",
      "date_modified": "2022-03-06T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/35-grokking-neovim/",
      "url": "https://elver.me/weeknotes/35-grokking-neovim/",
      "title": "Weeknotes 35: Grokking neovim",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI bought a new monitor arm so that I can raise my laptop up off the desk and\nalign it into a better position. I wasn\u0026rsquo;t really using the laptop screen,\nwhich I felt was a shame considering how nice is it compared to my main\nmonitor.\u003c/p\u003e\n\u003cp\u003eI got the \u003ca href=\"https://www.fully.com/accessories/jarvis-dual-monitor-arm.html\"\u003eFully Jarvis Dual Monitor Arm\u003c/a\u003e with laptop tray, in white. I\u0026rsquo;d\nheard good things about it, but after months of casually researching I\nsuddenly took the plunge because I was fed up of looking.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s a bit wobbly, but so is my single arm Amazon Basics model \u0026mdash; the desk is\ntoo flimsy to stop any wobble I fear. However, it looks nice, and does allow\nthe positioning I was after. There was a small sticker part missing from the\npackage but it wasn\u0026rsquo;t a problem.\u003c/p\u003e\n\u003cp\u003eSo far, I like it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/conundrum9999/status/1494187346102607876\"\u003eWhy you should avoid symbols and nonstandard letters in your twitter name if you want to be screen reader friendly\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThis reminded me that you should also \u003ca href=\"https://en.wikipedia.org/wiki/Camel_case\"\u003eCamelCase\u003c/a\u003e your #HashTags to make them\nscreen reader friendly.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI installed \u003ca href=\"https://github.com/nvim-telescope/telescope.nvim\"\u003eTelescope\u003c/a\u003e this week after thinking about it for ages (I\u0026rsquo;ve found\nit completing overwhelming to keep up with the constantly moving ecosystem).\nI\u0026rsquo;ve always been pretty happy with my \u003ca href=\"https://github.com/junegunn/fzf.vim\"\u003e\u003ccode\u003efzf.vim\u003c/code\u003e\u003c/a\u003e-based fuzzy-finding setup\nbut I kept hearing a lot about Telescope, and a lot of plugins are being built\non top of it.\u003c/p\u003e\n\u003cp\u003eI decided to use slightly different keybindings than what I was previously\nusing. Of course, this means constant mis-typings due to muscle-memory 😬\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m keen revitalize my Neovim setup after watching a couple of inspiring\nstreams on YouTube \u0026mdash;  \u003ca href=\"https://www.youtube.com/watch?v=puWgHa7k3SY\"\u003eNeovim Builtin LSP Setup Guide\u003c/a\u003e and \u003ca href=\"https://www.youtube.com/watch?v=Dn800rlPIho\"\u003eIntroduction to\nLuaSnip\u003c/a\u003e. I\u0026rsquo;m going to set up Neovim LSP next I think.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of Neovim LSP. This week the popular Language Server,\n\u003ca href=\"https://rust-analyzer.github.io\"\u003e\u003ccode\u003erust-analyzer\u003c/code\u003e\u003c/a\u003e, become part of the official Rust organisation.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eis now officially a part of the wider Rust organization! 🎉\n\u003ca href=\"https://blog.rust-lang.org/2022/02/21/rust-analyzer-joins-rust-org.html\"\u003ehttps://blog.rust-lang.org/2022/02/21/rust-analyzer-joins-rust-org.html\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI guess this is going to mean good things for the development of\n\u003ccode\u003erust-analyzer\u003c/code\u003e in the future.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou can save a file in vim without any autocommands by using \u003ccode\u003e:noa w\u003c/code\u003e. I\nneeded this recently because I have certain filetypes auto-formatted upon\nsave, but I was saving some fixture data that I didn\u0026rsquo;t want formatted and this\ndid the job.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://stripe.com/docs/stripe-cli\"\u003e\u003ccode\u003estripe\u003c/code\u003e cli\u003c/a\u003e is really nice for testing webhooks from Stripe. Usually I lean\non \u003ccode\u003engrok\u003c/code\u003e to make my local development server accessible to the Internet.\n\u003ccode\u003estripe\u003c/code\u003e cli makes this unnecessary. You can listen for Stripe webhook events\non your local machine messing with any networking. You can also forward those\nevents onto a local development server using the \u003ccode\u003e--forward-to\u003c/code\u003e flag.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI haven\u0026rsquo;t felt very productive this week, due to factors. Anxiety, man.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI bought a new monitor arm so that I can raise my laptop up off the desk and\nalign it into a better position. I wasn\u0026rsquo;t really using the laptop screen,\nwhich I felt was a shame considering how nice is it compared to my main\nmonitor.\u003c/p\u003e\n\u003cp\u003eI got the \u003ca href=\"https://www.fully.com/accessories/jarvis-dual-monitor-arm.html\"\u003eFully Jarvis Dual Monitor Arm\u003c/a\u003e with laptop tray, in white. I\u0026rsquo;d\nheard good things about it, but after months of casually researching I\nsuddenly took the plunge because I was fed up of looking.\u003c/p\u003e",
      "date_published": "2022-02-27T00:00:00+00:00",
      "date_modified": "2022-02-27T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/34-build-and-test/",
      "url": "https://elver.me/weeknotes/34-build-and-test/",
      "title": "Weeknotes 34: Build and test",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI spent a couple of days trying (and SPOILER 🙈 eventually succeeding) to\ninstall a 3rd party dependency on Heroku this week. I\u0026rsquo;ve not had to do this\nbefore as most stuff I\u0026rsquo;ve worked on has had a fairly vanilla setup.\u003c/p\u003e\n\u003cp\u003eFirst attempt to install was via the \u003ca href=\"https://github.com/heroku/heroku-buildpack-apt\"\u003eheroku-apt-buildpack\u003c/a\u003e as packages were\navailable. This seemed to be the most straight-forward approach, but was\nquickly stymied by the fact that \u003ccode\u003eapt\u003c/code\u003e couldn\u0026rsquo;t download the public keys\nneeded to validate the packages 😢\u003c/p\u003e\n\u003cp\u003eSo I forked a custom buildpack from elsewhere and thought I was onto a winner\nuntil I realised that the buildpack included a statically built binary \u0026mdash; not\ngood as I couldn\u0026rsquo;t verify its authenticity. I decided to build my own static\nbinary so I could have control, but a C++ \u003ccode\u003ecmake\u003c/code\u003e headache ensued where a\nstatic binary refused to be static 😭\u003c/p\u003e\n\u003cp\u003eI ended up with a dynamically build binary installed via the custom buildpack\nwith its dependencies installed via \u003ccode\u003eheroku-apt-buildpack\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s not perfect, but it is done.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe default output from \u003ccode\u003ecargo test\u003c/code\u003e isn\u0026rsquo;t great imo. It\u0026rsquo;s a bit verbose for\nmy liking. It seems that \u003ca href=\"https://twitter.com/sunshowers6\"\u003erain\u003c/a\u003e thought the same and released \u003ca href=\"https://nexte.st\"\u003ecargo-nextest\u003c/a\u003e\nthis week. I\u0026rsquo;ve only used it very briefly but it looks great so far and much\nmore along the lines of other test runners I\u0026rsquo;ve used.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAnnouncing cargo-nextest: a new test runner for Rust projects! nextest has a\nbeautiful user interface, several new features, and is up 60% faster than\ncargo test.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ cargo nextest run\n    Finished test [unoptimized + debuginfo] target(s) in 0.08s\n    Starting 6 tests across 3 binaries\n        PASS [   0.039s]                   pushover_cli pushover::tests::invalid_user\n        PASS [   0.039s]                   pushover_cli pushover::tests::invalid_token\n        PASS [   0.039s]                   pushover_cli pushover::tests::five_hundred_error\n        PASS [   0.038s]                   pushover_cli pushover::tests::missing_message\n        PASS [   0.045s] pushover_cli::integration_test version_flag\n        PASS [   0.045s] pushover_cli::integration_test help_flag\n     Summary [   0.045s] 6 tests run: 6 passed, 0 skipped\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlong the same lines \u003ca href=\"https://twitter.com/mgattozzi\"\u003e@mgattozzi\u003c/a\u003e \u003ca href=\"https://twitter.com/mgattozzi/status/1493338010297028609\"\u003ereleased assay\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAnnouncing a new crate assay which is a super powered testing macro for\n@rustlang ! \u003ccode\u003easync\u003c/code\u003e test support, per test env vars, automatic temp\ndirectory, auto ? in tests, setup and tear down functions and more! You can\nread more about how to use it here:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI haven\u0026rsquo;t tried this yet, but I\u0026rsquo;m about to do some work involving ENV vars so\nthis is timely.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.askamanager.org/2022/01/the-new-hire-who-showed-up-is-not-the-same-person-we-interviewed.html\"\u003ethe new hire who showed up is not the same person we interviewed\u003c/a\u003e via \u003ca href=\"https://twitter.com/simonw/status/1493461021771517960\"\u003e@simonw\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eApparently this is a thing that\u0026rsquo;s happening? 🤔\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"https://www.meetup.com/south-west-ruby/\"\u003eSouth West Ruby\u003c/a\u003e meetup was back this week! I haven\u0026rsquo;t been to any sort of\nmeetup in a long time for obvious reasons, and I had to push myself to go to\nthis. I\u0026rsquo;m anxious at the best of times, and not being around large groups of\npeople for a while has only made that worse. I\u0026rsquo;m really glad I went though!\u003c/p\u003e\n\u003cp\u003eThere was a really interesting talk by \u003ca href=\"https://twitter.com/bruckmayer\"\u003eChristian Buckmayer\u003c/a\u003e from Shopify who\nworks on their CI - \u0026ldquo;Keeping Developers Happy With A Fast CI\u0026rdquo;. It wasn\u0026rsquo;t\nrecorded but Christian also \u003ca href=\"https://www.youtube.com/watch?v=WzKzqdpCAx4\u0026amp;list=PLbHJudTY1K0f0oMhWtY-UyzOb7tUlaHps\u0026amp;index=43\"\u003egave this talk at Rubyconf 2021\u003c/a\u003e if you want to\nwatch it.\u003c/p\u003e\n\u003cp\u003eIt was lovely to catch up with people I hadn\u0026rsquo;t seen in ages.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://zachholman.com/posts/kobayashi-maru-of-comparing-dates-with-times\"\u003eThe Kobayashi Maru of Comparing Dates with Times\u003c/a\u003e by Zach Holman\u003c/p\u003e\n\u003cp\u003eDon\u0026rsquo;t let anyone tell you that date maths is easy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m really keen to starting using the latest Ruby 3.1 so I can take advantage\nof this \u003ca href=\"https://blog.saeloun.com/2022/02/16/ruby-3.1-adds-error-highlighting.html\"\u003eerror highlighting gem\u003c/a\u003e. I can\u0026rsquo;t help but feel like someone has taken\na look at the error messages from Rust and tried to bring a tiny part of it\nto Ruby 🙂\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003etest.rb:9:in `user_name': undefined method `[]' for nil:NilClass (NoMethodError)\n\n    data[:result].first[:first_name]\n                       ^^^^^^^^^^^^^\n    from test.rb:14:in `\u0026lt;main\u0026gt;'\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eJohn Siracusa making a lot of sense as usual in \u003ca href=\"https://hypercritical.co/2022/02/15/streaming-apps\"\u003eAn Unsolicited Streaming App\nSpec\u003c/a\u003e and the follow up \u003ca href=\"https://hypercritical.co/2022/02/17/streaming-app-sentiments\"\u003eStreaming App Sentiments\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI don’t think any engagement-related metric is worth angering users in this\nway—even if it really does help users discover new content or stay\nsubscribed longer. I’m reminded of the old saying, “People won’t remember\nwhat you said, but they will remember how you made them feel.” It applies to\napps as well as people.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe incentives for product managers within companies are often in direct\nopposition to what a user wants from an app. Do you get a promotion/pay rise\nfor driving up \u0026ldquo;engagement\u0026rdquo; by 20%, or for making users happy?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve enjoyed two new TV series this week: 1) \u003ca href=\"https://www.imdb.com/title/tt16352098/\"\u003eThe Curse\u003c/a\u003e is really great with\n\u003ca href=\"https://twitter.com/BigTomD\"\u003eTom Davis\u003c/a\u003e as Mick a stand-out for me; 2) \u003ca href=\"https://www.imdb.com/title/tt8681148/\"\u003eThis Is Going To Hurt\u003c/a\u003e is a really\nwell done adaption of the book.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI spent a couple of days trying (and SPOILER 🙈 eventually succeeding) to\ninstall a 3rd party dependency on Heroku this week. I\u0026rsquo;ve not had to do this\nbefore as most stuff I\u0026rsquo;ve worked on has had a fairly vanilla setup.\u003c/p\u003e\n\u003cp\u003eFirst attempt to install was via the \u003ca href=\"https://github.com/heroku/heroku-buildpack-apt\"\u003eheroku-apt-buildpack\u003c/a\u003e as packages were\navailable. This seemed to be the most straight-forward approach, but was\nquickly stymied by the fact that \u003ccode\u003eapt\u003c/code\u003e couldn\u0026rsquo;t download the public keys\nneeded to validate the packages 😢\u003c/p\u003e",
      "date_published": "2022-02-20T00:00:00+00:00",
      "date_modified": "2022-02-20T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/33-testing-rust/",
      "url": "https://elver.me/weeknotes/33-testing-rust/",
      "title": "Weeknotes 33: Testing Rust",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLast week I wondered if \u003ca href=\"https://gohugo.io/\"\u003eHugo\u003c/a\u003e did anything to handle em dashes. I\u0026rsquo;ve been\nwondering for a while if and when I should be using them, so I investigated.\u003c/p\u003e\n\u003cp\u003eHugo uses the \u003ca href=\"https://github.com/yuin/goldmark/\"\u003eGoldmark\u003c/a\u003e Markdown processor by default, which \u003ca href=\"https://github.com/yuin/goldmark/#typographer-extension\"\u003e\u003cem\u003eautomatically\u003c/em\u003e\nconverts\u003c/a\u003e \u003ccode\u003e--\u003c/code\u003e to an \u003ca href=\"https://en.wikipedia.org/wiki/Dash#En_dash\"\u003eEn dash\u003c/a\u003e, and \u003ccode\u003e---\u003c/code\u003e to an \u003ca href=\"https://en.wikipedia.org/wiki/Dash#Em_dash\"\u003eEm dash\u003c/a\u003e which means there is\nnothing to do other than start using double or triple dashes when writing\nMarkdown 🙌\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe amount of time it takes WhatsApp to start on my MacBook Air M1 is\nhilarious. We can probably blame \u003ca href=\"https://www.electronjs.org\"\u003eElectron\u003c/a\u003e in some capacity \u0026lt;/s\u0026gt;, but in the\nmeantime I\u0026rsquo;m going to try the web version.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI ran this site through \u003ca href=\"https://developers.google.com/web/tools/lighthouse\"\u003eGoogle\u0026rsquo;s Lighthouse\u003c/a\u003e tool in Chrome. It scored pretty\nwell but did throw up a couple of issues. In particular, there was an\naccessibility related change I could make to ensure heading tags were in the\ncorrect source order. That is a worthwhile change to make.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not convinced that all the rules make sense, so I\u0026rsquo;m not taking all the\nsuggestions verbatim. It can easily become \u003ca href=\"https://en.wikipedia.org/wiki/Cargo_cult_programming\"\u003ecargo culting\u003c/a\u003e without any real\nbenefit.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMy \u003ca href=\"/weeknotes/32-what-a-pushover/\"\u003eRust project\u003c/a\u003e is coming along. I already had some integration tests in-place\n(written last week using a nice library  called \u003ca href=\"https://crates.io/crates/assert_cmd\"\u003e\u003ccode\u003eassert_cmd\u003c/code\u003e\u003c/a\u003e) and this week\nI turned my attention to unit tests.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;d written some code that performs requests against a JSON API and felt it\nreally needed testing. I was \u003cem\u003enot\u003c/em\u003e looking forward to this as I had imagined\nthat mocking the network requests would be difficult. Fortunately, I found a\nnice library called \u003ca href=\"https://crates.io/crates/wiremock\"\u003ewiremock\u003c/a\u003e which made it fairly easy. It works by starting\na separate process for each test and stubbing out the responses. This would\nnot be viable in Ruby, but works well here.\u003c/p\u003e\n\u003cp\u003eTesting the code did require some minor changes so I could pass in the URL of\nthe test server started by \u003ccode\u003ewiremock\u003c/code\u003e. But like \u003cem\u003emost\u003c/em\u003e changes required for\ntesting, it made the code better \u0026mdash; less coupling, fewer responsibilities.\u003c/p\u003e\n\u003cp\u003eInterestingly, it seems the standard Rust way to add unit tests is to put them\nalongside the code itself, in the same file. On the one hand I like this a lot\nbecause you don\u0026rsquo;t have to constantly switch files to see what you\u0026rsquo;re testing,\non the other, I wonder just how long my files are going to get if everything\nis in one file?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI used \u003ca href=\"https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-destroy_by\"\u003e\u003ccode\u003eActiveRecord::Relation#destroy_by\u003c/code\u003e\u003c/a\u003e this week for the first time.\nIt\u0026rsquo;s a nice shorthand for \u003ccode\u003erelation.where(condition).destroy_all\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eI often find myself not knowing about the latest features in Rails, but these\nthings are just a Google away most of the time so I don\u0026rsquo;t suppose it matters.\u003c/p\u003e\n\u003cp\u003eSaying that, I do now subscribe to \u003ca href=\"https://world.hey.com/this.week.in.rails\"\u003eThis Week in Rails\u003c/a\u003e in order to have some\nvisibility of what new stuff is coming to the framework.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://pauljuliusmartinez.github.io/\"\u003ejless\u003c/a\u003e seems cool \u0026mdash; a command-line JSON viewer.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eJLess is a command-line JSON viewer designed for reading, exploring, and\nsearching through JSON data.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI usually use \u003ca href=\"https://stedolan.github.io/jq/\"\u003e\u003ccode\u003ejq\u003c/code\u003e\u003c/a\u003e in it\u0026rsquo;s most basic form, \u003ccode\u003ejq .\u003c/code\u003e , for things like this,\nbut whilst is does a great job of formatting, highlighting, and displaying the\nJSON it doesn\u0026rsquo;t let you interactively navigate around. Sometimes figuring out\nthe shape of the data is what I\u0026rsquo;m looking for.\u003c/p\u003e\n\u003cp\u003eI hope to remember I have installed \u003ccode\u003ejless\u003c/code\u003e when the next use-case pops up 😬\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLast week I wondered if \u003ca href=\"https://gohugo.io/\"\u003eHugo\u003c/a\u003e did anything to handle em dashes. I\u0026rsquo;ve been\nwondering for a while if and when I should be using them, so I investigated.\u003c/p\u003e\n\u003cp\u003eHugo uses the \u003ca href=\"https://github.com/yuin/goldmark/\"\u003eGoldmark\u003c/a\u003e Markdown processor by default, which \u003ca href=\"https://github.com/yuin/goldmark/#typographer-extension\"\u003e\u003cem\u003eautomatically\u003c/em\u003e\nconverts\u003c/a\u003e \u003ccode\u003e--\u003c/code\u003e to an \u003ca href=\"https://en.wikipedia.org/wiki/Dash#En_dash\"\u003eEn dash\u003c/a\u003e, and \u003ccode\u003e---\u003c/code\u003e to an \u003ca href=\"https://en.wikipedia.org/wiki/Dash#Em_dash\"\u003eEm dash\u003c/a\u003e which means there is\nnothing to do other than start using double or triple dashes when writing\nMarkdown 🙌\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe amount of time it takes WhatsApp to start on my MacBook Air M1 is\nhilarious. We can probably blame \u003ca href=\"https://www.electronjs.org\"\u003eElectron\u003c/a\u003e in some capacity \u0026lt;/s\u0026gt;, but in the\nmeantime I\u0026rsquo;m going to try the web version.\u003c/p\u003e",
      "date_published": "2022-02-13T00:00:00+00:00",
      "date_modified": "2022-02-13T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/32-what-a-pushover/",
      "url": "https://elver.me/weeknotes/32-what-a-pushover/",
      "title": "Weeknotes 32: What, a Pushover?",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI \u003ca href=\"/weeknotes/31-super-fly-culture/\"\u003erecommended TRex recently\u003c/a\u003e for OCRing on-screen text. I also \u003ca href=\"/weeknotes/31-super-fly-culture/\"\u003erecommended\nCleanShot X\u003c/a\u003e for all your screenshot needs. Well, CleanShot now has support\nfor capturing text via OCR, so I only need CleanShot now - one less thing in\nthe menubar.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/31-super-fly-culture/\"\u003eSpeaking of\u003c/a\u003e \u003ca href=\"https://fly.io\"\u003eFly\u003c/a\u003e, I\u0026rsquo;m currently working on a side project using Elixir and\nPhoenix and needed somewhere to deploy it. I\u0026rsquo;d been hearing good things about\nthem for a while so decided to give it a try. They also recently announced\nthat they would \u003ca href=\"https://fly.io/blog/free-postgres/\"\u003estart offering free Postgres\u003c/a\u003e which certainly doesn\u0026rsquo;t hurt.\u003c/p\u003e\n\u003cp\u003eThe deployment process was really good overall.\u003c/p\u003e\n\u003cp\u003eI had trouble with \u003ca href=\"https://www.npmjs.com/package/node-sass\"\u003e\u003ccode\u003enode-sass\u003c/code\u003e\u003c/a\u003e (as everyone on the Internet does) so I moved\nto \u003ca href=\"https://www.npmjs.com/package/sass\"\u003e\u003ccode\u003edart-sass\u003c/code\u003e\u003c/a\u003e instead which is doesn\u0026rsquo;t require compiling anything to work.\nThis wasn\u0026rsquo;t Fly\u0026rsquo;s fault, I\u0026rsquo;ve had problems with \u003ccode\u003enode-sass\u003c/code\u003e many times.\u003c/p\u003e\n\u003cp\u003eOnce I got the app fully deployed I encountered a more serious issue with the\nVM running out of memory.\u003c/p\u003e\n\u003cp\u003eI connected to the VM using \u003ccode\u003efly ssh console\u003c/code\u003e and then started an \u003ccode\u003eiex\u003c/code\u003e\nsession so that I could create some test users in the database. Whenever I did\nso \u003ccode\u003eiex\u003c/code\u003e would get killed - very strange. Later I realised that the BEAM would\nget killed whenever I logged in via the web too. What is common between these\ntwo actions? Password hashing!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://community.fly.io/t/out-of-memory-on-elixir-phoenix-app-when-connecting-iex-session/3852/3\"\u003eI posted on Fly\u0026rsquo;s community forum for help\u003c/a\u003e, and Chris McCord himself replied\nbut it wasn\u0026rsquo;t clear what was happening. I later found the solution on the\n\u003ca href=\"https://elixirforum.com/t/staging-environment-how-to-debug-out-of-memory-errors-in-production-on-fly-io/42763/7\"\u003eElixir Forum\u003c/a\u003e. Turns out that \u003ca href=\"https://en.wikipedia.org/wiki/Argon2\"\u003eArgon2\u003c/a\u003e is very memory expensive by default.\nSo every time I was hashing a password it would use a lot of memory and bloat\nthe process pushing it over the allowed limits.\u003c/p\u003e\n\u003cp\u003eSome configuration and all it now well.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e# config/prod.exs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e# Set cost of password hashing complexity to use less memory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econfig \u003cspan style=\"color:#990073\"\u003e:argon2_elixir\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003et_cost\u003c/span\u003e: \u003cspan style=\"color:#099\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003em_cost\u003c/span\u003e: \u003cspan style=\"color:#099\"\u003e15\u003c/span\u003e \u003cspan style=\"color:#998;font-style:italic\"\u003e# ~60ms\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFly has been really good so far in my limited experience.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://devcenter.heroku.com/articles/nodejs-support#specifying-a-node-js-version\"\u003ePin your Node version in \u003ccode\u003epackage.json\u003c/code\u003e\u003c/a\u003e, especially when deploying to Heroku,\nin case, hypothetically, \u003ca href=\"https://devcenter.heroku.com/changelog-items/2349\"\u003ethey bump the Node version\u003c/a\u003e and your build fails and\nyou can\u0026rsquo;t deploy to production. Hypothetically.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA colleague was debugging a Heroku build issue and put together a quick\n\u003ccode\u003eDockerfile\u003c/code\u003e using the base image supplied by Heroku. It hadn\u0026rsquo;t occurred to me\nthat \u003ca href=\"https://devcenter.heroku.com/articles/heroku-18-stack#heroku-18-docker-image\"\u003eHeroku Stacks were available as Docker images\u003c/a\u003e. Pushing to Heroku over\nand over to diagnose an issue gets old fast so this approach is welcome.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://incident.io/blog/no-capes?utm_source=pocket_mylist\"\u003eNo capes: the perils of being a hero-engineer\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewhen you show up to a new job where there’s a hero (or group of heroes)\njumping in to fix things constantly, it’s frustratingly slow to understand how\neverything fits together from the outside. There’s hints dropped in Slack and\nbreadcrumbs in pull requests but all the discussion has happened in a private\nchat elsewhere.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI\u0026rsquo;ve experienced this. It made me feel like I couldn\u0026rsquo;t contribute because the\nhero always got there first - not a healthy culture. And what happens when\nyour hero leaves?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://nikodunk.com/a-node-js-developer-discovers-rails/\"\u003eAn interesting take on a JavaScript programmer coming to Rails\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;coming from the current Javascript ecosystem makes discovering Rails a revelation\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://daringfireball.net/linked/2022/02/03/facebook-tanks\"\u003elol\u003c/a\u003e 😆\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFacebook’s stock stayed down all day, wiping $200 billion in value from the\ncompany’s market cap — the biggest one-day drop in market value ever.\nCouldn’t happen to a nicer company.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/24-force-pushing-rust/\"\u003eRust returns!\u003c/a\u003e Again. I\u0026rsquo;ve picked a project to implement in Rust now.\nSomething small enough in scope that it doesn\u0026rsquo;t overwhelm, but significant\nenough to not be a complete toy.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m writing a command line app to send notifications using the \u003ca href=\"https://pushover.net\"\u003ePushover\u003c/a\u003e\n\u003ca href=\"https://pushover.net/api\"\u003eAPI\u003c/a\u003e, something that I\u0026rsquo;m sure already exists, but that I personally have a\nrequirement for, which is a nice way to scratch my own itch.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve got something that works already, which is great, but there is a lot of\ntidy up, and many improvements to be made.\u003c/p\u003e\n\u003cp\u003eLearning new languages means more than just syntax. You also have to acquaint\nyourself with how the community operates, the idioms of the language, the\napproach to testing \u0026mdash; myriad topics.\u003c/p\u003e\n\u003cp\u003eOne of those topics is error handling. Rust\u0026rsquo;s error handling is, from what I\nunderstand, one of it\u0026rsquo;s unique features, but very different to what I\u0026rsquo;m used\nto. \u003ca href=\"https://www.sheshbabu.com/posts/rust-error-handling/\"\u003eThis article\u003c/a\u003e was very helpful during the learning process.\u003c/p\u003e\n\u003cp\u003eI need to remember that Rust is a big language with many ideas completely\nforeign to me, and I don\u0026rsquo;t need to know it all \u003cem\u003eright now\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eLike lots of Rust features, it\u0026rsquo;s error handling approach makes me feel\nconfident that the program I\u0026rsquo;m writing will work at \u003cem\u003eruntime\u003c/em\u003e. Ruby has lots\nof great qualities, but \u003cem\u003ethat\u003c/em\u003e is not one of them for me.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI \u003ca href=\"/weeknotes/31-super-fly-culture/\"\u003erecommended TRex recently\u003c/a\u003e for OCRing on-screen text. I also \u003ca href=\"/weeknotes/31-super-fly-culture/\"\u003erecommended\nCleanShot X\u003c/a\u003e for all your screenshot needs. Well, CleanShot now has support\nfor capturing text via OCR, so I only need CleanShot now - one less thing in\nthe menubar.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/31-super-fly-culture/\"\u003eSpeaking of\u003c/a\u003e \u003ca href=\"https://fly.io\"\u003eFly\u003c/a\u003e, I\u0026rsquo;m currently working on a side project using Elixir and\nPhoenix and needed somewhere to deploy it. I\u0026rsquo;d been hearing good things about\nthem for a while so decided to give it a try. They also recently announced\nthat they would \u003ca href=\"https://fly.io/blog/free-postgres/\"\u003estart offering free Postgres\u003c/a\u003e which certainly doesn\u0026rsquo;t hurt.\u003c/p\u003e",
      "date_published": "2022-02-06T00:00:00+00:00",
      "date_modified": "2022-02-06T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/31-super-fly-culture/",
      "url": "https://elver.me/weeknotes/31-super-fly-culture/",
      "title": "Weeknotes 31: Super Fly culture",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIn last week\u0026rsquo;s weeknote entry I had some code examples with long lines, so I\nneeded to make them more legible. Some \u003ccode\u003eoverflow: hidden\u003c/code\u003e and a bit of padding\ndid the job, but whilst in a CSS mood I had a think about quotations, and\nspecifically \u003ccode\u003e\u0026lt;blockquote\u0026gt;\u003c/code\u003e. \u0026ldquo;Can I add quotation marks automatically?\u0026rdquo;, I\nthought.\u003c/p\u003e\n\u003cp\u003eThe venerable \u003ca href=\"https://css-tricks.com/quoting-in-html-quotations-citations-and-blockquotes/\"\u003eCSS Tricks\u003c/a\u003e comes to the rescue, as usual. And, yes. Yes you\ncan. In Safari you can even have fancy hanging quotes with the\n\u003ca href=\"https://caniuse.com/css-hanging-punctuation\"\u003e\u003ccode\u003ehanging-punctuation\u003c/code\u003e\u003c/a\u003e property.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI upgraded an Elixir Phoenix app to 1.6 this week. No matter the language, or\nframework, dependencies are always a problem. And this was no different. After\nfollowing \u003ca href=\"https://gist.github.com/chrismccord/2ab350f154235ad4a4d0f4de6decba7b\"\u003ethe upgrade guide\u003c/a\u003e and failing, I decided to generate a new fresh\napp and compare the \u003ccode\u003emix.exs\u003c/code\u003e of old and new. That got me moving in the end,\nand the rest was a simple undertaking.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eContinuing my interest in the work of \u003ca href=\"/weeknotes/21-totally-dope/\"\u003ePatrick Radden Keefe\u003c/a\u003e led me to the\n\u003ca href=\"https://crooked.com/podcast-series/wind-of-change/\"\u003eWind of Change podcast series\u003c/a\u003e, which I\u0026rsquo;ve now finished. It was a fun ride.\nRecommended.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e🚨 GITHUB TIP! 🚨 When putting a GitHub PR together I usually pre-review it\nmyself adding notes for reviewers and explaining decisions which couldn\u0026rsquo;t be\nexpressed in the code itself. If the PR is long I tend to use the \u0026ldquo;Viewed\u0026rdquo;\ncheckbox in the GitHub interface to methodically go through each file. It\nhelps me keep track.\u003c/p\u003e\n\u003cp\u003eThat\u0026rsquo;s all well and good until you want to see contents of all the files\nagain. Unchecking the \u0026ldquo;Viewed\u0026rdquo; checkbox next to each file is \u003cem\u003enot\u003c/em\u003e a fun\nexperience.\u003c/p\u003e\n\u003cp\u003eWell, turns out if you alt + click on the downwards facing chevron next to\neach file it OPENS ALL THE FILES IN ONE GO! I\u0026rsquo;m would never have found this\nout if it weren\u0026rsquo;t for \u003ca href=\"https://github.com/refined-github/refined-github/issues/2865#issuecomment-595767171\"\u003ethis issue\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEveryone should get \u003ca href=\"https://cleanshot.com\"\u003eCleanShot X\u003c/a\u003e. What. A. Great. App. The ability to take a\nscreenshot, easily annotate it, and share, cannot be overstated.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFly\u0026rsquo;s \u003ca href=\"https://fly.io/blog/docker-without-docker/\"\u003e\u0026ldquo;Docker without Docker\u0026rdquo;\u003c/a\u003e blog post is a very interesting read about how\ntheir \u0026ldquo;Docker\u0026rdquo; architecture works. TLDR; they don\u0026rsquo;t run your Docker image,\nthey transmogrify it into a Firecracker VM which runs natively.\u003c/p\u003e\n\u003cp\u003eThis made me laugh:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eYou’re likely of one of two mindsets about this: (1) that it’s extremely\nUnixy and thus excellent, or (2) that it’s extremely Unixy and thus\nhorrifying.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been enjoying the \u003ca href=\"https://anchor.fm/jamie-loftus\"\u003eMy Year in Mensa\u003c/a\u003e by podcast series by \u003ca href=\"https://en.wikipedia.org/wiki/Jamie_Loftus\"\u003eJamie Loftus\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIn last week\u0026rsquo;s weeknote entry I had some code examples with long lines, so I\nneeded to make them more legible. Some \u003ccode\u003eoverflow: hidden\u003c/code\u003e and a bit of padding\ndid the job, but whilst in a CSS mood I had a think about quotations, and\nspecifically \u003ccode\u003e\u0026lt;blockquote\u0026gt;\u003c/code\u003e. \u0026ldquo;Can I add quotation marks automatically?\u0026rdquo;, I\nthought.\u003c/p\u003e\n\u003cp\u003eThe venerable \u003ca href=\"https://css-tricks.com/quoting-in-html-quotations-citations-and-blockquotes/\"\u003eCSS Tricks\u003c/a\u003e comes to the rescue, as usual. And, yes. Yes you\ncan. In Safari you can even have fancy hanging quotes with the\n\u003ca href=\"https://caniuse.com/css-hanging-punctuation\"\u003e\u003ccode\u003ehanging-punctuation\u003c/code\u003e\u003c/a\u003e property.\u003c/p\u003e",
      "date_published": "2022-01-30T00:00:00+00:00",
      "date_modified": "2022-01-30T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/30-quality-of-life-improvement/",
      "url": "https://elver.me/weeknotes/30-quality-of-life-improvement/",
      "title": "Weeknotes 30: Quality of life improvement",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI discovered recently that \u003ca href=\"https://ruby-doc.org/core-2.5.0/Struct.html\"\u003eRuby\u0026rsquo;s Struct\u003c/a\u003e has a \u003ccode\u003ekeyword_init\u003c/code\u003e option which\nwas introduced in version 2.5. It makes using Structs much more pleasant not\nhaving to rely on the positional arguments\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eBuild\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eStruct\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enew(\u003cspan style=\"color:#990073\"\u003e:built_on\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:slug_id\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003ekeyword_init\u003c/span\u003e: \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eBuild\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enew(\u003cspan style=\"color:#990073\"\u003ebuild_on\u003c/span\u003e: now, \u003cspan style=\"color:#990073\"\u003eslug_id\u003c/span\u003e: \u003cspan style=\"color:#099\"\u003e123\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn other Ruby news, \u003ca href=\"https://www.ruby-lang.org/en/news/2021/12/25/ruby-3-1-0-released/\"\u003erecently released 3.1\u003c/a\u003e has some very nice quality of life\nimprovements with IRB now supporting suggestions/completions with the\nintroduction of a new readline compatible library called \u003ca href=\"https://github.com/ruby/reline\"\u003ereline\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eRuby has been lagging behind in good developer tooling. This has become more\napparent to me after using Elixir and Rust, both of which put a lot of effort\ninto it. These changes are very welcome 👏\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wondered this which gems had native extensions and a quick Google and \u003ca href=\"https://stackoverflow.com/a/32567708/120615\"\u003eStack\nOverflow\u003c/a\u003e later this one liner told me:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ebundle show --paths | ruby -e \u0026quot;STDIN.each_line {|dep| puts dep.split('/').last if File.directory?(File.join(dep.chomp, 'ext')) }\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eUseful in the context of Apple\u0026rsquo;s new silicon future.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been dipping my toe back into JavaScript/TypeScript and this week I\ndiscovered the \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/API/console/dir\"\u003econsole.dir\u003c/a\u003e and \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/API/console/table\"\u003econsole.table\u003c/a\u003e methods for logging to the\nconsole in a more structure way.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTurns out you can have \u003ca href=\"https://vimtricks.com/p/highlight-syntax-inside-markdown/\"\u003esyntax highlighting in Markdown fenced code blocks in Vim\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-vim\" data-lang=\"vim\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u0026#34; Configure languages so we get syntax highlighting in Markdown files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003elet\u003c/span\u003e g:markdown_fenced_languages = [\u003cspan style=\"color:#d14\"\u003e\u0026#39;bash\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;elixir\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;fish\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;html\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;javascript\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;ruby\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;rust\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;typescript\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;vim\u0026#39;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI found this nice utility called \u003ca href=\"https://github.com/amebalabs/TRex\"\u003eTRex\u003c/a\u003e which sits in the menubar on macOS\nand allows you to capture text from anywhere on the screen using OCR.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTRex captures any text right into your Clipboard with magic of OCR.\nBut what is OCR anyway? Imagine you have a PDF file or a Web page where\nyou can\u0026rsquo;t select the text, image with text on it, or even a YouTube video.\nForget retyping it manually; with TRex, you can extract text from\nanywhere, and it is as easy as taking a screenshot.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eFrom memory, I think Apple released some OCR related APIs fairly recently. I\nwonder if that\u0026rsquo;s what is used here. It does a single thing really well. I\nthink it could become very useful to me.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI discovered recently that \u003ca href=\"https://ruby-doc.org/core-2.5.0/Struct.html\"\u003eRuby\u0026rsquo;s Struct\u003c/a\u003e has a \u003ccode\u003ekeyword_init\u003c/code\u003e option which\nwas introduced in version 2.5. It makes using Structs much more pleasant not\nhaving to rely on the positional arguments\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eBuild\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eStruct\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enew(\u003cspan style=\"color:#990073\"\u003e:built_on\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:slug_id\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003ekeyword_init\u003c/span\u003e: \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eBuild\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enew(\u003cspan style=\"color:#990073\"\u003ebuild_on\u003c/span\u003e: now, \u003cspan style=\"color:#990073\"\u003eslug_id\u003c/span\u003e: \u003cspan style=\"color:#099\"\u003e123\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIn other Ruby news, \u003ca href=\"https://www.ruby-lang.org/en/news/2021/12/25/ruby-3-1-0-released/\"\u003erecently released 3.1\u003c/a\u003e has some very nice quality of life\nimprovements with IRB now supporting suggestions/completions with the\nintroduction of a new readline compatible library called \u003ca href=\"https://github.com/ruby/reline\"\u003ereline\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eRuby has been lagging behind in good developer tooling. This has become more\napparent to me after using Elixir and Rust, both of which put a lot of effort\ninto it. These changes are very welcome 👏\u003c/p\u003e",
      "date_published": "2022-01-23T00:00:00+00:00",
      "date_modified": "2022-01-23T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/29-folding-navigating-serializing/",
      "url": "https://elver.me/weeknotes/29-folding-navigating-serializing/",
      "title": "Weeknotes 29: Folding, navigating, serializing",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve never got my head around folding in Vim (in fact, I haven\u0026rsquo;t gotten my\nhead around a lot of things in Vim!) but I really should. In particular I have\ninstalled a plugin to allow Vim to \u003ca href=\"https://github.com/rlue/vim-fold-rspec\"\u003efold RSpec spec files\u003c/a\u003e, which often get long\nand unruly.\u003c/p\u003e\n\u003cp\u003eStill getting the hang of the keybindings.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://youtu.be/NYj3DnI81AQ?t=301\"\u003eTom Scott agrees with me\u003c/a\u003e about wireless headphones. This makes me very happy.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI still think wireless headphones are a terrible idea\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eYes, Tom ✅\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf you want to access Rails url helpers inside a \u003ca href=\"https://github.com/jsonapi-serializer/jsonapi-serializer\"\u003eJSON:API serializer\u003c/a\u003e you\ncan\u0026rsquo;t do the usual mixin include as everything inside a JSON:API serializer is\nevaluated at a class level.\u003c/p\u003e\n\u003cp\u003eInstead include into the class.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eUserSerializer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  singleton_class\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003einclude \u003cspan style=\"color:#008080\"\u003eRails\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eapplication\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eroutes\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eurl_helpers\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eReference: \u003ca href=\"https://github.com/jsonapi-serializer/jsonapi-serializer/issues/157\"\u003ehttps://github.com/jsonapi-serializer/jsonapi-serializer/issues/157\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI read \u003ca href=\"https://moxie.org/2022/01/07/web3-first-impressions.html\"\u003eMy first impressions of web3\u003c/a\u003e this week and there was a lot I didn\u0026rsquo;t\nunderstand. Still, this made me laugh:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAt this point, software projects require an enormous amount of human effort.\nEven relatively simple apps require a group of people to sit in front of a\ncomputer for eight hours a day, every day, forever.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://vector-logic.com/blog/posts/losing-your-way-with-ruby-safe-navigation-operator\"\u003eLosing Your Way With Ruby Safe-Navigation Operator\u003c/a\u003e has some good points.\nI\u0026rsquo;ve seen liberal use of the safe navigation operator in codebases I\u0026rsquo;ve worked\non and people do seem to just throw it in without necessarily understanding\nthe ramifications. I\u0026rsquo;m using it more and more, but care is required.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve never got my head around folding in Vim (in fact, I haven\u0026rsquo;t gotten my\nhead around a lot of things in Vim!) but I really should. In particular I have\ninstalled a plugin to allow Vim to \u003ca href=\"https://github.com/rlue/vim-fold-rspec\"\u003efold RSpec spec files\u003c/a\u003e, which often get long\nand unruly.\u003c/p\u003e\n\u003cp\u003eStill getting the hang of the keybindings.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://youtu.be/NYj3DnI81AQ?t=301\"\u003eTom Scott agrees with me\u003c/a\u003e about wireless headphones. This makes me very happy.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI still think wireless headphones are a terrible idea\u003c/p\u003e",
      "date_published": "2022-01-16T00:00:00+00:00",
      "date_modified": "2022-01-16T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/28-first-week-back/",
      "url": "https://elver.me/weeknotes/28-first-week-back/",
      "title": "Weeknotes 28: First week back",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI saw \u003ca href=\"https://twitter.com/noelrap/status/1478479138587660292\"\u003eNoel Rappin\u003c/a\u003e asking about a utility he once used for called \u003ca href=\"https://github.com/thisredone/rb\"\u003e\u003ccode\u003erb\u003c/code\u003e\u003c/a\u003e.\nIt\u0026rsquo;s a nice idea - it allows you to more easily run Ruby code from the command\nline. As a Ruby programmer this is very tempting. I\u0026rsquo;ve installed it, but not\nsure if it will stick or not. A part of me things I should spend the time\nimproving my normal shell skills instead.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/24-force-pushing-rust/\"\u003eRust learning\u003c/a\u003e has taken a hit over the Christmas holidays so I\u0026rsquo;m trying to\nget back on it this week. I learnt about Rust Modules by watching \u003ca href=\"https://www.youtube.com/watch?v=969j0qnJGi8\"\u003ethis video\u003c/a\u003e\nfrom \u003ca href=\"https://www.youtube.com/channel/UCSp-OaMpsO8K0KkOqyBl7_w\"\u003eLet\u0026rsquo;s Get Rusty\u003c/a\u003e. The Rust module system is a bit weird compared to\nother languages but I like how explicit it feels.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe first week back after Christmas break has been a massive shock to my\nsystem after two weeks off. Before the break I really felt I needed some rest.\nI don\u0026rsquo;t \u003cem\u003efeel\u003c/em\u003e particularly rested unfortunately.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTenderlove wrote a nice account of how he has setup his new M1 using\n\u003ca href=\"https://tenderlovemaking.com/2022/01/07/homebrew-rosetta-and-ruby.html\"\u003eHomebrew, Rosetta, and Ruby\u003c/a\u003e. When I setup my Macbook Air M1 I (eventually,\nafter first fighting with many Rubygem-related issues) opted to run\neverything under Rosetta for ease, but if I were to setup everything again I\nwould try out his method of configuring the shell to switch between\narchitectures.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI saw \u003ca href=\"https://twitter.com/noelrap/status/1478479138587660292\"\u003eNoel Rappin\u003c/a\u003e asking about a utility he once used for called \u003ca href=\"https://github.com/thisredone/rb\"\u003e\u003ccode\u003erb\u003c/code\u003e\u003c/a\u003e.\nIt\u0026rsquo;s a nice idea - it allows you to more easily run Ruby code from the command\nline. As a Ruby programmer this is very tempting. I\u0026rsquo;ve installed it, but not\nsure if it will stick or not. A part of me things I should spend the time\nimproving my normal shell skills instead.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/24-force-pushing-rust/\"\u003eRust learning\u003c/a\u003e has taken a hit over the Christmas holidays so I\u0026rsquo;m trying to\nget back on it this week. I learnt about Rust Modules by watching \u003ca href=\"https://www.youtube.com/watch?v=969j0qnJGi8\"\u003ethis video\u003c/a\u003e\nfrom \u003ca href=\"https://www.youtube.com/channel/UCSp-OaMpsO8K0KkOqyBl7_w\"\u003eLet\u0026rsquo;s Get Rusty\u003c/a\u003e. The Rust module system is a bit weird compared to\nother languages but I like how explicit it feels.\u003c/p\u003e",
      "date_published": "2022-01-09T00:00:00+00:00",
      "date_modified": "2022-01-09T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/27-anti-content-producer/",
      "url": "https://elver.me/weeknotes/27-anti-content-producer/",
      "title": "Weeknotes 27: Anti-content producer",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe time off over Christmas has gone too fast. I\u0026rsquo;ve been desperate to be\nproductive over the time, making lists, and not ticking anything off them\u0026hellip;\nI had a several projects lined up to keep me busy over the festive period and\nI\u0026rsquo;ve done none.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.bbc.co.uk/programmes/m0012rhj\"\u003eRichard Osman was on Desert Island Discs\u003c/a\u003e. He spoke about his food addiction\nand it brought a tear to my eye. His comments couldn\u0026rsquo;t have rang any truer to\nme. You don\u0026rsquo;t need booze, or drugs, or cigarettes. But you do need food.\u003c/p\u003e\n\u003cp\u003eHe said he thinks that it will always be with him, and I think it\u0026rsquo;ll always be\nwith me too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTwenty Four. That\u0026rsquo;s how many books I read this year. It might not seem like a\nlot to some, but it\u0026rsquo;s a lot for me, and the most consistently I\u0026rsquo;ve read too. I\nplan to continue this trend in 2022. I\u0026rsquo;ve started a 36 book challenge on\nGoodreads.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWorks starts proper again on Tuesday 💩\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe time off over Christmas has gone too fast. I\u0026rsquo;ve been desperate to be\nproductive over the time, making lists, and not ticking anything off them\u0026hellip;\nI had a several projects lined up to keep me busy over the festive period and\nI\u0026rsquo;ve done none.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.bbc.co.uk/programmes/m0012rhj\"\u003eRichard Osman was on Desert Island Discs\u003c/a\u003e. He spoke about his food addiction\nand it brought a tear to my eye. His comments couldn\u0026rsquo;t have rang any truer to\nme. You don\u0026rsquo;t need booze, or drugs, or cigarettes. But you do need food.\u003c/p\u003e",
      "date_published": "2022-01-02T00:00:00+00:00",
      "date_modified": "2022-01-02T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/26-mistletoe-and-wine/",
      "url": "https://elver.me/weeknotes/26-mistletoe-and-wine/",
      "title": "Weeknotes 26: Mistletoe and Wine",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eChristmas again. It really did creep up on me this year. We had planned for it\nto be a quieter one. Usually we would go away but COVID made that\ndifficult/impossible this year (and last) so we were staying home.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUnfortunately A\u0026rsquo;s grandfather passed away on Christmas Eve. It was very sad,\nbut he\u0026rsquo;d had a good life and was surrounded by his family. Not a bad way to\ngo.\u003c/p\u003e\n\u003cp\u003eAs a result our Christmas plans changed, not for the worse, just different. We\nended up having Christmas with a lot of different family members which for me\nin particular was strange.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eChristmas again. It really did creep up on me this year. We had planned for it\nto be a quieter one. Usually we would go away but COVID made that\ndifficult/impossible this year (and last) so we were staying home.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUnfortunately A\u0026rsquo;s grandfather passed away on Christmas Eve. It was very sad,\nbut he\u0026rsquo;d had a good life and was surrounded by his family. Not a bad way to\ngo.\u003c/p\u003e",
      "date_published": "2021-12-26T00:00:00+00:00",
      "date_modified": "2021-12-26T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/25-colouring-in-and-vim-tabs/",
      "url": "https://elver.me/weeknotes/25-colouring-in-and-vim-tabs/",
      "title": "Weeknotes 25: Colouring in and Vim tabs",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m experimenting with using tabs in Vim having never used them before. The\ncommon advice I\u0026rsquo;ve seen always says that they are not \u0026ldquo;the Vim way\u0026rdquo;, whatever\nthat means. Which, now that I read it back, is weird.\u003c/p\u003e\n\u003cp\u003eI was looking for a way to keep a working notes file open whilst working in\nother splits and I found \u003ca href=\"https://vimtricks.com/p/quickly-access-project-notes/\"\u003ethis article\u003c/a\u003e that I bookmarked in Pocket ages ago.\nSeems to be working well at the moment.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTurns out \u003ca href=\"https://docs.cypress.io/api/utilities/_\"\u003eCypress includes Lodash by default\u003c/a\u003e, which is good news as it means\nnot having to re-invent the wheel every time you want to do something basic\nlike you usually do with JavaScript.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eJira. Urgh.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI don\u0026rsquo;t agree with all the points in \u003ca href=\"https://thoughtbot.com/blog/tailwind-and-the-femininity-of-css\"\u003eTailwind and the Femininity of CSS\u003c/a\u003e, but\nI do think they\u0026rsquo;re on to something regarding how CSS is viewed.\u003c/p\u003e\n\u003cp\u003eI remember overhearing a conversation at work years ago where the CSS work\nbeing done by a colleague was referred to as \u0026ldquo;colouring in\u0026rdquo; by a couple of\nbrogrammers on the team. Brogrammers who didn\u0026rsquo;t write CSS.\u003c/p\u003e\n\u003cp\u003eJeremy Keith quoted in the article also has a good point.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI think that’s what’s happened with some programmers coming to CSS for the\nfirst time. They’ve heard it’s simple, so they assume it’s easy. But then\nwhen they try to use it, it doesn’t work. It must be the fault of the\nlanguage\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter \u003ca href=\"/weeknotes/23-debugging-audio-processing-and-things-falling-apart/\"\u003ebragging about managing to get a \u003ccode\u003erebase --onto\u003c/code\u003e working correctly the\nfirst time recently\u003c/a\u003e I forgot the order of arguments this week.\u003c/p\u003e\n\u003cp\u003eFor posterity here is the format:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit rebase --onto \u0026lt;newparent\u0026gt; \u0026lt;oldparent\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003ca href=\"https://stackoverflow.com/a/39081674/120615\"\u003ehttps://stackoverflow.com/a/39081674/120615\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m experimenting with using tabs in Vim having never used them before. The\ncommon advice I\u0026rsquo;ve seen always says that they are not \u0026ldquo;the Vim way\u0026rdquo;, whatever\nthat means. Which, now that I read it back, is weird.\u003c/p\u003e\n\u003cp\u003eI was looking for a way to keep a working notes file open whilst working in\nother splits and I found \u003ca href=\"https://vimtricks.com/p/quickly-access-project-notes/\"\u003ethis article\u003c/a\u003e that I bookmarked in Pocket ages ago.\nSeems to be working well at the moment.\u003c/p\u003e",
      "date_published": "2021-12-19T00:00:00+00:00",
      "date_modified": "2021-12-19T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/24-force-pushing-rust/",
      "url": "https://elver.me/weeknotes/24-force-pushing-rust/",
      "title": "Weeknotes 24: Force pushing Rust",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAs someone who can\u0026rsquo;t hold a lot in my head at once, of course, I strongly\nagree with this.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026ldquo;I\u0026rsquo;ve stopped admiring very talented engineers who can hold a lot of\ncomplexity in their head and started admiring very talented engineers who\nhave moved a lot of complexity outside their head and into tools, and I like\nit much much better this way.\u0026rdquo;\n\u003ca href=\"https://twitter.com/fasterthanlime/status/1468739998505656327\"\u003ehttps://twitter.com/fasterthanlime/status/1468739998505656327\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI managed to snag a \u003ca href=\"https://warp.dev\"\u003eWarp\u003c/a\u003e invite code, which I\u0026rsquo;ve been keen to try out for a\nwhile. I\u0026rsquo;m not sure how I feel about yet. It doesn\u0026rsquo;t yet support my shell of\nchoice, \u003ca href=\"https://fishshell.com\"\u003eFish\u003c/a\u003e, so it\u0026rsquo;s hard to give it a proper try. It sure \u003cem\u003elooks\u003c/em\u003e slick.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was writing quite a few \u003ca href=\"https://www.cypress.io\"\u003eCypress\u003c/a\u003e tests this week and picked up a couple of tips.\u003c/p\u003e\n\u003cp\u003eFind an element based on the text it contains:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecy.get(\u003cspan style=\"color:#d14\"\u003e\u0026#39;some \u0026gt; selector\u0026#39;\u003c/span\u003e).invoke(\u003cspan style=\"color:#d14\"\u003e\u0026#39;text\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  .then((text)=\u0026gt;{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    expect(text).to.contain(\u003cspan style=\"color:#d14\"\u003e\u0026#39;I am text\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  })\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRun only the current \u003ccode\u003edescribe\u003c/code\u003e or \u003ccode\u003eit\u003c/code\u003e block using \u003ca href=\"https://docs.cypress.io/guides/core-concepts/writing-and-organizing-tests#Excluding-and-Including-Tests\"\u003e\u003ccode\u003e.only\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edescribe.only(\u003cspan style=\"color:#d14\"\u003e\u0026#39;a group of tests\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e () {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#998;font-style:italic\"\u003e// test body\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e})\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eit.only(\u003cspan style=\"color:#d14\"\u003e\u0026#39;does a thing\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e () {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#998;font-style:italic\"\u003e// test body\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e})\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother tip that I use all the time, this time for Git. Force pushing is\nnecessary if you rebase your branches a lot like I do. However, you can\noverwrite someone else\u0026rsquo;s commits if they have also pushed to the same branch.\u003c/p\u003e\n\u003cp\u003eThe generally accepted rule is to only force push to a branch that you alone\nuse, but life sometimes isn\u0026rsquo;t that straight forward, so in those cases where\nsomeone else could\u0026rsquo;ve pushed to your branch you can use \u003ca href=\"https://git-scm.com/docs/git-push#Documentation/git-push.txt---force-with-leaseltrefnamegt\"\u003e\u003ccode\u003e--force-with-lease\u003c/code\u003e\u003c/a\u003e\ninstead of \u003ccode\u003e--force\u003c/code\u003e and it will refuse to force push if someone else has\nalready pushed to it.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.rust-lang.org\"\u003eRust\u003c/a\u003e is back on the agenda! I\u0026rsquo;ve been looking at Rust for a few years now,\nmaybe more. I pick it up, get stuck, put it down. Anyway, I\u0026rsquo;m trying again.\nThis time starting with the \u003ca href=\"https://doc.rust-lang.org/book/\"\u003eRust Book\u003c/a\u003e. It\u0026rsquo;s a really good book.\u003c/p\u003e\n\u003cp\u003eRust is a complicated language for someone like me who\u0026rsquo;s mostly programmed in\ndynamic languages. It\u0026rsquo;s full of concepts and ideas that I\u0026rsquo;ve never heard of.\nAnd that\u0026rsquo;s part of what I like about it - it\u0026rsquo;s different. But that makes it\nchallenging.\u003c/p\u003e\n\u003cp\u003eRust stands alone as a language that could be really useful for me (The idea\nof writing a cli program in Ruby doesn\u0026rsquo;t appeal to me, but writing one in Rust\ncertainly does). However it also seems like it would be an good choice for\nwriting \u0026ldquo;extensions\u0026rdquo; to other languages. Ruby gems and Elixir NIFs can both be\nwritten in Rust.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m looking forward to some time off over Christmas! 🎄🎅\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAs someone who can\u0026rsquo;t hold a lot in my head at once, of course, I strongly\nagree with this.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026ldquo;I\u0026rsquo;ve stopped admiring very talented engineers who can hold a lot of\ncomplexity in their head and started admiring very talented engineers who\nhave moved a lot of complexity outside their head and into tools, and I like\nit much much better this way.\u0026rdquo;\n\u003ca href=\"https://twitter.com/fasterthanlime/status/1468739998505656327\"\u003ehttps://twitter.com/fasterthanlime/status/1468739998505656327\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI managed to snag a \u003ca href=\"https://warp.dev\"\u003eWarp\u003c/a\u003e invite code, which I\u0026rsquo;ve been keen to try out for a\nwhile. I\u0026rsquo;m not sure how I feel about yet. It doesn\u0026rsquo;t yet support my shell of\nchoice, \u003ca href=\"https://fishshell.com\"\u003eFish\u003c/a\u003e, so it\u0026rsquo;s hard to give it a proper try. It sure \u003cem\u003elooks\u003c/em\u003e slick.\u003c/p\u003e",
      "date_published": "2021-12-12T00:00:00+00:00",
      "date_modified": "2021-12-12T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/23-debugging-audio-processing-and-things-falling-apart/",
      "url": "https://elver.me/weeknotes/23-debugging-audio-processing-and-things-falling-apart/",
      "title": "Weeknotes 23: Debugging, audio processing, and things falling apart",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe current app I\u0026rsquo;m working on involves various audio processing.\nUnfortunately, I\u0026rsquo;ve not had much involvement with that side of things so far -\ntoo many others features to build and bugs to fix! I do find it really\ninteresting though so I\u0026rsquo;m starting to pick up some things.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI performed several \u003ca href=\"https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---ontoltnewbasegt\"\u003e\u003ccode\u003egit rebase --onto\u003c/code\u003e\u003c/a\u003e operations on the first try. A cause\nfor celebration as I usually get into an unholy mess.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSome spelunking into the \u003ca href=\"https://activeadmin.info\"\u003eActive Admin\u003c/a\u003e source code necessitated the use of\nRuby\u0026rsquo;s \u003ccode\u003e#source_location\u003c/code\u003e this week. When combined with \u003ccode\u003e#method\u003c/code\u003e it is\nextremely useful to help find where code is defined.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI started listening to \u003ca href=\"https://www.bbc.co.uk/sounds/series/m0011cpr\"\u003eThings Fell Apart by Jon Ronson\u003c/a\u003e. It\u0026rsquo;s really good.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was doing a lot of debugging this week that necessitated restarting the\nRails server over and over. This project uses \u003ca href=\"https://github.com/puma/puma-dev\"\u003e\u003ccode\u003epuma-dev\u003c/code\u003e\u003c/a\u003e which means running\n\u003ccode\u003etouch tmp/restart.txt\u003c/code\u003e to tell it to restart. This soon got tedious so I went\nGoogling for a way to do this inside of vim.\u003c/p\u003e\n\u003cp\u003eI \u003ca href=\"http://joncairns.com/2012/11/restarting-thin-or-passenger-rails-server-from-vim/\"\u003ecame across this article from 2012\u003c/a\u003e which had the solution. Some slight\ntweaking and a new key bind in my config and I was away. I can now press\n\u003ccode\u003e\u0026lt;leader\u0026gt; rr\u003c/code\u003e to restart Rails from within Vim.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNick Cave being great, again.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe all have regrets and, as bad as they may feel, they are signals of our\ngrowth as human beings. A person with no regrets is simply leading an\nunexamined life.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://www.theredhandfiles.com/i-just-cant-forgive-myself/\"\u003ehttps://www.theredhandfiles.com/i-just-cant-forgive-myself/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe current app I\u0026rsquo;m working on involves various audio processing.\nUnfortunately, I\u0026rsquo;ve not had much involvement with that side of things so far -\ntoo many others features to build and bugs to fix! I do find it really\ninteresting though so I\u0026rsquo;m starting to pick up some things.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI performed several \u003ca href=\"https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---ontoltnewbasegt\"\u003e\u003ccode\u003egit rebase --onto\u003c/code\u003e\u003c/a\u003e operations on the first try. A cause\nfor celebration as I usually get into an unholy mess.\u003c/p\u003e",
      "date_published": "2021-12-05T00:00:00+00:00",
      "date_modified": "2021-12-05T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/22-this-grid-will-only-take-2-hours/",
      "url": "https://elver.me/weeknotes/22-this-grid-will-only-take-2-hours/",
      "title": "Weeknotes 22: This grid will only take 2 hours",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI took part in a whiteboarding session! But \u003ca href=\"/weeknotes/20-whiteboards-and-css/\"\u003enot at my house\u003c/a\u003e, at a co-working\nspace, and I didn\u0026rsquo;t do any of the drawing, so I\u0026rsquo;m not quite there yet.\nHowever, it was really successful in helping a colleague and I with a problem\nwe were previously a bit stuck on.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been working remotely for around 7 years now, and I believe that most of\nmy work \u003cem\u003ecan\u003c/em\u003e be done fine from home, but I have to admit that it\u0026rsquo;s hard to\nreplicate these sort of in-person workshop-type sessions.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA lot of this week has been spent writing specifications and planning. I found\nit quite hard to take all my notes and turn them into something that someone\nelse could make sense of. In fact, I still haven\u0026rsquo;t fully managed that, but I\nhave got some fairly decent cards written for Jira.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDuring the planning I did 👆 I came up with a potential solution to a problem\nthat we will need to solve. There are often so many ways to solve something\nthat I find it extremely difficult to decide what to do. I think sometimes you\njust have to pick what you think the correct solution is and go for it. You\ncan always change course later.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/strzibnyj\"\u003eJosef Strzibny\u003c/a\u003e proving once again that dates and times are hard in \u003ca href=\"https://nts.strzibny.name/datetime-summer-time/\"\u003eSummer\nand winter time changes with DateTime\u003c/a\u003e. Elixir has a nice way of handling DST\nchanges though, as you\u0026rsquo;d expect 😉.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;\u003ca href=\"https://web.eecs.utk.edu/~azh/blog/thisprojectwillonlytake.html\"\u003eThis project will only take 2 hours\u003c/a\u003e\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eA very well articulated example of why software is hard.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe students then discussed how they would implement the idea and asked a\nfew clarification questions, before one stated:\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;This project will only take 2 hours.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eAfter seeing the look on my face, another student said, \u0026ldquo;I think it would be\nmore like 4 hours. I\u0026rsquo;ve never used the clipboard system call before.\u0026rdquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIncidentally, I love an old skool website served from a home directory like it\nis here at \u003ccode\u003e~/azh\u003c/code\u003e 👌.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAfter my \u003ca href=\"/weeknotes/20-whiteboards-and-css/\"\u003erecent foray into Flexbox\u003c/a\u003e I started \u003ca href=\"https://cssgrid.io\"\u003eWes Bos\u0026rsquo; CSS Grid course\u003c/a\u003e too.\nI\u0026rsquo;m about 8 videos in and my initial impression is that it\u0026rsquo;s impressive what\ncan be achieved with \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout\"\u003eGrid\u003c/a\u003e - layouts that would be very hard without it are\nsimple.\u003c/p\u003e\n\u003cp\u003eAlso, the Developer Tools for Grid are mightily impressive to a guy who\nstarted out using Microsoft Notepad and \u0026ldquo;View Source\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI took part in a whiteboarding session! But \u003ca href=\"/weeknotes/20-whiteboards-and-css/\"\u003enot at my house\u003c/a\u003e, at a co-working\nspace, and I didn\u0026rsquo;t do any of the drawing, so I\u0026rsquo;m not quite there yet.\nHowever, it was really successful in helping a colleague and I with a problem\nwe were previously a bit stuck on.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been working remotely for around 7 years now, and I believe that most of\nmy work \u003cem\u003ecan\u003c/em\u003e be done fine from home, but I have to admit that it\u0026rsquo;s hard to\nreplicate these sort of in-person workshop-type sessions.\u003c/p\u003e",
      "date_published": "2021-11-28T00:00:00+00:00",
      "date_modified": "2021-11-28T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/21-totally-dope/",
      "url": "https://elver.me/weeknotes/21-totally-dope/",
      "title": "Weeknotes 21: Totally dope",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Adam_Buxton\"\u003eAdam Buxton\u003c/a\u003e had \u003ca href=\"https://www.patrickraddenkeefe.com\"\u003ePatrick Radden Keefe\u003c/a\u003e on his \u003ca href=\"https://www.adam-buxton.co.uk/podcasts/wmcgmfe7zj7chps-89fa4-2e48e-rwzy8-824b8-4mdjd-2hcs8-chrb2-7y8jj-5pcse-2wtsh-cz8zd-e3cdy-g68s7\"\u003epodcast this week\u003c/a\u003e. I\u0026rsquo;d never\nheard of Patrick before but the conversation was a very enjoyable listen. They\nspoke about a few of Patrick\u0026rsquo;s articles and books including his \u003ca href=\"https://www.newyorker.com/magazine/2013/02/11/a-loaded-gun\"\u003eNew Yorker\narticle on Amy Bishop\u003c/a\u003e, and his book \u003ca href=\"https://www.goodreads.com/book/show/43868109-empire-of-pain\"\u003eEmpire of Pain: The Secret History of\nthe Sackler Dynasty\u003c/a\u003e about the Sackler family, inventors of OxyContin.\u003c/p\u003e\n\u003cp\u003eI was looking for a new book to read. I haven\u0026rsquo;t gotten very far through the\nbook yet, but I did read the article, and that got me started reading some of\nhis others including one about \u003ca href=\"https://www.newyorker.com/magazine/2018/08/06/how-a-notorious-gangster-was-exposed-by-his-own-sister\"\u003eAstrid and Wim Holleeder\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eBy a strange coincidence I decided to start watching \u003ca href=\"https://www.imdb.com/title/tt9174558/\"\u003eDopesick\u003c/a\u003e, a drama\nstarring Micheal Keaton, and it\u0026rsquo;s all about the Sackler\u0026rsquo;s and OxyContin.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was pointed at this \u003ca href=\"https://bugs.chromium.org/p/chromium/issues/detail?id=468153#c164\"\u003einteresting issue\u003c/a\u003e on the Chromium tracker this week. I\u0026rsquo;ve\nhad problems with trying to tell browsers to not autocomplete fields in the\npast so this was an interesting read into why Chromium ignores\n\u003ccode\u003eautocomplete=\u0026quot;off\u0026quot;\u003c/code\u003e now (well, since 2016).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI needed to export some Postgres tables and it turns out this is easily done\nfrom within Postgres itself. For CSV with headers\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eCOPY \u0026lt;table_name\u0026gt; TO '/tmp/output.csv' WITH (FORMAT CSV, HEADER);\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eA much needed weekend away was had this weekend. We spent some time in\nDartmoor, Devon. We walked, we ate, we sat around. It was nice.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Adam_Buxton\"\u003eAdam Buxton\u003c/a\u003e had \u003ca href=\"https://www.patrickraddenkeefe.com\"\u003ePatrick Radden Keefe\u003c/a\u003e on his \u003ca href=\"https://www.adam-buxton.co.uk/podcasts/wmcgmfe7zj7chps-89fa4-2e48e-rwzy8-824b8-4mdjd-2hcs8-chrb2-7y8jj-5pcse-2wtsh-cz8zd-e3cdy-g68s7\"\u003epodcast this week\u003c/a\u003e. I\u0026rsquo;d never\nheard of Patrick before but the conversation was a very enjoyable listen. They\nspoke about a few of Patrick\u0026rsquo;s articles and books including his \u003ca href=\"https://www.newyorker.com/magazine/2013/02/11/a-loaded-gun\"\u003eNew Yorker\narticle on Amy Bishop\u003c/a\u003e, and his book \u003ca href=\"https://www.goodreads.com/book/show/43868109-empire-of-pain\"\u003eEmpire of Pain: The Secret History of\nthe Sackler Dynasty\u003c/a\u003e about the Sackler family, inventors of OxyContin.\u003c/p\u003e\n\u003cp\u003eI was looking for a new book to read. I haven\u0026rsquo;t gotten very far through the\nbook yet, but I did read the article, and that got me started reading some of\nhis others including one about \u003ca href=\"https://www.newyorker.com/magazine/2018/08/06/how-a-notorious-gangster-was-exposed-by-his-own-sister\"\u003eAstrid and Wim Holleeder\u003c/a\u003e.\u003c/p\u003e",
      "date_published": "2021-11-21T00:00:00+00:00",
      "date_modified": "2021-11-21T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/20-whiteboards-and-css/",
      "url": "https://elver.me/weeknotes/20-whiteboards-and-css/",
      "title": "Weeknotes 20: Whiteboards and CSS",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI bought a whiteboard! It\u0026rsquo;s now installed in my office next to my desk. I\u0026rsquo;m\nhoping it\u0026rsquo;s going to help me with problem solving.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI found a cool trick when working with browser developer tools - the \u003ca href=\"https://stackoverflow.com/questions/49453385/chrome-devtools-loop-through-nodelist\"\u003e\u003ccode\u003ecopy\u003c/code\u003e\nhelper\u003c/a\u003e. It lets you copy output straight from the console to your clipboard.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ecopy($$('.foobar').map(e =\u0026gt; e.textContent).join('\\n'))\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe\u0026rsquo;ve been using \u003ca href=\"https://tailwindcss.com\"\u003eTailwind CSS\u003c/a\u003e at work and it didn\u0026rsquo;t take very long before I\nwas getting stuck. I realised pretty quickly though that it\u0026rsquo;s not a lack of\nTailwind knowledge per se, but rather a general lack of \u003cem\u003emodern\u003c/em\u003e CSS knowledge.\u003c/p\u003e\n\u003cp\u003eI used to do a lot more frontend work. I started off doing a lot of HTML/CSS,\nbut I\u0026rsquo;ve focused on the backend for many years now, and keeping up is hard.\u003c/p\u003e\n\u003cp\u003eSo I\u0026rsquo;ve decided it\u0026rsquo;s time to get up-to-date and I\u0026rsquo;m starting by learning\n\u003ca href=\"https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox\"\u003eFlexbox\u003c/a\u003e using \u003ca href=\"https://flexbox.io\"\u003eWes Bos\u0026rsquo; videos\u003c/a\u003e. Wish me luck!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://daringfireball.net/linked/2021/11/12/new-york-city-street\"\u003eJohn Gruber writes\u0026hellip;\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThere are a lot of good ideas here. Drastically reducing curbside parking\nand using that space to widen sidewalks and increase outdoor eating areas is\nsomething that’s happened in a lot of cities during this pandemic. It’s been\na huge win here in Philly.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI wish we could make better use of our space here in the UK.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSadly I found out this week that another former colleague had passed away. I\nworked in the same team as Dave for almost a year. A very clever guy who had\na vast wealth of experience. RIP.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI bought a whiteboard! It\u0026rsquo;s now installed in my office next to my desk. I\u0026rsquo;m\nhoping it\u0026rsquo;s going to help me with problem solving.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI found a cool trick when working with browser developer tools - the \u003ca href=\"https://stackoverflow.com/questions/49453385/chrome-devtools-loop-through-nodelist\"\u003e\u003ccode\u003ecopy\u003c/code\u003e\nhelper\u003c/a\u003e. It lets you copy output straight from the console to your clipboard.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ecopy($$('.foobar').map(e =\u0026gt; e.textContent).join('\\n'))\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe\u0026rsquo;ve been using \u003ca href=\"https://tailwindcss.com\"\u003eTailwind CSS\u003c/a\u003e at work and it didn\u0026rsquo;t take very long before I\nwas getting stuck. I realised pretty quickly though that it\u0026rsquo;s not a lack of\nTailwind knowledge per se, but rather a general lack of \u003cem\u003emodern\u003c/em\u003e CSS knowledge.\u003c/p\u003e",
      "date_published": "2021-11-14T00:00:00+00:00",
      "date_modified": "2021-11-14T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/19-burn-brightly/",
      "url": "https://elver.me/weeknotes/19-burn-brightly/",
      "title": "Weeknotes 19: Burn brightly",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI got an iPad Mini 6 recently. I\u0026rsquo;ve had iPads before but they never really got\nused apart from on holiday. This one was bought specifically to see if it can\nhelp me with note taking, diagram creation, and annotation of learning\nmaterials.\u003c/p\u003e\n\u003cp\u003eI was trying to make a decision between Good Notes 5 and Notability\nwhen Notability decided to move to a freemium model so that pushed me in their\ndirection. However, I\u0026rsquo;ve since also tried Good Notes 5 and it seems really\ngood. I haven\u0026rsquo;t settled on one or the other yet.\u003c/p\u003e\n\u003cp\u003eSo far I\u0026rsquo;m impressed. I\u0026rsquo;m not sure if it\u0026rsquo;s going to suit marking up PDFs or\nnot yet but time will tell.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNick Cave \u003ca href=\"https://www.theredhandfiles.com/heart-that-kills-you-it-is-a-beautiful-thing/\"\u003ewrote something lovely\u003c/a\u003e in his latest The Red Hand Files entry.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;the anger at the indifference and casual cruelty of this world can still\nburn bright, but it does not define us, for the oxygen that fuels that anger\nis love — love for the world and love for the people in it. Love becomes\nanger’s great animator, as it should, as it must.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e🔥 Burn out update: Feeling a bit better, but also looking forward to some\nproper time off over the Christmas period. I am mindful that I need to make\nsure to take breaks more regularly in the future to stop being burnt out\nbecoming something more serious.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI heard a few weeks ago that \u003ca href=\"https://mikerogers.io\"\u003eMike Rogers\u003c/a\u003e had been involved in a serious\naccident. Mike is unfortunately no longer with us. I didn\u0026rsquo;t know Mike very\nwell (our paths did cross when we were both working at the same place for a\nmonth or so, but we worked on different projects). He was extremely\nenthusiastic about the Ruby community and it\u0026rsquo;s clear from \u003ca href=\"https://twitter.com/search?q=mikerogers0\u0026amp;src=recent_search_click\u0026amp;f=live\"\u003ehis mentions on\nTwitter\u003c/a\u003e that he meant a lot to many people. He will be greatly missed 😢\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI got an iPad Mini 6 recently. I\u0026rsquo;ve had iPads before but they never really got\nused apart from on holiday. This one was bought specifically to see if it can\nhelp me with note taking, diagram creation, and annotation of learning\nmaterials.\u003c/p\u003e\n\u003cp\u003eI was trying to make a decision between Good Notes 5 and Notability\nwhen Notability decided to move to a freemium model so that pushed me in their\ndirection. However, I\u0026rsquo;ve since also tried Good Notes 5 and it seems really\ngood. I haven\u0026rsquo;t settled on one or the other yet.\u003c/p\u003e",
      "date_published": "2021-11-07T00:00:00+00:00",
      "date_modified": "2021-11-07T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/18-chunky-bacon/",
      "url": "https://elver.me/weeknotes/18-chunky-bacon/",
      "title": "Weeknotes 18: Chunky bacon",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve tried to convince various colleagues over the years that using\nActiveRecord models inside a migration is a bad idea. Data migration code\nshould reside in a separate \u003ccode\u003erake\u003c/code\u003e task in my view. I expect I haven\u0026rsquo;t done a\ngood job of explaining myself.\u003c/p\u003e\n\u003cp\u003eI was reminded of this once again when I happened across the \u003ca href=\"https://github.com/testdouble/good-migrations\"\u003egood_migrations\u003c/a\u003e\ngem.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThat means that if your migrations reference the ActiveRecord model objects\nyou\u0026rsquo;ve defined in app/models, your old migrations are likely to break.\nThat\u0026rsquo;s not good.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ePerhaps I will sneak the gem into codebases I work on.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGitHub did a nice write up about \u003ca href=\"https://github.com/readme/featured/why-the-lucky-stiff\"\u003e_why the lucky stiff\u003c/a\u003e recently. It was a\nnice reminder about \u003ca href=\"https://en.wikipedia.org/wiki/Why_the_lucky_stiff\"\u003e_why\u003c/a\u003e and how he influenced Ruby early on. He certainly\nhad a big impact on me when I was first learning Ruby.\u003c/p\u003e\n\u003cp\u003eI wish I still had my \u003ca href=\"https://poignant.guide/book/chapter-3.html\"\u003echunky bacon\u003c/a\u003e t-shirt.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/phoenixframework/phoenix_live_view\"\u003eLiveView\u003c/a\u003e continues to grow and impress. I have used it a bit and I ran into\nsome of the issues that \u003ca href=\"https://www.youtube.com/watch?v=Of1phFsC4ZI\"\u003eChris McCord talks about in his ElixirConf 2021\ntalk\u003c/a\u003e. The solutions he proposes seem to make a lot of sense to me. Wrinkles\nare being ironed out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGitHub released a feature preview this week - \u003ca href=\"https://docs.github.com/en/get-started/using-github/github-command-palette\"\u003eCommand Palette\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eJust like keyboard shortcuts in an IDE, command palette lets you run\ncommands and navigate across organizations, repositories, issues, pull\nrequests, and more all within the GitHub UI.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ccode\u003e⌘ + k\u003c/code\u003e your way around GitHub - very nice.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been feeling irritable for \u003cem\u003eat least\u003c/em\u003e the last few weeks. I don\u0026rsquo;t feel\nlistened to. I\u0026rsquo;m anxious. I don\u0026rsquo;t feel good enough. I think I\u0026rsquo;m experiencing\nthe ol\u0026rsquo; \u0026ldquo;burn out\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eI decided, in the interest of my mental health, to take the rest of the week\noff. I\u0026rsquo;m not sure this is going to be enough of a break, in fact I\u0026rsquo;m positive it\nwon\u0026rsquo;t be, but hopefully it will help.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve tried to convince various colleagues over the years that using\nActiveRecord models inside a migration is a bad idea. Data migration code\nshould reside in a separate \u003ccode\u003erake\u003c/code\u003e task in my view. I expect I haven\u0026rsquo;t done a\ngood job of explaining myself.\u003c/p\u003e\n\u003cp\u003eI was reminded of this once again when I happened across the \u003ca href=\"https://github.com/testdouble/good-migrations\"\u003egood_migrations\u003c/a\u003e\ngem.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThat means that if your migrations reference the ActiveRecord model objects\nyou\u0026rsquo;ve defined in app/models, your old migrations are likely to break.\nThat\u0026rsquo;s not good.\u003c/p\u003e",
      "date_published": "2021-10-31T00:00:00+00:00",
      "date_modified": "2021-10-31T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/17-safe-macbook-navigation/",
      "url": "https://elver.me/weeknotes/17-safe-macbook-navigation/",
      "title": "Weeknotes 17: Safe MacBook Navigation",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/16-standard-checks-and-breakages/\"\u003eStandardRB check\u003c/a\u003e seems to be broken again. FML.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI read \u003ca href=\"https://thoughtbot.com/blog/ruby-safe-navigation\"\u003eRuby Safe Navigation\u003c/a\u003e from ThoughtBot this week. The article makes a\nlot of good points. When I first head that this new operator was being added\nto Ruby I wondered whether this sort of usage might result. I myself have seen\nit being liberally sprinkled around codebases. It should be used with care,\nwhich unfortunately doesn\u0026rsquo;t seem to happen.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother read this week: \u003ca href=\"https://nts.strzibny.name/business-logic-in-rails-with-contexts/?utm_source=pocket_mylist\"\u003eOrganizing business logic in Rails with contexts\u003c/a\u003e.\nI\u0026rsquo;ve admired the \u003ca href=\"https://www.phoenixframework.org\"\u003ePhoenix\u003c/a\u003e way of doing things too, but not having much\npractical experience with Elixir/Phoenix means I\u0026rsquo;m not really qualified to say\nwhether it works in practice, but I\u0026rsquo;ve heard it does.\u003c/p\u003e\n\u003cp\u003eIn particular I like the idea of returning an explicit \u003ccode\u003eResult\u003c/code\u003e object. It\u0026rsquo;s\nidiomatic in Elixir to return a tuple like \u003ccode\u003e{:ok, thing}\u003c/code\u003e when successful and\n\u003ccode\u003e{:error, reason}\u003c/code\u003e when it\u0026rsquo;s not. And in Rust there are many types of\n\u0026ldquo;Result\u0026quot;s that can be returned and \u003cem\u003emust\u003c/em\u003e be handled. In Ruby I only ever see\na \u003ccode\u003enil\u003c/code\u003e or a boolean, which is a shame.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eApple released their new MacBook Pro line this week. Thank, god. It doesn\u0026rsquo;t\nseem like they fucked it. They\u0026rsquo;ve righted wrongs, and improved on what were\nalready game changing processors. There\u0026rsquo;s a cool \u003ca href=\"https://twitter.com/stevesi/status/1450255227945242628\"\u003ethread on Twitter\u003c/a\u003e that\ntalks about the history of how Apple got to the current ARM future.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"/weeknotes/16-standard-checks-and-breakages/\"\u003eStandardRB check\u003c/a\u003e seems to be broken again. FML.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI read \u003ca href=\"https://thoughtbot.com/blog/ruby-safe-navigation\"\u003eRuby Safe Navigation\u003c/a\u003e from ThoughtBot this week. The article makes a\nlot of good points. When I first head that this new operator was being added\nto Ruby I wondered whether this sort of usage might result. I myself have seen\nit being liberally sprinkled around codebases. It should be used with care,\nwhich unfortunately doesn\u0026rsquo;t seem to happen.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother read this week: \u003ca href=\"https://nts.strzibny.name/business-logic-in-rails-with-contexts/?utm_source=pocket_mylist\"\u003eOrganizing business logic in Rails with contexts\u003c/a\u003e.\nI\u0026rsquo;ve admired the \u003ca href=\"https://www.phoenixframework.org\"\u003ePhoenix\u003c/a\u003e way of doing things too, but not having much\npractical experience with Elixir/Phoenix means I\u0026rsquo;m not really qualified to say\nwhether it works in practice, but I\u0026rsquo;ve heard it does.\u003c/p\u003e",
      "date_published": "2021-10-24T00:00:00+00:00",
      "date_modified": "2021-10-24T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/16-standard-checks-and-breakages/",
      "url": "https://elver.me/weeknotes/16-standard-checks-and-breakages/",
      "title": "Weeknotes 16: Standard checks and breakages",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe\u0026rsquo;ve had a malfunctioning \u003ca href=\"https://github.com/testdouble/standard\"\u003eStandardRB\u003c/a\u003e \u003ca href=\"https://github.com/andrewmcodes/standardrb-action\"\u003echeck\u003c/a\u003e on one of our repos for a few\nweeks. It would fail if the PR contained a single commit - a scenario I failed\nto originally test but I think I be forgiven for not doing so, strange as it is.\u003c/p\u003e\n\u003cp\u003eAnyway, I had to more or less totally rewrite the way it worked.\u003c/p\u003e\n\u003cp\u003eThe check works by getting a list of added or modified files and passing that\nlist to \u003ccode\u003estandardrb\u003c/code\u003e for checking. The reason for this is that we don\u0026rsquo;t want\nto run the check on the whole codebase at the moment due to a large number of\nStandardRB violations.\u003c/p\u003e\n\u003cp\u003eHowever, it seems that it\u0026rsquo;s surprisingly hard to get a list of files changed\nin a PR using existing actions - they all have problems or fail under\nweird conditions.\u003c/p\u003e\n\u003cp\u003eSo, I rewrote it to get the list of files from the GitHub API instead after\nseeing someone mention they had done the same whilst Googling about for\nsolutions.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAgreed.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDon\u0026rsquo;t use comments! Use code.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://www.matheusrich.com/dont-use-comments-use-code/\"\u003ehttps://www.matheusrich.com/dont-use-comments-use-code/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe current app I\u0026rsquo;m working on uses \u003ca href=\"https://redis.io/topics/pubsub\"\u003eRedis PubSub\u003c/a\u003e in a few places, but it\u0026rsquo;s\nexpanding to use Rails\u0026rsquo; \u003ca href=\"https://guides.rubyonrails.org/action_cable_overview.html\"\u003eActionCable\u003c/a\u003e too - something I\u0026rsquo;ve never used. A\nquestion about our setup kicked off a brief investigation into how Redis\nstores the messages to be published to subscribers. My naive thought was that\nit would actually write the messages as keys like any other record, but no.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRedis does not queue anything on pub/sub channels. On the contrary, it tends\nto read the item from the publisher socket, and write the item in all the\nsubscriber sockets, ideally in the same iteration of the event loop. Nothing\nis kept in Redis data structures.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://stackoverflow.com/a/27746701/120615\"\u003ehttps://stackoverflow.com/a/27746701/120615\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI broke a fairly major thing this week by not surrounding an argument with\nquotes. Bad times. Lessons were learnt though - our testing process is clearly\nnot good enough.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWe\u0026rsquo;ve had a malfunctioning \u003ca href=\"https://github.com/testdouble/standard\"\u003eStandardRB\u003c/a\u003e \u003ca href=\"https://github.com/andrewmcodes/standardrb-action\"\u003echeck\u003c/a\u003e on one of our repos for a few\nweeks. It would fail if the PR contained a single commit - a scenario I failed\nto originally test but I think I be forgiven for not doing so, strange as it is.\u003c/p\u003e\n\u003cp\u003eAnyway, I had to more or less totally rewrite the way it worked.\u003c/p\u003e\n\u003cp\u003eThe check works by getting a list of added or modified files and passing that\nlist to \u003ccode\u003estandardrb\u003c/code\u003e for checking. The reason for this is that we don\u0026rsquo;t want\nto run the check on the whole codebase at the moment due to a large number of\nStandardRB violations.\u003c/p\u003e",
      "date_published": "2021-10-17T00:00:00+00:00",
      "date_modified": "2021-10-17T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/15-secure-content-warning/",
      "url": "https://elver.me/weeknotes/15-secure-content-warning/",
      "title": "Weeknotes 15: Secure content warning",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAfter last week\u0026rsquo;s \u003ca href=\"/weeknotes/14-the-week-nothing-happened/\"\u003elack of Content\u003c/a\u003e comes \u003cem\u003eslightly\u003c/em\u003e more Content.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI spent some time diagnosing an SSL issue this week. Occasionally some Ruby\ncode was throwing \u003ccode\u003eOpenSSL::SSL:SSLError\u003c/code\u003e exceptions.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error:\ncertificate verify failed (unable to get local issuer certificate)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt seems OpenSSL, and as a consequence Ruby, could not connect to a URL\nbecause it can\u0026rsquo;t verify the SSL certificate. It doesn\u0026rsquo;t happen on every https\nURL, but happens enough to warrant an investigation.\u003c/p\u003e\n\u003cp\u003eI found a couple of useful scripts whilst Googling around for ideas. The first\nwas a \u003ca href=\"https://raw.githubusercontent.com/rubygems/ruby-ssl-check/master/check.rb\"\u003escript put together by the Bundler team\u003c/a\u003e. This was really useful to get\na broad idea of what might be going wrong.\u003c/p\u003e\n\u003cp\u003eThe \u003ca href=\"https://github.com/mislav/ssl-tools\"\u003esecond was by Mislav Marohnić\u003c/a\u003e dated back in 2013 - some problems don\u0026rsquo;t go\naway - and he also had written an accompanying \u003ca href=\"https://mislav.net/2013/07/ruby-openssl/\"\u003eblog post explaining the issues\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe solution seems to be that we need to update our root SSL certificates.\nI haven\u0026rsquo;t done that yet, but hopefully it solves the issue 🤞\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAfter last week\u0026rsquo;s \u003ca href=\"/weeknotes/14-the-week-nothing-happened/\"\u003elack of Content\u003c/a\u003e comes \u003cem\u003eslightly\u003c/em\u003e more Content.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI spent some time diagnosing an SSL issue this week. Occasionally some Ruby\ncode was throwing \u003ccode\u003eOpenSSL::SSL:SSLError\u003c/code\u003e exceptions.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error:\ncertificate verify failed (unable to get local issuer certificate)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt seems OpenSSL, and as a consequence Ruby, could not connect to a URL\nbecause it can\u0026rsquo;t verify the SSL certificate. It doesn\u0026rsquo;t happen on every https\nURL, but happens enough to warrant an investigation.\u003c/p\u003e",
      "date_published": "2021-10-10T00:00:00+00:00",
      "date_modified": "2021-10-10T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/14-the-week-nothing-happened/",
      "url": "https://elver.me/weeknotes/14-the-week-nothing-happened/",
      "title": "Weeknotes 14: The week nothing happened",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=OdPYEdUDlEk\"\u003eNothing much happened this week\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=OdPYEdUDlEk\"\u003eNothing much happened this week\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e",
      "date_published": "2021-10-03T00:00:00+00:00",
      "date_modified": "2021-10-03T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/13-1-3gb-of-node-modules-and-stress-testing-ci/",
      "url": "https://elver.me/weeknotes/13-1-3gb-of-node-modules-and-stress-testing-ci/",
      "title": "Weeknotes 13: 1.3GB of node_modules/ and stress testing CI",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eRetro-fitting tests is so much more difficult than writing them at the time of\nthe implementation. Writing them afterwards often forces you to change the\nimplementation in order to even test anything, and you (I, dear reader)\nusually end up with a highly coupled test too, making future changes more\ndifficult. I would ideally like to an integration test to cover the subject\nunder test whilst changing it, but that\u0026rsquo;s not always possible, as was the case\nthis time, so making the changes feels perilous. I did my best.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDebugging failed tests on CI is never fun. It works on my machine has never\nbeen more painful. It sucks the life out of me. The slow feedback cycle is a\nkiller having to push small changes and see if they pass. This particular CI\nwas running on GitHub Actions and thankfully I found this neat action called\n\u003ca href=\"https://github.com/marketplace/actions/debugging-with-tmate\"\u003eaction-tmate\u003c/a\u003e on the GitHub Actions Marketplace. It essentially provides you\nwith a shell on the GitHub Actions machine your tests are running on. Much\neasier to debug. With this in-place I could run tests directly and use a\ndebugger to work out what was going wrong.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe got into a position where we couldn\u0026rsquo;t deploy to our application hosted on\nHeroku this week 🤦‍♂️ Our \u003ca href=\"https://devcenter.heroku.com/articles/slug-compiler\"\u003eSlug\u003c/a\u003e size had gradually been growing but a\nrecent merge of some major JavaScript changes massively increased our bundle\nsizes and left us in a position where we couldn\u0026rsquo;t actually deploy any more!\u003c/p\u003e\n\u003cp\u003eInvestigating on Heroku using \u003ccode\u003eheroku run bash\u003c/code\u003e I came across our\n\u003ccode\u003enode_modules/\u003c/code\u003e directory.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ du -sh .[^.]* * | sort -hr\n1.3G    node_modules\n532M    vendor\n268M    tmp\n118M    .heroku\n95M     public\n12M     app\n1.9M    spec\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOh, Node.\u003c/p\u003e\n\u003cp\u003eI did some Googling and \u003ca href=\"https://blog.saeloun.com/2020/05/04/how-to-reduce-heroku-slug-size.html\"\u003efound what seemed like a reasonable, easy to\nimplement, approach\u003c/a\u003e. We augment the \u003ccode\u003eassets:clean\u003c/code\u003e Rake task that\nHeroku already call during the deployment process to remove the\n\u003ccode\u003enode_modules/\u003c/code\u003e directory \u003cem\u003ebefore\u003c/em\u003e the Slug is compressed. This change make\nthe Slug size 264MB smaller than before - an over 50% saving.\u003c/p\u003e\n\u003cp\u003eThe deployment should also be faster from now on as the Slug Compiler\nshouldn\u0026rsquo;t have to compress 1.3GB of files anymore.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eShort work week for me this week. We went away to Cornwall for a few days.\nIt\u0026rsquo;s been ages since I\u0026rsquo;ve been away properly what with one thing and another.\nA combination of uncomfortable AirBnB and poor weather meant that we decided\nto come home early.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eRetro-fitting tests is so much more difficult than writing them at the time of\nthe implementation. Writing them afterwards often forces you to change the\nimplementation in order to even test anything, and you (I, dear reader)\nusually end up with a highly coupled test too, making future changes more\ndifficult. I would ideally like to an integration test to cover the subject\nunder test whilst changing it, but that\u0026rsquo;s not always possible, as was the case\nthis time, so making the changes feels perilous. I did my best.\u003c/p\u003e",
      "date_published": "2021-09-26T00:00:00+00:00",
      "date_modified": "2021-09-26T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/12-rspec-let-and-the-gell-mann-amnesia-effect/",
      "url": "https://elver.me/weeknotes/12-rspec-let-and-the-gell-mann-amnesia-effect/",
      "title": "Weeknotes 12: RSpec let and the Gell-Mann amnesia effect",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI read an interesting article on why the \u003ca href=\"https://mortoray.com/2013/11/27/the-string-type-is-broken/\"\u003estring type is broken\u003c/a\u003e this week. It\nwas written in 2013 but still seems to apply in 2021. Ruby, my main\nprogramming language, fairs pretty well in most of the test cases put forth,\nbut the issues are well worth being aware of.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBy happenstance I learnt about the \u003ca href=\"https://en.wikipedia.org/wiki/Michael_Crichton#GellMannAmnesiaEffect\"\u003eGell-Mann amnesia effect\u003c/a\u003e via\n\u003ca href=\"https://twitter.com/jerodsanto/status/1438155433009635334\"\u003eTwitter\u003c/a\u003e. I\u0026rsquo;ve experienced it myself many times so its\ninteresting that the phenomenon has a name.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;you read with exasperation or amusement the multiple errors in a story,\nand then turn the page to national or international affairs, and read as if\nthe rest of the newspaper was somehow more accurate about Palestine than the\nbaloney you just read. You turn the page, and forget what you know.” -\n\u003ca href=\"https://www.epsilontheory.com/gell-mann-amnesia/\"\u003eMichael Crichton\u003c/a\u003e (1942-2008)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnother \u003ca href=\"https://twitter.com/hopsoft/status/1438932131422490629\"\u003etweet by Nate Hopkins\u003c/a\u003e caught my eye too. He asked about RSpec\u0026rsquo;s\n\u003ccode\u003elet\u003c/code\u003e syntax.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhy does RSpec support \u0026ldquo;let\u0026rdquo; syntax? Is it simply to squash parts of a before\nhook into a single line or is there some practical utility? I currently see it\nas only serving to obfuscate things.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI have come to strongly agree with Nate\u0026rsquo;s assertion that they only serve to\nobfuscate things. I\u0026rsquo;ve written many tests using the \u003ccode\u003elet\u003c/code\u003e syntax myself and\neverything is great at the beginning. The problem comes as the test file\ngrows and you can no longer see the whole test in one go. You\u0026rsquo;ll find that a\n\u003ccode\u003elet\u003c/code\u003e at the top of the file is affecting a test on line 1000, and tracking\nall over the file to reason about the test becomes very tiresome.\u003c/p\u003e\n\u003cp\u003eThese days I much prefer a longer, simpler style of tests where all\ndependencies are shown up front and center with nothing hidden. Tests which\nprovide design feedback - if you have a lot of dependencies to setup a test,\nyou have a complicated object. This information is often hidden with \u003ccode\u003elet\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eYou may experience push back from team members writing tests in this style.\nPeople will say they are verbose - they are. And not very DRY - they\u0026rsquo;re not.\nBut in my view, they they tend to make the whole test more understandable, and\nare cut and pasteable when a base for new tests is required. They lead to more\nmaintainable tests in my experience.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI read an interesting article on why the \u003ca href=\"https://mortoray.com/2013/11/27/the-string-type-is-broken/\"\u003estring type is broken\u003c/a\u003e this week. It\nwas written in 2013 but still seems to apply in 2021. Ruby, my main\nprogramming language, fairs pretty well in most of the test cases put forth,\nbut the issues are well worth being aware of.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBy happenstance I learnt about the \u003ca href=\"https://en.wikipedia.org/wiki/Michael_Crichton#GellMannAmnesiaEffect\"\u003eGell-Mann amnesia effect\u003c/a\u003e via\n\u003ca href=\"https://twitter.com/jerodsanto/status/1438155433009635334\"\u003eTwitter\u003c/a\u003e. I\u0026rsquo;ve experienced it myself many times so its\ninteresting that the phenomenon has a name.\u003c/p\u003e",
      "date_published": "2021-09-19T00:00:00+00:00",
      "date_modified": "2021-09-19T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/11-office-life-dns-and-old-ruby-features/",
      "url": "https://elver.me/weeknotes/11-office-life-dns-and-old-ruby-features/",
      "title": "Weeknotes 11: Office Life, DNS, and old Ruby features",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWorking from an office again was weird. I spent a day in an office that wasn\u0026rsquo;t\nin my house this week. With other people. I found it to be a mixed experience.\nIt was nice to get out of the house (I\u0026rsquo;ve found getting out of the house once\na week is a good idea for my sanity) and when the commute isn\u0026rsquo;t every day it\u0026rsquo;s\na nice way to unwind. Seeing my colleagues face-to-face was also nice.\u003c/p\u003e\n\u003cp\u003eHowever, I can say without a doubt that it was my most unproductive day in a\nlong time. I\u0026rsquo;m sure COVID has reduced my already low tolerance for noise and\ngeneral disruption. Concentrating felt impossible, even with headphones and\nmusic. Luckily I didn\u0026rsquo;t have too much hardcore concentrating to do due to the\nwork I had lined up.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe lesson I learn over and over is to test your own assumptions. This\nhappened again this week when debugging a test failure. It was failing due to\na DNS change (long story), which was something I didn\u0026rsquo;t consider whilst\ninvestigating. A fresh set of eyes from another solved the problem, but it was\na good reminder.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m gradually using really quite old Ruby features. This week it was the \u003ccode\u003e...\u003c/code\u003e\noperator used for forwarding arguments on. Usually I would collect the\narguments using \u003ccode\u003e*args\u003c/code\u003e and then destructure them again also using \u003ccode\u003e*args\u003c/code\u003e,\nbut I always forget which syntax. Having \u003ccode\u003e...\u003c/code\u003e for a single purpose is pretty\nnice. Contrary to a lot of the new syntax added to Ruby, I think this is\nworth it.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWorking from an office again was weird. I spent a day in an office that wasn\u0026rsquo;t\nin my house this week. With other people. I found it to be a mixed experience.\nIt was nice to get out of the house (I\u0026rsquo;ve found getting out of the house once\na week is a good idea for my sanity) and when the commute isn\u0026rsquo;t every day it\u0026rsquo;s\na nice way to unwind. Seeing my colleagues face-to-face was also nice.\u003c/p\u003e",
      "date_published": "2021-09-12T00:00:00+00:00",
      "date_modified": "2021-09-12T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/10-docker-on-apple-m1-and-writing-tests/",
      "url": "https://elver.me/weeknotes/10-docker-on-apple-m1-and-writing-tests/",
      "title": "Weeknotes 10: Docker on Apple M1, and writing tests",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWhen deploying to \u003ca href=\"https://www.heroku.com\"\u003eHeroku\u003c/a\u003e I\u0026rsquo;ve always used the \u003ca href=\"https://devcenter.heroku.com/articles/git\"\u003egit push\u003c/a\u003e method but you can\nalso \u003ca href=\"https://devcenter.heroku.com/articles/container-registry-and-runtime\"\u003edeploy Docker containers\u003c/a\u003e, and I did so this week. I was expecting to\nhave to tweak my Dockerfile in some way, however I was pleasantly surprised\nthat everything just worked.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eheroku container:push web --app \u0026lt;app\u0026gt;\nheroku container:release web --app \u0026lt;app\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI ran into a small issue because I was deploying from an \u003ca href=\"https://en.wikipedia.org/wiki/Apple_M1\"\u003eApple M1\u003c/a\u003e-based\ncomputer but it was easily remedied by setting an environment variable.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eexport DOCKER_DEFAULT_PLATFORM=linux/amd64\nheroku container:push web --app live-transcriber-api\nheroku container:release web --app \u0026lt;app\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis allows us to run the same containers in development as well as production\nso it\u0026rsquo;s a big win for productivity.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWriting tests for existing code is so much harder \u003cem\u003eafter\u003c/em\u003e the implementation.\nBut it\u0026rsquo;s important to fill in any gaps in coverage before making changes, so\nthis week I was doing that. It was a lot trickier than I was expecting as the\ntests needed to cover many areas of the codebase that I was unfamiliar with so\nI had to learn how everything worked as I went. It feels good to have improved\nthe test coverage.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWhen deploying to \u003ca href=\"https://www.heroku.com\"\u003eHeroku\u003c/a\u003e I\u0026rsquo;ve always used the \u003ca href=\"https://devcenter.heroku.com/articles/git\"\u003egit push\u003c/a\u003e method but you can\nalso \u003ca href=\"https://devcenter.heroku.com/articles/container-registry-and-runtime\"\u003edeploy Docker containers\u003c/a\u003e, and I did so this week. I was expecting to\nhave to tweak my Dockerfile in some way, however I was pleasantly surprised\nthat everything just worked.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eheroku container:push web --app \u0026lt;app\u0026gt;\nheroku container:release web --app \u0026lt;app\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI ran into a small issue because I was deploying from an \u003ca href=\"https://en.wikipedia.org/wiki/Apple_M1\"\u003eApple M1\u003c/a\u003e-based\ncomputer but it was easily remedied by setting an environment variable.\u003c/p\u003e",
      "date_published": "2021-09-05T00:00:00+00:00",
      "date_modified": "2021-09-05T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/9-testing-tests-and-electron-drama/",
      "url": "https://elver.me/weeknotes/9-testing-tests-and-electron-drama/",
      "title": "Weeknotes 9: Testing tests and Electron drama",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://edgeapi.rubyonrails.org/classes/ActionMailer/Base.html\"\u003eActionMailer\u003c/a\u003e has a feature called \u003ca href=\"https://guides.rubyonrails.org/action_mailer_basics.html#intercepting-emails\"\u003einterceptors\u003c/a\u003e. It allows you to make\nmodifications to an email before it\u0026rsquo;s delivered and I had the perfect\nuse-case, to override the email recipient depending on various factors such as\nenvironment. It solved my problem quickly and provides a nice, de-coupled, way\nto hook into ActionMailer. Not deployed to production yet, but recommended\nregardless.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWriting tests gives me confidence in the code I\u0026rsquo;m producing. Struggling with\ntest frameworks does not. Sadly there was a fair bit of the latter this week\nfiguring out why RSpec Request specs where not performing jobs automatically\nas they should when the ActiveJob queue adaptor is set to \u003ccode\u003e:inline\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eMy problem sounds like this \u003ca href=\"https://github.com/rails/rails/issues/37270\"\u003eRails issue\u003c/a\u003e. During request specs the queue\nadapter is reset to \u003ccode\u003e:test\u003c/code\u003e which means that jobs are not performed\nautomatically.\u003c/p\u003e\n\u003cp\u003eI didn\u0026rsquo;t completely fix the issue, and the potential fix of upgrading Rails\nwas too much to do at the time, but I did work around it by writing a \u003ca href=\"https://relishapp.com/rspec/rspec-expectations/v/3-10/docs/custom-matchers/define-a-custom-matcher\"\u003ecustom\nRSpec matcher\u003c/a\u003e. A lot of time was wasted that I could have spent on writing\ntests though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThere was an interesting discussion about \u003ca href=\"https://www.electronjs.org\"\u003eElectron\u003c/a\u003e on \u003ca href=\"https://atp.fm/444\"\u003eATP 444\u003c/a\u003e. It was\nprompted by \u003ca href=\"https://blog.1password.com/1password-8-the-story-so-far/\"\u003e1Password\u0026rsquo;s move to Electron\u003c/a\u003e, especially in relation\nto macOS. I myself was worried about this move, but as the hosts of ATP\ndiscussed, the situation is more nuanced than it first appears.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m conflicted. As someone with web development skills but no \u0026ldquo;native\u0026rdquo; app\nskills (save for some messing about with \u003ca href=\"https://en.wikipedia.org/wiki/Objective-C\"\u003eObjective-C\u003c/a\u003e and \u003ca href=\"https://en.wikipedia.org/wiki/Cocoa_(API)\"\u003eCocoa\u003c/a\u003e years ago)\nElectron is appealing to me, but I also miss the native feel of apps that can\nbe lost when using Electron.\u003c/p\u003e\n\u003cp\u003eI think it probably makes a lot of sense for some companies to use it.  I\u0026rsquo;m\nsure it would mean the difference between having a native app available for a\nplatform and not at all in many cases, but you\u0026rsquo;d have to be mindful of the\ntrade-offs involved. There is a danger that you end up creating an app that is\nnot fit for the platform on which it runs.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://edgeapi.rubyonrails.org/classes/ActionMailer/Base.html\"\u003eActionMailer\u003c/a\u003e has a feature called \u003ca href=\"https://guides.rubyonrails.org/action_mailer_basics.html#intercepting-emails\"\u003einterceptors\u003c/a\u003e. It allows you to make\nmodifications to an email before it\u0026rsquo;s delivered and I had the perfect\nuse-case, to override the email recipient depending on various factors such as\nenvironment. It solved my problem quickly and provides a nice, de-coupled, way\nto hook into ActionMailer. Not deployed to production yet, but recommended\nregardless.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWriting tests gives me confidence in the code I\u0026rsquo;m producing. Struggling with\ntest frameworks does not. Sadly there was a fair bit of the latter this week\nfiguring out why RSpec Request specs where not performing jobs automatically\nas they should when the ActiveJob queue adaptor is set to \u003ccode\u003e:inline\u003c/code\u003e.\u003c/p\u003e",
      "date_published": "2021-08-29T00:00:00+00:00",
      "date_modified": "2021-08-29T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/8-fire-in-the-valley-and-git-subtree/",
      "url": "https://elver.me/weeknotes/8-fire-in-the-valley-and-git-subtree/",
      "title": "Weeknotes 8: Fire in the Valley and git subtree",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAfter a reading hiatus that has lasted way too long I finished \u003ca href=\"https://www.goodreads.com/book/show/1427580\"\u003eFire in the\nValley: The Making of the Personal Computer\u003c/a\u003e last week (but I forgot to\nmention it then). I had next to no knowledge of how the Personal Computer was\ncreated despite owing my career to it. The only complaint I have is that it\ndoesn\u0026rsquo;t cover much of what was happening in Europe over the same time period\n(I wonder if it exists?) but it is entitled \u0026ldquo;Fire in the \u003cem\u003eValley\u003c/em\u003e\u0026rdquo; so it\u0026rsquo;s\nunderstandable.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe decided to move some services alongside each other in a single \u003ca href=\"https://en.wikipedia.org/wiki/Monorepo\"\u003emonorepo\u003c/a\u003e.\nThe source repo needed to live in a sub-directory of an existing repo, and\nideally I wanted to bring the commit history from the source repo along with\nthe code - it\u0026rsquo;s a shame to waste a well written commit history.\u003c/p\u003e\n\u003cp\u003eGoogling resulted in many methods, old and new, but in the end I setted on\nusing \u003ccode\u003egit subtree\u003c/code\u003e. It seemed to be the most straightforward way to move a\nrepo into another.\u003c/p\u003e\n\u003cp\u003eI pulled the external repo into a sub directory using:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit subtree add --prefix sub-directory/ path/to/source-repo/ master\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis resulted in a single commit and also brings along history.\u003c/p\u003e\n\u003cp\u003eStraying from normal day-to-day Git usage can be scary. There are many ways to\nachieve a goal and trying to find the \u003cem\u003eproper\u003c/em\u003e way to do it can be difficult,\nso hopefully this works out ok.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe Google Cloud Console continues to tell me lies about the state of running\nservices. They could do with dragging their slider to the right too - so slow.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAfter a reading hiatus that has lasted way too long I finished \u003ca href=\"https://www.goodreads.com/book/show/1427580\"\u003eFire in the\nValley: The Making of the Personal Computer\u003c/a\u003e last week (but I forgot to\nmention it then). I had next to no knowledge of how the Personal Computer was\ncreated despite owing my career to it. The only complaint I have is that it\ndoesn\u0026rsquo;t cover much of what was happening in Europe over the same time period\n(I wonder if it exists?) but it is entitled \u0026ldquo;Fire in the \u003cem\u003eValley\u003c/em\u003e\u0026rdquo; so it\u0026rsquo;s\nunderstandable.\u003c/p\u003e",
      "date_published": "2021-08-22T00:00:00+00:00",
      "date_modified": "2021-08-22T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/7-alpine-fun-and-games/",
      "url": "https://elver.me/weeknotes/7-alpine-fun-and-games/",
      "title": "Weeknotes 7: Alpine fun and games",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ePart of this week consisted of working on some bigger architectural ideas\nrather being heads down writing code. Finding a clean boundary within a system\ncan be hard but I think we might have managed it, and this particular idea\nwill make the system simpler as a whole, and hopefully sets a precedent for\nlikely future expansion. The prototype seems to make sense, so only time will\ntell how well it works out.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDocker related problems rearing their head this week. I built some Docker\nimages recently using \u003ca href=\"https://www.alpinelinux.org\"\u003eAlpine Linux\u003c/a\u003e as the base operating system. I\nchose Alpine because it\u0026rsquo;s well supported and is very small so you can keep the\noverall size of Docker images quite small. The Docker community seems to have\ndecided to standardize on Dockerfiles with either Alpine or Ubuntu as the base\nOS, so Alpine felt like a safe choice.\u003c/p\u003e\n\u003cp\u003eThis particular \u003ccode\u003eDockerfile\u003c/code\u003e installs various packages using Alpine\u0026rsquo;s \u003ccode\u003eapk\u003c/code\u003e\nand specifies exact versions. The idea being that this image should be\ndeterministic, that is, I could build it over and over and get the same result\nat the end.\u003c/p\u003e\n\u003cp\u003eWell, my Docker image started failing to build because the package version I\nspecified for one of my dependencies was no longer available. It turns out\nthat Alpine doesn\u0026rsquo;t keep old versions of a package around when a new version\nis released. Considering Alpine is very popular in combination with Docker\nthis decision seems strange.\u003c/p\u003e\n\u003cp\u003eA move away from Alpine seems probable, which is a shame.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe \u003ca href=\"https://github.com/marketplace?type=actions\u0026amp;query=slack\"\u003eGitHub Actions Marketplace\u003c/a\u003e has a few workflows\navailable to send notifications to Slack, but the top two by stars at the time\nof writing are \u003ca href=\"https://github.com/marketplace/actions/slack-notify\"\u003eSlack Notify\u003c/a\u003e and \u003ca href=\"https://github.com/marketplace/actions/action-slack\"\u003eaction-slack\u003c/a\u003e. I decided upon\naction-slack to improve the visibility of some build processes. It seemed\nslightly less \u003cem\u003efiddly\u003c/em\u003e than the other options. I\u0026rsquo;ve been enjoying automating\nmore things with Actions recently.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ePart of this week consisted of working on some bigger architectural ideas\nrather being heads down writing code. Finding a clean boundary within a system\ncan be hard but I think we might have managed it, and this particular idea\nwill make the system simpler as a whole, and hopefully sets a precedent for\nlikely future expansion. The prototype seems to make sense, so only time will\ntell how well it works out.\u003c/p\u003e",
      "date_published": "2021-08-15T00:00:00+00:00",
      "date_modified": "2021-08-15T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/6-windows-and-wurhammer/",
      "url": "https://elver.me/weeknotes/6-windows-and-wurhammer/",
      "title": "Weeknotes 6: Windows and Wurhammer",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNothing particularly noteworthy happened this week. I was feeling under the\nweather for a couple of days so that wiped out some time, and everything else\nwas pretty uneventful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI briefly played some \u003ca href=\"https://en.wikipedia.org/wiki/Warhammer_40,000:_Dawn_of_War\"\u003eWarhammer Dawn of War\u003c/a\u003e which of course meant\nfiring up my Windows PC, and enduring all that comes with that. Firstly, the\nnetwork cable didn\u0026rsquo;t work for unknown reasons (not strictly Windows\u0026rsquo; fault\n;)). Then, of course, all the things needed updating, which took an age. And\nfinally, just generally using Windows, which remains a shit-show after all\nthese years. I don\u0026rsquo;t understand all the recent converts back to Windows \u003cem\u003eat\nall\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eNeedless to say it didn\u0026rsquo;t have the relaxing affect I was looking for.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAn \u003ca href=\"https://chelseatroy.com/2019/12/18/reviewing-pull-requests/\"\u003einsightful article on Pull Request reviews\u003c/a\u003e caught my eye this\nweek. The author makes some great points about how to perform reviews.\u003c/p\u003e\n\u003cp\u003eFor me, reviews have always been framed as something else that you do for the\nteam in-between doing \u003cem\u003eactual\u003c/em\u003e work. As a result I feel like I can\u0026rsquo;t take as\nmuch time for the reviews as maybe I should. Perhaps this is a personal\nfailing, or a team cultural problem, or a mix of both.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m definitely going to be giving reviews more time in the future so that I\ncan do things like checking out and running code instead of just suggesting\nchanges directly on the PR. It\u0026rsquo;s very easy to suggest without testing - pseudo\ncode is fun and easy! - but I\u0026rsquo;m not sure this is helpful to the original\nauthor and, as pointed out in the article, can build resentment.\u003c/p\u003e\n\u003cp\u003eShe mentions that she sometimes pushes commits directly to the reviewee\u0026rsquo;s\nbranch. I originally thought that I would find that quite jarring - \u0026ldquo;what does\nthis person think they are doing pushing to my branch?!\u0026rdquo; - but upon further\nreflection I have changed my mind. If collaboration is the true aim of reviews\nthen why not?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eZoom APIs made an unwelcome return to my life this week. Third party APIs seem\nto have this knack for doing \u003cem\u003emost\u003c/em\u003e of what you want to do but making anything\nelse incredibly difficult.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/4-bye-bye-comfort-hello-hugo/\"\u003eThe chair\u003c/a\u003e is no more.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNothing particularly noteworthy happened this week. I was feeling under the\nweather for a couple of days so that wiped out some time, and everything else\nwas pretty uneventful.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI briefly played some \u003ca href=\"https://en.wikipedia.org/wiki/Warhammer_40,000:_Dawn_of_War\"\u003eWarhammer Dawn of War\u003c/a\u003e which of course meant\nfiring up my Windows PC, and enduring all that comes with that. Firstly, the\nnetwork cable didn\u0026rsquo;t work for unknown reasons (not strictly Windows\u0026rsquo; fault\n;)). Then, of course, all the things needed updating, which took an age. And\nfinally, just generally using Windows, which remains a shit-show after all\nthese years. I don\u0026rsquo;t understand all the recent converts back to Windows \u003cem\u003eat\nall\u003c/em\u003e.\u003c/p\u003e",
      "date_published": "2021-08-08T00:00:00+00:00",
      "date_modified": "2021-08-08T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/5-professional-bash-programmer/",
      "url": "https://elver.me/weeknotes/5-professional-bash-programmer/",
      "title": "Weeknotes 5: Professional Bash programmer",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA first for me again this week as I moved some holding pages for a couple of\ndomains to \u003ca href=\"https://pages.github.com\"\u003eGitHub Pages\u003c/a\u003e. The setup was fairly easy once I grokked\nthe DNS changes required. It\u0026rsquo;s a shame that GitHub\u0026rsquo;s help pages have become\nmore and more \u0026ldquo;enterprise-y\u0026rdquo; over the last few years though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wrote some Bash this week. Strangely I\u0026rsquo;ve never really written any Bash\nprofessionally (if you can call it that) before, only ever in my own tinkering\nwith side projects. It\u0026rsquo;s surprisingly difficult to do the most basic things\nand there are always half a dozen ways. How many systems are glued together\nusing Bash?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m working on getting a TIL site up and running. Since I first saw \u003ca href=\"https://github.com/jbranchaud/til\"\u003eJosh\nBranchaud\u003c/a\u003e do this I\u0026rsquo;ve thought it was a great idea. I\u0026rsquo;m not keen on\ncategorizing TILs using directories and manually keeping an index though.\u003c/p\u003e\n\u003cp\u003eI like the pureness of just having documents stored as a collection of\nMarkdown documents in directories, but without any metadata stored against the\nfiles it\u0026rsquo;s hard to do tagging.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m considering storing TILs as Markdown but with \u003ca href=\"https://gohugo.io/content-management/front-matter/\"\u003efrontmatter\u003c/a\u003e that Hugo can\nread and build, but keeping the documents separate from the build. One way to\nachieve this that I stumbled upon is using an orphaned branch in Git which\nshares no history with other branches. This allows having one branch for\ncontent only and one for the build tool setup, in this case Hugo.\u003c/p\u003e\n\u003cp\u003eYou can create an orphaned branch like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit checkout --orphan \u0026lt;name\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI\u0026rsquo;ll explore this idea soon.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eA first for me again this week as I moved some holding pages for a couple of\ndomains to \u003ca href=\"https://pages.github.com\"\u003eGitHub Pages\u003c/a\u003e. The setup was fairly easy once I grokked\nthe DNS changes required. It\u0026rsquo;s a shame that GitHub\u0026rsquo;s help pages have become\nmore and more \u0026ldquo;enterprise-y\u0026rdquo; over the last few years though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI wrote some Bash this week. Strangely I\u0026rsquo;ve never really written any Bash\nprofessionally (if you can call it that) before, only ever in my own tinkering\nwith side projects. It\u0026rsquo;s surprisingly difficult to do the most basic things\nand there are always half a dozen ways. How many systems are glued together\nusing Bash?\u003c/p\u003e",
      "date_published": "2021-08-01T00:00:00+00:00",
      "date_modified": "2021-08-01T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/4-bye-bye-comfort-hello-hugo/",
      "url": "https://elver.me/weeknotes/4-bye-bye-comfort-hello-hugo/",
      "title": "Weeknotes 4: Bye bye comfort. Hello Hugo.",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSlight cheat, this was started last week, which is how you\u0026rsquo;re able to read\nthis - but it has continued into this week so I think I\u0026rsquo;m off the hook. This\nsite is built using \u003ca href=\"https://gohugo.io\"\u003eHugo\u003c/a\u003e. The amount of static site generators these\ndays is crazy. Choosing is very difficult so I ended up with Hugo because 1)\nit\u0026rsquo;s a single binary that should continue to work for many years; 2) speed,\nit\u0026rsquo;s very quick to build; and 3) it\u0026rsquo;s well supported.\u003c/p\u003e\n\u003cp\u003eThe templating is a bit weird, but ok for my basic needs.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeaking of websites\u0026hellip;I am using \u003ca href=\"https://www.netlify.com\"\u003eNetlify\u003c/a\u003e to host the site. I have\nbeen slow to adopt the various \u0026ldquo;Jamstack\u0026rdquo; offerings, but so far I\u0026rsquo;m impressed.\nAnecdotally I don\u0026rsquo;t think that Netlify is \u003cem\u003equite\u003c/em\u003e as fast as one of my other\nsites hosted on Amazon S3/CloudFront but it\u0026rsquo;s still very quick, and deployment\nis easier. I really appreciate Netlify\u0026rsquo;s ability to preview pull requests and\nbranches, lovely stuff.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/weeknotes/3-office-furniture-and-javascript/\"\u003eThe chair\u003c/a\u003e arrived. Not sure what I think about it. I have spent\nmost of a week sitting in it, and I don\u0026rsquo;t love it. I probably \u003cem\u003eshould\u003c/em\u003e love it\nfor the amount of money it cost. Current plan is to return it. And the search\ncontinues again.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI was pleased to see that the Phoenix team are \u003ca href=\"https://twitter.com/josevalim/status/1417017859847475201\"\u003emoving away from using\nwebpack\u003c/a\u003e as the default and switching to \u003ca href=\"https://github.com/evanw/esbuild\"\u003eesbuild\u003c/a\u003e. A lot of\ntheir \u003ca href=\"https://twitter.com/chris_mccord/status/1417177471502503936\"\u003esupport issues are related to webpack\u003c/a\u003e, which is extremely\nunsurprising considering how hard webpack is to configure for even the most\nbasic needs, so it\u0026rsquo;s hard to argue with their reasoning. I haven\u0026rsquo;t used\nesbuild but I\u0026rsquo;ve heard reports that it\u0026rsquo;s good so I\u0026rsquo;m interested to see where\nit leads.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSlight cheat, this was started last week, which is how you\u0026rsquo;re able to read\nthis - but it has continued into this week so I think I\u0026rsquo;m off the hook. This\nsite is built using \u003ca href=\"https://gohugo.io\"\u003eHugo\u003c/a\u003e. The amount of static site generators these\ndays is crazy. Choosing is very difficult so I ended up with Hugo because 1)\nit\u0026rsquo;s a single binary that should continue to work for many years; 2) speed,\nit\u0026rsquo;s very quick to build; and 3) it\u0026rsquo;s well supported.\u003c/p\u003e",
      "date_published": "2021-07-25T00:00:00+00:00",
      "date_modified": "2021-07-25T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/3-office-furniture-and-javascript/",
      "url": "https://elver.me/weeknotes/3-office-furniture-and-javascript/",
      "title": "Weeknotes 3: Office furniture and JavaScript",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI ordered a new \u003ca href=\"https://eugaming.hermanmiller.com/products/embody-gaming-chair\"\u003eoffice chair\u003c/a\u003e this week. It\u0026rsquo;s been a long time coming.\nI\u0026rsquo;ve been considering, researching, investigating, and thinking about buying a\nnew chair for a few years now. Considering that my current chair is held in\nthe up position using a piece of uPVC pipe I think this is necessary.  It has\na 14 day \u0026ldquo;no-hassle\u0026rdquo; returns policy so I decided to take the plunge and try it\nfor a few days.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been writing JavaScript this week. It\u0026rsquo;s been a while since I\u0026rsquo;ve done so,\nso it\u0026rsquo;s been good|bad|terrible to be refreshing what I already know and also\nlearning some new things. I wrote some tests using \u003ca href=\"https://jestjs.io\"\u003eJest\u003c/a\u003e and extended a\n\u003ca href=\"https://koajs.com\"\u003eKoa\u003c/a\u003e based REST API.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRedis has always been a dumb cache to me. I suspect that is the way most\npeople use it - hook your app up and let it sit there being fast.  However, my\ncurrent project has greater needs than a simple cache.  We\u0026rsquo;re storing results\nfrom a streaming API and will need to pull the data out again sorted by\ntimestamp. \u003ca href=\"https://redis.io/topics/data-types#sorted-sets\"\u003eSorted sets\u003c/a\u003e seem to be just the ticket so I\u0026rsquo;ve been\ninvestigating how they work.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI ordered a new \u003ca href=\"https://eugaming.hermanmiller.com/products/embody-gaming-chair\"\u003eoffice chair\u003c/a\u003e this week. It\u0026rsquo;s been a long time coming.\nI\u0026rsquo;ve been considering, researching, investigating, and thinking about buying a\nnew chair for a few years now. Considering that my current chair is held in\nthe up position using a piece of uPVC pipe I think this is necessary.  It has\na 14 day \u0026ldquo;no-hassle\u0026rdquo; returns policy so I decided to take the plunge and try it\nfor a few days.\u003c/p\u003e",
      "date_published": "2021-07-18T00:00:00+00:00",
      "date_modified": "2021-07-18T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/2-github-actions-action/",
      "url": "https://elver.me/weeknotes/2-github-actions-action/",
      "title": "Weeknotes 2: GitHub Actions Action",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m writing a lot of docs at the moment. This might strike fear\ninto some, but I really like it. They really help me to\nunderstand what I\u0026rsquo;m trying to achieve. Communicating ideas with\nothers forces you to think more deeply about what you\u0026rsquo;re trying\nto do.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI finished up some Terraform config, and also learnt about \u003ca href=\"https://www.terraform.io/docs/language/state/workspaces.html\"\u003eTerraform\nworkspaces\u003c/a\u003e this week. They let you save different state per\nworkspace. Useful for different environments.  Use of workspaces is encouraged\nby some and frowned upon by others. It works for me though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eContinuing my journey into Docker - I\u0026rsquo;ve been learning about image tagging.\nUsing the \u003ccode\u003elatest\u003c/code\u003e tag with Docker images is very common it seems, but the\nbehaviour of \u003ccode\u003edocker\u003c/code\u003e is a bit odd. If you \u003cem\u003edon\u0026rsquo;t\u003c/em\u003e specify any tag then your\nimage will get \u003ccode\u003elatest\u003c/code\u003e by default. This is problematic if you rely on\n\u003ccode\u003elatest\u003c/code\u003e to pull your images into production as it\u0026rsquo;s very easy to not get the\nimage you thought you were getting. It\u0026rsquo;s probably worth tagging your images\nwith a specific tag and relying on that to save yourself potential future\nheadaches.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;m writing a lot of docs at the moment. This might strike fear\ninto some, but I really like it. They really help me to\nunderstand what I\u0026rsquo;m trying to achieve. Communicating ideas with\nothers forces you to think more deeply about what you\u0026rsquo;re trying\nto do.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI finished up some Terraform config, and also learnt about \u003ca href=\"https://www.terraform.io/docs/language/state/workspaces.html\"\u003eTerraform\nworkspaces\u003c/a\u003e this week. They let you save different state per\nworkspace. Useful for different environments.  Use of workspaces is encouraged\nby some and frowned upon by others. It works for me though.\u003c/p\u003e",
      "date_published": "2021-07-11T00:00:00+00:00",
      "date_modified": "2021-07-11T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/weeknotes/1-let-s-begin/",
      "url": "https://elver.me/weeknotes/1-let-s-begin/",
      "title": "Weeknotes 1: Let's Begin",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIt appears that I\u0026rsquo;m now doing weeknotes. My goal throughout 2020 was to blog\nmore. I set myself a target of one post per month to try and break down my\nperfectionism. It didn\u0026rsquo;t need to be perfect, I just needed to write something.\nI\u0026rsquo;m glad that I managed to accomplish it, but I don\u0026rsquo;t feel like I\u0026rsquo;ve formed\nthe habit to share, which was ultimately the real goal. I\u0026rsquo;m hoping the more\ninformal and regular nature of weeknotes will form a habit.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI\u0026rsquo;ve been learning lots of new things recently - Docker, Terraform, Google\nCloud. This is great! I\u0026rsquo;m feel that I\u0026rsquo;ve languished for quite a while -\nimposter syndrome is bad, and I\u0026rsquo;ve realised over time that I\u0026rsquo;m happiest when\nI\u0026rsquo;m learning. The trick is finding a working environment that allows learning\nwithout stress.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAs mentioned above I\u0026rsquo;ve become a devops expert, but which I mean I have some\nsmall amount of Docker, Terraform, and Google Cloud knowledge now. Still,\nhaving done very little with \u0026ldquo;the cloud\u0026rdquo; it\u0026rsquo;s been a big learning experience\nand I\u0026rsquo;ve enjoyed it. Don\u0026rsquo;t let anyone tell you its easier than Heroku though.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI met up with some work colleagues in a beer garden this week. It was strange\nto be amongst people.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIt appears that I\u0026rsquo;m now doing weeknotes. My goal throughout 2020 was to blog\nmore. I set myself a target of one post per month to try and break down my\nperfectionism. It didn\u0026rsquo;t need to be perfect, I just needed to write something.\nI\u0026rsquo;m glad that I managed to accomplish it, but I don\u0026rsquo;t feel like I\u0026rsquo;ve formed\nthe habit to share, which was ultimately the real goal. I\u0026rsquo;m hoping the more\ninformal and regular nature of weeknotes will form a habit.\u003c/p\u003e",
      "date_published": "2021-07-04T00:00:00+00:00",
      "date_modified": "2021-07-04T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/running-custom-ruby-with-cypress/",
      "url": "https://elver.me/blog/running-custom-ruby-with-cypress/",
      "title": "Running custom Ruby with Cypress",
      "content_html": "\u003cp\u003eI\u0026rsquo;ve been using \u003ca href=\"https://www.cypress.io\"\u003eCypress\u003c/a\u003e on a recent project to do end-to-end testing.\nFrom the brief introduction I\u0026rsquo;ve had so far, I\u0026rsquo;m impressed. The debugging\nexperience seems like it\u0026rsquo;s going to be considerably better than with tests\nwritten using \u003ca href=\"https://github.com/teamcapybara/capybara\"\u003eCapybara\u003c/a\u003e. Capybara is great, but Cypress\u0026rsquo;s visual\ndebugging is hard to compete against.\u003c/p\u003e\n\u003ch2 id=\"running-custom-ruby\"\u003eRunning custom Ruby\u003c/h2\u003e\n\u003cp\u003eThis project uses \u003ca href=\"https://github.com/shakacode/cypress-on-rails\"\u003eCypressOnRails\u003c/a\u003e to build a bridge between\ntests running within Cypress and Ruby-land, where the Rails app lives. In one\nparticular test I wanted to turn a feature switch on and off (using\n\u003ca href=\"https://github.com/jnunemaker/flipper\"\u003eFlipper\u003c/a\u003e). This required me calling some Ruby code from the Cypress\ntest.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eFlipper\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eenable(\u003cspan style=\"color:#990073\"\u003e:new_feature\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis is possible through \u003ccode\u003ecy.appEval\u003c/code\u003e added by CypressOnRails.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eit(\u003cspan style=\"color:#d14\"\u003e\u0026#39;Tests something with a feature switch turned on\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  cy.appEval(\u003cspan style=\"color:#d14\"\u003e\u0026#34;Flipper.enable(:new_feature)\u0026#34;\u003c/span\u003e).then(() =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    cy.visit(\u003cspan style=\"color:#d14\"\u003e\u0026#39;/a/page\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#998;font-style:italic\"\u003e// select some elements\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e    \u003cspan style=\"color:#998;font-style:italic\"\u003e// assert some things\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  })\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e})\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"making-it-reusable\"\u003eMaking it reusable\u003c/h2\u003e\n\u003cp\u003eCypress supports adding functions that can be re-used inside the\n\u003ccode\u003espec/cypress/support/commands.js\u003c/code\u003e file.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCypress.Commands.add(\u003cspan style=\"color:#d14\"\u003e\u0026#39;enableFeature\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e (flag) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  cy.appEval(\u003cspan style=\"color:#d14\"\u003e\u0026#39;Flipper.enable(:\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e+\u003c/span\u003e flag \u003cspan style=\"color:#000;font-weight:bold\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;)\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e});\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCypress.Commands.add(\u003cspan style=\"color:#d14\"\u003e\u0026#39;disableFeature\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e (flag) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  cy.appEval(\u003cspan style=\"color:#d14\"\u003e\u0026#39;Flipper.disable(:\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e+\u003c/span\u003e flag \u003cspan style=\"color:#000;font-weight:bold\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;)\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow we can call these functions throughout all our tests.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eit(\u003cspan style=\"color:#d14\"\u003e\u0026#39;Tests something with a feature switch turned on\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  cy.enableFeature(\u003cspan style=\"color:#d14\"\u003e\u0026#39;new_feature\u0026#39;\u003c/span\u003e) \u003cspan style=\"color:#998;font-style:italic\"\u003e// Turn it on\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  cy.visit(\u003cspan style=\"color:#d14\"\u003e\u0026#39;/a/page\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#998;font-style:italic\"\u003e// select some elements\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#998;font-style:italic\"\u003e// assert some things\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  cy.disableFeature(\u003cspan style=\"color:#d14\"\u003e\u0026#39;new_feature\u0026#39;\u003c/span\u003e) \u003cspan style=\"color:#998;font-style:italic\"\u003e// Turn it off again\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e})\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e",
      "summary": "\u003cp\u003eI\u0026rsquo;ve been using \u003ca href=\"https://www.cypress.io\"\u003eCypress\u003c/a\u003e on a recent project to do end-to-end testing.\nFrom the brief introduction I\u0026rsquo;ve had so far, I\u0026rsquo;m impressed. The debugging\nexperience seems like it\u0026rsquo;s going to be considerably better than with tests\nwritten using \u003ca href=\"https://github.com/teamcapybara/capybara\"\u003eCapybara\u003c/a\u003e. Capybara is great, but Cypress\u0026rsquo;s visual\ndebugging is hard to compete against.\u003c/p\u003e\n\u003ch2 id=\"running-custom-ruby\"\u003eRunning custom Ruby\u003c/h2\u003e\n\u003cp\u003eThis project uses \u003ca href=\"https://github.com/shakacode/cypress-on-rails\"\u003eCypressOnRails\u003c/a\u003e to build a bridge between\ntests running within Cypress and Ruby-land, where the Rails app lives. In one\nparticular test I wanted to turn a feature switch on and off (using\n\u003ca href=\"https://github.com/jnunemaker/flipper\"\u003eFlipper\u003c/a\u003e). This required me calling some Ruby code from the Cypress\ntest.\u003c/p\u003e",
      "date_published": "2021-04-30T00:00:00+00:00",
      "date_modified": "2021-04-30T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/til-about-markdown-reference-style-links/",
      "url": "https://elver.me/blog/til-about-markdown-reference-style-links/",
      "title": "TIL about Markdown reference style links",
      "content_html": "\u003cp\u003eAfter years of writing Markdown I only recently discovered that you can use any\nidentifier in a reference style link. I had made the incorrect assumption that\nthe identifier \u003cem\u003ehad\u003c/em\u003e to be a number, but no!\u003c/p\u003e\n\u003ch2 id=\"before\"\u003eBefore\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-markdown\" data-lang=\"markdown\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[I am an example link][1]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[1]: https://example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"after\"\u003eAfter\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-markdown\" data-lang=\"markdown\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[I am an example link][example]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[example]: https://example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI\u0026rsquo;ve spent a long time re-ordering/numbering my reference links in the past but\nthat should no longer be necessary.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eAfter years of writing Markdown I only recently discovered that you can use any\nidentifier in a reference style link. I had made the incorrect assumption that\nthe identifier \u003cem\u003ehad\u003c/em\u003e to be a number, but no!\u003c/p\u003e\n\u003ch2 id=\"before\"\u003eBefore\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-markdown\" data-lang=\"markdown\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[I am an example link][1]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[1]: https://example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"after\"\u003eAfter\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-markdown\" data-lang=\"markdown\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[I am an example link][example]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[example]: https://example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI\u0026rsquo;ve spent a long time re-ordering/numbering my reference links in the past but\nthat should no longer be necessary.\u003c/p\u003e",
      "date_published": "2021-03-13T00:00:00+00:00",
      "date_modified": "2021-03-13T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/converting-ebook-formats-with-ebook-convert/",
      "url": "https://elver.me/blog/converting-ebook-formats-with-ebook-convert/",
      "title": "Converting ebook formats with ebook-convert",
      "content_html": "\u003cp\u003eI need to convert between ebook formats on a regular basis so that I can read\nthem on my Kindle, and I prefer to do this on the command line as it\u0026rsquo;s quicker\nand easier.\u003c/p\u003e\n\u003cp\u003eI found a utility called \u003ccode\u003eebook-convert\u003c/code\u003e that comes included as part of\n\u003ca href=\"https://calibre-ebook.com\"\u003eCalibre\u003c/a\u003e, the ebook management behemouth, and it suits the task\nsuperbly.  It\u0026rsquo;s a shame to have to install such a big application to get access\nto a small utility, but I do sometimes use the metadata editing features of\nCalibre, so it\u0026rsquo;s a price I\u0026rsquo;m willing to pay.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s very easy to use and hasn\u0026rsquo;t failed me up to now.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eebook-convert *.epub .mobi \u003cspan style=\"color:#998;font-style:italic\"\u003e# from epub to mobi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eebook-convert *.mobi .epub \u003cspan style=\"color:#998;font-style:italic\"\u003e# from mobi to epub\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOther formats are also supported.\u003c/p\u003e\n\u003cp\u003eInstallable on macOS using \u003ccode\u003ebrew install calibre\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eYou might want to link the \u003ccode\u003eebook-convert\u003c/code\u003e binary to \u003ccode\u003e/usr/local/bin\u003c/code\u003e for easier\nusage after installation: \u003ccode\u003eln -s /Applications/calibre.app/Contents/MacOS/ebook-convert /usr/local/bin/ebook-convert\u003c/code\u003e\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI need to convert between ebook formats on a regular basis so that I can read\nthem on my Kindle, and I prefer to do this on the command line as it\u0026rsquo;s quicker\nand easier.\u003c/p\u003e\n\u003cp\u003eI found a utility called \u003ccode\u003eebook-convert\u003c/code\u003e that comes included as part of\n\u003ca href=\"https://calibre-ebook.com\"\u003eCalibre\u003c/a\u003e, the ebook management behemouth, and it suits the task\nsuperbly.  It\u0026rsquo;s a shame to have to install such a big application to get access\nto a small utility, but I do sometimes use the metadata editing features of\nCalibre, so it\u0026rsquo;s a price I\u0026rsquo;m willing to pay.\u003c/p\u003e",
      "date_published": "2021-02-28T00:00:00+00:00",
      "date_modified": "2021-02-28T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/combine-pdfs-on-the-command-line-with-pdfunite/",
      "url": "https://elver.me/blog/combine-pdfs-on-the-command-line-with-pdfunite/",
      "title": "Combine PDFs on the command line with pdfunite",
      "content_html": "\u003cp\u003eI often need a quick way to combine PDF pages into a single file. I\u0026rsquo;ve used\nmacOS\u0026rsquo;s Preview in the past but found it clunky so I went looking for a command\nline alternative.\u003c/p\u003e\n\u003cp\u003eThere seem to be many ways to do this, but I\u0026rsquo;ve found the \u003ccode\u003epdfunite\u003c/code\u003e utility\nto be the least friction method for me.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epdfunite file1.pdf file2.pdf destination.pdf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFiles are combined in the order you supply them in the arguments.\u003c/p\u003e\n\u003cp\u003eThankfully \u003ccode\u003epdfunite\u003c/code\u003e is easily installable on macOS, as part of the\n\u003ca href=\"https://poppler.freedesktop.org/\"\u003ePoppler\u003c/a\u003e project, using \u003ccode\u003ebrew install poppler\u003c/code\u003e.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI often need a quick way to combine PDF pages into a single file. I\u0026rsquo;ve used\nmacOS\u0026rsquo;s Preview in the past but found it clunky so I went looking for a command\nline alternative.\u003c/p\u003e\n\u003cp\u003eThere seem to be many ways to do this, but I\u0026rsquo;ve found the \u003ccode\u003epdfunite\u003c/code\u003e utility\nto be the least friction method for me.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epdfunite file1.pdf file2.pdf destination.pdf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFiles are combined in the order you supply them in the arguments.\u003c/p\u003e",
      "date_published": "2021-01-30T00:00:00+00:00",
      "date_modified": "2021-01-30T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/project-specific-gemrc-files-using-the-gemrc-environment-variable/",
      "url": "https://elver.me/blog/project-specific-gemrc-files-using-the-gemrc-environment-variable/",
      "title": "Project specific .gemrc files using the GEMRC environment variable",
      "content_html": "\u003cp\u003eRecently I needed to add a new \u003ca href=\"https://guides.rubygems.org/command-reference/#gem-sources\"\u003esource entry\u003c/a\u003e to my \u003ccode\u003e.gemrc\u003c/code\u003e for a\nprivate \u003ca href=\"https://rubygems.org/\"\u003eRubyGems\u003c/a\u003e server. I \u003ca href=\"https://github.com/jordelver/dotfiles/blob/master/gemrc\"\u003ecommit my \u003ccode\u003e.gemrc\u003c/code\u003e to\nGit\u003c/a\u003e, so this was a problem.  Not only because I don\u0026rsquo;t want\nproject specific changes cluttering up my \u003ccode\u003e.gemrc\u003c/code\u003e (I don\u0026rsquo;t), but also because\nthe URL of the source contains secrets that shouldn\u0026rsquo;t be shared.\u003c/p\u003e\n\u003cp\u003eMy default \u003ccode\u003egemrc\u003c/code\u003e \u003ccode\u003e:sources:\u003c/code\u003e entry looked like this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#555\"\u003e---\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000080\"\u003e:sources\u003c/span\u003e:\u003cspan style=\"color:#bbb\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e- https://rubygems.org\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThere doesn\u0026rsquo;t seem to be a supported way to have per-project \u003ccode\u003e.gemrc\u003c/code\u003e files but\nyou \u003cem\u003ecan\u003c/em\u003e \u003ca href=\"http://www.soulcutter.com/articles/hiding-gemrc-credentials-in-dotfiles.html\"\u003eoverride the file using the \u003ccode\u003eGEMRC\u003c/code\u003e\u003c/a\u003e\nenvironment variable. So if you can set a per-project \u003ccode\u003eGEMRC\u003c/code\u003e environment\nvariable, you \u003cem\u003ecan\u003c/em\u003e have a per-project \u003ccode\u003e.gemrc\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eI use \u003ca href=\"https://direnv.net/\"\u003e\u003ccode\u003edirenv\u003c/code\u003e\u003c/a\u003e to set environment variables for my projects by\ncreating a \u003ccode\u003e.envrc\u003c/code\u003e file in each of my project directories. So I can also use\nthat here. I just add a line like this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003eexport\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eGEMRC\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003epath/to/project/specific/gemrc\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd in that file I add the extra key to \u003ccode\u003e:sources:\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#555\"\u003e---\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000080\"\u003e:sources\u003c/span\u003e:\u003cspan style=\"color:#bbb\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e- https://rubygems.org\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e- https://user:pass@custom.gem.server\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI need to add the original \u003ccode\u003ehttps://rubygems.org\u003c/code\u003e source too because although\nthe \u003ccode\u003e~/.gemrc\u003c/code\u003e will still be read, the keys in the project specific file will\nreplace any keys with the same name completely - they are not merged. You can\nsee what values \u003ccode\u003egem\u003c/code\u003e is using by running \u003ccode\u003egem environment\u003c/code\u003e. Great for\ndebugging.\u003c/p\u003e\n\u003cp\u003eI think using \u003ccode\u003eGEMRC\u003c/code\u003e for this purpose is a reasonable workaround for\nper-project \u003ccode\u003e.gemrc\u003c/code\u003e files.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eRecently I needed to add a new \u003ca href=\"https://guides.rubygems.org/command-reference/#gem-sources\"\u003esource entry\u003c/a\u003e to my \u003ccode\u003e.gemrc\u003c/code\u003e for a\nprivate \u003ca href=\"https://rubygems.org/\"\u003eRubyGems\u003c/a\u003e server. I \u003ca href=\"https://github.com/jordelver/dotfiles/blob/master/gemrc\"\u003ecommit my \u003ccode\u003e.gemrc\u003c/code\u003e to\nGit\u003c/a\u003e, so this was a problem.  Not only because I don\u0026rsquo;t want\nproject specific changes cluttering up my \u003ccode\u003e.gemrc\u003c/code\u003e (I don\u0026rsquo;t), but also because\nthe URL of the source contains secrets that shouldn\u0026rsquo;t be shared.\u003c/p\u003e\n\u003cp\u003eMy default \u003ccode\u003egemrc\u003c/code\u003e \u003ccode\u003e:sources:\u003c/code\u003e entry looked like this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#555\"\u003e---\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000080\"\u003e:sources\u003c/span\u003e:\u003cspan style=\"color:#bbb\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e- https://rubygems.org\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThere doesn\u0026rsquo;t seem to be a supported way to have per-project \u003ccode\u003e.gemrc\u003c/code\u003e files but\nyou \u003cem\u003ecan\u003c/em\u003e \u003ca href=\"http://www.soulcutter.com/articles/hiding-gemrc-credentials-in-dotfiles.html\"\u003eoverride the file using the \u003ccode\u003eGEMRC\u003c/code\u003e\u003c/a\u003e\nenvironment variable. So if you can set a per-project \u003ccode\u003eGEMRC\u003c/code\u003e environment\nvariable, you \u003cem\u003ecan\u003c/em\u003e have a per-project \u003ccode\u003e.gemrc\u003c/code\u003e.\u003c/p\u003e",
      "date_published": "2020-12-06T00:00:00+00:00",
      "date_modified": "2020-12-06T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/vim-plugins-dont-have-to-be-hard/",
      "url": "https://elver.me/blog/vim-plugins-dont-have-to-be-hard/",
      "title": "Vim plugins don't have to be hard",
      "content_html": "\u003cp\u003eWhen pairing on something I will often insert \u003ca href=\"https://docs.github.com/en/free-pro-team@latest/github/committing-changes-to-your-project/creating-a-commit-with-multiple-authors#creating-co-authored-commits-on-the-command-line\"\u003eGitHub coauthorship\ninformation\u003c/a\u003e into a commit by adding \u003ccode\u003eCo-authored-by: name \u0026lt;name@example.com\u0026gt;\u003c/code\u003e to the bottom of a commit message. Both parties then get\ncredit for the work.  However, it\u0026rsquo;s a bit tedious to do this manually.\u003c/p\u003e\n\u003cp\u003eI went looking for a solution that could be triggered from within Vim and \u003ca href=\"https://github.com/maxjacobson/vim-fzf-coauthorship\"\u003efound\nthis nice little plugin\u003c/a\u003e. It gives you a command\n\u003ccode\u003e:Coauthorship\u003c/code\u003e which when run will show a list of Git repo contributors from\nwhom you can choose using the \u003ccode\u003efzf\u003c/code\u003e fuzzy finder. It\u0026rsquo;s really neat, and does\nexactly what I was looking for.\u003c/p\u003e\n\u003cp\u003eHere is the Vimscript in its entirety.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vimscript\" data-lang=\"vimscript\"\u003efunction! AttributeCoauthorship(nameAndEmail)\n  let attribution = \u0026#34;Co-authored-by: \u0026#34; . a:nameAndEmail\n  silent put =attribution\nendfunction\n\nfunction! Coauthorship()\n  call fzf#run({\n    \\ \u0026#39;source\u0026#39;: \u0026#39;git log --pretty=\u0026#34;%an \u0026lt;%ae\u0026gt;\u0026#34; | sort | uniq\u0026#39;,\n    \\ \u0026#39;sink\u0026#39;: function(\u0026#39;AttributeCoauthorship\u0026#39;),\n    \\ \u0026#39;options\u0026#39;: \u0026#34;--preview \u0026#39;git log -1 --author {} --pretty=\\\u0026#34;authored %h %ar:%n%n%B\\\u0026#34;\u0026#39;\u0026#34;\n    \\ })\nendfunction\n\ncommand! Coauthorship call Coauthorship()\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhat struck me is just how little code it takes to get something like this\nworking. Of course, it\u0026rsquo;s relying on external programs (\u003ccode\u003egit\u003c/code\u003e, \u003ccode\u003esort\u003c/code\u003e, \u003ccode\u003euniq\u003c/code\u003e)\nand libraries (the \u003ccode\u003efzf\u003c/code\u003e vim plugin code), but the \u003cem\u003eplumbing\u003c/em\u003e to compose this\nis small, concise, and easy to build upon. It feels like the unix philosophy in\naction.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve never gone as far as programming my editor for fear of thinking \u0026ldquo;this\nisn\u0026rsquo;t for me, its too hard\u0026rdquo; but this plugin has got me thinking that it \u003cem\u003emight\njust\u003c/em\u003e be for me after all.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eWhen pairing on something I will often insert \u003ca href=\"https://docs.github.com/en/free-pro-team@latest/github/committing-changes-to-your-project/creating-a-commit-with-multiple-authors#creating-co-authored-commits-on-the-command-line\"\u003eGitHub coauthorship\ninformation\u003c/a\u003e into a commit by adding \u003ccode\u003eCo-authored-by: name \u0026lt;name@example.com\u0026gt;\u003c/code\u003e to the bottom of a commit message. Both parties then get\ncredit for the work.  However, it\u0026rsquo;s a bit tedious to do this manually.\u003c/p\u003e\n\u003cp\u003eI went looking for a solution that could be triggered from within Vim and \u003ca href=\"https://github.com/maxjacobson/vim-fzf-coauthorship\"\u003efound\nthis nice little plugin\u003c/a\u003e. It gives you a command\n\u003ccode\u003e:Coauthorship\u003c/code\u003e which when run will show a list of Git repo contributors from\nwhom you can choose using the \u003ccode\u003efzf\u003c/code\u003e fuzzy finder. It\u0026rsquo;s really neat, and does\nexactly what I was looking for.\u003c/p\u003e",
      "date_published": "2020-11-20T00:00:00+00:00",
      "date_modified": "2020-11-20T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/rspec-like-doc-format-output-in-elixir-tests/",
      "url": "https://elver.me/blog/rspec-like-doc-format-output-in-elixir-tests/",
      "title": "RSpec-like doc format output in Elixir tests",
      "content_html": "\u003cp\u003eWhen running RSpec tests \u003ca href=\"https://relishapp.com/rspec/rspec-core/v/3-9/docs/command-line/format-option\"\u003eyou can pass a \u003ccode\u003e--format\u003c/code\u003e flag\u003c/a\u003e to \u003ccode\u003erspec\u003c/code\u003e\nto format test output in a more verbose style. The default output looks like this.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e....F.....*.....\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you pass \u003ccode\u003e--format documentation\u003c/code\u003e it will look more like this.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esomething\n  does something that passes\n  does something that fails (FAILED - 1)\n  does something that is pending (PENDING: Not Yet Implemented)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI find this output really helpful. It helps to visualise the \u003cem\u003eshape\u003c/em\u003e of the\ntests, and guides naming because you can see the visual hierarchy of how things\nfit together.\u003c/p\u003e\n\u003ch2 id=\"elixir-and-exunit\"\u003eElixir and ExUnit\u003c/h2\u003e\n\u003cp\u003eYou can achieve a very similar result to RSpec by passing \u003ccode\u003e--trace\u003c/code\u003e to \u003ccode\u003emix test\u003c/code\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emix test --trace\n\nTestApp.TimeDateHelper\n  * test relative_format/1 single hour, multiple minutes (0.00ms)\n  * test relative_format/1 greater than an hour (0.00ms)\n  * test relative_format/1 less than a minute (0.00ms)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can make this change across the whole test suite by changing the call to\n\u003ccode\u003eExUnit.start/1\u003c/code\u003e to include a trace option. This is usually in your\n\u003ccode\u003etest/test_helper.exs\u003c/code\u003e file.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#458;font-weight:bold\"\u003eExUnit\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003estart(\u003cspan style=\"color:#990073\"\u003etrace\u003c/span\u003e: \u003cspan style=\"color:#008080\"\u003etrue\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBe aware though, this might not be what you want. From \u003ca href=\"https://hexdocs.pm/ex_unit/ExUnit.html#configure/1-options\"\u003ethe ExUnit\ndocs\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote style=\"text-align: left; margin: 0;\"\u003e\n  \u003cp style=\"margin: 0;\"\u003e\n    ...sets ExUnit into trace mode, \u003cstrong\u003ethis sets :max_cases to 1\u003c/strong\u003e\n    and prints each test case and test while running...\n  \u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSetting \u003ccode\u003etrace: true\u003c/code\u003e will also set \u003ccode\u003emax_cases: 1\u003c/code\u003e which will reduce the amount\nof tests that are run in parallel.\u003c/p\u003e\n\u003cp\u003eSo this could slow down your test suite. Be careful!\u003c/p\u003e\n",
      "summary": "\u003cp\u003eWhen running RSpec tests \u003ca href=\"https://relishapp.com/rspec/rspec-core/v/3-9/docs/command-line/format-option\"\u003eyou can pass a \u003ccode\u003e--format\u003c/code\u003e flag\u003c/a\u003e to \u003ccode\u003erspec\u003c/code\u003e\nto format test output in a more verbose style. The default output looks like this.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e....F.....*.....\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you pass \u003ccode\u003e--format documentation\u003c/code\u003e it will look more like this.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esomething\n  does something that passes\n  does something that fails (FAILED - 1)\n  does something that is pending (PENDING: Not Yet Implemented)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI find this output really helpful. It helps to visualise the \u003cem\u003eshape\u003c/em\u003e of the\ntests, and guides naming because you can see the visual hierarchy of how things\nfit together.\u003c/p\u003e",
      "date_published": "2020-10-24T00:00:00+00:00",
      "date_modified": "2020-10-24T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/gitattributes/",
      "url": "https://elver.me/blog/gitattributes/",
      "title": "Using gitattributes to improve git output",
      "content_html": "\u003cp\u003eFrom the git man page:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA gitattributes file is a simple text file that gives attributes to pathnames.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://www.git-scm.com/docs/gitattributes\"\u003e\u003ccode\u003egitattributes\u003c/code\u003e\u003c/a\u003e allows you to tell git that files should be\ntreated in certain ways. You can use git attributes to apply various attributes\nbut we\u0026rsquo;re focussing on \u003ccode\u003ediff\u003c/code\u003e. For example, this tells git that files ending in\n\u003ccode\u003e*.ex\u003c/code\u003e should be treated as Elixir code during diff operations.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e*.ex diff=elixir\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI couldn\u0026rsquo;t get the standard \u003ccode\u003e~/.gitattributes\u003c/code\u003e file location to work for me so I\ndecided to take this opportunity to standardise all my git config under\n\u003ccode\u003e~/.config/git\u003c/code\u003e instead.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTIP\u003c/strong\u003e You can use \u003ca href=\"https://www.git-scm.com/docs/git-check-attr\"\u003e\u003ccode\u003egit check-attr --all -- path/to/file\u003c/code\u003e\u003c/a\u003e to\ncheck which attributes are applying to a file. This is very useful during setup.\u003c/p\u003e\n\u003cp\u003eSo what effect does this have?\u003c/p\u003e\n\u003ch2 id=\"hunk-output\"\u003eHunk output\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s a simple example. On line 5 we can see a change, but that isn\u0026rsquo;t the\nimportant part. The interesting difference is what\u0026rsquo;s shown on line 1 after the\nfilename. In this case it\u0026rsquo;s \u003ccode\u003edefmodule TestWeb.ListController\u003c/code\u003e which in the\nElixir \u003cstrong\u003emodule\u003c/strong\u003e in which the change has been made.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-patch\" data-lang=\"patch\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#aaa\"\u003e@ path/to/file.ex:25 @ defmodule TestWeb.ListController do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#aaa\"\u003e\u003c/span\u003e     {:ok, _list} = Lists.delete_list(list)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     conn\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+    |\u0026gt; put_flash(:info, \u0026#34;List deleted successfully.\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e-    |\u0026gt; put_flash(:info, \u0026#34;List deleted successfully\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e\u003c/span\u003e     |\u0026gt; redirect(to: Routes.list_path(conn, :index))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   end\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e end\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf we add \u003ccode\u003e*.ex diff=elixir\u003c/code\u003e to the attributes file we see \u003ccode\u003edef delete(conn, %{\u0026quot;id\u0026quot; =\u0026gt; id})\u003c/code\u003e, which is the \u003cstrong\u003efunction\u003c/strong\u003e containing the change. Far more\nspecific.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-patch\" data-lang=\"patch\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#aaa\"\u003e@ path/to/file.ex:25 @ def delete(conn, %{\u0026#34;id\u0026#34; =\u0026gt; id}) do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#aaa\"\u003e\u003c/span\u003e     {:ok, _list} = Lists.delete_list(list)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     conn\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+    |\u0026gt; put_flash(:info, \u0026#34;List deleted successfully.\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e-    |\u0026gt; put_flash(:info, \u0026#34;List deleted successfully\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e\u003c/span\u003e     |\u0026gt; redirect(to: Routes.list_path(conn, :index))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   end\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e end\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"--function-context\"\u003e\u0026ndash;function-context\u003c/h2\u003e\n\u003cp\u003eAdding this setting also changes the way that\n\u003ca href=\"https://www.git-scm.com/docs/git-diff#Documentation/git-diff.txt---function-context\"\u003e\u003ccode\u003e--function-context\u003c/code\u003e\u003c/a\u003e works. What is \u003ccode\u003e--function-context\u003c/code\u003e? It\ncan be passed to \u003ccode\u003egit diff\u003c/code\u003e (and other subcommands) and will show the full\nchange in the full context of where the change has been made.  By default this\nmeans it will show the \u003cem\u003efull\u003c/em\u003e module, which is probably not what you want most\nof the time.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-patch\" data-lang=\"patch\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#aaa\"\u003e@ path/to/file.ex:25 @ def delete(conn, %{\u0026#34;id\u0026#34; =\u0026gt; id}) do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#aaa\"\u003e\u003c/span\u003e defmodule TestWeb.ListController do\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   use TestWeb, :controller\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   # ...other functions removed for brevity\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   def delete(conn, %{\u0026#34;id\u0026#34; =\u0026gt; id}) do\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     list = Lists.get_list!(id)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     {:ok, _list} = Lists.delete_list(list)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     conn\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+    |\u0026gt; put_flash(:info, \u0026#34;List deleted successfully.\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e-    |\u0026gt; put_flash(:info, \u0026#34;List deleted successfully\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e\u003c/span\u003e     |\u0026gt; redirect(to: Routes.list_path(conn, :index))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   end\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e end\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eHowever, with the change to \u003ccode\u003egitattributes\u003c/code\u003e, the \u0026ldquo;function context\u0026rdquo; becomes the\n\u003cem\u003eactual\u003c/em\u003e function.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-patch\" data-lang=\"patch\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#aaa\"\u003e@ path/to/file.ex:25 @ def delete(conn, %{\u0026#34;id\u0026#34; =\u0026gt; id}) do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#aaa\"\u003e\u003c/span\u003e   def delete(conn, %{\u0026#34;id\u0026#34; =\u0026gt; id}) do\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     list = Lists.get_list!(id)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     {:ok, _list} = Lists.delete_list(list)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     conn\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+    |\u0026gt; put_flash(:info, \u0026#34;List deleted successfully.\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e-    |\u0026gt; put_flash(:info, \u0026#34;List deleted successfully\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e\u003c/span\u003e     |\u0026gt; redirect(to: Routes.list_path(conn, :index))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   end\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e end\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIt\u0026rsquo;s strange that a lot of the available \u003ccode\u003egitattibutes\u003c/code\u003e are not defaults in git.\nBut with a few simple tweaks you can get more useful git output.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eFrom the git man page:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA gitattributes file is a simple text file that gives attributes to pathnames.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://www.git-scm.com/docs/gitattributes\"\u003e\u003ccode\u003egitattributes\u003c/code\u003e\u003c/a\u003e allows you to tell git that files should be\ntreated in certain ways. You can use git attributes to apply various attributes\nbut we\u0026rsquo;re focussing on \u003ccode\u003ediff\u003c/code\u003e. For example, this tells git that files ending in\n\u003ccode\u003e*.ex\u003c/code\u003e should be treated as Elixir code during diff operations.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e*.ex diff=elixir\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI couldn\u0026rsquo;t get the standard \u003ccode\u003e~/.gitattributes\u003c/code\u003e file location to work for me so I\ndecided to take this opportunity to standardise all my git config under\n\u003ccode\u003e~/.config/git\u003c/code\u003e instead.\u003c/p\u003e",
      "date_published": "2020-09-30T00:00:00+00:00",
      "date_modified": "2020-09-30T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/how-to-get-a-list-of-filenames-from-a-plex-playlist/",
      "url": "https://elver.me/blog/how-to-get-a-list-of-filenames-from-a-plex-playlist/",
      "title": "How to get a list of filenames from a Plex playlist",
      "content_html": "\u003cp\u003eI recently wanted to delete some files from my Plex server. Plex has a feature\nto allow deleting of files through the web interface, but it makes me feel\nslightly uneasy having that feature turned on due to security concerns, so I\nchose to keep it off, and for this one-off task I decided to delete the files\nmanually.\u003c/p\u003e\n\u003cp\u003eI needed a list of filenames so I started by adding all the files I wanted to\ndelete to a playlist called \u0026ldquo;To Delete\u0026rdquo;. Plex uses a SQLite database to store\nmetadata. This is what I used to get the information from the playlist.\u003c/p\u003e\n\u003cp\u003eConnect to the SQLite database like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esqlite3 \u003cspan style=\"color:#d14\"\u003e\u0026#39;/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-in Support/Databases/com.plexapp.plugins.library.db\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe can then list all playlists. The \u003ccode\u003e15\u003c/code\u003e in \u003ccode\u003emetadata_type = 15\u003c/code\u003e is for\nplaylists.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esqlite\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eselect\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003etitle\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003emetadata_items\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003ewhere\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003emetadata_type\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#099\"\u003e15\u003c/span\u003e;\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYou can see that the output includes the \u0026ldquo;To Delete\u0026rdquo; playlist.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eChristmas\nPixar\nComedy classics\nStar Wars\nTo Delete\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIdeally, we\u0026rsquo;d like a list of filenames in a text file. This makes it easy to\nprocess later. The \u003ccode\u003esqlite\u003c/code\u003e client has a \u003ccode\u003e.output\u003c/code\u003e command that allows you to\nredirect output from queries to an external file.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esqlite\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e.\u003cspan style=\"color:#000;font-weight:bold\"\u003eoutput\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003efiles\u003cspan style=\"color:#000;font-weight:bold\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eto\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003edelete\u003c/span\u003e.txt\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWhen we run subsequent queries, the output will end up in \u003ccode\u003efiles-to-delete.txt\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eNow, we can run a query to get a list of filenames. I won\u0026rsquo;t pretend to\nunderstand the whole structure of this query, but it works for me. Thanks to\n\u003ca href=\"https://www.reddit.com/r/PleX/comments/3cbku8/export_list_of_file_paths_in_a_plex_playlist_for/\"\u003ethis Reddit thread\u003c/a\u003e. Note the \u003ccode\u003ewhere metadata_items.title = 'To Delete'\u003c/code\u003e clause where we specify the playlist name.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esqlite\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eselect\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003efile\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003emedia_parts\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eleft\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eouter\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003ejoin\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003emedia_items\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003emedia_items.id\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003emedia_parts.media_item_id\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eleft\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eouter\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003ejoin\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003eplay_queue_generators\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003eplay_queue_generators.metadata_item_id\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003emedia_items.metadata_item_id\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eleft\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eouter\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003ejoin\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003emetadata_items\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003emetadata_items.id\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003eplay_queue_generators.playlist_id\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003ewhere\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003emetadata_items.title\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;To Delete\u0026#39;\u003c/span\u003e;\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe \u003ccode\u003efiles-to-delete.txt\u003c/code\u003e file now contains a list of filenames for the movies\non the \u0026ldquo;To Delete\u0026rdquo; playlist. We can now use that list to delete the files. In my\ncase, I used a loop in fish shell.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003efor\u003c/span\u003e f in \u003cspan style=\"color:#000;font-weight:bold\"\u003e(\u003c/span\u003ecat files-to-delete.txt\u003cspan style=\"color:#000;font-weight:bold\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  rm -i -v \u003cspan style=\"color:#008080\"\u003e$f\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eend\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThere are certainly many ways to do this, but this is how I did it.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI recently wanted to delete some files from my Plex server. Plex has a feature\nto allow deleting of files through the web interface, but it makes me feel\nslightly uneasy having that feature turned on due to security concerns, so I\nchose to keep it off, and for this one-off task I decided to delete the files\nmanually.\u003c/p\u003e\n\u003cp\u003eI needed a list of filenames so I started by adding all the files I wanted to\ndelete to a playlist called \u0026ldquo;To Delete\u0026rdquo;. Plex uses a SQLite database to store\nmetadata. This is what I used to get the information from the playlist.\u003c/p\u003e",
      "date_published": "2020-08-31T00:00:00+00:00",
      "date_modified": "2020-08-31T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/renaming-files-vim-style/",
      "url": "https://elver.me/blog/renaming-files-vim-style/",
      "title": "Renaming files Vim-style",
      "content_html": "\u003cp\u003eI’ve \u003ca href=\"/blog/renaming-files-like-a-pro/\"\u003epreviously written about renaming files\u003c/a\u003e with the \u003ccode\u003erename\u003c/code\u003e\nutility.  \u003ccode\u003erename\u003c/code\u003e uses sed-like syntax with regular expressions to rename\nfiles, which are very powerful, but can be a bit tricky to get right.\u003c/p\u003e\n\u003cp\u003eI recently came across \u003ca href=\"https://github.com/thameera/vimv\"\u003evimv\u003c/a\u003e, which is a utility (written in bash) to\nlet you use the full power of Vim to rename files. As a vim user being able to\nuse the same patterns I would use when writing code is very appealing.\u003c/p\u003e\n\u003cscript id=\"asciicast-RfVtJfuoplCMZd50vESXbOAFR\"\nsrc=\"https://asciinema.org/a/RfVtJfuoplCMZd50vESXbOAFR.js\" async\u003e\u003c/script\u003e\n\u003cp\u003eIt\u0026rsquo;s a great idea, and it turns out that this is also not a new idea. Many other\ntools have very similar abilities as pointed out by many great \u003ca href=\"https://twitter.com/MasteringVim/status/1270720407272738818\"\u003ereplies to the\noriginal tweet\u003c/a\u003e. Some of tools that offer this ability\ninclude (in order of discovery) the aforementioned vimv; three different file\nmanagers: \u003ca href=\"https://github.com/ranger/ranger\"\u003eranger\u003c/a\u003e, \u003ca href=\"https://github.com/jarun/nnn\"\u003ennn\u003c/a\u003e, and \u003ca href=\"https://github.com/vifm/vifm\"\u003evifm\u003c/a\u003e; \u003ca href=\"https://github.com/trapd00r/vidir\"\u003evidir\u003c/a\u003e; and\n\u003ca href=\"http://www.nongnu.org/renameutils/\"\u003eqmv\u003c/a\u003e, from renameutils (around since 2001!).\u003c/p\u003e\n\u003cscript id=\"asciicast-Scwm0G1Qc70AgaOKhiHdezKSr\"\nsrc=\"https://asciinema.org/a/Scwm0G1Qc70AgaOKhiHdezKSr.js\" async\u003e\u003c/script\u003e\n\u003cp\u003eWe are spoilt for choice! I already use \u003ccode\u003ennn\u003c/code\u003e so I will be making use of it\u0026rsquo;s\n\u0026ldquo;batch rename\u0026rdquo; feature on my file server. For other cases I think I\u0026rsquo;ll be\nreaching for \u003ccode\u003eqmv\u003c/code\u003e as it\u0026rsquo;s very mature, and simple to use. Try out one that\nworks for you.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI’ve \u003ca href=\"/blog/renaming-files-like-a-pro/\"\u003epreviously written about renaming files\u003c/a\u003e with the \u003ccode\u003erename\u003c/code\u003e\nutility.  \u003ccode\u003erename\u003c/code\u003e uses sed-like syntax with regular expressions to rename\nfiles, which are very powerful, but can be a bit tricky to get right.\u003c/p\u003e\n\u003cp\u003eI recently came across \u003ca href=\"https://github.com/thameera/vimv\"\u003evimv\u003c/a\u003e, which is a utility (written in bash) to\nlet you use the full power of Vim to rename files. As a vim user being able to\nuse the same patterns I would use when writing code is very appealing.\u003c/p\u003e",
      "date_published": "2020-07-12T00:00:00+00:00",
      "date_modified": "2020-07-12T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/get-video-urls-from-a-youtube-playlist/",
      "url": "https://elver.me/blog/get-video-urls-from-a-youtube-playlist/",
      "title": "Get video URLs from a YouTube playlist",
      "content_html": "\u003cp\u003eI wanted to make my own list of YouTube video URLs today, and as far as I can\ntell, YouTube doesn\u0026rsquo;t let you do that. The excellent tool\n\u003ca href=\"https://github.com/ytdl-org/youtube-dl\"\u003e\u003ccode\u003eyoutube-dl\u003c/code\u003e\u003c/a\u003e came to the rescue, along with a post on\n\u003ca href=\"https://askubuntu.com/questions/1090510/how-to-download-a-playlist-without-the-videos\"\u003easkubuntu\u003c/a\u003e that combines it with \u003ccode\u003ejq\u003c/code\u003e and \u003ccode\u003esed\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eI wanted to output the video URLs \u003cem\u003eand\u003c/em\u003e the titles, and it turns out this can be\nachieved with \u003ccode\u003ejq\u003c/code\u003e on it\u0026rsquo;s own. I changed the \u003ccode\u003ejq\u003c/code\u003e portion and the final\ncommandline looks like this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eyoutube-dl --dump-json --flat-playlist \u003cspan style=\"color:#d14\"\u003e\u0026#34;https://www.youtube.com/playlist?list=PL46-cKSxMYYCMpzXo6p0Cof8hJInYgohU\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  | jq -r \u003cspan style=\"color:#d14\"\u003e\u0026#39;\u0026#34;\\(.title)\\nhttps://youtu.be/\\(.id)\\n\u0026#34;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis outputs something like:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eVim Un-Alphabet 01: Teaser\nhttps://youtu.be/7LDlUMMbv6k\n\nVim Un-Alphabet 02: Help\nhttps://youtu.be/ZTCzWRqR_us\n\nVim Un-Alphabet 03: Tilde\nhttps://youtu.be/5jMiYtXz2QA\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOf course, we can pipe the result of this to a file by appending \u003ccode\u003e \u0026gt; result.txt\u003c/code\u003e\nor, in my case, straight to the clipboard with \u003ccode\u003e | pbcopy\u003c/code\u003e.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI wanted to make my own list of YouTube video URLs today, and as far as I can\ntell, YouTube doesn\u0026rsquo;t let you do that. The excellent tool\n\u003ca href=\"https://github.com/ytdl-org/youtube-dl\"\u003e\u003ccode\u003eyoutube-dl\u003c/code\u003e\u003c/a\u003e came to the rescue, along with a post on\n\u003ca href=\"https://askubuntu.com/questions/1090510/how-to-download-a-playlist-without-the-videos\"\u003easkubuntu\u003c/a\u003e that combines it with \u003ccode\u003ejq\u003c/code\u003e and \u003ccode\u003esed\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eI wanted to output the video URLs \u003cem\u003eand\u003c/em\u003e the titles, and it turns out this can be\nachieved with \u003ccode\u003ejq\u003c/code\u003e on it\u0026rsquo;s own. I changed the \u003ccode\u003ejq\u003c/code\u003e portion and the final\ncommandline looks like this.\u003c/p\u003e",
      "date_published": "2020-06-11T00:00:00+00:00",
      "date_modified": "2020-06-11T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/fixing-commits-with-git-commit-fixup-and-git-rebase-autosquash/",
      "url": "https://elver.me/blog/fixing-commits-with-git-commit-fixup-and-git-rebase-autosquash/",
      "title": "Fixing commits with git commit --fixup and git rebase --autosquash",
      "content_html": "\u003cp\u003eThe way I like to make changes in response to a PR review is to make any fixes\nto the original commits using a rebase. I don\u0026rsquo;t want commits that \u0026ldquo;fix typos\u0026rdquo; in\nmy history, especially at the feature branch level. There are varying opinions\nand approaches to this, but I think rebasing is great tool when used on your \u003cem\u003eown\u003c/em\u003e\nbranches and in moderation.\u003c/p\u003e\n\u003cp\u003eStandard procedure for this is - 1) Make the code change; 2) Commit the change;\n3) Start an interactive rebase; 4) Identify the commit that needs fixing; 5)\nMove the new commit underneath it; 6) Change it to \u0026ldquo;squash\u0026rdquo;. It\u0026rsquo;s quite tedious.\u003c/p\u003e\n\u003ch2 id=\"fixup-commits\"\u003eFixup commits\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---fixupltcommitgt\"\u003eFixup commits\u003c/a\u003e are created using \u003ccode\u003egit commit --fixup \u0026lt;SHA\u0026gt;\u003c/code\u003e.\nPractically, \u003ccode\u003e--fixup\u003c/code\u003e associates a new commit with an existing commit so that\nwhen you do an interactive rebase, you don\u0026rsquo;t have to re-order any commits in\norder to squash them. And you don\u0026rsquo;t have to change any commit messages. From the\ndocs:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eConstruct a commit message for use with rebase \u0026ndash;autosquash.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"--autosquash\"\u003e\u0026ndash;autosquash?\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---autosquash\"\u003e\u003ccode\u003e--autosquash\u003c/code\u003e\u003c/a\u003e is a flag to use with \u003ccode\u003erebase\u003c/code\u003e and takes everything\na step further. Once you\u0026rsquo;ve committed your changes with \u003ccode\u003egit commit --fixup \u0026lt;SHA\u0026gt;\u003c/code\u003e you can start an interactive rebase as normal, but pass the\n\u003ccode\u003e--autosquash\u003c/code\u003e flag too.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egit rebase -i --autosquash master\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow you won\u0026rsquo;t have to do anything, the rebase will automatically take care of\nsquashing those commits created with \u003ccode\u003e--fixup\u003c/code\u003e in the correct order!\u003c/p\u003e\n\u003cp\u003eYou can have this behaviour by default, which seems safe and sensible, by\nsetting \u003ccode\u003eautosquash = true\u003c/code\u003e in your \u003ccode\u003e~/.gitconfig\u003c/code\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[rebase]\n  autosquash = true\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"automating-further\"\u003eAutomating further\u003c/h2\u003e\n\u003cp\u003eI use \u003ccode\u003e--fixup\u003c/code\u003e so much that I have a helper alias in my \u003ccode\u003e~/.gitconfig\u003c/code\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[alias]\n  fixup = \u0026#34;!git log -n 50 --pretty=format:\u0026#39;%h %s\u0026#39; --no-merges | fzf | cut -c -7 | xargs -o git commit --fixup\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis lets me type \u003ccode\u003egit fixup\u003c/code\u003e and presents a list of my 50 most recent commits\nand allows me to search the list using fzf. Once a commit is selected, the SHA\nis passed to \u003ccode\u003egit commit --fixup\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIt works like this:\u003c/p\u003e\n\u003cscript id=\"asciicast-nyRPY9XaPPtC39ihVDgoN3anH\"\nsrc=\"https://asciinema.org/a/nyRPY9XaPPtC39ihVDgoN3anH.js\" async\u003e\u003c/script\u003e\n\u003cp\u003eI hope this makes your commit fixing easier!\u003c/p\u003e\n",
      "summary": "\u003cp\u003eThe way I like to make changes in response to a PR review is to make any fixes\nto the original commits using a rebase. I don\u0026rsquo;t want commits that \u0026ldquo;fix typos\u0026rdquo; in\nmy history, especially at the feature branch level. There are varying opinions\nand approaches to this, but I think rebasing is great tool when used on your \u003cem\u003eown\u003c/em\u003e\nbranches and in moderation.\u003c/p\u003e\n\u003cp\u003eStandard procedure for this is - 1) Make the code change; 2) Commit the change;\n3) Start an interactive rebase; 4) Identify the commit that needs fixing; 5)\nMove the new commit underneath it; 6) Change it to \u0026ldquo;squash\u0026rdquo;. It\u0026rsquo;s quite tedious.\u003c/p\u003e",
      "date_published": "2020-06-04T00:00:00+00:00",
      "date_modified": "2020-06-04T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/history-deleting-helper-for-fish-shell/",
      "url": "https://elver.me/blog/history-deleting-helper-for-fish-shell/",
      "title": "History deleting helper for Fish shell",
      "content_html": "\u003cp\u003eI \u003ca href=\"/blog/deleting-fish-shell-history/\"\u003ewrote back in February\u003c/a\u003e about a neat \u003ccode\u003ehistory\u003c/code\u003e command built-in to the Fish\nshell that allows you to, amongst other things, delete entries from your\nhistory.\u003c/p\u003e\n\u003cp\u003eTo recap, you use it like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#0086b3\"\u003ehistory\u003c/span\u003e delete --contains \u003cspan style=\"color:#d14\"\u003e\u0026#34;mix echo\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e1\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#0086b3\"\u003ehistory\u003c/span\u003e search --contains \u003cspan style=\"color:#d14\"\u003e\u0026#34;mix echo\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e2\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e mix echo.migrate\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e3\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e mix echo.create\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e4\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e mix echo.reset\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e5\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e mix echo.setup\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter nothing to cancel the delete, or\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter one or more of the entry IDs separated by a space, or\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter \u003cspan style=\"color:#d14\"\u003e\u0026#34;all\u0026#34;\u003c/span\u003e to delete all the matching entries.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003eI\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e Delete which entries? \u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis is really cool, but the only thing missing for me was the ability to\nfuzzily find history entries, so I wrote a quick Fish function to combine\n\u003ccode\u003ehistory\u003c/code\u003e with \u003ca href=\"https://github.com/junegunn/fzf\"\u003e\u003ccode\u003efzf\u003c/code\u003e\u003c/a\u003e, my favourite shell program. I also made a small\nchange to the history command by swapping \u003ccode\u003e--contains\u003c/code\u003e for \u003ccode\u003e--prefix\u003c/code\u003e which\nmakes more sense when combined with \u003ccode\u003efzf\u003c/code\u003e as the search is more constrained.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e dh -d \u003cspan style=\"color:#d14\"\u003e\u0026#34;Fuzzily delete entries from your history\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#0086b3\"\u003ehistory\u003c/span\u003e | fzf | \u003cspan style=\"color:#0086b3\"\u003eread\u003c/span\u003e -l item; and \u003cspan style=\"color:#0086b3\"\u003ehistory\u003c/span\u003e delete --prefix \u003cspan style=\"color:#d14\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003e$item\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eend\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow you can type \u003ccode\u003edh\u003c/code\u003e and fuzzily search for history before being dropped into\nthe interactive prompt as usual.\u003c/p\u003e\n\u003cscript id=\"asciicast-hoIxMqnjYe9qjg4uA46EC0rRG\"\nsrc=\"https://asciinema.org/a/hoIxMqnjYe9qjg4uA46EC0rRG.js\" async\u003e\u003c/script\u003e\n",
      "summary": "\u003cp\u003eI \u003ca href=\"/blog/deleting-fish-shell-history/\"\u003ewrote back in February\u003c/a\u003e about a neat \u003ccode\u003ehistory\u003c/code\u003e command built-in to the Fish\nshell that allows you to, amongst other things, delete entries from your\nhistory.\u003c/p\u003e\n\u003cp\u003eTo recap, you use it like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#0086b3\"\u003ehistory\u003c/span\u003e delete --contains \u003cspan style=\"color:#d14\"\u003e\u0026#34;mix echo\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e1\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#0086b3\"\u003ehistory\u003c/span\u003e search --contains \u003cspan style=\"color:#d14\"\u003e\u0026#34;mix echo\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e2\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e mix echo.migrate\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e3\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e mix echo.create\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e4\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e mix echo.reset\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e5\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e mix echo.setup\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter nothing to cancel the delete, or\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter one or more of the entry IDs separated by a space, or\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter \u003cspan style=\"color:#d14\"\u003e\u0026#34;all\u0026#34;\u003c/span\u003e to delete all the matching entries.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003eI\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e Delete which entries? \u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis is really cool, but the only thing missing for me was the ability to\nfuzzily find history entries, so I wrote a quick Fish function to combine\n\u003ccode\u003ehistory\u003c/code\u003e with \u003ca href=\"https://github.com/junegunn/fzf\"\u003e\u003ccode\u003efzf\u003c/code\u003e\u003c/a\u003e, my favourite shell program. I also made a small\nchange to the history command by swapping \u003ccode\u003e--contains\u003c/code\u003e for \u003ccode\u003e--prefix\u003c/code\u003e which\nmakes more sense when combined with \u003ccode\u003efzf\u003c/code\u003e as the search is more constrained.\u003c/p\u003e",
      "date_published": "2020-05-29T00:00:00+00:00",
      "date_modified": "2020-05-29T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/protecting-phoenix-endpoints-with-http-basic-auth/",
      "url": "https://elver.me/blog/protecting-phoenix-endpoints-with-http-basic-auth/",
      "title": "Protecting Phoenix endpoints with HTTP Basic Auth (on Heroku)",
      "content_html": "\u003cp\u003e\u003ca href=\"https://github.com/phoenixframework/phoenix_live_dashboard\"\u003ePhoenix LiveDashboard\u003c/a\u003e was recently officially announced\nby \u003ca href=\"https://twitter.com/josevalim/status/1250846714665357315\"\u003eJosé Valim\u003c/a\u003e, and I was keen try it out so I\ninstalled it on a toy app I\u0026rsquo;ve been developing, which is deployed to Heroku.\u003c/p\u003e\n\u003cp\u003eI didn\u0026rsquo;t want my LiveDashboard to be available to the whole world, so the\nquickest and easiest method of protecting it was to use HTTP Basic Authentication,\n\u003ca href=\"https://hexdocs.pm/phoenix_live_dashboard/Phoenix.LiveDashboard.html#module-extra-add-dashboard-access-on-all-environments-including-production\"\u003esomething that is recommended in the LiveDashboard docs\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eTo that end, I installed and configured the \u003ca href=\"https://hex.pm/packages/basic_auth\"\u003e\u003ccode\u003ebasic_auth\u003c/code\u003e plug\u003c/a\u003e,\nand read the username and password to configure it from environment variables.\u003c/p\u003e\n\u003cp\u003eThese are the steps I took.\u003c/p\u003e\n\u003ch2 id=\"install-and-configure\"\u003eInstall and configure\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eAdd the \u003ccode\u003ebasic_auth\u003c/code\u003e plug\u003c/p\u003e\n\u003cp\u003eAdd \u003ccode\u003ebasic_auth\u003c/code\u003e to your \u003ccode\u003emix.exs\u003c/code\u003e file\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#990073\"\u003e:basic_auth\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;~\u0026gt; 2.2.4\u0026#34;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eInstall dependencies\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emix deps.get\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eConfigure \u003ccode\u003ebasic_auth\u003c/code\u003e from environment variables\u003c/p\u003e\n\u003cp\u003eEdit your \u003ccode\u003eprod.secret.exs\u003c/code\u003e file and add this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehttp_basic_auth_username \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#458;font-weight:bold\"\u003eSystem\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eget_env(\u003cspan style=\"color:#d14\"\u003e\u0026#34;HTTP_BASIC_AUTH_USERNAME\u0026#34;\u003c/span\u003e) \u003cspan style=\"color:#000;font-weight:bold\"\u003e||\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003eraise\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e    environment variable HTTP_BASIC_AUTH_USERNAME is missing.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e    \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehttp_basic_auth_password \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#458;font-weight:bold\"\u003eSystem\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eget_env(\u003cspan style=\"color:#d14\"\u003e\u0026#34;HTTP_BASIC_AUTH_PASSWORD\u0026#34;\u003c/span\u003e) \u003cspan style=\"color:#000;font-weight:bold\"\u003e||\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003eraise\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e    environment variable HTTP_BASIC_AUTH_PASSWORD is missing.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e    \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e# Set basic auth from environment variables\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econfig \u003cspan style=\"color:#990073\"\u003e:example_web\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003ebasic_auth\u003c/span\u003e: [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#990073\"\u003eusername\u003c/span\u003e: http_basic_auth_username,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#990073\"\u003epassword\u003c/span\u003e: http_basic_auth_password,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the router to protect the LiveDashboard routes\u003c/p\u003e\n\u003cp\u003eCreate a new pipeline that conditionally adds the \u003ccode\u003ebasic_auth\u003c/code\u003e plug if the\n\u003ccode\u003eHTTP_BASIC_AUTH_USERNAME\u003c/code\u003e or \u003ccode\u003eHTTP_BASIC_AUTH_PASSWORD\u003c/code\u003e are present.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epipeline \u003cspan style=\"color:#990073\"\u003e:protected\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eSystem\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eget_env(\u003cspan style=\"color:#d14\"\u003e\u0026#34;HTTP_BASIC_AUTH_USERNAME\u0026#34;\u003c/span\u003e) \u003cspan style=\"color:#000;font-weight:bold\"\u003e||\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eSystem\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eget_env(\u003cspan style=\"color:#d14\"\u003e\u0026#34;HTTP_BASIC_AUTH_PASSWORD\u0026#34;\u003c/span\u003e) \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    plug \u003cspan style=\"color:#458;font-weight:bold\"\u003eBasicAuth\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003euse_config\u003c/span\u003e: {\u003cspan style=\"color:#990073\"\u003e:example_web\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:basic_auth\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThen add \u003ccode\u003e:protected\u003c/code\u003e to the pipeline.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-elixir\" data-lang=\"elixir\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escope \u003cspan style=\"color:#d14\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#458;font-weight:bold\"\u003eExampleWeb\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  pipe_through [\u003cspan style=\"color:#990073\"\u003e:browser\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003e:protected\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  live_dashboard \u003cspan style=\"color:#d14\"\u003e\u0026#34;/dashboard\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSet your environment variables on Heroku\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eheroku config:set \u003cspan style=\"color:#008080\"\u003eHTTP_BASIC_AUTH_USERNAME\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003eadmin \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e                  \u003cspan style=\"color:#008080\"\u003eHTTP_BASIC_AUTH_PASSWORD\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003eP@ssword\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eNow when you visit \u003ccode\u003e/dashboard\u003c/code\u003e you should be prompted to enter your username\nand password.\u003c/p\u003e\n",
      "summary": "\u003cp\u003e\u003ca href=\"https://github.com/phoenixframework/phoenix_live_dashboard\"\u003ePhoenix LiveDashboard\u003c/a\u003e was recently officially announced\nby \u003ca href=\"https://twitter.com/josevalim/status/1250846714665357315\"\u003eJosé Valim\u003c/a\u003e, and I was keen try it out so I\ninstalled it on a toy app I\u0026rsquo;ve been developing, which is deployed to Heroku.\u003c/p\u003e\n\u003cp\u003eI didn\u0026rsquo;t want my LiveDashboard to be available to the whole world, so the\nquickest and easiest method of protecting it was to use HTTP Basic Authentication,\n\u003ca href=\"https://hexdocs.pm/phoenix_live_dashboard/Phoenix.LiveDashboard.html#module-extra-add-dashboard-access-on-all-environments-including-production\"\u003esomething that is recommended in the LiveDashboard docs\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eTo that end, I installed and configured the \u003ca href=\"https://hex.pm/packages/basic_auth\"\u003e\u003ccode\u003ebasic_auth\u003c/code\u003e plug\u003c/a\u003e,\nand read the username and password to configure it from environment variables.\u003c/p\u003e",
      "date_published": "2020-05-01T00:00:00+00:00",
      "date_modified": "2020-05-01T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/til-about-the-external-resource-module-attribute-in-elixir/",
      "url": "https://elver.me/blog/til-about-the-external-resource-module-attribute-in-elixir/",
      "title": "TIL about the @external_resource module attribute in Elixir",
      "content_html": "\u003cp\u003eToday I learnt about the \u003ccode\u003e@external_resource\u003c/code\u003e module attribute in \u003ca href=\"https://elixir-lang.org/\"\u003eElixir\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eFrom the \u003ca href=\"https://hexdocs.pm/elixir/Module.html#module-external_resource\"\u003eModule documentation page\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSometimes a module embeds information from an external file. This attribute\nallows the module to annotate which external resources have been used.\u003c/p\u003e\n\u003cp\u003eTools like Mix may use this information to ensure the module is recompiled in case any of the external resources change.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ccode\u003e@external_resource\u003c/code\u003e means that you can specify a resource \u003cem\u003eoutside\u003c/em\u003e of your\nmodule that will trigger recompilation of your module - basically, it sets up a\ndependency between your module and another file.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blog.oestrich.org/2018/03/elixir-external-resources/\"\u003eEric Oestrich blogged about a real-life use-case\u003c/a\u003e for this feature -\ngenerating functions based on an external \u0026ldquo;translations\u0026rdquo; file. At compile-time\nhe reads the file and generates functions based on it. His post goes into a lot\nmore depth and has code examples. I recommend giving it a read.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eToday I learnt about the \u003ccode\u003e@external_resource\u003c/code\u003e module attribute in \u003ca href=\"https://elixir-lang.org/\"\u003eElixir\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eFrom the \u003ca href=\"https://hexdocs.pm/elixir/Module.html#module-external_resource\"\u003eModule documentation page\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSometimes a module embeds information from an external file. This attribute\nallows the module to annotate which external resources have been used.\u003c/p\u003e\n\u003cp\u003eTools like Mix may use this information to ensure the module is recompiled in case any of the external resources change.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ccode\u003e@external_resource\u003c/code\u003e means that you can specify a resource \u003cem\u003eoutside\u003c/em\u003e of your\nmodule that will trigger recompilation of your module - basically, it sets up a\ndependency between your module and another file.\u003c/p\u003e",
      "date_published": "2020-04-23T00:00:00+00:00",
      "date_modified": "2020-04-23T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/handling-a-custom-response-body-with-faraday-middleware/",
      "url": "https://elver.me/blog/handling-a-custom-response-body-with-faraday-middleware/",
      "title": "Handling a custom response body with Faraday middleware",
      "content_html": "\u003cp\u003eI\u0026rsquo;ve been working with a REST API recently that returns JSON except for one\nparticular endpoint. This endpoint returns a plain text response with a\nnon-standard content type header.\u003c/p\u003e\n\u003cp\u003eIt looks like this:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eA:1AHGJDSMMPLMPPGNLJBQVLBRSKVDLQRPP:2213,2214,2215\nA:201AGBHDRLQHNHPHKKMPKLGPMDRDTDMVL:3134,3135,3136,3137\nU:1AHGJDSMMPLMPPGNLJBQVLBRSKVDLQRPP:2212\nU:201AGBHDRLQHNHPHKKMPKLGPMDRDTDMVL:3133\nX:2AVDSSBSTSQDRDKBHCNTRTHPNTBGQDTMD:2677,2685,2969,2996,3002\nX:1AHGJDSMMPLMPPGNLJBQVLBRSKVDLQRPP:3029,3056\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe output is seat availability for concert venues with colons separating the\nfields like so \u003ccode\u003e\u0026lt;seat-type\u0026gt;:\u0026lt;band-id\u0026gt;:\u0026lt;seats\u0026gt;\u003c/code\u003e. The problem is that we need to\nhandle this response explicitly as the default JSON parsing doesn\u0026rsquo;t know what to\ndo with it.\u003c/p\u003e\n\u003cp\u003eThe desired output in this case would be like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:seat_type\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;A\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:band_id\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;1AHGJDSMMPLMPPGNLJBQVLBRSKVDLQRPP\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:seats\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;2213\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;2214\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;2215\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:seat_type\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;A\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:band_id\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;201AGBHDRLQHNHPHKKMPKLGPMDRDTDMVL\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#990073\"\u003e:seats\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;3134\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;3135\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;3136\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;3137\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"faraday-middleware\"\u003eFaraday Middleware\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m using \u003ca href=\"https://lostisland.github.io/faraday/\"\u003eFaraday\u003c/a\u003e as the HTTP client for this project and it has the\nconcept of middleware. Middleware can apply to requests or responses and are\nhooked into the lifecycle of a request.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFaraday is an HTTP client library that provides a common interface over many\nadapters (such as Net::HTTP) and \u003cstrong\u003eembraces the concept of Rack\nmiddleware when processing the request/response cycle.\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis means that we can write a custom middleware to parse the response for our\ncustom content type, which for the purpose of illustration, we\u0026rsquo;ll call\n\u003ccode\u003evenue/seats\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"custom-response-middleware\"\u003eCustom response middleware\u003c/h2\u003e\n\u003cp\u003eFirst we make sure we have the correct gems.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egem \u003cspan style=\"color:#d14\"\u003e\u0026#39;faraday\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;~\u0026gt; 1.0\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egem \u003cspan style=\"color:#d14\"\u003e\u0026#39;faraday_middleware\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003egithub\u003c/span\u003e: \u003cspan style=\"color:#d14\"\u003e\u0026#39;lostisland/faraday_middleware\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003eref\u003c/span\u003e: \u003cspan style=\"color:#d14\"\u003e\u0026#39;e1324ca\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe latest version of \u003ccode\u003efaraday_middleware\u003c/code\u003e isn\u0026rsquo;t compatible with Faraday 1.0 as\nfar as I can tell at the moment, so I pinned the gem to commit \u003ccode\u003ee1324c\u003c/code\u003e, which\nis. There is a \u003ca href=\"https://github.com/lostisland/faraday_middleware/releases/tag/v1.0.0.rc1\"\u003epre-release version available\u003c/a\u003e at the time\nof writing.\u003c/p\u003e\n\u003cp\u003eNow we can write a middleware that we will later hook into the request/response\ncycle. I\u0026rsquo;m using the \u003ccode\u003eResponseMiddleware\u003c/code\u003e from \u003ca href=\"https://github.com/lostisland/faraday_middleware/blob/master/lib/faraday_middleware/response_middleware.rb\"\u003e\u003ccode\u003efaraday_middleware\u003c/code\u003e\u003c/a\u003e\nas it has a neat \u003ccode\u003edefine_parser\u003c/code\u003e helper which allows us to very easily supply a\nparser for \u003ccode\u003evenue/seats\u003c/code\u003e content type.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003erequire\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;faraday\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003erequire\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;faraday_middleware\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003erequire\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;faraday_middleware/response_middleware\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e# Custom response middleware\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eSeatAvailabilityResponse\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026lt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eFaradayMiddleware\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eResponseMiddleware\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  define_parser \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003ebody, _\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#008080\"\u003eSeatAvailability\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eparse(body)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e# Register the middleware so we can use it\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eFaraday\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eResponse\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eregister_middleware(\u003cspan style=\"color:#990073\"\u003eseat_availability\u003c/span\u003e: \u003cspan style=\"color:#008080\"\u003eSeatAvailabilityResponse\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAt the bottom you can see that I register this class as a response middleware\ncalled \u0026ldquo;seat_availability\u0026rdquo; using \u003ccode\u003eFaraday::Response.register_middleware\u003c/code\u003e. This\nallows us to refer to this middleware in the future.\u003c/p\u003e\n\u003ch2 id=\"response-parsing\"\u003eResponse parsing\u003c/h2\u003e\n\u003cp\u003eI also delegate parsing responsibility to another class, \u003ccode\u003eSeatAvailability\u003c/code\u003e.\nYou could just as easily add it inline, but I like to separate the\nresponsibilities, and it also makes it easier to test if it\u0026rsquo;s a separate class.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eSeatAvailability\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eself\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#900;font-weight:bold\"\u003eparse\u003c/span\u003e(body)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e body\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enil?\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    body\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003esplit\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003emap \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003esection\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      seat_type, band_id, seats \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e section\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003esplit(\u003cspan style=\"color:#d14\"\u003e\u0026#34;:\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#990073\"\u003eseat_type\u003c/span\u003e: seat_type,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#990073\"\u003eband_id\u003c/span\u003e: band_id,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#990073\"\u003eseats\u003c/span\u003e: seats\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003esplit(\u003cspan style=\"color:#d14\"\u003e\u0026#34;,\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"registering-the-middleware\"\u003eRegistering the middleware\u003c/h2\u003e\n\u003cp\u003eAnd this is how we use the new middleware. We create \u003ccode\u003eFaraday\u003c/code\u003e connection object\nand in the block call \u003ccode\u003econn.response\u003c/code\u003e in order to add it.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econn \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eFaraday\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enew(\u003cspan style=\"color:#d14\"\u003e\u0026#34;http://example.com/api\u0026#34;\u003c/span\u003e) \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003econn\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#998;font-style:italic\"\u003e#...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#998;font-style:italic\"\u003e# Use the `SeatAvailabilityResponse` middleware for \u0026#34;venue/seats\u0026#34; content types\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  conn\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eresponse \u003cspan style=\"color:#990073\"\u003e:seat_availability\u003c/span\u003e, \u003cspan style=\"color:#990073\"\u003econtent_type\u003c/span\u003e: \u003cspan style=\"color:#d14\"\u003e\u0026#34;venue/seats\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#998;font-style:italic\"\u003e#...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow when we make a call to an endpoint that returns a body with a \u003ccode\u003evenue/seats\u003c/code\u003e\ncontent type it will automatically be parsed into an array of hashes for us.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e (pry) \u003cspan style=\"color:#990073\"\u003emain\u003c/span\u003e: \u003cspan style=\"color:#099\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e response \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e conn\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eget(\u003cspan style=\"color:#d14\"\u003e\u0026#34;availability\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#990073\"\u003e:seat_type\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;A\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#990073\"\u003e:band_id\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;1AHGJDSMMPLMPPGNLJBQVLBRSKVDLQRPP\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#990073\"\u003e:seats\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;2213\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;2214\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;2215\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#990073\"\u003e:seat_type\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;A\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#990073\"\u003e:band_id\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;201AGBHDRLQHNHPHKKMPKLGPMDRDTDMVL\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#990073\"\u003e:seats\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;3134\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;3135\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;3136\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;3137\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI hope this demonstrates how easy it is to handle custom responses in a very\nstraight-forward and modular way.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI\u0026rsquo;ve been working with a REST API recently that returns JSON except for one\nparticular endpoint. This endpoint returns a plain text response with a\nnon-standard content type header.\u003c/p\u003e\n\u003cp\u003eIt looks like this:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eA:1AHGJDSMMPLMPPGNLJBQVLBRSKVDLQRPP:2213,2214,2215\nA:201AGBHDRLQHNHPHKKMPKLGPMDRDTDMVL:3134,3135,3136,3137\nU:1AHGJDSMMPLMPPGNLJBQVLBRSKVDLQRPP:2212\nU:201AGBHDRLQHNHPHKKMPKLGPMDRDTDMVL:3133\nX:2AVDSSBSTSQDRDKBHCNTRTHPNTBGQDTMD:2677,2685,2969,2996,3002\nX:1AHGJDSMMPLMPPGNLJBQVLBRSKVDLQRPP:3029,3056\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe output is seat availability for concert venues with colons separating the\nfields like so \u003ccode\u003e\u0026lt;seat-type\u0026gt;:\u0026lt;band-id\u0026gt;:\u0026lt;seats\u0026gt;\u003c/code\u003e. The problem is that we need to\nhandle this response explicitly as the default JSON parsing doesn\u0026rsquo;t know what to\ndo with it.\u003c/p\u003e",
      "date_published": "2020-03-27T00:00:00+00:00",
      "date_modified": "2020-03-27T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/deleting-fish-shell-history/",
      "url": "https://elver.me/blog/deleting-fish-shell-history/",
      "title": "Deleting fish shell history",
      "content_html": "\u003cp\u003eHave you ever made a typo? No, me neither, but in case you ever do\u0026hellip;\u003c/p\u003e\n\u003cp\u003eI run a lot of commands via the shell history using \u003ca href=\"https://github.com/junegunn/fzf#key-bindings-for-command-line\"\u003efzf and CTRL-R\u003c/a\u003e to save\nre-typing, and ironically, mispellings. However, if you \u003cem\u003edo\u003c/em\u003e mispell something\nit ends up in the history forevermore, taunting you upon each invocation of\n\u003ca href=\"https://github.com/junegunn/fzf/blob/master/shell/key-bindings.fish#L109\"\u003efzf-history-widget\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIt turns out that \u003ca href=\"https://fishshell.com/docs/current/cmds/history.html#cmd-history\"\u003efish ships with a neat \u003ccode\u003ehistory\u003c/code\u003e command\u003c/a\u003e that allows you\nto manipulate the history is various ways including searching, deleting, and\ncompletely clearing.\u003c/p\u003e\n\u003cp\u003eThe command I want to remove in this case is \u003ccode\u003emix echo\u003c/code\u003e (which should be \u003ccode\u003emix ecto\u003c/code\u003e).\u003c/p\u003e\n\u003cp\u003eI use the \u003ccode\u003e--contains\u003c/code\u003e option here which will present a prompt showing the\nentries and allowing you to delete individual entries or remove all.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#0086b3\"\u003ehistory\u003c/span\u003e delete --contains \u003cspan style=\"color:#d14\"\u003e\u0026#34;mix echo\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e1\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#0086b3\"\u003ehistory\u003c/span\u003e search --contains \u003cspan style=\"color:#d14\"\u003e\u0026#34;mix echo\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e2\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e mix echo.migrate\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e3\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e mix echo.create\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e4\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e mix echo.reset\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e5\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e mix echo.setup\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter nothing to cancel the delete, or\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter one or more of the entry IDs separated by a space, or\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter \u003cspan style=\"color:#d14\"\u003e\u0026#34;all\u0026#34;\u003c/span\u003e to delete all the matching entries.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003eI\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e Delete which entries? \u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf you want to search before running \u003ccode\u003edelete\u003c/code\u003e you can do \u003ccode\u003ehistory search --contains \u0026quot;\u0026lt;search\u0026gt;\u0026quot;\u003c/code\u003e which will return a list of items for you to check.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eHave you ever made a typo? No, me neither, but in case you ever do\u0026hellip;\u003c/p\u003e\n\u003cp\u003eI run a lot of commands via the shell history using \u003ca href=\"https://github.com/junegunn/fzf#key-bindings-for-command-line\"\u003efzf and CTRL-R\u003c/a\u003e to save\nre-typing, and ironically, mispellings. However, if you \u003cem\u003edo\u003c/em\u003e mispell something\nit ends up in the history forevermore, taunting you upon each invocation of\n\u003ca href=\"https://github.com/junegunn/fzf/blob/master/shell/key-bindings.fish#L109\"\u003efzf-history-widget\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIt turns out that \u003ca href=\"https://fishshell.com/docs/current/cmds/history.html#cmd-history\"\u003efish ships with a neat \u003ccode\u003ehistory\u003c/code\u003e command\u003c/a\u003e that allows you\nto manipulate the history is various ways including searching, deleting, and\ncompletely clearing.\u003c/p\u003e",
      "date_published": "2020-02-21T00:00:00+00:00",
      "date_modified": "2020-02-21T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/routing-docker-traffic-through-a-vpn-connection/",
      "url": "https://elver.me/blog/routing-docker-traffic-through-a-vpn-connection/",
      "title": "Routing Docker traffic through a VPN connection",
      "content_html": "\u003cp\u003eI\u0026rsquo;ve recently taken to using Docker to install and run various software\non my home server. Something that so far, it excels at - the people at\n\u003ca href=\"https://linuxserver.io\"\u003elinuxserver.io\u003c/a\u003e are doing great work! I\u0026rsquo;ve had a rocky time with Docker in\nthe past after having had it foisted upon me for development work, which I did\n\u003cem\u003enot\u003c/em\u003e enjoy, but I can see the benefits for certain situations.\u003c/p\u003e\n\u003cp\u003eI found myself needing to run the traffic from one particular container\n(\u003ca href=\"https://github.com/linuxserver/docker-jackett\"\u003eJackett\u003c/a\u003e) over a VPN connection so that it could by-pass country-specific\nrestrictions. As a noob Docker user, this caused some confusion, but I eventually\nstumbled upon the \u003ccode\u003e--net\u003c/code\u003e parameter to \u003ccode\u003edocker create\u003c/code\u003e and \u003ccode\u003erun\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eUsing this parameter it\u0026rsquo;s possible to tell a container to use the network of\nanother. You can run an OpenVPN client container, which will initiate a secure\nconnection, and configure other containers to use its network. The beauty of\nthis setup is that you don\u0026rsquo;t need to learn or manage any complicated \u003ccode\u003eip_tables\u003c/code\u003e\nrules or any other network configuration, you can just point one container at\nanother and have the traffic secured.\u003c/p\u003e\n\u003cp\u003eAll I needed now was a suitable Docker image. Eventually, I got lucky and\n\u003ca href=\"https://github.com/bubuntux/nordvpn\"\u003efound an image that supported my exact VPN provider\u003c/a\u003e, \u003ca href=\"https://nordvpn.com/\"\u003eNordVPN\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThis is how I created and started the OpenVPN container. Once this was running,\na secure VPN connection was established to NordVPN.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker run \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  --name vpn \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  --cap-add\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003eNET_ADMIN \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  --device /dev/net/tun \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  -p 9117:9117 \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  -e \u003cspan style=\"color:#008080\"\u003eNETWORK\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e192.168.1.0/24 \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  -e \u003cspan style=\"color:#008080\"\u003eUSER\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003eusername \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  -e \u003cspan style=\"color:#008080\"\u003ePASS\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;password\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  bubuntux/nordvpn\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMost of these options are standard, but the \u003ccode\u003e-p 9117:9117\u003c/code\u003e parameter on line 5\nneeds explanation. This is the port mapping that Jackett uses by default. When\nwe use another container\u0026rsquo;s network it\u0026rsquo;s necessary to expose the port(s) that our\nother containers use on the VPN container.\u003c/p\u003e\n\u003cp\u003eAnd here is how I setup Jackett to use the VPN container. The relevant line is\n\u003ccode\u003e--net=container:vpn\u003c/code\u003e. Note that I don\u0026rsquo;t have a \u003ccode\u003e-p 9117:9117\u003c/code\u003e line here like I\nwould if I was not using \u003ccode\u003e--net=container:vpn\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker run \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  --name\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003ejackett \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  --restart unless-stopped \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  -e \u003cspan style=\"color:#008080\"\u003ePUID\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e1000\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  -e \u003cspan style=\"color:#008080\"\u003ePGID\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#099\"\u003e1000\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  -e \u003cspan style=\"color:#008080\"\u003eTZ\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003eEurope/London \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  --net\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003econtainer:vpn \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  -v /opt/appdata/jackett:/config \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  -v /opt/appdata/jackett/downloads:/downloads \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  linuxserver/jackett\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow I can access Jackett at \u003ccode\u003ehttp://\u0026lt;host-ip\u0026gt;:9117\u003c/code\u003e and all traffic will be sent\nthrough the VPN container\u0026rsquo;s network!\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI\u0026rsquo;ve recently taken to using Docker to install and run various software\non my home server. Something that so far, it excels at - the people at\n\u003ca href=\"https://linuxserver.io\"\u003elinuxserver.io\u003c/a\u003e are doing great work! I\u0026rsquo;ve had a rocky time with Docker in\nthe past after having had it foisted upon me for development work, which I did\n\u003cem\u003enot\u003c/em\u003e enjoy, but I can see the benefits for certain situations.\u003c/p\u003e\n\u003cp\u003eI found myself needing to run the traffic from one particular container\n(\u003ca href=\"https://github.com/linuxserver/docker-jackett\"\u003eJackett\u003c/a\u003e) over a VPN connection so that it could by-pass country-specific\nrestrictions. As a noob Docker user, this caused some confusion, but I eventually\nstumbled upon the \u003ccode\u003e--net\u003c/code\u003e parameter to \u003ccode\u003edocker create\u003c/code\u003e and \u003ccode\u003erun\u003c/code\u003e.\u003c/p\u003e",
      "date_published": "2019-06-03T00:00:00+00:00",
      "date_modified": "2019-06-03T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/how-to-replace-a-failed-disk-in-a-zfs-mirror/",
      "url": "https://elver.me/blog/how-to-replace-a-failed-disk-in-a-zfs-mirror/",
      "title": "How to replace a failed disk in a ZFS mirror",
      "content_html": "\u003cp\u003eI recently built a new file server for my media needs at home. Something I\u0026rsquo;ve\nbeen thinking about doing for \u003cem\u003eliterally\u003c/em\u003e years.  I chose to go with ZFS as the\nstorage technology after having used Linux software RAID for many years.\nI went with a mirrored setup for a lot of the reasons \u003ca href=\"http://www.openoid.net/zfs-you-should-use-mirror-vdevs-not-raidz/\"\u003eoutlined in this\narticle\u003c/a\u003e - performance, simplicity, and in particular, easy recovery from\ndisk failures.\u003c/p\u003e\n\u003cp\u003eThis is the setup I ended up with according to \u003ccode\u003ezpool status\u003c/code\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ zpool status\n  pool: storage\n state: ONLINE\n  scan: none requested\nconfig:\n\n\tNAME                                   STATE     READ WRITE CKSUM\n\tstorage                                ONLINE       0     0     0\n\t  mirror-0                             ONLINE       0     0     0\n\t    ata-WDC_WD80EFZX-68UW8N0_VJHDBDGX  ONLINE       0     0     0\n\t    ata-WDC_WD80EFAX-68KNBN0_VAGASE7L  ONLINE       0     0     0\n\t  mirror-1                             ONLINE       0     0     0\n\t    ata-WDC_WD80EFZX-68UW8N0_VJHD6BAX  ONLINE       0     0     0\n\t    ata-WDC_WD80EFAX-68KNBN0_VAGA5BPL  ONLINE       0     0     0\n\t  mirror-2                             ONLINE       0     0     0\n\t    ata-WDC_WD80EFZX-68UW8N0_VJHD982X  ONLINE       0     0     0\n\t    ata-WDC_WD80EFAX-68KNBN0_VAG9X8YL  ONLINE       0     0     0\n\nerrors: No known data errors\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWell, no sooner had I completed the ZFS setup (a very straightforward process)\nthan one of my disks started reporting SMART errors. I don\u0026rsquo;t think a disk that\nis weeks old should do this, so I decided to start the RMA process.\u003c/p\u003e\n\u003cp\u003eAnd this is how I replaced the disk.\u003c/p\u003e\n\u003ch2 id=\"replacing-the-disk\"\u003eReplacing the disk\u003c/h2\u003e\n\u003cp\u003eI started by physically removing the old disk, and replacing with a brand new\none. I originally setup my pool using the disk id from \u003ccode\u003e/dev/disk/by-id/\u003c/code\u003e, so\nidentifying the failed disk was very easy as the serial number is part of the\ndevice name\u003c/p\u003e\n\u003cp\u003eOnce I started back up, I ran \u003ccode\u003ezpool status\u003c/code\u003e and saw this output.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ zpools status\n  pool: storage\n state: DEGRADED\nstatus: One or more devices could not be used because the label is missing or\n\tinvalid.  Sufficient replicas exist for the pool to continue\n\tfunctioning in a degraded state.\naction: Replace the device using \u0026#39;zpool replace\u0026#39;.\n   see: http://zfsonlinux.org/msg/ZFS-8000-4J\n  scan: none requested\nconfig:\n\n\tNAME                                   STATE     READ WRITE CKSUM\n\tstorage                                DEGRADED     0     0     0\n\t  mirror-0                             ONLINE       0     0     0\n\t    ata-WDC_WD80EFZX-68UW8N0_VJHDBDGX  ONLINE       0     0     0\n\t    ata-WDC_WD80EFAX-68KNBN0_VAGASE7L  ONLINE       0     0     0\n\t  mirror-1                             ONLINE       0     0     0\n\t    ata-WDC_WD80EFZX-68UW8N0_VJHD6BAX  ONLINE       0     0     0\n\t    ata-WDC_WD80EFAX-68KNBN0_VAGA5BPL  ONLINE       0     0     0\n\t  mirror-2                             DEGRADED     0     0     0\n\t    ata-WDC_WD80EFZX-68UW8N0_VJHD982X  ONLINE       0     0     0\n\t    18311740819329882151               UNAVAIL      0     0     0  was /dev/disk/by-id/ata-WDC_WD80EFAX-68KNBN0_VAG9X8YL-part1\n\nerrors: No known data errors\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eZFS noticed that it had a missing disk, and was now in a \u003ccode\u003eDEGRADED\u003c/code\u003e state, but\ncrucially, everything was still working and available.\u003c/p\u003e\n\u003cp\u003eThe next step was to find out what the \u003cem\u003enew\u003c/em\u003e device is called. I did this by\nrunning \u003ccode\u003els -1 /dev/disk/by-id/\u003c/code\u003e and seeing which disk was new.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ ls -1 /dev/disk/by-id/ | grep ata\nata-WDC_WD80EFAX-68KNBN0_VAGA5BPL\nata-WDC_WD80EFAX-68KNBN0_VAGA5BPL-part1\nata-WDC_WD80EFAX-68KNBN0_VAGA5BPL-part9\nata-WDC_WD80EFAX-68KNBN0_VAGASE7L\nata-WDC_WD80EFAX-68KNBN0_VAGASE7L-part1\nata-WDC_WD80EFAX-68KNBN0_VAGASE7L-part9\nata-WDC_WD80EFAX-68LHPN0_7HJSWL7F\nata-WDC_WD80EFZX-68UW8N0_VJHD6BAX\nata-WDC_WD80EFZX-68UW8N0_VJHD6BAX-part1\nata-WDC_WD80EFZX-68UW8N0_VJHD6BAX-part9\nata-WDC_WD80EFZX-68UW8N0_VJHD982X\nata-WDC_WD80EFZX-68UW8N0_VJHD982X-part1\nata-WDC_WD80EFZX-68UW8N0_VJHD982X-part9\nata-WDC_WD80EFZX-68UW8N0_VJHDBDGX\nata-WDC_WD80EFZX-68UW8N0_VJHDBDGX-part1\nata-WDC_WD80EFZX-68UW8N0_VJHDBDGX-part9\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe new disk is the one on line 8 - \u003ccode\u003eata-WDC_WD80EFAX-68LHPN0_7HJSWL7F\u003c/code\u003e. It\nstands out in this example as all the other disk serial numbers start with \u0026ldquo;V\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eI now needed to tell ZFS to replace the missing disk with this one.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo zpool replace -f storage 18311740819329882151 /dev/disk/by-id/ata-WDC_WD80EFAX-68LHPN0_7HJSWL7F\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eZFS automatically started the resilvering process (copying data to the new\ndisk). I wasn\u0026rsquo;t sure how long that would take\u0026hellip;\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ zpool status\n  pool: storage\n state: DEGRADED\nstatus: One or more devices is currently being resilvered.  The pool will\n\tcontinue to function, possibly in a degraded state.\naction: Wait for the resilver to complete.\n  scan: resilver in progress since Thu Nov 15 17:01:06 2018\n\t7.97G scanned out of 7.51T at 233M/s, 9h22m to go\n\t2.56G resilvered, 0.10% done\nconfig:\n\n\tNAME                                     STATE     READ WRITE CKSUM\n\tstorage                                  DEGRADED     0     0     0\n\t  mirror-0                               ONLINE       0     0     0\n\t    ata-WDC_WD80EFZX-68UW8N0_VJHDBDGX    ONLINE       0     0     0\n\t    ata-WDC_WD80EFAX-68KNBN0_VAGASE7L    ONLINE       0     0     0\n\t  mirror-1                               ONLINE       0     0     0\n\t    ata-WDC_WD80EFZX-68UW8N0_VJHD6BAX    ONLINE       0     0     0\n\t    ata-WDC_WD80EFAX-68KNBN0_VAGA5BPL    ONLINE       0     0     0\n\t  mirror-2                               DEGRADED     0     0     0\n\t    ata-WDC_WD80EFZX-68UW8N0_VJHD982X    ONLINE       0     0     0\n\t    replacing-1                          DEGRADED     0     0     0\n\t      18311740819329882151               UNAVAIL      0     0     0  was /dev/disk/by-id/ata-WDC_WD80EFAX-68KNBN0_VAG9X8YL-part1\n\t      ata-WDC_WD80EFAX-68LHPN0_7HJSWL7F  ONLINE       0     0     0  (resilvering)\n\nerrors: No known data errors\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe resilvering completed in 5 hours and 53 minutes. A figure I\u0026rsquo;m very satisfied\nwith. In this mirrored setup the data is at risk whilst resilvering completes,\nso the quicker, the better.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ zpool status\n  pool: storage\n state: ONLINE\n  scan: resilvered 2.50T in 5h53m with 0 errors on Thu Nov 15 22:54:41 2018\nconfig:\n\n\tNAME                                   STATE     READ WRITE CKSUM\n\tstorage                                ONLINE       0     0     0\n\t  mirror-0                             ONLINE       0     0     0\n\t    ata-WDC_WD80EFZX-68UW8N0_VJHDBDGX  ONLINE       0     0     0\n\t    ata-WDC_WD80EFAX-68KNBN0_VAGASE7L  ONLINE       0     0     0\n\t  mirror-1                             ONLINE       0     0     0\n\t    ata-WDC_WD80EFZX-68UW8N0_VJHD6BAX  ONLINE       0     0     0\n\t    ata-WDC_WD80EFAX-68KNBN0_VAGA5BPL  ONLINE       0     0     0\n\t  mirror-2                             ONLINE       0     0     0\n\t    ata-WDC_WD80EFZX-68UW8N0_VJHD982X  ONLINE       0     0     0\n\t    ata-WDC_WD80EFAX-68LHPN0_7HJSWL7F  ONLINE       0     0     0\n\nerrors: No known data errors\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eZFS is easy to setup and use for the most part. It \u003cem\u003efeels\u003c/em\u003e solid. Stable.\nIf all disk replacements are this easy I will be very happy.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI recently built a new file server for my media needs at home. Something I\u0026rsquo;ve\nbeen thinking about doing for \u003cem\u003eliterally\u003c/em\u003e years.  I chose to go with ZFS as the\nstorage technology after having used Linux software RAID for many years.\nI went with a mirrored setup for a lot of the reasons \u003ca href=\"http://www.openoid.net/zfs-you-should-use-mirror-vdevs-not-raidz/\"\u003eoutlined in this\narticle\u003c/a\u003e - performance, simplicity, and in particular, easy recovery from\ndisk failures.\u003c/p\u003e\n\u003cp\u003eThis is the setup I ended up with according to \u003ccode\u003ezpool status\u003c/code\u003e.\u003c/p\u003e",
      "date_published": "2018-11-26T00:00:00+00:00",
      "date_modified": "2018-11-26T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/a-new-way-to-deploy-to-aws/",
      "url": "https://elver.me/blog/a-new-way-to-deploy-to-aws/",
      "title": "A new way to deploy to Amazon S3",
      "content_html": "\u003cp\u003ePretty much since I began hosting this site on Amazon S3 I\u0026rsquo;ve been using\n\u003ca href=\"https://github.com/fredjean/middleman-s3_sync\"\u003emiddleman-s3_sync\u003c/a\u003e to do the heavy lifting of syncing files to the bucket. Unfortunately, somewhere along the way it stopped picking up certain\nfiles that should\u0026rsquo;ve been synced. I tried to be a good OSS citizen and find a fix, but\nafter delving into the Middleman innards, I couldn\u0026rsquo;t find the problem.\u003c/p\u003e\n\u003ch2 id=\"a-new-method\"\u003eA new method\u003c/h2\u003e\n\u003cp\u003eA new method of deploying the site was needed and recently I moved to\nusing Amazon\u0026rsquo;s own \u003ca href=\"https://aws.amazon.com/cli/\"\u003eaws cli\u003c/a\u003e utility. After years of providing next to\nnothing in regards to tooling, Amazon have released their own command line\nutility for interacting with AWS. And the best part is that it seems very nice .\u003c/p\u003e\n\u003cp\u003eThis is how I now deploy the site.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eaws s3 sync build s3://jordanelver.co.uk \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  --profile jordanelver.co.uk \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  --delete \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  --acl public-read \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#d14\"\u003e\u003c/span\u003e  --exclude *.DS_Store \u003cspan style=\"color:#d14\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003ebuild\u003c/code\u003e is the local directory to be synced, and \u003ccode\u003es3://jordanelver.co.uk\u003c/code\u003e is the remote\nS3 bucket.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e--delete\u003c/code\u003e says to delete files at the destination that are not in the \u003ccode\u003ebuild/\u003c/code\u003e\ndirectory.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e--profile\u003c/code\u003e controls which credentials and other settings to use when connecting\nto S3. More on this below.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e--acl public-read\u003c/code\u003e makes the synced files publicly readable, \u003ca href=\"http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteAccessPermissionsReqd.html\"\u003eas required by S3\nstatic website hosting\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e--exclude\u003c/code\u003e excludes those pesky \u003ccode\u003e.DS_Store\u003c/code\u003e files that OS X litters around the\nfilesystem.\u003c/p\u003e\n\u003ch2 id=\"credentials\"\u003eCredentials\u003c/h2\u003e\n\u003cp\u003eCredentials are stored in \u003ccode\u003e~/.aws/credentials\u003c/code\u003e. I have a section like this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003ejordanelver.co.uk\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eaws_access_key_id\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u0026lt;ACCESSKEY\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eaws_secret_access_key\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u0026lt;SECRET\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYou\u0026rsquo;ll see that this matches the \u003ccode\u003e--profile jordanelver.co.uk\u003c/code\u003e line in the\n\u003ccode\u003es3 sync\u003c/code\u003e commandline.\u003c/p\u003e\n\u003cp\u003eThat covers authentication, but you can also specify additional configuration\nvalues in \u003ccode\u003e~/.aws/config\u003c/code\u003e. In this case, the S3 bucket region.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003eprofile jordanelver.co.uk\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#008080\"\u003eregion\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e eu-west-1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI used \u003ccode\u003eaws configure --profile jordanelver.co.uk\u003c/code\u003e to configure these values.\u003c/p\u003e\n\u003ch2 id=\"one-last-thing\"\u003eOne last thing\u003c/h2\u003e\n\u003cp\u003eOne last thing that deserves to be mentioned is the \u003ccode\u003e--dryrun\u003c/code\u003e flag.  It\u0026rsquo;s very\nhandy for testing what\u0026rsquo;s going to happen, before it happens. \u003ca href=\"https://github.com/jordelver/jordanelver.co.uk/blob/master/bin/deploy\"\u003eI ended up\nwrapping my sync command in a Ruby script\u003c/a\u003e to conditionally add \u003ccode\u003e--dryrun\u003c/code\u003e as\nand when I need it.\u003c/p\u003e\n\u003cp\u003eHappy syncing!\u003c/p\u003e\n",
      "summary": "\u003cp\u003ePretty much since I began hosting this site on Amazon S3 I\u0026rsquo;ve been using\n\u003ca href=\"https://github.com/fredjean/middleman-s3_sync\"\u003emiddleman-s3_sync\u003c/a\u003e to do the heavy lifting of syncing files to the bucket. Unfortunately, somewhere along the way it stopped picking up certain\nfiles that should\u0026rsquo;ve been synced. I tried to be a good OSS citizen and find a fix, but\nafter delving into the Middleman innards, I couldn\u0026rsquo;t find the problem.\u003c/p\u003e\n\u003ch2 id=\"a-new-method\"\u003eA new method\u003c/h2\u003e\n\u003cp\u003eA new method of deploying the site was needed and recently I moved to\nusing Amazon\u0026rsquo;s own \u003ca href=\"https://aws.amazon.com/cli/\"\u003eaws cli\u003c/a\u003e utility. After years of providing next to\nnothing in regards to tooling, Amazon have released their own command line\nutility for interacting with AWS. And the best part is that it seems very nice .\u003c/p\u003e",
      "date_published": "2017-10-29T00:00:00+00:00",
      "date_modified": "2017-10-29T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/split-lines-easily-in-vim/",
      "url": "https://elver.me/blog/split-lines-easily-in-vim/",
      "title": "Split lines easily in Vim",
      "content_html": "\u003cp\u003eVim has a way of making me feel like a wizard one minute and a complete novice\nthe next. I constantly feel the need to revisit the basics, and this led me to\ntry and make \u003ccode\u003eJ\u003c/code\u003e stick in my Vim vocabulary.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eJ\u003c/code\u003e joins lines, I’ve been using it regularly for a while now; it’s finally\nfound its way into my muscle memory. It works like this.\u003c/p\u003e\n\u003cscript type=\"text/javascript\"\nsrc=\"https://asciinema.org/a/bozOxUMgIQV7TmK5OlbzUbazJ.js\"\nid=\"asciicast-bozOxUMgIQV7TmK5OlbzUbazJ\" async\u003e\u003c/script\u003e\n\u003cp\u003eI recently discovered a complementary plugin called \u003ca href=\"https://github.com/drzel/vim-split-line\"\u003evim-split-line\u003c/a\u003e. It\nmakes splitting lines as easy as joining. It mirrors \u003ccode\u003eJ\u003c/code\u003e, mapping by default to\n\u003ccode\u003eS\u003c/code\u003e. See how it works below.\u003c/p\u003e\n\u003cscript type=\"text/javascript\"\nsrc=\"https://asciinema.org/a/i48SaXAXDGkCVM9l8Pte7wziQ.js\"\nid=\"asciicast-i48SaXAXDGkCVM9l8Pte7wziQ\" async\u003e\u003c/script\u003e\n\u003cp\u003eThere are, no doubt, countless ways to do this using Vim (\u003ca href=\"https://github.com/drzel/vim-split-line#alternatives\"\u003ein fact, the author\nof the plugin points this out\u003c/a\u003e), but I really like the simplicity of this\nplugin. And it handles a couple of edgecases for you too such as auto indenting\nthe second line, and removing trailing whitespace.\u003c/p\u003e\n\u003cp\u003eLet’s hope this one sticks.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eVim has a way of making me feel like a wizard one minute and a complete novice\nthe next. I constantly feel the need to revisit the basics, and this led me to\ntry and make \u003ccode\u003eJ\u003c/code\u003e stick in my Vim vocabulary.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eJ\u003c/code\u003e joins lines, I’ve been using it regularly for a while now; it’s finally\nfound its way into my muscle memory. It works like this.\u003c/p\u003e\n\u003cscript type=\"text/javascript\"\nsrc=\"https://asciinema.org/a/bozOxUMgIQV7TmK5OlbzUbazJ.js\"\nid=\"asciicast-bozOxUMgIQV7TmK5OlbzUbazJ\" async\u003e\u003c/script\u003e\n\u003cp\u003eI recently discovered a complementary plugin called \u003ca href=\"https://github.com/drzel/vim-split-line\"\u003evim-split-line\u003c/a\u003e. It\nmakes splitting lines as easy as joining. It mirrors \u003ccode\u003eJ\u003c/code\u003e, mapping by default to\n\u003ccode\u003eS\u003c/code\u003e. See how it works below.\u003c/p\u003e",
      "date_published": "2017-09-25T00:00:00+00:00",
      "date_modified": "2017-09-25T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/capturing-output-from-heroku-with-tee/",
      "url": "https://elver.me/blog/capturing-output-from-heroku-with-tee/",
      "title": "Capturing output from Heroku with tee",
      "content_html": "\u003cp\u003eHave you ever been working with a console on Heroku and needed to capture the\noutput? I was recently tasked with generating a quick \u0026ldquo;report\u0026rdquo;, and I decided\nto spin up a \u003ca href=\"http://guides.rubyonrails.org/command_line.html#rails-console\"\u003eRails console\u003c/a\u003e on Heroku to connect to the database and munge\nsome data into the right format.\u003c/p\u003e\n\u003cp\u003eThe problem is how to capture the output from Heroku. What are the options for\nsaving that on your computer? Well, you \u003cem\u003ecan\u003c/em\u003e write it to the filesystem, but\nthen how do you transfer the file? You could upload it to Amazon S3, or use\nFTP, or something else, but it starts getting complicated fast\u0026hellip;\u003c/p\u003e\n\u003cp\u003eInstead, we use \u003ca href=\"https://en.wikipedia.org/wiki/Tee_(command)\"\u003e\u003ccode\u003etee\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eHere we run a Rails console on Heroku but also redirect all output to a file\ncalled \u003ccode\u003eoutput.log\u003c/code\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eheroku run bundle exec rails console | tee output.log\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWe can work with the console as usual, but also capture the whole session in a\nfile for later inspection. We will get all of the input and output (commands we\ntyped, and their responses) so there is often some post processing to do. But\nstill, this is a quick and dirty way to save output from Heroku\u003c/p\u003e\n",
      "summary": "\u003cp\u003eHave you ever been working with a console on Heroku and needed to capture the\noutput? I was recently tasked with generating a quick \u0026ldquo;report\u0026rdquo;, and I decided\nto spin up a \u003ca href=\"http://guides.rubyonrails.org/command_line.html#rails-console\"\u003eRails console\u003c/a\u003e on Heroku to connect to the database and munge\nsome data into the right format.\u003c/p\u003e\n\u003cp\u003eThe problem is how to capture the output from Heroku. What are the options for\nsaving that on your computer? Well, you \u003cem\u003ecan\u003c/em\u003e write it to the filesystem, but\nthen how do you transfer the file? You could upload it to Amazon S3, or use\nFTP, or something else, but it starts getting complicated fast\u0026hellip;\u003c/p\u003e",
      "date_published": "2017-09-17T00:00:00+00:00",
      "date_modified": "2017-09-17T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/renaming-files-like-a-pro/",
      "url": "https://elver.me/blog/renaming-files-like-a-pro/",
      "title": "Renaming files like a pro",
      "content_html": "\u003cp\u003eRenaming files en masse was always something that I knew the commandline could\nexcel at but that I\u0026rsquo;d never managed to easily replicate daily. I\u0026rsquo;d always have\nto look up the shell syntax for looping over a list of files, and the rules for\nescaping paths, and so on and so forth. Whilst I\u0026rsquo;d like to improve my skills\nwith the shell, in the meantime I have discovered another option, \u003ccode\u003erename\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eNow, when I say \u003ccode\u003erename\u003c/code\u003e, there is \u003ca href=\"http://unix.stackexchange.com/questions/229230/whats-with-all-the-renames\"\u003esome confusion\u003c/a\u003e about various different\nversions of this utility. I\u0026rsquo;ve been using the version included with Ubuntu\nTrusty 14.04 and also \u003ca href=\"http://plasmasturm.org/code/rename/\"\u003ethe version included in Homebrew\u003c/a\u003e on macOS Sierra.\nThe examples below work with both of these versions.\u003c/p\u003e\n\u003cp\u003eA good understanding of regular expressions (the Perl variety) will allow you\nto get the most out of \u003ccode\u003erename\u003c/code\u003e but you can still use it in a basic fashion and\nget great results.\u003c/p\u003e\n\u003ch2 id=\"some-examples\"\u003eSome examples\u003c/h2\u003e\n\u003cp\u003eTake these files.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e01-run_the_jewels-run_the_jewels.flac\n02-run_the_jewels-banana_clipper_(feat._big_boi).flac\n03-run_the_jewels-36_inch_chain.flac\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLet\u0026rsquo;s make the filenames uppercase (because we are monsters).\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ rename -n \u0026#39;y/a-z/A-Z/ *.flac\n01-run_the_jewels-run_the_jewels.flac renamed as 01-RUN_THE_JEWELS-RUN_THE_JEWELS.FLAC\n02-run_the_jewels-banana_clipper_(feat._big_boi).flac renamed as 02-RUN_THE_JEWELS-BANANA_CLIPPER_(FEAT._BIG_BOI).FLAC\n03-run_the_jewels-36_inch_chain.flac renamed as 03-RUN_THE_JEWELS-36_INCH_CHAIN.FLAC\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou\u0026rsquo;ll notice that \u003ccode\u003erename\u003c/code\u003e prints out the renaming it \u003cem\u003ewould\u003c/em\u003e do. This is\nbecause we\u0026rsquo;ve used the \u003ccode\u003e-n\u003c/code\u003e flag, which turns on dry runs allowing us to see\nthe changes that will be made before we commit to changing them. You\u0026rsquo;ll find\n\u003ccode\u003e-n\u003c/code\u003e invaluable when using \u003ccode\u003erename\u003c/code\u003e, especially when new to it.\u003c/p\u003e\n\u003cp\u003eLet\u0026rsquo;s change dashes and underscores to spaces instead.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ rename -n \u0026#39;s/-|_/ /g\u0026#39; *.flac\n\u0026#39;01-run_the_jewels-run_the_jewels.flac\u0026#39; would be renamed to \u0026#39;01 run the jewels run the jewels.flac\u0026#39;\n\u0026#39;02-run_the_jewels-banana_clipper_(feat._big_boi).flac\u0026#39; would be renamed to \u0026#39;02 run the jewels banana clipper (feat. big boi).flac\u0026#39;\n\u0026#39;03-run_the_jewels-36_inch_chain.flac\u0026#39; would be renamed to \u0026#39;03 run the jewels 36 inch chain.flac\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr remove \u003ccode\u003e-run_the_jewels-\u003c/code\u003e from the filename entirely.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ rename -n \u0026#39;s/-run_the_jewels-/ /g\u0026#39; *.flac\n\u0026#39;01-run_the_jewels-run_the_jewels.flac\u0026#39; would be renamed to \u0026#39;01 run_the_jewels.flac\u0026#39;\n\u0026#39;02-run_the_jewels-banana_clipper_(feat._big_boi).flac\u0026#39; would be renamed to \u0026#39;02 banana_clipper_(feat._big_boi).flac\u0026#39;\n\u0026#39;03-run_the_jewels-36_inch_chain.flac\u0026#39; would be renamed to \u0026#39;03 36_inch_chain.flac\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eGetting a bit more advanced, you can even use captures in your expression. Take\na directory of files with names like this.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eS03E01-oh-em-gee-i-love-telly.mkv\nS03E02-thrilling-watch.mkv\nS03E03-a-great-episode.mkv\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWe\u0026rsquo;ll rename the filenames to look like \u003ccode\u003eS??E??.mkv\u003c/code\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ rename -n \u0026#39;s/.*(S\\d{1,2}E\\d{1,2}).*(.{3}$)/$1.$2/g\u0026#39; *.mkv\n\u0026#39;S03E01-oh-em-gee-i-love-telly.mkv\u0026#39; would be renamed to \u0026#39;S03E01.mkv\u0026#39;\n\u0026#39;S03E02-thrilling-watch.mkv\u0026#39; would be renamed to \u0026#39;S03E02.mkv\u0026#39;\n\u0026#39;S03E03-a-great-episode.mkv\u0026#39; would be renamed to \u0026#39;S03E03.mkv\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe regular expression matches the \u003ccode\u003eS??E??\u003c/code\u003e part of the filename as \u003ccode\u003e$1\u003c/code\u003e, and the extension \u003ccode\u003e.mkv\u003c/code\u003e\nas \u003ccode\u003e$2\u003c/code\u003e, and uses them both to construct a new filename like \u003ccode\u003eS03E01.mkv\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThat regular expression is quite a mouthfull, so I\u0026rsquo;d recommend using a tool\nto help you construct your expressions. I personally use \u003ca href=\"http://rubular.com/\"\u003eRubular\u003c/a\u003e even\nthough it\u0026rsquo;s Ruby-specific; it does a good job for me.\u003c/p\u003e\n\u003cp\u003eI hope you can get a sense of how powerful \u003ccode\u003erename\u003c/code\u003e can be. Regular expressions\nare the limit to how you can rename files.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eRenaming files en masse was always something that I knew the commandline could\nexcel at but that I\u0026rsquo;d never managed to easily replicate daily. I\u0026rsquo;d always have\nto look up the shell syntax for looping over a list of files, and the rules for\nescaping paths, and so on and so forth. Whilst I\u0026rsquo;d like to improve my skills\nwith the shell, in the meantime I have discovered another option, \u003ccode\u003erename\u003c/code\u003e.\u003c/p\u003e",
      "date_published": "2017-01-31T00:00:00+00:00",
      "date_modified": "2017-01-31T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/how-i-added-heading-anchors-with-middleman/",
      "url": "https://elver.me/blog/how-i-added-heading-anchors-with-middleman/",
      "title": "How I added heading anchors with Middleman",
      "content_html": "\u003cp\u003eI really like being able to link directly to certain parts of web page.\nUnfortunately, many page authors fail to add the necessary anchors to make\nthis possible. Until recently, this included me!\u003c/p\u003e\n\u003cp\u003eHere is how I remedied the situation.\u003c/p\u003e\n\u003cp\u003eOutputting headings with id attributes \u003ca href=\"https://forum.middlemanapp.com/t/using-a-custom-redcarpet-renderer/1004\"\u003elooked like it should\u0026rsquo;ve already been\nsupported out of the box\u003c/a\u003e. I could see a \u003ccode\u003etoc_data\u003c/code\u003e option, but for some\nreason this didn\u0026rsquo;t work for me, so I created a custom Markdown renderer\ninstead.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003erequire\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;middleman-core/renderers/redcarpet\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eCustomRenderer\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026lt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eMiddleman\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eRenderers\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eMiddlemanRedcarpetHTML\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003eheader\u003c/span\u003e(text, header_level)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#d14\"\u003e\u0026#34;\u0026lt;h%s id=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e%s\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026gt;%s\u0026lt;/h%s\u0026gt;\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e%\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003eheader_level, text\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eparameterize, text, header_level\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI inherit from the default renderer so that I can replace the \u003ccode\u003eheader\u003c/code\u003e\nimplementation to add the necessary \u003ccode\u003eid\u003c/code\u003e attributes.\u003c/p\u003e\n\u003cp\u003eI required it in my \u003ccode\u003econfig.rb\u003c/code\u003e and then configured \u003ca href=\"https://github.com/vmg/redcarpet\"\u003eRedcarpet\u003c/a\u003e to use the\nnew renderer.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eset \u003cspan style=\"color:#990073\"\u003e:markdown\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#990073\"\u003efenced_code_blocks\u003c/span\u003e: \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#990073\"\u003esmartypants\u003c/span\u003e: \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#990073\"\u003erenderer\u003c/span\u003e: \u003cspan style=\"color:#008080\"\u003eCustomRenderer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThere we have it. Heading tags now have ids, so we can link directly to them.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI really like being able to link directly to certain parts of web page.\nUnfortunately, many page authors fail to add the necessary anchors to make\nthis possible. Until recently, this included me!\u003c/p\u003e\n\u003cp\u003eHere is how I remedied the situation.\u003c/p\u003e\n\u003cp\u003eOutputting headings with id attributes \u003ca href=\"https://forum.middlemanapp.com/t/using-a-custom-redcarpet-renderer/1004\"\u003elooked like it should\u0026rsquo;ve already been\nsupported out of the box\u003c/a\u003e. I could see a \u003ccode\u003etoc_data\u003c/code\u003e option, but for some\nreason this didn\u0026rsquo;t work for me, so I created a custom Markdown renderer\ninstead.\u003c/p\u003e",
      "date_published": "2016-03-19T00:00:00+00:00",
      "date_modified": "2016-03-19T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/free-ssl-with-amazon-certificate-manager-and-cloudfront/",
      "url": "https://elver.me/blog/free-ssl-with-amazon-certificate-manager-and-cloudfront/",
      "title": "Free SSL with Amazon Certificate Manager and Cloudfront",
      "content_html": "\u003cp\u003eFollowing my \u003ca href=\"/blog/moving-to-amazon-s3/\"\u003erecent move to Amazon S3\u003c/a\u003e I\u0026rsquo;ve now gone one step further and\nadded \u003ca href=\"https://aws.amazon.com/cloudfront/\"\u003eCloudfront\u003c/a\u003e to the mix. Cloudfront is a \u003ca href=\"https://en.wikipedia.org/wiki/Content_delivery_network\"\u003eCDN\u003c/a\u003e; it puts web pages\ncloser to the client so they\u0026rsquo;re faster. Faster is better. However, my\nmotivation for adding Cloudfront was not speed, it was SSL.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;d already been toying with the idea of adding SSL to this site with\n\u003ca href=\"https://www.cloudflare.com/\"\u003eCloudflare\u003c/a\u003e when fellow \u003ca href=\"http://www.meetup.com/bathruby/\"\u003eBath Ruby\u003c/a\u003e attendee Paul Leader \u003ca href=\"https://twitter.com/NoNeeeed/status/690544764706504705\"\u003etold me\nthat Amazon were offering free SSL\u003c/a\u003e through their \u003ca href=\"https://aws.amazon.com/blogs/aws/new-aws-certificate-manager-deploy-ssltls-based-apps-on-aws/\"\u003erecently announced\nAmazon Certificate Manager\u003c/a\u003e product. I decided to give it a try.\u003c/p\u003e\n\u003ch2 id=\"why-ssl\"\u003eWhy SSL?\u003c/h2\u003e\n\u003cp\u003ePrivacy and trust. Visitors to this site are getting the version of this page\nthat I publish. No one can interfere or tamper with it. No ads or malware can\nbe inserted. And why not? SSL is no longer expensive to implement. Gone are the\ndays of being extorted by companies selling SSL certificates. SSL is now freely\navailable from the likes of Cloudflare, Amazon and, perhaps more importantly,\n\u003ca href=\"https://letsencrypt.org/\"\u003eLet\u0026rsquo;s Encrypt\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"amazon-certificate-manager\"\u003eAmazon Certificate Manager?\u003c/h2\u003e\n\u003cp\u003eAs with all Amazon products it\u0026rsquo;s often difficult to understand a) What it is;\nand b) What it\u0026rsquo;s for. Amazon Certificate Manager allows you to create SSL\ncertificates for free and easily use them with Amazon products. Currently,\n\u003ca href=\"https://aws.amazon.com/elasticloadbalancing/\"\u003eELB\u003c/a\u003e and Cloudfront are supported. The best part is that they automatically\nhandle renewals for you! Once setup, there is no maintenance to do.\u003c/p\u003e\n\u003ch2 id=\"setup\"\u003eSetup\u003c/h2\u003e\n\u003ch3 id=\"distribution-setup\"\u003eDistribution setup\u003c/h3\u003e\n\u003cp\u003eCloudfront has a concept called Distributions. A distribution is a set of files\nthat Amazon will distribute across the world to be served from it\u0026rsquo;s \u003ca href=\"https://aws.amazon.com/about-aws/global-infrastructure/\"\u003eedge\nlocations\u003c/a\u003e meaning the files will be geographically closer to the client\nrequesting them.\u003c/p\u003e\n\u003cp\u003eSetting up the distribution looks fairly complex but I went with the defaults\nand it seems to work well. You can point a distribution straight to an S3\nbucket but I found that not all of my pages were picked up by Cloudfront if I\ndid it that way. Index pages were missed for some reason. The fix was to\npoint the distribution at the Amazon S3 URL instead. The pages were then all\ncorrectly picked up.\u003c/p\u003e\n\u003ch3 id=\"dns-changes\"\u003eDNS changes\u003c/h3\u003e\n\u003cp\u003eLike using S3 directly a very simple change is required. I already had an\n\u003ccode\u003eALIAS\u003c/code\u003e record to point from \u003ccode\u003ejordanelver.co.uk\u003c/code\u003e to\n\u003ccode\u003ejordanelver-co-uk.s3-website-eu-west-1.amazonaws.com\u003c/code\u003e. I\u0026rsquo;ve now changed that\n\u003ccode\u003eALIAS\u003c/code\u003e to point to the Cloudfront address instead, which is\n\u003ccode\u003ed1jmxhequyb081.cloudfront.net\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"invalidating-the-cache\"\u003eInvalidating the cache\u003c/h3\u003e\n\u003cp\u003eNow that the site content is spread across Amazon\u0026rsquo;s network and cached\nappropriately, the cache will need to be invalidated when new files are\ndeployed to S3 or we\u0026rsquo;ll be serving stale content. \u003ca href=\"https://github.com/andrusha/middleman-cloudfront\"\u003eThere is a Middleman\nextension to handle this\u003c/a\u003e but at the moment I\u0026rsquo;m manually invalidating the\ncache through the Amazon Cloudfront console. As I deploy infrequently it isn\u0026rsquo;t\na problem for me to do it manually at the moment but I might end up using\nthat extension eventually.\u003c/p\u003e\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003c/h2\u003e\n\u003cp\u003eI thought that the site was fairly speedy when served as a \u003ca href=\"https://github.com/rack/rack\"\u003erack\u003c/a\u003e app on\nHeroku. The speed seemed to increase when I moved to S3 but now it\u0026rsquo;s on\nCloudfront it \u003cem\u003efeels\u003c/em\u003e noticably faster! Combine those speed increases with free\nSSL and I\u0026rsquo;m very happy.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eFollowing my \u003ca href=\"/blog/moving-to-amazon-s3/\"\u003erecent move to Amazon S3\u003c/a\u003e I\u0026rsquo;ve now gone one step further and\nadded \u003ca href=\"https://aws.amazon.com/cloudfront/\"\u003eCloudfront\u003c/a\u003e to the mix. Cloudfront is a \u003ca href=\"https://en.wikipedia.org/wiki/Content_delivery_network\"\u003eCDN\u003c/a\u003e; it puts web pages\ncloser to the client so they\u0026rsquo;re faster. Faster is better. However, my\nmotivation for adding Cloudfront was not speed, it was SSL.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;d already been toying with the idea of adding SSL to this site with\n\u003ca href=\"https://www.cloudflare.com/\"\u003eCloudflare\u003c/a\u003e when fellow \u003ca href=\"http://www.meetup.com/bathruby/\"\u003eBath Ruby\u003c/a\u003e attendee Paul Leader \u003ca href=\"https://twitter.com/NoNeeeed/status/690544764706504705\"\u003etold me\nthat Amazon were offering free SSL\u003c/a\u003e through their \u003ca href=\"https://aws.amazon.com/blogs/aws/new-aws-certificate-manager-deploy-ssltls-based-apps-on-aws/\"\u003erecently announced\nAmazon Certificate Manager\u003c/a\u003e product. I decided to give it a try.\u003c/p\u003e",
      "date_published": "2016-02-16T00:00:00+00:00",
      "date_modified": "2016-02-16T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/moving-to-amazon-s3/",
      "url": "https://elver.me/blog/moving-to-amazon-s3/",
      "title": "Moving to Amazon S3",
      "content_html": "\u003cp\u003eA couple of years ago \u003ca href=\"/blog/how-i-deployed-middleman-to-heroku/\"\u003eI wrote about how I deployed this blog to Heroku\u003c/a\u003e.\nSince then everything has changed; it is now served from \u003ca href=\"https://aws.amazon.com/s3/\"\u003eAmazon S3\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"why-change\"\u003eWhy change?\u003c/h2\u003e\n\u003cp\u003eIt was prompted by \u003ca href=\"https://blog.heroku.com/archives/2015/6/15/dynos-pricing-ga\"\u003eHeroku\u0026rsquo;s price changes last year\u003c/a\u003e. I think their new\npricing model is completely reasonable, and their \u0026ldquo;free\u0026rdquo; product still\ngenerous, but Heroku \u003cem\u003ecan\u003c/em\u003e get expensive. This low traffic site will cost very\nlittle to host with Amazon.\u003c/p\u003e\n\u003cp\u003eIt seemed like a no-brainer to try it out, and this is how I did it.\u003c/p\u003e\n\u003ch2 id=\"setting-up-static-website-hosting\"\u003eSetting up Static Website Hosting\u003c/h2\u003e\n\u003cp\u003eAmazon offer Static Website Hosting as a feature of S3. This serves a\nbucket over HTTP at a URL that Amazon gives you. The first step was to create a\nbucket to host the files. This is easily done through the \u003ca href=\"https://aws.amazon.com/console/\"\u003eAmazon S3\nconsole\u003c/a\u003e. I called mine jordanelver.co.uk, not because I\u0026rsquo;m self-obsessed,\nbut because that is the name of this website.\u003c/p\u003e\n\u003cp\u003eConfiguring the bucket to serve the site was straight forward. Once I\u0026rsquo;d enabled\nStatic Website Hosting in the bucket properties, the site was available at\n\u003ccode\u003ejordanelver-co-uk.s3-website-eu-west-1.amazonaws.com\u003c/code\u003e. Of course, I hadn\u0026rsquo;t\ntransferred anything to Amazon at this point, and the permissions were not yet\nset, so nothing but an error message was served at this point.\u003c/p\u003e\n\u003ch2 id=\"permissions\"\u003ePermissions\u003c/h2\u003e\n\u003cp\u003eSetting the correct permissions was by far the most confusing part of the whole\nprocess. There are two parts to this 1) creating a user to interact with S3;\nand 2) setting the correct bucket permissions.\u003c/p\u003e\n\u003cp\u003eI first setup an \u003ca href=\"http://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html\"\u003eIAM user\u003c/a\u003e that had access to the correct bucket.  This\nallowed me to upload the files to Amazon. These credentials are used later as\npart of the automated deployment.\u003c/p\u003e\n\u003cp\u003eThe second part is allowing the files in S3 to be served over HTTP to the public.\nBy default files in S3 are not publically available, for obvious reasons. I\nused the following policy to allow the files to be read. This is added through\nthe bucket properties.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e{\n  \u0026#34;Version\u0026#34;: \u0026#34;2012-10-17\u0026#34;,\n  \u0026#34;Statement\u0026#34;: [\n    {\n      \u0026#34;Sid\u0026#34;: \u0026#34;PublicReadGetObject\u0026#34;,\n      \u0026#34;Effect\u0026#34;: \u0026#34;Allow\u0026#34;,\n      \u0026#34;Principal\u0026#34;: \u0026#34;*\u0026#34;,\n      \u0026#34;Action\u0026#34;: \u0026#34;s3:GetObject\u0026#34;,\n      \u0026#34;Resource\u0026#34;: \u0026#34;arn:aws:s3:::jordanelver.co.uk/*\u0026#34;\n    }\n  ]\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"deploying-with-middleman\"\u003eDeploying with Middleman\u003c/h2\u003e\n\u003cp\u003eMoving away from Heroku meant losing the ability to deploy using \u003ccode\u003egit push\u003c/code\u003e so\nI went looking for other methods. Luckily, \u003ca href=\"https://directory.middlemanapp.com/#/extensions/deployment/\"\u003eMiddleman has many extensions\navailable\u003c/a\u003e to help with automating deployment. I decided on\n\u003ca href=\"https://github.com/fredjean/middleman-s3_sync\"\u003eMiddleman::S3Sync\u003c/a\u003e as it only transfers files that have changed, rather\nthan transferring everything each time, which seems like a good thing.\u003c/p\u003e\n\u003cp\u003eI added \u003ccode\u003egem 'middleman-s3_sync'\u003c/code\u003e to my \u003ccode\u003eGemfile\u003c/code\u003e, ran \u003ccode\u003ebundle\u003c/code\u003e and added the\nfollowing config to my \u003ccode\u003econfig.rb\u003c/code\u003e file.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eactivate \u003cspan style=\"color:#990073\"\u003e:s3_sync\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003es3_sync\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  s3_sync\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003edelete                     \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  s3_sync\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eafter_build                \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  s3_sync\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eprefer_gzip                \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  s3_sync\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003epath_style                 \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  s3_sync\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003ereduced_redundancy_storage \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  s3_sync\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eacl                        \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;public-read\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  s3_sync\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eencryption                 \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  s3_sync\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eversion_bucket             \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  s3_sync\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eindex_document             \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;index.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  s3_sync\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eerror_document             \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;404.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe sync process needs to know what the bucket name is, the Amazon region, and\nthe user credentials to upload the files. \u003ca href=\"https://github.com/fredjean/middleman-s3_sync#setting-aws-credentials\"\u003eThere are several supported\nmethods\u003c/a\u003e and I choose to use a \u003ccode\u003e.s3_sync\u003c/code\u003e file.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#555\"\u003e---\u003c/span\u003e\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000080\"\u003ebucket\u003c/span\u003e:\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003ejordanelver.co.uk\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000080\"\u003eregion\u003c/span\u003e:\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003eeu-west-1\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000080\"\u003eaws_access_key_id\u003c/span\u003e:\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u0026lt;ACCESS_KEY_ID\u0026gt;\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#bbb\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000080\"\u003eaws_secret_access_key\u003c/span\u003e:\u003cspan style=\"color:#bbb\"\u003e \u003c/span\u003e\u0026lt;SECRET_ACCESS_KEY\u0026gt;\u003cspan style=\"color:#bbb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDeploying the site is now as simple as first building with \u003ccode\u003emiddleman build\u003c/code\u003e and\nthen syncing with \u003ccode\u003emiddleman s3_sync\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"dns-changes\"\u003eDNS changes\u003c/h2\u003e\n\u003cp\u003eThe final step is to hook up the domain name to the bucket. I use \u003ca href=\"https://dnsimple.com/r/d7a9918c2a5dd7\"\u003eDNSimple\u003c/a\u003e\nto host my DNS which makes the changes required simple. I setup an \u003ccode\u003eALIAS\u003c/code\u003e\nrecord to point from \u003ccode\u003ejordanelver.co.uk\u003c/code\u003e to\n\u003ccode\u003ejordanelver-co-uk.s3-website-eu-west-1.amazonaws.com\u003c/code\u003e and the site is now\nserved at this domain name.\u003c/p\u003e\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m very happy with this setup so far. Once you\u0026rsquo;ve set it up the first time, the\nprocess can easily be replicated to add additional sites. I can see that I\u0026rsquo;ll\ncontinue to use this method of hosting for my \u0026ldquo;holding page\u0026rdquo; and static sites\nneeds.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eA couple of years ago \u003ca href=\"/blog/how-i-deployed-middleman-to-heroku/\"\u003eI wrote about how I deployed this blog to Heroku\u003c/a\u003e.\nSince then everything has changed; it is now served from \u003ca href=\"https://aws.amazon.com/s3/\"\u003eAmazon S3\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"why-change\"\u003eWhy change?\u003c/h2\u003e\n\u003cp\u003eIt was prompted by \u003ca href=\"https://blog.heroku.com/archives/2015/6/15/dynos-pricing-ga\"\u003eHeroku\u0026rsquo;s price changes last year\u003c/a\u003e. I think their new\npricing model is completely reasonable, and their \u0026ldquo;free\u0026rdquo; product still\ngenerous, but Heroku \u003cem\u003ecan\u003c/em\u003e get expensive. This low traffic site will cost very\nlittle to host with Amazon.\u003c/p\u003e\n\u003cp\u003eIt seemed like a no-brainer to try it out, and this is how I did it.\u003c/p\u003e",
      "date_published": "2016-01-25T00:00:00+00:00",
      "date_modified": "2016-01-25T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/working-with-vim-colorschemes/",
      "url": "https://elver.me/blog/working-with-vim-colorschemes/",
      "title": "Working with Vim highlight groups",
      "content_html": "\u003cp\u003eHighlight groups are used in Vim to control how the user interface will look.\nFor example, to change the colour of highlighted search items, you would add\nthis line to your \u003ccode\u003e~/.vimrc\u003c/code\u003e or colorscheme in \u003ccode\u003e~/.vim/colors/\u003c/code\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ehighlight Search ctermfg=0 ctermbg=226\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis would make highlighted search items show up with a yellow background and\nblack text (when running in a terminal). This allows customisation of\neverything you see on screen. However, given the breadth of customisation\npossible it can be difficult to figure out which groups apply to the particular\nitem you want to change.\u003c/p\u003e\n\u003ch2 id=\"showing-highlight-groups\"\u003eShowing highlight groups\u003c/h2\u003e\n\u003cp\u003eThis function will show what groups are being applied. Add to your \u003ccode\u003e~/.vimrc\u003c/code\u003e,\nplace your cursor over the item in question, and press \u003ccode\u003e\u0026lt;leader\u0026gt;sp\u003c/code\u003e to output\nthe groups.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-viml\" data-lang=\"viml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enmap \u0026lt;leader\u0026gt;sp :call \u0026lt;SID\u0026gt;SynStack()\u0026lt;CR\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e! \u0026lt;SID\u0026gt;SynStack()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e !exists(\u003cspan style=\"color:#d14\"\u003e\u0026#34;*synstack\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    return\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eendif\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  echo \u003cspan style=\"color:#000;font-weight:bold\"\u003emap\u003c/span\u003e(synstack(line(\u003cspan style=\"color:#d14\"\u003e\u0026#39;.\u0026#39;\u003c/span\u003e), col(\u003cspan style=\"color:#d14\"\u003e\u0026#39;.\u0026#39;\u003c/span\u003e)), \u003cspan style=\"color:#d14\"\u003e\u0026#39;synIDattr(v:val, \u0026#34;name\u0026#34;)\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eendfunc\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFor example, placing my cursor over a comment in a Ruby file gives this output.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[\u0026#39;rubyMultilineComment\u0026#39;, \u0026#39;rubyComment\u0026#39;]\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can now change how Ruby comments look using these groups.\u003c/p\u003e\n\u003cp\u003eThis should greatly help when modifying colorschemes.\u003c/p\u003e\n\u003ch2 id=\"outputting-all-highlight-groups\"\u003eOutputting all highlight groups\u003c/h2\u003e\n\u003cp\u003eIt can also be very useful to see how all highlight groups look.\u003c/p\u003e\n\u003cp\u003eWhilst browsing the highlight help page recently (\u003ccode\u003e:help highlight\u003c/code\u003e) I found\nthat you can output all groups currently active using a script that comes with\nVim. Running \u003ccode\u003e:so $VIMRUNTIME/syntax/hitest.vim\u003c/code\u003e will show something similar to\nbelow.\u003c/p\u003e\n\u003cimg src=\"/images/highlight-groups.png\" /\u003e\n\u003cp\u003eThere are many more lines in the full output, but it should be clear that this\nis very useful when debugging colorschemes.\u003c/p\u003e\n\u003cp\u003eVim colorschemes should now be easier to create and modify.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eHighlight groups are used in Vim to control how the user interface will look.\nFor example, to change the colour of highlighted search items, you would add\nthis line to your \u003ccode\u003e~/.vimrc\u003c/code\u003e or colorscheme in \u003ccode\u003e~/.vim/colors/\u003c/code\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ehighlight Search ctermfg=0 ctermbg=226\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis would make highlighted search items show up with a yellow background and\nblack text (when running in a terminal). This allows customisation of\neverything you see on screen. However, given the breadth of customisation\npossible it can be difficult to figure out which groups apply to the particular\nitem you want to change.\u003c/p\u003e",
      "date_published": "2015-05-27T00:00:00+00:00",
      "date_modified": "2015-05-27T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/backups-for-the-truly-paranoid/",
      "url": "https://elver.me/blog/backups-for-the-truly-paranoid/",
      "title": "Backups for the truly paranoid",
      "content_html": "\u003cp\u003eI\u0026rsquo;ve been meaning to sort out a proper backup solution for a long, long time.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve never lost data on my main machine, but I\u0026rsquo;ve been lucky. It does happen, I\nrecently had a file server with disks in \u003ca href=\"http://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_5\"\u003eRAID5\u003c/a\u003e fail. I\u0026rsquo;m most concerned\nabout hardware failure. I\u0026rsquo;m fairly conservative when it comes to deleting\nfiles, so I don\u0026rsquo;t tend to do it by accident. I\u0026rsquo;m sure it will happen one day,\nbut I think I\u0026rsquo;m much more likely to suffer data loss via catastrophic hardware\nfailure than by accidental deletion.\u003c/p\u003e\n\u003ch2 id=\"strategy\"\u003eStrategy\u003c/h2\u003e\n\u003cp\u003eMy general strategy is to have several backups, in different locations, for\ndifferent purposes. To spread the data out. My current setup has a local clone,\na local incremental backup, and an offsite incremental backup.\u003c/p\u003e\n\u003ch3 id=\"local-clone\"\u003eLocal clone\u003c/h3\u003e\n\u003cp\u003eThe idea of having a local clone is to get back up and running as soon as\npossible in the event of hardware failure or loss. I can boot from the clone\nand carry on working or use it to restore to a new computer.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m using \u003ca href=\"http://www.shirt-pocket.com/SuperDuper/\"\u003eSuperDuper!\u003c/a\u003e to create a bootable clone to an external hard drive\nevery night. \u003ca href=\"https://www.bombich.com/\"\u003eCarbon Copy Cloner\u003c/a\u003e is another popular alternative, but I\u0026rsquo;ve\nfound SuperDuper! meets my needs at the moment.\u003c/p\u003e\n\u003cp\u003eI used my clone to restore recently due to a non-catastrophic problem with a\nnew computer, so I\u0026rsquo;m fairly certain that it will work when it\u0026rsquo;s needed.  I will\nboot from it periodically to test.\u003c/p\u003e\n\u003ch3 id=\"local-incremental-backup\"\u003eLocal incremental backup\u003c/h3\u003e\n\u003cp\u003eFor a local incremental backup I\u0026rsquo;m using \u003ca href=\"http://en.wikipedia.org/wiki/Time_Machine_(OS_X)\"\u003eTime Machine\u003c/a\u003e to an external hard\ndrive. This allows me to retrieve files from different time periods.  Time\nMachine backs up on an hourly basis.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s free and stays out of the way most of the time.\u003c/p\u003e\n\u003ch3 id=\"offsite-incremental-backup\"\u003eOffsite incremental backup\u003c/h3\u003e\n\u003cp\u003eFor the offsite backup, I\u0026rsquo;m only uploading user data, not system files. This\nis not a full system backup. I don\u0026rsquo;t intend to ever use this backup except for\nin truly disasterous sitations i.e. my computer and local backup disks are\neither destroyed or lost.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m using \u003ca href=\"https://www.haystacksoftware.com/arq/\"\u003eArq\u003c/a\u003e to do the backing up. Arq has a good reputation and can\nbackup to \u003ca href=\"https://www.google.co.uk/drive/\"\u003eGoogle Drive\u003c/a\u003e, \u003ca href=\"https://www.dropbox.com\"\u003eDropbox\u003c/a\u003e, \u003ca href=\"http://aws.amazon.com/s3/\"\u003eAmazon S3 or Glacier\u003c/a\u003e and\n\u003ca href=\"https://onedrive.live.com\"\u003eMicrosoft OneDrive\u003c/a\u003e. It can also backup to \u003ca href=\"https://cloud.google.com/storage/docs/nearline-storage\"\u003eGoogle Nearline\u003c/a\u003e which is a\nnew competitor to Amazon\u0026rsquo;s offerings. I decided to give Nearline a try.\u003c/p\u003e\n\u003cp\u003eThe initial backup of approximately 200GB took around 5 days. Unfortunately, I\nexperienced some errors before it completed. It did complete in the end, and\nseems fine, but any sort of error message does not inspire confidence.\u003c/p\u003e\n\u003cp\u003eThis backup should only cost a few dollars per month. It does seem to be\nbacking up more data than I expected though, so I will need to monitor this to\nstop it getting too large and increasing the cost.\u003c/p\u003e\n\u003cp\u003eI can see me trying out other services such as \u003ca href=\"https://www.backblaze.com\"\u003eBackblaze\u003c/a\u003e or\n\u003ca href=\"http://www.code42.com/crashplan/\"\u003eCrashplan\u003c/a\u003e in the future.\u003c/p\u003e\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003c/h2\u003e\n\u003cp\u003eThis setup is still a work in progress. There are some parts that I\u0026rsquo;m happy\nwith and others which make me feel uneasy. I can see my offsite backup changing\nin the future due to the flakiness I\u0026rsquo;ve experienced with Arq and Google.\nHowever, I do feel that there is a good level of data redundancy and the\nbackups are spread out enough. I should now hopefully be able to sleep better\nat night.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI\u0026rsquo;ve been meaning to sort out a proper backup solution for a long, long time.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve never lost data on my main machine, but I\u0026rsquo;ve been lucky. It does happen, I\nrecently had a file server with disks in \u003ca href=\"http://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_5\"\u003eRAID5\u003c/a\u003e fail. I\u0026rsquo;m most concerned\nabout hardware failure. I\u0026rsquo;m fairly conservative when it comes to deleting\nfiles, so I don\u0026rsquo;t tend to do it by accident. I\u0026rsquo;m sure it will happen one day,\nbut I think I\u0026rsquo;m much more likely to suffer data loss via catastrophic hardware\nfailure than by accidental deletion.\u003c/p\u003e",
      "date_published": "2015-04-29T00:00:00+00:00",
      "date_modified": "2015-04-29T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/how-to-compile-the-tmk-keyboard-firmware-for-ergodox-on-mac-os-x/",
      "url": "https://elver.me/blog/how-to-compile-the-tmk-keyboard-firmware-for-ergodox-on-mac-os-x/",
      "title": "How to compile the tmk_keyboard firmware for ErgoDox on Mac OS X",
      "content_html": "\u003cp\u003eI received my \u003ca href=\"http://ergodox.org/\"\u003eErgoDox keyboard\u003c/a\u003e from \u003ca href=\"https://www.massdrop.com/buy/ergodox?s=ergodox\"\u003eMassdrop\u003c/a\u003e a month or so ago. After\na false start because of some missing parts, and with the \u003ca href=\"https://twitter.com/richbezz\"\u003ehelp of a friend\u003c/a\u003e\nhandy with a soldering iron, it is now up and running.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve wanted to try the \u003ca href=\"https://normanlayout.info/\"\u003eNorman layout\u003c/a\u003e for a while. This seemed like the\nperfect opportunity. The ErgoDox is so different anyway, changing the layout\nwould should not pose too much of a problem? That\u0026rsquo;s the theory. Unfortunately,\nthe \u003ca href=\"https://github.com/benblazak/ergodox-firmware\"\u003e\u0026ldquo;official\u0026rdquo; ErgoDox firmware\u003c/a\u003e doesn\u0026rsquo;t come with Norman. I didn\u0026rsquo;t want to\nstart hacking at keyboard firmware before even getting it up and running, so I\ndecided to try \u003ca href=\"https://github.com/tmk/tmk_keyboard\"\u003etmk_keyboard\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThis is how I got it working.\u003c/p\u003e\n\u003ch2 id=\"install-dependencies\"\u003eInstall dependencies\u003c/h2\u003e\n\u003cp\u003eWe need to install \u003ca href=\"http://www.nongnu.org/avr-libc/\"\u003eAVR Libc\u003c/a\u003e. This package contains C libraries for AVR\nmicrocontrollers (used by the \u003ca href=\"https://www.pjrc.com/teensy/\"\u003eTeensy\u003c/a\u003e microcontroller in the ErgoDox) and most\nimportantly for us, a version of GCC that will allow us to build the firmware.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAVR Libc is a Free Software project whose goal is to provide a high quality C\nlibrary for use with GCC on Atmel AVR microcontrollers.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eYou can install the dependencies using \u003ca href=\"http://brew.sh/\"\u003eHomebrew\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ brew tap larsimmisch/avr\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ brew install avr-libc\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"build-the-firmware\"\u003eBuild the firmware\u003c/h2\u003e\n\u003cp\u003eThere are many versions of the \u003ccode\u003etmk_keyboard\u003c/code\u003e firmware available on GitHub. I\u0026rsquo;m\nusing \u003ca href=\"https://github.com/tenderlove/tmk_keyboard\"\u003eTenderlove\u0026rsquo;s fork\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eGet the source code.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit clone git@github.com:tenderlove/tmk_keyboard.git\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eChange to the ErgoDox keyboard firmware directory.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003ecd\u003c/span\u003e tmk_keyboard/keyboard/ergodox\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBuild the firmware.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emake clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emake -f Makefile\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYou should now have a file called \u003ccode\u003eergodox_pjrc.hex\u003c/code\u003e in the directory. This is\nwhat you need to load onto the keyboard.\u003c/p\u003e\n\u003ch2 id=\"install-the-firmware\"\u003eInstall the firmware\u003c/h2\u003e\n\u003cp\u003eI used the Teensy Loader app. Follow the \u003ca href=\"http://www.pjrc.com/teensy/loader_mac.html\"\u003einstructions on their website\u003c/a\u003e\nchoosing the \u003ccode\u003eergodox_pjrc.hex\u003c/code\u003e file that we just built.\u003c/p\u003e\n\u003cp\u003eHopefully, that should be it. Good luck fellow ErgoDox owners!\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI received my \u003ca href=\"http://ergodox.org/\"\u003eErgoDox keyboard\u003c/a\u003e from \u003ca href=\"https://www.massdrop.com/buy/ergodox?s=ergodox\"\u003eMassdrop\u003c/a\u003e a month or so ago. After\na false start because of some missing parts, and with the \u003ca href=\"https://twitter.com/richbezz\"\u003ehelp of a friend\u003c/a\u003e\nhandy with a soldering iron, it is now up and running.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve wanted to try the \u003ca href=\"https://normanlayout.info/\"\u003eNorman layout\u003c/a\u003e for a while. This seemed like the\nperfect opportunity. The ErgoDox is so different anyway, changing the layout\nwould should not pose too much of a problem? That\u0026rsquo;s the theory. Unfortunately,\nthe \u003ca href=\"https://github.com/benblazak/ergodox-firmware\"\u003e\u0026ldquo;official\u0026rdquo; ErgoDox firmware\u003c/a\u003e doesn\u0026rsquo;t come with Norman. I didn\u0026rsquo;t want to\nstart hacking at keyboard firmware before even getting it up and running, so I\ndecided to try \u003ca href=\"https://github.com/tmk/tmk_keyboard\"\u003etmk_keyboard\u003c/a\u003e.\u003c/p\u003e",
      "date_published": "2015-03-30T00:00:00+00:00",
      "date_modified": "2015-03-30T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/editing-the-commandline-in-vim/",
      "url": "https://elver.me/blog/editing-the-commandline-in-vim/",
      "title": "Editing the command line in Vim",
      "content_html": "\u003cp\u003eConstructing long commands on the command line can quickly get out of control.\nI use Vim keybindings in ZSH, which helps greatly. They allow you to navigate\nthe shell using familiar shortcuts from Vim. Wouldn\u0026rsquo;t it be neat if you could\nedit those commands directly in Vim though?\u003c/p\u003e\n\u003cp\u003eYou can.\u003c/p\u003e\n\u003cimg src=\"/images/edit-in-vim.gif\" /\u003e\n\u003cp\u003eAdd this to your \u003ccode\u003e~/.zshrc\u003c/code\u003e file and reload your terminal.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eautoload edit-command-line\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ezle -N edit-command-line\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebindkey -M vicmd v edit-command-line\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow when you hit \u003ccode\u003eESC\u003c/code\u003e and then \u003ccode\u003ev\u003c/code\u003e, the current command line will open in Vim.\nSaving and exiting (\u003ccode\u003e:wq\u003c/code\u003e) will return you to the command line with the changes\nyou made.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eConstructing long commands on the command line can quickly get out of control.\nI use Vim keybindings in ZSH, which helps greatly. They allow you to navigate\nthe shell using familiar shortcuts from Vim. Wouldn\u0026rsquo;t it be neat if you could\nedit those commands directly in Vim though?\u003c/p\u003e\n\u003cp\u003eYou can.\u003c/p\u003e\n\u003cimg src=\"/images/edit-in-vim.gif\" /\u003e\n\u003cp\u003eAdd this to your \u003ccode\u003e~/.zshrc\u003c/code\u003e file and reload your terminal.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eautoload edit-command-line\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ezle -N edit-command-line\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebindkey -M vicmd v edit-command-line\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow when you hit \u003ccode\u003eESC\u003c/code\u003e and then \u003ccode\u003ev\u003c/code\u003e, the current command line will open in Vim.\nSaving and exiting (\u003ccode\u003e:wq\u003c/code\u003e) will return you to the command line with the changes\nyou made.\u003c/p\u003e",
      "date_published": "2015-02-02T00:00:00+00:00",
      "date_modified": "2015-02-02T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/two-handy-curl-tips-for-working-with-restful-apis/",
      "url": "https://elver.me/blog/two-handy-curl-tips-for-working-with-restful-apis/",
      "title": "Two handy CURL tips for working with RESTful APIs",
      "content_html": "\u003cp\u003eI was recently working on a REST API for an iPhone app. I used \u003ca href=\"http://curl.haxx.se/\"\u003ecurl\u003c/a\u003e\nalongside automated tests to manually test as I built. curl is a great tool but\nif you need to specify lots of arguments, as I did, it can soon become\nunwieldy.\u003c/p\u003e\n\u003cp\u003eThese two tips helped me out.\u003c/p\u003e\n\u003ch2 id=\"1-read-arguments-from-a-file\"\u003e1) Read arguments from a file\u003c/h2\u003e\n\u003cp\u003eI had many arguments to pass when testing the API including the \u003ccode\u003eAccept\u003c/code\u003e and\n\u003ccode\u003eAuthorisation\u003c/code\u003e headers. With those alone, the argument list is already pretty\nbig.\u003c/p\u003e\n\u003cp\u003eLuckily, the authors of curl have thought of this and have \u003ca href=\"http://curl.haxx.se/docs/manpage.html#-K\"\u003ebuilt-in an option\u003c/a\u003e\nfor them to be read from a file.\u003c/p\u003e\n\u003cp\u003eCreate a file for your arguments and list them inside. Mine looked something\nlike this.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e-H \u0026quot;Accept:application/vnd.vendor-v1+json\u0026quot;\n-H \u0026quot;Authorization:Basic cZHV0Z29vdVhBR1...\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThen tell curl where to find them.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ecurl \u0026lt;url\u0026gt; -K path/to/file\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"2-reading-post-data-from-a-file\"\u003e2) Reading POST data from a file\u003c/h2\u003e\n\u003cp\u003eI needed to POST a lot of JSON data at various API endpoints. As with\narguments, you can also tell curl to \u003ca href=\"http://curl.haxx.se/docs/manpage.html#-d\"\u003eread the data from a file\u003c/a\u003e. This is\nespecially useful as formatting JSON data on the command line is no fun!\u003c/p\u003e\n\u003cp\u003eTo make curl read the data from a file, prefix the filename with an @ symbol.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ecurl \u0026lt;url\u0026gt; –data @filename\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThese tips should hopefully make using curl easier.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI was recently working on a REST API for an iPhone app. I used \u003ca href=\"http://curl.haxx.se/\"\u003ecurl\u003c/a\u003e\nalongside automated tests to manually test as I built. curl is a great tool but\nif you need to specify lots of arguments, as I did, it can soon become\nunwieldy.\u003c/p\u003e\n\u003cp\u003eThese two tips helped me out.\u003c/p\u003e\n\u003ch2 id=\"1-read-arguments-from-a-file\"\u003e1) Read arguments from a file\u003c/h2\u003e\n\u003cp\u003eI had many arguments to pass when testing the API including the \u003ccode\u003eAccept\u003c/code\u003e and\n\u003ccode\u003eAuthorisation\u003c/code\u003e headers. With those alone, the argument list is already pretty\nbig.\u003c/p\u003e",
      "date_published": "2015-01-27T00:00:00+00:00",
      "date_modified": "2015-01-27T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/disable-spell-check-on-form-fields/",
      "url": "https://elver.me/blog/disable-spell-check-on-form-fields/",
      "title": "Disable spell check on form fields",
      "content_html": "\u003cp\u003eTIL that you can turn off spell checking for text input form fields.\u003c/p\u003e\n\u003cp\u003eI know, this sounds like a terrible idea. Similar atrocities such as turning\noff cut and paste have been committed by others and are very annoying indeed.\nHowever, used carefully and in the right context, it\u0026rsquo;s good to know that this\nis possible.\u003c/p\u003e\n\u003cp\u003eMy particular use case was for a form field designed to accept a Foursquare ID.\nThe value entered would only ever be a mixture of numbers and letters and would\n\u003cstrong\u003ealways\u003c/strong\u003e fail a spell check. The red dotted line signals to the user that\nthey have made a mistake, even if their input is valid.\u003c/p\u003e\n\u003cimg src=\"/images/spellcheck_before.png\"\u003e\n\u003cp\u003eThis is one such case where I think turning off spell checking is a good idea.\u003c/p\u003e\n\u003cp\u003eTo do this, you simply add the \u003ccode\u003espellcheck\u003c/code\u003e attribute to your input tag and set\nit to \u003ccode\u003efalse\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#000080\"\u003einput\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;foursquare_id\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003espellcheck\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;false\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cimg src=\"/images/spellcheck_after.png\"\u003e\n\u003cp\u003eAnd, there we go, no spell checking on the form field.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eTIL that you can turn off spell checking for text input form fields.\u003c/p\u003e\n\u003cp\u003eI know, this sounds like a terrible idea. Similar atrocities such as turning\noff cut and paste have been committed by others and are very annoying indeed.\nHowever, used carefully and in the right context, it\u0026rsquo;s good to know that this\nis possible.\u003c/p\u003e\n\u003cp\u003eMy particular use case was for a form field designed to accept a Foursquare ID.\nThe value entered would only ever be a mixture of numbers and letters and would\n\u003cstrong\u003ealways\u003c/strong\u003e fail a spell check. The red dotted line signals to the user that\nthey have made a mistake, even if their input is valid.\u003c/p\u003e",
      "date_published": "2014-07-13T00:00:00+00:00",
      "date_modified": "2014-07-13T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/ruby-method-objects/",
      "url": "https://elver.me/blog/ruby-method-objects/",
      "title": "Ruby method objects",
      "content_html": "\u003cp\u003eIf we want to capitalise all the values in an array, we can use \u003ccode\u003e#map\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;apple\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;pear\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;banana\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e].\u003c/span\u003emap { \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003efruit\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e fruit\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eupcase }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;APPLE\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;PEAR\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;BANANA\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAlternatively, a more terse version is available using the \u003ccode\u003eSymbol#to_proc\u003c/code\u003e trick.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;apple\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;pear\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;banana\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e].\u003c/span\u003emap(\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#990073\"\u003e:upcase\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;APPLE\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;PEAR\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;BANANA\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe can even achieve the same thing using an explicit \u003ccode\u003eProc\u003c/code\u003e object.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;apple\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;pear\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;banana\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e].\u003c/span\u003emap(\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eProc\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enew { \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003efruit\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e fruit\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eupcase })\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;APPLE\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;PEAR\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;BANANA\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"but-i-wanna-call-my-own-method\"\u003eBut, I wanna call my own method!\u003c/h2\u003e\n\u003cp\u003eBut what if you want to call a method of your own creation?\u003c/p\u003e\n\u003cp\u003eIn Ruby, methods are not objects. They are one of the few things in Ruby that\naren\u0026rsquo;t. That\u0026rsquo;s why we have the \u003ccode\u003eObject#method\u003c/code\u003e method.\u003c/p\u003e\n\u003cp\u003eWe need to get an object instance which we can pass to \u003ccode\u003e#map\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eFoo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eself\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#900;font-weight:bold\"\u003ebar\u003c/span\u003e(value)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    value\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eupcase\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;apple\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;pear\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;banana\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e].\u003c/span\u003emap(\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eFoo\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003emethod(\u003cspan style=\"color:#990073\"\u003e:bar\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;APPLE\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;PEAR\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;BANANA\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe first get an instance of the \u003ccode\u003e.bar\u003c/code\u003e method using \u003ccode\u003eFoo.method\u003c/code\u003e and then the\n\u003ccode\u003eMethod\u003c/code\u003e object is converted to a block using \u003ccode\u003e\u0026amp;\u003c/code\u003e and applied to every item in\nthe array.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eIf we want to capitalise all the values in an array, we can use \u003ccode\u003e#map\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;apple\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;pear\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;banana\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e].\u003c/span\u003emap { \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003efruit\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e fruit\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eupcase }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;APPLE\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;PEAR\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;BANANA\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAlternatively, a more terse version is available using the \u003ccode\u003eSymbol#to_proc\u003c/code\u003e trick.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;apple\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;pear\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;banana\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e].\u003c/span\u003emap(\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#990073\"\u003e:upcase\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;APPLE\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;PEAR\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;BANANA\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe can even achieve the same thing using an explicit \u003ccode\u003eProc\u003c/code\u003e object.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;apple\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;pear\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;banana\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e].\u003c/span\u003emap(\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eProc\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003enew { \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003efruit\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e fruit\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eupcase })\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;APPLE\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;PEAR\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#34;BANANA\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"but-i-wanna-call-my-own-method\"\u003eBut, I wanna call my own method!\u003c/h2\u003e\n\u003cp\u003eBut what if you want to call a method of your own creation?\u003c/p\u003e",
      "date_published": "2014-06-25T00:00:00+00:00",
      "date_modified": "2014-06-25T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/sorting-columnds-of-text-in-vim-using-sort/",
      "url": "https://elver.me/blog/sorting-columnds-of-text-in-vim-using-sort/",
      "title": "Sorting columns of text in Vim using sort",
      "content_html": "\u003cp\u003eI recently wanted to get some stats on some Mongo collections to see a) which\ncollection had the most documents; and b) which collections were the biggest by\ndata size.\u003c/p\u003e\n\u003cp\u003eI copy and pasted the stats from our hosted Mongo provider, MongoHQ, and then\nsorted them in Vim. This is what the text looked like after pasting into Vim\n(with the \u003ccode\u003e:set paste\u003c/code\u003e option set).\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eaffiliates  1038  680 KB\narticle_ratings 699 168 KB\nauthors 30  40 KB\nfs.chunks 3401  633.89 MB\nfs.files  1476  680 KB\nnodes 1432  24.29 MB\nnodes_search  91  2.8 MB\nnodes_tags  272 40 KB\npage_views  107769  16.37 MB\npage_views_map  212 40 KB\nrecommendations 34305 45.1 MB\nrewrite_rules 209 168 KB\nsign_ups  10331 12.52 MB\nsitemaps  1 14.84 MB\nsuppliers 13  8 KB\ntariff_price_check_reports  34  540 KB\ntariff_price_checks 1129  968 KB\ntariffs 5 680 KB\nusers 17  64 KB\nusers_tags  2 8 KB\nversions  18031 156.64 MB\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFirst I sorted the text into \u0026ldquo;proper\u0026rdquo; columns using the \u003ccode\u003ecolumn\u003c/code\u003e utility.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:%!column -t\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhich resulted in nice, spaced out, columns.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eaffiliates                  1038    680     KB\narticle_ratings             699     168     KB\nauthors                     30      40      KB\nfs.chunks                   3401    633.89  MB\nfs.files                    1476    680     KB\nnodes                       1432    24.29   MB\nnodes_search                91      2.8     MB\nnodes_tags                  272     40      KB\npage_views                  107769  16.37   MB\npage_views_map              212     40      KB\nrecommendations             34305   45.1    MB\nrewrite_rules               209     168     KB\nsign_ups                    10331   12.52   MB\nsitemaps                    1       14.84   MB\nsuppliers                   13      8       KB\ntariff_price_check_reports  34      540     KB\ntariff_price_checks         1129    968     KB\ntariffs                     5       680     KB\nusers                       17      64      KB\nusers_tags                  2       8       KB\nversions                    18031   156.64  MB\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo sort the text by the total number of documents in the collection, I did this.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:%!sort -k2nr\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis sorted by the second column (\u003ccode\u003e-k2\u003c/code\u003e), treats the text as a number (\u003ccode\u003en\u003c/code\u003e) and\nthen sorts in reverse (\u003ccode\u003er\u003c/code\u003e), which results in.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epage_views                  107769  16.37   MB\nrecommendations             34305   45.1    MB\nversions                    18031   156.64  MB\nsign_ups                    10331   12.52   MB\nfs.chunks                   3401    633.89  MB\nfs.files                    1476    680     KB\nnodes                       1432    24.29   MB\ntariff_price_checks         1129    968     KB\naffiliates                  1038    680     KB\narticle_ratings             699     168     KB\nnodes_tags                  272     40      KB\npage_views_map              212     40      KB\nrewrite_rules               209     168     KB\nnodes_search                91      2.8     MB\ntariff_price_check_reports  34      540     KB\nauthors                     30      40      KB\nusers                       17      64      KB\nsuppliers                   13      8       KB\ntariffs                     5       680     KB\nusers_tags                  2       8       KB\nsitemaps                    1       14.84   MB\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen, I sort by the the 4th column (\u003ccode\u003e-k4\u003c/code\u003e), followed by the 3rd column, but this\ntime we require a few more switches. We ignore leading blank spaces (\u003ccode\u003eb\u003c/code\u003e), and\nthis time we sort using a general numeric sort (\u003ccode\u003eg\u003c/code\u003e).\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:%!sort -k4 -bk3g\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd there we have it, sorted by file size.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esuppliers                   13      8       KB\nusers_tags                  2       8       KB\nauthors                     30      40      KB\nnodes_tags                  272     40      KB\npage_views_map              212     40      KB\nusers                       17      64      KB\narticle_ratings             699     168     KB\nrewrite_rules               209     168     KB\ntariff_price_check_reports  34      540     KB\naffiliates                  1038    680     KB\nfs.files                    1476    680     KB\ntariffs                     5       680     KB\ntariff_price_checks         1129    968     KB\nnodes_search                91      2.8     MB\nsign_ups                    10331   12.52   MB\nsitemaps                    1       14.84   MB\npage_views                  107769  16.37   MB\nnodes                       1432    24.29   MB\nrecommendations             34305   45.1    MB\nversions                    18031   156.64  MB\nfs.chunks                   3401    633.89  MB\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e*nix is cool.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI recently wanted to get some stats on some Mongo collections to see a) which\ncollection had the most documents; and b) which collections were the biggest by\ndata size.\u003c/p\u003e\n\u003cp\u003eI copy and pasted the stats from our hosted Mongo provider, MongoHQ, and then\nsorted them in Vim. This is what the text looked like after pasting into Vim\n(with the \u003ccode\u003e:set paste\u003c/code\u003e option set).\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eaffiliates  1038  680 KB\narticle_ratings 699 168 KB\nauthors 30  40 KB\nfs.chunks 3401  633.89 MB\nfs.files  1476  680 KB\nnodes 1432  24.29 MB\nnodes_search  91  2.8 MB\nnodes_tags  272 40 KB\npage_views  107769  16.37 MB\npage_views_map  212 40 KB\nrecommendations 34305 45.1 MB\nrewrite_rules 209 168 KB\nsign_ups  10331 12.52 MB\nsitemaps  1 14.84 MB\nsuppliers 13  8 KB\ntariff_price_check_reports  34  540 KB\ntariff_price_checks 1129  968 KB\ntariffs 5 680 KB\nusers 17  64 KB\nusers_tags  2 8 KB\nversions  18031 156.64 MB\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFirst I sorted the text into \u0026ldquo;proper\u0026rdquo; columns using the \u003ccode\u003ecolumn\u003c/code\u003e utility.\u003c/p\u003e",
      "date_published": "2014-03-12T00:00:00+00:00",
      "date_modified": "2014-03-12T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/how-i-deployed-middleman-to-heroku/",
      "url": "https://elver.me/blog/how-i-deployed-middleman-to-heroku/",
      "title": "How I deployed Middleman to Heroku",
      "content_html": "\u003cp\u003eI\u0026rsquo;ve recently redesigned this website and it is now built using \u003ca href=\"http://www.middlemanapp.com\"\u003eMiddleman\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMiddleman is a static site generator using all the shortcuts and tools in\nmodern web development\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis post is about how I deployed the site to \u003ca href=\"http://www.heroku.com\"\u003eHeroku\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"building-the-site\"\u003eBuilding the site\u003c/h2\u003e\n\u003cp\u003eMiddleman is a \u003cstrong\u003estatic\u003c/strong\u003e site generator, as such, we need to figure out how\nto get the site built when we deploy. This saves having to build the site and\ncommit the result before deploying.\u003c/p\u003e\n\u003cp\u003eHeroku will automatically attempt to execute a rake task called \u003ccode\u003eassets:precompile\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThis was originally for the benefit of Rails, but we can take advantage of this\nnow for our own needs.\u003c/p\u003e\n\u003cp\u003eI created a new \u003ccode\u003eRakefile\u003c/code\u003e and added the following.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enamespace \u003cspan style=\"color:#990073\"\u003e:assets\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  task \u003cspan style=\"color:#990073\"\u003e:precompile\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    sh \u003cspan style=\"color:#d14\"\u003e\u0026#39;middleman build\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe task simply shells out to call \u003ccode\u003emiddleman build\u003c/code\u003e which builds the site\nautomatically when the site is pushed to Heroku. Middleman will output all\nfiles to \u003ccode\u003e./build\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"serving-the-site\"\u003eServing the site\u003c/h2\u003e\n\u003cp\u003eThe process of serving a static Middleman site on Heroku is quite straight\nforward once you understand the basics. The site will be running as a Rack\napp, so we\u0026rsquo;ll need a \u003ccode\u003econfig.ru\u003c/code\u003e file. Here is what mine looks like.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003erequire\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;rack\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003erequire\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;rack/contrib/try_static\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e# Serve files from the build directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euse \u003cspan style=\"color:#008080\"\u003eRack\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#008080\"\u003eTryStatic\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#990073\"\u003eroot\u003c/span\u003e: \u003cspan style=\"color:#d14\"\u003e\u0026#39;build\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#990073\"\u003eurls\u003c/span\u003e: \u003cspan style=\"color:#d14\"\u003e%w[/]\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#990073\"\u003etry\u003c/span\u003e: \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;.html\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;index.html\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#d14\"\u003e\u0026#39;/index.html\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erun \u003cspan style=\"color:#0086b3\"\u003elambda\u003c/span\u003e{ \u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003eenv\u003cspan style=\"color:#000;font-weight:bold\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  four_oh_four_page \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eFile\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eexpand_path(\u003cspan style=\"color:#d14\"\u003e\u0026#34;../build/404/index.html\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#999\"\u003e__FILE__\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#099\"\u003e404\u003c/span\u003e, { \u003cspan style=\"color:#d14\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;text/html\u0026#39;\u003c/span\u003e}, \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eFile\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e.\u003c/span\u003eread(four_oh_four_page) \u003cspan style=\"color:#000;font-weight:bold\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe \u003ccode\u003eRack::TryStatic\u003c/code\u003e section is how we serve up the static files that\nMiddleman builds when the site is pushed to Heroku. Middleman outputs all\nfiles into \u003ccode\u003e./build\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIf no page is served from the \u003ccode\u003eRack::Trystatic\u003c/code\u003e app, the 404 page is served\nusing the next \u003ccode\u003erun\u003c/code\u003e section.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eUPDATE:\u003c/strong\u003e Make sure to add \u003ccode\u003erack-contrib\u003c/code\u003e to your \u003ccode\u003eGemfile\u003c/code\u003e as pointed out by\n\u003ca href=\"https://twitter.com/fulljames/status/469128779777212417\"\u003e@fulljames\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI decided to use the \u003ca href=\"http://puma.io\"\u003ePuma\u003c/a\u003e web server to do the \u003cem\u003eactual\u003c/em\u003e web serving of the\nfiles as I had never used it before and wanted to try it out. I added Puma to\nmy \u003ccode\u003eGemfile\u003c/code\u003e and created this \u003ccode\u003eProcfile\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#990073\"\u003eweb\u003c/span\u003e: bundle \u003cspan style=\"color:#0086b3\"\u003eexec\u003c/span\u003e puma \u003cspan style=\"color:#000;font-weight:bold\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#0086b3\"\u003ep\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003e$PORT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuma is working great.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s as simple as that. Once pushed to Heroku, everything just works.\u003c/p\u003e\n\u003ch2 id=\"keeping-the-site-alive\"\u003eKeeping the site alive\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m using a single free \u003ca href=\"https://devcenter.heroku.com/articles/dynos\"\u003eDyno\u003c/a\u003e to serve the site and it\u0026rsquo;s seriously fast. Granted,\nthis site is not receiving lots of traffic, but it\u0026rsquo;s still very quick.\u003c/p\u003e\n\u003cp\u003eThe only downside of a single Heroku Dyno is that it will idle after a period\nof inactivity, which can happen often unless you get lots of regular traffic.\u003c/p\u003e\n\u003cp\u003eI order to keep the site alive, the sites needs to be requested periodically.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m using \u003ca href=\"http://www.pingdom.com\"\u003ePingdom\u003c/a\u003e for this.\u003c/p\u003e\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003c/h2\u003e\n\u003cp\u003eMiddleman is really easy to work with, especially for a Rails developer, and\nHeroku serves the site very well. I would definitely recommend the combination\nof Middleman and Heroku.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI\u0026rsquo;ve recently redesigned this website and it is now built using \u003ca href=\"http://www.middlemanapp.com\"\u003eMiddleman\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMiddleman is a static site generator using all the shortcuts and tools in\nmodern web development\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis post is about how I deployed the site to \u003ca href=\"http://www.heroku.com\"\u003eHeroku\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"building-the-site\"\u003eBuilding the site\u003c/h2\u003e\n\u003cp\u003eMiddleman is a \u003cstrong\u003estatic\u003c/strong\u003e site generator, as such, we need to figure out how\nto get the site built when we deploy. This saves having to build the site and\ncommit the result before deploying.\u003c/p\u003e",
      "date_published": "2014-02-17T00:00:00+00:00",
      "date_modified": "2014-02-17T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/the-middleman-build-environment/",
      "url": "https://elver.me/blog/the-middleman-build-environment/",
      "title": "The Middleman build environment",
      "content_html": "\u003cp\u003eRails has long had the concept of environments built-in. That is, the ability\nto set the environment to \u003cstrong\u003edevelopment\u003c/strong\u003e, \u003cstrong\u003eproduction\u003c/strong\u003e or \u003cstrong\u003etest\u003c/strong\u003e, and only\nrun code when in one or more of those environments. For example, the\ndevelopment environment has class caching turned off by default, so that code\nis reloaded on every request, perfect whilst developing. In production, this is\nturned on, for much improved performance.\u003c/p\u003e\n\u003cp\u003eMiddleman has a similar idea, but the environments are \u003cstrong\u003ebuild\u003c/strong\u003e and\n\u003cstrong\u003edevelopment\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eI recently took advantage of this feature, specifically, the build environment.\u003c/p\u003e\n\u003cp\u003eThe build environment is set when the site is being built using \u003ccode\u003emiddleman build\u003c/code\u003e. I used this to only include Google Analytics tracking code when the\nsite is built. This stops local web browsing from affecting my web statistics.\u003c/p\u003e\n\u003cp\u003eIn my \u003ccode\u003elayout.erb\u003c/code\u003e, I\u0026rsquo;ve used the \u003ccode\u003ebuild?\u003c/code\u003e helper to conditionally include the\nrelevant JavaScript code.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-erb\" data-lang=\"erb\"\u003e\u0026lt;% if build? %\u0026gt;\n\n\u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt;\n  var _gaq = _gaq || [];\n  _gaq.push([\u0026#39;_setAccount\u0026#39;, \u0026#39;xxxxxxxxxx\u0026#39;]);\n  _gaq.push([\u0026#39;_trackPageview\u0026#39;]);\n\n  (function() {\n    var ga = document.createElement(\u0026#39;script\u0026#39;); ga.type = \u0026#39;text/javascript\u0026#39;; ga.async = true;\n    ga.src = (\u0026#39;https:\u0026#39; == document.location.protocol ? \u0026#39;https://ssl\u0026#39; : \u0026#39;http://www\u0026#39;) + \u0026#39;.google-analytics.com/ga.js\u0026#39;;\n    var s = document.getElementsByTagName(\u0026#39;script\u0026#39;)[0]; s.parentNode.insertBefore(ga, s);\n  })();\n\u0026lt;/script\u0026gt;\n\n\u0026lt;% end %\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAs you can see, this is very simple, but also very useful for customising\ntemplates at build time.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eRails has long had the concept of environments built-in. That is, the ability\nto set the environment to \u003cstrong\u003edevelopment\u003c/strong\u003e, \u003cstrong\u003eproduction\u003c/strong\u003e or \u003cstrong\u003etest\u003c/strong\u003e, and only\nrun code when in one or more of those environments. For example, the\ndevelopment environment has class caching turned off by default, so that code\nis reloaded on every request, perfect whilst developing. In production, this is\nturned on, for much improved performance.\u003c/p\u003e\n\u003cp\u003eMiddleman has a similar idea, but the environments are \u003cstrong\u003ebuild\u003c/strong\u003e and\n\u003cstrong\u003edevelopment\u003c/strong\u003e.\u003c/p\u003e",
      "date_published": "2014-02-10T00:00:00+00:00",
      "date_modified": "2014-02-10T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/troubleshooting-heroku-deploys-with-empty-git-commits/",
      "url": "https://elver.me/blog/troubleshooting-heroku-deploys-with-empty-git-commits/",
      "title": "Troubleshooting Heroku deploys with empty Git commits",
      "content_html": "\u003cp\u003eWhen troubleshooting Heroku deployments, you need to push to the Heroku remote\nover and over until you\u0026rsquo;ve found the problem. It\u0026rsquo;s necessary to add new Git\ncommits in order to force Heroku to re-compile your \u003ca href=\"https://devcenter.heroku.com/articles/slug-compiler\"\u003eapplication slug\u003c/a\u003e or else\nyou will get the \u003ccode\u003eEverything up-to-date\u003c/code\u003e message back from Git.\u003c/p\u003e\n\u003cp\u003eRather than making trivial changes all the time, you can add empty commits.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit commit --allow-empty -m \u0026quot;Force slug recompilation\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIt still adds unnecessary commits to your repo, but it\u0026rsquo;s cleaner and at least\nyou\u0026rsquo;re not touching any code.\u003c/p\u003e\n\u003ch2 id=\"update\"\u003eUpdate\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"http://simonstarr.com\"\u003eSimon Starr\u003c/a\u003e has mentioned another method to achieve the same thing. Using\nGit with the \u003ccode\u003e--amend\u003c/code\u003e flag.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit commit --amend\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eUsually, this is used to add missing files to your previous commit or change\nthe commit message, but it \u003cem\u003ealso\u003c/em\u003e removes the previous commit and creates a new\none, which means that Heroku will update and re-compile without a problem.\u003c/p\u003e\n\u003cp\u003eBe careful though, this is not a good method if you\u0026rsquo;ve already shared your\ncommits with someone else, but it\u0026rsquo;s worth bearing in mind depending on the\nsituation as it saves you adding \u003cem\u003eany\u003c/em\u003e new commits to your repo. Thanks, Simon.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eWhen troubleshooting Heroku deployments, you need to push to the Heroku remote\nover and over until you\u0026rsquo;ve found the problem. It\u0026rsquo;s necessary to add new Git\ncommits in order to force Heroku to re-compile your \u003ca href=\"https://devcenter.heroku.com/articles/slug-compiler\"\u003eapplication slug\u003c/a\u003e or else\nyou will get the \u003ccode\u003eEverything up-to-date\u003c/code\u003e message back from Git.\u003c/p\u003e\n\u003cp\u003eRather than making trivial changes all the time, you can add empty commits.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit commit --allow-empty -m \u0026quot;Force slug recompilation\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIt still adds unnecessary commits to your repo, but it\u0026rsquo;s cleaner and at least\nyou\u0026rsquo;re not touching any code.\u003c/p\u003e",
      "date_published": "2014-02-04T00:00:00+00:00",
      "date_modified": "2014-02-04T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/find-where-your-code-broke-with-git-bisect/",
      "url": "https://elver.me/blog/find-where-your-code-broke-with-git-bisect/",
      "title": "Find where your code broke with git bisect",
      "content_html": "\u003cp\u003eYour code is broken. You know everything was working at a certain point in time\nor that a particular commit was ok, but you\u0026rsquo;re not sure which commit\n\u003cem\u003esince\u003c/em\u003e then has introduced the problem.\u003c/p\u003e\n\u003cp\u003eYou need \u003ccode\u003egit bisect\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFrom the \u003ca href=\"http://git-scm.com/docs/git-bisect\"\u003egit documentation\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egit-bisect - Find by binary search the change that introduced a bug\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eUmm, right. Ok.\u003c/p\u003e\n\u003cp\u003eA \u003ccode\u003egit bisect\u003c/code\u003e starts by specifying a \u003cstrong\u003egood\u003c/strong\u003e and a \u003cstrong\u003ebad\u003c/strong\u003e revision. \u003ccode\u003egit\u003c/code\u003e will\nthen checkout each commit by splitting (or bisecting) the range of commits and\nrunning the supplied command until it returns with an exit code of zero.\u003c/p\u003e\n\u003cp\u003eAn exit code of zero means the command was successful.\u003c/p\u003e\n\u003cp\u003eThe command can be anything that \u003cstrong\u003ewill\u003c/strong\u003e return an exit code, which includes\nmost *nix binaries or scripts.\u003c/p\u003e\n\u003cp\u003eIn this example, we\u0026rsquo;re using \u003ca href=\"http://cukes.info\"\u003eCucumber\u003c/a\u003e as the command.\u003c/p\u003e\n\u003ch2 id=\"a-working-example-using-cucumber\"\u003eA working example using Cucumber\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egit bisect start\ngit bisect good \u0026lt;commit-where-stuff-is-working\u0026gt;\ngit bisect bad \u0026lt;commit-where-stuff-is-not-working\u0026gt;\ngit bisect run bundle exec cucumber features/a-feature.feature\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf the tests fail, Cucumber will return a non-zero exit code and \u003ccode\u003egit\u003c/code\u003e will\nkeep trying other commits until it finds one that is successful. We will then\nknow when the code was \u0026ldquo;good\u0026rdquo;, and more importantly, the commit where it became\n\u0026ldquo;bad\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eWhen finished, reset your branch to the previous state before starting the \u003ccode\u003egit bisect\u003c/code\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit bisect reset\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAs you\u0026rsquo;d expect with \u003ccode\u003egit\u003c/code\u003e, it \u003ca href=\"http://git-scm.com/docs/git-bisect\"\u003ecan do \u003cem\u003ea lot\u003c/em\u003e more than this\u003c/a\u003e, but this is\nthe way in which I normally use it.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eYour code is broken. You know everything was working at a certain point in time\nor that a particular commit was ok, but you\u0026rsquo;re not sure which commit\n\u003cem\u003esince\u003c/em\u003e then has introduced the problem.\u003c/p\u003e\n\u003cp\u003eYou need \u003ccode\u003egit bisect\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFrom the \u003ca href=\"http://git-scm.com/docs/git-bisect\"\u003egit documentation\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egit-bisect - Find by binary search the change that introduced a bug\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eUmm, right. Ok.\u003c/p\u003e\n\u003cp\u003eA \u003ccode\u003egit bisect\u003c/code\u003e starts by specifying a \u003cstrong\u003egood\u003c/strong\u003e and a \u003cstrong\u003ebad\u003c/strong\u003e revision. \u003ccode\u003egit\u003c/code\u003e will\nthen checkout each commit by splitting (or bisecting) the range of commits and\nrunning the supplied command until it returns with an exit code of zero.\u003c/p\u003e",
      "date_published": "2014-01-31T00:00:00+00:00",
      "date_modified": "2014-01-31T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/its-the-little-things/",
      "url": "https://elver.me/blog/its-the-little-things/",
      "title": "It's the little things",
      "content_html": "\u003cp\u003eI\u0026rsquo;ve been thinking about the \u003ca href=\"http://littlebigdetails.com/\"\u003elittle things\u003c/a\u003e that can be changed to make a\nweb page easier to use. Seemingly small changes can add up to have a big impact\non the way people will interact with the page.\u003c/p\u003e\n\u003cp\u003eOn one particular site, I have a pretty standard widget used to select the\namount of products to show per page. I\u0026rsquo;m sure you\u0026rsquo;ve seen something similar to\nthat of below on many other websites.\u003c/p\u003e\n\u003cimg src=\"/images/dropdown.gif\" alt=\"Example of a dropdown list used to select the amount of products to show on the page\" /\u003e\n\u003cp\u003eThe way this is currently implemented, it takes \u003cstrong\u003ethree\u003c/strong\u003e clicks to complete\nthe intended operation. This could be reduced to \u003cstrong\u003etwo\u003c/strong\u003e clicks by adding some\nJavaScript to trigger the page change (and removing the button), but there is a\nproblem with this method: The options at \u003cstrong\u003enot all visible\u003c/strong\u003e at once. You have\nto click to see what the options are.\u003c/p\u003e\n\u003ch2 id=\"rethinking-the-implementation\"\u003eRethinking the implementation\u003c/h2\u003e\n\u003cp\u003eI decided to change the way this was implemented, moving to a horizontal list of links.\u003c/p\u003e\n\u003cimg src=\"/images/list.gif\" alt=\"Example of a list used to select the amount of products to show on the page\" /\u003e\n\u003cp\u003eThe advantages of this approach are:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou can see all options at once. Please, \u003ca href=\"http://www.amazon.co.uk/Dont-Make-Me-Think-Usability/dp/0321344758\"\u003edon\u0026rsquo;t make me think\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eIt\u0026rsquo;s only a \u003cstrong\u003esingle\u003c/strong\u003e click to select an option.\u003c/li\u003e\n\u003cli\u003eIt\u0026rsquo;s better for accessibility because you don\u0026rsquo;t have to fiddle with a\ndropdown (and who wants to?).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI think this is a fairly good example of how changing small things, perhaps\neven those that seem inconsequential, can contribute to improving the overall\nexperience of the page, and delight the user.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI\u0026rsquo;ve been thinking about the \u003ca href=\"http://littlebigdetails.com/\"\u003elittle things\u003c/a\u003e that can be changed to make a\nweb page easier to use. Seemingly small changes can add up to have a big impact\non the way people will interact with the page.\u003c/p\u003e\n\u003cp\u003eOn one particular site, I have a pretty standard widget used to select the\namount of products to show per page. I\u0026rsquo;m sure you\u0026rsquo;ve seen something similar to\nthat of below on many other websites.\u003c/p\u003e",
      "date_published": "2011-07-30T00:00:00+00:00",
      "date_modified": "2011-07-30T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/rails-footnotes-problem/",
      "url": "https://elver.me/blog/rails-footnotes-problem/",
      "title": "Rails Footnotes problem",
      "content_html": "\u003cp\u003eI recently had a head-scratching time trying to figure out why code that\nintegrates with a 3rd party payment processor had suddenly stopped working. The\ncode in question simply returns a text only response to the 3rd party, who then\nread, parse and act on it. Within my Rails controller:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erender \u003cspan style=\"color:#990073\"\u003e:text\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Status=OK,Detail=Some details here\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI found the culprit by going through my git log to see what had changed\nrecently. Turns out it was the recent addition of Rails Footnotes causing the\nproblem. \u003ca href=\"http://rubydoc.info/gems/rails-footnotes/3.7.4/frames\"\u003eRails Footnotes\u003c/a\u003e is an awesome gem that adds various information\nabout your app to the bottom of every page including clickable links to\ncontrollers, views and partials. Clicking these links opens the file in your\ntext editor of choice.\u003c/p\u003e\n\u003cp\u003eRails Footnotes was appending its debugging HTML (as designed) to my text-only\nresponse, breaking the payment processors parsing. After an \u003ca href=\"http://railstips.org/blog/archives/2010/10/14/stop-googling/\"\u003einspection of the\nsource\u003c/a\u003e I noticed that Footnotes are only output if the content type\nincludes \u0026ldquo;html\u0026rdquo;, such as \u0026ldquo;text/html\u0026rdquo;.\u003c/p\u003e\n\u003ch2 id=\"the-fix\"\u003eThe fix\u003c/h2\u003e\n\u003cp\u003eIn my case the whole controller could (and probably should) be returned as\n\u0026ldquo;text/plain\u0026rdquo;. I hooked up a \u003ccode\u003ebefore_filter\u003c/code\u003e to add the \u003ccode\u003eContent-Type\u003c/code\u003e header to\nthe response and that fixed it.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#458;font-weight:bold\"\u003eNotificationController\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026lt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eApplicationController\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#998;font-style:italic\"\u003e# Set the content type to text/plain so footnotes don\u0026#39;t show\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  before_filter \u003cspan style=\"color:#990073\"\u003e:set_content_type\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#900;font-weight:bold\"\u003eset_content_type\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    headers\u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;text/plain\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFor versions of Rails Footnotes greater than 3.7.0 (which is Rails 3 only) you\ncan actually configure if Footnotes are added to the page using an initializer\n(or similar). Unfortunately, I\u0026rsquo;m still using Rails 2 on this project so I\ncurrently can\u0026rsquo;t take advantage of that.\u003c/p\u003e\n\u003ch2 id=\"in-conclusion\"\u003eIn conclusion\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"http://rubydoc.info/gems/rails-footnotes/3.7.4/frames\"\u003eRails Footnotes\u003c/a\u003e is a must-have, you really should check it out.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI recently had a head-scratching time trying to figure out why code that\nintegrates with a 3rd party payment processor had suddenly stopped working. The\ncode in question simply returns a text only response to the 3rd party, who then\nread, parse and act on it. Within my Rails controller:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erender \u003cspan style=\"color:#990073\"\u003e:text\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Status=OK,Detail=Some details here\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI found the culprit by going through my git log to see what had changed\nrecently. Turns out it was the recent addition of Rails Footnotes causing the\nproblem. \u003ca href=\"http://rubydoc.info/gems/rails-footnotes/3.7.4/frames\"\u003eRails Footnotes\u003c/a\u003e is an awesome gem that adds various information\nabout your app to the bottom of every page including clickable links to\ncontrollers, views and partials. Clicking these links opens the file in your\ntext editor of choice.\u003c/p\u003e",
      "date_published": "2011-07-24T00:00:00+00:00",
      "date_modified": "2011-07-24T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/automatically-attaching-to-a-tmux-session-via-ssh/",
      "url": "https://elver.me/blog/automatically-attaching-to-a-tmux-session-via-ssh/",
      "title": "Automatically attaching to a tmux session via SSH",
      "content_html": "\u003cp\u003eI\u0026rsquo;ve been using \u003ca href=\"http://tmux.sourceforge.net/\"\u003etmux\u003c/a\u003e as a\n\u003ca href=\"http://www.gnu.org/software/screen/\"\u003escreen\u003c/a\u003e replacement for a while now. I\nfind it easier to use and configure than screen. I tend to leave a tmux session\nrunning on servers that I administer so that everything is just as it was when\nI last connected. It\u0026rsquo;s very handy.\u003c/p\u003e\n\u003cp\u003eTo make this even more convenient, I wanted to be able to automatically attach\nto a running tmux session when connecting to servers using\n\u003ca href=\"http://en.wikipedia.org/wiki/Secure_Shell\"\u003eSSH\u003c/a\u003e. The SSH client already comes\nwith the ability to run a command when connecting. It works like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh \u0026lt;hostname\u0026gt; \u0026lt;command\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUnfortunately, this didn\u0026rsquo;t work when I tried attaching to a tmux session.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh \u0026lt;hostname\u0026gt; tmux a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enot a terminal\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAfter a bit of Googling, it turns out that you need to supply the \u003ccode\u003e-t\u003c/code\u003e option\nto the \u003ccode\u003essh\u003c/code\u003e command. The ssh man page describes the option as such:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-t Force pseudo-tty allocation. This can be used to execute\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   arbitrary screen-based programs on a remote machine, \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   which can be very useful, e.g., when implementing menu\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   services.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf we do that, we\u0026rsquo;re in business:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh \u0026lt;hostname\u0026gt; -t tmux a\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTo make the command even shorter, I\u0026rsquo;ve been adding bash aliases to my\n\u003ccode\u003e~/.bash_profile\u003c/code\u003e for each server I connect to, like so:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003ealias\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eservername\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;ssh servername -t tmux a\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow, I can just type \u003ccode\u003eservername\u003c/code\u003e and get a SSH connection to servername with\ntmux automatically attached. Issuing a \u003ccode\u003e\u0026lt;ctrl\u0026gt; + b + d\u003c/code\u003e will detach the tmux\nsession and disconnect the SSH connection.\u003c/p\u003e\n\u003cp\u003eCommand line magic!\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI\u0026rsquo;ve been using \u003ca href=\"http://tmux.sourceforge.net/\"\u003etmux\u003c/a\u003e as a\n\u003ca href=\"http://www.gnu.org/software/screen/\"\u003escreen\u003c/a\u003e replacement for a while now. I\nfind it easier to use and configure than screen. I tend to leave a tmux session\nrunning on servers that I administer so that everything is just as it was when\nI last connected. It\u0026rsquo;s very handy.\u003c/p\u003e\n\u003cp\u003eTo make this even more convenient, I wanted to be able to automatically attach\nto a running tmux session when connecting to servers using\n\u003ca href=\"http://en.wikipedia.org/wiki/Secure_Shell\"\u003eSSH\u003c/a\u003e. The SSH client already comes\nwith the ability to run a command when connecting. It works like this:\u003c/p\u003e",
      "date_published": "2010-11-27T00:00:00+00:00",
      "date_modified": "2010-11-27T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/how-to-upgrade-phusion-passenger-for-nginx/",
      "url": "https://elver.me/blog/how-to-upgrade-phusion-passenger-for-nginx/",
      "title": "How to upgrade Phusion Passenger for nginx",
      "content_html": "\u003cp\u003eI keep forgetting the procedure to upgrade Passenger and nginx, so thought I\u0026rsquo;d\nnote them down here in case anyone finds it useful. These instructions assume\nthat:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou already have \u003ca href=\"http://www.modrails.com/\"\u003ePhusion Passenger\u003c/a\u003e installed and\nconfigured for \u003ca href=\"http://nginx.net/\"\u003enginx\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eYou\u0026rsquo;re using \u003ca href=\"http://www.rubyenterpriseedition.com/\"\u003eRuby Enterprise Edition\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"upgrade\"\u003eUpgrade\u003c/h2\u003e\n\u003cp\u003eDownload the latest nginx source and uncompress to a temporary directory.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003ecd\u003c/span\u003e ~/sources\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewget http://sysoev.ru/nginx/nginx-0.7.64.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etar xzvf nginx-0.7.64.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eInstall the latest Passenger gem\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo /opt/ruby-enterprise-1.8.6-20090520/bin/gem install passenger\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRun the Passenger installer\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo /opt/ruby-enterprise-1.8.6-20090520/bin/passenger-install-nginx-module\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFollow the onscreen instructions, choose option 2 to use your own sources.\nSpecify the location of the nginx sources when prompted.\u003c/p\u003e\n\u003cp\u003eIf you want to use any other optional nginx modules, enable them when prompted.\nI want to use the SSL and Status modules, so I enable them like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e--with-http_ssl_module --with-http_stub_status_module\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe full configure line will look something like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e./configure --prefix\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;/opt/nginx\u0026#39;\u003c/span\u003e --with-pcre\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;/tmp/pcre-7.8\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e--add-module\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#39;/opt/ruby-enterprise-1.8.6-20090520/lib/ruby/gems/1.8/gems/passenger-2.2.5/ext/nginx\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e--with-http_ssl_module --with-http_stub_status_module\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAfter the installer has finished, the new version will be installed in\n\u003ccode\u003e/opt/nginx\u003c/code\u003e and the old version will be renamed to \u003ccode\u003enginx.old\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"configure\"\u003eConfigure\u003c/h2\u003e\n\u003cp\u003eUpdate the \u003ccode\u003enginx.conf\u003c/code\u003e with the correct paths, you should only need to change\nthe path to the \u003ccode\u003epassenger_root\u003c/code\u003e directive.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehttp \u003cspan style=\"color:#000;font-weight:bold\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    passenger_root /opt/ruby-enterprise-1.8.6-20090520/lib/ruby/gems/1.8/gems/passenger-2.2.5;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"restart\"\u003eRestart\u003c/h2\u003e\n\u003cp\u003eI like to do a config file syntax check before I restart nginx, just in case\nof typos and the like.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo /opt/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf the check is successful, restart nginx.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo /etc/init.d/nginx restart\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYou should now be running the latest version of Passenger and nginx.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eI keep forgetting the procedure to upgrade Passenger and nginx, so thought I\u0026rsquo;d\nnote them down here in case anyone finds it useful. These instructions assume\nthat:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou already have \u003ca href=\"http://www.modrails.com/\"\u003ePhusion Passenger\u003c/a\u003e installed and\nconfigured for \u003ca href=\"http://nginx.net/\"\u003enginx\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eYou\u0026rsquo;re using \u003ca href=\"http://www.rubyenterpriseedition.com/\"\u003eRuby Enterprise Edition\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"upgrade\"\u003eUpgrade\u003c/h2\u003e\n\u003cp\u003eDownload the latest nginx source and uncompress to a temporary directory.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003ecd\u003c/span\u003e ~/sources\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewget http://sysoev.ru/nginx/nginx-0.7.64.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etar xzvf nginx-0.7.64.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eInstall the latest Passenger gem\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo /opt/ruby-enterprise-1.8.6-20090520/bin/gem install passenger\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRun the Passenger installer\u003c/p\u003e",
      "date_published": "2009-11-27T00:00:00+00:00",
      "date_modified": "2009-11-27T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/jquery-event-delegation/",
      "url": "https://elver.me/blog/jquery-event-delegation/",
      "title": "jQuery Event Delegation",
      "content_html": "\u003cp\u003eRecently, I\u0026rsquo;ve been working on adding some extra features to a shopping cart\npage using \u003ca href=\"http://jquery.com/\"\u003ejQuery\u003c/a\u003e. The idea is that you select your\ncountry from a dropdown and an AJAX(Asynchronous JavaScript and XML) request is\nperformed, which updates a list of radio buttons on the page. If you select one\nof these radio buttons, it triggers another AJAX(Asynchronous JavaScript and\nXML) request, which updates the postage prices for the given items in the\nbasket.\u003c/p\u003e\n\u003cp\u003eEach of the radio buttons has an event like this bound to it.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$(\u003cspan style=\"color:#d14\"\u003e\u0026#39;#options input\u0026#39;\u003c/span\u003e).click(\u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#998;font-style:italic\"\u003e// lookup postage prices via ajax\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e});\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis triggers the AJAX(Asynchronous JavaScript and XML) request which looks up\nthe postage prices from the database. It works fine with the default set of\nradio buttons that are present on the page when it loads. The problem comes\nwhen new radio buttons are added to the page via AJAX(Asynchronous JavaScript\nand XML). When a new radio button is added to the list, it doesn\u0026rsquo;t\nautomatically have a click event (like the one above) bound to it like the\nexisting items do. The events are not automatically carried across to the new\nitem you\u0026rsquo;ve added.\u003c/p\u003e\n\u003cp\u003eWe can get around this problem by re-binding the events each time a new radio\nbutton is added to the page. But this can be messy and there is a much cleaner\nway of solving the problem.\u003c/p\u003e\n\u003ch2 id=\"event-delegation-to-the-rescue\"\u003eEvent delegation to the rescue\u003c/h2\u003e\n\u003cp\u003eThis is where event delegation comes in. Event delegation takes advantage of\nthe fact that browsers \u0026ldquo;bubble\u0026rdquo; events up the DOM(Document Object Model) when\nthey are triggered on a page. For example, given the HTML(HyperText Markup\nLanguage) below, when clicking the radio button the browser will generate a\nclick event which will \u0026ldquo;bubble\u0026rdquo; upwards so that first the \u003ccode\u003e\u0026lt;input\u0026gt;\u003c/code\u003e element\nreceives the event, followed by the \u003ccode\u003e\u0026lt;p\u0026gt;\u003c/code\u003e, then the \u003ccode\u003e\u0026lt;div\u0026gt;\u003c/code\u003e, and so on.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#000080\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;options\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;\u003cspan style=\"color:#000080\"\u003ep\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#000080\"\u003einput\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;radio\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003evalue\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;postage_method_1\u0026#34;\u003c/span\u003e /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;/\u003cspan style=\"color:#000080\"\u003ep\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;\u003cspan style=\"color:#000080\"\u003ep\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#000080\"\u003einput\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;radio\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003evalue\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;2\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;postage_method_2\u0026#34;\u003c/span\u003e /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;/\u003cspan style=\"color:#000080\"\u003ep\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#000080\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe can take advantage of this \u0026ldquo;event bubbling\u0026rdquo;. Instead of binding the event to\neach individual \u003ccode\u003einput\u003c/code\u003e, we\u0026rsquo;ll bind it to a parent element instead and let the\nclick events from the inputs bubble up to the parent element. In this case, the\ndiv called options.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$(\u003cspan style=\"color:#d14\"\u003e\u0026#39;#options\u0026#39;\u003c/span\u003e).click(\u003cspan style=\"color:#000;font-weight:bold\"\u003efunction\u003c/span\u003e(event) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e ($(event.target).is(\u003cspan style=\"color:#d14\"\u003e\u0026#39;input\u0026#39;\u003c/span\u003e)){\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#998;font-style:italic\"\u003e// do ajax request\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  });\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e});\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow, each time we add an additional input to the page, it will automatically\nrespond to the same event as the rest of the inputs.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s worth noting that this event will get triggered whenever any element under\nthe \u003ccode\u003e#options\u003c/code\u003e div is clicked, so inside the event we check that the target of\nthe event was an \u003ccode\u003einput\u003c/code\u003e element. This will restrict the code inside the event\nso that it only executes when it\u0026rsquo;s an \u003ccode\u003einput\u003c/code\u003e that\u0026rsquo;s been clicked.\u003c/p\u003e\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003c/h2\u003e\n\u003cp\u003eEvent delegation greatly improves the readability of the code. It sounds scary,\nbut really isn\u0026rsquo;t. It also has the added benefit of speeding up the processing\nof the page because you\u0026rsquo;re not spending time looping through many DOM elements\n(which takes time) in order to add your event handlers.\u003c/p\u003e\n\u003cp\u003eCheck out the references below for a much better explanation of how event\ndelegation and binding of event handlers work.\u003c/p\u003e\n\u003ch2 id=\"references\"\u003eReferences\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://icant.co.uk/sandbox/eventdelegation/\"\u003eEvent Delegation versus Event Handling\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://lab.distilldesign.com/event-delegation/\"\u003eEvent Delegation with jQuery\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.danwebb.net/2008/2/8/event-delegation-made-easy-in-jquery\"\u003eEvent Delegation Made Easy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLearning jQuery - Working with Events, \u003ca href=\"http://www.learningjquery.com/2008/03/working-with-events-part-1\"\u003epart 1\u003c/a\u003e, and \u003ca href=\"http://www.learningjquery.com/2008/05/working-with-events-part-2\"\u003epart 2\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cp\u003eRecently, I\u0026rsquo;ve been working on adding some extra features to a shopping cart\npage using \u003ca href=\"http://jquery.com/\"\u003ejQuery\u003c/a\u003e. The idea is that you select your\ncountry from a dropdown and an AJAX(Asynchronous JavaScript and XML) request is\nperformed, which updates a list of radio buttons on the page. If you select one\nof these radio buttons, it triggers another AJAX(Asynchronous JavaScript and\nXML) request, which updates the postage prices for the given items in the\nbasket.\u003c/p\u003e",
      "date_published": "2009-06-03T00:00:00+00:00",
      "date_modified": "2009-06-03T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/htop-a-prettier-top/",
      "url": "https://elver.me/blog/htop-a-prettier-top/",
      "title": "htop - a prettier top",
      "content_html": "\u003cp\u003eYou use \u003ca href=\"http://en.wikipedia.org/wiki/Top_%28Unix%29\"\u003etop\u003c/a\u003e right? No? Well,\nthat\u0026rsquo;s probably because top is not the friendliest program in the world. Yes,\nit gets the job done, but it could be prettier.\u003c/p\u003e\n\u003cp\u003eAs I was using top more and more for monitoring my VPS, I looked for something\na bit nicer.\u003c/p\u003e\n\u003cp\u003eThis is where \u003ca href=\"http://htop.sourceforge.net/\"\u003ehtop\u003c/a\u003e comes in. It\u0026rsquo;s top, but with\ncolours, progress bars, and a process tree view. Much better. Try it, you\nmight like it.\u003c/p\u003e\n\u003cimg src=\"/images/htop.jpg\" /\u003e\n",
      "summary": "\u003cp\u003eYou use \u003ca href=\"http://en.wikipedia.org/wiki/Top_%28Unix%29\"\u003etop\u003c/a\u003e right? No? Well,\nthat\u0026rsquo;s probably because top is not the friendliest program in the world. Yes,\nit gets the job done, but it could be prettier.\u003c/p\u003e\n\u003cp\u003eAs I was using top more and more for monitoring my VPS, I looked for something\na bit nicer.\u003c/p\u003e\n\u003cp\u003eThis is where \u003ca href=\"http://htop.sourceforge.net/\"\u003ehtop\u003c/a\u003e comes in. It\u0026rsquo;s top, but with\ncolours, progress bars, and a process tree view. Much better. Try it, you\nmight like it.\u003c/p\u003e",
      "date_published": "2008-12-31T00:00:00+00:00",
      "date_modified": "2008-12-31T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/changing-recent-commits-with-git/",
      "url": "https://elver.me/blog/changing-recent-commits-with-git/",
      "title": "Changing Recent Commits with Git",
      "content_html": "\u003cp\u003eHave you ever committed to your repo and realised you\u0026rsquo;ve done something a bit\nsilly? I just did that. I moved to a new machine and forgot to setup my\n\u003ccode\u003e.gitconfig\u003c/code\u003e with the correct username and email, so when I committed, the\ncommit had the wrong user against it. Not a big problem, but it just looks a\nbit\u0026hellip;well, untidy.\u003c/p\u003e\n\u003cp\u003eFear not. Git is all-powerful and allows you to change your mistake even\nthough you\u0026rsquo;ve already committed it. Thanks to Tekkub on the\n\u003ca href=\"http://groups.google.com/group/github\"\u003eGitHub Google Group\u003c/a\u003e for\nthe nudge in the right direction.\u003c/p\u003e\n\u003ch2 id=\"how-does-i-dos-it\"\u003eHow does I dos it?\u003c/h2\u003e\n\u003cp\u003eLike this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit reset --soft HEAD^\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis will reset your working copy to the state before you committed and remove\nthe commit so you can make changes to your working copy (if needed) and\nre-commit.\u003c/p\u003e\n\u003cp\u003eRe-commit the changes.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit commit -m \u003cspan style=\"color:#d14\"\u003e\u0026#34;Changed something\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf you\u0026rsquo;ve already pushed to \u0026ldquo;GitHub\u0026rdquo;:http://www.github.com or another external\nrepo, you can re-push, but you\u0026rsquo;ll need to add \u003ccode\u003e--force\u003c/code\u003e because we have removed\na commit locally and Git doesn\u0026rsquo;t like that.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit push origin --force\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI\u0026rsquo;m not sure whether this would be a good idea if someone else has cloned your\nrepo, but I\u0026rsquo;m ok because I am the only person who pushes to this one.\u003c/p\u003e\n\u003cp\u003eGit is great, but powerful, so be careful. I\u0026rsquo;m sure it would be easy to\ncompletely trash your repo with the wrong series of commands.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eHave you ever committed to your repo and realised you\u0026rsquo;ve done something a bit\nsilly? I just did that. I moved to a new machine and forgot to setup my\n\u003ccode\u003e.gitconfig\u003c/code\u003e with the correct username and email, so when I committed, the\ncommit had the wrong user against it. Not a big problem, but it just looks a\nbit\u0026hellip;well, untidy.\u003c/p\u003e\n\u003cp\u003eFear not. Git is all-powerful and allows you to change your mistake even\nthough you\u0026rsquo;ve already committed it. Thanks to Tekkub on the\n\u003ca href=\"http://groups.google.com/group/github\"\u003eGitHub Google Group\u003c/a\u003e for\nthe nudge in the right direction.\u003c/p\u003e",
      "date_published": "2008-12-16T00:00:00+00:00",
      "date_modified": "2008-12-16T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/google-analytics-ecommerce-tracking/",
      "url": "https://elver.me/blog/google-analytics-ecommerce-tracking/",
      "title": "Google Analytics Ecommerce Tracking",
      "content_html": "\u003cp\u003eSo you\u0026rsquo;ve installed \u003ca href=\"http://www.google.com/analytics\"\u003eGoogle Analytics\u003c/a\u003e, the\nsuperb free web analytics software and it\u0026rsquo;s telling you all sorts of things\nabout your site, most of which you don\u0026rsquo;t even understand. You\u0026rsquo;re learning what\na \u003ca href=\"http://en.wikipedia.org/wiki/Bounce_Rate\"\u003eBounce Rate\u003c/a\u003e is and realising how\npowerful this thing really is.\u003c/p\u003e\n\u003cp\u003eWell, it gets even better. I\u0026rsquo;ve recently discovered its\u0026rsquo; Ecommerce tracking\nfeature.  It allows you to capture Ecommerce related statistics alongside your\nnormal web related statistics. Once you have it correctly setup for your site\nyou can see how much money you\u0026rsquo;ve taken in sales, how many transactions have\ntaken place, how many products have been purchased, and your Ecommerce\nconversion rate. Very nice.\u003c/p\u003e\n\u003ch2 id=\"make-it-so\"\u003eMake it so\u003c/h2\u003e\n\u003cp\u003eIn order to activate Ecommerce tracking, you need to firstly turn on the\nfeature within Google Analytics, and secondly add some extra JavaScript code to\nyour receipt or thanks page.\u003c/p\u003e\n\u003cp\u003eTo turn on the feature, go to the Profile Settings for your site, click Edit\n(top right) and under E-Commerce Website, select \u0026ldquo;Yes, an E-Commerce Site\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s the extra code you need to add to the receipt page straight from\n\u003ca href=\"http://www.google.com/support/googleanalytics/bin/answer.py?hl=en\u0026amp;answer=55528\"\u003eGoogle\u0026rsquo;s help page\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#000080\"\u003escript\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;text/javascript\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003evar\u003c/span\u003e gaJsHost \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e ((\u003cspan style=\"color:#d14\"\u003e\u0026#34;https:\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#0086b3\"\u003edocument\u003c/span\u003e.location.protocol) \u003cspan style=\"color:#000;font-weight:bold\"\u003e?\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;https://ssl.\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;http://www.\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#0086b3\"\u003edocument\u003c/span\u003e.write(unescape(\u003cspan style=\"color:#d14\"\u003e\u0026#34;%3Cscript src=\u0026#39;\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e+\u003c/span\u003e gaJsHost \u003cspan style=\"color:#000;font-weight:bold\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;google-analytics.com/ga.js\u0026#39; type=\u0026#39;text/javascript\u0026#39;%3E%3C/script%3E\u0026#34;\u003c/span\u003e));\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#000080\"\u003escript\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#000080\"\u003escript\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#d14\"\u003e\u0026#34;text/javascript\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003evar\u003c/span\u003e pageTracker \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u003c/span\u003e _gat._getTracker(\u003cspan style=\"color:#d14\"\u003e\u0026#34;UA-XXXXX-1\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epageTracker._trackPageview();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epageTracker._addTrans(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;1234\u0026#34;\u003c/span\u003e,                                     \u003cspan style=\"color:#998;font-style:italic\"\u003e// Order ID\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;Mountain View\u0026#34;\u003c/span\u003e,                            \u003cspan style=\"color:#998;font-style:italic\"\u003e// Affiliation\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;11.99\u0026#34;\u003c/span\u003e,                                    \u003cspan style=\"color:#998;font-style:italic\"\u003e// Total\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;1.29\u0026#34;\u003c/span\u003e,                                     \u003cspan style=\"color:#998;font-style:italic\"\u003e// Tax\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;5\u0026#34;\u003c/span\u003e,                                        \u003cspan style=\"color:#998;font-style:italic\"\u003e// Shipping\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;San Jose\u0026#34;\u003c/span\u003e,                                 \u003cspan style=\"color:#998;font-style:italic\"\u003e// City\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;California\u0026#34;\u003c/span\u003e,                               \u003cspan style=\"color:#998;font-style:italic\"\u003e// State\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;USA\u0026#34;\u003c/span\u003e                                       \u003cspan style=\"color:#998;font-style:italic\"\u003e// Country\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epageTracker._addItem(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;1234\u0026#34;\u003c/span\u003e,                                     \u003cspan style=\"color:#998;font-style:italic\"\u003e// Order ID\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;DD44\u0026#34;\u003c/span\u003e,                                     \u003cspan style=\"color:#998;font-style:italic\"\u003e// SKU\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;T-Shirt\u0026#34;\u003c/span\u003e,                                  \u003cspan style=\"color:#998;font-style:italic\"\u003e// Product Name\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;Green Medium\u0026#34;\u003c/span\u003e,                             \u003cspan style=\"color:#998;font-style:italic\"\u003e// Category\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;11.99\u0026#34;\u003c/span\u003e,                                    \u003cspan style=\"color:#998;font-style:italic\"\u003e// Price\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#d14\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e                                         \u003cspan style=\"color:#998;font-style:italic\"\u003e// Quantity\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#998;font-style:italic\"\u003e\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epageTracker._trackTrans();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#000080\"\u003escript\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf you\u0026rsquo;re already using Analytics, the first few lines will be familier to you.\nThey\u0026rsquo;re just the standard page tracking calls. The bits we\u0026rsquo;re interested in are\nthe \u003ccode\u003epageTacker._addTrans()\u003c/code\u003e, \u003ccode\u003epageTracker._addItem()\u003c/code\u003e and\n\u003ccode\u003epageTracker._trackTrans()\u003c/code\u003e methods.  You\u0026rsquo;ll need to fill in the relevant\ndetails, and more importantly repeat the \u003ccode\u003e_addItem\u003c/code\u003e call for each item within\nthe order. The method for doing this will obviously differ depending on your\nserver side choices, but for Rails I\u0026rsquo;ve got something similar to this.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-erb\" data-lang=\"erb\"\u003e\u0026lt;% @order.items.each do |item| %\u0026gt;\n\n  pageTracker._addItem(\n    \u0026lt;%= @order.order_id %\u0026gt;,                     // Order ID\n    \u0026lt;%= @order.sku %\u0026gt;,                          // SKU\n    \u0026lt;%= item.product.name %\u0026gt;,                   // Product Name\n    \u0026lt;%= item.product.category %\u0026gt;,               // Category\n    \u0026lt;%= item.unit_price %\u0026gt;,                     // Price\n    \u0026lt;%= item.quantity %\u0026gt;                        // Quantity\n  );\n\n\u0026lt;% end %\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou should now start to get E-Commerce stats showing up under the Ecommerce\nsection of Google Analytics.\u003c/p\u003e\n\u003ch2 id=\"references\"\u003eReferences\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.google.com/support/googleanalytics/bin/answer.py?hl=en\u0026amp;answer=55528\"\u003eGoogle Analytics Help\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.epikone.com/blog/2008/07/02/google-analytics-e-commerce-tracking-pt-4-tacking-lead-gen-forms/\"\u003eAnalytics Talk\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cp\u003eSo you\u0026rsquo;ve installed \u003ca href=\"http://www.google.com/analytics\"\u003eGoogle Analytics\u003c/a\u003e, the\nsuperb free web analytics software and it\u0026rsquo;s telling you all sorts of things\nabout your site, most of which you don\u0026rsquo;t even understand. You\u0026rsquo;re learning what\na \u003ca href=\"http://en.wikipedia.org/wiki/Bounce_Rate\"\u003eBounce Rate\u003c/a\u003e is and realising how\npowerful this thing really is.\u003c/p\u003e\n\u003cp\u003eWell, it gets even better. I\u0026rsquo;ve recently discovered its\u0026rsquo; Ecommerce tracking\nfeature.  It allows you to capture Ecommerce related statistics alongside your\nnormal web related statistics. Once you have it correctly setup for your site\nyou can see how much money you\u0026rsquo;ve taken in sales, how many transactions have\ntaken place, how many products have been purchased, and your Ecommerce\nconversion rate. Very nice.\u003c/p\u003e",
      "date_published": "2008-08-07T00:00:00+00:00",
      "date_modified": "2008-08-07T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/git-patching-flexibility/",
      "url": "https://elver.me/blog/git-patching-flexibility/",
      "title": "Git Patching Flexibility",
      "content_html": "\u003cp\u003eI don\u0026rsquo;t know about you, but when I\u0026rsquo;m coding I\u0026rsquo;ll often need to make a change\nthat\u0026rsquo;s unrelated to the current feature or bug I am working on. I\u0026rsquo;ll notice a\nspelling mistake, a typo, or some other small code change. You don\u0026rsquo;t want to\ncommit the unrelated change as part of your overall commit because, well, it\u0026rsquo;s\nunrelated. It should be its own commit with its own commit message.  This will\nmake it much easier to read the commit log and cuts down on confusion.  People\nwon\u0026rsquo;t have to ask \u0026ldquo;Why did they change that? It has nothing to do with the\nchange\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eWhen I used Subversion, you had to remove the unrelated change, commit, then\nadd it back in and commit again. Maybe there was a nicer way, but I didn\u0026rsquo;t\nknow it. Git is much nicer.\u003c/p\u003e\n\u003cp\u003eWhen you stage a file ready for committing, Git allows you to only stage a\ncertain part or parts of the file, which it calls hunks.\u003c/p\u003e\n\u003cp\u003eSo, run:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit add --patch \u0026lt;filename\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eGit will show you a diff of the first difference that it wants to stage and\nwill ask if you\u0026rsquo;d like to stage the current hunk, like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eStage this hunk \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003ey/n/a/d/s/?\u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e?\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe options in this example are:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ey - stage this hunk\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003en - \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e not stage this hunk\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea - stage this and all the remaining hunks in the file\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed - \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e not stage this hunk nor any of the remaining hunks in the file\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003es - split the current hunk into smaller hunks\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eChoose what you\u0026rsquo;d like to do with the current hunk. Git will continue to go\nthrough the rest of the hunks in the file, asking you what to do with each one.\u003c/p\u003e\n\u003cp\u003eWhen you\u0026rsquo;ve decided which hunks should be staged, commit as normal and only\nthose changes will form part of the commit. You can then add the rest of\nyour changes and commit again.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s the flexibility that\u0026rsquo;s great. It works with you, not against you.\u003c/p\u003e\n\u003cp\u003eFor a much more in depth look at the capabilities of \u003ccode\u003egit add --patch\u003c/code\u003e, see\nthe following article.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[The Thing About Git](\u003ca href=\"http://tomayko.com/writings/the-thing-about-git\"\u003ehttp://tomayko.com/writings/the-thing-about-git\u003c/a\u003e by\n\u0026ldquo;Ryan Tomayko\u0026rdquo;:http://tomayko.com/)\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cp\u003eI don\u0026rsquo;t know about you, but when I\u0026rsquo;m coding I\u0026rsquo;ll often need to make a change\nthat\u0026rsquo;s unrelated to the current feature or bug I am working on. I\u0026rsquo;ll notice a\nspelling mistake, a typo, or some other small code change. You don\u0026rsquo;t want to\ncommit the unrelated change as part of your overall commit because, well, it\u0026rsquo;s\nunrelated. It should be its own commit with its own commit message.  This will\nmake it much easier to read the commit log and cuts down on confusion.  People\nwon\u0026rsquo;t have to ask \u0026ldquo;Why did they change that? It has nothing to do with the\nchange\u0026rdquo;\u003c/p\u003e",
      "date_published": "2008-08-04T00:00:00+00:00",
      "date_modified": "2008-08-04T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/how-to-generate-request-an-ssl-certificate/",
      "url": "https://elver.me/blog/how-to-generate-request-an-ssl-certificate/",
      "title": "How to generate / request an SSL certificate",
      "content_html": "\u003cp\u003eGenerating an SSL certificate can be confusing if you\u0026rsquo;ve never done it\nbefore. Actually, it\u0026rsquo;s confusing if you have done it before. Hopefully this\nshould remind me how to do it in the future!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePLEASE NOTE:\u003c/strong\u003e I am no expert on SSL, but this does the job for me.\u003c/p\u003e\n\u003cp\u003eI recently had to do this after the \u003ca href=\"http://www.ubuntu.com/usn/usn-612-1\"\u003eDebian security\nvulnerability\u003c/a\u003e affected one of my SSL\ncertificates.\u003c/p\u003e\n\u003cp\u003eI currently get my SSL cerficiates through \u003ca href=\"http://www.namecheap.com\"\u003eNameCheap\u003c/a\u003e\nfor $10.  They are re-sellers of RapidSSL and GeoTrust certificates. Mine is a\nRapidSSL.\u003c/p\u003e\n\u003ch2 id=\"generate-a-private-key-and-certificate-signing-request\"\u003eGenerate a private key and Certificate Signing Request\u003c/h2\u003e\n\u003cp\u003eWe need to generate an OpenSSL keypair and a \u003ca href=\"http://en.wikipedia.org/wiki/Certificate_signing_request\"\u003eCertificate Signing Request\n(CSR)\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe keypair consists of two cryptographic keys. A public and private. The\npublic key is included with the CSR along with other applicant information such\nas name, company, etc. The private key is used to sign the CSR request.\u003c/p\u003e\n\u003cp\u003eA CSR is what you send to your chosen Certificate Authority (CA) to request\nthat they supply you with an SSL certificate. It includes your identifying\ninformation and the public key for your server/site.\u003c/p\u003e\n\u003cp\u003eGenerate it like this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eopenssl req -new -newkey rsa:1024 -nodes -keyout example.key -out example.csr\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYou\u0026rsquo;ll be prompted to enter information such as Common Name, Organisation,\nCountry etc.\u003c/p\u003e\n\u003cp\u003eIt should be fairly straight forward, but your CA will let you know if you\u0026rsquo;ve\ndone it wrong, I\u0026rsquo;m sure.\u003c/p\u003e\n\u003cp\u003eThis will create \u003ccode\u003eexample.key\u003c/code\u003e (the private key) and \u003ccode\u003eexample.csr\u003c/code\u003e (the CSR).\u003c/p\u003e\n\u003ch2 id=\"requesting-your-certificate\"\u003eRequesting your certificate\u003c/h2\u003e\n\u003cp\u003eThis part should be easy. Normally your CA will have a form on their website\nwhich allows you to paste in your CSR. This obviously varies from company to\ncompany. Once you have given them your CSR, they will first ask you for money,\nand then generate your CRT file. Yay!\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m only scratching the surface of SSL here. OpenSSL has a massive amount of\noptions. There is much to learn.\u003c/p\u003e\n\u003ch2 id=\"references\"\u003eReferences\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://help.ubuntu.com/community/OpenSSL\"\u003eMore information on OpenSSL commands\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cp\u003eGenerating an SSL certificate can be confusing if you\u0026rsquo;ve never done it\nbefore. Actually, it\u0026rsquo;s confusing if you have done it before. Hopefully this\nshould remind me how to do it in the future!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePLEASE NOTE:\u003c/strong\u003e I am no expert on SSL, but this does the job for me.\u003c/p\u003e\n\u003cp\u003eI recently had to do this after the \u003ca href=\"http://www.ubuntu.com/usn/usn-612-1\"\u003eDebian security\nvulnerability\u003c/a\u003e affected one of my SSL\ncertificates.\u003c/p\u003e\n\u003cp\u003eI currently get my SSL cerficiates through \u003ca href=\"http://www.namecheap.com\"\u003eNameCheap\u003c/a\u003e\nfor $10.  They are re-sellers of RapidSSL and GeoTrust certificates. Mine is a\nRapidSSL.\u003c/p\u003e",
      "date_published": "2008-07-24T00:00:00+00:00",
      "date_modified": "2008-07-24T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/rails-deployment-with-git-vlad-and-ssh-agent-forwarding/",
      "url": "https://elver.me/blog/rails-deployment-with-git-vlad-and-ssh-agent-forwarding/",
      "title": "Rails Deployment with Git, Vlad and SSH Agent Forwarding",
      "content_html": "\u003cp\u003eI\u0026rsquo;m switching my code repositories over to Git from Subversion. For the most\npart it\u0026rsquo;s going well. I\u0026rsquo;m having some issues with line endings, but that\u0026rsquo;s for\nanother post. I\u0026rsquo;m still getting to grips with day to day usage, but can already\nsee that it\u0026rsquo;s going to be a great improvement on Subversion.\u003c/p\u003e\n\u003cp\u003eThis is how I\u0026rsquo;ve setup Vlad, Git, and SSH to work together.\u003c/p\u003e\n\u003ch2 id=\"vlad-configuration\"\u003eVlad Configuration\u003c/h2\u003e\n\u003cp\u003eI use \u003ca href=\"http://rubyhitsquad.com/Vlad_the_Deployer.html\"\u003eVlad\u003c/a\u003e to deploy my\nprojects to the staging/live server, so I needed to re-configure Vlad to\nsupport Git. This was very simple to do. In my \u003ccode\u003eRakefile\u003c/code\u003e, I included the Git\nclass instead of the Subversion class. This removes the Subversion specific\ncommands and includes the Git specific commands instead.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-diff\" data-lang=\"diff\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e-require \u0026#39;vlad/subversion\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+require \u0026#39;vlad/git\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI also changed the repository address in my \u003ccode\u003econfig/deploy.rb\u003c/code\u003e file.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-diff\" data-lang=\"diff\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e-set :repository, \u0026#39;https://sub.version.server/repo\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;background-color:#fdd\"\u003e\u003c/span\u003e\u003cspan style=\"color:#000;background-color:#dfd\"\u003e+set :repository, \u0026#39;git@github.com:username/repo.git\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThese are the only changes I needed to make.\u003c/p\u003e\n\u003ch2 id=\"ssh-and-git-setup\"\u003eSSH and Git setup\u003c/h2\u003e\n\u003cp\u003eGit uses SSH keys to control access to repositories. As I\u0026rsquo;m using GitHub as my\ndeployment Git repository, I needed to identify myself with them. To do this, I\nsupplied them with my SSH public key. \u003ca href=\"http://github.com/guides/providing-your-ssh-key#linux\"\u003eGitHub have good instructions on how to\ndo this\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eAs the code is cloned from GitHub directly to the deployment server (not my\nmachine), my private SSH key would also need to be installed on the deployment\nserver.\u003c/p\u003e\n\u003cp\u003eVlad deployment now works! This will checkout the latest HEAD and deploy it to\nthe server. \u003ca href=\"http://scie.nti.st/2007/9/25/vlad-the-deployer-and-git\"\u003eYou can set the specific revision that you\nwant\u003c/a\u003e in your\n\u003ccode\u003econfig/deploy.rb\u003c/code\u003e as well if required. I\u0026rsquo;m not doing that at the moment.\u003c/p\u003e\n\u003ch2 id=\"so-whats-the-problem\"\u003eSo, what\u0026rsquo;s the problem?\u003c/h2\u003e\n\u003cp\u003eThe problem is that you need to install your private SSH key on the deployment\nserver. I didn\u0026rsquo;t want to do this in case the server was ever compromised.\nIf it was compromised, the attacker could also theoretically get into\nother systems using that key if it didn\u0026rsquo;t have a passphrase. This would be bad.\nMy key does have a passphrase, but why install it when you don\u0026rsquo;t really need to?\u003c/p\u003e\n\u003ch2 id=\"making-it-more-secure\"\u003eMaking it more secure\u003c/h2\u003e\n\u003cp\u003eFortunately, there\u0026rsquo;s a rather nifty solution to this problem — SSH agent\nforwarding.  In order to do so, you must first be using SSH Agent. SSH Agent\nallows you to authenticate yourself once per session, so you don\u0026rsquo;t have to\nenter your password every time you connect to the server. If you\u0026rsquo;re already\nusing SSH keys and have SSH Agent running on your system (which is the default\nin Ubuntu), you just need to do:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh-add ~/.ssh/\u0026lt;keyname\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYou\u0026rsquo;ll be prompted for the passphrase to the key. Once you enter it, you should\nbe able to connect to any servers using that key without entering it again.\nThis is very handy anyway regardless of whether you\u0026rsquo;re going to be using\nforwarding or not.\u003c/p\u003e\n\u003cp\u003eSee \u003ca href=\"http://en.wikipedia.org/wiki/Ssh-agent#Setting_Up_Ssh_Agent\"\u003ethis wikipedia\npage\u003c/a\u003e for more\ninformation.\u003c/p\u003e\n\u003ch2 id=\"how-to-setup-the-forwarding\"\u003eHow to setup the forwarding\u003c/h2\u003e\n\u003cp\u003eThis is where the forwarding comes in. SSH can forward requests for\nauthentication back to the original SSH Agent process running on your machine.\nSo, you can connect to your deployment server and then connect to another\nserver without re-entering your passphrase or having to install any keys on the\ndeployment machine itself.  Much coolness. This negates the need to install any\nother keys on the deployment server itself.\u003c/p\u003e\n\u003cp\u003eThere is a very well explained article called \u003ca href=\"http://www.unixwiz.net/techtips/ssh-agent-forwarding.html\"\u003eAn Illustrated Guide to SSH\nAgent Forwarding\u003c/a\u003e\nover at \u003ca href=\"http://www.unixwiz.net\"\u003eUnixwiz.net\u003c/a\u003e that goes into a lot of detail\nabout how this all works. It\u0026rsquo;s well worth a read.\u003c/p\u003e\n\u003cp\u003eThis is how to set it up.\u003c/p\u003e\n\u003cp\u003eEdit your \u003ccode\u003e~/.ssh/config\u003c/code\u003e file and add something like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eHost \u0026lt;name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  HostName \u0026lt;ip or host\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  User \u0026lt;username\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  IdentityFile ~/.ssh/\u0026lt;filename\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ForwardAgent yes\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis is all you need. If you\u0026rsquo;ve got SSH Agent running, you\u0026rsquo;re sorted.\u003c/p\u003e\n\u003cp\u003eIncidentally, you can add these sections for as many hosts as required. It saves you\nhaving to type out lots of command line switches all the time. Just leave out the\n\u003ccode\u003eForwardAgent yes\u003c/code\u003e line.\u003c/p\u003e\n\u003ch2 id=\"references\"\u003eReferences\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://github.com/guides/providing-your-ssh-key#linux\"\u003eGitHub - Providing your SSH key\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://scie.nti.st/2007/9/25/vlad-the-deployer-and-git\"\u003eVlad the Deployer and Git\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://en.wikipedia.org/wiki/Ssh-agent#Setting_Up_Ssh_Agent\"\u003eSSH Agent on Wikipedia\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.unixwiz.net/techtips/ssh-agent-forwarding.html\"\u003eAn Illustrated Guide to SSH Agent Forwarding\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://dysinger.net/2008/04/30/deploying-with-capistrano-git-and-ssh-agent/\"\u003eDeploying with Capistrano, Git and SSH-Agent\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cp\u003eI\u0026rsquo;m switching my code repositories over to Git from Subversion. For the most\npart it\u0026rsquo;s going well. I\u0026rsquo;m having some issues with line endings, but that\u0026rsquo;s for\nanother post. I\u0026rsquo;m still getting to grips with day to day usage, but can already\nsee that it\u0026rsquo;s going to be a great improvement on Subversion.\u003c/p\u003e\n\u003cp\u003eThis is how I\u0026rsquo;ve setup Vlad, Git, and SSH to work together.\u003c/p\u003e\n\u003ch2 id=\"vlad-configuration\"\u003eVlad Configuration\u003c/h2\u003e\n\u003cp\u003eI use \u003ca href=\"http://rubyhitsquad.com/Vlad_the_Deployer.html\"\u003eVlad\u003c/a\u003e to deploy my\nprojects to the staging/live server, so I needed to re-configure Vlad to\nsupport Git. This was very simple to do. In my \u003ccode\u003eRakefile\u003c/code\u003e, I included the Git\nclass instead of the Subversion class. This removes the Subversion specific\ncommands and includes the Git specific commands instead.\u003c/p\u003e",
      "date_published": "2008-07-10T00:00:00+00:00",
      "date_modified": "2008-07-10T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/rake-dependencies/",
      "url": "https://elver.me/blog/rake-dependencies/",
      "title": "Rake dependencies",
      "content_html": "\u003cp\u003eRake tasks are great for all sorts of small tasks. They give you a bit of\nstructure to what would normally be a shell or ruby script.  However, the thing\nI like about rake tasks are dependencies.\u003c/p\u003e\n\u003ch2 id=\"a-simple-example\"\u003eA simple example\u003c/h2\u003e\n\u003cp\u003eYou see, you can make one task rely on another. Take this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edesc \u003cspan style=\"color:#d14\"\u003e\u0026#34;Make coffee\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etask \u003cspan style=\"color:#990073\"\u003e:coffee\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#990073\"\u003e:get_mug\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#0086b3\"\u003eputs\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Making a coffee\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etask \u003cspan style=\"color:#990073\"\u003e:get_mug\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#0086b3\"\u003eputs\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Getting a mug\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erake get_mug\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eGetting\u003c/span\u003e a mug\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erake coffee\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eGetting\u003c/span\u003e a mug\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eMaking\u003c/span\u003e a coffee\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEasy to understand isn\u0026rsquo;t it? \u003ccode\u003ecoffee\u003c/code\u003e depends on \u003ccode\u003eget_mug\u003c/code\u003e, so \u003ccode\u003eget_mug\u003c/code\u003e will be\ncalled before the main \u003ccode\u003ecoffee\u003c/code\u003e task every time \u003ccode\u003erake coffee\u003c/code\u003e is run.\u003c/p\u003e\n\u003ch2 id=\"a-better-example\"\u003eA better example\u003c/h2\u003e\n\u003cp\u003eYou can also redefine task dependencies without altering the original task.\nFor example, on this blog I have a task which creates index pages for the\ncategory pages. I want this to run everytime the \u003ccode\u003ebuild\u003c/code\u003e task is run. I could\nmodify the original \u003ccode\u003ebuild\u003c/code\u003e task, but a much nicer and cleaner way is to\nredefine the task and add the dependant task like so.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etask \u003cspan style=\"color:#990073\"\u003e:build\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#39;blog:categories:create_indexes\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis will keep any existing dependencies that the build task originally had and\nalso add my new one. Ain\u0026rsquo;t it pretty?\u003c/p\u003e\n\u003ch2 id=\"references\"\u003eReferences\u003c/h2\u003e\n\u003cp\u003eThanks to the guys at \u003ca href=\"http://www.railsenvy.com\"\u003eRails Envy\u003c/a\u003e for their tutorial\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.railsenvy.com/2007/6/11/ruby-on-rails-rake-tutorial\"\u003eRuby on Rails Rake Tutorial [aka. How rake turned me into an\nalcoholic]\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cp\u003eRake tasks are great for all sorts of small tasks. They give you a bit of\nstructure to what would normally be a shell or ruby script.  However, the thing\nI like about rake tasks are dependencies.\u003c/p\u003e\n\u003ch2 id=\"a-simple-example\"\u003eA simple example\u003c/h2\u003e\n\u003cp\u003eYou see, you can make one task rely on another. Take this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edesc \u003cspan style=\"color:#d14\"\u003e\u0026#34;Make coffee\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etask \u003cspan style=\"color:#990073\"\u003e:coffee\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#990073\"\u003e:get_mug\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#0086b3\"\u003eputs\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Making a coffee\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etask \u003cspan style=\"color:#990073\"\u003e:get_mug\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#0086b3\"\u003eputs\u003c/span\u003e \u003cspan style=\"color:#d14\"\u003e\u0026#34;Getting a mug\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erake get_mug\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eGetting\u003c/span\u003e a mug\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erake coffee\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eGetting\u003c/span\u003e a mug\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#008080\"\u003eMaking\u003c/span\u003e a coffee\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEasy to understand isn\u0026rsquo;t it? \u003ccode\u003ecoffee\u003c/code\u003e depends on \u003ccode\u003eget_mug\u003c/code\u003e, so \u003ccode\u003eget_mug\u003c/code\u003e will be\ncalled before the main \u003ccode\u003ecoffee\u003c/code\u003e task every time \u003ccode\u003erake coffee\u003c/code\u003e is run.\u003c/p\u003e",
      "date_published": "2008-06-30T00:00:00+00:00",
      "date_modified": "2008-06-30T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/git-completion-yay/",
      "url": "https://elver.me/blog/git-completion-yay/",
      "title": "Git bash completion = Yay!",
      "content_html": "\u003cp\u003eIf you\u0026rsquo;ve heard of, or are already using bash completion, you\u0026rsquo;ll know how great\nit is.  Here\u0026rsquo;s how to use it with \u003ca\nhref=\"http://en.wikipedia.org/wiki/Git_(software)\"\u003eGit\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"how-to-get-the-sweetness\"\u003eHow to get the sweetness?\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m using Ubuntu (Hardy), but setup instructions should be similar for others.\nFor Ubuntu, uncomment this section in \u003ccode\u003e/etc/bash.bashrc\u003c/code\u003e and you\u0026rsquo;ve enabled bash\ncompletion. You\u0026rsquo;ll need to open a new terminal for it to take affect.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e -f /etc/bash_completion \u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#000;font-weight:bold\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e . /etc/bash_completion\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"how-to-enable-git-completion\"\u003eHow to enable Git completion\u003c/h2\u003e\n\u003cp\u003eYou\u0026rsquo;ll need the bash completion file for Git. This file details how the Git\ncommands will be completed. The file comes as part of the Git distribution.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDownload the lastest git release from\n\u003ca href=\"http://www.kernel.org/pub/software/scm/git/\"\u003ehttp://www.kernel.org/pub/software/scm/git/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFind the \u003ccode\u003egit-completion.bash\u003c/code\u003e file in the \u003ccode\u003econtrib/\u003c/code\u003e directory and copy to\nthe \u003ccode\u003e/etc/bash_completion.d/\u003c/code\u003e directory\u003c/li\u003e\n\u003cli\u003eStart a new login shell (logout/login or start a new Terminal tab)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"try-it-out\"\u003eTry it out\u003c/h2\u003e\n\u003cp\u003eNow, typing \u003ccode\u003egit \u0026lt;tab\u0026gt;\u0026lt;tab\u0026gt;\u003c/code\u003e should list all of the various git commands (of\nwhich there are many).  However, the really cool part is that it will also list\nyour branches for you. Typing \u003ccode\u003egit checkout \u0026lt;tab\u0026gt;\u0026lt;tab\u0026gt;\u003c/code\u003e within your Git repo\nwill list all of the branches you have.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ejord@jordan /home/jord/webby\u003cspan style=\"color:#000;font-weight:bold\"\u003e(\u003c/span\u003emaster\u003cspan style=\"color:#000;font-weight:bold\"\u003e)\u003c/span\u003e $ git checkout \u0026lt;tab\u0026gt;\u0026lt;tab\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eHEAD    master\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRSI, be gone!\u003c/p\u003e\n\u003ch2 id=\"thanks\"\u003eThanks\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://blog.bitfluent.com/post/27983389/git-utilities-you-cant-live-without\"\u003eBitfluent\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "summary": "\u003cp\u003eIf you\u0026rsquo;ve heard of, or are already using bash completion, you\u0026rsquo;ll know how great\nit is.  Here\u0026rsquo;s how to use it with \u003ca\nhref=\"http://en.wikipedia.org/wiki/Git_(software)\"\u003eGit\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"how-to-get-the-sweetness\"\u003eHow to get the sweetness?\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m using Ubuntu (Hardy), but setup instructions should be similar for others.\nFor Ubuntu, uncomment this section in \u003ccode\u003e/etc/bash.bashrc\u003c/code\u003e and you\u0026rsquo;ve enabled bash\ncompletion. You\u0026rsquo;ll need to open a new terminal for it to take affect.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#000;font-weight:bold\"\u003e[\u003c/span\u003e -f /etc/bash_completion \u003cspan style=\"color:#000;font-weight:bold\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#000;font-weight:bold\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e . /etc/bash_completion\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#000;font-weight:bold\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"how-to-enable-git-completion\"\u003eHow to enable Git completion\u003c/h2\u003e\n\u003cp\u003eYou\u0026rsquo;ll need the bash completion file for Git. This file details how the Git\ncommands will be completed. The file comes as part of the Git distribution.\u003c/p\u003e",
      "date_published": "2008-06-18T00:00:00+00:00",
      "date_modified": "2008-06-18T00:00:00+00:00"
    }
    
    , {
      "id": "https://elver.me/blog/hello-and-welcome/",
      "url": "https://elver.me/blog/hello-and-welcome/",
      "title": "w00t! First post evar!",
      "content_html": "\u003cp\u003eHello. The proper site is now live. It\u0026rsquo;s been way too long coming, but now it\u0026rsquo;s\nhere. I built it using \u003ca href=\"http://webby.rubyforge.net/\"\u003eWebby\u003c/a\u003e. Hopefully there\u0026rsquo;ll\nbe some posts explaining how that was done soon.\u003c/p\u003e\n\u003cp\u003eP.S. I know some people won\u0026rsquo;t like the colours, but I do.\u003c/p\u003e\n",
      "summary": "\u003cp\u003eHello. The proper site is now live. It\u0026rsquo;s been way too long coming, but now it\u0026rsquo;s\nhere. I built it using \u003ca href=\"http://webby.rubyforge.net/\"\u003eWebby\u003c/a\u003e. Hopefully there\u0026rsquo;ll\nbe some posts explaining how that was done soon.\u003c/p\u003e\n\u003cp\u003eP.S. I know some people won\u0026rsquo;t like the colours, but I do.\u003c/p\u003e",
      "date_published": "2008-06-17T00:00:00+00:00",
      "date_modified": "2008-06-17T00:00:00+00:00"
    }
    
  ]
}
