Obligatory Migration Post from Wordpress to Hugo

This is the obligatory moved blog from one framework to a different framework article. Wordpress.com asked me for $78 for a two year subscription. However, I dislike the mobile app and the text editing experience online. I also had difficulties editing any part of the website with the in-browser tools. Originally, I signed up because I wanted my focus to be on writing, rather than on coding, a blog. Simply purchasing the Wordpress plan let me test whether or not I wanted to keep up with writing posts at all. It did that, but I didn’t find that WordPress provided much additional value. ...

January 26, 2025

2 years of notes from building an app I didn't release

Close to 2 years ago, I had an idea for a mobile application that allowed users to store, submit, and manage tax reimbursements in foreign countries. For 2 years ago, I on and off worked on this idea and had a functioning version on my phone - and for nearly all that time, I never felt like the application was ready to release to potential users - and it doesn’t look like I’ll ever get it there. ...

November 25, 2024

Questions on “How Congress Can Fix Food Stamps”

The National Review in July published a short opinion piece in July ‘24 entitled How Congress Can Fix Food Stamps. Sam Adolphsen, the author, argues that the cost of SNAP benefits is too high. He comments that “about 17.6 million food-stamp recipients are able-bodied adults, and about two-thirds don’t work,” which leads him to list a series of Republican-led, state-level policies that require SNAP recipients to participate in job training or employment programs. These policy decisions, Adolphsen argues throughout the article, are “common-sense”, “wildly popular among voters”, “turning a handout into the hand up that [SNAP benefits were] always supposed to be,” and are “protecting taxpayers while promoting work over welfare”. ...

September 22, 2024

Play 8 Red Squares

I re-deployed 8 Red Squares, a site that allows you to play through the 8 Queens Puzzle on different sized boards. Future enhancements I’d like to add are Timer (for each segment), and total running time until the users solves n=8. Better mobile support (board size 9 and 10 don’t handle small screens well). Foundational solutions checklist, e.g., if a user wants to find all possible arrangements (excluding symmetries and rotations). ...

September 15, 2024

From a Mouse to a Trackball

I recently bought the Kensington Slimblade Trackball to replace the Logitech MX Master mouse that I have been using for the last year. This is the first time that I’ve used a trackball. A couple of thoughts worth noting that are either omitted from or in conflict with other reviews: The device is too large for me. It takes up almost an entire mousepad, and it is wide enough to force frequent movement between the trackball and the keyboard (I use a Glove80). I blame this partially on the desk, as it requires a roll-out keyboard holder that was not made to accommodate the split keyboard and the trackball. But for a trackball with “Slim” in the name, I expected it to be smaller. ...

September 14, 2024

Lessons learned on dashboard design for early-stage apps

What follows are a few takeaways from a recent app launch, where I had some successes and some things I had to fix. I also maintain dashboards for a wide set of clients on a different project that will be overhauled soon, and would like to apply these learnings during the redesign. The three guiding business questions for initial design are: How are we getting users? What our users are finding value in when using the application? ...

September 7, 2024

Daily SNAP News Aggregator launched

Site is accessible here, and the accompanying GitHub repository can be accessed through that site as well. It is based on a Google Alerts RSS feed, built every ~6 hours with Jekyll and GitHub Actions. Monthly commentary will be included on that site in the future. Immediate next steps are to add in more news aggregators as sources, to try and get articles that are missed. I would like to integrate Google Scholar as well, but it does not appear they offer an RSS feed or any simple method. Article display filtering is currently done on a keyword basis, which has been working fine, but would like to move to a classifier model. ...

June 11, 2024

April SNAP Updates

Note a slightly different format to topic, rather than state-based. Snap Interview Waivers in some places expiring Expiration of Waiver of Interview Requirements for SNAP Benefits in Mississippi Beltrami County SNAP interview waiver ends April 30 I would be very curious to see any study performed exploring differences in program administration and case outcomes between while the waiver was in effect, and the before / after where the waiver is not in place. How has the speed of applications changed? Overpayment or underpayment rates? What do the caseworkers think about this change? I also came across this Reddit thread on the impact of interview waivers, but would like to see a structured case study. ...

May 5, 2024

Joint & conditional probabilities with pd.crosstab

pd.crosstab is one of those built-in functions in the Pandas API that I forget about routinely. I instinctively reached for df.groupby('x')['y'].count().unstack(), but when I wanted to normalize the values, it takes more and more steps to get where I wanted. This was a nice straightforward overview of the pd.crosstab function. To document for myself, below, create a sample correlated DataFrame with integer columns ActiveUsers and CompletedProfile. import pandas as pd import numpy as np # following code from Github Copilot np.random.seed(0) n = 1000 # Number of samples p = 0.7 # Probability of True in the first column rho = 0.8 # Correlation col1 = np.random.choice([True, False], size=n, p=[p, 1-p]) col2 = np.where(col1, np.random.choice([True, False], size=n, p=[rho, 1-rho]), np.random.choice([True, False], size=n, p=[1-rho, rho])) df = pd.DataFrame({'ActiveUsers': col1, 'CompletedProfile': col2}) ActiveUsersCompletedProfile0TrueTrue1FalseFalse2TrueFalse3...... Sample of the constructed DataFrame ...

May 2, 2024

Identifying outbound IP addresses of a Azure Function

Here is Microsoft’s documentation page on the topic. The only reason I am documenting this is because the Azure Resource Explorer failed to load consistently across devices for me. Some tutorials I found, like this one, seem to be outdated and the outbound IP addresses weren’t listed in any Properties menu in the Function App in the Azure Portal. The Azure CLI method was what worked for me: az functionapp show --resource-group <GROUP_NAME> --name <APP_NAME> --query outboundIpAddresses --output tsv az functionapp show --resource-group <GROUP_NAME> --name <APP_NAME> --query possibleOutboundIpAddresses --output tsv I wanted this as I was hoping to whitelist the IP addresses in the database firewall to allow for scheduling some SQL scripts to run daily. The issue with this is the following, copied from the above linked Microsoft documentation: “because of autoscaling behaviors, the outbound IP can change at any time when running on a Consumption plan or in a Premium plan.” While at least a few people say whitelist these IPs anyway, the recommended course of action is to set up a virtual network within Azure. ...

May 1, 2024