One such project has a database server that's been chugging along happily for many years.
Tonight, on a whim, I tried SSHing to it to check something (I forget what - probably the uptime), and was surprised to have my connection rejected.
Permission Denied.
What could cause that, I wondered? And of course, I quietly panicked. Had it been compromised? Could it have been corrupted in some way?
I tried several more times, confirmed my SSH agent had all my pubkeys loaded, even tried a few different possible usernames, just in case. Nada.
At this point, my best guess was that the system time had drifted out of sync with Atomic time. I've had similar issues with this in the past, usually related to HTTPS or signed web requests. I suspected that the math that calculates SSH connections might be failing due to the drift.
Before I started messing around with my local system time to try and guess how far the clock had drifted, I had the idea to check the backups. I wanted to look at the file timestamps. If there was a gap from when they were supposed to run and the time that they were written to the backup server, that might give me a hint of how far I'd have to adjust my clock. That is, if my atomic time-drift theory was correct.
Connecting to the backup server proved to be difficult. Signing into it went ... poorly. I used the wrong credentials at first, and then it started throwing captchas at me that were utterly unreadable by anyone's standard.
Eventually, I got the captcha sorted out, and I signed in.
I discovered that the backups hadn't run since SEPTEMBER. Over a month.
YIKES.
Anyway, that avenue of inquiry proved to be a bust. I spent a few minutes guessing at the time-drift theory by hand, and trying to connect from other servers to see if I'd set them up with access (I hadn't). No success.
Then I realized ... well, damn. I need to get a fresh backup. Kind of urgently.
I had another server that was still happily talking to this database, so I connected to that one - thankfully without any issues. I installed a CLI mysql client on it so I could run a mysqldump
, and then I spent a few minutes futzing with parameters to get the style of output I wanted. The inter-server credentials are quite locked down, so I used the --single-transaction
flag to bypass table locking. The client I was using was also much newer than the server it was talking to. The --column-statistics=0
flag disabled the unsupported column statistics feature. Once that was set, the backup proceeded smoothly. I gzipped it and got it off the intermediate server ASAP. Phew, potential crisis averted.
But I still needed to regain access to the database server. The inter-server credentials were for database access only, they wouldn't help with direct access.
With the potential backup crisis mitigated, I started to speculate about what variable had changed. Which piece of the whole flow had changed most recently?
Then I remembered: I had upgraded MacOS!
Some quick searching revealed that MacOS Ventura and Sonoma's SSH algorithm lists had dropped support for the RSA algorithm that was being used. Oops. I mean, good - clearing out weak algorithms is the right thing to do. But in this case, it caused a bit of a hiccup. Thankfully, I found a link that had a clear explanation of how to bring RSA back into Sonoma's list of SSH algorithms.
I edited my ssh config for that host to add these two flags:
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
Once I reconfigured it to add that back into the mix, I was able to connect just fine. Like nothing had gone wrong at all.
Then I tried invoking the backup script manually to see why it was failing.
After a few minutes of waiting, I got the result:
ERROR: S3 error: 403 (RequestTimeTooSkewed): The difference between the request time and the current time is too large.
Failed to upload backup to S3!
The backups were failing BECAUSE THE SYSTEM TIME HAD DRIFTED TOO MUCH FROM ATOMIC TIME. Vindication!
I sync'd up to atomic time, re-ran the backup script, and everything went smoothly.
Crisis averted.
Uptime:
2045 days, 12 hours, 59 minutes.
Even for a pet server, that might be a bit absurd.
∞ whateverthing.com by Kevin Boyd Permalink
Tags: command-line, maintenance, backups, administration
]]>It's that little box that websites show at the end of articles. You know the one. It thanks you for reading the article, and then goes on to ask you to subscribe or donate money. Sometimes it pleads, extolling how virtuous the website is for not pursuing advertising revenue or succumbing to corporate ownership.
It's the "please like and subscribe"/"smash that notification button" of the Blogosphere.
I don't know if it has a name already. But that's not going to stop me from giving it one right now.
I'm going to call it: the Busker Box.
That's what it comes down to, when you think about it. A small performance for passersby, followed by an extended hat or tin cup.
The best buskers parlay that growing crowd of donors into larger performances and larger venues. In this increasingly tortured metaphor, that would translate to speaking engagements. Or book deals.
Everyone needs to start somewhere. Only a select few people have the luxury of doing things for free. However, even those people can benefit from the direct remunerative feedback they might get from their patrons.
So if you happen to see a busker box, do not recoil in revulsion. Consider that your contribution is a direct action in support of another person's passions. You're letting them know that you care, and what you care about.
And always remember: the alternative to the busker box is an Internet completely inundated by obnoxious ads.
Nobody wants that.
∞ whateverthing.com by Kevin Boyd Permalink
Tags: fun, opinion, socialmedia
]]>Enter: macOS voice control
This built in accessibility tool is free to use and runs locally* on–Device without sending my audio to a remote server. (* requires Apple silicon)
When I first noticed this feature, many years ago, I completely ignored it. At that time, it required remote server voice analysis in order to operate. So if you're wondering what the Secret Killer Feature actually is here, it's the fact that this is now on-device functionality, at least for Apple Silicon devices.
It's not perfect, but I'm getting used to its quirks and foibles.
To begin with, it's important to note that voice control is completely separate from Siri. You don't have to say something like "Hey Siri" to activate it; when enabled, it is always listening.
It has two modes, dictation mode and command mode. Command mode is always enabled, unless you tell voice control to "go to sleep". Dictation mode is activated by saying "dictation mode". It can be deactivated by saying "Command mode".
Many commands are supported, and you can see the list of commands by saying "show commands" or "show me what to say".
I've been using voice control on macOS and iOS for about two weeks now. I am by no means an expert, but I am getting by. In fact, this blog post was written almost entirely in dictation mode. So far, it is going well. I have only had to make a handful of corrections.
For example, because I work in the photography business, a word that I have said frequently these past few weeks is "prince". I mean, "prints". Or, "SmugMug", which sometimes comes out as "smoke bear" for unknown reasons. Recently, I tried to say "about", and voice control thought I said "up boat".
One benefit of these silly mistakes is that it gives me a chance to learn the various commands to select and manipulate text, and move the cursor.
In order to get the word "prints" identified accurately above, I tried to add it to the special list of vocabulary words. Even then, it often still wants to type "Prince" instead of "prints". So… I'm not sure exactly what the vocabulary list is supposed to do.
Actually, I should point out that I am dictating this post specifically on an iOS device. Navigating around an iOS device with voice control is fairly easy. This is mostly thanks to "overlays", which are available in the form of names, numbers, and grids. I can interact with the device almost as though I was using it normally. Except, of course, more slowly.
Saying "show names" causes little captions to pop up beside interactive elements, showing a name by which I can interact with that element. In Safari, for example, I can say "tap refresh" to refresh the current page. Or "tap show bookmarks" to display my bookmarks, followed by "tap whateverthing" to go to this blog. It is quite a natural way to navigate the system.
Saying "show numbers" shows little number captions beside interactive elements. By saying the number, I can activate that element.
For more granular control I can say "show grid". This divides the screen into columns and rows. I can say the number of one of the resulting squares, and it will zoom in and show a smaller grid for that square. Then, I can say "click five", or similar, to simulate pressing it.
One thing I've noticed is that the level of control is quite different between iOS and macOS. On on macOS, the "show names" feature does not seem to exist. Additionally, many of the text selection features seen on iOS are missing.
Also on macOS, I am seeing a greater number of applications that do not have accessibility integrated into them. Fewer applications have support for the "show numbers" feature - making their interfaces less accessible.
This basically leaves me with grid overlay interaction and mouse cursor pixel manipulation ("move cursor 500 pixels left", "click") as my main options for interacting with macOS. Not great. But, admittedly, not terrible, for being free.
There are some bugs.
Sometimes, on macOS, having voice control enabled can cause weird behaviours in menus. If you click to pull down a menu, it might display for half a second and then vanish. This seems somehow related to the "show numbers" feature. I suspect that the way it scans interfaces to find interactive elements is triggering some kind of menu close event. Saying "hide numbers" can help stop this from happening.
I mentioned that some apps don't seem particularly accessible. When in "show numbers" mode, this manifests as numbers being visible on the window elements (minimize, maximize, close, etc.), but no numbers being visible within the application window itself.
Also, the nature of some gooey interfaces means that multiple scrollable panes are visible at the same time. This can confuse the "scroll down" command, resulting in both panes scrolling at the same time - or neither pane scrolling at all.
Some apps don't even support the "scroll down" command, so for those apps on iOS you have to use "swipe up". Reversing the axis can be a tiny bit confusing. I haven't found a corresponding fix on macOS.
You have to be careful not to have voice control enabled when watching movies or YouTube clips. Or in zoom calls. Or when people walk past while chatting. Or if your house has ghosts. Or if your employer ordered you to Return-To-Office in an open-plan office. Voice control is very eager to turn all of these inputs into commands and dictated text.
Luckily, I'm basically a hermit, so this doesn't affect me very often. But if you're not careful, NoHo Hank might type messages to your coworkers. I've seen it happen.
Voice control can be intense on CPU usage and battery usage. Even if you use the "go to sleep" command to stop it from listening to every single thing. It can use up to 30% of the CPU when idle, from what I've seen.
On iOS, you can easily turn it off by saying "turn off voice control". And more importantly, you can use Siri to reactivate it. On desktop macOS, you can turn it off just as easily, but if you don't have Siri enabled (and I don't, because being unable to change the wake word means that it can't differentiate commands meant for my iPhone), it can be clunky to turn it back on.
Don't make Solomon Epstein's mistake: if you can get by with just using the "go to sleep" command, you'll be better able to recover from problems like the classic "bone-crushing high-G burn" situation.
Overall, it has been a fun experiment. I imagine that superior tooling and a greater need would allow someone to become very adept at navigating interfaces. But inaccessible applications will slow people down quite a bit, so make sure to keep accessibility features in mind when developing your applications.
This has even helped me get more writing done. Unfortunately, evidence suggests it will not help very much with programming, particularly in PHP. (Oh, neat – it recognized the name PHP. However, I had to try five separate times for it to recognize the word "neat". 🙄)
Anyway, that's all for now. If you've got a Mac or an iPhone, give voice control a try. And let me know if you would like to see some video demos of how I am using it.
]]>If you want a chronological timeline that is free from ads, doesn't use algorithms to hide your friends' posts from you, and isn't beholden to the whims of the billionaire techbro class, you want Mastodon.
Hmm, no, I can do better. That's a bit too wordy.
Mastodon: Follow your friends. Fight the algorithms. Fuck the billionaires.
Erm, maybe that's too edgy and uninformative. Let me try again.
Mastodon is a Twitter clone. You create an account, you post shit, people see it, people interact with it, you follow the ones that seem interesting. They'll follow you if you seem interesting. Just like how Twitter used to be - before they ruined it.
Normally I'd throw in a pithy "It's just that simple!" right about now. But it's true that there are some complicated bits. Folks like me love to dwell on the complicated bits, explaining them in too much detail.
Folks like me also love to delve into metaphors and similes to try and create natural comparisons that are easy to understand. We try very hard - too hard - to try and convey the mental image we have in our head. But that's not actually important, that can come later. That's not the message that matters to a new user.
It's a web, it's a hub, it's a witch, it's a lover ... wait, no, I've gone off the rails.
Mastodon gives you more choices than other apps.
When you sign up for most social networks, you're not given the choice of which organization provides that service. The company and the service are the same, and none of the services talk to each other. If you're on Twitter, you can't message someone on Threads. If you're on Instagram, you can't message someone on Flickr. That's because your choice has been made for you: join our service, it's the only service. Our rival company's services are the competition. Maybe even the enemy.
Mastodon is better than that.
Mastodon lets you choose who is providing the service.
You can join a Solarpunk Mastodon community. Your profile will live on that community's server. If you donate to the costs of running that server, perhaps you'll have a say in how things operate. Maybe you can volunteer to help with running it.
After you create your account, you can talk to a Honeybee Mastodon community member. Your profile will be on the Solarpunk community server, but you'll be chatting away with people whose profiles are on the Honeybee community server.
In the old world of startups, that wouldn't be possible. You would only be able to talk to the other Solarpunks, because the Honeybee users would belong to a different company.
Now let's say someone from the Jerkwad community joins the conversation. Whoa! They're terrible! How are they even allowed on the Internet?! This new person is all up in the replies, being their terrible self. What can you do?
On other services, those ones that don't talk to each other, the responses can vary.
Sometimes you'll get a shrug and a poop emoji if you report the user, because the billionaire tech bro who bought the service thinks that stupid babies need the most attention.
Other times, the service will respond rapidly and with great prejudice - banning the jerkwad.
In a few rare cases, sometimes the jerkwad will manage to flip the whole thing the other way and the service will be tricked into banning the perfectly fine user that the jerkwad was harassing.
Mastodon gives you an additional tool for fighting back:
If that jerkwad isn't swiftly dealt with by their own community, it's a sign that their community is perfectly fine with jerkwads running the show.
So the Solarpunk and Honeybee communities can look at that server and go, you know what? Forget all y'all. We're disconnecting from you; none of your jerkwad users are allowed to talk to our users. G'bye!
And I think that's beautiful.
The hardest and most complicated thing about Mastodon is getting started.
And that's weird. And new. Because we've been so mollycoddled by billion-dollar companies that know how to hack hypergrowth and make things feel as smooth as possible.
Creating a blank account and landing on a timeline with zero activity is an uncomfortable experience.
Pretty much any social network with a marketing and growth team will want to avoid that feeling; that's why Twitter and other services recommend a bunch of celebrities and influencers to new folks who sign up. It allows the timeline to fill in like a warm hug (oops! a simile - sorry!). They make it as easy as possible to get people up and running, because for them, every set of eyes is literally money in the bank.
Mastodon will get similar functionality at some point. Maybe community hosts will be able to provide a starter kit of folks to follow. But hypergrowth isn't the goal. It's not the focus. And as a result, the uncomfortable onboarding experience doesn't get as much attention lavished on it as it does at companies with billions of dollars in funding and dozens of investors to satiate.
So where does that leave you, the new user with a blank timeline? How do you build a timeline?
Mastodon's biggest problem right now, even bigger than the onboarding experience, is Search. I know I said that getting started was the hardest and most complicated; Search isn't hard or complicated. No, its problem is that it is dumb.
You've got a blank timeline, you think, "you know what, I want to find some people who talk about knitting", so you go to the search page and type in "knitting" and get a grand total of... zero results.
WHAT? In a population of several million people, across several thousand communities, not one person is talking about KNITTING?
Well, that's confusing. So you try other keywords: purling, crochet, sewing, cross-stitch. Nada.
It makes no sense!
And then someone suggests "use a hashtag". So you try "#knitting". Dozens of results! Hundreds! Now you're getting somewhere!
You can browse through the results and find people to follow. You follow a bunch of them. That's a good start!
When you started the search, you might not have noticed the little "person with a plus" icon. It's not really clear what it means, but it's actually very powerful: it lets you follow the hashtag itself.
Instead of having to periodically go to the search page and search for "#knitting", you can follow it. And then, as if by magic, all of the knitting-related posts that your Mastodon community server can see will show up right on your timeline - as if you were following every knitting enthusiast in the known universe.
So you've followed a bunch of people and hashtags - but over the next few days, none of them follow you back. Was it something you did?
Well, no. It's something that Mastodon failed to help you do.
In order to encourage people to follow you back, you have to let them know who you are and what you're about.
This usually involves writing a little bio about yourself, and then making an intro post to tell people about yourself and your interests. Make sure to include the "#introduction" hashtag - a lot of folks follow that hashtag and are happy to follow people.
This part of Mastodon is a bit hard to understand, and that word "Federated" is the main area where folks like me start to use all kinds of metaphors to make it "easier to understand".
Here's the gist about timelines:
Each of these timelines can be used to find more people to follow, until your Home timeline is full of all the goodness you want to see.
Now you've settled in, you've built a timeline, and you've noticed something. Your local community isn't actually where you want to be. You thought you'd fit as a Solarpunk, but now you want to be part of a MenWhoKnit community.
In the old corporate-dominated world, this wouldn't be a thing. Your Solarpunk account would always be a Solarpunk account. If you wanted to join MenWhoKnit, you'd have to open an account with a different company and build a new timeline from scratch. And maybe the userbase of the MenWhoKnit company would be vanishingly small compared to the Solarpunk company. And maybe their social network software would not be as good as what the Solarpunk company had built.
Mastodon is better than that.
Instead of having to rebuild from scratch, you can transfer your account between Mastodon communities. Your old posts don't move over (at least not yet), but the important part - your carefully-crafted timeline - does move over. You don't have to spend any time rebuilding it from scratch. All of your follows/followers, even the Solarpunks, will automatically re-follow you at your new community.
You can still talk with all the people from before. They can still see your updates. And now you have a new address that is more befitting of your interests.
Mostly, ActivityPub and Fediverse don't matter to new users. I won't go into a ton of detail.
They allow Mastodon communities to talk with other Mastodon communities. They also allow it to talk with other kinds of communities.
Mastodon is a Twitter clone, but it can talk to Pixelfed, which is a photo sharing service similar to Instagram. There are all kinds of Pixelfed communities springing up, with the same cross-communication ability as Mastodon communities.
Both of them can talk to Kbin and Lemmy, which are new link-sharing services similar to Reddit.
And there are dozens of other projects that can talk to all of those services. Too many to list, really.
So your Mastodon timeline can contain not only other Mastodon users in other communities, but it can also contain Pixelfed photographers on Pixelfed communities.
The options are endless.
And as for those companies that are motivated to consider other social network companies the "enemy"? Well, there's not really anything stopping them from joining up with ActivityPub and the Fediverse. They have options, too.
I'm sure there are a lot of questions and budgeting/planning allocations that would need to be resolved, as with any business operation, but some of them are already considering it. Tumblr, WordPress, and Flickr are a few that have come up in that conversation.
HAHAH. NO. The technology has limitations (see: onboarding, search). But more than that, there is the coalition of community servers that all talk to each other. Those are run by humans. And humans can be fighty over the most arbitrary things. Even, sometimes, the most serious things.
There will be growing pains. Communities will most likely get into disagreements that grow into rather large and dramatic fights. All of this has happened before, in IRC, and on Usenet, and inside web forums, and pretty much any place that humans use to talk to each other.
And that's okay.
That's how we learn to set healthy boundaries and learn to coexist.
That's how we grow.
That's how we all become better.
Author's note: I went into too much detail again, didn't I?
Editor's Note: You don't say.
∞ whateverthing.com by Kevin Boyd Permalink
Tags: opinion, mastodon, Facebook, twitter, socialmedia, fediverse, activitypub
]]>That's the wrong way to use it.
It's understandable. Companies exist to make money, after all. Having a cool tech demo could be the difference between success and failure.
Setting aside the ethical and legal considerations, there are two main reasons why it's dangerous to put AI front and centre in your business:
With this technology expanding at a geometric rate, your AI/ML solution will become outdated almost immediately. Competitors will be able to spin up more powerful replacements with little effort, which you'll have to counter - or your product's value will plummet.
Building a company around a whizzbang AI/ML stage show is not sustainable. It's an arms race.
Instead, focus on using AI/ML tech where it shines: boosting your product's innate value. Make it the cherry on top of an excellent customer experience.
Adobe has helpfully provided two examples for this discussion, one on each side of the argument. Thanks, Adobe!
In one corner, we've got Adobe Firefly.
This product helps users generate imagery from text prompts, or modify existing images according to other instructions. This sort of generative art has led to some neat results, but also to some hilariously disastrous ones.
In the other corner, we have Lightroom's "AI Noise Reduction" feature.
Passing your photo through this filter results in a more effective noise reduction. It's not perfect, it's not going to magically transform your photos into tack-sharp focus - but I've yet to see any major issues with it.
One of these tools invents things from whole cloth.
The other is a nuanced refinement of an existing tool.
One of them takes source data from the creativity of thousands of photographers and stands a very real chance of being party to the destruction of livelihoods.
The other looks at thousands of camera exposures and uses that analysis to subtly enhance the final product by removing sensor defects and lens aberrations.
One of them is a surefire strategy for capturing press attention and (in the case of startups) fresh investment.
The other is a quality of life improvement for photographers and fellow creatives.
Don't be the company that puts AI gimmickry at the forefront of your application & advertising. Don't use it to remove the human element from the creative process. Don't cement yourself into an unwinnable arms race as your company spirals into valueless oblivion.
Use it the way it should be used: making lives easier and more rewarding.
The only thing that should be front and centre is your customers.
Deliver value first.
∞ whateverthing.com by Kevin Boyd Permalink
Tags: opinion, photography, machine-learning
]]>Yep, you guessed it: this post is a rant about generative art.
I'll start by saying that I don't hate generative art, nor do I hate LLMs and their peccadillos. Frankly, all of these technologies - ChatGPT, Midjourney, DALL-E, and so on - are extremely impressive to me.
So this rant isn't about how all development should be stopped, or how it should all DIAF, or anything like that. It's fine. It's a tool. It's going to shatter some things, which is going to become extremely problematic, but the genie's already out of that particular bottle.
No, this post, like all good rants, is really about how I feel.
Generative art makes me feel put out. It kills the fire inside me that makes me want to make art. I think I've narrowed down why this happens, thanks in part to Flickr's social activity feed.
I follow 250+ photographers on Flickr. When I look at the activity feed, I see their latest photos from around the world in dozens of styles. It's inspirational, and helps me think of ways to improve my skills.
Lately, a handful of these photographers have been putting down their cameras and taking up generative art prompts. The resulting "photos", which could be termed as part of the Virtual Photography category, are usually hyperrealistic interpretations of various serious and/or surreal elements. And to a degree, they are unnervingly good. That's part of the problem. Another problem - perhaps the biggest problem - is that when scrolling through the thumbnails I can't tell if they are generative or not.
So I'll think "that looks amazing, how did they get that shot?", and I'll click into it and find out that no one got that shot.
It's a trick.
Yes, these photographers are mostly taking care to categorize them as generative art by various tags & albums & groups. They're not actively trying to trick me. They're having fun, making neat imagery, and categorizing it appropriately. I don't begrudge them that. It's not Flickr's fault, either - I'm just using a specific example, it could be almost any platform.
What bothers me is the whiplash - that moment where I think one thing, and then crash upon the shore of nihilism.
Not all virtual photography makes me feel this way. For example, I've seen video game photos from Second Life and Red Dead Redemption that are really great. I've seen composite photographs that are mind-blowingly surreal, yet still clearly made from real photographic sources. Those can be inspirational or even instructive. Sometimes they can even serve as a cautionary tale on what not to do. But they all have some degree of intrinsic artistic or emotional value.
Among the many skilled photographers I follow, there are a few who have a supreme ability to create amazing shots that demonstrate near-mastery of their preferred photographic style. To an eye that has been exposed to generative art, these works might appear to share a similar level of unreality.
But when you open up these photos and examine the details, you're surprised to find that everything is authentic. Yes, there's probably some amount of photoshop tuning involved - maybe even some machine learning algorithms tying things together - but you can tell that the photo was very much not a careless output of unthinking automata.
So now I have to vigilantly examine my activity feed to sort the generative tricks out from the masterful triumphs. And every time I encounter a trick, I grow a little bit more resentful and disheartened at things.
It has begun to demotivate me from picking up the camera.
To be fair, it's not the only force in my life that is doing so, but it's certainly a strong one.
I referred to it as "nihilism". I want to make it clear, I have no education in art history. Or philosophy. If I throw terms like that around, it's entirely based on a primitive understanding of the concepts assembled from various layperson sources. And that includes The Big Lebowski as a prime resource. My opinions in this area are no better than ChatGPT itself would be. In fact, they might be completely off the mark by comparison.
What makes me describe it as nihilism is that there is nothing behind the "virtual camera". Utterly nothing. The prompt provides the kernel of the concept, but all the parts that sum up to the total - they are all chosen unthinkingly from the statistical model.
From my admittedly limited viewpoint, I can think of nothing more nihilistic than that.
In fact, I'd go so far as to describe it as post-nihilist. Or maybe hyper-nihilist. Perhaps it's what comes after you pass beyond the event horizon of total nihilism; you believe in nothing so hard that the very concept of nothing ceases to believe in you.
Maybe every generation has to deal with an art form that challenges the past structure. Maybe this embrace of nothingness is a natural evolution of postmodernism; now, instead of beatniks carelessly splashing paint on canvas or avant-garde waifs declaring that their performative consumption of mouldy rutabagas represents the patriarchy's unknowing self-sabotage, we type abstract words into an oracle of the unknowing abyss and celebrate the icons of meaninglessness it bequeaths us.
Anyway.
I've unfollowed three photographers who have started posting these items. I've noted down their account info so I can re-follow them in the future, as they are very skilled photographers and I don't want to lose track of them. However, for the time being, I'm exercising self-care to try and ward off the demotivating effect that these posts were starting to have.
I'm not saying that you should do the same. Maybe you see these virtual photos and they inspire you to hone your craft.
But for me, when I see them alongside photos that are truly inspirational, they just leave me feeling empty and annoyed at the world. Like listening to Nickelback on repeat.
RIP Tigerlily (Feb. 2022)
RIP McFluffin (Apr. 2023)
I hope you dorks are having a blast lounging in the eternal sunbeam.
∞ whateverthing.com by Kevin Boyd Permalink
Tags: opinion, photography
]]>It's available on plenty of platforms and primarily uses Markdown syntax for formatting. This is good, because it means that I can quickly copy and paste my drafts into my Markdown-based static site generator (Sculpin) often without needing any formatting updates.
The "core" installation of Obsidian is actually quite powerful on its own. There's also a whole bunch of community plugins for people to tune it to their specific uses.
There's a service for synchronizing your notes at an extra cost. I'm not quite ready for that, so I'm actually using an iCloud Drive shared volume to store my "Vault". This seems to work well enough for what I've been doing, and I'm already paying for it, so I may as well get some use out of it. Works on my main computer and on my phone. Google Drive and Dropbox also seem like they'd work for this sort of cross-device synchronization, at least to get started.
One of the more powerful parts of Obsidian is the built in support for hashtags. They allow you to connect notes together so you can quickly search for relevant information.
For example, I've tagged a bunch of my recipes with "#recipe", in addition to organizing them into a Recipes folder inside my vault. This might seem to be a redundant level of organization, and, it kind of is. I could have skipped the folder entirely and just used the hashtags.
Switching into the graph view, I can see all of my posts clustered by the tags I've created. Or, at least, eventually I'll be able to - in practice, because I've imported a decade of notes from another tool, I have a lot of detached notes and a few accidental clusters of hashtags due to the inclusion of BASH scripts with hash-based comments and similar noise. I'm still working to clean that up.
Another hashtag usage example is for my work notes, where I might want to keep track of individual project decisions, quarterly summary information, or coworker praise/feedback. For someone like me, who has trouble remembering the highs amongst the lows of a quarter, being able to click onto the quarterly notes hashtag and see all that I've accomplished should be a helpful boost to my memory. And it might be nice to have some sort of '#wins' hashtag for a bit of an uplift on downer days.
Having a daily note is a useful way of keeping track of what I've accomplished or what I'm ready to start on. Kind of like a journal entry, but with superpowers.
Obsidian can be configured to open up the daily note on Startup, and it also provides a button for quickly jumping to it if I need to jot something down.
I've configured a template for what a blank daily note looks like. I haven't quite settled on a template format I fully like, but the basic headings I like to have are TODOs
(a checklist) and Notes
(plain text or a bulleted list).
For some TODOs, but mostly for individual notes, it can be super handy to drop a hashtag in that I can click to quickly look up relevant information.
There are over 800 community plugins for Obsidian, as well as external tools that can help supercharge it as a command centre for your life.
I've only tried one community plugin so far, but I'm quite liking it. It's called "Rollover Daily Todos" and it hooks into the Daily Note creation process to bring yesterday's unfinished todo list items forward to the current note.
I'm going to stick with it for a while and maybe post some updates about how things are going. I've got my eye on another plugin, one that says it can help with long-form writing such as novels or screenplays. If I ever get my in-progress books out of the drafts folder & published, maybe I'll have Obsidian to thank for that ...
Thanks for reading!
]]>Right now, a tiny but annoying roadblock is PHP 8.1's deprecation of the strftime()
function. One of my Whateverthing projects uses it a handful of times in various ways. I need to find an alternative pattern to replace it, one which is either brief and low-effort, or more robust but available to all the sections of the codebase.
Three high-volume calls exist within a single method. That particular method is overdue for a rewrite. It "fixes" datetime strings so they are displayed in the user's preferred timezone. This codebase's database, like many built on the west coast of North America, shipped with "Pacific Time" as the default. Localizing datetimes for users, then, requires a multi-step shuffle: first to UTC or GMT, and then to the user's own timezone.
After a couple of hours of bashing my head against timezone math, I decided to go back to the drawing board and see how I'd implement this if I were building it from square one. And boy howdy did I find what I was looking for.
Because - guess what - it turns out that this is a solved problem.
I was able to rip out all my dodgy strftime()
-backed timezone math and replace it with this:
$originalDate = new DateTimeImmutable($date, new DateTimeZone($originalTz));
$newDate = $originalDate->setTimezone(new DateTimeZone($newTz));
There might be an even shorter way to write it, but for now this'll do. And it lets me delete at least 12 lines of useless broken code. Yay!
For future reference, the list of possible timezones can be generated by calling DateTimeZone::listIdentifiers()
. Note that spaces are replaced with underscores, so the New York timezone is America/New_York
.
The moral of this story is, if something changes underfoot, don't get stuck trying to make things work the old way. Rethink.
Oh, but the story's not over. I also need to format the strings - after all, that was strftime()
's main job.
The downside here is that the strings used by strftime()
are not compatible with DateTimeImmutable's format()
method. But, there's a helpful reference table on the PHP website, and I only had two strings I needed to translate. Well, three, if you count the sane way of showing a datetime value.
Format Example | Old Format String | New Format String |
---|---|---|
Dec 5, 01:14 |
%b %e, %H:%M |
M j, H:i |
Dec 5 '22, 01:14 |
%b %e '%y, %H:%M |
M j 'y, H:i |
2022-12-05 01:14:00 |
%Y-%m-%d %H:%M:%S |
Y-m-d H:i:s |
There are some sneaky differences here, such as "%M"
becoming "i"
. The old syntax is documented under strftime, and the new syntax is documented at datetime.format on the ever-helpful PHP website.
I've wrapped this up in a set of classes I call "Shift" and "Format", in a namespace called "Timelord". I was expecting the timezone shifting logic to be more complex than this, and thought I might need to write a custom format mapper from strftime()
to ->format()
syntax. I'm very glad it was unnecessary, but I like the name, so I'm keeping it. Maybe I'll have more adventures in date math to add to it in the future.
One benefit of this choice is that it let me add short PHPUnit test cases that "broke" my original dodgy math. Once I ripped all that out and replaced it with the call to ->setTimezone()
, I was able to have some degree of confidence that I had actually fixed the problems:
class ShiftTest extends TestCase
{
/**
* @dataProvider timezoneProvider
*/
public function testShift(
$currentTime,
$expectedFriendlyTime,
$fromTimeZone,
$toTimeZone
): void {
$overrideTimeZone = new \DateTimeZone($fromTimeZone);
$overrideTime = new \DateTimeImmutable($currentTime, $overrideTimeZone);
$shift = new Shift();
$shift->overrideTime($overrideTime);
$shift->overrideTimeZone($overrideTimeZone);
$dateString = $currentTime;
$actual = $shift->fix($dateString, $toTimeZone);
$format = new Format();
$this->assertSame($expectedFriendlyTime, $format->friendly($actual));
}
public function timezoneProvider()
{
yield 'pacific-to-eastern' => [
'2022-02-02 02:02:02',
'Feb 2, 05:02',
'America/Vancouver',
'America/New_York',
];
}
public function testShift_Now_timezone_override(): void
{
$shift = new Shift();
$shift->overrideTimeZone(new \DateTimeZone('America/Mexico_City'));
$this->assertSame(
'America/Mexico_City',
$shift->now()->getTimezone()->getName()
);
}
}
Yes, that's right, the Shift
class also implements the newly-ratified PSR-20 standard.
Thanks for reading! I hope you found this helpful and informative. Happy upgrading!
]]>It's done. I know there are many people still using it. You shouldn't be.
As a previously-active user, I had curated a reasonably copasetic timeline. I relied heavily on muted words and account blocks. Even amidst this chaos, it's still surprisingly usable. But one peek into the trending topics reveals the rot beneath that stately surface. And in case that's not testimonial enough, here's a handy timeline of all the terrible decisions being made.
Sure, not everyone has the luxury of leaving. Some people have contractual obligations. Others have managed to build an entire career on the back of Twitter. And still more folks just don't have time for philosophical nonsense or learning the ins and outs of new platforms.
I've heard folks championing the idea of "stay and fight!". Fight for what? No amount of user pushback will change the fact that the tippy top of the company is under new management, and that management is hostile.
Consider this: a right-leaning industrial tycoon just bought your newspaper and eviscerated it.
You can't trust it any more. You can't trust him. You need a new newspaper.
When choosing a new haunt, aim for something that won't have the same flaw. Choose something where a tycoon can't swoop in and rend it asunder. In my opinion, this means something that won't have its eye on a juicy exit for investors.
There's a mad scramble in the tech industry to "be the next Twitter", with all kinds of Hives and Posts spinning up to siphon the Twitter outfall. Pay attention to who foots the bill. Will they try and maximize their investment by turning up the dials on all kinds of dark engagement tricks? You bet yer sweet bippy they will.
Don't fall for the siren song of the tech CEO with borrowed deep pockets. That ballad is played out. You should know better. By now, we all should know better.
After this decade-plus affair with Twitter, I really do think we need a social media methadone to break the addiction cycle. Especially considering, like any tech company of a certain size, Twitter had teams of people dedicated to crafting addictive engagement loops into the core of the product. Some people, myself included, have observed that there've been times when their mind has wandered on a task and - suddenly - they've found themselves reading Twitter, with zero conscious memory of having opened the app. That's not healthy.
I've chosen Mastodon; it is a hodgepodge decentralized volunteer effort, not a venture-backed product of greed and control. It might not be the right choice for you. It will most definitely have growing pains over the coming months, particularly around moderation. I don't think it will replace Twitter - I'm not sure that anything can, or should. But I do think it is a suitable destination for breaking the habit of Twitter.
I don't know what this maladroit marauder wanted to do with Twitter.
I don't know what his overall plan or motivations were. It may forever be an enigma wrapped in a riddle and stuffed in a turd floating in a urinal. There's been no end of speculation this way or that way. Did he want to destroy it? Maybe use it for his space plans? Was he totally ensnared in the feedback loops and living in a reality distortion field? Did he need something new to rub his emerald-encrusted taint all over? Or did he do it purely to invite his antisemitic and anti-democracy buddies back on?
We'll never know the real motivation behind this. All we can see are outcomes. And for now, the immediate outcomes:
Why aren't the investors more outraged? Maybe they are. They're professionals, they wouldn't bleat about concerns - they would take action. Yet, we haven't seen any. Why not?
I do have one theory, and it seems to fit the facts as observed thus far:
]]>But there are many projects along the way that are either dead or on life support. Several open source projects, a whole plan I had for underwater drone videography, a bunch of Raspberry Pi-based concepts, a plan for actually selling my photos, and many more. It would be nice to be able to resurrect and complete some of these, or move on to fresh projects that could be more valuable to people.
With a family and a software development day job, it's hard to justify spending time on such projects. I'm lucky that I don't also have to deal with a big commute - I'm able to work 100% remotely, a privilege available to very few people, even in the shadow of Covid. But life has a way of making it hard to know where to focus, while also running the batteries dry.
This is why I've started a Ko-Fi page where people can kick in on my various projects and open-source initiatives.
I need to break the fizzle pattern. A recurring dollar amount attached to these hobby projects might help me concentrate my focus, restrain me from distractions, and let me stick the landing more often. Plus, feedback from supporters provides a stronger signal on specific problems I can help solve.
That's where you come in. If you feel there's value in some of my projects, like Photo-a-Day-for-a-Year, YouTube videos, web utilities like Deref.link, or open source projects that I contribute to like the Sculpin static site generator, please consider supporting me so I can focus on delivering more of that value.
∞ whateverthing.com by Kevin Boyd Permalink
Tags: projects, news, entrepreneur
]]>