Merge branch 'hugo' into main

This commit is contained in:
Eryn Wells 2021-10-11 09:56:34 -07:00
commit 5cbd4175f9
36 changed files with 1550 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
public/

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "themes/paper"]
path = themes/paper
url = ssh://git@github.com:erynofwales/hugo-paper.git

View file

@ -0,0 +1,6 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
---

0
archetypes/other.md Normal file
View file

683
assets/app.css Normal file
View file

@ -0,0 +1,683 @@
/*
* Paper
* A simple, clean, flexible Hugo theme
* https://github.com/nanxiaobei/hugo-paper
* Designed by 南小北 (https://lee.so/)
* Updated in 2021.8.24
*/
/* Theme
-------------------------------------------------- */
:root {
--gap: 3.5rem;
--y-gap: 8rem;
--wide: 140rem;
--narrow: 80rem;
--side: calc((var(--wide) - var(--narrow)) / 2);
--header: 8rem;
--footer: calc(8rem + var(--safe-bottom));
--link-color: #3486ff;
--light: 255, 255, 255;
--dark: 22, 22, 22;
--hljs-bg: #111;
--safe-bottom: 0;
}
@supports (bottom: constant(safe-area-inset-bottom)) {
:root {
--safe-bottom: constant(safe-area-inset-bottom);
}
}
@supports (bottom: env(safe-area-inset-bottom)) {
:root {
--safe-bottom: env(safe-area-inset-bottom);
}
}
.dark {
--light: 22, 22, 22;
--dark: 255, 255, 255;
--hljs-bg: #282828;
--link-color: #56a8ff;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
html,
body {
height: 100%;
}
html {
-webkit-tap-highlight-color: transparent;
font-size: 8px;
}
body {
--white: rgba(var(--light), 1);
--black: rgba(var(--dark), 1);
--pro: rgba(var(--dark), 1);
--lit: rgba(var(--dark), 0.64);
--air: rgba(var(--dark), 0.48);
--fog: rgba(var(--dark), 0.12);
display: flex;
flex-direction: column;
padding-right: var(--gap);
padding-left: var(--gap);
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,
'Open Sans', 'Helvetica Neue', sans-serif;
font-size: 2rem;
line-height: 1.8;
color: var(--pro);
word-break: break-word;
background: var(--white);
transition: background 0.4s ease-out;
}
body > * {
flex-shrink: 0;
width: 100%;
margin-inline: auto;
}
.not-ready,
.not-ready * {
transition: none !important;
}
@media (max-width: 1199px) {
html {
font-size: 7px;
}
}
/* Reset
-------------------------------------------------- */
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 0;
font-size: inherit;
font-weight: 700;
line-height: 1.2;
}
p {
margin: 0;
}
strong,
b {
font-weight: 500;
}
ul,
ol {
padding: 0;
margin: 0;
}
a {
color: inherit;
text-decoration: none;
}
table {
width: 100%;
border-spacing: 0;
border-collapse: collapse;
}
button,
input,
textarea {
padding: 0;
font: inherit;
background: transparent;
border: 0;
outline: 0;
-webkit-appearance: none;
}
button,
input[type='button'],
input[type='submit'] {
cursor: pointer;
}
input,
textarea {
padding: 0;
border: 0;
}
input:-webkit-autofill,
textarea:-webkit-autofill {
box-shadow: 0 0 0 6rem var(--white) inset;
}
img {
display: block;
max-width: 100%;
}
/* Header
-------------------------------------------------- */
.header {
margin-top: 2rem;
display: flex;
max-width: var(--wide);
height: var(--header);
align-items: baseline;
}
.header a {
display: flex;
flex-shrink: 0;
align-items: center;
}
.logo {
display: flex;
min-width: var(--side);
padding-right: var(--gap);
}
.site-name {
padding-bottom: 0.3rem;
overflow: auto;
font-size: 3.4rem;
font-weight: 700;
white-space: nowrap;
}
.btn-dark {
width: 3rem;
margin-left: 2rem;
cursor: pointer;
background: url(./theme.png) left / auto 3rem no-repeat;
transition: background-position 0.4s steps(5);
}
.dark .btn-dark {
background-position: right;
}
.menu {
display: flex;
overflow: auto;
}
.menu a + a {
margin-left: var(--gap);
}
.menu a.active {
opacity: 0.44;
}
.social {
display: flex;
margin-left: auto;
}
.social a {
width: 3rem;
margin-left: 3rem;
background: var(--url) center center no-repeat;
}
.social a span {
visibility: hidden;
}
.dark .social a {
filter: invert(1);
}
@media (max-width: 1199px) {
.logo {
min-width: auto;
}
[data-menu='true'] {
--header: 16rem;
}
[data-menu='true'] .header {
position: relative;
}
[data-menu='true'] .header > * {
height: calc(var(--header) / 2);
}
[data-menu='true'] .menu {
position: absolute;
inset: auto 0 0;
border-bottom: 1px solid var(--fog);
}
}
/* Main
-------------------------------------------------- */
.main {
max-width: var(--narrow);
min-height: calc(100% - var(--header) - var(--footer));
padding-top: var(--y-gap);
padding-bottom: var(--y-gap);
}
.main-title {
margin-bottom: calc(var(--y-gap) + 1rem);
font-size: 3rem;
font-weight: 400;
color: var(--lit);
}
.main-nav {
display: flex;
margin-top: 5rem;
}
.main-nav a {
font-size: 1.8rem;
line-height: 5.5rem;
color: var(--white);
background: var(--black);
border-radius: 0.5rem;
padding-inline: 3rem;
}
.main-nav .next {
margin-left: auto;
}
/* Post entry
-------------------------------------------------- */
.post-entry {
position: relative;
padding-block: 2rem;
transition: transform 0.1s;
}
.post-entry:first-of-type {
margin-top: -2rem;
}
.post-entry:active {
transform: scale(0.99);
}
.post-entry h2 {
margin-bottom: 0.2rem;
font-size: 3rem;
}
.post-entry time {
flex-shrink: 0;
font-size: 1.7rem;
color: var(--air);
}
.post-entry a {
position: absolute;
inset: 0;
}
/* Post single
-------------------------------------------------- */
.post-title {
margin-bottom: calc(var(--y-gap) + 1rem);
}
.post-title p {
display: flex;
margin-bottom: 1.5rem;
font-size: 1.6rem;
color: var(--air);
transform: translateY(0.4rem);
}
.post-title p span::before {
content: '·';
margin-inline: 0.8rem;
}
.post-title h1 {
font-size: 5rem;
transform: translateX(-0.3rem);
}
.post-tags {
margin-top: 7rem;
}
.post-tags a {
display: inline-block;
font-weight: 500;
line-height: 5rem;
color: var(--lit);
background: rgba(var(--dark), 0.05);
border-radius: 0.5rem;
padding-inline: 2rem;
}
.post-tags a + a {
margin-left: 0.5rem;
}
.post-nav {
display: flex;
justify-content: space-between;
margin-top: var(--y-gap);
background: rgba(var(--dark), 0.05);
border-radius: 0.5rem;
}
.post-nav a {
display: flex;
align-items: center;
width: 50%;
padding: var(--gap);
font-size: 2.4rem;
font-weight: 700;
line-height: 1.2;
}
.post-nav a span + span {
margin-left: 1rem;
}
.post-nav .prev {
padding-right: 1rem;
}
.post-nav .next {
justify-content: flex-end;
padding-left: 1rem;
margin-left: auto;
}
.post-comments {
margin-top: var(--y-gap);
}
@media (max-width: 1199px) {
.post-title {
display: block;
}
.post-title aside {
flex-direction: row;
width: auto;
padding-right: 0;
margin-bottom: 0.5rem;
margin-left: 0;
transform: none;
}
.post-title aside span::before {
content: '·';
margin-inline: 0.5rem;
}
}
/* Post content
-------------------------------------------------- */
.post-content {
font-size: 2.2rem;
}
.post-content h1,
.post-content h2,
.post-content h3,
.post-content h4,
.post-content h5,
.post-content h6 {
margin-block: 2rem;
}
.post-content h1 {
margin-top: var(--y-gap);
font-size: 4.5rem;
}
.post-content h2 {
margin-top: 6rem;
font-size: 3.5rem;
}
.post-content h3 {
font-size: 2.5rem;
}
.post-content h4 {
font-size: 2.2rem;
}
.post-content h5 {
font-size: 1.8rem;
}
.post-content h6 {
font-size: 1.5rem;
}
.post-content img {
margin-inline: auto;
}
.post-content a {
padding-bottom: 0.2rem;
}
.post-content a:hover {
border-bottom: 2px solid var(--link-color);
}
.post-content a code {
margin-inline: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.post-content del {
text-decoration: none;
background: linear-gradient(to right, var(--pro) 100%, transparent 0) 0 50% / 1px 1px repeat-x;
}
.post-content p,
.post-content ul,
.post-content ol,
.post-content dl,
.post-content details {
margin-bottom: 3rem;
}
.post-content ul,
.post-content ol {
padding-left: 2.5rem;
}
.post-content li {
margin-top: 0.6rem;
}
.post-content li p {
margin-bottom: 0;
}
.post-content dl {
display: flex;
flex-wrap: wrap;
margin: 0;
}
.post-content dt {
width: 25%;
font-weight: 500;
}
.post-content dd {
width: 75%;
padding-left: 1.3rem;
margin-left: 0;
}
.post-content dt ~ dt,
.post-content dd ~ dd {
margin-top: 1.3rem;
}
.post-content table {
margin-bottom: 4rem;
}
.post-content table th,
.post-content table:not(.highlighttable) td {
min-width: 10rem;
padding: 1.5rem 1rem;
line-height: 1.5;
border-bottom: 1px solid var(--fog);
}
.post-content table th {
font-size: 1.6rem;
text-align: left;
}
.post-content table:not(.highlighttable) td code:only-of-type {
margin-inline: 0;
}
.post-content .highlight,
.post-content pre {
margin: 0 calc(var(--gap) * -1) 4rem;
overflow-x: auto;
background: var(--hljs-bg) !important;
border-radius: 0.5rem;
}
.post-content ul pre {
margin-left: calc(var(--gap) * -2);
}
.post-content .highlight pre {
margin-inline: 0;
margin-bottom: 0;
}
/* table */
.post-content .highlighttable {
table-layout: fixed;
}
.post-content .highlighttable td:first-of-type {
width: 5rem;
}
.post-content .highlighttable td .linenodiv {
padding-right: 0 !important;
}
.post-content .highlighttable td .linenodiv pre,
.post-content .highlighttable td .highlight {
margin-bottom: 0;
}
.post-content .highlighttable td .highlight pre code::-webkit-scrollbar {
display: none;
}
/* inline */
.post-content .highlight span {
background: transparent !important;
}
.post-content code {
padding: 0.5rem 1rem;
margin-inline: 0.5rem;
font-family: Menlo, Monaco, 'Courier New', Courier, monospace;
font-size: 0.8em;
line-height: 1.5;
background: rgba(var(--dark), 0.06);
border-radius: 0.3rem;
}
.post-content pre code {
display: block;
padding: var(--gap);
margin-inline: 0;
color: rgba(255, 255, 255, 0.8);
background: transparent;
border-radius: 0;
}
.post-content blockquote {
padding: 0 0 0 calc(var(--gap) - 0.4rem);
margin: 0 0 0 calc(var(--gap) * -1);
border-left: 0.4rem solid var(--pro);
}
.post-content hr {
height: 1px;
background: var(--fog);
border: 0;
margin-block: 12rem;
}
.post-content iframe {
width: 100%;
background: var(--black);
}
/* Footer
-------------------------------------------------- */
.footer {
display: flex;
align-items: center;
justify-content: center;
max-width: var(--narrow);
height: var(--footer);
padding-bottom: var(--safe-bottom);
margin-top: auto;
font-size: 1.6rem;
color: var(--lit);
border-top: 1px solid var(--fog);
}
.footer p + p::before {
content: '·';
margin-inline: 0.6rem;
}
.footer a:hover {
color: var(--pro);
border-bottom: 1px solid var(--pro);
}
/* 404
-------------------------------------------------- */
.title-404 {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
padding-bottom: 8rem;
font-size: 16rem;
}

41
assets/home.css Normal file
View file

@ -0,0 +1,41 @@
/* home.css */
.main h1,
.main h2,
.main h3 {
margin-top: 5rem;
margin-bottom: 0.7rem;
}
.main h1:first-child {
margin-top: 0;
}
.main a {
color: var(--link-color);
}
.main a:hover {
border-bottom: 2px solid var(--link-color);
}
.main h1 {
font-size: 5rem;
}
.main h2 {
font-size: 3rem;
}
#homepage-content {
margin-bottom: 2em;
}
.main p:first-child {
margin-top: 0;
}
.main p,
.main ul {
margin-top: 1.5rem;
}

