Coursera, Hacktoberfest, and site updates

After putting it on hold for awhile because I was having too much fun with Lollipop (and still am!), I finally finished the entire Google IT Support Professional Certificate, a 5-course specialization through Coursera.

I’ve also contributed a little to Debian and mUzima, after learning about (and applying to) Outreachy, which seeks to give paid internships to marginalized people looking to work with free and open source projects. It would be pretty exciting to be awarded an internship, but I met tons of great fellow applicants through this process, so the competition is pretty stiff!

Now that I’ve been getting more comfortable with Git, I was able to complete Hacktoberfest this year. If you’re new to coding and not sure if you can or should participate, here’s Quincy Larson telling you why you should and how you can get your own Hacktoberfest tshirt.

What have I learned from all of the above? I really love documentation and improving user experiences. I still love Python and I want to keep up with that, but my job hunting is shifting towards documentation and roles where coding overlaps with documentation and support.

Site housekeeping: Originally, I set up jmf.codes with WordPress because it’s what I know, and I had fun hacking and tweaking a theme I’ve used elsewhere for years (GeneratePress). But it’s far more powerful than I need, and it’s pretty resource-intensive for a few pages of mostly text. I’d like to load faster and with a smaller resource footprint, so I’ll be switching over to something else soon. (Probably Hugo, but I keep making versions I love and can’t settle on just one!) I’ll keep you posted.

My lovely friends reading this through an RSS reader should keep an eye out for an updated link once I’ve moved everything over.

short update: new course, more speed tests, and a move

Realizing I could use a little more formal education in the area of systems administration, I am about 95% finished with Coursera and Google’s System Administration and IT Infrastructure Services course. It’s been a good overview, but definitely only covers the fundamentals.

I’ve been running some more speed tests on my Lollipop setup, comparing phone tethering to a cellular modem, as well as the connection options (onboard wifi vs. separate USB dongle). Results to be published in the near future. Here’s a short Lollipop Cloud update, and for friends following along with my journey, help is always welcome in the Lollipop department!

I will be moving soon– not long distance, but to a much smaller space, so things have been a bit hectic around here… and will likely continue to be hectic for a few weeks.

Still, I vow to update this more, despite the fact that my poor old computer is plagued with this (admittedly kind of funny) MacBook Pro keyboard glitch.

Troubleshooting Connection Speeds: T-Mobile cell phone tethering edition

this post was originally published on the Lollipop Cloud project’s blog.

I use my Lollipop as an access point for my devices to “the outside world,” by tethering my Lollipop to a cell phone. After some recent mobile account upgrades, I finally buckled down to do some serious Lollipop work… and discovered my connection speeds are *abysmal*, at less than 0.5 mbps, with two different phones (an iPhone 5S and an LG K20 Plus) on the T-mobile network.

But when using an iPhone 8 on the Verizon network as a hotspot, the connection speed jumped to 4.5 mbps.

These tests were without a VPN, so I was concerned that Unbound and Pi-hole may have been hindering my speeds. However….

It turned out that my cellular plan only allowed tethering at 3G speeds, even though I was under the impression I’d be getting 4G tethering. (“under the impression” as in “the rep at the store *and* the rep on the phone two days later said as much.” But I digress with my bitterness.)

After more digging, not only is it not transparent that tether speed limits are a thing, but the “unlimited 4G tethering” plan (AKA “One Plus International,” NOT to be confused with “One Plus” plan) had been discontinued on August 10, 2018: about two days after I ran these tests. See this post from the Mobile Internet Resource Center about T-mobile’s plan changes.

I got lucky: Because the changes to my account over the last several weeks were documented in their system before the retirement of the One Plus International plan, T-mobile was able to reinstate the One Plus International plan and now I’m seeing perfectly respectable greater-than-4-mbps tethering speeds.

