Compare commits

...

28 Commits
master ... main

Author SHA1 Message Date
2cfa4466cb
Remove ianonavy where I can 2024-04-13 02:43:33 -04:00
1dc1392b38
Add keybase proof 2024-04-13 00:20:24 -04:00
e3955407ee
Update script/server to jekyll 4 2024-04-02 02:06:53 -04:00
d66c5bfc15
Ensure external links open in new tab
Ensure noopener and norel via a plugin. Am I going to actually write a
test and check for this? Lol.
2024-04-02 02:04:28 -04:00
b6411e8811
Update README 2024-04-02 01:45:38 -04:00
62c52b5747
Add deploy script 2024-04-02 01:45:10 -04:00
8de90f3980
Open link in new tab 2024-04-02 01:44:01 -04:00
00339a6b55
Update bio 2024-04-02 01:40:00 -04:00
11647d07b3
Update README 2024-04-02 01:22:10 -04:00
187e64e0e7
Remove ianonavy gmail from public site 2024-04-02 01:17:29 -04:00
d49b291f2c
Change to Open Sans 2023-09-04 23:52:55 -04:00
2cfeb25e02
Update pronouns 2023-09-04 23:20:24 -04:00
757412fba2
Update cibuild to force linux/amd64 2023-08-08 01:42:23 -04:00
4d34e65a8e
Update payment info 2023-08-07 22:22:42 -04:00
c051485f90
Add page about clicking random links 2023-08-07 22:21:56 -04:00
d5153cf9ff Add draft post for reflexive non-binary pronouns 2021-09-25 21:04:09 -04:00
c824d1c06e Style Code link to more clearly indicate external 2021-09-24 21:52:20 -04:00
14646134d7 Fix nav layout 2021-09-24 21:42:58 -04:00
c5525f0e88 Style name a little more uniquely 2021-09-24 21:39:16 -04:00
ab8cac13d9 Improve header and config
Hide résumé link when blank in config. Move pronouns to config.
2021-09-24 21:32:48 -04:00
44162bf4c2 Remove redundant GitHub link 2021-09-24 21:18:36 -04:00
1930ffef0d Change pronouns to open in new page 2021-09-24 21:17:28 -04:00
24d74dae88 Add flying page 2021-09-24 21:16:50 -04:00
4ef8bc11f1 Improve formatting for pronouns
Decrease font size and guarantee spacing on the right.
2021-09-24 21:16:12 -04:00
db08d9afb8 Add pronouns 2021-09-24 21:16:11 -04:00
26de796dcd Fix warning in index.html 2021-09-24 21:16:11 -04:00
045fb59dbf Add scripts to rule them all 2021-09-24 21:16:10 -04:00
44abb6579d Add Dockerfile 2021-09-24 21:16:08 -04:00
53 changed files with 976 additions and 446 deletions

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ include/
lib/
lib64
*.pyc
.jekyll-cache

12
Dockerfile Normal file
View File

@ -0,0 +1,12 @@
FROM docker.io/jekyll/builder:4 AS builder
COPY --chown=1000 ./Gemfile* /app/
WORKDIR /app/
RUN bundle install
COPY --chown=1000 . /app
WORKDIR /app/src/
RUN jekyll build
FROM nginx:1.21.3
COPY --chown=nginx --from=builder /app/src/_site /usr/share/nginx/html/

3
Gemfile Normal file
View File

@ -0,0 +1,3 @@
source 'https://rubygems.org'
gem 'jekyll-target-blank', '~> 2.0', '>= 2.0.2'

80
Gemfile.lock Normal file
View File

