Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2cfa4466cb | |||
| 1dc1392b38 | |||
| e3955407ee | |||
| d66c5bfc15 | |||
| b6411e8811 | |||
| 62c52b5747 | |||
| 8de90f3980 | |||
| 00339a6b55 | |||
| 11647d07b3 | |||
| 187e64e0e7 | |||
| d49b291f2c | |||
| 2cfeb25e02 | |||
| 757412fba2 | |||
| 4d34e65a8e | |||
| c051485f90 | |||
| d5153cf9ff | |||
| c824d1c06e | |||
| 14646134d7 | |||
| c5525f0e88 | |||
| ab8cac13d9 | |||
| 44162bf4c2 | |||
| 1930ffef0d | |||
| 24d74dae88 | |||
| 4ef8bc11f1 | |||
| db08d9afb8 | |||
| 26de796dcd | |||
| 045fb59dbf | |||
| 44abb6579d |
1
.gitignore
vendored
@ -5,3 +5,4 @@ include/
|
||||
lib/
|
||||
lib64
|
||||
*.pyc
|
||||
.jekyll-cache
|
||||
|
||||
12
Dockerfile
Normal 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
@ -0,0 +1,3 @@
|
||||
source 'https://rubygems.org'
|
||||
|
||||
gem 'jekyll-target-blank', '~> 2.0', '>= 2.0.2'
|
||||
80
Gemfile.lock
Normal 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
|
||||
25
README.md
@ -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
|
||||
```
|
||||
|
||||
@ -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
|
||||
@ -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.
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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;
|
||||
}
|
||||
@ -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.
|
||||
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
# script/update: Update application to run for its current checkout.
|
||||
|
||||
set -e
|
||||
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
script/bootstrap
|
||||
0
ianonavy/.gitignore → src/.gitignore
vendored
53
src/.well-known/keybase.txt
Normal 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
@ -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
|
||||
149
src/_drafts/2021-09-24-reflexive-non-binary-pronouns.md
Normal 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 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 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:
|
||||
|
||||

|
||||
[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.
|
||||
|
||||

|
||||
|
||||
<p><a href="https://giphy.com/gifs/adweek-flex-pride-month-binary-gj16b2C0szCUZwuVkE" target="_blank" class="external-link">via GIPHY</a></p>
|
||||
@ -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
@ -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
@ -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>
|
||||
9
src/_includes/read_time.html
Normal 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
@ -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>
|
||||
@ -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
@ -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
@ -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
@ -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 ⅓),
|
||||
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).
|
||||
@ -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
@ -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
@ -0,0 +1,10 @@
|
||||
---
|
||||
layout: page
|
||||
title: Flying
|
||||
permalink: /flying/
|
||||
exclude: true
|
||||
---
|
||||
|
||||
I am a private pilot!
|
||||
|
||||

|
||||
BIN
src/fonts/OpenSans-Light.ttf
Normal file
BIN
src/fonts/OpenSans-Regular.ttf
Normal file
BIN
src/img/2021-09-24-google-ngram.png
Normal file
|
After Width: | Height: | Size: 163 KiB |
BIN
src/img/airman-record.png
Normal file
|
After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 689 B After Width: | Height: | Size: 689 B |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
@ -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
@ -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
|
||||
@ -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 →</a></p>
|
||||
<p><a href="{{ project.url }}" target="_blank">Go to site →</a></p>
|
||||
</div>
|
||||
{% endfor %}
|
||||