HN user

n0ot

28 karma
Posts0
Comments18
View on HN
No posts found.

I honestly don't know how anyone thinks terminal support in VoiceOver is acceptable--it's virtually unusable. It's so bad that I used to fire up a Windows VM just for a functioning terminal, and while I was at it, I'd browse the web and use Notepad++ there, because Windows accessibility is just better (I used NVDA). But then I discovered Fenrir, figured out that it worked with Vim (NVDA doesn't), shut down the VM, and never looked back. Today, I use Wezterm, which VoiceOver doesn't read at all. In my case, that's good, because the only thing I want talking in the terminal is my terminal screen reader (I started writing my own, and it's my daily driver).

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.

Using VoiceOver compounds the not responding issue. I don't know how its internals work, but I imagine it tries to keep a view of the window's state--tree of elements, ETC. If the window has a lot going on, VoiceOver can get really sluggish, and I think it must somehow block the underlying app's ability to send/receive events, because you will press VO+right arrow to move to the next element, VO says "Safari/Chrome/Brave" not responding, and if you open up Force Quit, it reflects the same there. Reading a large diff on GitHub flat out doesn't work for me at all. Also, sometimes when navigating certain webpages, VoiceOver will just outright crash. Luckily, it does restart itself (not that pressing CMD+F5 is hard), but then my focus is moved to a completely different part of the page.

This seems really cool. I use Secretive and would like to switch to this native solution. The one thing holding me back is that I like that Secretive allows you to create keys that don't require TouchID, yet still notifies you when they are used.

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.

I know accessibility for low vision users was mentioned, but I wonder, with all these changes, whether version 4 will be accessible to screen reader users, and if so, whether any major features will nevertheless remain inaccessible.

I use a custom domain with iCloud+. That works for me because I'm very much in the Apple ecosystem, but I can easily move somewhere else whenever it's no longer the best option for me, and I did just that when I moved from Proton to iCloud. I've set this up for my wife as well. It can be as simple or as hard as you want it to be, but above all, I'd strongly encourage you to use a domain you own. Email has become our de facto identity, and we should be in control of it.

I was working on a CAA implementation and wanted to use one of my domains (at Namecheap) to test. This was around 5 years ago. I had the same frustrating experience with support. I understand front line support personelle might not know what the heck an RFC is, but you'd think this would be a case when escalating to the next level would be warranted. I felt like they weren't even reading half of my message. I switched to different nameservers, and that worked fine in my case. I did eventually move over to Porkbun, but not for that reason.

I'm also in the southwest suburbs, and have Comcast. My internet went out for about ten minutes at around 9:20 CST. I disabled WIFI on my iPhone only to discover I was still offline, and had no signal. Not sure whether the Comcast outage was related, but it came back up very quickly, whereas I still have no cell service (AT&T). My wife does have service, even though we both have iPhone 15 Pros.

If you never initialize a heap allocator, you can be confident your program will not heap allocate.

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?

I don't think you're stripping the userinfo quite right. You're stripping everything after the at-sign, when you want to strip what's before:

  scheme://user:password@some.host:port/path?query_key=query_value&another_key=another_value#fragment

I use ProtonMail because I want to use an email address at my own domain. It's actually an inconvenience though, because their IOS app does not let me compose a message with VoiceOver, and when I reached out to them, they basically told me that they're not implementing features until they do their UI redesign. Most of the time, I compose messages in a desktop browser, but the few times I've needed to do so from my phone has required me to open Safari and do it from there, which was a pain.

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?

I've always wondered about the whole cold lowering your immune system thing. On one hand, I've read that studies have shown this to be the case, but on the other hand, doesn't subjecting your body to moderate levels of hormetic stress actually make you more resilient? It seems like there should be a noticeable increase in sickness among people who take cold showers if this were true, the opposite of what they tend to report.

Is this explicitly allowed? I've always thought it would be cool if amateurs were allowed to encrypt their communications, so long as they provided the decryption keys regularly over the same channel.

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.

I just wrote a plugin to make Edbrowse work with gemini. It supports TOFU, prompts, client certificates, handles redirects, and passes most of the gemini torture tests, that don't involve crazy unicode wrapping. Edbrowse's plugin support is extremely basic, so telling it about other media types, and auto redirecting away from gemini isn't possible without modifications to Edbrowse, as far as I know. I plan to add a few more features, like the ability to view the server certificate, and move up a directory, but I've only put about six or so hours into this thing so far, having never even used a gemini client beforehand.

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...

I use Edbrowse all the time, including to read Hacker News. You can add custom functions into ~/.ebrc, and I have one to search for the next post on an HN page, or the "More" link, if there are no more posts on the current page.

    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.