#+TITLE: Captain's Log
#+AUTHOR: Mental H Cat
#+EMAIL:
[email protected]
#+OPTIONS: toc:nil
#+OPTIONS: num:nil
#+OPTIONS: H:1
#+ATTR_ASCII: width:60
#+begin_src ascii
.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;...''..;.......''',,''... ...
#+end_src
* 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:
#+begin_src bash
mount -t sshfs omar.local:/srv/gopher $HOME/gopher
#+end_src
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.
#+begin_src emacs-lisp :title "capture template"
(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 ...
))
#+end_src
#+begin_src emacs-lisp :title "publish config"
(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
)))
#+end_src
#+begin_export ascii :title "gophermap snippet"
..
1A Hole In MHCat's Dot Space / hole.mhcat.space 70
0Captain's Phlog /log.txt hole.mhcat.space 70
Latest entry:
=first.txt
Local bits:
..
#+end_export
** 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_export ascii
-----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-----
#+end_export
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:
#+begin_src emacs-lisp
(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")))))
#+end_src
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:
#+begin_src clojure
(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))
#+end_src
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.