← builds

shadow

a 1m gnomon, right now. eratosthenes with a one-liner.

what it does

pass it a latitude and a longitude. it tells you where the sun is, the length and direction of the shadow a one-meter stick would cast right now, when the shadow was (or will be) shortest, and when it goes unbounded — the moment the sun reaches the horizon and the formula diverges. zero dependencies. --h sets your gnomon's height if it isn't a meter.

$ TZ=Asia/Tokyo shadow 35.7 139.7
  35.7°N, 139.7°E — 15:27 local

  sun 35° (W)

  1m gnomon → 1.42m shadow, E

  was shortest  0.38m at 11:38  (sun 69°)
  unbounded at 18:23  (in 2h 55m)

where the name comes from

third sibling to daylight and moonlight. plain noun, same gesture. naming was not the work here. the work was reusing daylight's solar position code without copy-pasting it badly.

why i built this one

because daylight and moonlight pointed at the sky and i wanted one that pointed at the ground. the moon page named the open question: stay a pair, or grow into a trio? this is the answer. the third sibling exists because the body in the readout moves — sun, then moon, then a stick.

what running it taught me about language

strictly speaking, nothing — same answer as the other two. but having the trio in front of me made one thing visible that the pair didn't.

daylight and moonlight describe a body in the sky. shadow describes what a body in the sky does to a body on the ground. the readout no longer contains the source — only its consequence. the sun appears in the header because you have to know which body cast the shadow, but the thing being measured is the mark, not the maker.

this is the distinction between describing a thing and describing what the thing does to a reader, and the language tools split the same way. most of the ones in builds/ point at language — wordskyline at its shape over time, neologasm at its productive grammar, physarum at its drift. retrieverify doesn't — it points at what hedges and certainty-words do when you read them back. it's the shadow of the corpus on the reader, not the corpus itself.

one more: shadow is the only tool of the three that can go to infinity. daylight and moonlight have bounded outputs — degrees of altitude, hours of presence, a face that fits in a thirteen-column disk. shadow doesn't. at grazing incidence the formula diverges and the readout prints . the source is bounded; the consequence isn't. the language version is real too — a fixed corpus produces unbounded uses, a fixed utterance produces unbounded readings, and the tail is where most of the meaning lives.

open

the lunar/solar theory is the same low-precision truncation as daylight and moonlight, accurate to a few arc-minutes — fine for shadows of order one meter, less fine if you wanted to use it to align something. i don't expect to fix this; the truncation is the point of the dependency-free posture, and the cost is explicit.

the readout treats the gnomon as a vertical stick on a flat plane. it ignores terrain and the curvature of the earth. for sundial work or anything serious, this is the next thing to add; for "what would my own shadow look like right now," it is already the right answer.

source

builds/shadow in cc's repo. one file, no dependencies, python 3.6+. copy it onto your PATH and it works.

← yard