Phone upgrade time

It's that time of the year again: phone upgrade season.  

This one was a long season.  It's been a while since my last phone upgrade - almost exactly four years, actually.  My previous phone (and my wife's - I generally get us the same thing) was a OnePlus 5 which I bought in September of 2017.  It was a really nice phone and, to be honest, I didn't really want to upgrade.  I mean, why spend $500 on a new one when the one you have is perfectly fine?

However, this time I didn't have much choice.  A month ago I got a text from Cricket telling me that my phone would stop working on their network in February.  Apparently, this is due to the retirement of their 3G network.  For your phone to keep working, it has to support "HD Voice".  Of course, I had no idea what the heck "HD Voice" was, but a quick search revealed that that's just AT&T's nicer sounding term for VoLTE (Voice over LTE).  And, sadly, the OnePlus 5 does not support VoLTE.  At least, not out of the box.  In a previous version of the firmware, there was an experimental setting in the debugging utility that allowed you to enable VoLTE and voice-over-WiFi, but that seems to be gone now.  And, frankly, I'm not really comfortable with the idea of downgrading the software on my primary communications device so that I can rely on an experimental feature.  Seems like that's just asking for something to go wrong.

So I decided to bite the bullet and upgrade.  I really loved the OnePlus 5, so I wanted to stick with OnePlus.  And as luck would have it, the 8T happened to be on sale.  

When I got the OnePlus 5, one of the "criticisms" of it was that it was grossly over-powered.  I forget what the processor was, but the model I got had 8GB of RAM and 128GB of internal storage.  So it was closer to a decent-quality laptop than a typical cell phone.  And the OnePlus 8T is pretty much the same - my model has 256GB of storage and 12GB of RAM.  So my wife's phone now has more RAM than her laptop.  Is this necessary?  I don't know - maybe not.  But with the OnePlus 5, I noticed that I never had problems with it feeling "slow".  With my previous Samsung Android phones, that did become an issue after a few years, but the OnePlus had enough horse-power to handle anything the app store could throw at it.  So I figured it would be nice to continue that trend.

