Tess and EJ came over for dinner. They surprised me with cards, presents, and an incredible gluten free chocolate cake from Noe Valley Bakery. (Their cakes are amazing, by the way; you should totally get one.)
Both my cats, Rowan and Ash, greeted me Sunday morning and hung around for some good snuggles.
I went to Kabuki Springs in Japantown, where I had a massage and a couple hours’ soak in the baths. 🧖🏻♀️ I haven’t had a massage in quite a long time and it was great to unwind for a while.
Tess and I spent the night at the Fairmont Hotel, and had dinner at the Laurel Court.
So much credit goes to Tess, who booked all the things and made the whole weekend happen. She took such good care of me, and I feel very loved.
A number of friends and family also reached out to wish me happy birthday. I’m deeply grateful for all of your birthday wishes, and for taking the time connect. <3
]]>Honestly, when I first saw the thumbnail, I thought it was clickbait. But then Tess sent me a link to a post on Cohost.
What everyone is missing about Tetris
That got me to actually go back and watch the video above, and the news is pretty amazing.
I’ve often thought that Tetris, like many other games in the puzzle genre, is a bit grim. There’s no winning; the game continues until you succumb to the increasing difficulty, or make a critical error that costs you the run. Don’t get me wrong though: I still love it.
It’s thrilling to see that humans can in fact overcome the game’s programming. The techniques and analysis folks in the Classic Tetris community have developed to play faster and more accurately are mind-blowing, too.
Well done, Blue Scuti.
]]>I found the mostly excellent, occasionally vague and confusing Chess Programming Wiki and have been using that as a guide. It helpfully says this on it’s Getting Started page:
The very first step to writing a chess engine is to write a complete, bug free board representation that knows every rule of chess.
As a software engineer, the “bug free” bit cracks me up.
My engine is called ChessFriend. It uses bitboards for its board representation. As of this post, I’ve managed to write a board representation that allows me to place pieces of both colors on any square, and I’m hacking away at the move generator. I’ve also written a small command line “board explorer” utility that can interact with my board representation. Of course, it has a pile of unit tests, helping me inch ever-so-slowly toward that blissful bug-free state.
It’s written in Rust. I’ve mostly avoided fighting with the borrow checker.
]]>My vision since I started posting more here has been to use it as a place to share all sorts of things: stuff I’m working on or thinking about; photos; and stories from travel and life.
I often fall into a trap when I sit down to write something in which I feel like I must first invent the Universe. The need to explain everything from first principles seriously hampers my ability (and frankly, desire) to write anything. I don’t want to only post carefully thought out, highly edited and polished pieces, though I certainly hope some of my posts reach that bar. I hope to also post quick notes and sketches of ideas. I’ve enjoyed reading some quicker posts from Tess and Elaine this past year, and I’d like to follow their example.
I’m not setting myself a specific goal here. The idea is just “more” in a certain general direction. I don’t want to commit to a specific frequency or quality. Instead, I’m hoping this post sets a foundation on which to build a sustainable thinking-writing-sharing habit.
Thanks for coming along. :)
]]>Every year since middle school, I’ve made cinnamon buns to share with my family. It’s a tasty tradition, and this year was no exception. 😋
]]>Every year, Chandler, AZ puts up a giant Christmas tree made of tumbleweeds. They make a big show of lighting it too. It’s silly, hokey small town stuff – despite a population of nearly 300,000 – that I find rather charming.
]]>Get it at Folio in San Francisco, or on Bookshop.org.
]]>I learned chess as a kid. My dad taught me. I played in chess clubs in elementary and middle school. I was really into it for a while!
I have a Chess.com account now: erynrwells. I’m also on lichess.org: I’m erynrwells there too. Send me a friend request or challenge? :)
]]>I found this hat abandoned on a park bench in the San Diego Zoo Safari Park. I thought it was neat.
]]>Two brilliant blue lotus flowers with pink centers, in a muddy pond, surrounded by a plethora of striped lily pads.
]]>These days I have way too many social media accounts. I’m mostly on Mastodon and Instagram.
]]><link rel="self">
– it was pointing to a nonexistant feed.xml file. Second, I was
omitting a <link>
tag from the entries entirely.
Thunderbird didn’t like this. With no <link>
for an entry, it would show the
feed’s <link>
in it’s UI. And that link left users at a 404 page.
I pushed a fix this morning. You might have to refresh or resubscribe to pick up the changes.
]]>As of today, five days later, my server has registered just over 200,000 page accesses.
Bandwidth saw a bit of a spike too.
To my knowledge this is the first time anything I’ve published on the internet has been picked up by Hacker News. It’s jarring to realize so many people have visited my website in the last several days, reading this and other things I’ve written, listening to music I’ve published, and looking through photos I’ve posted. It’s a little like having surprise house guests and realizing you haven’t tidied up in a little while.
I only took a brief look at the comments. I was pleased to see they were civil, and mostly reminiscing about the days of Netscape and the early web. I had a few people reach out to tell me they enjoyed my post too.
Thanks, y’all, for reading my little corner of the web, and for your kind words.
]]>I started out doing some web searches that turned up several versions. One was promising but far too big: 400×400 px. Worse, after some shoddy resize attempts, the “pixels” had become rectangular.
This would not do.
I continued searching, hoping to find the original animations. I found someone’s mirror of Netscape 5.0 on Github. Then I found some very old versions of Mozilla on a Mozilla FTP server. Sadly, the animations had been stripped out of these archives. :(
Frustrated with hitting several deadends, I complained to Tess and wondered aloud if anyone might have the original images stashed away somewhere. She quipped that if anyone did, it would be Jamie Zawinski.
A little later, I posted about it on Mastodon.
And wouldn’t you know it, a friend tagged @jwz
asking if he had
it, and a few moments later I got a reply from Jamie himself.
If you don’t know, Jamie Zawinski is well-know for working on several important software projects in the ’90s. He worked on Netscape Navigator, built and maintains Xscreensaver, and several other things. Nowadays, he owns and runs DNA Lounge in San Francisco.
There are a lot of neat bits of web browser history on the page he linked – totally worth a quick look over – but most important to the quest at hand, it had that Netscape meteors loading animation.
The original one has some small artifacts on the left side of frame 10 that render as red and orange pixels. These bothered me enough that I made a version that replaces those pixels with ones that match the surrounding pixels. Here’s the modified 60×60 one and a bigger 240×240 px one, for good measure:
]]>Apple Park is a beautiful place to work. One of my favorite things about it is the care and attention paid to the landscaping. There are many walking paths all over the grounds, and the land has been shaped in an artful way that leads to views like this one.
This is Steve Jobs Theater, taken from the ring road around the main building.
]]>Tess, EJ, and I took a little weekend trip over Memorial Day this year to Pajaro Dunes beach, just west of Watsonville, CA. The beaches were sandy and covered in these beach grasses. The sunsets were lovely.
]]>Tess, EJ, and I took a little weekend trip over Memorial Day this year to Pajaro Dunes beach, just west of Watsonville, CA. We had a lovely time hanging out on the beach, playing games and music, making Kiwi Crates, and spending time together.
]]>長谷寺 is a temple in 鎌倉 . It has a beautiful zen garden tucked away behind a wall. I think the surrounding buildings might be monks’ quarters or administrative buildings for the temple. The gate was open the day I visited.
]]>These cute little stone statues of happy, smiling monks were all over 長谷寺 .
]]>ハチ公 is an incredibly good boy.
]]>新宿 at night is how I’ve imagined 東京 since I was a kid: futuristic, bright lights, rain, and lots of umbrellas.
]]>This was my first trip to Japan. I had been wanting to travel there since I was a kid playing Pokémon Red on my OG Game Boy. To say I was excited is a bit of an understatement.
You can read all about our trip on my travel log page. Tess also wrote about it on her website.
]]>This photo is a corner of the older part of the Imperial Palace in Kyōto. I’m impressed with the intricacy of the construction: the number and precision placement of the support beams, and the all of the artful details in the eaves and roof tiles.
]]>The pagoda at Heian-Jingū
]]>金閣寺 was built as a private residence of a powerful lord. The house and surrounding grounds are beautiful; you can imagine escaping there for a few days to get away from the hustle and bustle of Japanese court life. In his will, he bequeathed the site to his favorite Buddhist sect who transformed it into the temple it is today.
]]>清水寺 is a Buddhist temple in the hills on the east side of Kyōto. It’s known for being the source of three sacred streams of water that grant various benefits to those who drink from them. (Tess and I did drink from one each; drinking from all three is said to be bad luck and greedy.) It is also known for it’s incredibly high “stage.”
]]>The challenge at 伏見稲荷大社 , is to capture both the manmade and natural elements of the shrine. I don’t think I really did it in any of the photos I took. Here is an attempt.
]]>On our way into 大阪 , we flew south over 東京 , passing 富士山 on the port side of the plane. It’s very big, and very round!
]]>Another gratuitous photo of cherry (or pear?) blossoms. at Precita Park in San Francisco. ‘Tis the season after all.
]]>Thinking about cherry blossoms this time of year.
]]>Riding the chair lifts at Loveland Ski Area in Colorado with two of my oldest friends.
]]>Tess got me this book for Christmas 2022 on a whim at a local bookshop. It’s a series of essays – reflections and examinations – of the author’s time parcipating in one of NASA’s Mars analog missions on Mauna Kea, Hawai’i. She is a lesbian and, as luck would have it, lived in the same part of town that Tess and I do! It was fun to read little anecdotes about her and her (ex) wife stopping in at shops that we frequent ourselves.
I enjoyed reading about her experiences working with NASA in the context of an analog mission. It sounds like they went above and beyond to make the mission as close to a real Mars experience as possible, despite being firmly on Earth. Communication with mission control was artificially delayed 20 minutes, as it would be on Mars. Going outside required putting on bulky spacesuits. And participants were isolated together for six months.
She also has several essays in which she reflected on the politics and cost of spaceflight, and what it means for humans to explore and exist in space.
Support a local bookshop and get it from Folio Books. 🙂
]]>I checked out Dave Grohl’s new memoir from the San Francisco Public Library as an audiobook after a friend recommended it to me. Broadly, it’s a series of anecdotes from his life, many of which include famous celebrities and musicians.
Dave seems like a really genuine person. Throughout the book he expresses his gratitude for the people who’ve supported him along the way. He’s been through many challenging experiences too, and reflects on them with a positive attitude. I enjoyed his humor and humility, and the pearls of wisdom he’d earned from those experiences.
]]>r/nethack
, I came across a post from someone sharing a collection of AI-generated
images that illustrate the story arc of a game of Nethack. Between the images and the prose they added around
it, I thought they did a fantastic job of capturing the mood of the game.
]]>Spent a couple days in Laguna Beach before Christmast this year. The water and the weather were beautiful!
This photo is taken from an oceanside terrace at the Surf & Sand Resort. I snuck in, looking for a place to sit by the water, and spent a couple of hours there. Don’t tell the management. 🫣
]]>Rowan sitting in a sunbeam, casting shadows on the wall.
]]>Some highlights:
I got all the way to the bottom of the Mines, fought several vampires and trolls, but somehow completely missed the luckstone. I did pick up a grey stone, but it ended up being a touchstone.
I got a Wand of Wishing! I was zap testing wands in Minetown and the game asked me for a wish! I had no idea what to wish for – it was my first time getting a wish 😱 – but I had been watching Adeon’s Nethack speedrun at the 2017 Roguelike Celebration and remembered him wishing for some absurdly qualified dragon scale mail, so I ended up with a +2 uncursed silver dragon scale mail that brought my AC down to -10. It saved my butt later on when I ran into a bunch of winter wolf pups because it reflected their cold beams.
Later on in the mines, I stepped on a polymorph trap that transformed me into an ice dragon. That transformation caused my dragon scale mail to fuse into my body. When the transformation ended, I was left with simple dragon scales, which were still silver, but no longer had the big defense bonus. Boo. :( I did get to lay two eggs that hatched into baby ice dragons. Baby dragons are ravenous and indiscrimate.
The baby dragons killed the Oracle. Whoops.
In the oracle level, I tried to dip my long sword into the fountains around the Oracle, hoping to find Excalibur. Just a few turns before, I’d fought a gelatinous cube that corroded my sword. I didn’t notice at the time though, so dipping went horribly wrong… Not only did my corroded long sword become thoroughly rusted, it also eventually became cursed. Oddly enough, that sword was still the best weapon I had, and I used it to the very end. I need to figure out how to replace weapons that get degraded like that.
I solved Sokoban with some help from the Nethack wiki for the first time. The puzzles are hard but I enjoyed thinking through them. The monsters in there, especially in the upper levels are hard: multiple elementals, several packs of winter wolf pups, yetis, apes, and a zruty. I got through the last level and discovered a mimic blocking the hallway to the zoo. It killed me.
Near the end, I was testing amulets and put on an Amulet of Changing that caused me to switch genders. Boo.
It’s in my logfile now too.
]]>Pulled out two of my favorite synths tonight, the Moog Matriarch and the Roland JU-06A, for a little jam session on the floor while Tess and I wait for our dinner reservation.
]]>All the times on that page are in UTC. Here are some handy conversions (in 24-hr form) to PST for those of us on the US west coast:
Contact | Time (PST) |
---|---|
P1 | 00:02 |
U1 | 01:09 |
U2 | 02:16 |
Max | 02:59 |
U3 | 03:41 |
U4 | 04:49 |
P4 | 04:56 |
If these times make no sense to you, the eclipse starts at roughly midnight tonight, the total eclipse is between 02:16 and 03:41, and it ends at 04:56.
More information about contact points for lunar eclipses can be found in the Timing section on the Wikipedia page for Lunar Eclipse.
]]>Maine did not disappoint on our last full day in Harpswell. The sunset was gorgeous, and a bunch of us walk out on the mudflats to check out the literal thousands of snails, barnicles, and seaweed.
]]>We took a short hike on Orrs Island, near where we were staying. It was a small loop trail in the ominously named “Devil’s Back” trail area that wasn’t particularly strenous apart from the soft ground and many rocks and roots we had to hike over.
We did have to do the limbo under a fallen tree though.
]]>Isabella Stewart Gardner was an obsecenely wealthy lady with a very strange and cool house.
]]>A perfect maple leaf in Boston Common.
]]>Saying hello to the Atlantic in Scituate, MA 🌊👋🏻
]]>Here’s a quick summary of what I found.
The function to create a dictionary is called dict
and it takes a
variable number of arguments that alternate between keys and values. It reminds
me of this bizarre and backwards NSDictionary API in Apple’s
Foundation framework. Keys must be strings (or string slices) and values can be
anything. So this:
creates a structure that looks like this JSON object:
You can also create an empty dictionary by calling dict
with no arguments.
Statically, you can get a single item in a dictionary with dot syntax. Below,
$item
will get the value 1.
If you want to get a value with a key you get at render time, you can use the
index
function. In the snippet below, $item
will get the value of
"b"
, which is 2.
index
doesn’t make much sense to me as a verb for accessing values in a
dictionary. It sounds more like an array function, and indeed it’s the function
that gives you access to items in arrays. I would like to see another function
with a more dictionary-sounding name, like get
or value
or item
, even if
it were just an alias for index
underneath.
This is a bit complex because, as far as I can tell, dictionaries are immutable.
So, if you want to update a dictionary, you need to combine two dictionaries and
then save it back to the original variable. The merge
function does
that. Here’s a snippet:
merge
takes a variable number of arguments, and merges dictionaries left to
right. So, items in dictionaries later in the argument list will override items
in dictionaries earlier in the list.
Just to underscore, you have to set the update dictionary back to the original
variable to complete the update, hence the $d = ...
.
All that is to say: at the end of that snippet, $item
will get the value 4.
For the previously mentioned template changes I was making, I was updating the
terms
template for my category taxonomy. For each category, I wanted to show
one section per tag, and a list of all the posts with that tag underneath.
My categories are high level groups like “Tech,” “Music,” and “Travel.” Tags are more specific topics for the post like “Web” or “Compositions.” Pages only ever have one category but they can have multiple tags.
A terms
template lets you access an array of terms, and the pages associated
with those terms. You can access the tags attached to a page with the
.GetTerms
function. Here’s what I did, and then I’ll talk through it:
$pagesByTag
is my empty dictionary. It will hold tag names as keys, each
pointing to a slice (array) of page objects. For each page, I get its list of
tags. For each tag, I check $pagesByTag
to see if it already has a key/value
pair for that tag. If not, I create a new entry in $pagesByTag
with merge
.
If it does already, I get the slice for that tag with index
, add the Page to
the slice with append
, and then merge the updated slice back into
$pagesByTag
with merge
.
It’s not too bad once it’s all spelled out, but it does feel like more work than it should take for such simple operations.
I think this API could be improved substantially with some new functions that operate specifically on dictionaries and that have clear names that describe what they do.
]]>I fell in love with this piece of street art depicting Sappho as a modern woman by @muckrock in Σκάλα ερεσού.
]]>This temple is the best preserved building on the site of the Ancient Agora of Athens, Αρχαία Αγορά της Αθήνας.
]]>When I visited London, I had the opportunity to take the train a short way north to Bletchley Park. During World War II, this is where Alan Turing (among many others) worked tirelessly to break the ciphers the German forces used to encrypt their messages. Most notably, this is where the Enigma machine was broken, with the help of mechanical computing machines developed by Turing and others.
It was thrilling to be here where so much history had taken place.
]]>Nethack is the first roguelike I ever played. There were a bunch of students in my Computer Science program at Oberlin that were always playing it in the CS labs.
Most recently, it’s what got me hooked on the genre all over again. Famously, it gives you almost nothing to go on when you start. It’s up to you to figure out everything based on what you – the player – know about the game. It’s like a puzzle!
Brogue is the first Roguelike I played after only ever playing Nethack. The first time I started it up I was in awe. It does a really great job of making use of the terminal to render a beautiful world for you to explore. The water (there are lakes!) animates, there are fields of mossy grass and plants, there are blobs of goo that explode and spread noxious pink gas everywhere.
My friend David introduced me to Dungeon Crawl Stone Soup on Twitter. I think it does a good job of distilling the complexities of many roguelikes into a simpler form that’s still rich and engaging. I really like how easy it is to drop in on people and observe games too!
]]>tmux
sessions
associated with my account. I noticed I had a session running and attached to it
to see what it was.
In that session I found a Nethack game that I’d started back in January and never finished. I finished the game, killed by a Woodland Elf, and, well, the damage had been done.
It has been three weeks and I’ve had at least one game of Nethack going on my VPS or my laptop nonstop since then. There’s been at least one Safari window packed with NetHackWiki tabs too, including a pinned one for the Price Identification page.
I may have gotten a little carried away a time or two.
Me, a normal person, SSH’d into my VPS from an iPad to play Nethack. pic.twitter.com/Br1bqm0RL1
— Eryn Wells, erynofwales @ mastodon dot social (@erynofwales) April 3, 2022
I’ve gotten much better in that time. My scores have increased from the 1000-2000 range to my best game so far in which I scored 9401 points. Who’s to say if I’ll ever ascend, but I am having a lot of fun with it.
It’s even got me thinking about building roguelikes… (hmmm)
For fun and cause I’m a huge nerd, I put together a page on my site that will auto-update with my latest scores each time I publish the site. Check out my Nethack logfile for that.
]]>TIL, ZSH has a profiler built in. You can start it by calling the following.
Then, once you’re done, you call zprof
to get a report that tells you where
ZSH is spending most of its time. I put the line above at the top of my
.zshenv
and then called zprof
at the end of my .zshrc
.
Over the years, my shell init has grown organically in various ways as needs arise. I add things, hack around to make things work, and don’t generally pay attention to the overall structure of it. I’ve also frankly never spent a lot of time to learn the quirks of how ZSH behaves, and the most efficient ways of doing things. So, when I started this process, my init was taking close to a second. By the end, it was down to about 100 ms. Not bad for a couple hours of work. :)
]]>This is my submission to the Three Module Challenge show put on by Colorado Modular Synth Society in late January 2022. This is my first time submitting a performance to a show like this, and I was super nervous. 🙈 I persevered though and it was well-received. The hosts had some nice things to say after too.
Submitting a video to a show like this is a nice way to dip your toe into performing, without the stage fright that comes with doing it live in front of a crowd. I encourage you to give it a go if you’re interested in performing!
]]>I’m writing this in the airport having just spend a week with a group of friends who mean the world to me. For the past 18 months, we have been spending our Monday nights on Zoom with each other. They’ve been an anchor of my week, consistently one of the highlights, and a vital community during the COVID-19 pandemic, when I was often feeling otherwise isolated.
Way back at the beginning of the pandemic, we talked about getting together when it wound down. Surely by August 2020, we all thought. Lol.
Nearly a year later, we started planning. Amazingly, we all made it through the hours of calls devoted to AirBnbs and rental cars and the harrowing adventure of traveling during a pandemic. We stayed together in Portland, OR for a few days and then drive up the Olympic Peninsula to a grand old house in the forest. From there we hiked and kayaked. We ate together and laughed and played music. We finished our trip with a ferry ride to Seattle, WA.
I’m so grateful for every one of these people. We’ve been friends for years and even though our lives have taken us in so many different directions, we’ve found each other again and that is so wonderful.
]]>What an incredible thing and feeling it is to be surrounded by people who know you and love you and care for you. More of this please.
— Eryn Wells, erynofwales @ mastodon dot social (@erynofwales) October 12, 2021
This past weekend, Tess and I took a short, one-night staycation in San Francisco’s Japantown. With all the flurry of things happening in our lives, it was so great to get away from home for a short time and relax.
We stayed at the Hotel Kabuki, a historic hotel in Japantown, and booked time at the Kabuki Springs bath on Sunday afternoon. We sat in the warm bath, dunked in the freezing cold pool, sat in the sauna and steam room, and lounged on the beds around the pools. The lights were low, the music was chill, and it was so good to disconnect. This was my first experience in a communal bath, and I left feeling like I wanted to go every weekend. (Tess and I are now considering memberships.)
One of the wonderful things about a clothing-optional communal bath is the wide variety of bodies you see. It was a great reminder of how diverse we are, and how broad the definition of “woman’s body” can be. I can’t say for sure if Tess and I were the only trans women there, but I think both of us came to feeling like just one of the women there to enjoy the baths – not out of place or strange at all. It was a really great feeling.
We spent the rest of our time in 日本町 wandering the shops in Japan Center, walking around the neighborhood, eating, and relaxing. For only being just over 24 hours away from home, I was impressed how much it felt like a real vacation.
Tess also wrote about our trip.
]]>A perfect Mug o’ Broth from Wise Sons, a Jewish deli in San Francisco.
]]>Oskitone recently released a new synthesizer: the Scout. It’s a small monophonic keyboard synth built around an Arduino. It was a quick build, and the result is tons of fun to noodle with. Here’s a video of me building the kit, set to music I wrote and produced with the completed Scout.
Enjoy!
]]>My updated bootconf.txt
is:
I enabled UART debugging, and set the boot order to be: network 0x2
, SD card
0x1
, USB mass storage 0x4
, and finally reboot 0xf
. These steps need to be
repeated if the bootloader is updated via apt.
I enabled the TFTP server on my Mac:
I’m not sure if the enable
command is actually necessary. This doesn’t
actually start the tftpd
daemon. Instead, macOS starts the daemon on demand
when it notices an incoming tftp request on the network. Don’t be alarmed!
The tftp server looks for files to serve out of /private/tftpboot
, and those
things need to be world rwx
, i.e. 777
. By default (this is configurable) the
Raspberry Pi queries for a directory named by its serial number.
Raspberry Pi looks for files of various names in that directory, one in
particular by the name of start.elf
.
Next, I had to update my Ubiquiti router’s DHCP server configuration (on the
command line) to pass a tftp-server
parameter in the DHCP payload. This step
may be optional because you can also set TFTP_IP
in the bootconf.txt
above
to specify the IP directly. On my router:
I also gave my Mac a static IP, and renewed the DHCP lease so it took the new IP to make the whole process a little more smooth. Now, it appears the Raspberry Pi will attempt a TFTP boot, and I see queries in the logs on my Mac.