If you’re using a Lollipop as your primary internet access point and you’re noticing sluggish network speeds, you may consider running some tests to compare your cellular connection to a non-cellular connection (such as home or coffee shop internet), and checking with your mobile plan to determine if you’re being similarly throttled.

For the purposes of troubleshooting this issue, I used speedtest.net‘s Android and iOS apps, and the speedtest-cli (command-line interface), installed directly on my Lollipop with apt install speedtest-cli. (For my novice friends: After it’s installed, it’s very easy to use: just type speedtest at the command line and hit enter.)

And if you’re a heavy mobile user on any network(s), the Mobile Internet Resource Center is a wealth of reliable, unbiased information. Some of it is paywalled but I’ve always found plenty of very helpful free information on their site: https://www.rvmobileinternet.com

I hope this helps you avoid similar hassles,

jmf.

Lollipops and Hugo

I appreciated this more formal recognition of my Lollipop contributions to date. Working with Kemonine has been a real “treat” (sorry not sorry), and we are making so much progress! I’ve got myself a little Orange Pi running as a router and data-cap-saver thanks to Pi-Hole.

Note (and an opinion) about data caps and advertisements: unlimited data plans are great, but they’re not quite as unlimited as they appear on the surface: see this post about unlimited data from the experts at the Mobile Internet Resource Center. Many sites and individuals rely on ads for revenue, but ads can be hogs, and are exceptionally annoying if not downright harmful: such as when they trigger migraines, trauma flashbacks, or other health problems. It might seem extreme to sent up an entire device specifically to avoid ads, but for today’s internet, I think of it as an accessibility tool. And I hope that someday we won’t need it, because advertisers will shift towards more ethical practices.

In other interesting news, I learned how to deploy a Hugo site: Gluten-Free RV. Hugo’s really nice. (jmf.codes may be switching over someday in the near future…)

A long overdue post and a new project!

Things are busy! This update is long overdue.

Lollipop Cloud logo is an orange lollipop with a blue wrapper in the background.

I am excited to be a contributor and team member with the Lollipop Cloud Project. The Lollipop Cloud is a small self-hosted cloud for nomads, anyone with limited internet access, and anyone who’d like to avoid having their personal data harvested or controlled by corporate interests.

Our goal is to make it as accessible as possible: ultimately, anyone who can use a personal computer should be able to set up one of these little gadgets and customize it to meet their needs. We are lowering the bar in ways few other projects have imagined. This project means a lot to me ethically and professionally, and I’m so excited to be part of it.

Read a full summary of the project here.

Lollipop’s documentation lives on its own self-hosted Gitea instance, and I’ve been busy. This is where I’ve been spending most of my time lately.

P.S. I still hate git. But I’m getting better at it.

a quick update: wordpress, plugins, css

  • The Whisker Shop has grown a bit… and then I realized the Responsive Lightbox plugin I’m using for the catalogue has stripped all my alt-text from the thumbnails. I think of “responsive” as more than just screen size: it’s about how the screens are being used. So that was disappointing.
  • So I’m working on getting my favorite Lightbox, from Lokesh Dhakar running manually. It’s been tricky, but a test page is semi-functional, although it needs work. (The images don’t cycle through, even when tied to a common gallery name.)
  • CanITowThis.com got a mini-makeover to simplify some text styling and to get fancy with a wide-screen view, where the definitions are side-by-side to the form. Thank you to everyone for the feedback about not seeing the definitions when they’re so far down on the page below the form.

I’ve been learning WordPress!

I’ve actually been using WordPress for years, but I didn’t do much tinkering with it. This site is a slightly-tweaked WordPress template I’ve loved for years. (GeneratePress, and the paid version is worth every penny.)

But it’s so popular and powerful, I wanted to dig deeper into it. So I converted The Whisker Shop over to WP and did a lot of tweaking and tinkering… I’m still not thrilled with the catalogue/gallery page, because I want to be able to include a link to each item’s page from the gallery images, and it looks like a hot mess with everything I’ve tried so far. It looks like I’m not the first person to have this question in the plug-in’s forum, so maybe there’s a workaround somewhere.

