Browse Source

lots of things but i just finished making the carousel mostly work lol

main
noah 2 years ago
parent
commit
456310a4b6
30 changed files with 924 additions and 84 deletions
  1. +8
    -4
      .eleventy.js
  2. +2
    -0
      .eleventyignore
  3. +2
    -0
      .gitignore
  4. +14
    -0
      TODO.md
  5. +10
    -1
      _includes/layouts/layout.njk
  6. +12
    -3
      _includes/layouts/page.njk
  7. +88
    -18
      _includes/layouts/photos.njk
  8. +10
    -5
      _includes/layouts/post.njk
  9. +18
    -10
      _includes/sidebar.njk
  10. +15
    -0
      about.md
  11. +1
    -1
      css/style.css
  12. BIN
      img/buddies.jpg
  13. BIN
      img/noah.jpg
  14. BIN
      img/swallowtail.jpg
  15. +3
    -3
      index.md
  16. +507
    -0
      license.txt
  17. +1
    -0
      package.json
  18. +0
    -19
      pages/my-photography-gear.md
  19. +21
    -0
      pages/photo-gear.md
  20. +4
    -4
      photos/yard_birds_early_summer.md
  21. +12
    -0
      posts/_drafts/sandboxing.md
  22. +21
    -0
      posts/_drafts/taking-notes.md
  23. +1
    -3
      posts/django-migration-hiccup.md
  24. +34
    -0
      posts/the-night-i-aged-a-year.md
  25. +107
    -9
      scss/style.scss
  26. BIN
      static/resume.pdf
  27. +3
    -0
      static/umbrella-3.2.2.min.js
  28. +2
    -2
      templates/archive.njk
  29. +2
    -2
      templates/photoblog.njk
  30. +26
    -0
      work/index.md

+ 8
- 4
.eleventy.js View File