38
assets/style.css Normal file
View file

@ -0,0 +1,38 @@
/* Place custom css here. */
figure {
padding: 6px;
border: 1px solid var(--fog);
border-radius: 4px;
}
img {
border-radius: 4px;
}
.draft {
text-transform: uppercase;
font-size: 80%;
color: white;
font-weight: 800;
/*border: 2px solid #aaa;*/
border-radius: 4px;
padding: 0.2rem 0.8rem;
margin-left: 0.5rem;
background-color: #aaa;
}
.flex-date {
display: flex;
align-items: baseline;
}
.flex-date .date {
margin-left: auto;
font-size: 80%;
font-style: italic;
}
.post-content a {
color: var(--link-color);
}

37
config.toml Normal file
View file

@ -0,0 +1,37 @@
baseURL = 'https://erynwells.me/'
languageCode = 'en-us'
title = 'Erynwells.me'
theme = 'paper'
defaultContentLanguage = 'en'
[author]
name = 'Eryn Wells'
[languages]
[languages.en]
weight = 1
[languages.es]
weight = 2
[menu]
[[menu.main]]
identifier = 'posts'
name = 'Posts'
url = '/posts/'
[[menu.main]]
identifier = 'resume'
name = 'Résumé'
url = '/resume/'
[params]
twitter = 'erynofwales'
github = 'erynofwales'
instagram = 'erynofwales'
[permalinks]
posts = 'posts/:year/:month/:title/'
[taxonomies]
category = 'categories'
series = 'series'
tag = 'tags'

