Wednesday, September 16, 2026

An Expedia Car Rental Gone Wrong

I’ve written many times about issues with car rentals. Here’s another incident. Through Expedia, I booked a car rental from Sixt. My original reservation was for pickup on a Sunday at 5 PM with return on Friday at 2 PM, a 5-day rental. Due to a change in travel plans, I wanted to move the pickup to Monday at 9 PM while keeping the same Friday return, making it a 4-day rental.

I first tried calling Sixt and was able to speak to a live representative. I was told that because my booking was made through Expedia, they were unable to alter my reservation, although the representative left a note on my reservation that I had requested a pickup date on Monday instead of Sunday. I was instructed to call Expedia and ask to speak to their “Sixt internal account manager” who could make the change and also tell me if there was any price difference.

I then attempted to contact Expedia, but nowhere could I find a phone number to call. The only option I found was to invoke their Virtual Agent via chat. We sent messages back and forth about my request to change my pickup date from Sunday to Monday. It felt to me that the agent was assigned to chats with multiple customers simultaneously based on the time delays in the agent’s responses. In any case, I was eventually told that my only options were to keep the Sunday pickup or to cancel my non-refundable reservation which I had already paid in full. I already knew that my reservation was non-refundable, but I wasn't trying to cancel it. Furthermore, I did not see any language during booking or on my booking confirmation that no changes could be made. I was willing to pay the full amount I had already paid for five days even though I would only be renting the car for four, and I wasn’t asking Expedia to refund the unused day.

Sensing an unwillingness to help me, I asked the Expedia virtual agent to connect me with their “Sixt internal account manager” by typing into the chat the exact language used by the Sixt representative. The virtual agent eventually agreed to do so. After a long wait, I was told by the Expedia virtual agent that he was unable to reach the Sixt internal account manager or a Sixt representative and that he would have to send an email to Sixt. He told me to expect an email reply from Expedia in 48-72 hours. Right on cue about 2-3 days later, I received the following email from Expedia:

From: travel_expedia@expedia.com (travel_expedia@expedia.com)
To: (me)
Date: Sunday, September 13, 2026 at 09:45 PM PDT
Subject: Update on Your Refund Request with Sixt – Itinerary #xxxxxxxxxx

Hello Victor,

We’re following up regarding your request to cancel your booking and request a refund from Sixt.

Request type: Refund
Itinerary number: xxxxxxxxxx
Property name: Sixt

We spoke with Sixt to advocate for your refund request. Unfortunately, they have advised that the reservation was booked under a non-refundable rate, and they are unable to make an exception to their cancellation policy. As a result, no changes can be done for this booking.

Additionally, Sixt has informed us that the main driver named on the reservation must contact Sixt directly regarding any requested modifications to reservation xxxxxxxxxx.

We understand this is disappointing. We always strive to advocate for our travelers; however, Sixt has elected to uphold the terms and conditions associated with the reservation, and we are unable to override their decision.

If you have any questions or concerns, please feel free to reply to this email. We're here to help.

Regards,
Ipsita
Expedia US Travel Team

I can’t say for sure, but the response from Expedia felt inaccurate and potentially dishonest to me. The inaccuracy is that I never asked for a cancellation or refund. I had only asked to pick up my car a day later than originally scheduled. The potential dishonesty is that when I spoke to the Sixt representative, they seemed willing to allow the change and even left a note on my reservation stating that I had desired to pick up the car a day later. So it felt to me, based on my interactions with Sixt and Expedia, that Expedia was the one refusing to make the change, and they blamed Sixt. Lastly, Expedia wrote, “Sixt has informed us that the main driver named on the reservation must contact Sixt directly…” when in fact I had already contacted Sixt directly prior to engaging with the Expedia virtual agent. It seemed to me that Expedia may not have even contacted Sixt and simply gave me a boilerplate denial. Besides, how would the virtual agent know that emailing Sixt, receiving a reply, and responding to me would take 48-72 hours? I do not have definitive evidence for this, but my observations suggest to me that Expedia refused to accommodate a change and blamed their business partner for their decision.

I kept my existing reservation for a Sunday 5 PM pickup. I showed up to Sixt on Monday at 9 PM, and I asked if they would accommodate my rental. They did in fact give me the car, with a caveat. They explained that if a customer does not pick up their vehicle within 8 hours of their scheduled pickup time, they release the reservation. However, without much hassle, they did note that I had already paid in full, and the agent said he did his best to give me a new 4-day rental and credit me for the amount that I already paid. The best deal he could find for a similar vehicle type was about $73 more than I had already paid, and I thought that was a fair price given the situation.

In summary, Sixt seemed willing to accommodate my change when I called them on the phone, and they accommodated my change when I showed up in person. On the other hand, Expedia was uncooperative at best, contrary to their claim that they “always strive to advocate for our travelers”. It also felt to me that Expedia couldn’t get its facts straight and was possibly dishonest to me, as well as bordering on slanderous to Sixt. This experience has eroded my trust in Expedia.

Sunday, September 13, 2026

Downloadable National Park Maps

If you’ve planned visits to US national parks, you probably know that each National Park Service (NPS) site has its own dedicated page or sub-site. Each page typically has a “Plan Your Visit” menu item where you can select from choice such as Basic Information, Things To Do, and Directions & Transportation. As I plan my visit, one of the first things I do is to view maps of the national park to understand the location of the visitor center(s), trails, and other features. In the past decade or so, various NPS sub-sites began transitioning their online maps from static downloadable PDF or JPG maps to interactive web maps that allow users to pan, zoom, and click on map features within their browsers.

If you’re old school like me, you might prefer downloading static maps, printing them out, and keeping a hardcopy in your backpack. Interactive maps are convenient while at home, but downloadable maps have a major advantage: they work when you don't have connectivity which is often the case in our national parks. If the NPS site does not provide downloadable maps, check out these alternatives.

