š¾ Archived View for gemini.circumlunar.space āŗ users āŗ adiabatic āŗ scrawlspace āŗ 2021 captured on 2023-01-29 at 04:11:08. Gemini links have been rewritten to link to archived content
ā¬ ļø Previous capture (2022-06-03)
ā”ļø Next capture (2023-07-10)
-=-=-=-=-=-=-
This is scrawlspace. I scrawled elsewhere and then moved it into this space. Do not expect coherence or permanence here, either.
If you havenāt grumbled about the limitations of gemtext, you probably havenāt used it very much at all.
One of the gripes going around is that, in gemtext, you canāt have logical lines that are separate from paragraphs. In HTML, for example, you can have something like this:
<p> I like traffic lights. But only when they are green. </p>
This would render as, window width permitting:
I like traffic lights. But only when they are green.
Meanwhile, if you wanted to change āthey areā to ātheyāreā, youād get a diff that would change only one line in many, making it easier to see what changed.
Iāve noticed that if you have a long prose line and only change a little bit of it, GitHubās own views of diffs will highlight the little tiny bit that changed inside of the changed-line highlight. However, not everyone wants to use a website, much less GitHubās, to view diffs.
Enter diff-so-fancy:
diff-so-fancy will highlight the changed bits inside lines, saving you from having to squint and count to find out exactly what changed in that long paragraph you wrote.
Hopefully this knowledge will save someone the hassle of inserting a build step in a capsule-publishing workflow somewhere. AFAICT, using a fancier diff program beats writing and using line paster programs to turn manually-broken lines into proper gemtext prose.
Thereās also delta, which also works with git and without:
Back in the late 90s and early 2000s, freshmeat.net was _the_ place to go to see whatās new in open-source software. As time went on, though, traffic dwindled and the site stopped being updated in 2014.
A while back I noticed that Homebrew was filling that need for me. Iāve discovered a bunch of interesting, if not useful, utilities just by looking at the output of `brew update`. I went through the output of `brew list` and noticed these packages that I never would have discovered if I hadnāt been looking at the āNew Formulaeā and āUpdated Formulaeā sections:
asciinema, a terminal-session recorder
diff-so-fancy, quite literally a fancier diff
fx, a command-line JSON processing tool
lsd, a better ls(1) that depends on fonts I donāt have
tag, a thing to fiddle with macOS tags
(c)webp, the lossless image format (compressor) with a submediocre lossy mode
youtube-dl, the downloader succeeded by yt-dlp
yq, a command-line YAML-file processor
While I only use about half of these even somewhat regularly, Iām happy I have them around in case I do.
Background reading:
Wikipedia on Freecode nƩ Freshmeat
Homebrew, the macOS package manager
Youāve heard of konpeito.media, right? Itās a site that has chill music.
After a few evenings of keeping the .mp3 files out of my iTunes (now Music) collection by playing it in QuickTime Player, I decided to properly load up the files in Music. This ended up being:
ā¦and then I started playing one of the tracks, and the mostly-white album art was positively blinding.
So now I have this in the bottom-right corner of my screen:
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā® āo o o ā« Side A ā ā 14:38 āāāāāāāāāāāāāāāāāāāāāāāā 29:30 ā ā āā āā āøāø ā ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā ā°āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāÆ
Sometimes you want to do things that Gemini canāt.
I stumbled over md2blog and I think it might be my go-to option for when I want a superlatively simple web log and canāt be bothered to set up Hugo.
Oddly enough, not only does md2blog support dark mode, but itās dark-mode-only.
As an aside, I wonder if Deno means that weāll start seeing single-file nicely-contained programs written in JavaScript or TypeScript. thatād be nice ā itās kind of a shame that Go and Rust have been the only new languages to do this kind of thing.
md2blog, a zero-config static site generator for dev blogs written in Deno
Hugo, a featureful static-site generator written in Go
Emoji are Lojban attitudinals for normal people.
one of many pages that explain what attitudinals in Lojban are
As I write this, itās November 30th. The last day in November.
CAPCOM hasnāt shown my posts all month.
Now my posts that I made all during this past month are showing up.
If you want to see fresh posts, you might want to skim through all the posts listed on CAPCOM. Not just the ones made since December 1.
That āCAPCOMā thing Iāve been talking about:
Currently, my Atom feed is 20 KB. This page is 86 KB.
Maybe one day Iāll put in logic to cut the Atom feed to the last so many entries.
I donāt assume feed polling is something that people wait on. The worst imaginable internet speed I can think of is 2 KB/s which is what I got back in the late 90s. 10 seconds in the background seems fine to me, and 40 seconds to load a full page (when the stuff you want is probably at the top anyway) seems fine to me also.
Then again, when I think of bad modern Internet, I think of connections with loads of packet loss. Sure, 2 KB/s was super duper slow, but generally it was rock-solid stable.
On August 25 of this year, I wrote a post titled āBeing weirder with lessā. In it, I discussed the things I do differently on this capsule and its gemlog compared to what Iād do on a website with a blog. After getting into the swing of gemtext and seeing the way other people handle their capsules, Iāve been pondering how different my gemtext style is from my Markdown style, much less my raw-HTML style.
The thing that sets my raw-HTML style apart from the other two is this: I donāt use super-nested section-and-headings constructs in either Markdown or gemtext.
But even compared to Markdown, my gemtext style is fairly different:
At any rate, I added a new old thing to my capsule:
Itās something I think about when I do a thing differently given a different set of materials and tools.
Iāve got a new laptop. Well, it still feels new to me, at any rate. Seems like thereās new things to learn about it and its ecosystem.
USB-C charging is still new to me. Generally, laptops have a brick, and you plug your laptop into that brick, and the laptop charges at that brickās speed.
Now, you can basically pick your brick. There are lots of bricks. Some are weird shapes. Some are largely up to the task of charging a laptop, while others can only charge the laptop while itās asleep and can only slow the drain otherwise.
I tried plugging my laptop into a bunch of things and this what kinds of wattage I can get:
If you want to get wattages like mine, do this:
The app is still called System Information, but set that asideā¦
Also, if you want to check a bunch of different chargersā speeds, press āR to refresh the page.
ā
System Information says āCharging: noā for the 15W and under charging speeds. My hunch is that if Iām letting the computer sit idle with the monitor on, 15W might be enough to charge the battery super slowly, but not if Iām watching 1080p@60 video streams. In that case, I might want to use the 18W charger if I actually want to charge while watching fast streams.
At any rate (sorry), the 2W trickle charge is enough to charge the battery by 1% per hour when the machine is asleep. Since Iām trying to keep the battery under 60% unless Iām going somewhere, Iāll probably use just that unless Iām trying to recover the battery from a monster Netflix session.
Stuff mentioned in this post:
on Switch chargers, and why Switches are kind of picky
Background:
Drew DeVault, āReframing the philosophy of Geminiā
Hereās his formulation of what Gemini is:
Gemini is a read-only protocol for hyperlinked content distribution.
I endorse this.
One of the ways in which the near-total dominance of the Web has warped minds is that, these days, people expect a suite of interrelated protocols (or only one protocol+tool combination) to handle all aspects of publishing.
For example, most people raised in the Blogger/WordPress era to be able to edit and publish a website byā¦going to that website, or possibly a slightly-different controlling website. It seems like thereās a dash to recreate this sort of workflow with add-on protocols.
For some reason, FTP uploads (or reasonable spiritual successors like SFTP or rsync-over-ssh) are being ignored, possibly because (choose one or more)
The odd bit is that preexisting SFTP clients are probably way better fit for purpose than anything that anyone could cajole a Gemini client developer into making. Transmit, my SFTP client of choice, dates back to 1998. The overwhelming majority of not-super-technical users would be better served by using a file-managing client thatās fit for purpose instead of using some newfangled baked-in Gemini-client thing that only works on one or two clients.
Or everyone in the Gemini community could get over his reflexive HTML-over-HTTPS avoidance, and make a service or three that bake in a nice editor/previewer. Assuming Sourcehut has some kind of āmodify files in a repository without even cloning them to a computerā functionality like GitHub does, that would be a fine way to leverage the power of modern web apps to generate user-friendly write-once-run-anywhere ways to publish gemtext.
Background reading:
Solar Protocol (linked above) is pretty neat:
This website is hosted across a network of solar powered servers and is sent to you from wherever there is the most sunshine.
āThe work is performed wherever energy is the most availableā sounds like a boring enterprise optimization problem to be handled by senior AWS architects and cryptocurrency mining pool network operators, but this kind of thing makes it sound cool.
Iām not sure how much power the load balancer takes up compared to the servers, but the whole thing is a neat art project. Probably the most interesting thing about it is that the sites will serve a low-power version of the site if their batteries get too low. As Iām writing this, Iām getting served from a server called āCaddie in Controlā, in Coal City, with battery levels at 100%. Previously, I got roughly the same page, but the battery levels were at 70%.
ā
And yet, I canāt help wonder what more they could do to be power-efficient in fantastically boring ways.
Itās being sent with a gzip transfer encoding. I can only wonder if theyāre serving pre-compressed content (see the Apache docs link below). However, neither the HTML nor the CSS is minified. Thereās not just a bunch of extra whitespace, but also commented-out code that could be yanked before sending.
Then there are the dithered black-and-white photos of the servers. I like the aesthetic (I have BitCam on my phone, even though I donāt use it much), but the files themselves actually leave quite a bit to be desired.
Hereās what theyāre like for the one Iāve seen of the serverprofile.gif of Caddie in Control:
Sounds like the winning play is to run oxipng on all the pixelated .gif files and then make WebP versions, and serve them up in a <picture> element with the WebP versions as special sources.
clock.png is another matter entirely since itās way bigger and generated periodically (maybe every 15 minutes or so).
That said, running oxipng -Z -o max on clock.png took up 251 seconds of wall-clock time and almost 23Ā½ minutes of CPU time. cwebp -z 9 was much more efficient at 6ā seconds of CPU time, and so it might actually be worth running as an optimization.
The CSS for the site uses variables, er, custom properties extensively, so they can probably get away with not many people hitting the uncompressed PNG.
I wonder how much extra power itād take to get TLS up and running on these machines with a Letās Encrypt cronjob running once daily and actually getting a new certificate at the 60-day mark, as one does.
References:
Apache documentation for mod_deflate: āServing pre-compressed contentā
Iāve got a shiny new laptop.
Itās got one of those ARM-based chips.
A handful of programs that are important to me are still Intel-only. Everything Iāve built from Homebrew is ARM-based, but there are a few things that throw up the ādo you want to install Rosetta?ā prompt.
In no particular order:
Some of these are simple enough to go without. Steam, I can simply refuse to run. Iām not sure when Iāll notice the downloadable version is a universal app, but eh. Even if I am able to run Steam natively, itās not as if I expect any games to have been compiled for Apple Silicon unless theyāre Apple Arcade games.
Dropbox, Iāve replaced with Maestral. It works fine since I, like just about everyone else on the planet, just want a folder that syncs.
VoodooPad is still under development, but the new owners are taking their sweet time (years) coming out with a new version. Iām worried that Obsidian will be a better choice, or worse, already is. Obsidian has the benefit of being an Electron app, so they can sell to more people than just Mac nerds who want a Mac-assed Mac app.
Discord runs in a browser tolerably enough if youāre not voice chatting with people and dependent on a system-wide push-to-talk key.
Work stuffā¦can wait. While Iād like to be able to use this laptop as a work machine for everything I do, I kind of like how itās a calm personal machine, suitable for using right before bed. At any rate, I have a fair bit of work tasks that do come up that can be done entirely in the browser, so itās not like Iām incapable of working when Iām on my laptop. I just canāt work on arbitrary tasks when all I have is the new laptop.
[A composite image with a left half and a right half. On the left half is the Big Sur wallpaper: a magnificent off-the-coast aerial shot of the rugged California coast with a bridge visible in the middle. Superimposed over it is āSOULā in white text with a black outline typeset in Impact. On the right half is the Monterey default wallpaper, an abstract canyon-ish wallpaper in reds, purples, and blues. Its caption is āSOULLESSā.]
While the new standard shortcut for the emoji picker is šļøE, āāā£ still works fine. On the other hand, Full Screen seems to be šļøF, and the keyboard shortcut for that wasnāt always consistent between apps. Most of them had something bound to āF, or ā„āF, or ā§āF, and so the Johnny-come-lately Full Screen command had to take the best available keyboard combo.
Iād like it if the key with the microphone on it told whatever videoconferencing app to mute input, similarly to how the rewind, play/pause, and fast-forward keys talk to whatever app is currently playing music or a video. This would also nicely sidestep privacy issues that arise when, say, Discord asks for permission to see every single keystroke you type so it can monitor for its hotkey sequences.
ā
Letās talk about the menu bar and everything in it.
First, the notch. Itās there, but itās not the most interesting thing around, so you pay attention to other things instead. Whatās weird is how the menu-bar icons have variable inter-icon spacing: sometimes theyāre spaced far apart, other times theyāre scrunched up together. So far, I havenāt had them march all the way to the notch, but I havenāt installed everything I might possibly need, like Postgres.app and a couple other things Iāve forgotten.
The menu bar is also taller now. On one hand, it seems a little bit weird. On the other hand, all that height comes at the expense ofā¦nothing. The rest of the screen is still 16:10, so itās basically like free space at the top.
Whatās interesting is what happens when you full-screen an app or two. Usually, when you full-screen an app, the app takes up the entire screenā¦and the menu bar gets shoved out of the way, and pops down if you move your mouse cursor to the top of the screen, shoving any kind of toolbar or whatever down. Very distracting. When I had Visual Studio Code right next to Safari, though, the apps took up the entire screen in the 16:10 safe space, and everything in the notch zone was just left black. When I threw the mouse pointer up to the top of the screen, the menu bar items appearedā¦and the toolbars and things on the two displayed apps didnāt need to move at all. Honestly, this makes full-screen mode more useful than it was before.
ā
Shortcuts is an unfunny joke. It should have been held back until macOS 13 (whatever comes after Monterey). I tried migrating some of my Automator workflows and theyāre broken in stupid ways. Iām not upgrading my main machine until these get fixed. Might be a long wait. Like, a year. Iām worried that theyāll have to keep current behavior the way it is for backwards-compatibility reasons. Fortunately, Feedback Assistant is built into the OS (and not just beta versions), so Iāll be able to flood Apple with feedback if I feel like shouting into the void.
The AirPlay receiver thing is better than AirFoil Satellite by Rogue Amoeba. Way less latency, and it doesnāt stutter even when Iām streaming from my first-generation iPhone SE. Shame they picked a common web-dev port like 5000 to listen on instead of something utterly forgettable. Itās not like AirFoil Satellite was any better, though ā it listens on port 3000, which is also pretty popular.
Being able to run iOS apps on a real computer with real speakers is pretty neat. I can run Headspace and have it play Focus music right on my normal machine without kludges likeā¦AirFoil Satellite. Unfortunately, the manifestly better speakers makes it glaringly obvious that Hans Zimmerās focus music is delivered as a horribly-compressed MP3 or AAC file, whereas this sort of thing deserves high-bitrate AAC at the very least. One final wrinkle: iOS apps tend to ā without actually doing anything ā get the Using Significant Energy badge of shame. Headspace will play a calming animation while itās playing music (or silence in the case of actual meditation) and so the energy usage isnāt too surprising, but Overcast will also show up in the naughty list when itās just sitting doing nothing.
Something like `sudo shutdown -s +65` might be nice to run before running Headspace and having it do a 60-minute wind-down, but youād have to quit all Terminal windows beforehand. Otherwise, youād hear the GET READY FOR SYSTEM SHUTDOWN warning bells, or boops, or submarine noises, or whatever your \a is configured to generate.
Maybe I should try something like this with Shortcuts. At least if Iām using the Shortcuts app, Iām not going to have to type in my login password right before bed.
Background reading:
Marco Arment, āThe best laptop ever madeā
Iām upgrading directly from a 15ā³ (lovingly described above) to a 16ā³. While the two laptops take up about the same amount of space (for example, the new laptop fits into my padded sleeve just fine), there are interesting differences:
I can see why people talk about the G4 PowerBook. I wasnāt a Mac guy back then, but I remember laptops shaped like this.
It seems heavier than my old laptop. The Apple Silicon hype made me think that a laptop based on it would be generally lighter than an Intel-chip-based one, but the maximum allowed battery that can be taken on a plane hasnāt changed, and so I guess thatās where most of the weight is.
The screen is noticeably bigger. More is more. The menu-bar-and-notch area is a height extension to a 16:10 screen, which is good. Height is harder to come by these days unless youāre rotating a monitor 90Ā°.
I used my old laptop for years before I noticed the side air-intake vents. On this laptop, however, they tend to dig into your hands while you carry it around like a lunch tray. One saving grace is that if the laptopās screen is open, the center of gravity is far enough forward that youāre not supporting it with the parts of your hands that are underneath sharp-edged air-intake vents, so itās not quite so bad as you might think.
Touch ID is fantastic. Saves me a ton of typing when setting things up. Normally when Iām doing a fresh install of things Iām typing my login password over and over and over and over again. This time? Not so much.
On the other hand, having room for only three fingers isā¦disappointing. Right thumb and index fingers are a given, but Iād like to be able to use both my right pinky or a finger on my left hand.
Yup, it has a notch. I donāt have a whole lot of menu-bar junk yet, so itās not something Iām fussing about. More about how the OS copes with it later.
The touchpad is huge. I seem to get about as many accidental touches on it as I did with my old one, so Iām not sure itās too big. Generally, I compensate by throwing the mouse pointer into the top middle of the menu bar so accidental taps (clicks) donāt do anything. I never had trouble doing four-finger gestures on the old touchpad, so Iām not sure what theyāre trying to do by making it bigger. Maybe itās so people can draw Chinese characters they donāt know the pronunciation for?
The keyboard is fantastic. It has very little travel, and doesnāt require much force. While I can certainly appreciate clicky Cherry MX keyswitches, I like this, too.
The Escape key is bigger, but Iāve used vim only once on this new laptop.
The fn key now has a globe on it. More on globe-key shortcuts later.
Spotlight, Dictation, and Do Not Disturb now have dedicated function keys. More later.
I notice the 120Hz animations where they exist (moving between Spaces, ExposĆ©) but theyāre not nearly as big a leap as Retina displays are.
I miss the backlit Apple logo. Itās darn useful when youāre trying to touch buttons in the dark and need a teeny bit of light around you. Itās also nice to partially illuminate your way around a dark house when youāre carrying it around.
ā
The charging situation is kind of bananas. Iām used to laptops having one charger that theyāre tied to for the life of the machine. This machine, on the other hand, ships with:
Of course, you can plug the USB-C-to-MagSafe cable into pretty much anything. Also, because the machineās power needs are so light, you can get by with power delivery designed for phones and still be OK if youāre not in a rush.
Since I try to hypermile my batteries by charging them as slowly as possible and keeping them under 60%, having a host of trickle-charging options is fantastic.
Iām at the gym.
Thereās an elliptical trainer in front of me. Leaning against its screen is a piece of paper that says
9/26 SPEED CONTROL BROKEN
My initial thought was āTHIS ELLIPTICAL HAS NO BRAKESā like a runaway train or a large vehicle in a Speed movie.
A thought that crossed my mind earlier today, and crosses my mind sometimes:
Man, itād sure be nice to get something cool in the mail.
Usually the smart thing to do is wait for the impulse to pass as opposed to buying a [checks list] tungsten sphere and suitable desk stand, but still. The impulse does pass through.
Background:
Amazon.com: 2.175ā³-diameter, 1.5 kg tungsten sphere for $325
In response to:
Bjƶrn WƤrmedal, āWhen Did Personal Computers Stop Improving?ā
As far as I can tell, they didnāt stop improving. a 27ā³ 5K (5120Ć2880, or 2560Ć1440@2x) monitor with an essentially-silent computer smeared on the back of it is _way_ better than, say, a 17ā³ 1024Ć768 tube monitor, especially when ClearType hadnāt been invented yet. I remember when Internet Explorerās size settings for Verdana were:
I think itās great that modern computers can handle all these pixels just for running a text editor. Having clear, crisp type at any size makes computing fantastically more pleasant. And having lots more screen space per monitor means I have to scroll less and alt-tab less, which is nice.
Background reading:
Derek Siversā page explaining what Now pages are
Wes Bosā /uses pages that also explains and demonstrates what /uses pages are
I think /now pages are cool but I can never bring myself to be that open in public. Sure, I could just tell lies on the Internet, but Iād rather have the entire capsule be a cohesive set of lies instead of just the /now page.
I also think /uses pages are useful, but I can see why some people look at them and sneer. Personally, I think buying things and telling others whatās worth buying (or otherwise investing in) is a public service.
/uses pages would look pretty awful in Gemtext, though. When I write here, I keep explanatory links to a minimum because they canāt just sneak in inline like HTML <a> elements. Wes Bosā page is chock-full of inline links and in order to have all these links, Iād need to intersperse link lines with one-sentence paragraphs explaining things. Either that, or have an entire page where most of the body text is in link lines. Ew.
Update, a few days later: nytpu has a /uses page in all but name, and it looks fine.
nytpu.com, āsoftware i use dailyā
Bookmarks now have folders, so you can file things properly. I took the opportunity to clean up my bookmarks files (one per computer) and sync them with each other.
Never thought Iād use cp (over AFP or whatever macOS uses) to transfer changes in one direction and Universal Clipboard (clipboard sync over Bluetooth) to transfer URLs in the other direction, but here we are. Having a well-organized bookmarks folder feels utterly fantastic.
Less importantly, the WebP tracking pixel at the bottom of this capsuleās pages is now recognized as an honest-to-goodness image, so you can view a 1Ć1 transparent tracking pixel in Lagrange without having to use an external application.
Background:
Apple KB explaining Universal Clipboard
People like SNES-era video-game music.
Music from that time not infrequently has a start-up section, then loops forever (not from the beginning).
Assuming that audio emulation on SNES emulators is good enough, why not have a barely-legal website that distributes savestates of games where each tune is played? Youāll be expected to supply the video-game ROM from your own collection, where youāve ripped your very own still-working cartridge.
Background viewing:
https://duckduckgo.com/?q=under+construction+gif&ia=images&iax=images
Remember the Internet in the late 90s? (not that old? nod politely and play along.) Lots of websites had āunder constructionā (animated) GIFs. Nowadays, almost no sites do.
What changed?
Blogs.
Once most websites were blogs, everything new automatically gets placed where it should be. Thereās no more rearranging of directory structure; thereās just the list of posts. Occasionally, a post might have tags added or removed to/from it, but thatās the extent of any same-site reorganization.
Inspiration:
John Scalziās recipe for schadenfreude pie, with filling sized for a 10ā³ pie tin
If you write a recipe that involves a pie tin, please make note of how big the pie tin is. At least here in the States, most pie tins are either 9ā³ or 10ā³. While 9ā³ tins are the most common, 10ā³ tins also exist. If you have a 10ā³ tin, you will tend to find othersā fillings not filling up your crust. If you write recipes assuming others have 10ā³ tins, youāll have them wondering what to do with all the extra pie filling.
On iPadOS 15, if you pair your iPad with an Apple hardware keyboard that has an fn key, then itās used as the globe key by default, even if you donāt change from the default of having fn work as fn.
I should note that you have the option of binding the Caps Lock key to Control in Settings ā General ā Hardware Keyboard ā Modifier Keys. Really, if you want to look stupid on the Internet, there are much better ways to do so than to devote an entire key on your keyboard for this function.
Of course, the fn key had a use before it was pressed into service as a globe key. Mostly, it turns the arrow keys into Page Up, Page Down, Home, and End. šļøā now opens the app switcher, so if you want to do Page Up, youāll need to press āā instead.
This is precisely backwards from macOS. On macOS, āā and āā switch between Spaces/full-screen apps, and fn ā/fn ā are for moving the text insertion point. Expect fun times ahead if youāre a keyboard nerd who uses both OSs.
iOS and iPadOS 15 add built-in background sounds. If you want to play around with it, itās buried in Settings ā Accessibility ā Audio & Visual ā Background Sounds.
If you pick any of them, youāll automatically download your selection. The Noises (balanced, bright, and dark) are all just under 2 MB apiece, but Ocean, Rain, and Stream are all 62ā72 MB apiece. You can delete ones you donāt like if youāre pressed for space.
The UI here is a little wonky, so if you think that Balanced Noise and Dark Noise and Stream all sound the same, just back out to Background Sounds and go back in.
Suppose you want to use this as a noise generator, but really, diving this far into a corner of the Accessibility settings is not something you want to do often. āHey Siri, open Background Sounds settingsā will only take you to Settings ā Sounds.
Probably the most obvious easy way is by adding a button to Control Center. Youāll want to add āHearingā, and then when you tap on that button in Control Center youāll be able to turn on/off noise, pick your noise, and also adjust its volume.
I suppose itās interesting that this is one of the few places where iOS exposes a separate volume control from the system volume. Evidently they canāt always pretend that one volume slider is enough to rule them all. Well, two if you have āChange with Buttonsā turned off for the ringer-and-alerts slider in Settings ā Sounds.
Additionally, in Shortcuts, you can set things up to munge Background Sounds settings. I typed āBackgroundā into Shortcutsā search box and got options for āChange Background Soundā, āSet Background Soundsā (you can use this to turn on, turn off, or toggle on-ness), and āSet Background Sounds Volumeā.
A one-item toggle shortcut might be the sort of thing you might want to bind to the Back Tap option in Settings ā Accessibility ā Touch. In addition to a bunch of system things like āShakeā and āScroll Downā, you can have the system run any of your shortcuts.
You can also have Shortcuts in a widget if you want really fast access to these features, or just like big buttons.
While Shortcuts with complex, multi-step, branching workflows seem to get all the press in nerd circles, I seem to get a lot of use out of one-action Shortcuts. They certainly seemed dumb to me initially, as it wasnāt obvious to me why Iād want to surface a button for an action that would just take a couple more taps to handle normally. Now that Iāve gone from the four-Shortcuts widget to the eight-shortcuts widget on my iPad, though, I can see how really, itās just a matter of accreting uses for this sort of simple automation gizmo.
Most five-star rating prompts donāt tell you what each rating should mean. Goodreads is a pleasant exception to this, as is Apple Books. What about for food?
Maybe I should try a seven-point scale. If I actually throw it out before finishing it all instead of begrudgingly finishing the rest of it, that should count as worse than something I try to use up. It takes a lot for me to think something is so bad I throw it out without finishing it.
Also, I donāt really like my fifth point on this five-point scale. The mochi cake mix mentioned below is definitely interesting and moderately mind-expanding (I had no idea what one could do with mochi-style cake batter), but itās just not good.
I got Trader Joeās chocolate mochi cake mix with peanut-butter frosting.
The texture is interesting and novel, but it doesnāt taste very good or chocolatey and the peanut-butter frosting isnāt anything to write home about, either.
I havenāt thought up a good scale for foods, but my inclination is to rate this ā ā āāā.
This upcoming Tuesday, at 10 AM Pacific, is an Apple Event, entitled āCalifornia Streamināā.
My predictions, with results added in after I saw the thing:
Iād certainly like to be tempted to part with my money, but I donāt foresee it happening. Iām in no rush to upgrade my iMac and while Iād like them to announce 16ā³ laptops, I donāt see them taking thunder away from an iPhone-centric event just to do that.
Update: All they did was iPads, Apple Watch, and iPhones, and Apple Fitness+ doesnāt count.
Background:
āisoraqathedhā: Some article formatting standards for gemtext
The important bit:
The [first line of text that isnāt a heading] is the introduction of the article. It should both be able to stand alone to act as the summary, and also flow naturally with the rest of the text. This is fairly easy to do and it helps with some readability. There is no need to add any additional markers like ātl;drā which is common in other parts of the internet.
[ā¦]
But why?
The main reason is actually because Lagrange renders things like that. In particular, it has an option to make the first paragraph slightly larger. This encourages me to write things like that.
I thought that particular option was ā pretending Iām typing this on my phone for a moment āĀ ducking annoying, and I turned it off fairly soon after finding the option to do so.
I will now proceed to pat myself on the back for not being tempted to shift my capsuleās pages to conform to what one particular browser does by default.
[checks his own capsuleās home page]
[sees that the bolded paragraph would read āThis is a Gemini capsule.ā]
[giggles]
Maybe this would look less silly if I had a proper-ish introductory paragraph on the home page, but I canāt think of a better replacement than what I have there now.
On the other hand, this page has nearly an excellent description-cum-disclaimer that would be possibly fantastic in a slightly larger point size and a different color.
While I like how a lot of Gemini capsules are only weakly flavored, Iāve kind of grumbled at how mine, titled āYet another Gemini capsuleā, is more weakly-flavored than most.
Well, today, while looking at the names of lots of other capsules and grumbling about my capsuleās name, a halfway-decent idea came to me. Iāve updated the capsule root to it, although Iām not sure if I really have anyplace to really work the theme in to the rest of the capsule.
I briefly considered designating an official abbreviation of āĀ½2Mā, but that made me gag.
Every so often, the Gemini mailing list gets someone on who asks āhow do you publish your capsule? Whatās your workflow?ā
I figure that this place is probably the best place to answer. If I ever get a mind to, I might end up giving this explanation a page of its own instead of letting it get buried in the other posts I write.
Normally, my publishing workflow involves the following:
This capsule is somewhat different. While I donāt have ssh/rsync access, I do have sftp access (thanks, Solderpunk!). The big difference here is that big files will be uploaded over and over again every time I update my capsule. Because of this, donāt expect me to upload pictures anytime soon, much less 4K@60 video ā not that I really have any plans to, anyway. That said, I still use Makefiles with targets named like `up`, and I still make commits to the master branch whenever. I might have had alternate branches for experimental layout changes, but theyāre all merged into master or abandoned and deleted now.
At any rate, I wondered what I would do to build this capsule. Here were my thoughts:
In general, my opinion towards features in Gemini pages and capsules is āIf I wanted it to handle all these corner cases and have all these niceties, I would have generated an HTML page and served it over HTTPSā.
So what do I get from this radical simplification?
What costs do I bear from this radical simplification?
I briefly considered running a capsule on Heroku, but $84/year is too much for a lightweight hobby like this and Heroku is an 80/443-only shop. It doesnāt support non-web apps. If Heroku handled all this, then it could keep an eye on the Git repository this thing is in and automatically build and post every time I commit to the master branch.
Background reading:
yj, a YAML/TOML/JSON/HCL converter
TextExpander, a utility that turns a little bit of text into a lot of text
Iāve been fasting again. Usually, this is what I can expect for a three-day (72 hours, give or take) fast:
This was my experience maybe 2ā5 years ago. However, things have been _very_ different for this past weekend and the weekend before that:
I thought painless fasting was only for men who waddle like Angus Barbieri, but apparently I was wrong about that. The only obvious differences between then and now are:
The difference that seems most likely to explain most of why itās way easier now is probably the increases in potassium and magnesium. However, that only seems to explain the lack of headaches and the lack of wooziness when I stand up too quickly. It doesnāt seem to explain why Iām not feeling hungry except weakly and briefly, as opposed to the old normal of strongly and not-infrequently.
Todayās wind-down exercise was taking all my photos and videos off my Switch and copying them into final resting places. This involves:
Generally, Switch files have filenames and paths like
2019/07/03/2019073021343000-57B4628D2267231D57E0FC1078C0596D.jpg
where the first part encodes the date and time and the last half seems to encode the application. This particular screenshot is of the settings screen.
For some reason, Iām generally against renaming these files (many years later, I might want to know when this was taken), so I generally put these files into folders with a descriptive name. Frequently enough, Iāll group multiple screenshots into one folder if theyāre part of an exchange between a couple of characters or a sequence of events.
iPad screenshots, by contrast, are way easier to manage: just AirDrop them to a real computer and then organize them. For parityās sake I might want to rename them based on their file metadata, but oddly enough I donāt care enough to preserve that sort of thing, at least not yet.
You might wonder why Iām not just plugging in my Switch into a real computer and using it as a fancy camera device. There are two reasons why:
I kind of wish the iPad could take 30-second videos, but Iām pretty sure thereās a reason that sort of thing is unsupported when the Switch isnāt plugged into power.
For as long as Iāve tried to get work done on an iPad, Iāve been frustrated that C-e doesnāt go to the end of the logical line ā it only goes to the end of the visual line. Iāve reported bugs about this, but Radar is a black hole.
Today, I decided to try and work around the problem by pressing the Mac-native equivalent, command-right.
It still only went to the end of the visual line.
Itās moderately comforting that the OS is broken even for the moderately normal people and not just the turbo-nerds.
Background reading:
I tried Boop. Itās neat. I made a script for it. Because my short-term memory isnāt great, I decided to start by writing out the typesā¦
/** { "api":1, "name":"Prettier HTML", "description":"Makes your HTML prettier", "icon":"HTML", "tags":"html,prettier,format" }
ā¦only to find out that, evidently, requiring external code isnāt something thatās currently possible with Boop. Drat.
Background reading:
How To Do a Monthly Review ā Sarah K. Peck
I do this monthly. Itās been somewhat helpful for me, although I donāt have quite the same problems that she has. Being a type-A personality seems nice, if only for the novelty factor.
One thing I found useful to add to my question template, though, is this. It goes right at the end of āPeople and Communityā:
Whom should I see less of?
Oftentimes this prompt isnāt responded to, which, quite honestly, is normal. However, itās occasionally worth considering whom one surrounds himself with, and whether doing so is all that good of an idea. More than a few times, Iāve stuck around a group out of sheer inertia and/or lack of options even though the group is a decidedly mixed bag or even a net negative.
While realizing that one should back away slowly from a particular group wonāt tell you what to do with the freed-up time, sometimes itās worth asking whether your association with a group is a net positive, net negative, or just not nearly as positive as it used to be. In this latter case, itās worth considering whether other affiliations might be more worth your time.
on arxiv.org: āHow Developers Choose Namesā
One aspect of variable naming that the researchers didnāt seem to address was how different languages encourage slightly different names. Standard Go style generally prefers short method names like `.At()`, while Objective-C is ā or was ā perfectly fine with having method calls like `[things objectAtIndex:5]` for an operation that would look like `things[5]` or `arr[5]` in most other languages.
Still, neat paper.
So:
Not bad. I wonder how buggy it will all be on release. This isnāt a No New Featuresā¢ release, but one can hope everyone spent 20% more time cooped up in their houses fixing bugs instead of just adding new things.
Hereās what I expect to see next week:
Hereās what I expect to NOT see next week:
There are a few formulae in Homebrew that still lack ARM ports that I use. I wonder if the release of proper large-size MacBooks Pro will noticeably speed up the conversion of the remaining programs.
Some fraction of visitors to this capsule do so through CAPCOM, a Geminispace aggregator (something that reads a bunch of feeds and combines them into one list). I have no idea what fraction this is, but itās got to be some fraction of the total.
One of CAPCOMās recent-ish changes is that it wonāt show updates from literally everything submitted to it and approved: it only picks 100 feeds out of its list per month and displays them. It also says this:
If youāre enjoying content from one feed, you should subscribe to it yourself in some way, because that feed is not guaranteed to be one of the 100 feeds chosen next month!
This is not visually distinct text, and at any rate it gets lost in the noise after youāve visited a couple of times because really, you want to get to the links. Gemini doesnāt have blink tags, after all.
However, given that our capsules arenāt guaranteed to be part of next monthās rotation, we authors do have an incentive to close out the month with a request to, well, thereās no built-in Like function in Geminispace, but there are subscriptions in most clients.
we didnāt start the fire
it was always burning
since the worldās been turning
In response to:
benk on formatting Gemini documents
Yeah, basically that. I used to double-space above headers in Markdown but some autoformatter I was using nagged me if I had any more newlines in between elements for any reason, so I got broken of that habit. It was also kind of difficult to apply consistently (Iād forget a newline or two), so I stopped.
For posts like this, the in-response-to link line seems like it shouldnāt be equidistant from its mini-header above it and the body text below it, but Iām not quite sure I want to bunch it all up right next to the āIn response to:ā line.
I finally got a chance to get back to my Deno-based Gemini server. It uses Deno.Conn.
When I last worked on this, Deno.Conn was a generic type. I used Deno.Conn<Deno.NetAddr> (as opposed to Deno.UnixAddr, I guess).
Now, the remoteAddr of a Deno.Conn is either a NetAddr or a UnixAddr, and the best way to tell them apart seems to be to ensure that its transport is TCP (or UDP, or whatever).
So now, before getting back to any new real work, I made this change:
diff --git a/mod.ts b/mod.ts index 3e7499f..c3febf4 100644 --- a/mod.ts +++ b/mod.ts @@ -65,7 +65,7 @@ enum ResponseCode { } class Bag { - constructor(conn: Deno.Conn<Deno.NetAddr>) { + constructor(conn: Deno.Conn) { this.conn = conn; this.startTime = Date.now(); } @@ -78,11 +78,19 @@ class Bag { ret[k] = v; } } + + if (this.conn.remoteAddr.transport !== "tcp") { + throw new Error( + `Assertion failed: connection transport not TCP: ${this.conn}`, + ); + } + ret.from = this.conn.remoteAddr.hostname; + return ret; } - conn: Deno.Conn<Deno.NetAddr>; + conn: Deno.Conn; startTime: number; // milliseconds since midnight 1/1/1970, UTC request?: string; // e.g. āgemini://localhost/foo/\r\nā host?: string; // e.g. ālocalhostā
This seems like a pretty deep-reaching change to be made at a point when Deno seems almost mature. Iām not complaining, but I am surprised.
Personally, Iāll like not having to type angle brackets, but Iām not sure I (or anyone else) will enjoy having a five-line type assertion just to use constructs like conn.remoteAddr.hostname.
Since Iām back in the CAPCOM rotation this month, I figured the soapbox Iām standing on is a little taller than normal.
I have a question for the floor.
In some corners of Geminispace, there are people who are interested in Gemini because it doesnāt take much computing oomph to either serve or consume. As long as your server can manage to serve up everything over TLS 1.2 or (ideally) 1.3, you should be fine. Unlike on the Web, console Gemini clients are generally no less full-featured than desktop ones.
Because of all this, Iāve seen some people be quite glad to serve up things over Gemini on quite old computers, often with a stated goal of trying to reduce computer waste as a political statement.
Still, I have to wonder. Old computers, generally speaking, use more power to get the same amount of computation done. I can see why someone might prefer running an old Pentium 4 or a BeBox or Sun workstation or whatever instead of buying a new Raspberry Pi to serve up Gemtext, but if this sort of thing describes you, how much extra would you have to spend in energy costs to keep the old computer running before you give up, recycle the old computer, and buy a new computer that runs at least as fast for a fraction of the electricity use?
A while back I sketched out a two-column layout for my main site. The main benefit of having space on the side is that you can stuff āextraā info in it ā publish/update dates, tags, statuses, notes, and even a tl;dr if itās long enough to warrant one.
Most of what I write isnāt long enough or branched enough for that sort of thing, so I decided against moving to a two-column layout.
Since multicolumn layouts arenāt even an option in Gemtext, Iāve been even less interested in surfacing metadata in metadata places. Sure, these Scrawlspace entries have dates in their headers, but thatās about it for metadata.
I kind of miss having metadata blocks in my source files. At this point, Iāve gotten used to having YAML documents where I can stuff all sorts of never-to-be-shown notes at the top of Markdown files. That said, the radical simplification of Gemtext is nice, even though there are all sorts of things I miss from my Markdown-to-HTML-via-Hugo workflow. By keeping a handful of features out of my capsuleās feature set, Iāve managed to keep it so Iām not even tempted to complicate my workflow with a separate build step with a static-site generator.
Sure, I still have to manually add an Atom-feed entry, but somehow that seems like smaller potatoes than picking/generating a filename, typing a post, and then adding that post to a page full of links to posts. Maybe itās because the bookkeeping work is optional and at the end of the writing, as opposed to some of it being mandatory and at the beginning.
As nice as it is to not have to worry about fonts and layout as a document author in Geminispace, Iāve been enjoying tinkering with Inter, a sans-serif font that seems somewhere in the Helvetica/San Francisco space. That is, itās the right kind of boring typeface for things I might want to do over port 443.
root:~ # exa -l .rw-r--r-- 6.1k root 19 Feb 16:44 shutdown -r now
Yes, thatās the only non-dotfile in rootās home directory. No, I donāt create much as root on a FreeBSD machine.
I made a post and pushed it to my capsule.
Later, on another computer, I made another post and pushed it to my capsule.
However, on the second computer, I forgot to pull in my changes from the Git repo this site is stored in, so I ended up overwriting the initial post.
Now that Iām back on the first computer, Iāve managed to pull the new posts, exhume the old post, and put them all up on the capsule.
This is not the first time all this has happened.
iOS 14.5 dropped today. Apple now has four voices in an American accent, not just two. The other English accents (Australian, British, Indian, Irish, and South African) still have only two apiece, one male and one female.
I picked through the new ones and was generally unimpressed, although itās kind of hard to get a really good feel for a new voice just on the strength of how it says āHi. Iām Siri. Choose the voice youād like me to use.ā
I then flipped through the different other English voices and settled on South African (Voice 1) (male).
Iām not too pleased by how my iOS devices all share this voice preference. I thought itād be neat for each gizmo to have its own voice settings, but I guess thatās not in the cards. I half-expect the foreign voices to butcher Spanish names, which is something of a liability when youāre driving in Southern California and following driving instructions from a phone thatās speaking to you.
Background:
I wanted to try delta instead of diff for Git (and others), but I wasnāt sure I wanted to commit to it. All of the examples in the README show you how to completely replace Gitās diff with delta, but I wasnāt sure I wanted to completely throw out the old thing in favor of the new.
Git aliases to the rescue.
Hereās what I put in my ~/.config/git/config:
# ā¦ [delta] keep-plus-minus-markers = true line-numbers = true side-by-side = true [alias] delta = "-c core.pager=delta diff"
Now, I can type `git diff` when I want the old thing, and `git delta` when I want the new thing.
Evidently the only emoji with text presentations are the ones that were carried over from Wingdings, the old Windows font. I wanted to have a text-presentation yawning emoji in the title of yesterdayās post, but evidently it doesnāt exist unless all your emoji have text presentation, like in Lagrange.
I wanted to be tempted by something, but everything I have, however old, is still just fine. Never once have I thought āI wish my iPad were fasterā. When I think about my iPadās deficiencies, I think of how option-shift-down does nothing in Discord and how I need to force-quit OmniOutliner sometimes because the built-in file picker gets wedged.
And as for things that run macOS, Iām still waiting for a decent 15ā³ (or larger) laptop that doesnāt have a discrete GPU. Also, Iām in no rush to switch to the new thing if I still have to run Terminal in Rosetta. Ideally, Iāll be able to entirely bypass that phase of the transition.
Then again, some of the projects I run rely on positively ancient dependencies. For these, I wonder if Iāll be able to get off Rosetta before Iām actively forced off. Worst case, Iāll have to keep an Intel-based Mac around for development because current versions of macOS wonāt support ancient databases anymore. Iām not looking forward to that future, as I canāt really spare the desk space.
After writing yesterdayās entry, I thought I might try my hand at writing a Gemini server. After all, it canāt be as hard as HTTP/1, can it?
Turns out, it was much, much easier than I figured.
I figured my first problem would be generating a self-signed certificate. I searched for āgemini generate self-signed certificateā and found gemcert, a small Go program that generates certificates for Gemini. Unfortunately, I needed to generate a go.mod file, but that wasnāt too difficult since I trusted myself to make up a decent module name:
module tildegit.org/solderpunk/gemcert go 1.16
I then generated a cert for localhost:
go build ./gemcert --server --domain localhost
This gave me localhost.crt and localhost.key.
I copied these files to a suitable project directory and added a mod.ts file.
After searching the Deno docs for ālistenā (I found Deno.listenTls) and DuckDuckGo for ādeno string to uint8arrayā (I found an article by a Dan Vega), I wrote the following mod.ts with one eye on the Gemini spec:
const port = 1965; const certFile = "./localhost.crt"; const keyFile = "./localhost.key"; const listener = Deno.listenTls({ port, certFile, keyFile }); for await (const conn of listener) { const msg = new TextEncoder().encode( "20 text/gemini; charset=UTF-8; lang=en-US\r\n# Hello, world!\r\nThis is a Gemini server." ); try { await conn.write(msg); } catch (e) { console.warn( `Attempted to write a message of length ${msg.byteLength} but couldnāt:`, e ); } conn.close(); }
I then ran it in the usual one-off way:
deno run --allow-net --allow-read mod.ts
Finally, I opened up Lagrange (itās handy and permissive) and pointed it at localhost and saw my hello-world page.
Boom. 21 lines of code.
OK, my first version lacked a call to conn.close() so Lagrange never finished working the first time. And I forgot --allow-read in deno run. And I thought conn.write() migh resolve to a number other than the length of the message. Still. 21 lines of code, and it didnāt even take a full hour to finish writing.
Background:
Dan Vega: Working with Standard Input and Output in Deno
I read the Deno 1.9 release notes today. Theyāve got a new HTTP/2-capable web server built in now.
This passage, however, stood out to me:
The current HTTP server in Deno, std/http, is implemented in pure TypeScript on top of TCP sockets. It has [surprisingly] good tail latency despite using a scripted HTTP server. But std/httpās major down side is that it is HTTP/1.1 only - with no easy path forward towards HTTP/2.
Ultimately we donāt want to be in the business of writing HTTP servers. HTTP is increasingly non-trivial and there are already well-implemented HTTP servers in native code.
āHTTP is increasingly non-trivialā.
I want people to be able to write good, useful servers easily. From scratch, whatever that might mean in their languages of choice. Even if that means that Gemini users donāt get the performance and features theyād be able to get from a reasonably well-configured HTTP/2 server.
Background:
Deno 1.9 release notes: Native HTTP/2 web server
Background:
If youāre like me, you have a shell configuration that you like.
If youāre more like me than even most nerds, you have a shell configuration that you want to keep roughly similar, even between different underlying operating systems.
If youāre like me about as much as normal nerds are, then you donāt want your $PATH to get cluttered full of paths that arenāt on that particular computer.
So, in order to keep my paths short, I do this:
function conditional_path_prepend -a where if test -d $where set -x PATH $where $PATH end end
I also have a function called conditional_path_append, but so far I havenāt needed to use it.
I then go hog wild with all the paths that I might need to add:
conditional_path_prepend $HOME/bin conditional_path_prepend $HOME/.local/bin conditional_path_prepend /Applications/Postgres.app/Contents/Versions/latest/bin conditional_path_prepend "/Applications/Visual Studio Code.app/Contents/Resources/app/bin" conditional_path_prepend $HOME/Library/Python/3.7/bin conditional_path_prepend $HOME/Library/Python/3.8/bin conditional_path_prepend $HOME/Library/Python/3.9/bin set -x GOPATH $HOME/Projects/Go conditional_path_prepend $HOME/.local/opt/go/bin conditional_path_prepend $GOPATH/bin
And when all thatās done, my $PATH only has 13 items in it. Nothing on Big Sur seems to put Python things in $HOME/Library, so all of that would-be clutter just doesnāt show up.
I also have a bunch of other āif you have the program, add the relevant variablesā bits:
set -x DENO_INSTALL $HOME/.deno if test -f $DENO_INSTALL/bin/deno conditional_path_prepend $DENO_INSTALL/bin end if command -sq deno # https://deno.land/ # deno installs its stuff here set -x DENO_INSTALL_ROOT $HOME/.local/opt/deno mkdir -p $DENO_INSTALL_ROOT conditional_path_prepend $DENO_INSTALL_ROOT/bin end if command -sq ansible set -x ANSIBLE_NOCOWS 1 end if command -sq bat # https://github.com/sharkdp/bat set -x BAT_STYLE plain end # in case of Ubuntu if test -f /usr/bin/vim set -x EDITOR /usr/bin/vim end # Use fd for fzfā¦but only if itās installed if command -sq fd # https://github.com/sharkdp/fd set -x FZF_DEFAULT_COMMAND 'fd --type f' end
This keeps things nice and light on my machines that donāt have ansible, deno, bat, fd, and/or fzf.
Prior reading:
Alex Schroeder, āThe Bliki Spiritā
A question for people that have been running their own personal wikis for a few years: do you publish it?
No, because publishing a wiki full of home-improvement information and events and interactions with (potential) contractors never seemed like a good idea.
That said, a personal wiki with this sort of information in it is stupendously handy for answering questions like āWhen did I lastā¦?ā and I recommend that everyone have a personal wiki.
Instead, why not treat yourself to a full viewing of āNever Gonna Give You Upā by Rick Astley? Itās a good song, worth enjoying in its entirety.
https://www.youtube.com/watch?v=dQw4w9WgXcQ
Unlike on macOS, where my deno binaries get updated with Homebrew, the deno.exe binary on my Windows machine gets updated whenever I get around to it. Thankfully, itās as simple as running `deno upgrade` and waiting a few seconds.
This is what the old version looks like:
> deno.old --version deno 1.7.0 (release, x86_64-pc-windows-msvc) v8 8.9.255.3 typescript 4.1.3
And the new version:
> deno --version deno 1.8.1 (release, x86_64-pc-windows-msvc) v8 9.0.257.3 typescript 4.2.2
More amusing, though is the size difference. The old version is 33.5 MB, while the current version is 50.6 MB ā about a 50% increase.
Iām not against large software (my editor of choice is VS Code) and the increase is likely due to at least one useful feature (maybe the ability to (cross-)compile standalone applications?), but a jump like that deserves at least some snickering.
Every month, I get an e-mail from TextExpander saying how much time itās/theyāve saved me. It usually says itās saved me some dinky amount of time, like 22 minutes. I delete these e-mails, but I also got a 2020 end-of-year review e-mail that I kept, and it said I saved three hours that year.
What itās not taking into account is how long itād take me to write out a lot of what I have it expand. My second-most-used snippet is ā;dateā, which currently expands to ā2021-03-18ā. This saves me the trouble of:
I use ISO-style dates for a lot of things (this page has a bunch), but I tend to name an awful lot of files with ISO-style dates as prefixes so that no matter what happens to the file metadata, they sort chronologically.
I also use TextExpander to give me picker-free access to a handful of emoji, but fast access to the thinking-face emoji is less impressive (and less frequent) than having a computer handle dates way faster than you can.
Background:
> date -r 1000000000 Sat Sep 8 18:46:40 PDT 2001
I donāt remember anyone talking about this day passing, although
At any rate, 1,000,000,000 seconds after midnight on 1/1/1970 ended up being on September 8, 2001 here. 100,000,000 was in March of 1973; 10,000,000,000 will be inā¦2286.
> date '+%s' 1616055107
Maybe there are cool numbers between 1,616,055,107 and 10,000,000,000 that I can use to make up excuses to throw a party. Ideally, theyāre closer to the smaller number than the larger.
I have bookmarks and subscriptions set up in a bunch of places.
amforaās bookmarks format is a TOML file where the keys are base64 (or thereabouts) bundles of URL and heaven knows what else. The values are the bookmarkās description, like āIntroduction to sysadminningā.
Lagrangeās bookmarks.txt allocates three lines per bookmark entry:
I can only guess what Elahoās bookmark structure is like, or how to get it out to a real computer.
I canāt say Iād want all these programs to connect to some centralized sync service, and I canāt also say that Iād want a general expectation of Gemini browsers to use some common bookmarks file format, but my life would be way nicer if they all stored bookmarks in sorted YAML or something.
Hereās what the file might look like for maybe a maximal entry:
--- url: gemini://gemini.circumlunar.space/capcom/ description: CAPCOM last visited: 1616058364 # ā1.6Ā·10ā¹ seconds since epoch; max safe JS int is ā9.0Ā·10Ā¹āµ tags and positions: - {tag: discovery, position: 0} - {tag: Bookmarks Bar/Aggregators, position: 1} subscription: true subscription style: look at new headers # or: "look for new date links" ā Lagrange has an option like this --- # ā¦
A good Gemini bookmarks.yaml editor would keep all entries sorted by URL to make diffing easier.
Why tags and positions? Because tags seem popular (as opposed to requiring every bookmark to occur in only one folder). Whatās more, tags seem at least as popular in the clients Iāve tried compared to old-school folders.
Of course, if one particular client has a special kind of tag, like one for a bookmarks bar, then that would be kind of weird in other clients.
Tag positions can be important for people whose clients allow them to sort items in a label. That said, neither amfora nor Lagrange seem to allow this.
Having a bunch of different Gemini browsers try to write to a YAML file or whatever in a stable format sounds like a huge mess. Iām beginning to wonder if a shared SQLite database might be better, or maybe some kind of language-server protocol where one program manages the database in whatever format and Gemini browsers send updates and query requests to it.
Of course, if I were writing a client, I would _not_ want to bother with all this. Iām a huge fan of keeping Gemini browsers easy to implement just about anywhere, so Iām more than wishy-washy on whether this is a good idea or not.
I got a weighted blanket today.
Like most blankets, it came with a duvet cover.
Unlike most blankets, itās tied into the inside of the duvet cover. The duvet cover has pairs of short strings (think of very wide shoelaces) and the blanket proper has little loops that the string pairs get knotted around.
Taking the blanket out of the box and hauling it onto a work surface (a large chair) was a minor upper-body workout.
Putting the duvet cover back on the thing after washing the cover was an exercise in both (1) forearm strength and topology. When I took the cover off the blanket I noticed how it was slowly coming inside out. I tried to recreate that sort of process, but it seems like I only recreated it by accident. Putting the thing back together again took about 20 minutes, which is way longer than most recoverings.
I can only hope itās at least as fun when Iām underneath it.
Update, a day later: I got a good nightās sleep, but nothing special.
I upgraded to Big Sur recently. On my main monitor, Iām using the āBig Surā dynamic photograph that changes with the time of day. The picture is of the California coast, looking down from a northward-pointing camera. As Iām writing this in the afternoon, the sun is beyond the left end of the wallpaper. Since I face northward when Iām sitting down at my computer, everything seems right and proper.
On my secondary monitor, Iām using the āCatalinaā dynamic photograph. that particular photo mustāve been taken on the north side of the island because the sun goes from left to right.
Just now I briefly considered moving my secondary monitor to a place behind my chair to keep the sun in the right place all the time.
In reply to:
gemini://perplexing.space/2021/whining-about-software.gmi
Money quote:
The entire software ecosystem surrounding NodeJS is bad and I wish I didnāt have to use it.
I wonder what the author thinks of the Deno ecosystem.
Then again, the Deno ecosystem seems about as natural as a bunch of freshly-planted, tastefully-chosen juvenile bushes that nonetheless look like theyāre all too far apart from each other. Itās certainly there, but I donāt think Dahlās ideas on how to import things from where and what to call them have been demonstrated to be a good idea or not.
I nuked my favicon.txt. It was the hunk-of-meat emoji.
Of course, you probably didnāt see it anyway since my site isnāt at the root of anything.
Iād go with newline-delimited JSON or a sequence of mappings in YAML (basically NDJSON with ā- ā prefixed to every line). I like easy-to-have-someone-else-parse-it-for-me formats.
Not that Iām planning on writing a geminid anytime soon, but hereās what Iād put in it (written out as YAML for ease of reading)
ip: "127.0.0.1" redacted ip: "127.0.x.x" # what would this look like for an IPv6 address? when: "1611306826" # seconds since the epoch time: "21/Jan/2021:00:57:24 -0500" url: "gemini://localhost/blah.gmi" status code: "20" mime type: "text/gemini" length: "475" old-school: '127.0.0.1 [21/Jan/2021:00:56:39 -0500] "gemini://localhost/blah.gmi" 20 text/gemini 475'
Zeroth, spaces in dictionary keys are fun.
First, everythingās a string because I donāt want to have to think about whether any number will come close to 2āµĀ³ā1, the maximum safe integer in JavaScript.
Itād be silly to log both an IP address and a partially-redacted IP address, but a server might default to logging only a heavily-redacted IP address and only let its administrator enable logging the full IP address after turning some option on. What would a similarly-redacted IPv6 address look like, though?
I think itād be nice to have a monotonic clock so logging systems donāt get confused by what happens during daylight savings time changeovers. I also think itās nice to be able to look at your logs and immediately know when something happened without having to translate from some weird format like āseconds since midnight 1/1/1970, in UTCā. The names need work.
I probably should be pickier about the distinction between URLs and URIs, but that can be tackled after the spec decides on how much non-ASCII gets handled by whom.
Thereās probably at least one good reason why Jetforce logs MIME type and length, even though I canāt figure out what any might be. That said, thereās lots of room for logging since no client is wasting bytes claiming to be ālike Geckoā.
Caddy has the functionality of āold-schoolā in its JSON-based log format, but that sort of thing might be of zero use in the Gemini world if thereās no preexisting Common Log Format.
Background:
Iām writing a thing. Thereās barely any creation to it, just recollection. It seems to be pretty effective as a slow, semi- (quasi-?)productive before-bed wind-down.
This might stop being useful as a before-bed wind-down once all my preexisting ideas get written down already, but one crisis at a time.
I ran onefetch on my capsule:
::::::::::::: Project: gemini-capsule (1 branch) :::::::::::::::::: HEAD: c2ede08 (master, origin/master) ::: :::::::::::::: Created: 4 months ago :::::::::::::::::::: Language: Python (100.0 %) :::::::::: Last change: 4 days ago :::::::::::::::::::::::::: ______ Commits: 115 :::::::::::::::::::::::::::: ________ Lines of code: 145 ::::::::::::::::::::::::::::: _________ Size: 48.98 KiB (24 files) ::::::::::::::::::::::::::::: __________ :::::::::::::::::::::::::::: ___________ ::::::::::: ____________________________ :::::::::: _____________________________ ::::::::: _____________________________ :::::::: ____________________________ :::::: __________________________ __________ ____________________ ______________ ___ __________________ _____________
Do we have anyone in Geminispace who has some decent ASCII-art skills who could supply a better logo? Not for Python, I mean. For a Git repo full of .gmi files.
In high school, our entire graduating class went to a museum. Some of us were given a scavenger-hunt list of things to look for. Some of us werenāt. I can definitely think of arguments both for and against giving high-school students a list of things to search for.
At any rate, if you donāt know what to look for at an art gallery, thereās a good chance you wonāt get much out of it. Me, I struggle to appreciate art sometimes, and a list of things to look for in all the exhibits might stimulateā¦something.
Of course, thereās nothing keeping you from looking at pieces and trying to come up with your own questions. If youāre looking for some sort of stimulus, looking at pieces and trying to come up with a question about it might be the sort of thing you need to get your brain active when youāre walking around an art gallery.
A manās gotta know his limitations. This can be made more difficult if his limitations fluctuate.
My ability to like/appreciate/tolerate 72% chocolate ebbs and flows. Right now my low-sugar tolerance must be at an ebb end, because apparently I currently actively dislike 72% chocolate, even in baked goods.
Trader Joeās sells Pound Plus (500g) bars of chocolate in three nutless strengths:
I try to stick with the darkest chocolate I can tolerate because it has the least sugar in it. The snag, though, is that too-dark chocolate has a medicinal taste. While this can be overcome somewhat by not eating pure chocolate all by itself and instead putting the chocolate into something sweeter (like cookie batter), this technique doesnāt work for everyone all of the time.
After two or three sub-mediocre batches of cookies made with 72% chocolate, I decided to buy a half-kilo of merely dark chocolate. Apparently this was the winning move, because my most recent batch actually tastes good.
Iāll probably re-acclimate to 72% again (Iāve done it two or three times now), but right now, thatās not what my taste buds are up for.
My (well, Kenjiās) go-to chocolate-chip cookie recipe
If you want to keep reading even older entries, hereās the page for the previous year:
If you want to keep reading newer entries, hereās the page for the year after this one:
ā