50
content/_index.es.md Normal file
View file

@ -0,0 +1,50 @@
# Hola! 👋🏻
Soy Eryn. Mis pronombres son [ella/ella][p]. Esta es me página personal. Bienvenide.
## Personal
Soy una mujer trans y queer. Vivo en San Francisco con mis [dos gatos][cats]. Nací en Seattle, WA, y crecía en Phoenix, AZ. Asistí [Oberlin College][ob] donde obtuve un títolo en informática. {{< tess >}} es mi novia.
Mi lengua nativa es inglés, y también hablo español pero siempre necesito practicar más.
## Pasatiemos
Tengo un gran apetito por probar y aprender pasatiemos nuevas, especialmente las
que combinan varias de mis intereses o que me alejan de la computadora.
He sido música para el gran parte de mi vida. Empezé tocar el piano cuando tuve
siete años, toqué la trompeta en colegio, y he tocado algunos otros instrumentos
por el camino. Todavía toco el piano, pero mi obsesión musical hoy en día es mi
sintetizador modular. De vez en cuando, grabo música y espero compartirla aquí,
en este sitio. Por el momento, puedes escuchar mi música en [Bandcamp][bc] o
[SoundCloud][sc].
Otros pasatiempos de los años recients incluyen: cerámica, caligrafía, tejido,
horneado pan, ciclismo, fotografía, y astronomía. ¿Uno no puede tener demasiados
pasatiemos, de verdad?
## Trabajo
He trabajado como ingeniera de software desde 2011 por varias companías basadas
en San Francisco y Silicon Valley. Hace seis años que he trabajado en Apple,
primero en el equipo iOS Accessibility, y ahora en el equipo Authentication
Experience.
Echa un vistazo a mi [resumen][r] para más detalles.
## Decirme Hola
Puedes encontrarme en muchos rincones del Internet. Estoy más activa en
[Twitter][t] y [Instagram][i]. Publico música en [SoundCloud][sc] y
[Bandcamp][bc]. Y para los proyectos de software, estoy en [GitHub][gh].
[p]: http://pronoun.is/she
[cats]: {{< ref "/cats" >}}
[ob]: https://www.oberlin.edu
[r]: {{< ref "/resume" >}}
[t]: https://twitter.com/erynofwales
[i]: https://www.instagram.com/erynofwales/
[sc]: https://soundcloud.com/purlsnbeeps
[bc]: https://erynwells.bandcamp.com/releases
[gh]: https://github.com/erynofwales

