28 karma · joined February 11, 2021
To be fair, reading the terminal is a completely different beast from reading a GUI. In addition to building a static view of the screen for review, you have to handle dynamic updates (auto read). Cursor movement tracking, figuring out when to read what, when not to read (an f just appeared on my screen, but I just typed the letter f; if key echo is turned off, I don't want to hear "f"). If a line was just added, it should be read, but if my cursor was moved to a different line, I want to hear the line it moved to, but not if that line was just read because it just appeared. All sorts of rules you sort of discover as you go. But the one thing you definitely don't want is for any new change to interrupt what was already being read, and that's exactly what VoiceOver does.
I use an external keyboard, so reaching for the fingerprint reader isn't as easy as it would be if I just used the internal keyboard. Fine, ControlMaster is a good compromise. Except when git signing (every commit) is a requirement, you have to touch the reader every, single, time. That's fine when making routine commits, not so when rebasing. Ideally, I could tell the SecureEnclave to notify me, but don't require biometrics for the next 30 seconds or so, but since that's not a thing, that I'm aware of, I'd at least like to know when my git signing key is being used.
This is true for the standard library, where I can trust that no hidden allocations will be made. If I pull in a third party package, nothing guarantees that that lib won't init a new `std.heap.GeneralPurposeAllocator(...)`, right?
scheme://user:password@some.host:port/path?query_key=query_value&another_key=another_value#fragmenthttps://www.amazon.com/Economics-One-Lesson-Shortest-Underst...
I'm not looking for military grade encryption in a subterrainian mountain; I just want email at my domain from a service that doesn't read all of my emails and profile me based on their contents. I've looked into hosting my own email from a VPS, but it's not a trivial project, and I'm most worried about being blacklisted before I even start, since it seems most VPS providers are.
Any recommendations?
You could incorporate cryptographic signatures, diffie-helmann key exchanges, all kinds of fun stuff, and so long as you periodically transmit the decryption key, you're not hiding anything. I'm not sure what the legality of this is.
Here's the plugin portion that goes into your Edbrowse configuration (~/.ebrc; you'll need to update the paths for your local system). If you want to use a client certificate, add -c your-cafile.crt -C your-cakey.crt to the program = ... line, before %i.
plugin {
type = */*
desc = Gemini
protocol = gemini
program = /Users/ncarpenter/.config/edbrowse/plugins/ebgmni.py %i
outtype = h
}
And here's the helper Python script. It's a simple gemini client that converts text/gemini responses to HTML, for display in Edbrowse. You'll need to pip install ignition-gemini. The above plugin's program = line should point to it.https://gist.github.com/n0ot/b257e44a414732ef97ca08c00b5a7a9...
function:hnn {
/^\({} \|{More}\)
}
Edbrowse supports JavaScript, but it doesn't work very well, so I turn it off at startup, and only turn it on if I think it might make a page work better (it usually doesn't). Here's a bit of my config: # I use certifi to provide the trusted root certificate authorities
certfile=/usr/local/lib/python3.8/site-packages/certifi/cacert.pem
jar=/Users/ncarpenter/.config/edbrowse/cookiejar
downdir = /Users/ncarpenter/Downloads
# Disable cache, so each Edbrowse session doesn't cache where I've been to disk.
# It doesn't have persistent history anyways.
cachesize=0
# User agents (type ua0 for edbrowse, ua1 for Lynx, etc)
agent = Lynx/2.8.4rel.1 libwww-FM/2.14
agent = Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)
agent = Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3112.113 Safari/537.36
# Automatically convert Markdown, Epub, PDF to HTML
plugin {
type = markdown
desc = markdown file
suffix = md
program = pandoc --toc -f markdown %i
outtype = H
down_url
}
plugin {
type = epub
desc = epub file
suffix = epub
content = application/epub+zip
# %o is the temp output file generated by the program
program = pandoc -f epub %i
outtype = H
down_url
}
plugin {
type = pdf
desc = pdf file
suffix = pdf
content = application/pdf
# file must be local
down_url
program = pdftohtml -i -noframes %i %o >/dev/null
outtype = H
}
# Play links to audio with mpv
plugin {
type = audio
desc = streaming audio
protocol = rtsp,pnm,sdp,pls
suffix = rm,ra,ram,ogg,mp3,mp4,m3u,m3u8,opus,flac
content = audio/x-scpls,audio/mpeg,application/pls+xml
program = mpv --really-quiet --no-audio-display --no-ytdl --af=scaletempo=stride=20:overlap=1 %i
}
# Use mps-youtube to handle Youtube URLs
plugin {
type = audio/youtube
desc = streaming audio from Youtube
suffix=mpeg # Doesn't matter, but needed for edbrowse not to complain
urlmatch = .youtube.com/watch?
program = mpsyt url %i
}
# These commands run when Edbrowse starts
# See the user's guide for what these commands mean, but I'm basically setting up startup preferences
function:init {
db0
js-
sg+
ci+
dx
endm+
rl+
z37
db1
}
function:b {
b ~/.config/edbrowse/bookmarks
}
function+atb {
db0
A
,j
w+ ~/.config/edbrowse/bookmarks
^
db1
}
# Typing <hs some.domain.tld is easier than typing
# b https://some.domain.tld
function:hs {
b https://~0
}
# Because I read RFCs enough to make use of this
function+rfc {
b https://tools.ietf.org/html/rfc~1
}
# Open the current page in the default browser,
# when it just isn't working right in Edbrowse.
function+o {
db0
ub
!open "'_"
b
db1
}
# Copy the current URL to the clipboard
function:cpp {
!printf '%s' "'_" | sed ' s`^\([a-zA-Z0-9]\{1,\}://.*\)\(\.browse\)$`\1`' | tr -d '\n' | pbcopy
}
I left a few functions out, like ones to search Google and DuckDuckGo, because I store the search forms locally, but can include those in a separate comment, if anyone's interested.