beres.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>I uninstalled my RSS feed reader - Archive - MayVaneDay Studios</title>
  6. <link href="../../../style.css" rel="stylesheet" type="text/css" media="all">
  7. <meta name="author" content="Vane Vander">
  8. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  9. </head>
  10. <body class="mayvaneday">
  11. <article>
  12. <div class="box">
  13. <h1>I uninstalled my RSS feed reader</h1>
  14. <p>published: 2022-08-17</p>
  15. </div>
  16. <hr>
  17. <div class="box">
  18. <p>I almost bricked my Kobo a few days ago trying to upgrade <code>libc</code> to get some dependencies written in C to function. When trying to get <a href="https://web.archive.org/web/20220627012432/https://www.w3.org/Tools/HTML-XML-utils/man1/hxselect.html"><code>hxselect</code></a> and its sibling commands to function, I repeatedly got the same error on execution: <code>libc.so.6: version 'GLIBC_2.34' not found</code>. Being that the Kobo is an "embedded Linux" device, it has no package manager, so asking the system to <em>pretty please update</em> this <em>one</em> package wasn't an option. Remembering how I had previously gotten <code>tree</code> to run with limited functionality by copying some <code>arm32</code>-architecture libraries stolen from my Raspberry Pi (now running a 64-bit OS), I stole a copy of <code>libc.so.6</code> from a Debian chroot I had lying around, moved <code>libc.so.6</code> on the Kobo to <code>libc.so.6.bak</code>, and...</p>
  19. <p>...broke every single program running on the device.</p>
  20. <p><code>mv</code> and <code>cp</code> wouldn't work to put the file back. <code>cat</code> wouldn't let me view a few critical files to retrieve them in case the device was toast. While <a href="https://archive.ph/https://github.com/koreader/koreader/wiki/SSH">Dropbear</a> was running in the background, I couldn't SFTP into it from my desktop computer because Dropbear couldn't contact the <code>libc</code> library to open a new process. Even though I knew the file existed on the device and <em>where</em> it was, I had no way of moving it back to where the system expected it to be. <a href="https://web.archive.org/web/20220817011337/https://goodereader.com/blog/kobo-ereader-news/the-kobo-libra-h2o-sd-card-is-soldered-onto-the-motherboard">The damn internal storage is soldered onto the motherboard</a>, so taking it apart to mount the storage on a different device and manually move the file (or just giving up and re-flashing it) wasn't (and will never be) an option.</p>
  21. <p>A panic attack and a furious untimely shit in the bathroom later, the original Dropbear process I was using to debug over SSH still running, my wife reminded me I had previously installed <a href="https://archive.ph/https://github.com/henderjon/kurly">Kurly</a> to make (and fail to make) a line-based browser since the Busybox <code>curl</code> on the device apparently doesn't support TLS, and maybe <em>that</em> would still work to push data around in the filesystem. Binaries written in Golang apparently don't give a shit about <code>libc</code> unless they need to do some wacky low-level stuff in the operating system. So imagine my surprise, and sudden stroke of hope, when Kurly was the only damn program still functional. I quickly spun up a simple web server <a href="https://web.archive.org/web/20220817002902/https://gist.githubusercontent.com/mildred/67d22d7289ae8f16cae7/raw/214c213c9415da18a471d1ed04660022cce059ef/server.py">(the one from Python, but patched to support HTTP PUT)</a>, pushed <code>libc.so.6.bak</code> to my desktop, renamed it to the proper <code>libc.so.6</code>, then retrieved it again from the Kobo.</p>
  22. <p>And then everything <em>magically</em> started working again. (Well, except for KOReader, whose UI had crashed... but that could just be fixed with a power cycle.) And I let myself cry for a few minutes in relief. And I did <em>not</em> go on eBay and spend another $200 or so on a replacement, and I spent the next half-hour scouring the bottom of the barrel of GitHub to find <a href="https://web.archive.org/web/20220817172827/https://github.com/tomwright/dasel">an equivalent XML parser but written in Golang</a> so I wouldn't be tempted to break any more critical system libraries.</p>
  23. <p>I wasn't canoodling in the intestines of my device for fun. I was working on my latest project, <a href="https://codeberg.org/lethe/beres">Beres</a>: a Bash script that takes a list of URLs and dumps to plaintext (formatted Markdown) files all articles that happened yesterday. (Well, maybe "Bash" is a lie: Beres seems to run just fine when called as <code>sh /bin/beres</code>, but changing the shebang to <code>#!/bin/sh</code> fills the screen with errors.) Even though it may seem like it from my more creative work, I don't hate myself <em>quite</em> enough to attempt to implement an XML parser in <code>sed</code>/<code>awk</code>/whatever, thus the necessary external dependencies. By only pulling articles that happened yesterday, Beres doesn't have to keep "state" of when it was last run, thus reducing code complexity at the cost of the user potentially missing articles if they don't run Beres for a few days.</p>
  24. <p>It's a lovely little script. No database, barely any config, no requirement for a VPS. I'm quite proud of it, really. After reading an article, if I don't care about it anymore, I can just delete it instead of merely marking it read and hoping the RSS feed reader will eventually run garbage collection to prevent the database from growing obese and unusable from latency. However, since reading articles means manually opening every one with <code>less</code> and Beres doesn't fetch external resources like images, I've found that using it is incredibly frustrating for use with feeds that publish more than, say, two articles a day. Like social media feeds, for example. It soft-limits me to only subscribing to news and maybe a handful of personal sites I care about and can trust to put out high-quality articles... or, at least, ones I would want to expend the effort of typing in KOReader's terminal emulator to read.</p>
  25. <p>Said social media feeds were the reason I originally went with Tiny Tiny RSS because of the "scroll to mark as read" feature to consume as many articles as quickly as possible. It probably also helped that I could just <a href="https://web.archive.org/web/20220817173016/https://git.tt-rss.org/fox/ttrss-docker-compose.git/tree/README.md?h=static-dockerhub">throw it inside Docker</a> instead of having to deal with the monstrosity that is manually creating a database in Redis or PostgreSQL or installing seven kajillion PHP dependencies and hoping they'll run nicely with Caddy. (I hate you specifically, Miniflux. "MUH MINIMALISM!!1!" Okay then, where's SQLite support? What's more simple to handle than a single file? You're already a single file, being written in Golang. Can't you go one step further?) And technically I only deleted Newsboat and Tiny Tiny RSS; I kept <a href="https://f-droid.org/en/packages/org.decsync.flym/">Flym</a> on my phone(s) to track a handful (an admittedly large handful, but still one) of artists on Twitter whose artwork I would rather not go without. I would have gone one step further and imported these onto desktop to fully cut off the ability to constantly swipe for updates on my phone like a dopamine slot machine, but none of the options for Linux that I know of really mesh well with my sneakernet setup and I often move among two or three devices for writing as I go about the day.</p>
  26. <p>But nobody cares about these minor implementation details. What's more important is, <em>why am I doing this to myself?</em></p>
  27. <p>And the answer, paradoxically, is that I'm exhausted. I'm tired of dealing with Docker, so I wrote a program that would completely negate the need for it. I'm tired of eye strain from reading on my phone, so I wrote a program that would work on my e-reader. I'm tired of being exposed to the opinions of thousands of strangers on a daily basis, so I wrote a program that would keep me up-to-date on the current state of the apocalypse while being so unwieldy that it de facto excludes all those other strangers with ultimately nothing worthwhile to say.</p>
  28. <p>I'm tired of being online, so I gave myself one less reason to boot up my computer.</p>
  29. <p>I wanted to retire from public life, I thought the night before I almost accidentally killed my Kobo. Leave only my books publically accessible and remove access to all the rest and delete all my other social accounts elsewhere. A woman I had never seen before had come up to me in a dream a few nights prior and demanded I stop being so neurotic about my website, to decide once and for all whether I was staying on the Internet or leaving.</p>
  30. <p>I don't think I've made my choice yet. Some part of me thinks I may never. That's my response to everything that ever goes wrong in my life, isn't it, Jett? Do nothing and wait for the problem to get worse?</p>
  31. <p>I wonder what creative wrench the Eschaton will try to throw into my gears next.</p>
  32. </div>
  33. <hr>
  34. <div class="box">
  35. <p>A few days after I write this, and I awake to find that yet another asshole has scraped the entirety of my website and then gutted all but the front page for the sole purpose of stealing my CSS. This I only know because apparently they forgot to remove the GoatCounter tracking pixel I <del>have</del> had on the bottom of the homepage, so I kept seeing them in my referers. I don't know whether to be incensed that users from Lainchan (I'm 99.9% sure that's where the scraping keeps coming from) don't have a single creative bone in their bodies and so apparently need to pretend to be me, or full of schadenfreude that apparently I'm the only one worth trying to ape. Something something "imitation is flattery" with a dash of "males yet again trying to skinwalk as women they hate".</p>
  36. <p>My wife says to <a href="https://deadendshrine.online/writing/letters_to_jett/p3.html">keep going</a>. So I think I will. I can trust no one else with this most sacred of missions.</p>
  37. </div>
  38. <hr>
  39. <div class="box">
  40. <p align=right>CC BY-NC-SA 4.0 &copy; Vane Vander</p>
  41. </div>
  42. </article>
  43. </body>
  44. </html>