@ -0,0 +1,80 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
colorator (1.1.0)
concurrent-ruby (1.2.3)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
eventmachine (1.2.7)
ffi (1.16.3)
forwardable-extended (2.6.0)
google-protobuf (3.23.4)
http_parser.rb (0.8.0)
i18n (1.14.4)
concurrent-ruby (~> 1.0)
jekyll (4.3.3)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 1.0)
jekyll-sass-converter (>= 2.0, < 4.0)
jekyll-watch (~> 2.0)
kramdown (~> 2.3, >= 2.3.1)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (>= 0.3.6, < 0.5)
pathutil (~> 0.9)
rouge (>= 3.0, < 5.0)
safe_yaml (~> 1.0)
terminal-table (>= 1.8, < 4.0)
webrick (~> 1.7)
jekyll-sass-converter (3.0.0)
sass-embedded (~> 1.54)
jekyll-target-blank (2.0.2)
jekyll (>= 3.0, < 5.0)
nokogiri (~> 1.10)
jekyll-watch (2.2.1)
listen (~> 3.0)
kramdown (2.4.0)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.4)
listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
mini_portile2 (2.8.5)
nokogiri (1.13.10)
mini_portile2 (~> 2.8.0)
racc (~> 1.4)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (5.0.4)
racc (1.7.3)
rake (13.2.0)
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.6)
rouge (3.30.0)
safe_yaml (1.0.5)
sass-embedded (1.58.3)
google-protobuf (~> 3.21)
rake (>= 10.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
unicode-display_width (2.5.0)
webrick (1.8.1)
PLATFORMS
ruby
DEPENDENCIES
jekyll-target-blank (~> 2.0, >= 2.0.2)
BUNDLED WITH
1.17.2

View File

@ -1,22 +1,21 @@
ianonavy
========
# website
Source code for my personal website.
Requirements
------------
## Requirements
* Jekyll
- Docker
Installing
----------
## Getting started
Exact commands vary with OS.
See [Scripts to Rule Them All](https://github.com/github/scripts-to-rule-them-all)
1. Clone git repository.
2. Jekyll build.
```bash
script/server
```
Updating
--------
## Publish
To update, just run `git pull` in the repository.
```bash
script/deploy
```

View File

@ -1,17 +0,0 @@
# Site settings
title: Ian Adam Naval
subtitle: Software engineer and sysadmin
email: ianonavy@gmail.com
keybase: ianonavy
description: >
Software engineer and system administrator. Really big fan of potatoes.
baseurl: ""
url: "https://ianonavy.com"
gravatar_url: "//gravatar.com/avatar/2a59ffe419aca97636d74d0b4692dfcb"
code_url: "https://git.ianonavy.com/explore"
resume_url: ""
twitter_username: ianonavy
github_username: ianonavy
# Build settings
markdown: kramdown

View File

@ -1,16 +0,0 @@
---
layout: post
title: Test Post
date: 2015-05-27 21:00:00
category: test
---
Tater cara sieglinde canela russet russet norkotah bannock russet. Selma goldrush jersey royal, spunta estima stobrawa marcy kerr's pink. Blue congo langlade silverton russet, linda vitelotte russet norkotah kestrel langlade yellow finn camota. Superior home guard bildtstar maris piper selma adirondack red.<!-- more --> Potato bamberg bannock russet yukon gold estima primura. Silverton russet chelina, annabelle cielo silverton russet kennebec king edward lady balfour fingerling.
Stobrawa jersey royal langlade cabritas linda apline bamberg. Linda golden wonder, linda maris piper pike keuka gold bintje cielo. Cabritas french fries anya british queens german butterball innovator. Innovator norgold russet bannock russet chelina megachip tater. Kestrel ranger russet red pontiac bannock russet arran victory british queens. Spunta kennebec british queens belle de fontenay primura fianna. Avalanche jersey royal adirondack blue pink eye kipfler german butterball.
Sirco ranger russet flava, sirco kestrel bonnotte innovator bintje red lasoda. Sirco pike fianna marfona, ratte fianna chelina bannock russet goldrush adirondack blue keuka gold. Annabelle adirondack blue kestrel cielo langlade. Up to date belle de fontenay shepody amandine german butterball arran victory, camota almond monalisa silverton russet potato chelina. British queens home guard linda sirco pike record, snowden yukon gold silverton russet anya yellow finn primura.
Adirondack red kerr's pink amandine selma tater stobrawa. Bintje camota pink fir apple avalanche linda blazer russet. Russet norkotah snowden selma sieglinde golden wonder primura. Monalisa pike jersey royal red norland lady balfour blue congo. Lady balfour agata spunta red lasoda vitelotte red pontiac. Pink eye adirondack red belle de fontenay bonnotte adirondack blue golden wonder avalanche.
Fingerling belle de fontenay irish cobbler spud, snowden fianna rooster goldrush agata. Fianna tater bannock russet british queens golden wonder. Pike bintje almond golden wonder, maris piper red pontiac sirco blazer russet red lasoda megachip rooster. Sirco up to date blue congo marfona, golden wonder langlade marfona goldrush almond. Cabritas innovator pink eye canela russet carola. German butterball, record lady balfour linda red norland alturas.

View File

@ -1,12 +0,0 @@
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
<meta name="description" content="{% if page.excerpt %}{{ page.excerpt | strip_html | strip_newlines | truncate: 160 }}{% else %}{{ site.description }}{% endif %}">
<link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}">
<link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
<link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" />
</head>

View File

@ -1,36 +0,0 @@
<header class="site-header">
<div class="wrapper">
<div class="site-header-title">
<a href="{{ site.baseurl }}/"><img class="site-avatar" src="{{ site.gravatar_url }}" alt="Photo of {{ site.title }}"></a>
<a class="site-title" href="{{ site.baseurl }}/">{{ site.title }}</a>
</div>
<nav class="site-nav">
<a href="#" class="menu-icon">
<svg viewBox="0 0 18 15">
<path fill="#424242" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
<path fill="#424242" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
<path fill="#424242" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
</svg>
</a>
<div class="trigger">
<a class="page-link" href="{{ site.baseurl }}/">Blog</a>
{% for page in site.pages %}
{% unless page.exclude %}
{% if page.title %}
<a class="page-link" href="{{ page.url | prepend: site.baseurl }}">{{ page.title }}</a>
{% endif %}
{% endunless %}
{% endfor %}
<a class="page-link" href="{{ site.code_url }}">Code</a>
{% if site.github_username %}<a class="page-link" href="https://github.com/{{ site.github_username }}/">GitHub</a>{% endif %}
{% if site.resume_url %}<a class="page-link" href="{{ site.resume_url }}">Résumé</a>{% endif %}
</div>
</nav>
</div>
</header>

View File

@ -1,15 +0,0 @@
---
layout: default
---
<div class="post">
<header class="post-header">
<h1 class="post-title">{{ page.title }}</h1>
<p class="post-meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>
</header>
<article class="post-content">
{{ content }}
</article>
</div>

View File

@ -1,295 +0,0 @@
/**
* Site header
*/
.site-header .wrapper {
display: flex;
justify-content: space-between;
align-items: center;
}
.site-header-title {
display: flex;
align-items: center;
}
.site-avatar {
float: left;
border-radius: 8px;
margin: $spacing-unit $spacing-unit $spacing-unit 0;
}
.site-header {
border-top: 5px solid $grey-color-dark;
min-height: 56px;
// Positioning context for the mobile navigation icon
position: relative;
}
.site-title {
font-size: 26px;
line-height: 56px;
letter-spacing: -1px;
margin-bottom: 0;
float: left;
&:hover {
color: $blue-color;
text-decoration: none;
}
&,
&:visited {
color: $grey-color-dark;
}
}
.site-nav {
float: right;
line-height: 56px;
.menu-icon {
display: none;
}
.page-link {
color: $text-color;
line-height: $base-line-height;
// Gaps between nav items, but not on the first one
&:not(:first-child) {
margin-left: 20px;
}
}
@include media-query($on-palm) {
position: absolute;
top: 9px;
right: 30px;
background-color: $background-color;
border: 1px solid $grey-color-light;
border-radius: 5px;
text-align: right;
.menu-icon {
display: block;
float: right;
width: 36px;
height: 26px;
line-height: 0;
padding-top: 10px;
text-align: center;
> svg {
width: 18px;
height: 15px;
path {
fill: $grey-color-dark;
}
}
}
.trigger {
clear: both;
display: none;
}
&:hover .trigger {
display: block;
padding-bottom: 5px;
}
.page-link {
display: block;
padding: 5px 10px;
}
}
}
/**
* Site footer
*/
.site-footer {
border-top: 1px solid $grey-color-light;
padding: $spacing-unit 0;
}
.footer-heading {
font-size: 18px;
margin-bottom: $spacing-unit / 2;
}
.contact-list,
.social-media-list {
list-style: none;
margin-left: 0;
}
.footer-col-wrapper {
font-size: 15px;
color: $grey-color;
margin-left: -$spacing-unit / 2;
@extend %clearfix;
}
.footer-col {
float: left;
margin-bottom: $spacing-unit / 2;
padding-left: $spacing-unit / 2;
}
.footer-col-1 {
width: -webkit-calc(35% - (#{$spacing-unit} / 2));
width: calc(35% - (#{$spacing-unit} / 2));
}
.footer-col-2 {
width: -webkit-calc(20% - (#{$spacing-unit} / 2));
width: calc(20% - (#{$spacing-unit} / 2));
}
.footer-col-3 {
width: -webkit-calc(45% - (#{$spacing-unit} / 2));
width: calc(45% - (#{$spacing-unit} / 2));
}
@include media-query($on-laptop) {
.footer-col-1,
.footer-col-2 {
width: -webkit-calc(50% - (#{$spacing-unit} / 2));
width: calc(50% - (#{$spacing-unit} / 2));
}
.footer-col-3 {
width: -webkit-calc(100% - (#{$spacing-unit} / 2));
width: calc(100% - (#{$spacing-unit} / 2));
}
}
@include media-query($on-palm) {
.footer-col {
float: none;
width: -webkit-calc(100% - (#{$spacing-unit} / 2));
width: calc(100% - (#{$spacing-unit} / 2));
}
}
/**
* Page content
*/
.page-content {
padding: $spacing-unit 0;
}
.page-heading {
font-size: 20px;
}
.post h2 {
margin: 0;
}
.post-list {
margin-left: 0;
list-style: none;
> li {
margin-bottom: $spacing-unit;
}
}
.post-meta {
display: block;
font-size: $small-font-size;
color: $grey-color;
margin-bottom: $spacing-unit / 2;
}
.post-link {
display: block;
font-size: 24px;
}
.post-read-more {
display: block;
margin: $spacing-unit / 2 0;
}
/**
* Posts
*/
.post-header {
margin-bottom: $spacing-unit;
}
.post-title {
font-size: 42px;
letter-spacing: -1px;
line-height: 1;
@include media-query($on-laptop) {
font-size: 36px;
}
}
.post-content {
margin-bottom: $spacing-unit;
h2 {
font-size: 32px;
@include media-query($on-laptop) {
font-size: 28px;
}
}
h3 {
font-size: 26px;
@include media-query($on-laptop) {
font-size: 22px;
}
}
h4 {
font-size: 20px;
@include media-query($on-laptop) {
font-size: 18px;
}
}
}
/**
* Projects
*/
.projects-project {
display: block;
clear: both;
border-bottom: 1px #ccc dotted;
min-height: 240px;
padding: $spacing-unit 0;
&:first-child {
padding-top: 0;
}
&:last-child {
border: none;
}
}
.projects-screenshot {
float: left;
margin: 0 $spacing-unit $spacing-unit 0;
border: 1px #ccc solid;
}

View File

@ -1,15 +0,0 @@
---
layout: page
title: About
permalink: /about/
---
After studying computer science at [WPI](https://wpi.edu) and graduating in
2015, I started as a Senior Quantitative Software Engineer for
[EverQuote](https://everquote.com) in Cambridge, MA.
I mostly build Web stuff in Python while eating potato chips, but I do [other
things](https://git.ianonavy.com/explore) too! I compete in CTFs with
[Ba Sing Sec](https://ctftime.org/team/12919) (and formerly with
[Without Proper Instructions](https://ctftime.org/team/5573)), and I am a
huge Marvel Cinematic Universe nerd.

View File

@ -1,16 +0,0 @@
---
layout: page
title: Paying Me
exclude: true
permalink: /pay/
---
You can pay me via the following:
* **Venmo**: @Ian-Naval
* **PayPal**: [paypal.me/ianonavy](https://paypal.me/ianonavy){:target="_blank"}
* **Google Wallet**: ianonavy@gmail.com
* **Bank Transfer** *(Simple, BofA, Ally)*: ianonavy@gmail.com
* **BitCoin**:
[coinbase.com/ianonavy](https://coinbase.com/ianonavy){:target="_blank"}

15
script/bootstrap Executable file
View File

@ -0,0 +1,15 @@
#!/bin/sh
# script/bootstrap: Resolve all dependencies that the application requires to
# run.
set -e
cd "$(dirname "$0")/.."
if [ -f "Dockerfile" ] && [ "$(uname -s)" = "Darwin" ]; then
docker version >/dev/null 2>&1 || {
echo 'Error: Install Docker for Desktop! Ensure "docker" is in your $PATH.'
exit 1
}
fi

17
script/cibuild Executable file
View File

@ -0,0 +1,17 @@
#!/bin/sh
# script/cibuild: Setup environment for CI to run tests. This is primarily
# designed to run on the continuous integration server.
#
# Since we don't have CI, this is used to locally build the Docker image for
# manually pushing to Dockerhub
set -e
cd "$(dirname "$0")/.."
script/bootstrap
echo "==> Building image…"
docker build --platform=linux/amd64 -t ianonavy/ianonavy .

8
script/deploy Executable file
View File

@ -0,0 +1,8 @@
#!/bin/sh
# script/deploy: Deploys to the live environment.
script/cibuild
docker login
docker push docker.io/ianonavy/ianonavy:latest
kubectl -n ianonavy rollout restart deploy/ianonavy

13
script/server Executable file
View File

@ -0,0 +1,13 @@
#!/bin/sh
# script/server: Launch the application and any extra required processes
# locally.
set -e
cd "$(dirname "$0")/.."
# ensure everything in the app is up to date.
script/update
docker run --rm -it -p 4000:4000 -v "$PWD/src:/srv/jekyll" jekyll/minimal:4 jekyll serve

12
script/setup Executable file
View File

@ -0,0 +1,12 @@
#!/bin/sh
# script/setup: Set up application for the first time after cloning, or set it
# back to the initial first unused state.
set -e
cd "$(dirname "$0")/.."
script/bootstrap
echo "==> App is now ready to go!"

9
script/update Executable file
View File

@ -0,0 +1,9 @@
#!/bin/sh
# script/update: Update application to run for its current checkout.
set -e
cd "$(dirname "$0")/.."
script/bootstrap

View File

@ -0,0 +1,53 @@
https://keybase.io/ianonavy
--------------------------------------------------------------------
I hereby claim:
* I am an admin of https://naval.dev
* I am ianonavy (https://keybase.io/ianonavy) on keybase.
* I have a public key ASCTq_6VzzK9lfRQ52w3WBEUeeBCsAsHwC1QJY0D8nk-OAo
To do so, I am signing this object:
{
"body": {
"key": {
"eldest_kid": "01010a64923678a7e823cd17994258fd86d82054fefa301f2b5123aa15bf2e6448640a",
"host": "keybase.io",
"kid": "012093abfe95cf32bd95f450e76c3758111479e042b00b07c02d50258d03f2793e380a",
"uid": "5fd378da30864b524434409e22a54419",
"username": "ianonavy"
},
"merkle_root": {
"ctime": 1712981503,
"hash": "57d908ae490a58a8da15a2de634fcaa259b2f961c086d44675a45de78246d90ec9ecb933e1c140b2490f6ca4bf8c6b4e53cd111e1a8879ea650e571b82a00705",
"hash_meta": "0b70728dc613288e22094034e7ecd23d33a0e15f1eb97dc1078d9f6eb901e643",
"seqno": 25640357
},
"service": {
"entropy": "MWAbzvpiRyKVWVK6VJi3aoh7",
"hostname": "naval.dev",
"protocol": "https:"
},
"type": "web_service_binding",
"version": 2
},
"client": {
"name": "keybase.io go client",
"version": "6.2.8"
},
"ctime": 1712981539,
"expire_in": 504576000,
"prev": "5040a19071874d7235538359b01d46511ae202325254ccd5c7ee9c76da16b10b",
"seqno": 28,
"tag": "signature"
}
which yields the signature:
hKRib2R5hqhkZXRhY2hlZMOpaGFzaF90eXBlCqNrZXnEIwEgk6v+lc8yvZX0UOdsN1gRFHngQrALB8AtUCWNA/J5PjgKp3BheWxvYWTESpcCHMQgUEChkHGHTXI1U4NZsB1GURriAjJSVMzVx+6cdtoWsQvEIFn5FsxRFTyiAJLfi5B2oImsgrl2y8l/PmRuNjwl7kqsAgHCo3NpZ8RAK7whBubl4mT9k/1ODgcPGyG+RL1XSAlGUCKAwViF16qLQTqf7zBXLOcJz2SqiEW97bHPBMcgdSFTSJzkHhnaB6hzaWdfdHlwZSCkaGFzaIKkdHlwZQildmFsdWXEIDE8L7GRolhl6xcnfuyPzK2y6A1U/dNYsKXZ2duk6GBNo3RhZ80CAqd2ZXJzaW9uAQ==
And finally, I am proving ownership of this host by posting or
appending to this document.
View my publicly-auditable identity here: https://keybase.io/ianonavy

33
src/_config.yml Normal file
View File

@ -0,0 +1,33 @@
# Site settings
title: I. A. Naval
subtitle: Software engineer and sysadmin
description: >
Software engineer and system administrator. Really big fan of potatoes.
date_format: "%Y-%m-%d"
## Profile
pronouns:
display: "they&she"
url: "https://en.pronouns.page/they%26she"
## Nav
baseurl: ""
url: "https://naval.dev"
gravatar_url: "//gravatar.com/avatar/2a59ffe419aca97636d74d0b4692dfcb"
code_url: "https://git.naval.dev/explore"
resume_url:
## Footer
email: arbors-masker0n@icloud.com
keybase: ianonavy
twitter_username: ianonavy
github_username: ianonavy
# Build settings
markdown: kramdown
plugins:
- jekyll-target-blank
include:
- .well-known

View File

@ -0,0 +1,149 @@
---
layout: post
title: Reflexive non-binary pronouns
date: 2021-09-24
category: language
---
Pronouns! Aren't they fun? Turns out they are not as straightforward
as I thought. Today, I took a quick poll of people in the `#nonbinary` channel
from the [LGBTQ in Tech Slack](https://lgbtq.technology){:class="external-link" target="\_blank"} to find out what is more popular: "themself" or "themselves"? The results surprised
me.
<!-- more -->
## The data
I asked in the channel:
> Quick poll for people who use they/them pronouns. For reflexive pronoun do you use:
> <br> 1⃣ themselves
> <br> 2⃣ themself
> {:class="normal-quote"}
Of the 23 that participated, 20 selected "2⃣ themself," and only 2 picked
"1⃣ themselves." The last person suggested "theirself," which at the time of
writing was not part of [Pronoun Island](https://pronoun.is){:class="external-link" target="\_blank"} (maybe an opportunity for someone to [contribute](https://github.com/witch-house/pronoun.is/issues){:target="\_blank"}?)
I was expecting more people to prefer "themselves" because I more commonly
hear "they are" instead of "they is," and I thought "themselves" would be more
consistent. Hmmm! 🧐
(By the way, this sample is not representative. This was a very unscientific study.)
## Themself or themselves?
Lots of [other people](https://www.thesaurus.com/e/grammar/they-is-a-singular-pronoun){:target="\_blank"} have written about this before, even the [Canadian Department of Justice](https://www.justice.gc.ca/eng/rp-pr/csj-sjc/legis-redact/legistics/p1p30.html){:class="external-link" target="\_blank"}.
I have had trouble checking many of the non-academic resources I've found for consistency.
For example, the Canadian DoJ site [updated 2020-06-01, accessed 2021-09-24] says
"The current _Oxford English Dictionary_ (OED) Online does not have an entry for
themself;" which is **not true**!
### someone is wrong on the internet
I checked the OED myself, and I found
[this usage category](https://www.oed.com/view/Entry/334443#eid1291513750){:class="external-link" target="\_blank"} for what I will call "gender unspecified":
> **themself**, _pron_.
> <br>2. In anaphoric reference to a **singular** pronoun or noun.
> <br>b. With a generic or indefinite antecedent referring to an individual (e.g. a person, someone, the patient), used esp. so as to make a general reference to such an **individual without specifying gender.**
> {:class="normal-quote"}
The examples date from 1463 to 2009. The contemporary example is a publication
noting Facebook's [historical usage of gender neutral "themself"](https://theweek.com/articles/451426/evolution-facebooks-pronoun-problem){:class="external-link" target="\_blank"} prior to
introducing a gender-based pronoun sytem. (Now, Facebook correctly asks pronouns
separately from gender.)
Okay, so that works for "gender unspecified," but what about "genderqueer" or
gender non-conforming? Well, there is [another usage category](https://www.oed.com/view/Entry/334443#eid1291513780){:class="external-link" target="\_blank"} for that:
> 2c. Used to refer to a person whose sense of personal **identity does not correspond to conventional sex and gender distinctions**, and who has typically asked to be referred to by the pronouns they, them, etc.
> {:class="normal-quote"}
So the difference here is instead of "we don't know their gender," the case is
"this person goes by _they_." The examples cited on this category are much more
contemporary than the ones for "gender unspecified," dating back only to 2011.
To me, this indicates that there has long been a grammatical precedent for
_themself_ meaning "gender unspecified," but people explicitly identifying as
gender non-conforming and communicating _in English_ about themselves with
they-based pronouns is _relatively_ new.
### words are hard
Now if we take a look at the [entry for _themselves_](https://www.oed.com/view/Entry/200324?#eid1292523640){:class="external-link" target="\_blank"}
in the OED, its usage categories have a little more varied history. The singular
reflexive, usage ("they love themselves") dates back to 1529 in the
["gender&nbsp;unspecified" sense](https://www.oed.com/view/Entry/200324?#eid1291693070){:class="external-link" :target="\_blank"}. However, the ["genderqueer" sense](https://www.oed.com/view/Entry/200324?#eid1291693480){:class="external-link" :target="\_blank"}
only dates back to 2009.
There is [another meaning](https://www.oed.com/view/Entry/200324?#eid1292523640)
for _themselves_ called _emphatic_, as in "the person themselves."
For "gender&nbsp;unspecified" this goes back to 1782, but again for
"genderqueer" it's very recent: 2019.
> **themselves**, _pron_.
> <br> 1. Emphatic uses.
> <br> b. Used in apposition to a **singular** noun or pronoun (e.g. the person themselves), typically to **avoid specifying** the gender of the individual being referred to; Later also: used in apposition to a proper noun or pronoun referring to a person whose sense of personal **identity does not correspond to conventional sex and gender distinctions**.
> {:class="normal-quote"}
### so what's it gonna be?
Ultimately, I think _themself_ wins here. The word is:
- More natural in the "gender unspecified" sense
- More popular in the contemporary "genderqueer" sense
- More easily distinguished from the plural "themselves" in all senses of the word
_Themselves_ is slightly older on the Internet for queer people than _themself_,
but we're literally comparing a 2011 [university newsletter](https://dailybruin.com/about){:class="external-link" target="\_blank"}
article with a 2009 Twitter post, so I don't give that much weight.
## Themself or theirself?
I like the grammatical consistency of "theirself," but I hadn't heard of it
before asking my poll. Unfortunately, the
[_Oxford Engish Dictonary_ entry for "theirself"](https://www.oed.com/view/Entry/362903){:class="external-link" target="\_blank"}
as of 2021 is behind a paywall. If you could access the page—maybe [using your public library card](https://public.oed.com/help/){:class="external-link" target="\_blank"}—you would see that the singular, reflexive, "gender unspecified" usage goes back to 1819.
However, there is curiously **no usage category for "theirself" in the
"genderqueer" sense.** Quick, someone make a Tumblr post!
So I decided to look at the [Google Books Ngram Viewer](https://books.google.com/ngrams/info){:class="external-link" target="\_blank"}
to see how usage of these words in their corpus of books has changed with time.
See for yourself:
![Screenshot of Google Books Ngram Viewer search graph showing usage of themself and theirself as both growing, but with themself as significantly more popular](/img/2021-09-24-google-ngram.png)
[source](https://books.google.com/ngrams/graph?content=themself%2Ctheirself&year_start=1800&year_end=2019&corpus=26&smoothing=3&direct_url=t1%3B%2Cthemself%3B%2Cc0%3B.t1%3B%2Ctheirself%3B%2Cc0){: class="external-link" target="\_blank"}
{: class="figure-caption"}
_Themself_ seems to be significantly more popular today than _theirself_.
_Theirself_ seems to have peaked in 2002, although it's starting to rise again
as of 2018.
## tl;dr
I took the liberty of summarizing all the findings above into a table:
| Reflexive pronoun | "gender unspecified" | "genderqueer" | Popular queer usage |
| ----------------- | -------------------- | ------------- | ------------------- |
| themself | 1463 | 2011 | a lot |
| themselves | 1529 | 2009 | some |
| theirself | 1819 | -- | a little |
Oldest OED-cited usages and popular queer usage for singular, reflexive usage
{:class="figure-caption"}
After all this "research" and following the discussion in the Slack channel
where I made my poll, I came to the following conclusions:
- Language is hard; it's okay to be wrong.
- "Themself" is more common than "theirself."
- If you're queer, do what sounds best for you.
- If you're referring to someone else, ask them.
- _Maybe_ default to "themself" if you're not sure.
- As always with this sort of thing, [let people choose](https://github.com/witch-house/pronoun.is/issues/46){:class="external-link" target="\_blank"}.
Soo... what will I try out for myself? Honestly, I'll probably go back and forth.
![Gif of a non-binary person of color looking fly with all caps text reading BECAUSE I'M NON-BINARY](https://media2.giphy.com/media/gj16b2C0szCUZwuVkE/giphy.gif?cid=ecf05e478udsnhs9e9qpcf4x4wmtn0146iu6si3adlq5licu&rid=giphy.gif&ct=g)
<p><a href="https://giphy.com/gifs/adweek-flex-pride-month-binary-gj16b2C0szCUZwuVkE" target="_blank" class="external-link">via GIPHY</a></p>

View File

@ -5,9 +5,15 @@
<div class="footer-col-wrapper">
<div class="footer-col footer-col-1">
<ul class="contact-list">
<li>{{ site.title }}</li>
<li><a href="mailto:{{ site.email }}">{{ site.email }}</a></li>
<li><a href="https://keybase.io/{{ site.keybase }}">keybase.io/{{ site.keybase }}</a></li>
<li>
<pre class="footer-name">IAN
ADAM
NAVAL
MA
L</pre>
</li>
</ul>
</div>

21
src/_includes/head.html Normal file
View File

@ -0,0 +1,21 @@
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>
{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}
</title>
<meta
name="description"
content="{% if page.excerpt %}{{ page.excerpt | strip_html | strip_newlines | truncate: 160 }}{% else %}{{ site.description }}{% endif %}"
/>
<link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}">
<link
rel="canonical"
href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}"
/>
<link rel="alternate" type="application/rss+xml" title="{{ site.title }}"
href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" />
</head>

53
src/_includes/header.html Normal file
View File

@ -0,0 +1,53 @@
<header class="site-header">
<div class="wrapper">
<div class="site-header-title">
<a href="{{ site.baseurl }}/"
><img
class="site-avatar"
src="{{ site.gravatar_url }}"
alt="Photo of {{ site.title }}"
/></a>
<div class="site-title">
<a class="name" href="{{ site.baseurl }}/">{{ site.title }}</a>
<a class="pronouns" href="{{ site.pronouns.url }}" target="_blank"
>my.pronouns.page/are/{{ site.pronouns.display }}</a
>
</div>
</div>
<nav class="site-nav">
<a href="#" class="menu-icon">
<svg viewBox="0 0 18 15">
<path
fill="#424242"
d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"
/>
<path
fill="#424242"
d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"
/>
<path
fill="#424242"
d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"
/>
</svg>
</a>
<div class="trigger">
<a class="page-link" href="{{ site.baseurl }}/">Blog</a>
{% for page in site.pages | sort:"title" %} {% unless page.exclude %} {%
if page.title %}
<a class="page-link" href="{{ page.url | prepend: site.baseurl }}"
>{{ page.title }}</a
>
{% endif %} {% endunless %} {% endfor %}
<a class="page-link external-link" href="{{ site.code_url }}">Code</a>
{% if site.resume_url and site.resume_url != "" %}<a
class="page-link external-link"
href="{{ site.resume_url }}"
>Résumé</a
>{% endif %}
</div>
</nav>
</div>
</header>

View File

@ -0,0 +1,9 @@
<!-- https://carlosbecker.com/posts/jekyll-reading-time-without-plugins/ -->
<span class="reading-time" title="Estimated read time">
{% assign words = include.words | number_of_words %}
{% if words < 360 %}
1 min
{% else %}
{{ words | divided_by:180 }} mins
{% endif %}
</span>

15
src/_layouts/post.html Normal file
View File

@ -0,0 +1,15 @@
---
layout: default
---
<div class="post">
<header class="post-header">
<h1 class="post-title">{{ page.title }}</h1>
<p class="post-meta">Published {{ page.date | date: site.date_format }} • {% include read_time.html words=content %}{% if page.author %} • {{ page.author }}{% endif %}{% if page.updated %} • Updated {{ page.updated | date: site.date_format }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>
</header>
<article class="post-content">
{{ content }}
</article>
</div>

View File

@ -80,7 +80,7 @@ li {
* Headings
*/
h1, h2, h3, h4, h5, h6 {
font-weight: 300;
font-weight: 400;
}

17
src/_sass/_font.scss Normal file
View File

@ -0,0 +1,17 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 300;
font-stretch: 100%;
font-display: swap;
src: url(/fonts/OpenSans-Light.ttf) format('opentype');
}
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 400;
font-stretch: 100%;
font-display: swap;
src: url(/fonts/OpenSans-Regular.ttf) format('opentype');
}

375
src/_sass/_layout.scss Normal file
View File

@ -0,0 +1,375 @@
/**
* Site header
*/
.site-header .wrapper {
display: flex;
justify-content: space-between;
align-items: center;
}
.site-header-title {
display: flex;
align-items: center;
}
.site-avatar {
float: left;
border-radius: 8px;
margin: $spacing-unit $spacing-unit $spacing-unit 0;
}
.site-header {
border-top: 5px solid $grey-color-dark;
min-height: 56px;
// Positioning context for the mobile navigation icon
position: relative;
}
.site-title {
display: flex;
flex-flow: column nowrap;
.name {
font-size: 26px;
font-weight: 400;
line-height: 28px;
letter-spacing: -1px;
margin-bottom: 0;
float: left;
&:hover {
color: $blue-color;
text-decoration: none;
}
&,
&:visited {
color: $grey-color-dark;
}
}
.pronouns {
font-size: 14px;
}
}
.site-nav {
float: right;
line-height: 56px;
.menu-icon {
display: none;
}
.page-link {
color: $text-color;
line-height: $base-line-height;
// Gaps between nav items, but not on the first one
&:not(:first-child) {
margin-left: 20px;
}
}
@include media-query($on-palm) {
position: absolute;
top: 9px;
right: 30px;
background-color: $background-color;
border: 1px solid $grey-color-light;
border-radius: 5px;
text-align: right;
.menu-icon {
display: block;
float: right;
width: 36px;
height: 26px;
line-height: 0;
padding-top: 10px;
text-align: center;
> svg {
width: 18px;
height: 15px;
path {
fill: $grey-color-dark;
}
}
}
.trigger {
clear: both;
display: none;
}
&:hover .trigger {
display: block;
padding-bottom: 5px;
}
.page-link {
display: block;
padding: 5px 10px;
}
}
}
/**
* Site footer
*/
.site-footer {
border-top: 1px solid $grey-color-light;
padding: $spacing-unit 0;
}
.footer-heading {
font-size: 18px;
margin-bottom: $spacing-unit / 2;
}
.footer-name {
background: none;
border: 0;
color: $grey-color;
margin: $spacing-unit / 2 0 0 0;
overflow-x: auto;
padding: 0;
}
.contact-list,
.social-media-list {
list-style: none;
margin-left: 0;
}
.footer-col-wrapper {
font-size: 15px;
color: $grey-color;
margin-left: -$spacing-unit / 2;
@extend %clearfix;
}
.footer-col {
float: left;
margin-bottom: $spacing-unit / 2;
padding-left: $spacing-unit / 2;
}
.footer-col-1 {
width: -webkit-calc(35% - (#{$spacing-unit} / 2));
width: calc(35% - (#{$spacing-unit} / 2));
}
.footer-col-2 {
width: -webkit-calc(20% - (#{$spacing-unit} / 2));
width: calc(20% - (#{$spacing-unit} / 2));
}
.footer-col-3 {
width: -webkit-calc(45% - (#{$spacing-unit} / 2));
width: calc(45% - (#{$spacing-unit} / 2));
}
@include media-query($on-laptop) {
.footer-col-1,
.footer-col-2 {
width: -webkit-calc(50% - (#{$spacing-unit} / 2));
width: calc(50% - (#{$spacing-unit} / 2));
}
.footer-col-3 {
width: -webkit-calc(100% - (#{$spacing-unit} / 2));
width: calc(100% - (#{$spacing-unit} / 2));
}
}
@include media-query($on-palm) {
.footer-col {
float: none;
width: -webkit-calc(100% - (#{$spacing-unit} / 2));
width: calc(100% - (#{$spacing-unit} / 2));
}
}
/**
* Page content
*/
table {
max-width: 90%;
margin-bottom: 20px;
border: 1px solid #dedede;
border-spacing: 0;
thead,
tbody,
tfoot {
tr {
th,
td {
padding: 8px;
line-height: 1.42857143;
vertical-align: top;
border-top: 1px solid #ddd;
}
}
}
thead {
tr {
th {
vertical-align: bottom;
border-bottom: 2px solid #ddd;
text-transform: none;
background-color: #777;
color: #fff;
text-align: left;
}
}
tr:first-child {
th {
border-top: 0;
}
}
}
tbody > tr:nth-of-type(odd) {
background-color: #f9f9f9;
}
tr {
td {
hyphens: auto;
}
}
}
.external-link::after {
content: " »";
}
.figure-caption {
color: gray;
font-size: 80%;
text-align: center;
}
.normal-quote {
font-style: normal;
letter-spacing: normal;
}
.page-content {
padding: $spacing-unit 0;
p {
line-height: 28px;
}
}
.page-heading {
font-size: 20px;
}
.post h2 {
margin: 0;
}
.post-list {
margin-left: 0;
list-style: none;
> li {
margin-bottom: $spacing-unit;
}
}
.post-meta {
display: block;
font-size: $small-font-size;
color: $grey-color;
margin-bottom: $spacing-unit / 2;
}
.post-link {
display: block;
font-size: 24px;
}
.post-read-more {
display: block;
margin: $spacing-unit / 2 0;
}
/**
* Posts
*/
.post-header {
margin-bottom: $spacing-unit;
}
.post-title {
font-size: 42px;
letter-spacing: -1px;
line-height: 1;
@include media-query($on-laptop) {
font-size: 36px;
}
}
.post-content {
margin-bottom: $spacing-unit;
h2 {
font-size: 32px;
@include media-query($on-laptop) {
font-size: 28px;
}
}
h3 {
font-size: 26px;
@include media-query($on-laptop) {
font-size: 22px;
}
}
h4 {
font-size: 20px;
@include media-query($on-laptop) {
font-size: 18px;
}
}
}
/**
* Projects
*/
.projects-project {
display: block;
clear: both;
border-bottom: 1px #ccc dotted;
min-height: 240px;
padding: $spacing-unit 0;
&:first-child {
padding-top: 0;
}
&:last-child {
border: none;
}
}
.projects-screenshot {
float: left;
margin: 0 $spacing-unit $spacing-unit 0;
border: 1px #ccc solid;
}

16
src/about.md Normal file
View File

@ -0,0 +1,16 @@
---
layout: page
title: About
permalink: /about/
---
After studying computer science at [WPI](https://wpi.edu) and graduating in
2015, I started as a software developer for [EverQuote](https://everquote.com)
in Cambridge, MA. After what felt like a lifetime (but was actually only &#8531;),
I decided to leave and helped to found [Cake](https://cake.ai).
I mostly play around with Kubernetes while eating potato chips, but I do [other
things](https://git.naval.dev/explore) too! I compete in CTFs with
[Ba Sing Sec](https://ctftime.org/team/12919) (and formerly with
[Without Proper Instructions](https://ctftime.org/team/5573)). I am a [private
pilot](/flying).

View File

@ -6,7 +6,7 @@
// Our variables
$base-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
$base-font-family: "Open Sans", sans-serif;
$base-font-size: 16px;
$small-font-size: $base-font-size * 0.875;
$base-line-height: 1.5;
@ -49,6 +49,7 @@ $on-laptop: 800px;
// Import partials from `sass_dir` (defaults to `_sass`)
@import
"base",
"font",
"layout",
"syntax-highlighting"
;

9
src/dont-click-links.md Normal file
View File

@ -0,0 +1,9 @@
---
layout: page
title: Don't Click Links
permalink: /dont-click-links/
exclude: true
---
Don't click on random links, especially from emails or PDFs! Get into the habit
of copying links and inspecting them before clicking.

10
src/flying.md Normal file
View File

@ -0,0 +1,10 @@
---
layout: page
title: Flying
permalink: /flying/
exclude: true
---
I am a private pilot!
![Screenshot of FAA Airman Registry showing my 3rd class medical certificate date December 2018, that I must wear corrective lenses, that I do not have BasicMed, and that I am a private pilot airplane single engine land as of 2019-08-28](/img/airman-record.png)

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

BIN
src/img/airman-record.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

View File

Before

Width:  |  Height:  |  Size: 689 B

After

Width:  |  Height:  |  Size: 689 B

View File

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -10,10 +10,10 @@ layout: default
<h2>
<a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
</h2>
<span class="post-meta">{{ post.date | date: "%b %-d, %Y" }}</span>
<span class="post-meta">{{ post.date | date: site.date_format }} • {% include read_time.html words=post.content %}</span>
<div class="post-content-truncate">
{% if post.content contains "<!-- more -->" %}
{{ post.content | split:"<!-- more -->" | first % }}
{{ post.content | split:"<!-- more -->" | first }}
{% else %}
{{ post.content | strip_html | truncatewords:100 }}
{% endif %}

14
src/pay.md Normal file
View File

@ -0,0 +1,14 @@
---
layout: page
title: Paying Me
exclude: true
permalink: /pay/
---
You can pay me via the following:
- **Venmo**: @Ian-Naval
- **PayPal**: [paypal.me/ianonavy](https://paypal.me/ianonavy){:target="\_blank"}
- **Google Pay**: by phone number
- **Apple Cash**: by phone number
- **Zelle**: by phone number, or 06.iodide.battery@icloud.com

View File

@ -4,7 +4,6 @@ title: Projects
permalink: /projects/
projects:
- title: Potato Ipsum
image: potatoipsum.png
description: Lorem ipsum for potato fans.
@ -14,16 +13,19 @@ projects:
image: mirrors.png
description: Friends at WPI wanted to <code>apt-get upgrade</code> and <code>pacman -Syu</code> at lightning speed, so I made it happen.
url: http://mirrors.acm.wpi.edu/
---
{% for project in page.projects %}
<div class="projects-project">
<h2>{{ project.title }}</h2>
<h2>{{ project.title }}</h2>
<a href="{{ project.url }}"><img class="projects-screenshot" src="{{ "/img/" | append: project.image | prepend: site.baseurl }}"></a>
<a href="{{ project.url }}"
><img class="projects-screenshot" src="{{ "/img/" | append: project.image |
prepend: site.baseurl }}"></a
>
<p>{{ project.description }}</p>
<p>{{ project.description }}</p>
<p><a href="{{ project.url }}">Go to site &rarr;</a></p>
<p><a href="{{ project.url }}" target="_blank">Go to site &rarr;</a></p>
</div>
{% endfor %}