Author: Mark

  • Grand Tetons and Yellowstone 2026

    Grand Tetons and Yellowstone 2026

    I spent 6 nights in Grand Teton NP in a campervan, and one night in Yellowstone!

    Hot takes:

    • Grand Teton is better
    • 6 nights at Teton is perfect
    • 1 night at Yellowstone is more than enough
    • Yellowstone vibes are off
    • It’s hard to dress for — lows of 30F, highs of 70F is super annoying

    We rented a campervan. It’s expensive but nice!

    Grand Teton is amazing

    Overall I highly recommend staying at Signal Summit Campground, it’s our absolute favorite. It’s much smaller, very quiet, out of the way from the freeway, and right by the water. We spent many days/nights hanging out at the Boat Ramp for the campground, watching the sun set over the tetons while meeting deer and foxes.

    Gros Ventre campground was alright. It’s pronounced gro von-ter cause it’s French from the beaver trappers. It’s strangely outside the park.

    I would not recommend Cascade Canyon. We did once hiking from the visitor center to the valley, past Inspiration Point, into Cascade Canyon. It’s so hot and exposed and crowded. Many people do both the hike and the shuttle boat, so the trail is full to the brim with people. The only wildlife we saw was actually on the Jenny Lake Loop portion: a marmot, a moose, and a bear!

    Instead of the Cascade Canyon trail, I’d recommend the Jenny Lake Loop. It’s much quieter, you’re way more likely to run into wildlife like these moose, bears, and deer!

    It’s okay, that’s a cinnamon black bear, the friendly kind. We had bear spray just in case, but we got off the trail and let the bear do its thing. Most wildlife prefer to use human trails because it’s easier. Let them be, and nothing bad will happen (unless it’s a grizzly).

    We also ran into a singular moose at Schwabacher Landing!

    I’m particularly fond of these funky trees whose trunks form a weird hook shape. I’ve never seen anything like this before, but there are many of them, and they are all thriving.

    Overall, quite fun and would 10/10 recommend.

    We did it through Moterra which was alright. Kind of expensive but it’s luxery. We had a popup roof so we could stand, it was nice to cook in a van so we weren’t stuck in the cold. Very spacious compared to Escape Campervans. Pickup and dropoff was easy.

    Jackson Hole is Expensive

    I was surprised. It’s one of the most expensive places in the US to live. Look online, the average home price is $20M, and the taxi/Lyft/Uber from the airport is $60 w/o tip. There was a shuttle at one point, but people are too rich to ride a shuttle, so they cancelled it. A lunch can easily run $40 per person. Gas is easily more expensive than in nanny-state California, at $6/gal.

    I did enjoy Thai Plate. Their massaman curry was peanut-heavy and delicious. It reminds me of my first Massaman curry when I traveled to Thailand under pressure from my then-friend, now-girlfriend. I’m surprised the Beli app works well in that tiny town. I’m even more impressed you can get a Too Good To Go bag! It’s only available from Whole Foods, but I would have snatched it up for our 5 days of camping easily. Totally worth it if the timing is right — pickup is 8pm-9pm.

    Yellowstone Vibes Are Off

    I’ll start with the good stuff. We saw a bunch of wildlife and geysers. Uniquely, we saw pronghorns, osprey, and buffalo.

    My dissapointment is that:

    • we have buffalo in Golden Gate Park here in SF
    • our wildlife encounters in Grand Teton were much more intimate
    • humans kind of suck in this park

    Okay, okay. Yes, we only have like 10 buffalo in SF. But also the only beautiful place we saw buffallo was in Lamar Valley. It’s definitely worth the trek out there to see, and you’ll need a scope or binoculars, but it’s nice to see them roam such an open space. It’s weird to see people starting traffic jams because there’s a buffalo on the side of the road. It sucks for driving, and the buffallo don’t seem happy either. It’s no wonder so many people die from being gored by a buffalo every year. Don’t mess with them.

    All of your wildlife experiences in Yellowstone are going to be from your car. The park is so big, and most of the park is open space. There’s no real incentive for animals and humans to run into each other. In the Grand Tetons, we share the trail and it feels nice for both humans and animals. In Yellowstone, cars are driving 45 MPH, why would you want to be near that?

    I’ll mention I’ve never experienced as much “weirdness” in any other National park as I have with Yellowstone. Grand Teton is amazing. Even Big Bend, Texas was a gem compared to this. For context, I’m a liberal from California. But it was kind of in my face how Yellowstone was so much more old, white, and conservative in a lot of negative ways. Almost every stop in Yellowstone has people prominently showing off MAGA shirts and hats.

    People make a lot more weird comments such as:

    That’s a black bear. It wants to eat humans. But not just any human, not Americans. Only Japanese.

    While I was at a geyser, I had the creative idea of twerking to make the illusion of water gushing out of my butt. It’s a dance technique! I’ve been learning it on my hip hop dance journey since Feb 2025. However, it scared some folks and they asked the ranger “why do you think some people do that?” loudly and right next to me. It’s weaponizing shame to manipulate my behavior. Instead of talking to me, he talked about me so that I could hear. It’s sad because I’ve worked hard overcome my performance anxiety. I won’t let this stop me from dancing, but I NEVER experienced this anywhere else. Sure people might stare or laugh, but that’s part of the fun. The shame inducing manipulative comments are not fun, even when the person asking is laughing. Kudos to the ranger for explaining that geysers are beautiful and everyone expresses their sensations in different ways.

    I’ll end on a lighter note with my favorite shirt: “I’m from Vegas and I’ll only get on my knees for one man: Jesus”

    Also, we genuinely enjoyed our meal at Yellowstone Lake Hotel Diner. We picked it because Fodor’s travel book said it was the only place that had unique food. And I’ll say, really did enjoy it. Food is an asian fusion in the best of ways and it challenged my understanding of crab rangoon. I recommend the Duck Bacon Wontons ($16.95), Sticky Ribs ($21), and Yellowstone Caesar w/ Grilled Salmon — done medium ($20) in that order. I’d pass on the Shrimp and Grits ($33) because it’s a bit bland and straightforward.

  • Organize your Slack channels by “How Often”, not “What”

    Organize your Slack channels by “How Often”, not “What”

    A few weeks ago, I changed my Slack channel sections. I’m now more responsive and engaged, while also feeling less stressed. How? By sorting my Slack channels by urgency, or how often I want to read them.

    What
    Projects
    Team
    Alerts
    Sibling Teams
    Announcements
    SF Office
    Social
    Noisy

    Versus

    How Often
    Read Now
    Read Hourly
    Read Daily
    Read Whenever

    Sorting by “how often” lets me read my most urgent messages first, focusing my energy on what matters to me. Once I feel tired, I stop reading. By focusing on my most urgent and important channels, I hold confidence that I have already taken care of what I need to, reducing my stress.

    A screenshot of my Slack sections. The top consists of my “high priority” sections like Read Now, Threads, DMs, and new channels. I go through my unreads from top to bottom until I am tired or I’m done.

    By framing a channel’s importance through the Eisenhower Matrix, I focus on how I contribute to channels.

    UrgentNot Urgent
    ImportantRead Now / Read Hourly

    I directly answer questions, engage in conversations frequently, or react to them in the real world
    Read Whenever

    I read announcements and keep up-to-date with changes
    Not ImportantRead Daily

    I can push the conversation along by forwarding it to different channels or tagging more appropriate people
    Read Never

    Reading these channels is meaningless, but I sometimes write to them, so it’s annoying to leave.

    This framework is flexible. Your needs and availability will change. Projects go from active development to finished. Social channels go through ups and downs. As these changes happen, you can slide the channel between any category, and it’ll still make sense.

    Misprioritized channels are a source of burnout. Noisy channels in important sections waste time and hide the valuable signal. Important channels in noisy sections are missed opportunities. It’s clearest when you think of some sections like Office, Social, and Project. Intuitively, Project is important. Office is important, but maybe not? Social is less important, but I still want to live a happy life. Yet, I kept finding examples that don’t fit.

    ChannelWhatHow Often
    #sf-sweet-treats
    #sf-nyt-crossword
    #fashion-baddies
    Office or Social – Low/Medium PriorityRead Now — cupcakes get eaten fast, crosswords and photos are organized within 15-30 minutes
    #sf-it-helpdeskOffice – Low/Medium PriorityRead Never — It’s never worthwhile for me to read this channel, but I write to them sometimes.
    Project channels that I’m an active contributor toProject – High PriorityRead Hourly — I’m often answering questions to unblock other people
    Project channels where I’m a passive contributor toProject – High PriorityRead Daily or Read — I want to stay on top of announcements and changes, but I’m not actively contributing

    I conclude that organizing by “what” is pointless.

    Why do we organize by “what”? I think because, by default, Slack suggests Priority, Team, Announcements, and Social, priming us for “what”.

    It’s easy to categorize by “what”. It’s easy to explain, and it’s easy to have icons. But I don’t find it useful.

    How did I start categorizing by “how often”? Is a channel high or medium priority? Just guess. Your gut instinct is probably right. In the worst case, you’re wrong and you slide it up or down. If you’re deeply unsure, put it into Read Hourly or Read Now first. You’ll quickly know if it was the wrong decision. After a couple of wasted moments, slide them down a level. Repeat until the channel stops bothering you.

    I’ve been organizing my Slack by “how often” for almost a month now, and have successfully maintained Inbox Zero for Slack every day. Give it a shot!

  • adding my home electricity uptime to status.href.cat

    adding my home electricity uptime to status.href.cat

    status.href.cat now reports and notifies me if my home power/internet goes down!

    (more…)
  • I modeled for swap.care, a probiotic deodorant.  It works really well!

    I modeled for swap.care, a probiotic deodorant. It works really well!

    A few months ago, I trialed a new probiotic deodorant that uses GMO’ed bacteria to fight odors. It worked REALLY well. I applied the cream once and it worked very well for a week, and still had noticeable improvements to my normal body odor after a month. I did not need to use deodorant at all for a week! Normally, even if I shower in the morning, I’ll still come out stinky and sweaty by 5pm. With Swap, I have no worries even if I’m super active. The sweat doesn’t smell!

    Currently, it’s only available in Japan, but swap.care will hopefully be available in the US soon.

    I think it’ll be particularly useful for people like me who sweat just by walking around the city, and are self-conscious about body odor throughout the day. I’d be excited to try this product backpacking as well.

    Swapを試してから、毎日デオドラントを使うことを気にしなくてよくなりました。

    Since I tried Swap, I no longer have to worry about using deodorant every day.

  • Featured: 18 Reasons Community Porgrams Coordinator!

    If you’re looking for a nice non-profit job running community cooking and nutrition classes in San Francisco, check out 18 Reasons! They’re hiring!

    Here I am, teaching a class of elderly seniors how to balance eating nutritiously with their various medical and health needs.

    https://www.instagram.com/p/DJnIVeds8jy

  • docker compose up -> 401 Unauthorized

    I was trying to set up a new retool instance on docker when I encountered a 401 Unauthorized error:

    $ docker compose up -d
    [+] Running 3/3
     ✘ retooldb-postgres Error failed to resolve reference "docker.io/library/postgres:15...                          0.8s 
     ✘ https-portal Error      context canceled                                                                       0.8s 
     ✘ postgres Error          context canceled                                                                       0.8s 
    Error response from daemon: failed to resolve reference "docker.io/library/postgres:15.12": failed to authorize: failed to fetch oauth token: unexpected status from GET request to https://auth.docker.io/token?scope=repository%3Alibrary%2Fpostgres%3Apull&service=registry.docker.io: 401 Unauthorized

    I had just signed up for a new docker account and had not verified my email yet. Docker will return 401 Unauthorized if your email is not verified.

    I’ve hit this issue a few times before, always after starting a new job. Quite frustrating!

  • Can you solve this AI/Math puzzle and get a prize? I couldn’t.

    I found a poster with a math puzzle that points to a reward website. I couldn’t figure it out, so maybe the prize is still available!

    The paper was taped on a traffic light pole at 15th St and Mission St in SF. It prints a math-ish AI-related formula followed by “.ai/givemeprize” and entices the reader to “come find me”. The SF Armory stands out of focus in the background, previously housing kink.com and Star Wars: The Empire Strikes Back. Both the SF Armory and the telephone pole now sit empty and barren.

    Here it is all typed out:

    prefix(
        [
            3!
            + argmax(
                softmax(
                    [log(2), pi + e]
                )
            )
            + log*(16)
        ] ^ [
            BusyBeaver(4)
            + ⌈H100 flops / A100 flops⌉
            + 1
        ]
    )
    
    .ai/givemeprize

    Stop here if you want to work on the puzzle yourself!

    My Breakdown

    Below is everything I figured out before I got stuck.

    • argmax refers to numpy.argmax returns the index of the maximum in an array
    • softmax is more interesting. Wikipedia’s definition is complicated, but pytorch explains it concisely around normalizing probabilities to sum to 1.
    • log is maybe log2 because of the computer context, maybe log10, but probably loge because numpy and pytorch both assume loge.
    • log* is confusing. I’ve never seen that syntax before. Is that natural log, aka loge? I’m guessing it’s log2 because the argument is 16, which makes a nice and round answer of 4, like the rest of the problem.
    • BusyBeaver(4) is either the maximum shift 107 (likely) or the maximum score 13 (original)???
    • H100 flops and A100 flops are the flops on the H100/A100 Nvidia chip. There are so many variations. But “H100 flops/A100 flops” is surrounded by upper brackets, which is ceil. Thus, I only need a best guess. Running through a few numbers, I get around 3.04 to 3.5, so ceil is 4.
    • prefix is weird, but I’m guessing it’s the integer portion of the number, not the decimal portion.

    Here’s my reduced form:

    prefix(
        [
            6
            + argmax(
                softmax(
                    [0.693147181 , 5.85987448]
                )
            )
            + 4
        ] ^ [
            107
            + 4
            + 1
        ]
    )
    
    .ai/givemeprize

    I don’t need to run softmax, because I know the second number will be bigger and argmax will return its index. Argmax is zero-based, so that reduces to one.

    prefix(
        [6 + 1 + 4] ^ [107 + 4 + 1]
    )
    
    .ai/givemeprize

    Again, reducing by simple math:

    prefix(
        [11] ^ [112]
    )
    
    .ai/givemeprize

    Maybe the answer was 11.ai/givemeprize, but now it 404’s. They’re not based in SF, so I doubt it.

    Open questions:

    That leaves these options:

    BusyBeaver(4) = 13BusyBeaver(4) = 107
    log2prefix(11 ^ 18) = 5559917313492231481.ai/givemeprizeprefix(11 ^ 112) = https://4.3249464815*10^116.ai/givemeprize
    log10prefix( (7 + log10(16)) ^ 18 ) = 28351501028247453.ai/givemeprizeprefix( (7 + log10(16)) ^ 112 )
    loge or lnprefix( (7 + ln(16)) ^ 18 ) = 93742854.ai/givemeprizeprefix( (7 + ln(16)) ^ 112 )

    I considered looking at recently registered domain names. I could filter by domains only containing numbers and under the *.ai TLD. I could hit them all at /givemeprize and see who responds at all and without 404. Unfortunately, that information is behind paywalls.

    I love puzzles, but I’m done with this one. I don’t think I get it. Maybe I missed something.

    The Last Bits

    Someone left the correct answer in the comments, but didn’t show any of the work, which is frustrating cause I want to understand!

    However, folks at lobste.rs guided very kindly and I figured out my mistakes!

    • log* is iterated log. I could have learned this if I used ChatGPT or WolframAlpha instead of Google.
    • BusyBeaver(4) is 13, my less likely answer
    • this makes the exponential 10^18
    • prefix in the context of 10^18 is the SI prefix, like EXAbyte or TERAflops. So the answer here is exa.

    I somehow got a lot more traction on HackerNews way after I posted.

  • Cat

    Cat

    We watched someone’s cat for a week.