57
content/_index.md Normal file
View file

@ -0,0 +1,57 @@
# Hi! 👋🏻
I'm Eryn. My pronouns are [she/her][p]. This is my personal page. Welcome!
## Personal
I'm a queer trans woman. I live in San Francisco with my [two cats][cats]. I was
born in Seattle, WA and grew up in Phoenix, AZ. I attended [Oberlin College][ob]
where I got a degree in Computer Science. {{< tess >}} is my girlfriend.
I speak English natively, and Spanish too, though I always need more practice.
## Hobbies
I have a big appetite for learning new skills, especially things that combine
multiple of my interests or get me away from my computer.
I've been a musician for most of my life. I started on the piano at age seven,
played trumpet in high school, and have picked up a smattering of other
instruments along the way. I still play piano occasionally, but my current
musical obsession is my modular synthesizer. I occasionally record things, and
I'm hoping to share them here on this site, but for now, they're on
[SoundCloud][sc] and [Bandcamp][bc].
I do try to spend my non-work time away from the computer, but every so often I
get inspired to hack on something. Those projects usually end up on
[GitHub][gh].
Other things I've picked up over the years include: ceramics, calligraphy,
knitting, bread baking, bicycling, photography, and astronomy. You can never
have too many hobbies, right?
## Professional
I've worked as a software engineer since 2011 for a variety of companies around
the San Francisco Bay Area. I've been at Apple since early 2016, first on the
iOS Accessibility team, and now on the Authentication Experience team.
Check out my [résumé][r] for more details.
## Say Hello
You can find me in lots of other corners of the Internet. I'm most active on
[Twitter][t] and [Instagram][i]. I post music on [SoundCloud][sc] and
[Bandcamp][bc]. I'm on [GitHub][gh] for coding projects. You can also send me an
[email][eml].
[p]: http://pronoun.is/she
[cats]: {{< ref "/cats" >}}
[ob]: https://www.oberlin.edu
[r]: {{< ref "/resume" >}}
[t]: https://twitter.com/erynofwales
[i]: https://www.instagram.com/erynofwales/
[sc]: https://soundcloud.com/purlsnbeeps
[bc]: https://erynwells.bandcamp.com/releases
[gh]: https://github.com/erynofwales
[eml]: mailto:Eryn%20Wells<eryn@erynwells.me>

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

18
content/cats/index.es.md Normal file
View file