National Park Maps is a passion project by a guy named Matt who has meticulously organized his website so users can look up maps alphabetically or by state. It’s an unofficial collection of free maps. I’ve often found maps on this site that are not even featured on corresponding NPS sites. Kudos to Matt!

NPS has its own official GIS, Cartography & Mapping site where you can download maps in PDF, JPG, or Adobe print production file formats. They can be searched by keyword, state, or park. Rather than providing the static maps in a separate website, it would be nice if each NPS sub-site offered options to view both interactive web maps and to view and download static PDF/JPG maps.

If you’re interested in learning more about the technology behind the interactive web maps, there is a National Park Service Web Maps site for that too. They discuss their open source NPMapJS code library.

While NPS has embraced interactive web maps, you don’t have to give up the good old fashioned downloadable map. Whether you prefer exploring a map on your screen, downloading a PDF for offline use, or stuffing a printed map into your backpack, there are still plenty of options. Happy mapping and happy exploring!

Saturday, August 29, 2026

DROP Service Interim Update

Earlier this year, I wrote about how your can protect your privacy using California’s Delete Request and Opt-out Platform (DROP) service. DROP launched on January 1, 2026, and data brokers began processing requests on August 1, 2026. Given that data brokers are required to delete data within 45 days of receiving a request, I wanted to see how things were coming along at day 29. Here are my current stats, as reported on my DROP account:

And here is the DROP website’s glossary of deletion statuses:

When browsing the full list of data brokers, I see this:

Unfortunately there are 66 pages to scroll through on my account, and there does not appear to be a way to export the full list of data brokers along with my request statuses. It would be nice for them to add that feature later.

The DROP website provides the following information: “Data brokers will begin accessing DROP soon. Processing becomes mandatory beginning August 1, 2026, but status updates can take up to 90 days to appear in DROP depending on data broker workflows. Your status for each data broker will update once your request is processed.” My interpretation is that either (1) a majority of data brokers (490 out of 656) have not processed my deletion request yet and/or (2) some of those 490 data brokers have actually processed my deletion request, but the statuses have not yet been updated in DROP due to data broker workflows.

While the DROP website says, “Under law, data brokers have 45 days to delete your data after they receive your request,” it seems hard to determine if the law has been broken if the statuses can take 90 days to be updated. In the worst case scenario, a data broker could delete my data on day 45, and then it could take up to 90 days to update the DROP website, so that would be 135 days after August 1 which would be December 14, 2026. Maybe I’ll check back again toward the end of the year to see how well data brokers are complying with DROP requests.

University of California Acceptance Rate Data

If you have a high school senior who is getting ready to apply to University of California schools, you may have seen acceptance rate statistics such as the ones from Money Magazine a few months ago which I wrote about in my “LLM Analysis of College Ratings” blog. For convenience, I am re-posting the graphic here.

The acceptance rate statistics are from a nationwide sample, but what if I told you that you could look up University of California acceptance rate statistics for students at a specific high school? The University of California Information Center publishes data on Admissions by Source School and segments data into several subcategories as shown here:

The data tables show applicants, admissions, and enrollments by California high schools and community colleges for freshmen and transfer entrants by source school, mean GPA, ethnicity and school. Of particular interest might be “Single high school lookup” under the “Freshman admission by source high school” section. Data tables are provided for:

  • Counts of fall freshmen by race/ethnicity
  • Counts of fall freshmen by gender
  • Average freshman GPA

After clicking on any of these 3 options, you will need to enter the high school name in the “Search for school name” field. Depending on the name of your school, the exact high school name could be tricky to find. If you come up blank, then go back to the home page and click on any of the 3 options under Freshman admission by source high school > All source high schools. Then filter by city and/or county and browse for the name of the high school of interest.

Back to the “Single high school lookup” section… After selecting a data table for counts by race/ethnicity, gender, or GPA, you will have the option to filter by year. You’ll also see breakdowns by campus, fall term, and applications/admissions/enrollment.

If you prefer to sort and filter data in Excel like I do, you’re in luck because there is a download button that gives you the option to download as an image, data, cross tab, PDF, or PowerPoint. Selecting “data” will result in the download of a .csv file which you can then play with in your favorite spreadsheet or database application.

I found this data to be useful because although the national acceptance rate statistics are good to know, being able to see acceptance rate statistics from my child’s high school provided a slightly different perspective. I hope you’ll find it as useful as I did. And if you found this data interesting, there are plenty of other data tables to explore at the University of California Information Center.

Friday, August 7, 2026

Citi Costco Visa Identity Verification

Last year our family visited several Asian countries, and we managed to get by with eSIM data-only plans. The only setbacks occurred when our Citi Costco Visa card flagged some transactions as suspicious (which I wrote about here and here), and because Citi attempted to notify me via voice and SMS text—which we did not receive—it prevented our purchases from being made. This year, I made sure to add my Google Voice number to my Citi Costco Visa card in hopes that I would be given an option to verify transactions using a data-only eSIM plan. It worked. When making a transaction, I was presented with the following options for identity verification:

You may have noticed that there were options to call or text me at the …2505 number, the the only option for the …2516 (Google Voice) number was to call me. I am not certain, but my phone contact information on the Citi website are:

  • Home Number: …2505  → I think Citi uses this for calls
  • Primary Mobile: …2505  → I think Citi uses this for text messages
  • Alerts Mobile: …2516  → I think Citi uses this for calls

If my assumptions above are correct, then I think Citi should also present an option to send text messages to the alerts mobile number. While calling me at my Google Voice number worked for identity verification, I would have preferred getting a text message at my Google Voice number so I could copy and paste the code.

In any case, if you have a Google Voice or another VoIP (Voice over Internet Protocol) service, consider adding that contact number to your Citi card so that you can easily verify your identity using data-only eSIM plans when traveling abroad. I assume that this approach may work for other credit cards, but you’ll need to review your options and/or ask customer support.

Friday, July 17, 2026

EV Recommendations to Car Rental Companies

