• Tuesday

    • Private work.
    • Windows+space to switch keyboards.
    • Jinja’s |round(places) filter.
    • Mealprep.
    • Supercontest.
      • Added “average pick margin” for each user’s “overcoverage” assessment. Picking a team who covers their line by 20 points is different than covering their line by 1. https://gitlab.com/bmahlstedt/supercontest/-/issues/204
      • Made alltimelb only consider FINISHED games. Matchups, allpicks, lb – those pull data for all games.
      • Added a “pick random 5” button: https://gitlab.com/bmahlstedt/supercontest/-/issues/205
  • Monday

    • Private work.
    • Sliding windows! Right pointer = main for loop, left pointer = while loop inside. Some sort of aggregation, sum, subarr len, whatever. Then a max check on every outer iteration.
    • Meta Connect, AI conf wed/thurs (virtual).
    • Had a readthedocs build hang today, not sure why. Branch passed again with no change.
    • Asked chatgpt who the most famous person on the planet was (remember only up to 2021). Many factors, of course (politics, social media, business, celeb, etc) – but it said (1) Obama (2) Ronaldo (3) Beyonce (4) Elon (5) Queen Elizabeth II.
    • Amazon 4B in anthropic.
    • Supercontest.
      • Added graphql back: https://gitlab.com/bmahlstedt/supercontest/-/issues/200.
      • Overall, the maintenance of graphene/-sqlalchemy/-filter is pisspoor. These are fundamental python graphql libs.
      • Updated pyright syntax for single-line disables.
      • Deleted flask-monitoring dashboard (will replace with aws, which has cognito and a ton of analytics).
      • Handled dup emails: https://gitlab.com/bmahlstedt/supercontest/-/issues/210
      • Changed gunicorn to preload_app=True so that it will load all app logic before workers fork. Then stuff like apscheduler jobstore additions only happen once in the master, not in each server thread.
      • Fixed the scorefetch issue from last TNF (noticed it tonight for MNF as well): https://gitlab.com/bmahlstedt/supercontest/-/issues/212
  • Sunday

    • Private work.
    • Fridge bulb went out, 40W. Nope – fuse blew overnight for some reason.
    • Briley’s 40th next year in mexico: https://hellorileys.com/
    • Dvorak is still really slow. Takes ~50hrs to learn, and speed + accuracy are both about 70% better than qwerty for most users: https://www.mit.edu/~jcb/Dvorak/. There’s also colemak, which people love because it minimizes finger movement.
    • Kalustyan’s, made harira.
    • Ordered another $500 of aquaria.
    • Supercontest.
      • Picks locked properly.
      • All-picks email went out properly (x3, known).
      • Fixed PW hash issue: https://gitlab.com/bmahlstedt/supercontest/-/issues/211
      • Confirmed the stripe flow still works, Cioppa ran it today successfully.
      • Scores updated properly.
  • Saturday

    • Private work.
    • Added US-Dvorak keyboard to my desktop. Faster. Will learn a bit and try.
    • Honey roasted 10lbs peanuts (325 not 350), made PB.
    • Inf is type float in python.
    • Supercontest.
      • Some bugfixes: https://gitlab.com/bmahlstedt/supercontest/-/issues/209
      • The logic for email is from the exact user notification prefs in the db. Email when picks open, email when picks closing, email all picks. The first one is the primary (although pretty much everyone has all 3 set the same, one way or another).
      • Confirmed the late-pick-email-reminder went out at 8pm ET via the autoscheduler.
      • 504 gateway timeouts on the prod url after deploy. I accidentally ran make start-dev on the prod ec2, which (I believe) killed (or orphaned) nginx and caused the ELB target to go unhealthy. The checks are every 30 seconds, and need 5 in a row to be healthy. Don’t start the dev app on the prod server! My proper CICD pipeline will fix this later, as planned.
      • Remember the network path: client -> route53 -> elb -> ec2 -> nginx -> gunicorn -> flask.
      • Apt upgrade/autoremove on ec2. System restart.
      • Restarting wiped whatever the lowlevel problem was. Fixed.
  • Friday

    • Private work.
    • Magnus Hikaru SCC final!
    • Cisco buys splunk, 28B.
    • Hash sharding is when you hash the row and place it in that location, evenly distributing. Key/range sharding is when you control which buckets the data is sharded into.
    • Wheel of Time isn’t really doing anything for me. Kim Kardashian does not look human in AHS. Billions stays excellent.
    • Tips for NYT mini:
      • If you get the first across, immediately switch to down. You’ll have the first letters of the words.
      • Else, go to the first down and repeat (switching to across if you get it).
      • Desktop is faster than mobile.
    • Supercontest. The scores (including statuses) did NOT autoupdate last night during TNF. Week ID 159, game IDs 2692-2707, contestant IDs 4735-4766. GJM pats lions bengals bears titans, me colts niners titans saints chargers, raj vikings raiders, derek bills titans steelers patriots seahawks. So ONLY my niners pick was impacted. Good. Will debug tomorrow.
  • Thursday

    • Private work.
    • Rocket Lab: https://spacenews.com/electron-fails-during-capella-space-launch/
    • Chrome will re-request a non-200 page every minute if it’s the active tab (at least that’s what I’m seeing locally).
    • Supercontest.
      • Finished all the pre-2023-season prep (and backfill since late).
      • https://gitlab.com/bmahlstedt/supercontest/-/issues/202
      • Just a quick reminder of db/model hierarchy: teams, coverage options, location options, prediction options, seasons/weeks, leagues, etc. These are all the (relatively) static tables. Then 2 complex tables. There’s the games table, with datetime, line, and status (no teams/scores/results). And there’s the contestants table, two rows pointing to a single game, each identifying the team/prediction/location/score. opponent_score is denormalized here, so that we can autocalculate coverage/margin locally – the only 2 generated cols in the app. The picks table just points at a user and a contestant.
      • Some bugs in the picks flow.
      • Scores, added User-Agent to requests for scores rather than full webdriver. Some APIs this year started 403ing without this header.
      • Gunicorn perceiving upstream errors (requests within a worker, from the app to elsewhere) as downstream (client, requests to the app) – https://github.com/benoitc/gunicorn/issues/1507
      • Be careful using python’s next iterator inside of webapp routes served by gunicorn. The StopIteration exception raised when there’s no result is caught by gunicorn and perceived to be a client disconnect, so the route returns nothing, swallowing all useful info.
    • Niners giants, trivia, ues, murphy’s law, old citadel friends.
  • Wednesday

    • Private work.
    • Garden maintenance. Harvested basil and made avocado garlic sesame pesto.
    • Ortho.
      • Got the trays. 26 total, but should be very light. Supposed to be 14 days per, but I need so little movement, so we can do 10.
      • Created appt in 6 weeks for trays 4+ and polish.
      • My Invisalign app tracks tray #, days left, includes a timer for tray-off time, more.
      • 22hrs/day.
      • Chewies twice per day to align (don’t bite hard).
      • Only water. Everything else, remove. Any food, coffee, tea, gum, anything but water.
      • Take out, wash, put in container. Then floss/brush before putting back in. This makes eating/drinking much more intentional.
      • This was very distracting today. So new/foreign in the mouth, hard to focus on anything else.
    • Levine continues to ride Elon.
    • Remember gworkspace is increasing its prices starting feb 2024. But only for the flexible, not annual plans. Business starter is still $6/user/mo. Switched mine from flexible to annual.
    • Magnus and Hikaru advance. SCC final on friday.
    • Terraform -> fork -> Open Terraform -> OpenTF -> OpenTofu.
    • Supercontest.
      • https://gitlab.com/bmahlstedt/supercontest/-/issues/172
      • Again, I prefer to use the full models and sqlalchemy (db in sbsc) in migration scripts, as opposed to alembic’s op.
      • Example (instead of op.execute): season_id = db.session.scalar(text("SELECT last_value FROM seasons_id_seq"))
      • Wrote a bunch of data migrations.
      • Backfilled weeks 1 and 2 (lines, picks, scores).