_______________ CAPTAIN'S LOG Mental H Cat _______________ ,---- | .d0XWWWMMMMWWNWWWXKkc. | ;kXWWMMMWWWMWWNNWWNNXNX0l | 'kXNWNWWNNNNXXXNNXNXK00kk0Kx. | ;KXNNNNXXXKKKKKKKK0OK00xxdldxd. | '0XNXXX00OOOOO000OOkxkkkxc;c:lll | .OKKXXKOxxxxxxkkOkxdddolooc,',;lo. | lK0KXKkxdldddxkOkxdxkxoccc;....'c. | ;0k0XKOxo:okOO000OOkkxdl:;,.. '..,. | ,OxOXKOkl:xkxxkOOO0K0OOkkdol;. .. .. | .kdxXKOkx;oOkdxdoloodd0KKKOo:::. .. | .cdo000OOocokxlxcdl,.:;lxxl'.. . | ,lokx0KKOlclxxdxOOxlkOxkd. .;. . | .::ll0XK00occokO00KKK0Ok0x 'c:, . | .:l:;,,xXX00Ol::cdkxdxkkOkkOx;.c:' . | clolxOOoodOoxOxdd:clcldxO0KOok:, . .. ..... | :xOKKK0kll;.cxodok0Oc;:dkO0000dc .. .... | d0OkOxkxdc;,.:,:x0Oo,:ccoodddc:, ... .. . | dxlodllccc;,'..oOkdxo:;:cllc;'. .. . | clccc::::;;;;,.dookxkx:cdclc,..;, | ;;;;:;;,,,'''..:.:oldo,;dx...dkc' .;' | ,c;,,,',.,........,,,;.lkd, :kdc;:xo. | c,;;'';.'';......... ':o:;lld::lo. | lol',,.;'.'...'..,... .',,,,','';:c.. . | c;cdc,,'',''...........;;;'.;''...... . | ;do:od;'''........;;'.'';'',';,,'.... ... | :,cdc:oc'...;'.....,,..''''''',,,... ..' | 'c,'ld::c;...''..;.......''',,''... ... `---- Journal of the Damned ===================== * Wed Jul 26 09:49 EDT; goldblum I'm here. A bit lost in the mists of time at this very moment, but generally, here. I need to start writing down stuff again. It always rots and feels awkward and embarrassing later when I come across it and read it again, much like old code. I hate it in the way I hate other people's work, only more because I can't escape the implication. Lots of folks out there trying to escape the implication. But writing stuff down makes me less likely to try to hang onto ideas long past the time they've become stubs with any content lost to the wind. Writing makes thoughts immediately forgettable, with happy impunity. I've been working for the last few months, but it is doing to me what it did before, if a little slower. I can't see the horizon any more. More generally, after some note taking finally (see?) I have concluded that I'm working on the wrong problems. I don't want to make it easier to implement remote "trust", I want to make it harder. "Trust" is NOT transitive, never was. Trust is a human concept, and one which is established through relationships. Using math as a proxy for that makes no sense at all. Remote attestables, fair exchange protocols - these things do not solve the problem they proport to solve. So now I'm starting to feel excitable again, as the end of my contract approaches. I'm pretty checked out already. I think me and Dann, my friend who is one of the founders I'm working for right now, are in good shape to stay roughly the same amount of friends. I might even be able to continue working with him in some limited way, but not for the company per se. So August, bring it. Gonna talk to Henry (gammaspace) about some of the co-op stuff he's working on, and the Weird Ghost org he's working with. I want to do games, but my route to that might be through supporting indie game co-op studios with tooling. So here I am. Been on the slide for a while, and its time to focus back on the smolnet. I might write a bit about what I had hoped to realize thru this current work, even if it might seem silly given the obviously financial market it's aimed at. Nuff said, more later, when I've figured out what is NDA and what is not. * Wed Mar 15 09:15 EDT; goldblum Screwtape mentioned my snippet from the weekend from my phlog publishing setup, and it made me cringe because it's all a work in progress and I already cleaned it up a bit. So, here's an update. First, you can find the whole emacs config on sourcehut at <https://git.sr.ht/~mhcat/neumacs>, which will be the current version (modulo the last 24 hours of fuckery). Next, a little context. Currently I do a sshfs mount to the system I'm running [hole,omar].mhcat.[space,dev], like so: ,---- | mount -t sshfs omar.local:/srv/gopher $HOME/gopher `---- which depends on fuse ssh filesystem support locally. Being over ssh, no particular server support is required for it to work, so I *could* just as easily use a mount for SDF too, rather than a tramp location. Or vice versa. Third, I have an org capture template for my phlog, which puts entries right into my master `log.org' file. It drops me into that file after, and I just run the manual `org-publish' command after giving it a once over. Finally, once the first entry is shipped to my SDF gopher directory, it's included in my SDF `gophermap' using the (what I think is a gophernicus extension) `=` directive, under the "Latest entry:" line. The snippets below are the current state, but I am now planning two major changes. First, I want to break out a file per entry. I'll keep the single org file master copy, but I need entries to be addressable. Second, I need to stop including the entire entry in the main SDF `gophermap', because it is too much for an index. Maybe a paragraph, or a couple lines and an ellipsis, and a link to the file for the entry rather than the whole big thing. So, expect another one of these updates to appear in the next few days. ,---- | (setopt org-capture-templates | `(("p" "Phlog" entry | (file+headline ,(concat (getenv "HOME") "/gopher/log.org") "Journal of the Damned") | "* %<%a %b %e %R %Z>; %(system-name)\n%?%i" | :prepend t :jump-to-captured t) | ;; ... more templates ... | )) `---- ,---- | (require 'org-element) | | (defun j0ni/prepare-first-entry (plist filename dst-dir) | (let* ((org-inhibit-startup t) | (visiting (find-buffer-visiting filename)) | (work-buffer (or visiting (find-file-noselect filename))) | (dst-file (expand-file-name "first.org" dst-dir))) | (with-current-buffer work-buffer | (let ((entry (org-element-map (org-element-parse-buffer) 'headline | (lambda (hl) | (when (= (org-element-property :level hl) 2) | hl)) | nil t))) | (with-temp-buffer | (insert (org-element-interpret-data entry)) | (write-region (point-min) (point-max) dst-file)))))) | | (let ((gopher-dir (concat (getenv "HOME") "/gopher/"))) | (setopt org-publish-project-alist | `(("captains-phlog" | :include ("log.org") | :exclude "first.org" | :base-directory ,gopher-dir | :publishing-directory ,gopher-dir | :publishing-function (org-ascii-publish-to-ascii j0ni/prepare-first-entry)) | ("first-entry" | :include ("first.org") | :exclude "log.org" | :base-directory ,gopher-dir | :publishing-directory "/ssh:sdf:~/gopher/" | :publishing-function org-ascii-publish-to-ascii | :ascii-underline nil | :ascii-text-width 60 | :with-toc nil | :with-title nil | :with-author nil | :with-creator nil | :section-numbers nil | :headline-levels 1) | ("phlog" :components ("captains-phlog" "first-entry")) | ;; ... more projects | ))) `---- * Mon Mar 13 09:56 EDT; goldblum I have mixed feelings about the idea of signing posts cryptographically, as part of my general questioning of our over-dependence on crypto as a trust medium. I've written before about how prevalent this is, and the way it's used to beguile lay people. Most people have no idea about specifically what it is they're feeling more confident about when they believe something to be "cryptographically secure." But, I do like the idea of using signatures as a form of punctuation. For example, -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 don't trust anything you see coming from me which appears to be signed. -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQQfqJjzjharo5rcE5YygDxZFVO+2gUCZA8tYQAKCRAygDxZFVO+ 2ge3AQCb46HIox4p3S1C5i7XJJmeECUxWUCPnTl8xlSJget0DQEA9QKvRGC2MB5d dO3wjj1UgqR2VxWx3TWiMqg3oAYgWQI= =X6vL -----END PGP SIGNATURE----- It almost certainly is fraudulent. * Sun Mar 12 15:02 EDT; goldblum I think I figured out a good workflow for publishing straight from org capture. Here's the bit of config in my emacs init: ,---- | (require 'org-element) | | (let ((gopher-dir (concat (getenv "HOME") "/gopher/")) | (entry-file "first.org") | (log-file "log.org") | (sdf-dir "/ssh:sdf:~/gopher/")) | | (defun j0ni/prepare-first-entry (plist filename dst-dir) | (let* ((org-inhibit-startup t) | (visiting (find-buffer-visiting filename)) | (work-buffer (or visiting (find-file-noselect filename))) | (dst-file (expand-file-name entry-file dst-dir))) | (with-current-buffer work-buffer | (let ((entry (org-element-map (org-element-parse-buffer) 'headline | (lambda (hl) | (when (= (org-element-property :level hl) 2) | hl)) | nil t))) | (with-temp-buffer | (insert "#+OPTIONS: toc:nil H:1 num:nil title:nil author:nil creator:nil") | (newline) | (insert "#+ATTR_ASCII: width:60") | (newline) | (insert (org-element-interpret-data entry)) | (write-region (point-min) (point-max) dst-file)))))) | | (setopt org-publish-project-alist | ;; This makes a markdown version of this file. | `(("notwithstanding" | :base-directory ,user-emacs-directory | :publishing-directory ,user-emacs-directory | :publishing-function org-md-publish-to-md) | ("captains-phlog" | :include ("log.org") | :exclude "first.org" | :base-directory ,gopher-dir | :publishing-directory ,gopher-dir | :publishing-function (org-ascii-publish-to-ascii j0ni/prepare-first-entry)) | ("first-entry" | :include ("first.org") | :exclude "log.org" | :base-directory ,gopher-dir | :publishing-directory ,sdf-dir | :publishing-function org-ascii-publish-to-ascii) | ("phlog" :components ("captains-phlog" "first-entry"))))) `---- Note that the "notwithstanding" part is unrelated, but ¯\_(ツ)_/¯. Let's see how it goes, and if this is just too much text. * Sat Mar 4 14:20 EST; goldblum Day 3 of this headache. I can hear Edward snoring in the corner, and Publius reading an out of order story on anonradio because he didn't have time to edit a whole show so we've fallen into a replay of an old episode. I need a sense of direction. Maybe some halva. Maybe I should go buy a nice 1g joint and call it a day. * Fri Mar 3 20:51 EST; tynan And now, the thunder is rumbling and crashing like a high energy weapons battle on the edge of the upper atmosphere. * Fri Mar 3 20:13 EST; tynan The wind is howling like a dog stuck out in the howling wind without a door key. Edward keeps looking at the window nervously like he knows something I don't. That's probably true, though it probably is something I would find uninteresting, or incomprehensible. Sometimes I think about what it might be like to see through his eyes, and whether I'd just get nauseous right away because the distortions and weird colour perceptions of a cat's eye would be disorienting and unsettling. I've got to find a way to focus. I honestly don't know how to start doing anything any more. My shoulder is sore and my muscles hurt from the weight of my arm. I'm going to be one of those old folks who doesn't have the upper body strength to get out of a chair. If I get to be an old folks. How do all you people cope with working with miserable and angry humans? Honesly I don't know how you do it. I definitely can't handle it, there's something sapping about the whole deal. I noticed today that there are a bunch of messages pinned in the main engineering channel in the company slack where I work. Every single last one of them is sarcastic or angry or just annoyed. Even the messages which aren't irritated at something or other and trying to address it ("This comes up in code review all the time...") are irritable ("I'm sick of always looking thing up..."). There's something corrosive about that kind of serrated style of communication. It just makes me want to go and do something else. I mean, what, at this stage in the decay and decline of this so-called civilization, is the point of sitting through that? Happy Friday y'all. Capitalism hates you, but Friday tastes of freedom. * Tue Feb 21 09:43 EST; goldblum Good morning world. I think today I will experiment with writing up my updates for work and sending those in advance so it isn't hugely annoying when I don't show up to the meeting. I'm starting to get a feeling for the changes I need to make in the codebase, and I'm working on keeping perspective on the quirks of the newer parts. It isn't easy, because I always start off frustrated when I don't understand the choices that have been made. Oh well. In other news, I ordered a pair of Dave Clark/Drop Aeon open back cans! I am something of an audiophile although the quality of my perceptions do not justify the quality of my taste. I do listen to an awful lot of music though, and I love to immerse. I'm excited to listen to them. Here's hoping for a more productive week. The last few days have been without much to redeem them in terms of productivity. They've been good for ideas and planning though, so not a complete waste. * Sun Feb 19 20:39 EST; tynan It annoys me a LOT that mastodon doesn't even bother to try to serve anything to web UAs that don't support Javascript. It's such a gross piece of software - well, assemblage of cargo cult subsystems. I wish the fedi had better components, the choice is grim. I would love to build something better, but I need to get paid :( Maybe I can find someone to pay the collective to build such a thing. I might try writing up one-pager mvp plan which I can point people at. I bet you could configure procmail to manage an ActivityPub backend. * Sat Feb 18 16:22 EST; tynan I just spend an unfortunate amount of time down a Multicast DNS rabbit hole. Probably a better description is "in a systemd complexification trap". Systemd is a garbage fire, but difficult to avoid using Linux. I've got OpenBSD on a different laptop now, but it's just too much yak shaving for work. I need dev tools to work in exactly the same way as they do for others I work with, and in CI, and in prod, etc. Oh well. At least Edward (my cat) seems to have forgiven me for yelling at him earlier, which (as my mother would say if she were still with us) is a sure sign of weakness of character. * Fri Feb 17 18:47 EST; goldblum One of the reasons that the web has become something to avoid is the habitual use of cookies and the intrusive and pointless use of "whatever" dialogs to create the pretence of collecting your permission. In most cases, the use of cookies is completely unnecessary, just a surveillence tool used for marketing and advertising, and other weird monetization tricks. Occasionally it is central to the application (session and identity tracking), but that is *much* more rare than you might think. Screwtape is right, there is no good reason for the richness of web. This article hits the spot, though it's a bit more aggressive in tone than I normally enjoy: <https://infrequently.org/2023/02/the-market-for-lemons/> Speaking of, screwtape wrote an excellent bit of polemic about programming and AI, which he's been talking about on his show quite a bit lately. Mostly this is a response to the rise of ChatGPT in the zeitgeist, which has been dominating the discourse lately. Some of his thoughts have been a bit disorganized, but this nails it. gopher://tilde.institute/0/~screwtape/216843900-lisp-beyond-lisp.txt It's concise and cogent. I agree wholeheartedly. He references a talk by Sussman which I dropped in com during his show, which is well worth a watch: <https://www.youtube.com/watch?v=HB5TrK7A4pI> In other news, I spoke to the coops.tech guy, Doug, this morning. It was a good chat, and gave me an expanded sense of what is possible. I had not considered the notion that we could maintain separate businesses and simply pay into a shared resource pool out of which mutual support would come (sick pay, unemployment support, etc.). I would rather have the co-op be the entity through which all our business must transact, and no matter what the contract, all participants be paid the same. There would need to be safeguards formalized to prevent disconnects turning into disasters, and that will require careful thought; that was an insight I probably would not have internalized until much too late to be useful - fortunately (for me) Doug had already been around that block. Now I need to read about the models for incorporation available to us here in Canada, look into the immigration aspects for Anatoly, and see it Le would like to talk about this. I'm still excited. * Fri Feb 17 07:42 EST; goldblum I'm meeting with the co-op people at 8, quite excited. I have no idea where the conversation will go, or indeed what it is I need to know or ask about. All I have is the question: how do I make this happen such that I can bring in friends and with as little friction as possible, get them payrolled and working. I want to note another thing though, a pathology which shows up every time I have a scheduled commitment. No matter how enthusiastic I am about it when I set it up, I spend the time immediately prior to it, sometimes even extending to the previous night, increasingly dreading it. This often makes it impossible for me to do anything useful during that lead-up period. It's never awful when it finally comes arould, though sometimes I feel like I wasted my time and the initial impulse was a false one. But it's always debilitating. Even going to see a band, or going on vacation, there's always a growing sense of resistance and loathing. I bet this has an entry in the DSM. Time to download the DSM and go full hypochondriac. * Thu Feb 16 20:06 UTC; omar A long time ago I worked with a guy who was on a contract (I was an employee at the time), who refused to attend meetings. My boss at the time just couldn't handle paying him so much and then not getting to fuck with him in person. I'm starting to think that not showing up to meetings is a winning strategy. I got off a call earlier that was just way too stressful, and tense, and awkward. I think it might also set a good precedent, to respond to absurdly stressful exchanges by just...not. Anyway, tomorrow morning I'm talking to some people about how to go about starting a co-op. I see it as a kind of ideological shell around me and my friends to protect us from the bullshit requirement that most jobs seem to impose. It's so unrelated to the actual work. Time to stop, I ramble. * Wed Feb 15 19:33 UTC; omar I really look forward to DJ Marcus on anonradio every weekday. He does a news show, "News to Me", it's always grim and apalling but also an awesome apocalyptic time in com. And he feels it so hard, it's impossible not to relate. Check it out, it's 30 minutes before Tob's DGC, which should be a staple for most people who know what I'm talking about. * Wed Feb 15 00:37 UTC; omar I am frustrated. See if you can spot the problem with this: ,---- | (defn reload-lat! | "Refreshes the lat from disk, returning the updated lat." | ^Lat [{:keys [cached-lat] :as this}] | (swap! cached-lat reload-lat this)) | | (defn disk-interface | "Creates a stateless interface for loading a line from disk. | Automatically triggers an asynchronous reload when instantiated." | [index-file-path | inventory] | (let [this {:index-file-path index-file-path | :cached-lat (atom nil) | :inventory inventory}] | (future (reload-lat! this)) | this)) `---- This codebase has statefulness all over it, every other function has a bang at the end. There's a MutableStore implementation which has the docstring "A stateful wrapper around an ImmutableStore". Its only method is `put' ffs. I think there's a fundamental misunderstanding of words in play. Also, this is a disk based storage model. I think that's a terrible idea for software which needs to serve multiple requests possibly concurrently. Anyway, I'm done for now. I need to stop thinking about this. * Tue Feb 14 01:49 UTC; omar I have this idea for a web server that only serves GET requests and gopher text, using minimal hardcoded HTML <pre> tags and no CSS to do formatting. All monospace ASCII without any need to modify source files. Gophermaps of course need some special case handling, but not much. * Tue Feb 14 01:15 UTC; working again A while ago I posted on Mastodon about how I wanted to take a new approach to work, if I were to start working again. Well, I started working again, and the opportunity is there for a new way. The notion is to start a co-op and take contracts which pay enough to pay the folks involved a living wage. We're tech workers, so theoretically we should be able to support two humans for each paid contracter. That would allow us to work on things we want to work on approximately half the time. Or, work better and more impressively, so we can out-perform people who take all that filthy funge for themselves. My new boss, who is also my friend, is enthusiastic about the idea, and willing to re-negotiate the contract in a few months. So I'm hopeful. Next things to do: start working on a Rust implementation of the T.R.I.E rigging spec (see <https://trie.site>) with Anatoly, and figure out what the overheads associated with starting a co-op will be.