I’d originally installed WP in a blog/ directory just for blog purposes, but I decided to see if I could migrate a WP version from a directory (blog/) to the main directory (thewhiskershop.com) and I did! Without breaking anything! And the credit goes to Ask WP Girl.

Some days you have to celebrate the small victories. 🙂

#100DaysofCode – towing capacity calculator

A quick proof-of-concept for a web app I’d like to make next. (code below, or code on Github.)


#!/usr/bin/env python
''' Towing capacity calculator, takes user inputs for vehicle and trailer data, then determines if the vehicle is over payload or under gross combined vehicle weight rating. Proof of concept before turning this into a web app.

Disclaimer: If you use this, double-check using your own math, too. This has not gone through a formal validation process, and I don't want my code to cause any accidents. -jmf '''

# Check if over/under payload
def payloadcheck(availablepayload):
if availablepayload >= 0:
print("Available payload: {}".format(availablepayload))
return True
else:
print("Exceeded Payload! Over payload capacity by {}".format(availablepayload))
return False

# check if over/under GCVWR
def gcvwcheck(towcapacity, newgcvw):
if newgcvw >= towcapacity:
print("Acceptable! With combined weight of {}".format(newgcvw))
print("You are under your GCVWR by {}".format(towcapacity - newgcvw))
return True
else:
print("Exceeded GCVWR! Over capacity by {}".format(newgcvw - towcapacity))
return False

def getdata():
vehicle = input("What vehicle will be doing the towing? ")

# dry weight, or curb weight = unloaded vehicle weight, WITHOUT driver, passengers, or cargo
truckdrywt = int(input("Curb weight: "))

# gvwr = maximum allowed weight of a fully loaded vehicle (dry wt + driver + passengers + cargo)
gvwr = int(input("Gross Vehicle Weight Rating (GVWR): "))

# gcvw = curb weight + allowable payload + passenger weight + trailer weight
gcvwr = int(input("Gross Combined Vehicle Weight Rating (GCVWR): "))

# payload = maximum allowed weight of passengers + cargo + hitch
payload = int(input("Payload: "))

# tow capacity = defined by manufacturer, listed in owners manual or a manufacturer's tow guide
towcapacity = int(input("Tow capacity: "))

# passenger weight = driver + all human and non-human riders
passengerwt = int(input("Combined driver and passenger weight: "))

# cargo = everything in the vehicle that isn't sentient
cargo = int(input("Cargo weight inside the vehicle: "))

trailer = input("What trailer are you towing? ")

# trailer dry weight, or curb weight = unloaded weight, can be determined by a sticker on the trailer or by taking an unloaded trailer to a truck scale. Published unloaded weights may or may not include water/waste/propane
trailerdrywt = int(input("Trailer curb weight: "))

# trailer gcvw = dry weight + everything inside it
trailergvwr = int(input("Trailer Gross Vehicle Weight Rating (GVWR): "))

# hitch weight = defined by manufacturer, listed in manual or sticker on the trailer
hitchwt = int(input("Trailer hitch weight: "))

availablepayload = payload - (passengerwt + cargo + hitchwt)
newgvw = truckdrywt + hitchwt + passengerwt + cargo
newgcvw = trailergvwr - hitchwt + newgvw

print("\nWith the {} towing the {}: ".format(vehicle, trailer))

payloadcheck(availablepayload)
gcvwcheck(towcapacity, newgcvw)

def main():
print("==================================================")
print("Towing calculator.")
print("It does not matter if you use pounds or kilograms, just be consistent. \n")

getdata()

print("\nDon't forget to check the capacity of your tires and gross axle weight ratings (GAWR).")
print("==================================================")

main()

''' inspiration for this came from Marc Leach's Excel worksheet here: http://www.keepyourdaydream.com/payload/ '''