" has distinguished itself as an invaluable tool for brainwashing and controlling the masses. With a shrewd mix of delusional paranoia and dubious anti-aging nutrition hacks, they strive to make life both scarier and longer for everyone"
Were it not for I'm not sure I would have ended up becoming a software engineer.
“As blogging pioneer Dave Winer’s site turns 30, it’s a reminder that good writing and thinking has flourished beyond the reach of social media”
Already have my tickets.
"PayPal opts users into sharing their data by default, without their knowledge - unless they navigate to the personalized shopping settings on their own"
"Democratic presidents far outpaced Republican presidents on job creation since at least 1945"
@protonprivacy@mastodon.social
"Apple Intelligence makes a lot of sense when you get out of the AI bubble. Plus, the cool technical details Apple shared about their language models "thinking different.""
"Shoppers would by default have their data included in the new network, but they can opt out, according to the PayPal spokesman"
"servers can be tricked into accepting commands that modify their account balances because any security checks are done by the app on the user’s device and automatically trusted by CSC’s servers"
This past weekend, my partner dragged (and I mean that literally) home a 2005 Mazdspeed MX-5. I have thoughts.
I love my Kindle for long form reading. It’s light enough to hold in one hand for long periods. Its e-paper display is much less fatiguing on my eyes than the backlit screen of a traditional tablet. As a purpose built device, it minimizes distractions like notifications and the general temptation to drift away from reading to other tasks. Its weeks long battery life means I can throw it in my bag for a trip and not have to pack a charger.
My biggest frustration with the Kindle has always been getting the content I want to read onto it in the way I want to read it. Buying digital books from Amazon is all fine and good, but I want more. I want to be able to send any article I come across on the web to it without jumping through a bunch of hoops. I want to be able to send the newsletters I subscribe to via email to it. And I want all that content grouped into a daily digest rather than each one showing up as its own separate “book” on the Kindle.
Up until recently, I used Instapaper for this and it worked fairly well. It supported both web articles and newsletters. It could send a daily digest of content to my Kindle. But it had its flaky moments. More than once I had to endure periods lasting days or even weeks during which my daily digest didn’t show up despite there being plenty of content waiting to be pushed to my Kindle. And I was never thrilled with the formatting of the digest itself. It was workable, but I always felt like it could be a lot prettier with a little effort.
For the last few years I have been toying with the idea of finding a more reliable solution. During that time I’ve explored several other hosted solutions like Pocket and Omnivore, but dismissed them all for lack of a Kindle integration. EpubPress was a unique and promising product that I really wanted to work out. It could send a digest to my Kindle, but it failed to process a fair number of the articles I sent to it and it didn’t support newsletters.
Last week, I was prompted to revisit Omnivore by a conversation I had with a reader on Mastodon. I like that it’s open source. It has built in support for newsletters and RSS feeds, which is how I source 90% of what I read. It has more robust filtering options than most other products. The only thing missing is a Kindle integration. There is an open request for such a feature, but it’s almost a year old and hasn’t been implemented yet.
Omnivore does have an API that gives me programmatic access to the “readable” versions of articles and newsletters, which got me to wondering whether I could use that data to build my own digests. That would give me more control over the formatting and the scheduling. To be fair, Instapaper also has an API, but Omnivore’s open source model and other features convinced me to go that direction, at least for now.
After a little digging, I discovered an ebook library for Python and decided to give it a go. One thoroughly caffeinated weekend later, I had a tool that could reliably pull articles from my Omnivore account, use them to build an epub file, and (with a little help from AppleScript) email that epub to my Kindle.
The formatting of the epub is still a work in progress, but the nice thing about this solution is that I can tweak it any time I want since the code is sitting here on my Mac Mini. And, when things go wrong, I have more power to try and fix it myself without having to wait on third parties to prioritize the work.
If you want something done right…
File this under “when analytics go wrong”.
The last several weeks, every time I listen to an NPR podcast, I hear a bumper telling me that I’m a Google Podcasts user and that the service will be shutting down soon and that I need to find another way to listen to their podcasts. The trouble with that is that I’m not a Google Podcasts user, I’ve never been a Google Podcasts user, and it’s starting to get more than a little annoying.
I do think I know what’s going on though.
For reasons I won’t go into here, I consume podcasts using a home grown solution I built many years ago with Python and MySQL on a Raspberry Pi. I pull individual podcast feeds directly from NPR’s servers and extract episode URLs from those feeds. Google Podcasts doesn’t come anywhere near that process.
Where I think things are getting confused is when I listen to those podcasts. Again, using a Python script on a Raspberry Pi, I cast each episode URL to a Google Home Mini sitting on my desk. My suspicion is that NPR is peeking at some bit of the metadata associated with that playback (maybe the user-agent), seeing the string “google”, and inferring that I must be a Google Podcasts user.
This leads me to wonder whether anyone casting a podcast to a Google Home from any service on any device is being interpreted by podcast analytics services as coming from Google Podcasts. 🤔
Our “good” coffee maker went on the fritz over the weekend. Until I can decide if it’s fixable or what I want to replace it with, I dug out the backup coffee maker. Yes, we have a backup coffee maker. Caffeine is a priority in this house.
The backup machine is really just the one I used to keep in my office, back when I went to an office every day. It’s just about as basic as you can get, an on/off switch and nothing else. But I’ve become accustomed to the timer on the broken machine and waking up to the smell of brewing coffee at 7am each morning. I had a few unused smart switches in the IoT box, so I decided to see how smart Home Assistant could make my dumb coffee maker.
Turning the thing on at 7am every morning was easy. My Home Assistant setup already had an automation that ran at exactly that time to stream NPR to the speaker on my nightstand. Two additional lines of YAML and the coffee maker would come on at the same time
- service: switch.turn_on
entity_id: switch.coffee_pot
That’s obviously not very safe. What if I forgot to put water and coffee in the machine one night? Or even worse, what if we were out of town? I needed a safety check, a way to tell Home Assistant that there was water in the machine and it was safe to turn it on. So I added a “helper” to Home Assistant, which is basically a variable that isn’t associated with a specific device, and I updated my automation to only turn the coffee maker on if that helper indicated that the machine was ready to brew. And I used the same automation to reset the helper to indicate that it was no longer safe to start a new brew until I reloaded things.
- condition: state
entity_id: input_boolean.coffee_pot_ready
state: 'on'
- service: input_boolean.turn_off
entity_id: input_boolean.coffee_pot_ready
- service: switch.turn_on
entity_id: switch.coffee_pot
Now that I had auto-on working, I decided that I also wanted an auto-off feature. The broken coffee maker had a thermal carafe, so it didn’t need to sit on a hot plate all day over-cooking the coffee. The backup coffee maker had a glass carafe and a hot plate. To avoid burnt coffee and to save a bit of electricity, I wanted to transfer the fresh coffee to a thermos once it was brewed. Having the machine turn off an hour after it turned on would help with that. But simply turning it off at 8am wasn’t the best solution. What if I forget to set things up one night and then end up brewing a pot manually at 9am the next morning? So I set up a new automation to turn the machine off any time it has been on for an hour.
- id: 'coffee_pot_1h'
alias: Coffee | 1h
trigger:
platform: state
entity_id: switch.coffee_pot
to: 'on'
for: '01:00:00'
action:
- service: switch.turn_off
entity_id: switch.coffee_pot
I could take this a step further and also have it send me a notification letting me know that it’s time to transfer the coffee to a thermos if I don’t want it getting cold on the counter.
The most annoying part of all this was that I still had to manually open Home Assistant and toggle on that helper every night when I put water in the coffee maker. Find phone, unlock phone, launch app, find helper, toggle helper. I could use a Home Assistant home screen widget, but that still required picking up my phone. I needed an easier (and more fun) way. So I turned to iOS Shortcuts, which I already use quite a lot with Home Assistant for just this kind of thing. A simple, two action shortcut provided the missing link I needed.
With this in place all I have to do every night is yell at the HomePod, “Siri, arm coffee pot!” and I know there will be a fresh pot of coffee waiting for me in the morning.
First of all, I should say that if you’ve done even a small amount of research about this topic, you probably won’t learn anything new here. I don’t have a magic cholesterol secret to share. If anything, I’m here to say that everything you’ve been told before about diet and exercise is right. This is the story of how I acted on that knowledge to make meaningful change in my own life.
I’m in my mid-forties and when my doctor told me my LDL was 165, I wasn’t all that worried. All my other numbers were in the normal range and my HDL was 65, which is very good. And more than a few of my friends reacted with “165 isn’t that bad”. Even so, I wondered what could be done to improve things without resorting to taking a statin for the rest of my life. I at least wanted to do what I could to delay the need for maintenance drugs as long as possible.
We had quantified the problem and, as an engineer, my first instinct was to try and quantify the solution. That approach has paid off. As of last month my LDL is down to 105. Still a bit higher than I would like, but a huge improvement. This is just the beginning and there is still a long way to go, but here is how the numbers have guided me so far.
When I started researching the topic, I quickly realized that there was one number in particular that I needed to start paying a lot more attention to on nutrition labels: saturated fat. Sources I trusted said that I should be limiting my saturated fat intake to anywhere between 5% and 7% of my caloric intake.
I also learned that I was already doing a lot of good things. I had long been eating lots of fresh fruits, veggies, nuts, and whole grains. While I did eat a fair amount of fatty meat, I rarely ate fast food or highly processed food. My biggest downfalls were butter and cheese. The latter being one of my all time favorite foods and not something I was willing to give up cold turkey.
I started tracking everything I ate and the numbers were not good. I was nowhere near that 7% mark. I eat about 2500 calories a day, 7% of which works out to about 19g of saturated fat. So I started making changes.
Butter is roughly 65% saturated fat. A single tablespoon of the stuff contains more than a third of my allotment for an entire day. Sufficed to say, butter is no longer a measurable part of my diet. I don’t even buy it any more. The only time I consume it now is when it’s in restaurant food or something someone else cooked. I’ve replaced it in most cases with olive oil and I occasionally use vegetable shortening when baking.
Most cheeses are about 45% saturated fat. One ounce, or a 1 inch cube, contains about 5g. But I love cheese and most of the plant based alternative products have just as much saturated fat because they’re made with cashews. So my strategy was not total replacement, but rather reduction and adjustment. I stopped eating pizza entirely. When I do eat cheese, I weigh it and limit myself to 1 ounce. And I try to opt for lower fat varieties. Feta and goat cheese have become staples in my fridge, but there are plenty of other options. I just make sure to always check the label and try to buy things with 3g of saturated fat or less per ounce.
A single hamburger, especially if there’s cheese on it, can easily exceed my entire allowance of saturated fat for a day. And most cuts of beef aren’t much better. A 4 ounce serving typically contains 5–10g or more. Luckily, I wasn’t a big beef eater before, but I still saw room for improvement in this area. Now days, the only cut of beef I eat is top sirloin. A 4 ounce serving contains 2–4g of saturated fat.
Non-fat greek yogurt has become my culinary Swiss Army Knife. I use it to concoct healthier replacements for mayonnaise, sour cream, heavy cream, ranch dressing… the list goes on and on.
I’ve always enjoyed a warm bowl of steel cut oats and in the summertime I have been known to stir some rolled oats into my morning yogurt. So I decided to double down. I now start the day with oatmeal 3 times a week, usually with a handful of walnuts and some fresh berries.
I have made a number of smaller changes to my diet. They might be a bit more controversial and I’m not sure they have had nearly as much impact on my LDL as the things I’ve talked about above, but here they are.
I had already been “exercising”, but not very seriously. A 30 minute walk after dinner a few times a week was about all I could claim. And sometimes that walk included a stop at a coffee shop for dessert. The experts recommend 150 minutes of moderate activity per week, so there was lots of room for improvement.
This is an area where timing was fortuitous. My partner had been wanting to join a gym and do some weight training, so I decided that I would tag along and start doing some more serious cardio.
I started doing 30 minutes on a treadmill 3 times a week. At first, 25 minutes of that was brisk walking and 5 minutes of jogging. Over time I have improved that and I am now doing 15 minutes of each. I wear a fitness tracker and during a workout my heart rate usually gets up over 125 BPM for about 15 minutes and over 150 BPM for at least a few minutes.
That’s not too bad based on recommendations for someone my age. I’m not doing 150 minutes per week yet, but what I am doing seems to have paid off. It’s impossible to tell for sure, but I suspect that this moderate change in physical activity has had just as much impact on my LDL as the dietary changes I’ve made.
I’m not going to tell you these changes have been easy. A lot of discipline is required not only to avoid unhealthy habits, but also to continuously measure and evaluate my progress. I record everything I eat to be sure I stay below that 7% threshold.
That said, I am probably at a point where I could ease up a bit and be less stringent. Instead of tracking every calorie I eat, I think I could simplify things by only counting grams of saturated fat and limiting myself to 15g each day.
Regardless, the one lesson this experience has reinforced the most for me is that it is just as important to quantify the solution as it is to quantify the problem.
The unexamined life is not worth living — Socrates
Warning: this post contains spoilers for the movie Saltburn
I recently watched Saltburn and about half way through, it struck me that I’d heard this story before.
A young man of lesser means adopts a more affluent identity to win the affection of another young man of higher social status. Once he earns that affection, he eliminates that other man and proceeds to insert himself into the newly created void. He attempts to win the loyalty of the other man’s friends and family in service of his ultimate goal of winning over the head of the family, effectively replacing the other man as their heir. Along the way he eliminates anyone who impedes his progress.
It’s a good story. In the case of Saltburn, the telling leaves a bit to be desired. There is a certain lack of nuance that I found annoying. I much prefer the storytelling style of another movie with the same plot: The Talented Mr. Ripley.
Last week, I got a new MacBook Pro for work. Within a day I noticed something very annoying. The function keys for adjusting the brightness of the keyboard backlight that I had become accustomed to on my previous laptop were gone. One had been replaced by a key for dictation and Siri and the other with a key for toggling focus. I have very little use for either of these and I wanted my backlight keys back.
My first thought was that I might be able to fix the problem with keyboard shortcuts, but those hopes were dashed after a quick visit to System Settings->Keyboard->Keyboard Shortcuts where I found no such option.
So I turned to my search engine of choice to try and find a solution and after about 30 minutes I found a couple different options.
One was a LaunchAgent, which seemed workable enough, but I wanted something less invasive that wouldn’t require a reboot. That lead me to this script that leveraged the Mac’s built in hidutil command line tool.
Five minutes later, with a little help from Automator’s “Run Shell Script” action, I had my keyboard backlight keys back. Here’s the exact shell command I used:
hidutil property -s '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc": 0xC000000CF,"HIDKeyboardModifierMappingDst": 0xFF00000009},{"HIDKeyboardModifierMappingSrc": 0x10000009B,"HIDKeyboardModifierMappingDst": 0xFF00000008}]}'
And to prevent things from reverting every time I reboot the Mac, I saved the resulting Automator workflow as an application and added it to my login items.
Senator Sinema announced Tuesday that she won’t seek reelection this fall. That’s good news.
I first became aware of Kyrsten Sinema twenty-ish years ago when our local NPR station did a profile on her. At that point she had just been elected to the state legislature. She was a breath of political fresh air. She was raised LDS and later left the church. She did a stint in the Green Party. She was openly bisexual. She had experienced homelessness as a child and then gone on to earn a masters degree in social work. We Americans love a good comeback story.
When she left the state house and won a seat in the U.S. House of Representatives, it was in my district and I became one of her constituents. In that capacity, I was very happy with her and voted for her reelection multiple times.
But when she moved to the Senate, something changed. Maybe it was the timing. Maybe she was trying too hard to position herself as the next John McCain. I don’t know for sure. What I do know is that while Representative Sinema was all about the residents of her district, Senator Sinema has been all about Senator Sinema.
This was reflected a bit in her statement this week, saying that she would not run because her political style “is not what America wants right now”. When what she should have said is that it “is not what Arizona wants right now”. And she’s right.
At the end of the day, her choice not to run is a good thing not only because she hasn’t been an especially good Senator, but also because it avoids a messy three way contest for her seat. Had she run as an independent, she almost certainly would have lost, but in doing so she would likely have pulled votes disproportionately from the Democratic candidate, increasing the chances of us ending up with Senator Kari Lake.
Roughly a decade ago, when I was first starting to learn about cryptocurrency and blockchain technology, I had lunch one day with a good friend at a local burger joint. When the check came, he offered to pay and passed his credit card to the server. Being a believer in good etiquette, I started to reach into my pocket to offer him some cash for my portion. That’s when one of those cartoon light bulbs went on over my head.
Knowing my friend to be a very curious person, I offered him some Bitcoin for my hamburger. He was intrigued and right there, sitting in the restaurant, I explained to him the basic concepts of crypto. Fascinated by all this, he downloaded a wallet app to his phone, flashed me a QR code, and I sent him what we had calculated to be a fair amount of Bitcoin. That amount was 0.08 BTC.
For a few years, as crypto valuations fluctuated, we joked about how much I paid for that hamburger. Today, I don’t think of it nearly as often as I used to. But the last few days, as Bitcoin has flirted with all time highs, I can’t help but smile at the realization that had I held onto that 0.08 BTC, it would be worth over $5k.
This morning, Apple released a new MacBook Air with the M3 Apple Silicon processor. And the iMac has had the M3 for a while now. This makes me all the more hopeful that we may see an M3 Mac mini sooner than later.
I’ve been a fan of the diminutive Mac since it was first introduced in 2005. I owned one of those original G4 models briefly before upgrading to the Intel Core Solo version and I’m writing this on a 2018 Intel i5 Mac mini.
For almost two decades, the Mac mini has been my primary Mac. I love the flexibility of its “bring your own KVM” model. And the compact form factor makes it easy to use in smaller spaces like my cluttered office. I don’t mind the limited expandability. I’m one of those freaks who owned (and still loves) the G4 Cube. The mini strikes a near perfect balance for my particular needs.
I’ve been putting off the move to an Apple Silicon Mac mini since the M1 was announced. As enticing as Apple Silicon is, my Intel model still does a pretty good job at the tasks I use it for most. It can even run Cities Skylines passably well with its integrated graphics chip. And it supports the latest version of MacOS, although I suspect that may not be the case for much longer.
If Apple does release an M3 Mac mini this month, I may finally pull the trigger. It’s probably too much to hope for a space gray option.