_______________

                            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.