I have recently experienced several suboptimal car rentals which I’ve written about in this series. While traveling this week, I booked a rental car with Budget. The best deals were with electric vehicles (EVs), and given that I am comfortable with driving EVs and charging EVs at the company apartment, I chose an EV.

Upon vehicle pickup, I learned that Budget no longer provides charging cables. However, I discovered this in a circuitous manner. I recalled a prior experience in which I was given an EV with a low battery and without a charging cable. Therefore, I made sure to search my rental car for a charging cable—it didn’t have one. So I went back to the rental counter, and they assigned a different EV to me—that one didn’t have a charging cable either. I was then told by the manager that Budget no longer provides charging cables “because people steal them”. For context, not all car rental companies have this policy. Just last week, a co-worker rented an EV from another company, and it provided a charging cable.

When I rent EVs for my business trips to company headquarters, I always charge them at the company apartment which has electrical outlets in the 2-car garage, and for that I need a charging cable. The great benefit is that no time is lost by simply plugging in the car at the apartment. The alternative is to charge the vehicle at a public charging station which is undesirable for me because a typical level 2 public charger can take several hours to charge an EV from 50% to 80% capacity. So if a car rental company does not provide a charging cable along with an EV rental, that significantly worsens the customer experience.

I ended up switching from an EV to a hybrid vehicle, and I had a flawless experience with it. That being said, I have a few recommendations to all car rental companies who rent EVs to their customers.

First, car rental companies have a responsibility provide charging cables with EV rentals. Not every customer is willing or able to spend hours of precious time at a charging station. Business travelers are busy. Leisure travelers want to maximize their time on vacation. Nobody wants to use a public charging station unless it is their last option. Plugging an EV into a standard outlet is much slower than a level 2 charging station, but if it can be left unattended (e.g., while sleeping), the convenience far outweighs the slower charging speed. A charging cable should be considered a standard item included in an EV rental.

Second, charge the customer if they do not return the charging cable. If a customer borrows a GPS or a child car seat and fails to return it, then I assume the customer would be charged for those items. A car rental company should do the same for charging cables, and I would completely understand if the replacement fee for a charging cable exceeded the cost of a brand new charging cable because of the effort that must be taken to manage an inventory of charging cables. Furthermore, car rental companies already place a temporary charge on the customer’s credit card (Budget charged me $250 for this week’s rental), so they are already pre-authorized to charge fees for lost or stolen charging cables.

Third, charge the EV to 80% before letting a customer borrow it. This is a common customer expectation. It is also a common expectation that vehicles are adequately prepared for rental. The tire pressure should be adequate, the headlights should be working, none of the warning lights should be flashing, and the vehicle should be free of trash from the prior rental. Most car rental companies that I’ve used also require that the car be returned with at least 70% (or similar) charge, or a fee will be incurred (similar to a refueling fee for gas vehicles). On the flip side, car rental companies have a duty to provide customers with EVs whose batteries are 70-80% charged.

If a rental company cannot support EV rentals with the same level of convenience and preparedness that customers expect from gasoline vehicles, it shouldn’t offer them.

Saturday, July 11, 2026

LLM Analysis of College Ratings

Money Magazine recently published research on the best colleges in America. Its methodology includes metrics that are weighted based on graduation rates, costs, financial aid, student debt, and alumni salaries. My daughter is looking at University of California schools (among other options), and I noticed that while UC Berkeley, UC Davis, UC Irvine, and UC San Diego achieved 5-star ratings, UCLA “only” received 4.5 stars.

Beyond what was stated in the methodology, I could not find detailed information about the raw scores that led to the star ratings, so I decided to consult various large language models (LLMs) to see if they could do some digging for me and propose plausible explanations for why UCLA wasn’t given a full 5 stars as I would have expected.