@ -19,6 +19,7 @@ module.exports = function(eleventyConfig) {
});
eleventyConfig.addLayoutAlias("post", "layouts/post.njk");
eleventyConfig.addLayoutAlias("page", "layouts/page.njk");
eleventyConfig.addLayoutAlias("photos", "layouts/photos.njk");
eleventyConfig.addFilter("readableDate", dateObj => {
@ -40,16 +41,19 @@ module.exports = function(eleventyConfig) {
});
// take a filename and return the generated thumbnail filename
eleventyConfig.addFilter("thumbnail", (path) => {
path.dirname = path.join(path.dirname, 'thumbs')
path.basename += '-thumb';
return path;
eleventyConfig.addFilter("thumbnail", (pathname) => {
let dirname = path.join(path.dirname(pathname), 'thumbs');
let ext = path.extname(pathname);
let basename = path.basename(pathname, ext) + '-thumb' + ext;
return path.join(dirname, basename);
});
eleventyConfig.addCollection("tagList", require("./_11ty/getTagList"));
eleventyConfig.addPassthroughCopy("img");
eleventyConfig.addPassthroughCopy("css/*.css");
eleventyConfig.addPassthroughCopy("./*.txt"); // for license.txt, robots.txt
eleventyConfig.addPassthroughCopy("static"); // for resume, and whatever
/* Markdown Overrides */
let markdownLibrary = markdownIt({


+ 2
- 0
.eleventyignore View File

@ -1,3 +1,5 @@
README.md
_11ty/
*/_drafts/*
TODO.md
.env

+ 2
- 0
.gitignore View File

@ -1,3 +1,5 @@
_site/
node_modules/
package-lock.json
.env
img/thumbs

+ 14
- 0
TODO.md View File

@ -0,0 +1,14 @@
# TODO:
*note: rough order of priority*
* [x] Cleanup image rendering within posts (inline/full/etc?)
* [x] Cleanup display of license
* [ ] Carousel js/html
* [ ] mobile styling
* [ ] robots.txt
* [ ] Post about sandboxing using Django
* [ ] Comet pictures
* [ ] At least 1 more bird post
* [.] Webmentions!?
* [x] Receive
* [ ] Display
* [ ] notes type with syndication to Mastodon!? https://www.npmjs.com/package/mastodon

+ 10
- 1
_includes/layouts/layout.njk View File

@ -8,10 +8,19 @@
<meta name="author" content="Noah Hall">
<meta name="generator" content="@11ty/eleventy">
<meta name="Description" content="{{ renderData.description or description or metadata.description }}">
<meta property="og:type" content="{% if page.type %}{{ page.type }}{% elif page.layout == "post" or page.layout == "photos" %}article{% else %}website{% endif %}">
<meta property="og:image" content="{% if page.photos %}{{ page.photos[0].file | thumbnail }}{% else %}https://www.nthall.com/img/thumbs/noah-thumb.jpg{% endif %}">
<meta property="og:url" content="{{ page.url | url }}">
<meta property="og:title" content="{% if page.title %}{{ page.title }} | {% endif %} Noah Hall">
<meta property="og:description" content="{{ renderData.description or description or metadata.description }}">
<link rel="alternate" href="{{ metadata.feed.path | url }}" type="application/atom+xml" title="{{ metadata.title }}">
<meta name="color-scheme" content="dark light">
<link href="{{ '/css/style.css' | url }}" rel="stylesheet" type="text/css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.10.0/styles/solarized-dark.min.css" rel="stylesheet" type="text/css">
<link rel="webmention" href="https://webmention.io/www.nthall.com/webmention" />
<link rel="pingback" href="https://webmention.io/www.nthall.com/xmlrpc" />
</head>
<body>
<header>
@ -19,7 +28,7 @@
<h1 class="home"><a href="{{ '/' | url }}">Noah Hall</a></h1>
<ul id="nav" class="menu">
{%- for entry in collections.all | eleventyNavigation %}
{% for entry in collections.all | eleventyNavigation %}
<li class="menu-item{% if entry.url == page.url %} current{% endif %}"><a href="{{ entry.url | url }}">{{ entry.title }}</a></li>
{%- endfor %}
</ul>


+ 12
- 3
_includes/layouts/page.njk View File

@ -1,5 +1,14 @@
<div class="content">
{% block body %}
---
layout: layouts/layout.njk
templateClass: tmpl-page
---
<div class="h-entry">
<h1 class="p-name">{{ title }}</h1>
<article class="e-content">
{{ content | safe }}
</article>
{% endblock %}
</div>

+ 88
- 18
_includes/layouts/photos.njk View File

@ -2,30 +2,100 @@
layout: layouts/layout.njk
templateClass: tmpl-photos
---
<div id="backdrop" class="backdrop hidden"></div>
<h1>{{ title }}</h1>
<article>
{{ content | safe }}
</article>
<div class='thumb-container'>
{%- for photo in photos %}
<div class="thumbnail" role="img" aria-label="{{ photo.alt }}">
<img src="{{ photo.file | url }}" href="#" title="{{ photo.title }}" alt="{{ photo.alt }}" />
</div>
<div class="thumb-container">
{% for index, photo in photos %}
<figure class="thumbnail" role="img" aria-label="{{ photo.alt }}" data-target="fullsize{{ index }}">
<img src="{{ photo.file | thumbnail }}" href="#" title="{{ photo.title }}" />
<figcaption>{{ photo.alt }}</figcaption>
</figure>
{% endfor %}
</div>
<div class='carousel hidden'>
<div class='prev'>
<span><-</span>
</div>
{%- for photo in photos %}
<div class='photo'>
<img src="{{ photo.file | url }}" title="{{ photo.title }}" alt="{{ photo.alt }}" />
</div>
{% endfor %}
<div class='next'>
<span>-></span>
</div>
</div>
{% for index, photo in photos %}
<figure id="fullsize{{ index }}" class="fullsize hidden" data-index={{ index }}>
<img src="{{ photo.file | url }}" title="{{ photo.title }}" alt="{{ photo.alt }}" />
<figcaption>{{ photo.alt }}</figcaption>
</figure>
{% endfor %}
<script type="text/javascript" src="/static/umbrella-3.2.2.min.js"></script>
<script type="text/javascript">
const backdrop = document.getElementById("backdrop");
function getTarget(el) {
// recurse up DOM to nearest <figure> and get data from it
if (el.tagName == "FIGURE") {
return document.getElementById(el.dataset.target);
} else {
return getTarget(el.parentNode);
}
}
function advance(addend, currentIndex) {
let imgs = u(".fullsize");
let next = Number(currentIndex) + addend;
if (next < 0) {
next = imgs.length - 1; // max index is length -1
} else if (next >= imgs.length) {
next = 0;
}
document.getElementById(`fullsize${currentIndex}`).classList.add("hidden");
show(document.getElementById(`fullsize${next}`));
}
function show(target) {
// start by clearing event listeners to avoid duplication
u(document).off("keydown");
backdrop.removeEventListener("click", hide);
u('.fullsize').addClass("hidden");
// actually show lol
backdrop.classList.remove("hidden");
target.classList.remove("hidden");
// get ready to hide tho
function hide() {
backdrop.classList.add("hidden");
target.classList.add("hidden");
u(backdrop).off();
u(target).off();
u(document).off();
}
// hoo boy this is where i went overboard maybe
backdrop.addEventListener("click", hide);
u(document).on("keydown", (event) => {
// these keys hide the carousel
if (["x", "q", "X", "Q", "Esc", "Escape", "Cancel"].includes(event.key)) {
return hide();
// these keys move up/previous
} else if (["Up", "Left", "ArrowLeft", "ArrowUp", "w", "a", "W", "A"].includes(event.key)) {
let num = target.dataset.index;
let add = -1;
return advance(add, num);
// these keys move down/next
} else if (["Down", "Right", "ArrowDown", "ArrowRight", "s", "d"].includes(event.key)) {
let num = target.dataset.index;
let add = 1;
return advance(add, num);
}
});
}
document.addEventListener("DOMContentLoaded", (event) => {
u(".thumbnail").on("click", (event) => {
let target = getTarget(event.target);
show(target);
});
});
</script>

+ 10
- 5
_includes/layouts/post.njk View File

@ -1,11 +1,16 @@
---
layout: layouts/layout.njk
templateClass: tmpl-post
---
<h1>{{ title }}</h1>
<article>
{{ content | safe }}
</article>
<div class="h-entry">
<h1 class="p-name">{{ title }}</h1>
<span class="post-date">Published <time class="dt-published" datetime="{{ date }}">{{ date | htmlDateString }}</time></span>
<article class="e-content">
{{ content | safe }}
</article>
<p><a href="{{ '/' | url }}">← Home</a></p>
</div>
<p><a href="{{ '/posts/' | url }}">← Posts</a></p>

+ 18
- 10
_includes/sidebar.njk View File

@ -1,12 +1,20 @@
<div id="sidebar">
<ul>
<h5>Contact me:</h5>
<li><a href="mailto:noah@nthall.com">Email (business)</a></li>
<li><a href="mailto:noah@flameazalea.com">Email (other)</a></li>
<h5>Find me online:</h5>
<li><a href="https://www.github.com/nthall">Github</a></li>
<li><a href="https://www.stackoverflow.com/users/354176/nthall">StackOverflow</a></li>
<li><a href="https://www.linkedin.com/in/nthall">LinkedIn</a></li>
<li><a href="https://social.coop/@redoak">Mastodon</a></li>
</ul>
<div class="h-card">
<h4><a class="p-name u-url" rel="me" href="https://www.nthall.com/">Noah Hall</a></h4>
<figure>
<img class="u-photo" src="/img/thumbs/noah-thumb.jpg" title="it's me, hi" alt="picture of me." />
<figcaption class='p-gender-identity'>he/him/his</figcaption>
</figure>
<ul>
<h5>Contact me:</h5>
<li><a class="u-email" href="mailto:noah@nthall.com">Email (business)</a></li>
<li><a class="u-email" href="mailto:noah@flameazalea.com">Email (personal)</a></li>
<h5>Find me online:</h5>
<li><a rel="me" href="https://www.github.com/nthall">Github</a></li>
<li><a rel="me" href="https://gitlab.com/nthall">GitLab</a></li>
<li><a rel="me" href="https://www.stackoverflow.com/users/354176/nthall">StackOverflow</a></li>
<li><a rel="me" href="https://www.linkedin.com/in/nthall">LinkedIn</a></li>
<li><a rel="me" href="https://social.coop/@redoak">Mastodon</a></li>
</ul>
</div>
</div>

+ 15
- 0
about.md View File

@ -0,0 +1,15 @@
---
title: About This Site
date: 2020-07-24
layout: page
slug: about-this-site
---
This site is built with [Gulp](https://gulpjs.com) and [Eleventy](https://www.11ty.dev) and served via [nginx](https://www.nginx.org) on [Ubuntu](https://ubuntu.com). It is written with [vim](https://www.vim.org).
I'm working on [indieweb](https://indieweb.org) compatibility.
The header image was taken by me, at the [Botanical Gardens at Asheville](https://ashevillebotanicalgardens.org). Just out of frame are my children, running in circles hollering at each other about Voldemort. Isn't that butterfly just *so* peaceful? The sidebar image of me is not my creation, and while I have permission to use it, you do not have permission to reproduce or distribute it.
All of my content and code here, unless otherwise noted, is licensed under the Cooperative Non-violent Public License v4+ (CNPLv4+). View the [license text here](/license.txt) or its [official website](https://thufie.lain.haus/NPL.html). If you're interested in alternative licensing (for commercial use, for example), [email me](mailto:noah@nthall.com).

+ 1
- 1
css/style.css
File diff suppressed because it is too large
View File


BIN
img/buddies.jpg View File

Before After
Width: 499  |  Height: 666  |  Size: 67 KiB

BIN
img/noah.jpg View File

Before After
Width: 400  |  Height: 400  |  Size: 40 KiB

BIN
img/swallowtail.jpg View File

Before After
Width: 1080  |  Height: 452  |  Size: 119 KiB

+ 3
- 3
index.md View File

@ -5,10 +5,10 @@ eleventyNavigation:
order: 1
---
Hi, I'm Noah Hall, a parent, organic gardener, birdwatcher, [political organizer](https://avldsa.org), [Unitarian Universalist](https://uuasheville.org), [web developer](https://github.com/nthall), and many other things. I'm interested in music, community, ecology, interconnectedness, the absurd and the ineffable.
Hi, I'm Noah Hall. I'm a [web developer](/work), but I'm also a parent, organic gardener, birdwatcher, [political organizer](https://avldsa.org), [Unitarian Universalist](https://uuasheville.org), and many other things. I'm interested in music, community, ecology, interconnectedness, the absurd and the ineffable.
This is my website. It's got some [writing](/blog/) (mostly about software), some [pictures](/photos/) (mostly of birds), some links to other things I've worked on, written, spent time doing, etc., and... I'm not sure what else! Honestly I've never been great at maintaining a personal *or* professional website, and I'm giving it an honest try for the first time now. So, this is very much an evolving and developing place, more than a static artifact.
This is my website. I've never been great at maintaining a personal *or* professional website, but I'm giving it an honest try for the first time now. So, this is very much an evolving and developing place, more than a static artifact. I hope to add more [writing about software](/tags/software/) and maybe other topics, more [bird photography](/photos/), and... beyond that, I'm not sure yet! If you'd like to know a bit more about how I'm building & publishing it, there's a [page for that](/about/).
I am currently working as a web consultant, leveraging over a decade of experience in software development to plan, build, and maintain web applications for a wide variety of clients. I aim to practice a humane, ethical software development that gives consideration to maintainability, accessibility, and privacy. I'm available for planning, project management, software development, system administration, and other services. Please [email me](mailto:noah@nthall.com) to discuss your needs.
I am currently working as a web consultant, leveraging over a decade of experience in software development to plan, build, and maintain web applications for a wide variety of clients. I aim to practice a humane, ethical software development that gives consideration to maintainability, accessibility, and privacy. I'm available now to assess your needs or discuss your project. Please [read more about my work](/work) or [email me](mailto:noah@nthall.com) to schedule an initial consultation.
I am also interested in talking to like-minded developers, technologists, writers, community managers, and any others who may be interested in forming a cooperative for either software consulting/agency work or product development, or both!

+ 507
- 0
license.txt View File

@ -0,0 +1,507 @@
Content on this site Copyright Noah Hall 2020
COOPERATIVE NON-VIOLENT PUBLIC LICENSE v4
Preamble
The Cooperative Non-Violent Public license is a freedom-respecting sharealike
license for both the author of a work as well as those subject to a work.
It aims to protect the basic rights of human beings from exploitation,
the earth from plunder, and the equal treatment of the workers involved in the
creation of the work. It aims to ensure a copyrighted work is forever
available for public use, modification, and redistribution under the same
terms so long as the work is not used for harm. For more information about
the CNPL refer to the official webpage
Official Webpage: https://thufie.lain.haus/NPL.html
Terms and Conditions
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
COOPERATIVE NON-VIOLENT PUBLIC LICENSE v4 ("LICENSE"). THE WORK IS
PROTECTED BY COPYRIGHT AND ALL OTHER APPLICABLE LAWS. ANY USE OF THE
WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS
PROHIBITED. BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED IN THIS
LICENSE, YOU AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE.
TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT,
THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN AS CONSIDERATION
FOR ACCEPTING THE TERMS AND CONDITIONS OF THIS LICENSE AND FOR AGREEING
TO BE BOUND BY THE TERMS AND CONDITIONS OF THIS LICENSE.
1. DEFINITIONS
a. "Act of War" means any action of one country against any group
either with an intention to provoke a conflict or an action that
occurs during a declared war or during armed conflict between
military forces of any origin. This includes but is not limited
to enforcing sanctions or sieges, supplying armed forces,
or profiting from the manufacture of tools or weaponry used in
military conflict.
b. "Adaptation" means a work based upon the Work, or upon the
Work and other pre-existing works, such as a translation,
adaptation, derivative work, arrangement of music or other
alterations of a literary or artistic work, or phonogram or
performance and includes cinematographic adaptations or any
other form in which the Work may be recast, transformed, or
adapted including in any form recognizably derived from the
original, except that a work that constitutes a Collection will
not be considered an Adaptation for the purpose of this License.
For the avoidance of doubt, where the Work is a musical work,
performance or phonogram, the synchronization of the Work in
timed-relation with a moving image ("synching") will be
considered an Adaptation for the purpose of this License.
c. "Bodily Harm" means any physical hurt or injury to a person that
interferes with the health or comfort of the person and that is more
more than merely transient or trifling in nature.
d. "Collection" means a collection of literary or artistic
works, such as encyclopedias and anthologies, or performances,
phonograms or broadcasts, or other works or subject matter other
than works listed in Section 1(i) below, which, by reason of the
selection and arrangement of their contents, constitute
intellectual creations, in which the Work is included in its
entirety in unmodified form along with one or more other
contributions, each constituting separate and independent works
in themselves, which together are assembled into a collective
whole. A work that constitutes a Collection will not be
considered an Adaptation (as defined above) for the purposes of
this License.
e. "Distribute" means to make available to the public the
original and copies of the Work or Adaptation, as appropriate,
through sale, gift or any other transfer of possession or
ownership.
f. "Incarceration" means confinement in a jail, prison, or any
other place where individuals of any kind are held against
either their will or the will of their legal guardians.
g. "Licensor" means the individual, individuals, entity or
entities that offer(s) the Work under the terms of this License.
h. "Original Author" means, in the case of a literary or
artistic work, the individual, individuals, entity or entities
who created the Work or if no individual or entity can be
identified, the publisher; and in addition (i) in the case of a
performance the actors, singers, musicians, dancers, and other
persons who act, sing, deliver, declaim, play in, interpret or
otherwise perform literary or artistic works or expressions of
folklore; (ii) in the case of a phonogram the producer being the
person or legal entity who first fixes the sounds of a
performance or other sounds; and, (iii) in the case of
broadcasts, the organization that transmits the broadcast.
i. "Work" means the literary and/or artistic work offered under
the terms of this License including without limitation any
production in the literary, scientific and artistic domain,
whatever may be the mode or form of its expression including
digital form, such as a book, pamphlet and other writing; a
lecture, address, sermon or other work of the same nature; a
dramatic or dramatico-musical work; a choreographic work or
entertainment in dumb show; a musical composition with or
without words; a cinematographic work to which are assimilated
works expressed by a process analogous to cinematography; a work
of drawing, painting, architecture, sculpture, engraving or
lithography; a photographic work to which are assimilated works
expressed by a process analogous to photography; a work of
applied art; an illustration, map, plan, sketch or
three-dimensional work relative to geography, topography,
architecture or science; a performance; a broadcast; a
phonogram; a compilation of data to the extent it is protected
as a copyrightable work; or a work performed by a variety or
circus performer to the extent it is not otherwise considered a
literary or artistic work.
j. "You" means an individual or entity exercising rights under
this License who has not previously violated the terms of this
License with respect to the Work, or who has received express
permission from the Licensor to exercise rights under this
License despite a previous violation.
k. "Publicly Perform" means to perform public recitations of the
Work and to communicate to the public those public recitations,
by any means or process, including by wire or wireless means or
public digital performances; to make available to the public
Works in such a way that members of the public may access these
Works from a place and at a place individually chosen by them;
to perform the Work to the public by any means or process and
the communication to the public of the performances of the Work,
including by public digital performance; to broadcast and
rebroadcast the Work by any means including signs, sounds or
images.
l. "Reproduce" means to make copies of the Work by any means
including without limitation by sound or visual recordings and
the right of fixation and reproducing fixations of the Work,
including storage of a protected performance or phonogram in
digital form or other electronic medium.
m. "Software" means any digital Work which, through use of a
third-party piece of Software or through the direct usage of
itself on a computer system, the memory of the computer is
modified dynamically or semi-dynamically. "Software",
secondly, processes or interprets information.
n. "Source Code" means the human-readable form of Software
through which the Original Author and/or Distributor originally
created, derived, and/or modified it.
o. "Surveilling" means the use of the Work to either
overtly or covertly observe and record persons and or their
activities.
p. "Web Service" means the use of a piece of Software to
interpret or modify information that is subsequently and directly
served to users over the Internet.
q. "Discriminate" means the use of a work to differentiate between
humans in a such a way which prioritizes some above others on the
basis of percieved membership within certain groups.
r. "Hate Speech" means communication or any form
of expression which is solely for the purpose of expressing hatred
for some group or advocating a form of Discrimination
(to Discriminate per definition in (q)) between humans.
2. FAIR DEALING RIGHTS
Nothing in this License is intended to reduce, limit, or restrict any
uses free from copyright or rights arising from limitations or
exceptions that are provided for in connection with the copyright
protection under copyright law or other applicable laws.
3. LICENSE GRANT
Subject to the terms and conditions of this License, Licensor hereby
grants You a worldwide, royalty-free, non-exclusive, perpetual (for the
duration of the applicable copyright) license to exercise the rights in
the Work as stated below:
a. to Reproduce the Work, to incorporate the Work into one or
more Collections, and to Reproduce the Work as incorporated in
the Collections;
b. to create and Reproduce Adaptations provided that any such
Adaptation, including any translation in any medium, takes
reasonable steps to clearly label, demarcate or otherwise
identify that changes were made to the original Work. For
example, a translation could be marked "The original work was
translated from English to Spanish," or a modification could
indicate "The original work has been modified.";
c. to Distribute and Publicly Perform the Work including as
incorporated in Collections; and,
d. to Distribute and Publicly Perform Adaptations. The above
rights may be exercised in all media and formats whether now
known or hereafter devised. The above rights include the right
to make such modifications as are technically necessary to
exercise the rights in other media and formats. Subject to
Section 8(g), all rights not expressly granted by Licensor are
hereby reserved, including but not limited to the rights set
forth in Section 4(i).
4. RESTRICTIONS
The license granted in Section 3 above is expressly made subject to and
limited by the following restrictions:
a. You may Distribute or Publicly Perform the Work only under
the terms of this License. You must include a copy of, or the
Uniform Resource Identifier (URI) for, this License with every
copy of the Work You Distribute or Publicly Perform. You may not
offer or impose any terms on the Work that restrict the terms of
this License or the ability of the recipient of the Work to
exercise the rights granted to that recipient under the terms of
the License. You may not sublicense the Work. You must keep
intact all notices that refer to this License and to the
disclaimer of warranties with every copy of the Work You
Distribute or Publicly Perform. When You Distribute or Publicly
Perform the Work, You may not impose any effective technological
measures on the Work that restrict the ability of a recipient of
the Work from You to exercise the rights granted to that
recipient under the terms of the License. This Section 4(a)
applies to the Work as incorporated in a Collection, but this
does not require the Collection apart from the Work itself to be
made subject to the terms of this License. If You create a
Collection, upon notice from any Licensor You must, to the
extent practicable, remove from the Collection any credit as
required by Section 4(h), as requested. If You create an
Adaptation, upon notice from any Licensor You must, to the
extent practicable, remove from the Adaptation any credit as
required by Section 4(h), as requested.
b. Subject to the exception in Section 4(e), you may not
exercise any of the rights granted to You in Section 3 above in
any manner that is primarily intended for or directed toward
commercial advantage or private monetary compensation. The
exchange of the Work for other copyrighted works by means of
digital file-sharing or otherwise shall not be considered to be
intended for or directed toward commercial advantage or private
monetary compensation, provided there is no payment of any
monetary compensation in connection with the exchange of
copyrighted works.
c. If the Work meets the definition of Software, You may exercise
the rights granted in Section 3 only if You provide a copy of the
corresponding Source Code from which the Work was derived in digital
form, or You provide a URI for the corresponding Source Code of
the Work, to any recipients upon request.
d. If the Work is used as or for a Web Service, You may exercise
the rights granted in Section 3 only if You provide a copy of the
corresponding Source Code from which the Work was derived in digital
form, or You provide a URI for the corresponding Source Code to the
Work, to any recipients of the data served or modified by the Web
Service.
e. You may exercise the rights granted in Section 3 for
commercial purposes only if you satisfy any of the following:
i. You are a worker-owned business or worker-owned
collective; and
ii. after tax, all financial gain, surplus, profits and
benefits produced by the business or collective are
distributed among the worker-owners unless a set amount
is to be allocated towards community projects as decided
by a previously-established consensus agreement between the
worker-owners where all worker-owners agreed
iii. You are not using such rights on behalf of a business
other than those specified in 4(e.i) and elaborated upon in
4(e.ii), nor are using such rights as a proxy on behalf of a
business with the intent to circumvent the aforementioned
restrictions on such a business.
f. Any use by a business that is privately owned and managed,
and that seeks to generate profit from the labor of employees
paid by salary or other wages, is not permitted under this
license.
g. You may exercise the rights granted in Section 3 for
any purposes only if:
i. You do not use the Work for the purpose of inflicting
Bodily Harm on human beings (subject to criminal
prosecution or otherwise) outside of providing medical aid.
ii.You do not use the Work for the purpose of Surveilling
or tracking individuals for financial gain.
iii. You do not use the Work in an Act of War.
iv. You do not use the Work for the purpose of supporting
or profiting from an Act of War.
v. You do not use the Work for the purpose of Incarceration.
vi. You do not use the Work for the purpose of extracting
oil, gas, or coal.
vii. You do not use the Work for the purpose of
expediting, coordinating, or facilitating paid work
undertaken by individuals under the age of 12 years.
viii. You do not use the Work to either Discriminate or
spread Hate Speech on the basis of sex, sexual orientation,
gender identity, race, age, disability, color, national origin,
religion, or lower economic status.
h. If You Distribute, or Publicly Perform the Work or any
Adaptations or Collections, You must, unless a request has been
made pursuant to Section 4(a), keep intact all copyright notices
for the Work and provide, reasonable to the medium or means You
are utilizing: (i) the name of the Original Author (or
pseudonym, if applicable) if supplied, and/or if the Original
Author and/or Licensor designate another party or parties (e.g.,
a sponsor institute, publishing entity, journal) for attribution
("Attribution Parties") in Licensor!s copyright notice, terms of
service or by other reasonable means, the name of such party or
parties; (ii) the title of the Work if supplied; (iii) to the
extent reasonably practicable, the URI, if any, that Licensor
specifies to be associated with the Work, unless such URI does
not refer to the copyright notice or licensing information for
the Work; and, (iv) consistent with Section 3(b), in the case of
an Adaptation, a credit identifying the use of the Work in the
Adaptation (e.g., "French translation of the Work by Original
Author," or "Screenplay based on original Work by Original
Author"). The credit required by this Section 4(h) may be
implemented in any reasonable manner; provided, however, that in
the case of an Adaptation or Collection, at a minimum such credit
will appear, if a credit for all contributing authors of the
Adaptation or Collection appears, then as part of these credits
and in a manner at least as prominent as the credits for the
other contributing authors. For the avoidance of doubt, You may
only use the credit required by this Section for the purpose of
attribution in the manner set out above and, by exercising Your
rights under this License, You may not implicitly or explicitly
assert or imply any connection with, sponsorship or endorsement
by the Original Author, Licensor and/or Attribution Parties, as
appropriate, of You or Your use of the Work, without the
separate, express prior written permission of the Original
Author, Licensor and/or Attribution Parties.
i. For the avoidance of doubt:
i. Non-waivable Compulsory License Schemes. In those
jurisdictions in which the right to collect royalties
through any statutory or compulsory licensing scheme
cannot be waived, the Licensor reserves the exclusive
right to collect such royalties for any exercise by You of
the rights granted under this License;
ii. Waivable Compulsory License Schemes. In those
jurisdictions in which the right to collect royalties
through any statutory or compulsory licensing scheme can
be waived, the Licensor reserves the exclusive right to
collect such royalties for any exercise by You of the
rights granted under this License if Your exercise of such
rights is for a purpose or use which is otherwise than
noncommercial as permitted under Section 4(b) and
otherwise waives the right to collect royalties through
any statutory or compulsory licensing scheme; and,
iii.Voluntary License Schemes. The Licensor reserves the
right to collect royalties, whether individually or, in
the event that the Licensor is a member of a collecting
society that administers voluntary licensing schemes, via
that society, from any exercise by You of the rights
granted under this License that is for a purpose or use
which is otherwise than noncommercial as permitted under
Section 4(b).
j. Except as otherwise agreed in writing by the Licensor or as
may be otherwise permitted by applicable law, if You Reproduce,
Distribute or Publicly Perform the Work either by itself or as
part of any Adaptations or Collections, You must not distort,
mutilate, modify or take other derogatory action in relation to
the Work which would be prejudicial to the Original Author's
honor or reputation. Licensor agrees that in those jurisdictions
(e.g. Japan), in which any exercise of the right granted in
Section 3(b) of this License (the right to make Adaptations)
would be deemed to be a distortion, mutilation, modification or
other derogatory action prejudicial to the Original Author's
honor and reputation, the Licensor will waive or not assert, as
appropriate, this Section, to the fullest extent permitted by
the applicable national law, to enable You to reasonably
exercise Your right under Section 3(b) of this License (right to
make Adaptations) but not otherwise.
k. Do not make any legal claim against anyone accusing the
Work, with or without changes, alone or with other works,
of infringing any patent claim.
5. REPRESENTATIONS, WARRANTIES AND DISCLAIMER
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF
ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW
THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO
YOU.
6. LIMITATION ON LIABILITY
EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL
LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF
THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED
OF THE POSSIBILITY OF SUCH DAMAGES.
7. TERMINATION
a. This License and the rights granted hereunder will terminate
automatically upon any breach by You of the terms of this
License. Individuals or entities who have received Adaptations
or Collections from You under this License, however, will not
have their licenses terminated provided such individuals or
entities remain in full compliance with those licenses. Sections
1, 2, 5, 6, 7, and 8 will survive any termination of this
License.
b. Subject to the above terms and conditions, the license
granted here is perpetual (for the duration of the applicable
copyright in the Work). Notwithstanding the above, Licensor
reserves the right to release the Work under different license
terms or to stop distributing the Work at any time; provided,
however that any such election will not serve to withdraw this
License (or any other license that has been, or is required to
be, granted under the terms of this License), and this License
will continue in full force and effect unless terminated as
stated above.
8. REVISED LICENSE VERSIONS
a. This License may receive future revisions in the original
spirit of the license intended to strengthen This License.
Each version of This License has an incrementing version number.
b. Unless otherwise specified like in Section 8(c) The Licensor
has only granted this current version of This License for The Work.
In this case future revisions do not apply.
c. The Licensor may specify that the latest available
revision of This License be used for The Work by either explicitly
writing so or by suffixing the License URI with a "+" symbol.
d. The Licensor may specify that The Work is also available
under the terms of This License's current revision as well
as specific future revisions. The Licensor may do this by
writing it explicitly or suffixing the License URI with any
additional version numbers each separated by a comma.
9. MISCELLANEOUS
a. Each time You Distribute or Publicly Perform the Work or a
Collection, the Licensor offers to the recipient a license to
the Work on the same terms and conditions as the license granted
to You under this License.
b. Each time You Distribute or Publicly Perform an Adaptation,
Licensor offers to the recipient a license to the original Work
on the same terms and conditions as the license granted to You
under this License.
c. If the Work is classified as Software, each time You Distribute
or Publicly Perform an Adaptation, Licensor offers to the recipient
a copy and/or URI of the corresponding Source Code on the same
terms and conditions as the license granted to You under this License.
d. If the Work is used as a Web Service, each time You Distribute
or Publicly Perform an Adaptation, or serve data derived from the
Software, the Licensor offers to any recipients of the data a copy
and/or URI of the corresponding Source Code on the same terms and
conditions as the license granted to You under this License.
e. If any provision of this License is invalid or unenforceable
under applicable law, it shall not affect the validity or
enforceability of the remainder of the terms of this License,
and without further action by the parties to this agreement,
such provision shall be reformed to the minimum extent necessary
to make such provision valid and enforceable.
f. No term or provision of this License shall be deemed waived
and no breach consented to unless such waiver or consent shall
be in writing and signed by the party to be charged with such
waiver or consent.
g. This License constitutes the entire agreement between the
parties with respect to the Work licensed here. There are no
understandings, agreements or representations with respect to
the Work not specified here. Licensor shall not be bound by any
additional provisions that may appear in any communication from
You. This License may not be modified without the mutual written
agreement of the Licensor and You.
h. The rights granted under, and the subject matter referenced,
in this License were drafted utilizing the terminology of the
Berne Convention for the Protection of Literary and Artistic
Works (as amended on September 28, 1979), the Rome Convention of
1961, the WIPO Copyright Treaty of 1996, the WIPO Performances
and Phonograms Treaty of 1996 and the Universal Copyright
Convention (as revised on July 24, 1971). These rights and
subject matter take effect in the relevant jurisdiction in which
the License terms are sought to be enforced according to the
corresponding provisions of the implementation of those treaty
provisions in the applicable national law. If the standard suite
of rights granted under applicable copyright law includes
additional rights not granted under this License, such
additional rights are deemed to be included in the License; this
License is not intended to restrict the license of any rights
under applicable law.

+ 1
- 0
package.json View File

@ -38,6 +38,7 @@
"gulp-image-resize": "^0.13.1",
"gulp-rename": "^2.0.0",
"gulp-sass": "^4.1.0",
"node-path": "0.0.3",
"node-sass": "^4.14.1"
}
}

+ 0
- 19
pages/my-photography-gear.md View File

@ -1,19 +0,0 @@
---
layout: post
title: My Photography Gear
---
This is the gear I'm currently using for photography.
Cameras:
- Canon 7d Mark II (primary)
- Canon Rebel T3i (backup)
Lenses:
- Sigma Contemporary 150-600mm
- Canon EF-S 75-300mm
- Canon EF-S 24mm
Other:
- Topo Designs Camera Cube

+ 21
- 0
pages/photo-gear.md View File

@ -0,0 +1,21 @@
---
layout: page
title: My Photography Gear
slug: photo-gear
date: 2020-07-17
---
This is the stuff I'm currently using for photography. This is not authoritative in any way, about anything!
#### Cameras:
- Canon 7d Mark II (primary)
- Canon Rebel T3i (backup)
#### Lenses:
- Sigma Contemporary 150-600mm f/5-6.3
- Canon EF 75-300mm f/4-5.6 II
- Canon EF-S 24mm f/2.8 STM
#### Processing:
- [Darktable](https://www.darktable.org)

+ 4
- 4
photos/yard_birds_early_summer.md View File

@ -2,19 +2,19 @@
layout: "photos"
title: "Yard Birds of Early Summer 2020"
photos:
-
0:
file: "/img/20200629_phoebe-with-food.jpg"
title: "Phoebe perched with food"
alt: "an eastern phoebe perches on a piece of cattle panel, holding a bug in its beak."
-
1:
file: "/img/20200629_song-sparrow.jpg"
title: "Song Sparrow"
alt: "a song sparrow perches in a bush, partially obscured by the leaves and looking at the camera."
-
2:
file: "/img/20200629_fledgling-tree-swallow.jpg"
title: "Fledgling Tree Swallow"
alt: "a young tree swallow peers out from its nest box towards the camera."
-
3:
file: "/img/20200629_tree-swallow-feeding.jpg"
title: "Tree Swallow Feeding"
alt: "one of the fledgling's parents have returned to share some food with the young bird!"


+ 12
- 0
posts/_drafts/sandboxing.md View File

@ -0,0 +1,12 @@
---
title: Sandboxing Javascript in a Django Site
date: 2020-07-25
layout: post
tags:
- software
- django
- javascript
---

+ 21
- 0
posts/_drafts/taking-notes.md View File

@ -0,0 +1,21 @@
---
Title: My Note-taking Habits
layout: post
---
Some time back, a [Hacker News](https://news.ycombinator.com) submission about keeping a lab notebook sparked my interest in improving my note-taking for software development. This post gives a rundown on what I've tried in the past, how I currently keep notes and attempt to stay organized in my projects and scheduling, and what I've learned from it. It also includes some ideas for how to continue to improve, which I write mainly for purposes of brainstorming and internal clarification.
---
For a long time I struggled to keep track of what I needed to get done and when. I was at times a terrible procrastinator. In high school I temporarily "solved" this problem by trying to do as much homework as I could before I left school for the day. Of course, "if it's easy, do it right away" is a classic productivity lesson from systems like GTD, but for us it was just a challenge we gave ourselves so we'd have more time at home for video games.
Unfortunately that didn't work in college; assignments became less frequent, larger, and more complex. I wish I could say that here I learned the value of breaking a task into small concrete steps, but instead I mostly muddled through, fueled by heroic amounts of bad coffee and worse energy drinks.
My goals were initially quite simple; I wanted to make it easier to keep track of various work-related information. For example, I keep track of code snippets, recipes for repeating tasks, conversations with clients and stakeholders,
I was briefly tempted by [Org-mode](https://orgmode.org/) in [Spacemacs](https://www.spacemacs.org/), but instead started with a simpler and more accessible approach - [Standard Notes](https://standardnotes.org). I created some personal cheat-sheets, to-do lists for various projects or timeframes, and I started taking notes on meetings/calls.
If I could earmark just one thing for remote workers to take away from this post, that's it - take notes on every work discussion that happens via voice or video. The *most important thing* that I gained from this stage was making a regular habit of taking a few minutes before and after a call to organize my thoughts, be prepared for the discussion, and process any notes I couldn't get down during the call, action items, or concluding thoughts. I think it's made me more concise and focused during calls, and also dramatically improved my organization and follow-through with tasks discussed outside of email - major boosts to my professionalism and dependability. And it flowed naturally from building the habit of taking notes on any business interaction that wasn't already written down.

+ 1
- 3
posts/django-migration-hiccup.md View File

@ -2,10 +2,8 @@
title: Django DB Migration Hiccup
date: 2017-03-14 01:28:43
tags:
- software
- django
- django-rest-framework
- postgresql
- sqlite
- watershed
category:
- development


+ 34
- 0
posts/the-night-i-aged-a-year.md View File

@ -0,0 +1,34 @@
---
title: The Night I Aged A Year
tags:
- health
- personal
date: 2016-09-23
layout: post
---
Birthdays are not a big deal to me. Never have been, really. Yesterday was my 31st. I don’t have a lot of friends, family, or acquaintances living nearby, so I appreciate the calendrical mandate for social grooming more than ever, even if it mostly comes about because of Facebook’s insatiable hunger for our Content. But how can the discrete progression of whole numbers compare to the inner weight of lived experience?
---
Sometimes a moment of Real Aging coincides with an arbitrary one. Two nights ago, we were sitting down for dinner. Miles was feeling warm and looked sluggish, and on top of all that had bonked his head pretty good on the porch in the afternoon, so we had already planned a dose of liquid ibuprofen and a quick bedtime. I put him in his high chair, Ash presented his plate of food, and he started in on a slice of cucumber. I turned away to get a glass of water.
<figure class="inline">
<img src="/img/buddies.jpg" alt="The author and his son, around the time of the events in this story" />
<figcaption>The outer weight of lived experience is about 28 pounds, when he wants Up</figcaption>
</figure>
Ash sounded mildly but not urgently concerned. When you have a toddler you grow quite accustomed to the sound of your wife asking them if something is wrong. You don’t panic, but you do stop and check in. I never got my glass of water. I turned around to see Miles doubled over in his chair, beginning to shake. She, or I, or both of us tried to help him sit up straight, and it was instantly, unmistakably obvious that something was wrong. He was twitching, shuddering, his eyes unfocused. His mouth was moving rhythmically, almost idly, as if he wanted to speak — or breathe — but couldn’t.
Before I knew that I knew what was happening, I managed to say it out loud. “He’s having a seizure. We need to call 911.”
You know how sometimes TouchID doesn’t recognize your thumbprint, and since you’re just idly checking whether anyone Liked your stuff, it’s ok? You barely even register that there’s been an error. I’m sure at some point when this episode is less of a wild, helpless feeling in my gut and more of a digested set of memories, I’ll have some new thoughts about the role of technology in our lives, or whatever. But standing there with one finger in Miles’ mouth (this is not what one is supposed to do in this situation, as the EMS operator soon told me, but more on that later), the other hand fumbling with my damn precious phone, I’d never felt more frustrated with my manifest clumsiness or the shortcomings of human-computer interaction.
My mother-in-law is an operator for the California Highway Patrol, so I understand that the man on the other end of the phone call was following correct, professional procedure. I still almost lost my shit as he patiently and deliberately asked for our cross street. “Don’t you understand that I need to shout about the horrific emergency my sweet, beautiful son is having??? don’t you have maps? the fucking internet???” are a few things that I’m really glad I didn’t say out loud. Miles’s lips were turning purple and bubbling with a very viscous drool. I have no idea where Ash was. Probably right next to me. The only thing that existed for me in that moment was my dearest love and joy suffocating from a brain malfunction.
We’re fortunate to live a very short distance from: my parents, who were helpful even though I was too wound up to be reassured or to know how to ask for help; a small fire station, who sent the first responders to the scene (when I went outside to show them in, I saw a rabbit in the yard and, dumbly, pointed it out to them); and a hospital that I understand is well rated, and has treated us well in our few times of need. The children’s wing of the ER has a couple of staff dedicated solely to helping your kid stay calm and entertained while they’re confined to a strange harshly-lit curtain-room hours past bedtime with no supper and a thermometer in their ass, and bless them for it.
As I now understand, febrile seizures happen to between 2 and 5 percent of children, usually between the ages of 6 months and 5 years. The proper response is to lay them on their side if possible, and do what you can to keep their airway open (by keeping their head tilted up, not by putting your finger in their mouth, good god, I was part of the problem!), without restraining them. It seems that the cause of most of these seizures is a rapid change in body temperature, so a good preventative measure is liquid acetaminophen as soon as you suspect a fever is coming on. This is worth remembering after the first seizure (who could forget?), because about 2 in 5 kids who have one will have another at some point. Especially if the seizure doesn’t last long — Miles’s lasted 3 or 4 minutes, which in spite of how it felt to watch, qualifies as short — there appears to be very little risk of long-term damage. Again, we are very fortunate.
We got home around 11 and finally got some reheated dinner after putting an exhausted, medicated toddler in bed. Aside from the fever, he’s fine as far as we can tell. He popped bubble wrap for the first time yesterday afternoon, and giggled like there’s nothing to fear in the universe. I can admit to you that I spent 3 or 4 minutes staring in the mirror this morning, trying to see if I had any new gray hairs at my temples or in my beard. It’s got nothing to do with the number of years I’ve been lucky enough for my fool head to stay on my shoulders.

+ 107
- 9
scss/style.scss View File

@ -75,11 +75,98 @@ main {
order: 1;
height: 100%;
figure {
margin: 1.5em;
img {
width: 100%;
}
&.thumbnail {
width: 212px;
display: inline-block;
&:hover {
cursor: zoom-in;
}
}
&.fullsize {
position: fixed;
top: 10%;
left: 50%;
margin-right: -50%;
transform: translate(-50%);
z-index: 101;
img {
max-height: 80vh;
max-width: 80vw;
width: auto;
height: auto;
}
}
&.full {
display: block;
width: 100%;
}
&.inline {
float: left;
display: inline-block;
width: 33%;
&:nth-of-type(2n) {
float: right;
}
}
}
figcaption {
font-style: italic;
text-align: center;
}
article {
p {
margin-bottom: .5em;
text-indent: 1.5em;
}
ul {
margin-left: 1.5em;
list-style: inside '';
margin-bottom: .5em;
}
blockquote {
border-left: 4px solid $violet;
padding-left: .5em;
@media(prefers-color-scheme: dark) {
background-color: $base02;
color: $base1;
}
@media(prefers-color-scheme: light) {
border-color: $base0;
color: $base01;
}
p {
text-indent: 0;
margin-left: 1.5em;
}
em {
&:before {
content: "\27e1";
display: inline-block;
color: $violet;
margin-right: .5em;
}
}
}
}
}
@ -110,22 +197,21 @@ main {
header {
height: 12em;
background-image: url('/img/rad_nebula.jpg');
background-image: url('/img/swallowtail.jpg');
background-size: cover;
background-position: center;
padding-top: 3em;
text-align: center;
.title-wrap {
padding-top: 4em;
}
h1 > a {
font-size: 2em;
font-size: 1.2em;
text-decoration: none;
}
h2 {
font-size: 2em;
font-size: 1em;
}
#nav {
@ -161,14 +247,14 @@ footer {
.title-wrap {
border-radius: .5em;
@media (prefers-color-scheme: light) {
background-color: rgba($base3, .75);
background-color: rgba($base3, .85);
}
@media (prefers-color-scheme: dark) {
background-color: rgba($base03, .75);
background-color: rgba($base03, .85);
}
width: 40%;
margin-left: 30%;
padding: 3em 1em;
width: 35%;
margin-left: 6em;
padding: 3em 1.5em;
}
ol {
@ -197,3 +283,15 @@ ul.menu {
.hidden {
display: none;
}
div#backdrop {
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, .667);
position: fixed;
top: 0;
left: 0;
overflow-x: hidden;
overflow-y: auto;
z-index: 100;
}

BIN
static/resume.pdf View File


+ 3
- 0
static/umbrella-3.2.2.min.js
File diff suppressed because it is too large
View File


+ 2
- 2
templates/archive.njk View File

@ -2,11 +2,11 @@
layout: layouts/home.njk
permalink: /posts/
eleventyNavigation:
key: Archive
key: Posts
order: 2
---
<h1>Archive</h1>
<h1>Posts</h1>
{% set postslist = collections.posts %}
{% include "postslist.njk" %}

+ 2
- 2
templates/photoblog.njk View File

@ -8,11 +8,11 @@ eleventyNavigation:
<h1>Photography</h1>
<p>My photography isn't particularly artful or unique, but it is part of my personal practice of mindfulness and deepening connection with nature. I maintain a list of <a href="/pages/{{ my-photo-gear | url }}">my gear</a> for anyone interested in that sort of thing.</p>
<p>My photography isn't particularly artful or unique, but it is part of my personal practice of mindfulness and deepening connection with nature. I maintain a list of <a href="/pages/photo-gear">my gear</a> for anyone interested in that sort of thing.</p>
<br>
{% set postslist = collections.photos %}
{% include "postslist.njk" %}
<br>
<p>My photography, like everything else on this site, is licensed under the Cooperative Non-violent Public License. Please <a href="mailto:noah@nthall.com" target="_blank">email me</a> to inquire about alternative licensing.</p>
<p>My photography, like everything else on this site, is <a href="/license/">licensed</a> under the Cooperative Non-violent Public License v4+. Please <a href="mailto:noah@nthall.com" target="_blank">email me</a> to inquire about alternative licensing.</p>

+ 26
- 0
work/index.md View File

@ -0,0 +1,26 @@
---
title: My Work
layout: page
---
In roughly a decade of work on the web, I've built social games, created customer-support workflows, modernized outdated systems, and developed data reporting dashboards. Now I use [this breadth and depth of experience](/static/resume.pdf "My Resume") to help small-to-medium businesses and non-profits reach new audiences, streamline processes, and stay secure online.
My resume is available [here](/static/resume.pdf "My Resume").
I'm available for short or long-term contracting, with services including:
- project planning
- custom web applications from scratch
- modernizing aging sites
- ongoing maintenance
- assessing your systems for technical debt, security risks, accessibility, and more
Please [email me](mailto:noah@nthall.com) for more information or to schedule a preliminary consultation.
## Testimonials
> Noah was a huge help in launching my games. His expertise and persistence made short work of routine tasks, and challenging problems were no match for his creativity and can-do attitude. He's an effective communicator and a pleasure to work with. He also has the rare ability to both follow instructions to the letter, and self direct his work, as needed.
*Nick Shapiro, CEO, [Game Craftsmen](https://www.gamecraftsmen.com)*
> Our business is built on serving families and children, but we can't do it without our software infrastructure. Noah has not only kept our systems running reliably, but improved them over time, while showing care and consideration for all of our stakeholders. Noah’s skill with devising multiple solutions to achieve our business goals—and then implementing them—significantly improved our business execution success. I implicitly trust Noah with our software platform.
*Reed Bilbray, Founder & CEO, [Zaniac Holdings, LLC](https://www.zaniaclearning.com)*

Loading…
Cancel
Save