@ -0,0 +1,18 @@
---
title: "Cats"
date: 2021-10-01T23:14:56-07:00
draft: false
type: simple
---
Here's the thing: cats are really, really good. Like just the very best.
I have two of them: Ash, a brown tabby, and Rowan, a black. They are
littermates, and they've been with me since 2016.
I adopted them from [Whis-purr](https://www.whis-purr.org), a great shelter and
rescue agency for cats based in San Carlos, CA.
{{< figure src="images/ash_closeup.jpg" >}}
{{< figure src="images/rowan_chair.jpg" >}}

18
content/cats/index.md Normal file
View file

@ -0,0 +1,18 @@
---
title: "Cats"
date: 2021-10-01T23:14:56-07:00
draft: false
type: simple
---
Here's the thing: cats are really, really good. Like just the very best.
I have two of them: Ash, a brown tabby, and Rowan, a black. They are
littermates, and they've been with me since 2016.
I adopted them from [Whis-purr](https://www.whis-purr.org), a great shelter and
rescue agency for cats based in San Carlos, CA.
{{< figure src="images/ash_closeup.jpg" >}}
{{< figure src="images/rowan_chair.jpg" >}}

View file

@ -0,0 +1,91 @@
---
title: "Booting a Raspberry Pi Over TFTP"
date: 2020-10-13T08:31:52-07:00
draft: true
series: ["Raspberry Pi OS Development"]
tags: ["Tech"]
---
In order to do this, I modified the [EEPROM bootloader][eeprom] bootloader
according to the instructions in the Raspberry Pi documentation. That page is
also on [GitHub][eeprom-gh] which might be a more stable location. On Raspbian
on the RPi:
```bash
fw=/lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-09-03.bin
rpi-eeprom-config $fw > ~/bootconf.txt
vi ~/bootconf.txt
rpi-eeprom-config --out ~/pieeprom-new.bin --config ~/bootconf.txt $fw
sudo rpi-eeprom-update -d -f ~/pieeprom-new.bin
sudo reboot
```
My updated bootconf.txt is:
```conf
[all]
BOOT_UART=1
WAKE_ON_GPIO=0
POWER_OFF_ON_HALT=0
DHCP_TIMEOUT=45000
DHCP_REQ_TIMEOUT=4000
TFTP_FILE_TIMEOUT=30000
ENABLE_SELF_UPDATE=1
DISABLE_HDMI=0
BOOT_ORDER=0xf412
```
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][mac-tftp] on my Mac:
```bash
sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist
sudo launchctl enable System/com.apple.tftpd
sudo launchctl start com.apple.tftpd
```
Im 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
RPi queries for a directory named by its serial number.
```bash
mkdir /private/tftpboot/$raspberry_pi_serial
chmod 777 /private/tftpboot
chmod -R 777 /private/tftpboot/*
```
RPi 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:
```bash
configure
set service dhcp-server shared-network-name LAN subnet $lan_cidr_subnet tftp-server-name $ip_of_mac
commit
save
exit
```
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 RPi will
attempt a TFTP boot, and I see queries in the logs on my Mac.
## Further Reading
* [Hackaday's Raspberry Pi Boot Sequence Guide](https://hackaday.io/page/6372-raspberry-pi-4-boot-sequence)
* [Linuxhit Guide to Booting a Raspberry Pi with PXE](https://linuxhit.com/raspberry-pi-pxe-boot-netbooting-a-pi-4-without-an-sd-card/)
[eeprom]: https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711_bootloader_config.md
[eeprom-gh]: https://github.com/raspberrypi/documentation/blob/master/hardware/raspberrypi/bcm2711_bootloader_config.md
[mac-tftp]: https://www.unixfu.ch/start-a-tftp-server-on-your-mac/

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

View file

@ -0,0 +1,44 @@
---
title: "日本町"
slug: "nihonmachi"
date: 2021-09-27T08:08:59-07:00
draft: false
resources:
- src: images/buchanan.jpg
title: Buchanan Street Pedestrian Alley
- src: images/ramen.jpg
title: A bowl of ramen from Marufuku
tags: ["Travel"]
---
{{< figure src="images/buchanan.jpg" >}}
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][hk], a historic hotel in Japantown, and booked
time at the [Kabuki Springs][ks] 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](https://tess.oconnor.cx/2021/09/japantown) about our trip.
{{< figure src="images/ramen.jpg" >}}
[hk]: https://www.jdvhotels.com/hotels/california/san-francisco/hotel-kabuki
[ks]: https://kabukisprings.com

64
content/resume.es.md Normal file
View file

@ -0,0 +1,64 @@
---
title: "Résumé"
date: 2021-09-29T20:40:09-07:00
draft: true
type: resume
---
## Experience
{{< resume_section company="Apple" team="Authentication Experience" from=2019 >}}
- Presented a video at WWDC 2021 called [Secure login with iCloud Keychain
verification codes][wwdc21-totp-video], describing security codes, how they
improve password-based authentication, and how to use the new verification code
feature of the Password Manager on iOS and macOS
- Designed and built one-time verification codes for the Password Manager on iOS
and macOS
{{< resume_section company="Apple" team="iOS Accessibility" from=2016 to=2019 >}}
- Engineering point of contact for accessibility of SpringBoard and Messages on
iOS, and the Braille Screen Input feature of VoiceOver
- Implemented new guidance features in iOS 13's Camera to assist VoiceOver users
with taking better, more artistic photos
- Participated in developer outreach at WWDC and onsite events to promote the
value of making software accessible and answer developer questions
{{< resume_section company="Lumos Labs" team="Lumosity iOS" from=2014 to=2016 >}}
- Migrated from a proprietary navigation implementation in C++ to UIKit
components and established patterns for further development
- Authored process document describing our code review and QA approval process
for patches
- Implemented 1v1 competition feature, which had a greater than 50% engagement
rate
{{< resume_section company="VMware" team="Fusion" from=2012 to=2014 >}}
- Restructured keyboard input handling to improve code architecture and
accommodate multiple clients of our OS X UI library
- Redesigned outdated first-run and trial experiences to improve initial
impressions, and make it easier to try Fusion
- Exposed Cocoa configuration UI for a USB device arbitration library written in
C (through our platform-independent C++ library, and OS X-specific Objective-C
library)
{{< resume_section company="VMware" team="View Desktop Infrastructure" from=2011 to=2012 >}}
- Engineered an extensive rewrite of VDT to incorporate a new deployment backend
relying on VMware vCloud Director, and to allow greater flexibility in how
deployments are created
- Implemented stabilization fixes in the View Deployment Tool (VDT), which is
responsible for deploying instances of the View product during automated
testing
- Completed and stabilized system tests designed to exercise several of Views
provisioning features
## Education
{{< resume_flex 2010 >}}
Oberlin College, BA in Computer Science with Honors
{{< /resume_flex >}}
[wwdc21-totp-video]: https://developer.apple.com/videos/play/wwdc2021/10105/

64
content/resume.md Normal file
View file

@ -0,0 +1,64 @@
---
title: "Résumé"
date: 2021-09-29T20:40:09-07:00
draft: true
type: resume
---
## Experience
{{< resume_section company="Apple" team="Authentication Experience" from=2019 >}}
- Presented a video at WWDC 2021 called [Secure login with iCloud Keychain
verification codes][wwdc21-totp-video], describing security codes, how they
improve password-based authentication, and how to use the new verification code
feature of the Password Manager on iOS and macOS
- Designed and built one-time verification codes for the Password Manager on iOS
and macOS
{{< resume_section company="Apple" team="iOS Accessibility" from=2016 to=2019 >}}
- Engineering point of contact for accessibility of SpringBoard and Messages on
iOS, and the Braille Screen Input feature of VoiceOver
- Implemented new guidance features in iOS 13's Camera to assist VoiceOver users
with taking better, more artistic photos
- Participated in developer outreach at WWDC and onsite events to promote the
value of making software accessible and answer developer questions
{{< resume_section company="Lumos Labs" team="Lumosity iOS" from=2014 to=2016 >}}
- Migrated from a proprietary navigation implementation in C++ to UIKit
components and established patterns for further development
- Authored process document describing our code review and QA approval process
for patches
- Implemented 1v1 competition feature, which had a greater than 50% engagement
rate
{{< resume_section company="VMware" team="Fusion" from=2012 to=2014 >}}
- Restructured keyboard input handling to improve code architecture and
accommodate multiple clients of our OS X UI library
- Redesigned outdated first-run and trial experiences to improve initial
impressions, and make it easier to try Fusion
- Exposed Cocoa configuration UI for a USB device arbitration library written in
C (through our platform-independent C++ library, and OS X-specific Objective-C
library)
{{< resume_section company="VMware" team="View Desktop Infrastructure" from=2011 to=2012 >}}
- Engineered an extensive rewrite of VDT to incorporate a new deployment backend
relying on VMware vCloud Director, and to allow greater flexibility in how
deployments are created
- Implemented stabilization fixes in the View Deployment Tool (VDT), which is
responsible for deploying instances of the View product during automated
testing
- Completed and stabilized system tests designed to exercise several of Views
provisioning features
## Education
{{< resume_flex 2010 >}}
Oberlin College, BA in Computer Science with Honors
{{< /resume_flex >}}
[wwdc21-totp-video]: https://developer.apple.com/videos/play/wwdc2021/10105/

View file

@ -0,0 +1,8 @@
{
"folders": [
{
"path": "."
}
],
"settings": {}
}

View file

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html lang="{{ site.LanguageCode }}">
{{ partial "head.html" . }}
<body class="not-ready" data-menu="{{ isset site.Menus `main` }}">
{{ partial "header.html" . }}
<main class="main">{{ block "main" . }}{{ end }}</main>
{{ partial "footer.html" . }}
</body>
<script>
let bodyClx = document.body.classList;
let sysDark = window.matchMedia('(prefers-color-scheme: dark)');
let darkVal = localStorage.getItem('dark');
let setDark = (isDark) => {
bodyClx[isDark ? 'add' : 'remove']('dark');
localStorage.setItem('dark', isDark ? 'yes' : 'no');
};
setDark(darkVal ? darkVal === 'yes' : sysDark.matches);
requestAnimationFrame(() => bodyClx.remove('not-ready'));
sysDark.addEventListener('change', (event) => setDark(event.matches));
</script>
</html>

View file

@ -0,0 +1,11 @@
{{ define "main" }}
{{ if .Title }}
<h1 class="main-title">{{ .Title }}</h1>
{{ end }}
<section id="homepage-content">
{{ .Content }}
</section>
{{ end }}

View file

@ -0,0 +1,34 @@
{{ define "main" }}
<!-- Main Title -->
{{ if .Title }}
<h1 class="main-title">{{ .Title }}</h1>
{{ end }}
<!-- $pages -->
{{ $pages := union .RegularPages .Sections }}
<!---->{{ if .IsHome }} {{ $pages = where site.RegularPages "Type" "in" site.Params.mainSections }}
{{ end }}
<!-- Articles -->
{{ $paginator := .Paginate $pages }} {{ range $index, $page := $paginator.Pages }}
<article class="post-entry">
<h2>{{ .Title }}</h2>
<time>{{ .Date | time.Format ":date_medium" }}</time>
<a href="{{ .Permalink }}"></a>
</article>
{{ end }}
<!-- Main Nav -->
{{ if gt $paginator.TotalPages 1 }}
<nav class="main-nav">
{{ if $paginator.HasPrev }}
<a class="prev" href="{{ $paginator.Prev.URL }}">← {{ i18n "prev_page" }}</a>
{{ end }}<!---->
{{ if $paginator.HasNext }}
<a class="next" href="{{ $paginator.Next.URL }}">{{ i18n "next_page" }} →</a>
{{ end }}
</nav>
{{ end }}<!---->
{{ end }}

View file

@ -0,0 +1,49 @@
{{ define "main" }}
<article class="post-single">
<header class="post-title">
<p>
<time>{{ .Date | time.Format ":date_medium" }}</time>
{{ if or .Params.Author site.Author.name }}
<span>{{ .Params.Author | default site.Author.name }}</span>
{{ end }}
</p>
<h1>{{ .Title }}</h1>
</header>
<section class="post-content">{{ .Content }}</section>
<!-- Post Tags -->
{{ if .Params.tags }}
<footer class="post-tags">
{{ range .Params.tags }} {{ $href := print (absURL "tags/") (urlize .) }}
<a href="{{ $href }}">{{ . }}</a>
{{ end }}
</footer>
{{ end }}
<!-- Post Nav -->
{{ $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}<!---->
{{ if and (gt (len $pages) 1) (in $pages . ) }}
<nav class="post-nav">
{{ with $pages.Next . }}
<a class="prev" href="{{ .Permalink }}"><span></span><span>{{ .Name }}</span></a>
{{ end }} {{ with $pages.Prev . }}
<a class="next" href="{{ .Permalink }}"><span>{{ .Name }}</span><span></span></a>
{{ end }}
</nav>
{{ end }}
<!-- Disqus -->
{{ if and site.DisqusShortname (not (eq .Params.comments false)) }}
<div id="disqus_thread" class="post-comments"></div>
<script>
var disqusShortname = '{{ site.DisqusShortname }}';
var script = document.createElement('script');
script.src = 'https://' + disqusShortname + '.disqus.com/embed.js';
script.setAttribute('data-timestamp', +new Date());
document.head.appendChild(script);
</script>
{{ end }}
</article>
{{ end }}

View file

@ -0,0 +1,6 @@
<footer class="footer">
<p>&copy; <time datetime="{{ now.Year }}">{{ now.Year }}</time> <a href="{{ `` | absURL }}">Eryn Wells</a></p>
<p>Trans rights.</p>
<p>Black lives matter.</p>
<p>Get the vaccine.</p>
</footer>

View file

@ -0,0 +1,76 @@
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<!-- Title -->
<title>{{ if not .IsHome }}{{ .Title }} - {{ end }}{{ site.Title }}</title>
<!-- Meta -->
{{ if eq .Kind "page" }}
<meta name="description" content="{{ .Summary }}" />
<meta name="author" content="{{ .Params.Author | default site.Author.name }}" />
{{ else }}
<meta name="description" content="{{ site.Params.description }}" />
<meta name="author" content="{{ site.Author.name }}" />
{{ end }}
<!-- Styles & Scripts -->
{{ $app_css := resources.Get "app.css" }}
{{ $custom_css := resources.Get "style.css" }}
{{ $css := slice $app_css $custom_css | resources.Concat "app.css" | minify }}
<link rel="preload stylesheet" as="style" href="{{ $css.Permalink }}" />
{{ if .IsHome }}
{{ $home_css := resources.Get "home.css" }}
<link rel="preload stylesheet" as="style" href="{{ $home_css.Permalink }}" />
{{ end }}
{{ if and .IsPage (not site.Params.disableHLJS) }}
<link rel="preload stylesheet" as="style" href="{{ `an-old-hope.min.css` | absURL }}" />
<script
defer
src="{{ `highlight.min.js` | absURL }}"
onload="hljs.initHighlightingOnLoad();"
></script>
{{ end }}
<!-- Preload -->
<link rel="preload" as="image" href="{{ `theme.png` | absURL }}" />
{{ range $.Scratch.Get "social-list" }}
<link rel="preload" as="image" href="{{ printf `%s.svg` . | absURL }}" />
{{ end }}
<!-- Favicon -->
<link rel="icon" href="{{ `favicon.ico` | absURL }}" />
<link rel="apple-touch-icon" href="{{ `apple-touch-icon.png` | absURL }}" />
<!-- Generator -->
{{ hugo.Generator }}
<!-- RSS -->
{{ range .AlternativeOutputFormats }}
<link
rel="{{ .Rel }}"
type="{{ .MediaType.Type }}"
href="{{ .Permalink }}"
title="{{ site.Title }}"
/>
{{ end }}
<!-- Misc -->
{{ if or hugo.IsProduction (eq site.Params.env "production") }}
<!---->
{{ template "_internal/google_analytics_async.html" . }}
<!---->
{{ template "_internal/google_news.html" . }}
<!---->
{{ template "_internal/opengraph.html" . }}
<!---->
{{ template "_internal/schema.html" . }}
<!---->
{{ template "_internal/twitter_cards.html" . }}
<!---->
{{ end }}
</head>

View file

@ -0,0 +1,26 @@
<header class="header">
<h1 class="logo">
<a class="site-name" href="{{ `` | absURL }}">{{ site.Title }}</a>
</h1>
{{ $url := .RelPermalink }}<!---->
{{ with site.Menus.main }}
<nav class="menu">
{{ range . }}
<a class="{{ if eq .URL $url }}active{{ end }}" href="{{ .URL }}">{{ .Name }}</a>
{{ end }}
</nav>
{{ end }}<!---->
<nav class="social">
<a style="--url: url(./twitter.svg)"
href="https://twitter.com/erynofwales"
target="_blank"><span>tw</span></a>
<a style="--url: url(./github.svg)"
href="https://github.com/erynofwales"
target="_blank"><span>gh</span></a>
<a style="--url: url(./instagram.svg)"
href="https://instagram.com/erynofwales"
target="_blank"><span>ig</span></a>
</nav>
</header>

View file

@ -0,0 +1,25 @@
{{ define "main" }}
<article id="resume" class="post-single">
<header class="post-title">
<h1>{{ .Title }}</h1>
</header>
<section class="post-content">
{{ .Content }}
</section>
<!-- Post Nav -->
{{ $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}<!---->
{{ if and (gt (len $pages) 1) (in $pages . ) }}
<nav class="post-nav">
{{ with $pages.Next . }}
<a class="prev" href="{{ .Permalink }}"><span></span><span>{{ .Name }}</span></a>
{{ end }} {{ with $pages.Prev . }}
<a class="next" href="{{ .Permalink }}"><span>{{ .Name }}</span><span></span></a>
{{ end }}
</nav>
{{ end }}
</article>
{{ end }}

View file

@ -0,0 +1 @@
<span class="anagram" data-replacement="{{ with .Get 1 }}{{ . }}{{ end }}">{{ with .Get 0 }}{{ . }}{{ end }}</span>

View file

@ -0,0 +1,27 @@
<ul>
{{ $pages := union .Site.RegularPages .Site.Sections }}
{{ if .Page.IsHome }}
{{ $pages = where site.RegularPages "Type" "in" site.Params.mainSections }}
{{ end }}
{{ $paginator := .Page.Paginate $pages }}
{{ range $index, $page := $paginator.Pages }}
<li>
<a href="{{ .Permalink }}">{{ .Title }}</a>
<time datetime="{{ .Date.Format "2006-01-02" }}">{{ .Date | time.Format ":date_medium" }}</time>
{{ if $page.Draft }}
<span class="draft">draft</span>
{{ end }}
</li>
{{ end }}
</ul>
{{ if gt $paginator.TotalPages 1 }}
<nav class="main-nav">
{{ if $paginator.HasPrev }}
<a class="prev" href="{{ $paginator.Prev.URL }}">← {{ i18n "prev_page" }}</a>
{{ end }}
{{ if $paginator.HasNext }}
<a class="next" href="{{ $paginator.Next.URL }}">{{ i18n "next_page" }} →</a>
{{ end }}
</nav>
{{ end }}

View file

@ -0,0 +1,18 @@
<header class="flex-date">
{{ .Inner }}
<span class="date">
{{ if .IsNamedParams }}
{{ with .Get "from" }}
<time datetime="{{ . }} ">{{ . }}</time>
{{ end }}
to
{{ with .Get "to" }}
<time datetime="{{ . }}">{{ . }}</time>
{{ else }}
present
{{ end }}
{{ else }}
{{ .Get 0 }}
{{ end }}
</span>
</header>

View file

@ -0,0 +1,14 @@
<header class="flex-date">
<h3>{{ .Get "company" }}: {{ .Get "team" }}</h3>
<span class="date">
{{ with .Get "from" }}
<time datetime="{{ . }} ">{{ . }}</time>
{{ end }}
to
{{ with .Get "to" }}
<time datetime="{{ . }}">{{ . }}</time>
{{ else }}
present
{{ end }}
</span>
</header>

View file

@ -0,0 +1 @@
<a href="https://tess.oconnor.cx">Tess</a>

View file

@ -0,0 +1,12 @@
{{ define "main" }}
<article class="post-single">
<header class="post-title">
<h1>{{ .Title }}</h1>
</header>
<section class="post-content">
{{ .Content }}
</section>
</article>
{{ end }}

1
themes/paper Submodule

@ -0,0 +1 @@
Subproject commit 664ae32a44568c7432fcb73104938b753022c0fe