I asked the exact same question to Copilot, ChatGPT, and Claude: “Money Magazine released their 2026 ratings of the best colleges in the US (https://money.com/best-colleges/). Try your best to find out why UC Berkeley, UC Davis, UC Irvine, and UC San Diego achieved 5-star ratings while UCLA only received 4.5 stars. Make sure to examing their scoring methodology and determine what criteria may have caused UCLA to not achieve a full 5 stars.” Note that I copied and pasted the same typo (“examing” should have been “examine”).

Copilot didn’t spend much time researching this topic, and it started spitting out an answer 1-2 seconds after I pressed the “return” key. One of its main explanations for UCLA not achieving 5 stars was due to affordability which didn’t make sense based on the table above, so I followed up with a 2nd prompt: “UC Berkeley has a higher estimated full price and estimated priced with average aid than UCLA, yet UC Berkeley achieved 5 stars. Are you still confident in your assessment? If not sure, then state so.” Copilot then backtracked and revised its explanation, and its revision sounded more plausible to me. Here is Copilot’s full response.

A similar thing happened with ChatGPT which spent only a second or two longer to “think” than Copilot, and it responded almost immediately. It too explained that cost was a factor in it not achieving 5 stars, so I followed up with the exact same 2nd prompt: “UC Berkeley has a higher estimated full price and estimated priced with average aid than UCLA, yet UC Berkeley achieved 5 stars. Are you still confident in your assessment? If not sure, then state so.” Like Copilot, ChatGPT also backtracked and revised its explanation. Here is ChatGPT’s full response.

On the other hand, Claude thought long and hard about its response. It displayed multiple websites that it was consulting to formulate its response, including Money Magazine’s methodology page and the websites from each of the schools mentioned. I can no longer see the pages it was consulting, as they disappeared and were not displaying in the final response. Although I didn’t use a stopwatch, I’d estimate that Claude took 20-30 seconds to think before providing a response. I felt that Claude’s explanation was the most analytical and credible of the 3 LLMs, and unlike Copilot and ChatGPT, I didn’t feel that any of its responses were contradicted by the data. Here is Claude’s full response.

Of course, these are my personal opinions which are completely subjective. Also, my conclusion that Claude performed the best on this specific task are not necessarily generalizable to conversations about other subjects. The take home message is that if you often consult LLMs, I’d encourage you to always think critically about LLM replies and to explore multiple LLMs to compare and contrast their responses and determine which ones are best suited to your needs.

Monday, June 8, 2026

3D Model License Violation

I contribute 3D models to the 3D printing community on MakerWorld, the Bambu Lab model repository. One of the models that I uploaded was an iPad stand for thick cases, and it is the model in my collection that gets downloaded and printed the most. Recently a stranger messaged me to let me know that Sarina’s 3D Printing was selling my model on Facebook. This was Sarina’s post:

The problem with Sarina’s post is that I had uploaded the iPad stand under a Creative Commons Attribution-NonCommercial 4.0 International Deed (CC BY-NC 4.0) license which means that the model cannot be sold without my permission. So I decided to write a comment on Sarina’s post: “Just so everyone knows, the original model is available at https://makerworld.com/en/models/985191-stand-for-ipad-with-thick-case, and it is provided to the community under an Attribution-NonCommercial license which means that work must be attributed to the original designer, and the object cannot be sold.”

Within a couple of days, the post had been taken down. Unfortunately it is very common for people to violate Creative Commons license terms. Sometimes it is blatant theft, such as these examples:

Because I am only a 3D printing hobbyist, and I don’t depend on 3D printing for income, unapproved use of my models does not impact me financially. If anything, I choose the view the breach of licensing terms of my 3D model as a compliment. However, there are many designers out there whose models are used without their permission.

I greatly appreciate being notified by a stranger that someone was selling my model. I recently noticed some suspicious activity and took similar action. A designer posted AirPods Max Jewelry under a Cults 3D Private Use License which prohibits commercial sale, remixing for public sharing, and distribution. However, the exact same model was reposted as Airpods Max Skeleton Accessory. I publicly commented on the repost and also messaged the original designer.

I’ve found the 3D printing community to be helpful and supportive of one another, although there are occasional bad actors. If we all look out for each other, we can hopefully hold people accountable to the licenses that make this community possible.

Thursday, May 14, 2026

Image Editing with LLMs

Yes, you read that correctly. Large language models (LLMs) can come in handy for not just text and image generation—they can be versatile image editors too. Perhaps you’ve uploaded a photo of yourself to your favorite LLM and asked it to generate a caricature of you or portrayed you as a celebrity being chased by paparazzi. These are LLM-based examples of image editing in which you start with an image, add your text-based prompt to manipulate the image, and the result will hopefully resemble what you had in mind.

I recently came up with another use case for image editing. I was trying to find a high quality image of the Eagles’ Hotel California album cover. I searched the web and found many photos and scans of the album cover, but they all had one major shortcoming—the dark areas in the bottom half of the image had little to no detail. Here are 2 such examples:

I uploaded the images to both Copilot and ChatGPT and entered the following prompt: “These are 2 photos of the cover of the Eagles "Hotel California" album with different exposures and levels of detail in the shadows. Merge them into 1 photo and recover details from the shadows. Significantly boost the shadows so that it is possible to see the trees and bushes. Preserve the fluorescent "Hotel California" words that are superimposed on what looks like a car's side view mirror. Also boost the fluorescent "Hotel California" words so they are more bold. Preserve the original aspect ratio. Reduce overall contrast by making the sky a warmer golden glow and increase overall brightness, especially in the darker shadows.” I got very similar results with both Copilot and ChatGPT, and here is the result from the latter:

As you can see, ChatGPT did a remarkable job of creating the bushes in the lower half of the album cover. I honestly don’t know if it was able to recover detail from the source images or if it generated the bushes from scratch (or perhaps a combination of both). In any case, I was very happy with the recovery of what was otherwise lost detail. It also slightly sharpened the palm trees and did a very nice job of highlighting the “Hotel California” stylized wording while preserving its original look and feel. This was exactly the kind of image quality I had hoped to find in a Hotel California album cover, and although I was unsuccessful with my search, I was thrilled to learn that LLMs could generate the next best thing.

If you’re wondering why I wanted such an image, it’s because I wanted to 3D print the Hotel California album cover, and I wanted to include some detail in the bottom half rather than have it appear pure black. Here is the resultant 3D print:

If you have a 3D printer, you can access the 3D model and print profiles here. I hope this give you ideas for how you can use LLMs to edit photos.

Monday, May 4, 2026

TP-Link Router Exploitation

I recently received an email notification from Spectrum, my internet service provider. It warned that some TP-Link routers may be vulnerable following a recent FBI-identified security issue. Because I don’t rent my modem and router from Spectrum, they can’t fix it remotely. They recommend that I (1) update the firmware, (2) change the admin password, and (3) replace the router if it’s over 5 years old.

I explored the links provided in the Spectrum email notification. The first is a link to an FBI Public Service Announcement (PSA). It says that the Russian military, specifically the group known as APT28, Fancy Bear, or Forest Blizzard, is conducting attacks on vulnerable home and small-office routers around the world. This allows them to intercept internet traffic so they can steal passwords, authentication tokens, emails, and browsing data. High-value targets include military, government, and critical infrastructure.

Specifically, the PSA refers to CVE-2023-50224 where CVE stands for “common vulnerabilities and exposures”, 2023 is the year the vulnerability was found, and 50224 is a unique identifier for the flaw. A TP-Link security advisory lists the legacy products that are impacted by CVE-2023-50224 (i.e., the models targeted by APT28) and their remediation status.

Fortunately my TP-Link Deco S4 version 3.6 mesh router system is not on the list. I updated the firmware just over a year ago to build 20240927 (i.e., September 27, 2024). The firmware description does not comment on whether specific CVEs have been fixed, but given that CVE-2023-50224 was identified in 2023 and the firmware update was Build 20240927 (i.e., September 27, 2024), I assume the vulnerability, if it existed on my model in the first place, has been patched.

On a related note, I came across a list of TP-Link End of Life Products and discovered that my TP-Link Deco S4 version 3.6 has an “EOS Notification Date” of 7/27/2025 and an “EOS Date” of 1/27/2026. TP-Link defines End of Life (EOL) products as “products where the production has either ended on the model or the specific version of the model.” Of greater relevance to security vulnerabilities are 2 additional milestones as defined in the TP-Link EOL Policy. The End of Sales (EOS) date is when TP-Link discontinues a product. The End of Maintenance (EOM) date is when TP-Link will no longer provide support or maintenance for a product. So if I interpret these definitions correctly, the first thing that happens is EOL when TP-Link stops producing a model. Then EOS occurs when TP-Link stops selling and accepting new orders for the product. And finally EOM occurs when TP-Link no longer supports the product (I assume this includes firmware updates). So even though my Deco S4 version 3.6 is no longer sold (at least not by TP-Link; it is still sold by Amazon via the link above) according to the EOS Date, I have not received any clear indication that it is no longer maintained. According to ChatGPT, TP-Link does not publicly disclose EOM dates but in general, EOM occurs roughly 3 years after EOS and the only way to determine the EOM date for a specific model is to contact TP-Link support.

The PSA also refers to a UK National Cyber Security Centre Cybersecurity Advisory. It provides a more detailed description of APT28 malicious activity and provides a non-exhaustive list of specific TP-Link router models targeted by APT28 that closely resembles the TP-Link security advisory for CVE-2023-50224.

The bottom line, as described in the Spectrum email notification, is that your router is a device that can have security holes, similar to your desktop/laptop computer or phone. It is therefore important to keep your router firmware updated similar to how you’d update the operating system on your computer or phone. Additionally, you should practice good security hygiene by using strong passwords and replacing equipment that is no longer supported by the manufacturer.

Saturday, May 2, 2026

Website Change Detection

I recently encountered a work-related scenario in which I felt that it would be beneficial for me to know when a website had been updated. The website in question performs periodic updates of certain kinds of data in a downloadable file format, but it does not offer a notification mechanism (e.g., via email, RSS, or other technology) when such changes occur. That led me to explore options for website change detection.

There appear to be many options available, but I found that most of them required subscriptions. Because I am merely evaluating these technologies, I was only looking for free options. That led me to sign up for accounts at Visualping and PageMonitor. I configured both of them to monitor my blog, https://digitaldaddyla.blogspot.com/.

Visualping and PageMonitor use slightly different methods to determine if a change has occurred. For Visualping, setting up a new monitor requires entering the URL and specifying either an AI prompt to describe what changes you are looking for or “Any changes” which they label as “No AI used” as depicted below. I used the “Any changes” option. I also had the option to specify the frequency of page checks, and I chose “every day”. It did not allow me to specify an exact time.

For PageMonitor, setting up a task requires that you specify a URL to display the current webpage. From there, you specify both an “Anchor area” and “Region of interest” by drawing boxes around both regions. The region of interest is the part of the page you want to monitor. The anchor area is a reference point that is used to relocate the region of interest each time the page is checked—this should be an area of the page that is not expected to change. You then specify how often to run the task. When I chose “once a day”, it prompted me to enter a time, for which I think I chose 7 AM.

I have since published 7 new blog entries and have been receiving email notifications from both Visualping and PageMonitor. For the purpose of this blog post, I am presenting my findings based on review of change logs in each of my accounts. Here is a summary.

I have several observations. First, I noticed that Visualping failed to detect my most recent blog post on 4/17/2026, while PageMonitor has not missed any new blog posts. It is not clear to me why Visualping did not detect the 4/17/2026 blog post. One possibility is that I have not logged in to my account since setting up the monitoring job. I received an email from Visualping on 5/2/2026 that stated, “We have not seen you for 3 months! We would like to confirm that you are still interested in us checking things for you. Please login in the next 3 days to keep your current monitoring frequency. Otherwise, your job frequency will be reduced to checking only once a month.” However, my monitoring frequency would have to have been reduced prior to 4/17 to explain the false negative.

Second, the elapsed time between blog publication and webpage change detection was generally 1 day for both Visualping and PageMonitor. However, there was one blog post (Chicken Al Pastor and Oxford Commas) which was not detected by Visualping until after 2 days.

Third, Visualping seems to detect website changes at different hours of the day, while PageMonitor allowed me to specify exactly what time to run my daily task. Notice that the transition from 7:01 AM to 8:01 AM can be explained by Daylight Saving Time beginning on Sunday 3/8/2026.

My final observation is that PageMonitor occasionally alerted me to changes to my blog when I didn’t make any. For example, the “3D Printing Without Wi-Fi” blog that I published on 2/13/2026 was correctly detected on 2/14/2026. However, PageMonitor detected changes on 2/25/2026 and 2/26/2026. I suspect that maybe an image did not load on 2/25 which resulted in a conclusion that the page appeared different, and then the image properly loaded on 2/26 which resulted in another conclusion that the page changed again.

Another example of a false positive from PageMonitor is from my “3D Printing and Firearm Blocking Technology” blog post on 4/17/2026. Following a successful detection on 4/18/2026, it falsely detected a change on 4/29, errored out on 4/30, and falsely detected another change on 5/1, even though I did not make any edits to the blog post or publish any new blogs.

In conclusion, based on a small sample size, Visualping appears to err on the side of false negatives, and PageMonitor seems to err on the side of false positives. It is possible that some of these errors could be due to webpage itself (e.g., images not loading). In any case, I find both Visualping and PageMonitor to be useful for detecting changes to websites. If you are looking for free options, I would recommend checking out both of them.

Friday, April 17, 2026

3D Printing and Firearm Blocking Technology

On February 17, 2026, California introduced Assembly Bill 2047 which is known as the Firearm Printing Prevention Act. It would require several things to happen:

  • On or before July 1, 2027, the Department of Justice must publish written guidance on performance standards for persons or entities engaged in the creation of firearm blueprint detection algorithm to be certified for use by 3-dimensional printer manufacturers, as specified.
  • On or before January 1, 2028, the Department of Justice must accept applications for certification of firearms blueprint detection algorithms and begin issuing certifications of algorithms that meet or exceed the performance standards.
  • On or before July 1, 2028, any business that produces or manufactures 3-dimensional printers for sale or transfer in California must submit to the Department of Justice an attestation for each make and model of printer they intend to make available for sale or transfer in California, confirming that the manufacturer has equipped that make and model with a certified firearm blueprint detection algorithm.
  • On or before September 1, 2028, the Department of Justice must publish a list of all the makes and models of 3-dimensional printers whose manufacturers have submitted complete self-attestations and would require the department to update the list no less frequently than on a quarterly basis and to make the list available on the department’s internet website.
  • On March 1, 2029, the bill would prohibit the sale or transfer of 3-dimensional printers that are not equipped with firearm blocking technology and that are not listed on the department’s list of manufacturers with a certificate of compliance verification.

The bill would authorize a civil action to be brought against a person who sells, offers to sell, or transfers a printer without the firearm blocking technology. It would also make it a crime to knowingly disable, deactivate, uninstall, or otherwise circumvent any firearm blocking technology.

The bill refers to a couple of terms which deserve exploration. According to Assembly Bill 2047, “firearm blocking technology” means hardware, firmware, or other integrated technological measures capable of ensuring a three-dimensional printer will not proceed to any print job unless the underlying three-dimensional printing file has been evaluated by a firearms blueprints detection algorithm and determined not to be a printing file that would produce a firearm or illegal firearm parts. The bill also states that “firearm blueprint detection algorithm” means a software service that evaluates three-dimensional printing files, whether in the form of stereolithography (STL) files or other computer-aided design files or geometric code, to determine if the files can be used to program a three-dimensional printer to produce a firearm or illegal firearm parts, and flag any such files to prevent their use to manufacture a firearm or illegal firearm parts.

I searched the web to try to find companies or individuals who have created such technologies or algorithms, and the search results mainly yielded articles and videos about the 3D printing legislation in Washington, New York, and California. I then asked ChatGPT to summarize what it knows about firearm detection technology, and it stated that Thingiverse uses AI to detect and remove gun design files, and there are experimental tools such as 3D GUN’T. However, the solutions seem to be immature. ChatGPT concludes that the firearm blueprint detection algorithms mentioned in legislation are “largely hypothetical or early-stage” and “reliable prevention at the printer level is an unsolved problem” which is consistent with my observations.

I think that AI approaches are the best way to address this need, but I can also think of many challenges to doing it accurately. First, 3D models are not always designed so that the finished physical object is contained in a single file—they are often provided in multiple parts. Splitting a model could be necessary because the object is too large to fit on a standard print bed. It could also be because different parts of a model need to be printed with different materials (e.g., to add strength or flexibility) or colors. It could also be that certain features of a model are best printed in a certain orientation to optimize strength, improve print bed adhesion, reduce the need for support material, or factors to minimize chances of print failure. The bottom line is that when models are split into multiple objects, it could become difficult for firearm blocking technology to accurately understand that many parts, when assembled, would resemble a firearm.

Second, firearms come in many shapes and sizes. I suppose that with enough training data, AI-based detection methods could learn what many different kinds of firearms look like. But what happens when users modify (or “remix” as the 3D modeling community would say) models so that they differ from training data? For example, what if a 3D model of a gun is presented in the form of a kit card? Its overall geometry would be a square or rectangle. When the borders and connectors of the kit card are snapped off, it would look like a gun, but that would happen in post-processing (downstream of the AI detection). Or what if a 3D model of a firearm was natively designed with support material? The support material could make the overall geometry significantly different than the firearm after all the support material was removed. Could firearm blocking technology be reliable enough to understand all of this?

Third, will firearm blocking technology be capable of understanding functional capabilities of 3D models? In other words, could it tell the difference between a “real” functional firearm and a non-functional prop? What if someone wants to print a replica of Han Solo’s blaster for a Halloween costume or a Star Wars convention? Would firearm blocking technology have a high enough false positive rate that it could become a burden to print legitimate models that pose no danger to society?

Perhaps there are current solutions to these challenges, or maybe technology will advance rapidly enough in the next couple years that these problems will be in the rear view mirror. In any case, I believe we have a major problem with guns in the United States, and I would love to see progress on reducing injury and death from firearms. However, it feels to me that the 3D printing legislation is misdirected, and I fear that it will adversely affect hobbyists like me while doing little to nothing to curb illegal activity because criminals will just find ways to circumvent firearm blocking technology.

For an additional perspective, read The Dangers of California’s Legislation to Censor 3D Printing by the Electronic Frontier Foundation.

Saturday, April 11, 2026

Sending a Fax in 2026

The other day my wife gave me 4 pages of paper and asked me to take it to a store and fax it to its destination. I suspected that this was the most expensive and inconvenient method to send the document. Based on various online sources, sending a domestic outgoing fax at FedEx costs approximately $2.50 for the first page, followed by approximately $2.00 for each additional page, so a 4-page fax would cost approximately $8.50. Prices would be similar at The UPS Store, Staples, Office Depot, and other similar offerings and of course would vary from store to store.

Therefore, I asked her to consider alternative options. Could the document be sent as a PDF file via email? She told me that email was unfortunately not an option and that it had to be sent via fax.

I read online that some public libraries offer free or low-cost fax services. I checked the website for our local library, and unfortunately it did not list faxing as a service at that branch. I wanted to call the library to ask if they offered fax services, but unfortunately it was after hours.

Finally, I decided to use an online fax service. Not having ever used an online fax service, I asked ChatGPT to recommend one with a good reputation and fair pricing. It offered a couple of options, and I somewhat randomly went with FaxZero.com, although I am sure that there are many other online fax services with competitive offerings. The process was simple. I first scanned my 4-page document to a PDF file. I then entered information about the sender and receiver and attached my PDF file. There was an option to enter text for a cover page, but I left it blank. Then I paid $3.29 via credit card (note that sending faxes up to 3 pages is free) and sent the fax. Email confirmations were provided upon initial transmission and successful sending of the fax.

I appreciated many aspects of the online fax service. First, we could send a fax without purchasing a physical fax machine. Second, we could send the fax from the comfort of our own home and avoid locating and driving to a physical store, and potentially waiting in a line or waiting for an agent to assist us. Third, we did not have to wait for the fax to transmit—instead, we simply received an email notification upon job completion.

If I was ever asked to fax something, I’d still first search for better alternatives such as email, but if I absolutely had to fax something, I’d definitely consider using an online fax service again due to its convenience and lower cost in comparison to in-store options.

Monday, March 16, 2026

Essay Grading - Human vs. Machine

For my daughter’s high school, I volunteered to read and score scholarship applications that were submitted by graduating seniors. There were 10 categories of applications including Academic Excellence, Arts, Athletics, Leadership, School Service, and others. All applications consisted of an essay, and some of the categories required the submission of supplemental information such as photos, videos, or other information to support the applicant’s scholarship candidacy. Parent volunteers were placed in groups of 3, with each group asked to review 4 or 5 applications. Parents were provided with a grading rubric and were asked to independently evaluate each student’s submission. To reduce the chance of bias, parents were asked to be reassigned to another group if they knew the student.

The grading rubric consisted of 5 dimensions for a total of 20 points:

Followed Directions
2 points – Followed most or all directions
1 point – Followed some directions
0 points – Followed no directions

Answered Essay Prompt
3 points – Answered the prompt completely
2 points – Mostly answered the prompt
1 point – Somewhat answered the prompt
0 points – Essay has nothing to do with the prompt

Well-Written and Use of Good Grammar
5 points – Essay is well-written and almost all of the grammar is correct
4 points – Essay is somewhat well-written and most of the grammar is correct
3 points – Essay is adequately written and the grammar is somewhat correct
2 points – Essay is sloppily written and has numerous grammatical errors
1 point – Essay is poorly written and has many grammatical errors
0 points – Essay is incomprehensible

Provided Examples of Supporting Evidence
5 points – Completely supported essay with examples of evidence
4 points – Mostly supported essay with examples of evidence
3 points – Somewhat supported essay with examples of evidence
2 points – Provided a few examples to support essay
1 point – Did not provide enough examples to support essay
0 points – Provided no examples to support essay

Impact of Essay
5 points – Essay was outstanding and made the reader feel invested in the student’s essay
4 points – Essay was good and the reader felt connected to the student’s essay
3 points – Essay was okay and the reader understood what the student was trying to express
2 points – Essay had a point and the reader didn’t lose interest while reading the essay
1 point – Essay was poor and the reader had to work to engage with the essay
0 points – Essay was disjointed and the reader was unable to connect with the essay

Up to 2 bonus points were also given for applications that required supplemental information, but I’ve omitted those criteria for brevity.

After submitting my scores, I wondered how my scores compared to those of other parents. Because I was the first volunteer in my group to complete my assignment I did not have visibility into how the other 2 parents scored the students’ applications. However, I was able to externally validate my scores against those of various large language models (LLMs).

METHODS

There are too many LLMs to count nowadays, so I consulted the 7 that I was most familiar with, and I’ve listed the most probable models that each one is likely to have used as of the time of this writing. Some LLMs are more transparent with the identification and versioning of their free and paid models. For all 7 models, I used the free tier.

  • ChatGPT: Default model: GPT-5.2 Instant; Fallback model: GPT-5.2 Mini or similar lightweight version if you exceed limits
  • Claude: Sonnet 4.6
  • Copilot: Copilot model, built by Microsoft
  • DeepSeek: DeepSeek-V3.2
  • Gemini: Gemini 3
  • Grok: Grok 4.20 beta, Auto (Fast or Expert)
  • Perplexity: model not shown or configurable on free plan

I used the exact same prompt for all 7 LLMs and all 4 students:

You are a parent of a high school student who has volunteered to evaluate scholarship applications. Students who apply for a scholarship under the category of SCHOOL SERVICE are given the following essay prompt: “What contributions have you made to our high school as someone who serves this community?” Students who apply for a scholarship under the category of LEADERSHIP are given the following essay prompt: “Would others consider you a leader and why?” OR “What is your definition of a leader and how do you embody those characteristics?”

The grading rubric is provided in the attached “Essay Scoring Guidelines.pdf” file. Provide scores as whole numbers for the following dimensions in accordance with the scoring guidelines:

1. Followed Directions (0-2 points)
2. Answered Essay Prompt (0-3 points)
3. Well-Written and Use of Good Grammar (0-5 points)
4. Provided Examples of Supporting Evidence (0-5 points)
5. Impact of Essay (0-5 points)

Ignore the “Bonus Points” dimension in the scoring guidelines because the scoring of that dimension may involve evaluation of photos or videos. The student’s essay is attached. Provide the score for each of the 5 dimensions along with a brief justification for each score.

For each model, I pasted the prompt and attached the essay scoring guidelines in a PDF file along with a PDF file the essay for student 1. I continued using the same chat thread, so I only attached the PDF files of the essays for students 2-4, as re-attaching the scoring guidelines repeatedly for each student would have been redundant. For privacy reasons, I have de-identified the student names and am not sharing the actual student essays.

RESULTS

My ratings, along with those of the 7 LLMs, are as follows (click the image to enlarge):

Although the LLMs did provide brief justifications for their scores, I’ve included only the numeric results but could easily furnish the complete LLMs responses upon request.

Overall, there was general agreement between my ratings and the average ratings from the 7 LLMs.   In terms of rank order, I gave the highest scores to Student 1 (19 points), followed by Student 4 (17), Student 2 (15), and Student 3 (12). Using the average of all 7 LLMs, the highest score went to Student 1 (19.7), followed by a 2-way tie between Students 2 and 4 (19.1), and then Student 3 (15.4). In other words, the LLMs agreed with my ratings for the best and worst applications, although they did not draw a distinction between the two applications in the middle of the pack.

Across the board, I was equally or more critical of the essays than the LLMs, as the LLMs generally gave the same or higher scores in each of the 5 dimensions of the grading rubric. Upon examining the total number of points allocated across LLMs, the 3 most “lenient” graders were Grok (78 total points awarded), Perplexity (77), and Copilot (76), while the “strictest” graders were Claude (69), ChatGPT (70), and Gemini (70).

DISCUSSION

All 7 LLMs were up to the task of grading the essays in accordance with the grading rubric. I considered the possibility that some LLMs might not completely follow directions, but all of them adhered precisely to the grading criteria and listed scores that were concordant with the criteria. Some LLMs even tallied up the total scores for each student even though I did not specifically request it in my prompt, and when they did so, they performed addition without any errors.

There are several possible explanations for the differences between my ratings and the LLM ratings. First, it is possible that I’m a tough grader. I went into this activity thinking that these were all brilliant students, and it would not be helpful if all the students clustered around near-perfect scores. In fact, this is exactly the outcome that was observed with the LLMs, as students 2 and 4 were deadlocked in a tie. Second, it is possible that the LLMs were lenient graders. After all, sycophancy in LLMs has been well-documented and researched, and many companies have made concerted efforts to tone down the level of sycophancy as they introduced new versions of their models.

This experiment validates that LLMs can be used to assess the quality of written text when evaluated against a custom rubric. This is probably not surprising to many readers who have already engaged with LLMs in similar ways, including myself. However, this is the first time I’ve quantified my findings. Another key takeaway is that LLMs can be used to critically appraise a body of written text so the author has a chance to make revisions based on the feedback. In academic settings, the mere usage of LLMs is not tantamount to cheating. It’s the way in which an LLM is used that constitutes whether the LLM serves as a learning aid or if it is used to cheat. In work settings, I encourage professionals to take full advantage of LLMs to enhance learning, spark creativity, and optimize productivity. As long as LLMs are used in a way that they do not substitute critical thinking, I think we have a lot to gain.

Wednesday, March 4, 2026

Chicken Al Pastor and Oxford Commas

I was driving my wife home after she had a medical procedure, and she asked me to buy her some food from Chipotle. I listened with apprehension as she rattled off a litany of food items and ingredient customizations, as I knew there would be no way that I’d get all the details right. You see, my wife has very particular preferences when it comes to food. So to ensure that I had the best chance of getting her order correct, I asked her to text the instructions to me. She initially refused, saying that I make no effort to remember her preferences. I said that if I have to remember more than 2 or 3 things about her order, I will screw it up and she will be upset. Besides, I was driving and trying to find the restaurant so wasn’t able to pay enough attention to commit her customizations to memory. So she relented and sent me the following text message (verbatim and therefore in quotes):

“Chicken Al pastor, brown black beans corn, green sauce and salsa on side”

And while I was still driving, she verbally told me to take her phone and redeem an offer for free queso by scanning a QR code provided in the app and also scan her rewards number so she could earn points. I felt that I could remember those last 2 instructions because they were the last things she mentioned, and all the other details were in the text message. I had never heard of chicken al pastor, nor did I know that Chipotle had that on their menu. It turns out that it is a time-limited offer. Note that the link may not work when the offer expires, but here’s a screenshot from that site.

After struggling to find parking, my wife stayed in the car while I entered the store and read my wife’s text message to the server. I was asked, “Burrito or bowl?” to which I requested a bowl which my wife usually gets (BTW, I received no credit for knowing the answer to this question). I also had the intuition to know that “brown black beans” meant “brown rice and black beans” despite the instructions being technically incomplete/illogical (no credit for that one either). After carefully crafting my wife’s gourmet meal, I scanned the QR code for the free queso offer and scanned the QR code for my wife’s rewards program and paid. Mission accomplished, or so I thought (foreshadowing).

When we got home, my wife asked where the green sauce was. I told her that I saw them put the green sauce in the bowl. She complained that she wanted the green sauce on the side, NOT IN THE BOWL.

----- Begin Side Conversation About Oxford Comma -----

One could argue that there was no Oxford comma in her text message, so it should have been clear that both the green sauce and salsa needed to be put on the side. However, if you read the entire text message, the punctuation is wildly inconsistent, so no reasonable person could definitively conclude that the absence of an Oxford comma necessarily meant that the green sauce should have been put on the side. Plus, I am pretty sure that my wife does not know what an Oxford comma is.

----- End Side Conversation About Oxford Comma -----

Anyway, the situation was quite upsetting to her, as she continued to complain that I never try to understand her. I found the situation to be somewhat amusing actually because not only did I anticipate that this would happen, I also called it out and tried to prevent it from happening, and it happened anyway. It’s not that I don’t try to understand my wife as a person, I just have low tolerance for complexity when it comes to fast food, so I try to shift the burden of perfecting an order back on her, and therefore I think she is partially correct on that criticism of me. Also, I think I have been conditioned to just accept that whatever I do, it will be wrong, and I will be blamed anyway.

When I order food, I’ll usually accept whatever normally comes with the dish, or in the case of a build-your-own dish scenario, I’ll just have everything. Honestly I don’t really care that much if I get white or black rice, brown or black beans, or green or red salsa. I certainly don’t need things put on the side, just dump everything in and save a plastic container from taking up space in landfills. Besides, I will eventually mix it all together and everything will come out the other end looking the same regardless of how it was prepared. And if someone orders food for me, I will say “thank you” and happily eat the food. No complaints, no drama.

I am not saying that people should not have detailed food preferences. I just think they should not impose their expectations on others and get upset when people fall short of those expectations. Also, a clearer text message such as this one could have prevented the snafu:

“Chicken al pastor in bowl, brown rice, black beans, corn, green sauce on side, salsa on side. In Chipotle app, redeem offer for free queso and scan rewards code.”

It is specific and understandable, and I just demonstrated how an Oxford comma in combination with other clear communication could have saved the day. Oh what could have been!