There's not really much to say about the OnePlus 8T itself.  Like the OnePlus 5, it's really nice.  It runs the same Oxygen OS, so there's no difference in the UI.  And OnePlus's "Clone Phone" utility made it pretty simple to copy apps, settings, and data to the new phone.  (It didn't get everything, particularly in terms of settings, but it got enough.)  In terms of the hardware, the big changes from the OnePlus 5 are:

  • The lack of front-facing "buttons".  Whereas the OnePlus 5 had reserved space at the bottom for the fingerprint scanner and dedicated virtual buttons, the displayable area on the 8T includes the entire pane of glass.  For navigation, you can either use virtual buttons along the bottom, or gestures (which seemed annoying and counter-intuitive to me).
  • Related to the above point, the front camera is in a cutout in the screen.  That's different.
  • The rear camera is friggin' massive!  Four lenses and two flashes.
  • The fingerprint sensor is under the screen.  So you can actually just put your finger in a certain spot on the screen rather than a dedicated spot at the bottom.  The fingerprint scanner on the OnePlus 5 never really worked all that well for me.  In fact, when I had a screen protector on the phone, it basically never worked at all.  But the one on the 8T seems pretty good.  Having a screen protector does interfere with fingerprint detection, but not so much as to make it unusable.

So far, I'm liking the new phone.  It's very much an incremental upgrade to the OnePlus 5, but that's not a bad thing.  I wasn't looking for anything revolutionary - just a comparable phone that would work on a modern network.  And I got that, plus a few bells and whistles.

Cali Move Home Workout Review

My last fitness post was on the CaliMove mobility program. Well, I just finished their at-home program as well. And (spoiler alert) I really liked it.

General Structure

This program is a bit different from the mobility program. It's also different from the Athlean-X strength training programs, in that the workouts all time-based.  The exact details vary depending on what phase of the program you're in, but this means that the length of any given workout is fixed, so you know going into it exactly how long it will take.  Personally, I really liked this, as one of my main issues with the mobility program, as well as the Athlean-X Xero calisthenics program, was that the workouts could drag on for an hour or more.  With this program, you know the length up front and it's never too long - I think they top out at around 40 minutes, which isn't bad at all.

I started this program when I was half way through the mobility program. At the time, it was a good fit because you start out only training three days a week.  Also, they advertise that, while this isn't meant to be done with other training programs, it's OK to do the mobility program at the same time.  If you're going to do that, though, I would recommend staggering them like I did.  As I mentioned, the mobility program ramps up to six days a week and probably an hour or more per workout by the end.  Combine that with four days a week of 30 to 40 minutes of the at-home workout and you've got a pretty long and tiring workout there.

Anyway, like the mobility program, the at-home workout program is six months long, with a one-week de-load half way through.  Each month is a different "phase", with a slightly different training schedule and approach.  The phases vary, with some focusing on circuit training, some doing straight sets, supersets, AMRAP intervals, etc.  They're all challenging and give you enough variation to keep the program interesting and engaging.

In terms of the exercises, there's nothing really new or revolutionary here.  The program is designed to be done at home, with no exercise equipment at all (not even a pullup bar), so there's only so many options available.  So lots of variations on pushups, crunches, planks, lunges, squats, and so forth.  The only thing that requires any "equipment" is the row variations, which can be done with a pair of folding chairs or something equivalent.  But that said, there are actually a lot of variations in this program.  And the exercises rotate and progress as you move through the program, so the workouts stay challenging and change often enough that you don't get bored.

Program Presentation

In terms of presentation, this program is quite different from the mobility program.  Since this one is time-based, each session has a follow-along video (also available as downloadable audio) that tells you the intervals and exercises.  It also has a very spiffy set of graphics that summarize the workout.  Basically, they're animated GIFs that show the exercise, the time on and off, number of repetitions, and an indication of the workout flow (so for circuits the images flow together).


I have to say, I really like this presentation.  Of the programs I've done so far, this is by far the most visually interesting and and easy to follow workout summary.  Once you get used to it, you can get all of the information you need in a single glance, without having to search the page or think about the instructions.  This is especially nice for the circuits and supersets.  When dealing with simple text presentations of more complicated flows, I find that it's easy to get lost when I start to get tired.  The graphics make it easy to reorient yourself and prepare for the next exercise, while the video helps keep you from getting lost in the first place.

The rest of the program presentation is also quite good.  Each phase starts with a brief video overview describing the approach and a set of demo videos for the exercises employed in that stage.  As usual for CaliMove, the exercise demo videos are exceptional.  Each phase also has an Excel spreadsheet that you can download to track your progress.  This is a little inconvenient, in that it's a little hard to compare between phases with each one being a different file and the spreadsheet doesn't break down sets, but that's not a big deal.  With a calisthenics program there's no weight to track, so really all you care about is that the number of reps keeps going up.  Besides, if you don't like it, you can always track things on your own, whether in your own spreadsheet or just on paper.


I also purchased the "nutrition upgrade" with this program.  The base program is just the workouts - it doesn't come with any kind of nutrition information, or eating plan, or anything like that.  If you want that stuff, you have to buy it as an add-on.

The nutrition upgrade was...fine, I guess.  I watched the videos and read the PDFs, but ended up deciding not to follow the nutrition program.  It had a lot of good information, as well as some that seemed iffy.  There was some mention of "detox" and a couple of other things that made me cringe a little.  For the most part, though, it seemed sane and reasonable.  As I recall, the plan involved using food categorization and relative portion sizes to reach specific macro targets that change week by week.  To me, it seemed like yet another way to track macros without actually tracking them. 

Personally, I didn't care for this approach and ended up just doing plain-old food tracking with Cronometer.  I was already in a place where I was eating a healthy, balanced diet, and just needed to change my energy balance a little to drop 5 - 10 pounds.  I was up to close to 170lbs after the holidays and wanted to get down to around 160, so I tried to cut my calorie intake back by an average of 250kcal per day (give or take - some days I was at maintenance, others I was 500 under) for five or six months.  That worked well for me and averaged out to around half a pound per week of weight loss.  I know some people really hate tracking their food, but I don't mind it all that much.  At least, I don't really find it any more painful than the "no-tracking tracking" alternatives like this program uses.  I'd rather just look at the numbers than have to figure out what group and portion size each of my foods fits in.  But that's just me.


Overall, I really liked the at-home program.  It's extremely well presented and easy to follow.  The workouts themselves are good and stay challenging, despite the lack of any equipment.  I also really liked the relatively short duration and fixed time.  If I had it to do over, I wouldn't bother with the nutrition upgrade, but if you're looking for a more structure nutrition plan, then maybe it could be helpful to you.  But if you're looking to stay in shape, get a bit stronger, and do it at home without equipment, then I highly recommend this program.

New fitness toy

So the other week I saw a cool toy I've been wanting on Amazon, and it was a good price.  No, not a tech gadget this time - a new set of dumbbells.  And since I didn't want anything for my birthday, my wife gave the approval to order them.

Specifically, I got a pair of PowerBlock Elite EXP dumbbells.  These things may look like toasters, but they're actually adjustable dumbbells that can go from 5 to 50 pounds in 2.5 to 5 pound increments.  The big selling point is that they adjust quick  You can do 10 pound adjustments just by moving a pin, which is super fast.  The 2.5 and 5 pound increments are little more involved, as those are adjusted by removing weight cylinders from the handles, and you can't do all increments, but it's still just pulling the pin, flipping a lever, and dropping a cylinder in or out.


Compare this to my old set of dumbbells, which adjusts up to 52.5 pounds.  It adjusts in 2.5 pound increments (and does all of them), but does it by swapping out plates and securing them using a screw clamp.  It works fine, but it's slow.  So, for instance, my current program has a bunch of supersets in it, and for most of them I'm using different weights for each of the two exercises.  So the "go immediately into the second exercise" was actually more like "spend about a minute changing the weights and then go straight into the next exercise".  Clearly this is not ideal in terms of executing the program, and it also stretches out the workout.

I'm pretty happy with them.  They took a little getting used to, but after using them for a week or two they work pretty well.  My main complaint is that the instructions were a little iffy.  It took me a little playing around to figure out exactly how to put in the pin, which direction things went, and so forth.  But it's not complicated, so it just took a few minutes of messing around.

On the down side, Amazon is now sending me suggestions for the thing I just bought.  They did the same thing when I bought my new laptop on Prime day.


I'm sure at some point Amazon will fix this, but it doesn't exactly say much for their recommendation AI.  I mean, this recommendation is a different model and a lighter weight, so it's not exactly the same thing, but come on.  Can one of the biggest tech companies in the world, with huge amounts of computing power and legions of brilliant people devoted to building their recommendation systems, really not figure out that I don't need to buy a slightly different version of the thing I just bought from them?  

I don't know - maybe there's a good reason for that and I just don't know enough about Amazon and/or machine learning.  It's just a really annoying thing that seems like it should be an obvious thing to fix.  Heck, I would imagine that the machine learning systems might even pick up on that on its own.  I mean, do people who buy a thing really buy it again a week later that often?  I'd think those numbers are all fed into the recommendation system and that they'd be low enough that the algorithm would drop recent purchases (especially larger ones) off the recommendations.

Then again, maybe the algorithm knows something I don't.  Maybe people re-buy the same thing all the time.  It could be they even do that with items that cost hundreds of dollars.  I doubt it.  But what do I know?

Well, this answers my NFT question

This morning I finally took a little time to read a few articles about NFTs.  Specifically, I was interested in what you actually get when you buy an NFT.

As I'd written in a previous post, this was kind of confusing to me.  I mean, I got the technical aspect - that an NFT is a blockchain transaction that's tied to some file that lives outside the chain.  So you have an immutable record that the transaction happened, which is good.  But when you read about people paying hundreds of thousands, or even millions of dollars for an NFT, what did they actually get for that money?

The short answer is: it depends.

It looks like, legally speaking, it depends on the terms of the sale agreement.  It's possible that a high-priced NFT was purchased under an agreement that transfers full ownership and copyright rights to the purchaser.  However, it's also possible that all they got was that transaction on the blockchain.

It seems like the default is that buying an NFT is like buying a collectible, but in digital form.  Think of, say, a limited-edition collectible like a toy, coin, or something similar that comes with some sort of certificate of authenticity.  When you buy it, you get the physical item, but you also get documentation with some sort of serial number and proof that that specific item was sold to you.  Having that kind of provenance can, in and of itself, be very valuable to collectors.

However, while it might be understood that the supply of a limited-edition item will be fixed, you generally aren't guaranteed that.  There's not necessarily anything to stop the manufacturer from making a crap-ton more of them and flooding the market, thus diluting the value of your purchase.

That's kind of like how it works with NFTs.  Unless you have a contract that says otherwise, it seems like you can't generally assume that you get anything other than the digital equivalent of a proof-of-purchase.  You get the exclusive rights to that certificate, but the only rights you get over the work associated with it are basically the rights of private ownership, i.e. to have and use it for your own, personal purposes.

To my way of thinking, it's kind of like the difference between buying an e-book from O'Reilly and downloading the same e-book from a torrent site.  Either way, you have a copy of the book that you can read.  Either way, you can give your friend a copy of it to read.  But if you buy it, you have a receipt to prove that you bought it.

Is there some value in that?  Yes, I think there is.  I can especially see that in the case of a "digital collectible", where a significant portion of the value could be in just having them in your collection.  (I do think paying large amounts for that is silly, but I also think paying large amounts for physical collectibles with no intrinsic value is silly.)  But for cases where there's no physical asset, and no ownership rights over the original digital asset, and nothing to stop the creator from minting more tokens for the same asset...?  I have a hard time imagining a "certificate of authenticity for Jack Dorsey's first tweet" being worth $2.5 million.

So I'm moderating my position a little.  I'm not going to say that all NFT is just dumb.  Depending on the transaction details, it can be a useful thing to buy.  But I think it really depends on the details.  I mean, if all you're buying is a "certificate of authenticity" for something that somebody else owns and anyone can get for free, that seems kinda silly.  And paying thousands of dollars for something like that seems really silly.  So while NFT might not be totally worthless, I still think a lot of the high-priced transactions we read about are nothing but speculation.  (Or money laundering, or tax avoidance, or whatever other financial tricks people pull with collectibles.)

Broken development environment

Author's note: This episode of From The Archives is the stub of an article I wrote on December 10, 2007.  At the time, I was working for eBaum's World (this was back around the time ebaum sold it, but before he was forced out).  It was kind of a weird time because it was my first experience working for an actual tech company.  (It was also a weird place to work, for other reasons, but that's a different story.)  Previously, I'd been stuck in the world of public-sector internal IT which is...not great, by comparison.

This particular post was expressing my annoyance over how our development environment was broken.  Our dev environment, at the time, was literally just a shared server that we all pushed code to. And yes, that means we had plenty of opportunity to step all over each other and things could easily break for non-obvious reasons.

This was obviously terrible, but it's what we had to work with.  We had a four-man development and system administration team with not a huge budget or set of internal resources.  And, of course, there was always something more important to do than improving our dev environment setup.

These days, I still have dev environment issues, but for completely different reasons.  My company has an entire infrastructure for spinning up development VMs, including dedicated host clusters, custom tooling to setup environments, and teams responsible for managing that stuff.  So now I have my own virtual instance of every server I need (which, for reference, is currently about eight VMs).  However, there are still some holes in that infrastructure.

Part of the issue is that we have a lot of teams that share or depend on the same infrastructure and/or services.  For instance, one of the services that my team maintains is also worked on by at least three other teams.  And we all share the same database schema, which doesn't automatically get updated in dev environments when changes are made in production, so when you pull in the develop branch, you frequently get breaking changes that you may not have ever heard of, usually in the form of config or database changes that aren't set in  your environment.  Sure, everything "just works" if you start fresh, but nobody ever starts fresh because it takes too long to spin up all the required pieces and set up the test data.  (However, we are moving toward a Docker/Kubernetes setup for the pieces that don't need test data, so things are moving in the right direction.)

Not that I can complain too much.  Even for my personal projects, which are much simpler, my dev environment is frequently in disarray.  Things get out of date, permissions or services don't get correctly configured after an update, or my setup is out of sync with the production environment.    In fact, I had that problem just the other day - I pushed some code for this blog that worked fine locally, but broke on the live server because it was running a different version of PHP.  Granted, the code in my dev environment was wrong (and I really should have caught it there), but that's not the point.

The point is that environment maintenance is hard and dev environment maintenance doubly so because it changes frequently and is of much lower priority than production.  That's something I hadn't really had to worry about in my internal IT job, because I was writing desktop apps and everybody was running identical Windows desktops.  It was a a simpler time....

This week's installment of "Pete's list of things that suck" features broken development environments.  I spent the last couple of days at work wrestling with one and it really, really sucks.

The thing is, our development environment is...really screwed.  Things went really bad during the production server upgrade a couple of months ago and we had to hack the hell out of the code just to keep the site running.  As a result, we had all kinds of ugly, server-specific hackery in production which just plain broke when we moved it back into devel.  And since, of course, we have a huge backlog of projects that management wants implemented, we've had no time to go back and reconfigure the development servers.

This week, I've been trying to test some changes to our user upload process.  However, due to some NFS misconfiguration and some code problems, uploads just plain don't work in our main development environment.  We do have a new, additional set of development servers (well, one box with a half-dozen virtual machines, but you get the idea), but I couldn't get those to work either.  Part of it was that the configuration on those servers was incomplete, and part of it was that Firefox sucks.  (Note from the present: I no longer remember why that was.)