I decided I wanted a means of tracking progress toward my 1,000 miles of cycling by September 1st. So this weekend I threw together a C++ library and tool to read a fairly simple JSON data file and emit chart.js plots and a table.
The JSON file is pretty straightforward. All I need to do after each rides is add a new entry to the “rides” array. I split the lines in the display below, but in reality I have a single line per “ride” entry. It’s easy to add an entry since I just copy one and edit as needed. The order of the “rides” entries doesn’t matter since my library will sort them by the “odometer” field as needed. So I always add my latest ride as the first “rides” entry just because it’s the fastest (no scrolling).
Note that the “odometer” field for each ride is my bike odometer reading at the end of the given ride. This lets me compute the miles for the given ride by subtracting the odometer reading for the previous ride. In the case of the first ride, I subtract the “startMiles” which represents the odometer reading when the goal is created.
From this simple file I can generate useful charts and a table. I wrote a CGI program that utilizes the C++ library and can emit charts.js graphs and and HTML table. I can embed these with iframes in a web page. That’s exactly what I’m doing to track my progress. You can see these at https://www.rfdm.com/Daniel/Cycling/Goals/20240901.php. And I can of course embed them here too!
One of the things that’s cool about this is that it’s really easy to create a new goal file and just update it after each ride. I can create shorter goals in new files. I can easily change the goal miles or goal time as desired.
I’ll probably create a command line utility to allow me to add rides without editing the file directly. Mainly because I can use it to sanity check input (say an incorrect date/time), and of course can make it a secure client/server application. And at some point I might make an iOS app that can grab the relevant data via HealthKit APIs so I don’t have to type at all.
Having met my “500 miles by July 1” cycling goal, I’ve set the next goal of 1,000 miles by September 1. It may or may not be realistic, but it’s a goal.
I’m at 515 miles on my bike odometer as of today. But today I confirmed that my bike odometer undercounts by around 10%. I’ve known it was undercounting for a while since it never matches what Apple Maps, Google Maps and my vehicle odometer says for my typical routes. But today I used the Apple Workout app for the first time, and it recorded 11.45 miles while my bike odometer recorded 10.4. I think this is probably because the bike computer wheel size setting assumes a more standard 26″ tire (say a 1.95″), while my bike has fat tires (4″). I’ll see what I can do to tweak it tonight. If I can get it to roughly match what Apple Workout records, I’ll be happy. I’m mainly after consistency here.
I should have explored the Apple Workout app a long time ago. Especially since it records calories for a ride, which I’ve wanted for a long while. Well duh, it’s there. Along with a bunch of other useful data.
From today’s ride, my first ride recorded by Apply Workout:
This is awesome data to have. Now I just need a handlebar phone mount so I can keep track of my heart rate easily during a ride.
Just 9.2 miles today. It’s kinda swampy outside. Overcast, 76F, 84% humidity. The dirt roads were muddy in a few spots. Assuming it doesn’t rain again, I’ll likely go out again near sunset.
But… I met my “500 Miles by July 1” goal that I had set at the start of the season. I wish I had kept better track of miles per day, just so I’d know how many days of riding it took to get here (and hence whether or not my new “1,000 Miles by September 1” goal is a good goal). There have been quite a few ups and downs mileage-wise, largely weather dependent.
I’m going to create a trivial PHP class to track miles. I likely won’t use it here in my blog, but elsewhere on my web site.
At any rate, I have cause for celebration. 500 miles isn’t a lot for a dedicated cyclist (which I used to be). But for someone my age who hadn’t done much if any riding in a long time, it turned out to be a near perfect goal. It pushed me to go out every day I could, and to tack on make-up miles when I had to skip a day, but wasn’t unrealistic.
I can thank the e-bike for making it possible to start from the bottom fitness-wise and make the rides as hard as I can handle at any given moment, and for letting me go faster and hence use the bike for errands I would normally do in my truck just due to the time it takes to do it on one of my acoustic bikes. Some of this is of course just a function of my e-bike being a full-suspension fat-tire bike which allows higher speeds on the dirt roads which often have very rough spots. It’s pretty terrible for cornering (slack head angle, long wheelbase), but it’s good for blasting over bad washboard and deep potholes filled with mud and water. Not to mention not having to slow down when I need to ride a runoff-carved mess of a shoulder to let a vehicle pass me.
As of last night I’m at 491.4 miles. An add-on ride on Monday night with my friend Matt contributed. Thanks Matt!
I’m doing OK calorie-burning-wise as near as I can tell from what my Apple Watch records. I’d like to get closer to 1000, but I’m OK being above 500 on average for now. The trouble getting to 1,000 is just the amount of time required.
My weight is slowly coming down. At the start of the season I was around 178 to 180 pounds in the morning. I now seem to be at 169 to 170 in the morning. As of yet it’s not really something I can feel, and I consider these the ‘easy’ pounds to lose. The hill always gets steeper when I’m trying to lose weight.
I’m still looking at what to do about jumping rope. I still have one of my old leather speed ropes. But I need a mat:
On concrete my speed rope won’t last long.
Concrete destroys any rope fairly quickly.
My old joints don’t really want to jump on concrete, regardless of shoes.
Running shoes aren’t great for jumping rope since they have a thick heel support that isn’t really used (heel doesn’t touch the ground much when jumping rope) and can also snag the rope on doubles, crossovers, etc. I prefer my wrestling shoes or boxing shoes, but need a cushioned mat to use them. I put a mat my wish list on Amazon that I think will be fine.
Why jump rope? It burns a lot of calories fairly quickly, I can do it in the rain, and I can do it in the winter in the garage. It also uses muscles that don’t get as much of a workout from cycling.
I’m at 475.1 miles after today’s first ride (12.8 miles). My usual trip to the local gas station for hydration, then to the local dairy farm for chocolate milk. I’m a little bit ahead of schedule on my goal (it won’t take me 6 days to get another 25 miles), but the new “1,000 miles by September 1” goal is set so there’s no harm in getting a tiny head start.
I’m still somewhere in the neighborhood of 8 pounds of weight lost (though my scale would tell you I’ve lost 11 as of this morning, we all know how weight goes up and down by hydration level, etc.). So on the weight loss front, I’m behind my goal of 20 to 25 pounds by September 1. I suspect a tiny amount of this is just a simple increase in muscle mass, almost all of it quadriceps. Not an excuse, just a reminder that I need to be aware of the limitations of just measuring weight and that I unfortunately don’t have a means of measuring body fat. All I can say is that my body fat remains significantly higher than I want, and hence I still have plenty of work to do. I do know I’ve gained some quadricep muscle; my jeans feel a bit more snug in the legs. But I’ve a long way to go. Bring it on, of course!
Since it’s construction season in Michigan… I got stopped for a bit by road construction today, on what is normally a high-effort part of my ride (a decent climb). And my Gatorade bottle leaked on my way to the dairy farm, so I had to stop and wipe off the mess it made all over my rear bag, mounting rack, chain stays, derailleur and rear brake disk. Doh!
Before the start of the cycling season, I set a personal goal of putting 500 miles on my e-bike by July 1st. It wasn’t a well-calculated goal, it was an “I think I can do it” goal. But it has motivated me to go out even when conditions haven’t been ideal. During the heat wave this past week, for example (temperature in the 90’s, high humidity). Or when it’s been muddy. It has also motivated me to make up miles when I couldn’t go out on a given day.
Weather permitting, I will make my goal. I haven’t reset my trip odometer since the start of the season.
My typical daily ride is 8.5 to 9 miles; to town and back. On some days it might be as little as 5.2 (to the dairy farm and back), on others I’ve done a bit over 20.
At the start of the season, I was always riding at pedal assist level ‘ECO 4’, and occasionally using the throttle on steep hills. I haven’t used the throttle in at least 4 weeks (I’ve lost track). And many of my rides are now at ‘ECO 3’ pedal assist. I’ve never used the ‘SPORT’ assist levels so I don’t know what they’re like. But my goal isn’t speed, it’s enjoyment and exercise. I pedal hard as long as I can, then back off to let my legs recover, then go hard again. Since my typical route is now well-known, I know what I can do cadence and torque wise without needing throttle, and keep pushing myself.
My e-bike is very heavy. I haven’t put in on the scale, but according to the manufacturer, it was about 88 lbs as configured. It’s a fat-tire bike (26×4″ tires), full suspension, with a rear fender, rear rack, dropper seat post and a front light. It’s mid-drive, with a 910Wh battery and a rack for the extender battery. It’s almost 4X the weight of my old rigid mountain bike.
I’m getting as much exercise as I get on my acoustic bikes, if I trust the numbers from my Apple Watch. The exercise is different, however. It’s been almost all legs. This is mostly due to it taking time for me to adapt to pedal assist and full suspension; it still feels very awkward to pedal out of the saddle. I’m getting more comfortable, I think I’ll be out of the saddle while pedaling more frequently by the end of July. Locking out the front suspension while riding roads would make pedaling out of the saddle less awkward, but I’m avoiding that just to see if I can adapt by the end of the season. It’s not the front suspension alone that makes it awkward, it’s the combination of suspension and torque-sensing assist. I’ll get there, but at the moment it’s still awkward. Especially given the fact that this is my first non-ridgid bike. I’m an old BMXer (at one point long ago I was ranked 74 out of more than 13,000 in the Expert class for my age group), so I kept riding rigid bikes as long as I could.
I’m going further than I do on my acoustic bikes (which are both fully rigid). While part of this is due to the pedal assist allowing higher average speeds with the same effort, the big part for me is just the comfort. I have arthritis in my right hand and wrist from a long-ago car accident, and the rigid bikes induce enough pain on the dirt roads I ride to shorten my rides. There’s only so much pain/tingling/numbness I can tolerate before it becomes a little bit scary to keep riding. I could probably remedy some of this by moving my rear derailleur shifter and rear brake to the left side so I could ride left-hand-only more often, but then I’d be making big mental adjustments every time I rode the bike with swapped levers. Not worth it when I have a fully suspended e-bike on hand that I can use for the bulk of my rides. I’m not just covering more ground, I’m on the bike longer (more minutes).
I seem to be burning anywhere from 330 to 900 calories per ride, depending on the length of the ride. 900 is uncommon (those few 20 mile rides). I’m not sure of my average. If I had to guess, my median is around 400 calories. I do know that I’ve lost somewhere around 8 pounds, so the calorie tracking from my Apple Watch and counting intake calories (roughly) is working for weight loss. Given that my weight loss target was 20 to 25 pounds, I still have a long way to go. But… it’s working.
I’m not going to get to ‘fighting weight’ (which for me would be around 145 pounds); I’m too old for that. But can I get from where I was at the start of the season (about 180 pounds) to say 160 or 155 pounds? I think so, but it won’t be easy. I’m 5’8″. This morning the scale said 169 pounds.
Short horizon, I need a new mileage goal. Michigan summers are unpredictable weather-wise. We had a very warm spring (as did much of the northern hemisphere), which was good and bad cycling-wise. So far I’ve been able to tolerate the 90+F humid days, by staying hydrated and keeping my average speed a little over 15 mph (the breeze helps a lot). And while we’ve had some rainy days, it hasn’t been too bad (the rain doesn’t bother me, it’s cleaning all the mud off the e-bike that puts a damper on some days).
But I’m going to be bold and say “Reach 1000 miles for the season by September 1”. I honestly don’t think I’ll get there since that means about 60 miles a week, but it’s just a goal. I’ll have to bump my average ride a bit, which isn’t a big deal. The hard part will be the make-up days, and I can’t predict how many of those I’ll need since it depends on weather and other factors.
Anyone who remembers enjoying cycling in their youth but feels like they can’t do it now due to age, weight, cardio fitness, whatever… take a ride on a e-bike. It might change your perspective. I was very out of shape when I started. And I’m still a long way from ‘fit’. But I haven’t had this much fun getting exercise since I was young, and with the right bike, you can ramp up from zero effort to whatever level you want at whatever pace suits you. I think it’s a game-changer for a lot of us. And as a bonus… a lot of my small errands are now done on my bike, not in a vehicle. Trips to the local dairy farm for milk, trips to the local party store or pub… it’s a lot more fun, it’s a much smaller carbon footprint, and it’s way less expensive than gasoline or EV charging. Moving a 45 to 85 pound bicycle uses a lot less energy than moving a many-thousand pound vehicle, even if you don’t pedal at all!
I’m going to have to figure out what I’ll do when winter rolls around. I do have a set of studded tires, but due to climate change, they haven’t been useful yet. We don’t get nice long periods of frozen ground in Southeast Michigan much these days. It’s more sloppy slushy muddy stuff that makes cycling a lot less fun simply because the ratio of time spent cleaning the bike versus actually riding is too high. :(. I did break out my old training jumprope recently, but I’m not yet sure how much rope jumping my old joints can tolerate and I need a new rope (one that can tolerate concrete in my garage for longer than my leather ones).
The AI race continues unabated. It’s interesting to note that Facebook appears to be ramping up their web scraping. Is this their plan B, in response to the EU not being happy about their plans to scrape their own users’ content without their consent? 1 They’ve been banging on my web server’s door harder than anyone else for the last few days. I’ve had them blocked for some time, so I can only assume their recent escalation of probing is their desperation for LLM training data.
I wonder when legislators will figure out that big tech is basically aiming tractor beams at the rest of the Internet. I can’t help but think of the giant eletromagnet on Lockdown’s “Knight Ship” from the “Transformers: Age of Extinction” movie, indiscriminately vacuuming up every magnetic object in its reach.
I have more than a decade’s worth of data for packets that have entered or exited my home network. I recently archived all but the last 2 years or so in cold storage. But I can say with confidence that the traffic to my web site has completely transformed in the last few years. It used to be mostly what appeared to be ordinary people (coming from residential broadband address space), most referred by a search engine or a message board. Today, the legitimate traffic looks the same as old, but it is dwarfed (by more than 4 decimal orders of magnitude) by big tech scraping and ne’er-do-wells using cloud infrastructure for nefarious purposes.
The Internet is quickly becoming another casualty of corporate greed. My self-written firewall automation is currently blocking 1,098,452,334 IPv4 addresses from port 80 and 443. That’s 27.54% of the publicly routable IPv4 unicast address space according to my bar napkin arithmetic. Yikes. Would you swim in a river where more than 1 in 4 of the molecules is toxic?
I still have just two of Google’s /24’s blocked in AS 15169: 66.249.66/24 and 66.249.72/24. But connections from these 2 networks accounted for 58,935 unacknowledged SYNs sent to my home network this week. That’s more than one every 11 seconds on average. Should I assume this is all due to Google looking for more training data to prevent their LLM from telling me to put glue on my pizza? 🙂
Probably worth noting that as of today, I’m blocking more than 20% of the publicly routable IPv4 address space from my web server.
% dwmnet -f /etc/pf.www_losers
Addresses: 831,455,990 (19.36% of 2^32, 20.85% of publicly routable unicast)
Congratulations to Hetzner Online for hosting douchebag of the day (144.76.72.24, i.e. static.24.72.76.144.clients.your-server.de). I’ve had all of Hetzner Online’s address space blocked from my web server for a long time due to this sort of thing (their customers running braindead bots). They’re another AS I’d recommend completely blocking from your web site.
If it helps anyone, here’s a list of the routes currently originating from Hetzner’s AS 24940.