diff options
89 files changed, 1074 insertions, 444 deletions
diff --git a/etc/pronouns/.gitignore b/etc/pronouns/.gitignore new file mode 100644 index 00000000..facfb3f3 --- /dev/null +++ b/etc/pronouns/.gitignore @@ -0,0 +1,2 @@ +access_token +[1-9]* diff --git a/etc/pronouns/bot.sh b/etc/pronouns/bot.sh new file mode 100644 index 00000000..8b7c9802 --- /dev/null +++ b/etc/pronouns/bot.sh @@ -0,0 +1,69 @@ +#!/bin/sh +set -eu + +Instance=https://mstdn.isometry.group + +if ! test -f access_token; then + echo 'No access_token!' >&2 + exit 1 +fi + +post=true +while getopts 'n' opt; do + case $opt in + (n) post=false;; + (?) exit 1;; + esac +done +shift $((OPTIND - 1)) + +access_token=$(cat access_token) + +account_id=$( + curl -Ss \ + -H "Authorization: Bearer ${access_token}" \ + ${Instance}/api/v1/accounts/verify_credentials | + jq -r .id +) + +# XXX: no pagination because I don't expect this to ever have over 80 followers +followers=$( + curl -Ss \ + -H "Authorization: Bearer ${access_token}" \ + "${Instance}/api/v1/accounts/${account_id}/followers?limit=80" | + jq -r 'map(select(.acct | contains("@") | not)) | .[].id' +) + +for follower_id in $followers 112284333737697665; do + account=$( + curl -Ss \ + -H "Authorization: Bearer ${access_token}" \ + ${Instance}/api/v1/accounts/${follower_id} + ) + username=$(printf '%s' "${account}" | jq -r .username) + pronouns=$( + printf '%s' "${account}" | + jq -r ' + .fields | + map(select(.name | test("^prono(un|m)s?[?]?$|^((professional|leisure|casual) |anti-)no(un|m)s?$"; "i"))) | + .[].value + ' + ) + if ! test -f $follower_id; then + printf '%s' "${pronouns}" >$follower_id + continue + fi + old_pronouns=$(cat $follower_id) + if [ "${pronouns}" != "${old_pronouns}" ]; then + text=$(printf '%s' "${pronouns}" | dehtml) + if $post; then + curl -Ss -X POST \ + -H "Authorization: Bearer ${access_token}" \ + -F visibility=unlisted \ + --form-string \ + "status=@${username} has changed pronouns to: ${text}" \ + ${Instance}/api/v1/statuses >/dev/null + fi + printf '%s' "${pronouns}" >$follower_id + fi +done diff --git a/home/.local/bin/masto b/home/.local/bin/masto new file mode 100755 index 00000000..9fdbfdf1 --- /dev/null +++ b/home/.local/bin/masto @@ -0,0 +1,12 @@ +#!/bin/sh +set -eu + +outbox=$1 +pattern=$2 + +jq -r " + .orderedItems[] | + select(.object | type == \"object\") | .object | + select(.content | test(\"${pattern}\")) | + \"\\(.content)\\n\\(.url)\\n\" +" "$outbox" | dehtml diff --git a/txt/books.txt b/txt/books.txt index fc3fb203..d8166d72 100644 --- a/txt/books.txt +++ b/txt/books.txt @@ -1,5 +1,14 @@ +[ 2025 ] + + 5. ★★★ Alix E. Harrow, The Everlasting + 4. ★★☆ Arkady Martine, Rose/House + 3. ★★☆ H. E., second draft of Last Train Home + 2. ★★☆ Nicola Griffith, Spear + 1. ★★☆ Ruthanna Emrys, A Half-Built Garden + [ 2024 ] + 2. ★☆☆ R. A. MacAvoy, Tea with the Black Dragon 1. ★☆☆ Sybil Lamb, The Girl Who Was Convinced Beyond All Reason That She Could Fly [ 2023 ] diff --git a/txt/shows.txt b/txt/shows.txt index 2abacf5b..a9c5ee95 100644 --- a/txt/shows.txt +++ b/txt/shows.txt @@ -1,3 +1,4 @@ +2024-06-21 (La Sala Rossa) MAGELLA, Quinton Barnes, BACKXWASH 2022-12-18 (SAT) LINGUA IGNOTA 2022-06-04 (MAI) Honeydrip, MAGELLA, BACKXWASH 2020-01-23 (La Sala Rossa) Secondsight, BIG|BRAVE diff --git a/www/causal.agency/Makefile b/www/causal.agency/Makefile index 8c74f8f1..d3af7265 100644 --- a/www/causal.agency/Makefile +++ b/www/causal.agency/Makefile @@ -1,7 +1,7 @@ WEBROOT = /var/www/causal.agency GEN = index.html scheme.css scheme.png -FILES = ${GEN} style.css alpha.html lands.html +FILES = ${GEN} style.css alpha.html dais.html lands.html all: ${FILES} diff --git a/www/causal.agency/dais.html b/www/causal.agency/dais.html new file mode 100644 index 00000000..109654d3 --- /dev/null +++ b/www/causal.agency/dais.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<title>Dais</title> +<meta charset="utf-8"> +<style> +body { line-height: 1.5em; max-width: 78ch; margin: auto; padding: 0.5em 1ch; } +</style> + +<h1>First occurrences of the word “dais”</h1> +<ol> +<li>A. K. Larkwood, The Unspoken Name: p. 19 +</ol> diff --git a/www/causal.agency/index.7 b/www/causal.agency/index.7 index 1e019574..bc212a5e 100644 --- a/www/causal.agency/index.7 +++ b/www/causal.agency/index.7 @@ -1,10 +1,10 @@ -.Dd April 18, 2024 +.Dd August 27, 2025 .Dt CAUSAL.AGENCY 7 .Os "Causal Agency" . .Sh NAME .Nm june -.Nd computer enthusiast (she/her) +.Nd enthusiast (she/they) . .Sh SYNOPSIS .Nm mail @@ -15,26 +15,21 @@ in on tilde.chat . .Sh DESCRIPTION -I make mostly IRC software in C. -I like -.Ox -but also the GPL. -I just want to read books -and try to learn to be kinder. -When I can I'd like to talk to strangers -and experience more magic. +primarily a photographer these days. +I used to write IRC software in C. +I still use it every day. . .Pp -.Lk https://git.causal.agency code +.Lk https://photo.causal.agency photos \(em .Lk https://text.causal.agency words \(em -.Lk https://photo.causal.agency photos +.Lk https://git.causal.agency code \(em .Lk /list/ mailist . .Pp -These are some things I've done: +these are some computer things I've done: .Bl -tag -width Ds .It Lk https://git.causal.agency/pounce/about pounce a multi-client-first IRC bouncer diff --git a/www/photo.causal.agency/.gitignore b/www/photo.causal.agency/.gitignore index a5f66a9d..22c11f6e 100644 --- a/www/photo.causal.agency/.gitignore +++ b/www/photo.causal.agency/.gitignore @@ -1,2 +1,7 @@ -static/ +[0-9]*/ +*.jpg *.JPG +app.json +posted.txt +static/ +token.json diff --git a/www/photo.causal.agency/2024-04-10/IMG_0832.txt b/www/photo.causal.agency/2024-04-10/IMG_0832.txt deleted file mode 100644 index 65724024..00000000 --- a/www/photo.causal.agency/2024-04-10/IMG_0832.txt +++ /dev/null @@ -1,6 +0,0 @@ -a red brick wall with some faded black graffiti. -in the lower third, some bricks are missing -from the outer layer in an arc shape. -along the bottom is a ledge of conrete -lightly covered in brick dust and chunks -below the missing areas above. diff --git a/www/photo.causal.agency/2024-04-10/IMG_0850.txt b/www/photo.causal.agency/2024-04-10/IMG_0850.txt deleted file mode 100644 index 4cbb3def..00000000 --- a/www/photo.causal.agency/2024-04-10/IMG_0850.txt +++ /dev/null @@ -1,6 +0,0 @@ -grey steel beams of a building in early construction -on a background of blue sky with some light clouds. -the beams are intersecting at odd points, -implying the final building will not be a simple box. -the sun casts dark shadows into the interiors -of the I-shaped metal. diff --git a/www/photo.causal.agency/2024-04-10/IMG_0852.txt b/www/photo.causal.agency/2024-04-10/IMG_0852.txt deleted file mode 100644 index 707d7cd6..00000000 --- a/www/photo.causal.agency/2024-04-10/IMG_0852.txt +++ /dev/null @@ -1,4 +0,0 @@ -in the foreground, a metal construction fence. -behind that, the bright red arm of a sort of small crane. -the arm is horizontal and crushing a perpendicular piece of fence, -which has deformed smoothly under it. diff --git a/www/photo.causal.agency/2024-04-10/IMG_0858.txt b/www/photo.causal.agency/2024-04-10/IMG_0858.txt deleted file mode 100644 index 42f243e4..00000000 --- a/www/photo.causal.agency/2024-04-10/IMG_0858.txt +++ /dev/null @@ -1,6 +0,0 @@ -an uneven grid of old wooden-framed windows in an alley. -the red paint on the frames is peeling badly, -completely stripped in some spots. -in the reflections of the lower windows -we see the roofs of the opposite buildings -and hints of clouds in the sky. diff --git a/www/photo.causal.agency/2024-04-10/IMG_0859.txt b/www/photo.causal.agency/2024-04-10/IMG_0859.txt deleted file mode 100644 index ca33d7e0..00000000 --- a/www/photo.causal.agency/2024-04-10/IMG_0859.txt +++ /dev/null @@ -1,6 +0,0 @@ -an old backetball hoop mounted in an alley. -the backboard has been graffitied -and vines have invaded. -a few red strands of net are left hanging from the hoop. -the fence behind is painted with a design of yellow, purple, white and blue. -it's the kind of hoop airbud might be hanging around. diff --git a/www/photo.causal.agency/2024-04-10/IMG_0865.txt b/www/photo.causal.agency/2024-04-10/IMG_0865.txt deleted file mode 100644 index 7a955fc2..00000000 --- a/www/photo.causal.agency/2024-04-10/IMG_0865.txt +++ /dev/null @@ -1,2 +0,0 @@ -deep tire tread pressed into mud in the center of an alley. -a small branch of evergreen lies to one side. diff --git a/www/photo.causal.agency/2024-04-10/IMG_0890.txt b/www/photo.causal.agency/2024-04-10/IMG_0890.txt deleted file mode 100644 index 9d2cdc43..00000000 --- a/www/photo.causal.agency/2024-04-10/IMG_0890.txt +++ /dev/null @@ -1,9 +0,0 @@ -a pipe coming out of a light brown brick wall. -the pipe comes out of a metal square in the centre of the wall, -travels up and left for a bit, -before continuing straight up out of frame. -opposite, in the bottom right, -is the top of a red metal grate in front -of a ground-level window. -the brick below where the pipe enters the wall -is stained dark. diff --git a/www/photo.causal.agency/2024-04-14/IMG_1054.txt b/www/photo.causal.agency/2024-04-14/IMG_1054.txt deleted file mode 100644 index f4803ee2..00000000 --- a/www/photo.causal.agency/2024-04-14/IMG_1054.txt +++ /dev/null @@ -1,5 +0,0 @@ -a short wall of natural rock, -all broken up somewhat neatly -along horizontal and vertical lines. -most of the rock is cool grey, -while some parts are warm brown. diff --git a/www/photo.causal.agency/2024-04-14/IMG_1058.txt b/www/photo.causal.agency/2024-04-14/IMG_1058.txt deleted file mode 100644 index 21aeb189..00000000 --- a/www/photo.causal.agency/2024-04-14/IMG_1058.txt +++ /dev/null @@ -1,6 +0,0 @@ -moss on a bit of exposed natural rock -surrounded by mostly brown grass. -there is shorter, darker green and brown moss, -as well as longer lighter green moss. -some small pieces of the rock are broken off -and lay in little piles. diff --git a/www/photo.causal.agency/2024-04-14/IMG_1066.txt b/www/photo.causal.agency/2024-04-14/IMG_1066.txt deleted file mode 100644 index 81747287..00000000 --- a/www/photo.causal.agency/2024-04-14/IMG_1066.txt +++ /dev/null @@ -1,10 +0,0 @@ -two green buds on the end of a thin branch -on a blurry brown backdrop. -the branch enters the frame -from the bottom left corner, -and there are three other pairs of buds -along it, -out of focus. -there is a hint of another bebudded branch -in the background, -but there is otherwise very little green. diff --git a/www/photo.causal.agency/2024-04-19/IMG_1158.txt b/www/photo.causal.agency/2024-04-19/IMG_1158.txt deleted file mode 100644 index e18bd6c7..00000000 --- a/www/photo.causal.agency/2024-04-19/IMG_1158.txt +++ /dev/null @@ -1,6 +0,0 @@ -a glowing amber street lamp -affixed to a telephone pole. -across its round top -there is peeling grey-brown paint. -the lamp is surrounded -by out of focus bare tree branches. diff --git a/www/photo.causal.agency/2024-04-20/IMG_1225.txt b/www/photo.causal.agency/2024-04-20/IMG_1225.txt deleted file mode 100644 index 525a4bf3..00000000 --- a/www/photo.causal.agency/2024-04-20/IMG_1225.txt +++ /dev/null @@ -1,8 +0,0 @@ -close up of a squirrel atop a dark wood fence. -its tail is curled on its back -and it's facing left but looking at the camera. -there are crumbs of dirt -around its mouth and whiskers. -you can see the little claws -of its front paw in the foreground, -while the other paw is curled to its chest. diff --git a/www/photo.causal.agency/2024-04-20/IMG_1234.txt b/www/photo.causal.agency/2024-04-20/IMG_1234.txt deleted file mode 100644 index faee1be9..00000000 --- a/www/photo.causal.agency/2024-04-20/IMG_1234.txt +++ /dev/null @@ -1,8 +0,0 @@ -a pigeon standing upright on some concrete. -it's a usual grey city pigeon, -with a mix of light and dark feathers -on its wings, -purple and green areas up its neck, -and red feet. -in the blurred background -another pigeon is strutting past. diff --git a/www/photo.causal.agency/2024-04-20/IMG_1245.txt b/www/photo.causal.agency/2024-04-20/IMG_1245.txt deleted file mode 100644 index c971da91..00000000 --- a/www/photo.causal.agency/2024-04-20/IMG_1245.txt +++ /dev/null @@ -1,17 +0,0 @@ -a tall shot of the back of a beautifully coloured building. -the brick wall has been painted a sort of pink, -or at least it's faded to that colour. -there is a splotch in the middle -where the paint has worn off the brick, -along with some stray bricks -elsewhere that have been replaced. -the spiral stairs descending -from the back balconies of two floors -have also been painted red, -but have faded to pink -closer to the top. -everything is a little crooked. -the old wooden-framed windows -on the left, -the more recently replaced doors, -and the balconies. diff --git a/www/photo.causal.agency/2024-04-20/IMG_1253.txt b/www/photo.causal.agency/2024-04-20/IMG_1253.txt deleted file mode 100644 index 5158c533..00000000 --- a/www/photo.causal.agency/2024-04-20/IMG_1253.txt +++ /dev/null @@ -1,7 +0,0 @@ -a CCTV camera on the corner -of a black corrugated metal building. -it's mounted on a beige rusting bracket -coming off the wall at a right angle. -it's an old-style boxy camera -with a little hood. -who knows if it's still connected to anything? diff --git a/www/photo.causal.agency/2024-04-20/IMG_1254.txt b/www/photo.causal.agency/2024-04-20/IMG_1254.txt deleted file mode 100644 index 4780f8b5..00000000 --- a/www/photo.causal.agency/2024-04-20/IMG_1254.txt +++ /dev/null @@ -1,8 +0,0 @@ -a white pigeon walking in a paved alley. -its visible eye is a beautiful dark orange, -slightly lighter around its pupil. -its mostly white plumage -is dotted here and there by darker feathers, -and its tail feathers in particular are dark. -there's a hint of small green feathers -around its neck. diff --git a/www/photo.causal.agency/2024-04-30/IMG_1619.txt b/www/photo.causal.agency/2024-04-30/IMG_1619.txt deleted file mode 100644 index 27f87311..00000000 --- a/www/photo.causal.agency/2024-04-30/IMG_1619.txt +++ /dev/null @@ -1,8 +0,0 @@ -the seat of a rusted metal stool out in the way -with a shallow pool of water on it. -in the center is a handle-shaped hole, -which is raised slightly, -causing the water to pool further -around the edges. -there is a single fallen light green tree bud -just near the hole. diff --git a/www/photo.causal.agency/2024-05-03/IMG_1684.txt b/www/photo.causal.agency/2024-05-03/IMG_1684.txt deleted file mode 100644 index 08624d6e..00000000 --- a/www/photo.causal.agency/2024-05-03/IMG_1684.txt +++ /dev/null @@ -1,7 +0,0 @@ -a yellow-and-red flower. -I don't know types of flowers. -the petals are yellow and red, -the colours flecked in each other -like you would see on an apple. -the tops of the petals have -toothy looking bits. diff --git a/www/photo.causal.agency/2024-05-03/IMG_1692.txt b/www/photo.causal.agency/2024-05-03/IMG_1692.txt deleted file mode 100644 index 182319f2..00000000 --- a/www/photo.causal.agency/2024-05-03/IMG_1692.txt +++ /dev/null @@ -1,4 +0,0 @@ -a pair of discarded shoes -on the ground next to a black trash bag. -the shoes are chunky running shoes, -white at the front and baby blue at the back. diff --git a/www/photo.causal.agency/2024-05-03/IMG_1706.txt b/www/photo.causal.agency/2024-05-03/IMG_1706.txt deleted file mode 100644 index d325d518..00000000 --- a/www/photo.causal.agency/2024-05-03/IMG_1706.txt +++ /dev/null @@ -1,4 +0,0 @@ -a square window -in the centre of a concrete wall -covered in vines -that haven't started growing leaves again yet. diff --git a/www/photo.causal.agency/2024-05-03/IMG_1724.txt b/www/photo.causal.agency/2024-05-03/IMG_1724.txt deleted file mode 100644 index 2dd5bb3d..00000000 --- a/www/photo.causal.agency/2024-05-03/IMG_1724.txt +++ /dev/null @@ -1,3 +0,0 @@ -a telephone pole -against a blue sky with some light clouds, -cables coming off it in each diagonal. diff --git a/www/photo.causal.agency/2024-05-03/IMG_1730.txt b/www/photo.causal.agency/2024-05-03/IMG_1730.txt deleted file mode 100644 index ca51034b..00000000 --- a/www/photo.causal.agency/2024-05-03/IMG_1730.txt +++ /dev/null @@ -1,9 +0,0 @@ -a selfie taken in -a particularly reflective window on the street, -giving everything a slightly offset doubled look -from the layers of glass. -I'm wearing a red and purple floral patterned dress -and a green jacket. -I have red hair -and I'm holding a canon DSLR -up to my face. diff --git a/www/photo.causal.agency/2024-05-03/IMG_1748.txt b/www/photo.causal.agency/2024-05-03/IMG_1748.txt deleted file mode 100644 index 29bc3a76..00000000 --- a/www/photo.causal.agency/2024-05-03/IMG_1748.txt +++ /dev/null @@ -1,4 +0,0 @@ -some kind of short tree -spilling over tthe top of an alley wooden fence. -its branches have thorns -and are just started to grow leaves. diff --git a/www/photo.causal.agency/2024-05-06/IMG_1951.txt b/www/photo.causal.agency/2024-05-06/IMG_1951.txt deleted file mode 100644 index 78fe46a7..00000000 --- a/www/photo.causal.agency/2024-05-06/IMG_1951.txt +++ /dev/null @@ -1,12 +0,0 @@ -the top cube of a brutalist house, -with one small window -in each the centre of each face. -the left face of the cube -has an overhang above -which continues down the side. -the concrete has large curved grooves -scattered over its surface. -the sun is hitting the left face, -shadowed by the overhang. -behind the cube is a blue sky -with scattered clouds. diff --git a/www/photo.causal.agency/2024-05-06/IMG_1969.txt b/www/photo.causal.agency/2024-05-06/IMG_1969.txt deleted file mode 100644 index 6276a710..00000000 --- a/www/photo.causal.agency/2024-05-06/IMG_1969.txt +++ /dev/null @@ -1,7 +0,0 @@ -some kind of black bird -in the grass -holding a grub of some kind -in its beak. -it has purple and green -in its feathers similar to a pigeon, -with some white streaks on its wings. diff --git a/www/photo.causal.agency/2024-05-06/IMG_1973.txt b/www/photo.causal.agency/2024-05-06/IMG_1973.txt deleted file mode 100644 index b23e190b..00000000 --- a/www/photo.causal.agency/2024-05-06/IMG_1973.txt +++ /dev/null @@ -1,3 +0,0 @@ -a black bird standing in the grass -with something small in its beak. -its black feathers are spotted with white. diff --git a/www/photo.causal.agency/2024-05-06/IMG_1996.txt b/www/photo.causal.agency/2024-05-06/IMG_1996.txt deleted file mode 100644 index ddbc0a2b..00000000 --- a/www/photo.causal.agency/2024-05-06/IMG_1996.txt +++ /dev/null @@ -1,4 +0,0 @@ -a standard issue city pigeon -viewed from the side, -standing atop a wooden fence -with a blurred brick wall behind it. diff --git a/www/photo.causal.agency/2024-05-06/IMG_1998.txt b/www/photo.causal.agency/2024-05-06/IMG_1998.txt deleted file mode 100644 index 42cf62cc..00000000 --- a/www/photo.causal.agency/2024-05-06/IMG_1998.txt +++ /dev/null @@ -1,3 +0,0 @@ -a standard issue city pigeon -standing on the corner of a balcony -with the railing behind it. diff --git a/www/photo.causal.agency/2024-05-06/IMG_2009.txt b/www/photo.causal.agency/2024-05-06/IMG_2009.txt deleted file mode 100644 index 60518f52..00000000 --- a/www/photo.causal.agency/2024-05-06/IMG_2009.txt +++ /dev/null @@ -1,4 +0,0 @@ -a squirrel on the trunk of a tree, -its body facing down -and its head lifted towards the camera. -ones of its paws is stretched out to the side. diff --git a/www/photo.causal.agency/2024-05-06/IMG_2015.txt b/www/photo.causal.agency/2024-05-06/IMG_2015.txt deleted file mode 100644 index 48494b77..00000000 --- a/www/photo.causal.agency/2024-05-06/IMG_2015.txt +++ /dev/null @@ -1,4 +0,0 @@ -a standard issue city pigeon -on a telephone cable -in front of a brick wall, -looking directly at the camera. diff --git a/www/photo.causal.agency/2024-05-31/IMG_2078.txt b/www/photo.causal.agency/2024-05-31/IMG_2078.txt deleted file mode 100644 index 5a08757c..00000000 --- a/www/photo.causal.agency/2024-05-31/IMG_2078.txt +++ /dev/null @@ -1,5 +0,0 @@ -the side of a school building at sunset. -the sun is hitting the top corner. -on the left is the brick wall, -in the centre there are two floors of windows, -and on the right there are green trees. diff --git a/www/photo.causal.agency/2024-05-31/IMG_2079.txt b/www/photo.causal.agency/2024-05-31/IMG_2079.txt deleted file mode 100644 index d88645c5..00000000 --- a/www/photo.causal.agency/2024-05-31/IMG_2079.txt +++ /dev/null @@ -1,7 +0,0 @@ -the top of a theatre building at sunset. -the top has a row of frosted glass windows -with an unfrosted silhouette -of a man sitting on a ladder. -below the windows there's a white -swirly teardrop pattern, -which continues down into the shadow of the setting sun. diff --git a/www/photo.causal.agency/2024-05-31/IMG_2084.txt b/www/photo.causal.agency/2024-05-31/IMG_2084.txt deleted file mode 100644 index b8ed4fc5..00000000 --- a/www/photo.causal.agency/2024-05-31/IMG_2084.txt +++ /dev/null @@ -1,4 +0,0 @@ -a building of many intersecting shapes -at sunset. -brick, glass and concrete. -only the top of the building is in direct sunlight. diff --git a/www/photo.causal.agency/2024-05-31/IMG_2103.txt b/www/photo.causal.agency/2024-05-31/IMG_2103.txt deleted file mode 100644 index 26b1e1cd..00000000 --- a/www/photo.causal.agency/2024-05-31/IMG_2103.txt +++ /dev/null @@ -1,8 +0,0 @@ -a high-rise apartment building at sunset. -the sun is hitting its left red brick side, -which is broken up by white stripes -between each floor. -the front of the building -has windows and balconies. -some of the balconies near the top -have people out on them. diff --git a/www/photo.causal.agency/2024-05-31/IMG_2114.txt b/www/photo.causal.agency/2024-05-31/IMG_2114.txt deleted file mode 100644 index 7702a374..00000000 --- a/www/photo.causal.agency/2024-05-31/IMG_2114.txt +++ /dev/null @@ -1,6 +0,0 @@ -a high-rise apartment building -during or maybe just after sunset. -in the light it appears beige. -there is a row of balconies -going up the side of the building, -off-centre. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-002A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-002A.txt deleted file mode 100644 index 6a70030e..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-002A.txt +++ /dev/null @@ -1,10 +0,0 @@ -profile of Ayla on the couch in our apartment. -behind her on the left of the frame is a warm brick wall. -there's a band from what might be a light leak -just to the right of her head. -I've DIY replaced the light seals -on this camera so we'll see how it looks -on the next roll. -there's also a narrow dark band -at the right edge of the frame. -I don't know what's up with that. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-009A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-009A.txt deleted file mode 100644 index 7affb93a..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-009A.txt +++ /dev/null @@ -1,9 +0,0 @@ -a view down an alley -with the backs of buildings on the left -and greenery on the right and above. -right at the end of the alley -some people are walking past. -the top of the frame is over-exposed. -the lens is focused at infinity -down the length of the alley, -which gives an interesting effect. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-011A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-011A.txt deleted file mode 100644 index 4628a2c2..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-011A.txt +++ /dev/null @@ -1,6 +0,0 @@ -a little wooden house(?) hanging from a tree. -it's something you'd expect to have a lantern inside, -I think. -3 by 3 paned sides and a little overhanging roof. -behind it is a wooden fence -lightly covered in leaves. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-012A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-012A.txt deleted file mode 100644 index aabe2b40..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-012A.txt +++ /dev/null @@ -1,9 +0,0 @@ -an old friend: -the pipe coming out of a square patch -in a yellow brick wall -that I've photographed before on digital. -the pipe comes out at an angle -towards the top left -then straightens out towards the top of the frame. -in the bottom right -there's the top of a window grate. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-015A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-015A.txt deleted file mode 100644 index 57fb909b..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-015A.txt +++ /dev/null @@ -1,6 +0,0 @@ -some pretty red-pink flowers -on a tree in an alley -growing over a wooden fence. -one branch is in focus in the foreground, -the rest are pleasantly blurred -with a little bit of swirl. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-016A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-016A.txt deleted file mode 100644 index a5bb9fa0..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-016A.txt +++ /dev/null @@ -1,5 +0,0 @@ -a concrete step out a back door into an alley. -the top and near side of the step -are covered in some kind of green. -I don't know if that's a moss -or something else. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-020A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-020A.txt deleted file mode 100644 index 5da2a186..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-020A.txt +++ /dev/null @@ -1,12 +0,0 @@ -the side of a weird old -presumably european -tiny car that's been rotting -in an alley for who knows how long. -the car is painted black -and there's a bunch of graffiti in white -on the door and back side -as well as the window. -on the door next to the handle -there's a stenciled "GREMA". -behind the car is a wooden fence -with some deep green vines. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-024A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-024A.txt deleted file mode 100644 index d82ec10e..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-024A.txt +++ /dev/null @@ -1,5 +0,0 @@ -a view down an alley -with wooden fences along both sides -and lots of greenery spilling over them, -out of their bases, -and hanging from above. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-026A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-026A.txt deleted file mode 100644 index e891695b..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-026A.txt +++ /dev/null @@ -1,2 +0,0 @@ -some puffy pink flowers hanging from a tree -amid wooden fences covered in vines. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-028A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-028A.txt deleted file mode 100644 index dd732a64..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-028A.txt +++ /dev/null @@ -1,5 +0,0 @@ -an old friend: -a boxy security camera -mounted on the corner of -a black corrugated metal wall. -lots of green trees behind it. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-030A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-030A.txt deleted file mode 100644 index f8be350d..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-030A.txt +++ /dev/null @@ -1,7 +0,0 @@ -a familiar sight: -the back of a brick building -painted in red -and fading unevenly to pink. -a spiral staircase descends -past three doors on the right, -and there are three windows on the left. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-031A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-031A.txt deleted file mode 100644 index 3614056a..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-031A.txt +++ /dev/null @@ -1,7 +0,0 @@ -another familiar sight: -an old basketball hoop -mounted against a wooden fence -in an alley, -vines growing over the backboard -and scraps of netting -hanging from the rim. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-032A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-032A.txt deleted file mode 100644 index 24678e0f..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-032A.txt +++ /dev/null @@ -1,7 +0,0 @@ -an askew lantern hanging -next to a telephone pole. -it's hanging by its hat, -but its body is crooked. -there's some rope hanging next to it, -and there's some christmas lights -looped around the telephone pole. diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-036A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-036A.txt deleted file mode 100644 index b9fbf500..00000000 --- a/www/photo.causal.agency/2024-06-08/R1-07534-036A.txt +++ /dev/null @@ -1,12 +0,0 @@ -a selfie in a convex mirror -mounted on a telephone pole. -I appear quite small in the mirror. -I'm standing in front -of a building with -colourful graffiti on it. -behind the mirror -is a yellow diamond road sign, -and on the side of the pole -is a no trash sign -with a fine of up to $1000. -behind is a blue cloudy sky. diff --git a/www/photo.causal.agency/2024-06-08/film b/www/photo.causal.agency/2024-06-08/film deleted file mode 100644 index 0555f564..00000000 --- a/www/photo.causal.agency/2024-06-08/film +++ /dev/null @@ -1 +0,0 @@ -Fujifilm 400 diff --git a/www/photo.causal.agency/2024-06-08/lens b/www/photo.causal.agency/2024-06-08/lens deleted file mode 100644 index 13f1fc49..00000000 --- a/www/photo.causal.agency/2024-06-08/lens +++ /dev/null @@ -1 +0,0 @@ -Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-002A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-002A.txt deleted file mode 100644 index a233035e..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-002A.txt +++ /dev/null @@ -1,14 +0,0 @@ -the bottom of a spiral fire escape -black metal stair. -there's a piece of stone or concrete -at the bottom -with green moss growing on its edges. -the surrounding ground -is covered in dead leaves and such. -there's a peculiar orange-ish -mark that runs down -the middle right side of the frame -and wanders back and forth a little. -don't know what's up with that -and this is the only shot -on the roll with it. diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-003A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-003A.txt deleted file mode 100644 index db048266..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-003A.txt +++ /dev/null @@ -1,6 +0,0 @@ -a short, wide factory-looking window -in a dark brick wall behind a fence. -many of the panes of glass are broken. -honestly I'm posting this photo -because I want to take it again -on black & white film. diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-007A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-007A.txt deleted file mode 100644 index c6e673d9..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-007A.txt +++ /dev/null @@ -1,5 +0,0 @@ -a painted red metal fire escape spiral staircase -climbing up the side of a narrow brick building. -it goes all the way to the roof, -where it becomes over-exposed -and starts to blend into the sky behind it. diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-009A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-009A.txt deleted file mode 100644 index fa47b704..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-009A.txt +++ /dev/null @@ -1,7 +0,0 @@ -a telephone pole covered in paintball paint -(I assume) -in front of a brick wall. -towards the bottom -there are more red spots -and towards the top -there are more blue. diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-010A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-010A.txt deleted file mode 100644 index c71a81ac..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-010A.txt +++ /dev/null @@ -1,8 +0,0 @@ -pink flowers -on a tree with green leaves -against a bright blue sky. -the contrast in colours -between the pink, green and blue -really pops. -this is my favourite shot -on the roll. diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-012A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-012A.txt deleted file mode 100644 index 5d2096fa..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-012A.txt +++ /dev/null @@ -1,3 +0,0 @@ -a green metal staircase -viewed as if about to climb it, -hugging the back of a brick building. diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-013A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-013A.txt deleted file mode 100644 index 56d6d814..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-013A.txt +++ /dev/null @@ -1,7 +0,0 @@ -a pink flower -with a yellow centre -and a couple of its friends -on a pleasantly blurred -background of the green bush -its growing from -and a bit of a brick wall. diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-015A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-015A.txt deleted file mode 100644 index a3cb3fcf..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-015A.txt +++ /dev/null @@ -1,4 +0,0 @@ -a plump light pink flower -with really dense petal arrangement -on a blurred background -of dark green leaves. diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-016A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-016A.txt deleted file mode 100644 index 7c94196c..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-016A.txt +++ /dev/null @@ -1,4 +0,0 @@ -a pile of old bricks in the sunlight. -some of the faces of the bricks are painted grey-blue. -this is another one I'd love to take again -on black & white film. diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-017A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-017A.txt deleted file mode 100644 index a42ac1da..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-017A.txt +++ /dev/null @@ -1,3 +0,0 @@ -Ayla lying on the couch, -head propped up on her arm, -smiling at her phone. diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-019A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-019A.txt deleted file mode 100644 index 110edad8..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-019A.txt +++ /dev/null @@ -1,4 +0,0 @@ -Ayla outside in stark lighting -as the sun was just starting to set, -looking at some yellow long flowers -growing on a large bush. diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-022A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-022A.txt deleted file mode 100644 index 89dc567e..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-022A.txt +++ /dev/null @@ -1,8 +0,0 @@ -Ayla looking back -from halfway down a staircase -leading towards an old stone building. -there's a black band -of underexposed film -on the right edge of the frame. -a problem with the shutter -at slower speeds or something? diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-029A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-029A.txt deleted file mode 100644 index c4383804..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-029A.txt +++ /dev/null @@ -1,4 +0,0 @@ -a wooden fence -with vines growing across it -and two steps fixed to the side of it. -for cats to jump up, I suppose. diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-031A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-031A.txt deleted file mode 100644 index 12b5fc48..00000000 --- a/www/photo.causal.agency/2024-06-12/R1-07671-031A.txt +++ /dev/null @@ -1,4 +0,0 @@ -an overgrown back yard -with a metal staircase -descending into it, -viewed from under a tree. diff --git a/www/photo.causal.agency/2024-06-12/film b/www/photo.causal.agency/2024-06-12/film deleted file mode 100644 index 0555f564..00000000 --- a/www/photo.causal.agency/2024-06-12/film +++ /dev/null @@ -1 +0,0 @@ -Fujifilm 400 diff --git a/www/photo.causal.agency/2024-06-12/lens b/www/photo.causal.agency/2024-06-12/lens deleted file mode 100644 index 13f1fc49..00000000 --- a/www/photo.causal.agency/2024-06-12/lens +++ /dev/null @@ -1 +0,0 @@ -Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/c35/body b/www/photo.causal.agency/c35/body new file mode 100644 index 00000000..3676b877 --- /dev/null +++ b/www/photo.causal.agency/c35/body @@ -0,0 +1 @@ +Konica C35 Automatic diff --git a/www/photo.causal.agency/c35/lens b/www/photo.causal.agency/c35/lens new file mode 100644 index 00000000..3fef9a43 --- /dev/null +++ b/www/photo.causal.agency/c35/lens @@ -0,0 +1 @@ +Konica Hexanon 38mm f/2.8 diff --git a/www/photo.causal.agency/fx-3/body b/www/photo.causal.agency/fx-3/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/fx-3/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/fx-3/lens b/www/photo.causal.agency/fx-3/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/fx-3/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 diff --git a/www/photo.causal.agency/gear.html b/www/photo.causal.agency/gear.html new file mode 100644 index 00000000..04cd3781 --- /dev/null +++ b/www/photo.causal.agency/gear.html @@ -0,0 +1,68 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width, initial-scale=1.0"> +<title>Photography Equipment</title> +<style> +html { color: #bbb; background-color: black; font-family: monospace; } +body { max-width: 76ch; margin: auto; } +</style> + +<h1>Photography Equipment</h1> +<p> +this is a (probably incomplete) list of equipment I use to Do Photography. + +<h2>Cameras</h2> +<ul> +<li>Yashica FX-3 (every day) +<li>Konica C35 Automatic (Hexanon 38mm f/2.8) +<li>Minolta XE-5 +<li>Praktica MTL3 +<li>Zenit-122 +<li>Yashica FX-2 +<li>Yashica-D (Yashikor 80mm f/3.5) +</ul> + +<h2>Lenses</h2> +<ul> +<li>Carl Zeis Planar T* 50mm f/1.7 (FX-3 default) +<li>Yashica DSB 50mm f/1.9 (FX-2 kit lens) +<li>Helios-44M-5 58mm f/2 (Zenit-122 kit lens) +<li>Pentacon 50mm f/1.8 (MTL3 kit lens) +<li>Minolta MD Rokkor-X 50mm f/1.7 (XE-5 kit lens) +<li>Osawa MC 70-210mm f/4-5 (C/Y) +<li>Takumar SMC 35mm f/3.5 +<li>Super-Takumar 135mm f/3.5 +<li>Yashica ML 28-85mm f/3.5-4.5 (wonky focus at 28mm) +<li>Yashica ML 42-75mm f/3.5-4.5 +<li>Yashica MC 35-70mm f/3.5-4.5 (bad aperture) +<li>Yashica ML 50mm f/2 (sticky aperture) +<li>Yashica DSB 28mm f/2.8 +<li>Yashica DSB 135mm f/2.8 +<li>Yashica ML Macro 55mm f/2.8 +<li>Yashica ML 28mm f/2.8 +<li>Yashica ML 75-150mm f/4 +</ul> + +<h2>Flash</h2> +<ul> +<li>Reflx Lab Simple Flash +<li>Starblitz 318M +</ul> + +<h2>Tripod</h2> +<ul> +<li>Sirui Traveler 5C +</ul> + +<h2>Scanning</h2> +<ul> +<li>Filmomat SmartConvert +<li>Fujifilm X-T5 +<li>Yashica ML Macro 55mm f/2.8 (at f/11) +<li>Yashica 13mm extension tube (also have 20mm and 27mm) +<li>Urth C/Y-X adapter +<li>Skier CS-700 copy stand +<li>Valoi 135 & 120 film holders +<li>CineStill CS-Lite +<li>the box the CS-Lite came in +</ul> diff --git a/www/photo.causal.agency/generate.sh b/www/photo.causal.agency/generate.sh index 558b8a54..2fbdcb68 100644 --- a/www/photo.causal.agency/generate.sh +++ b/www/photo.causal.agency/generate.sh @@ -35,20 +35,36 @@ encode() { } page_title() { - date -j -f '%F' $1 '+%B %e, %Y' + case $1 in + (leader) echo 'Film Leader';; + (20*) date -j -f '%F' $1 '+%B %e, %Y';; + (0*) echo Roll $(dc -e "${1}p");; + esac } page_head() { - local date=$1 - local title=$(page_title $date) - local lens film + local page=$1 + local title=$(page_title $page) + local date body lens film chem note - if test -f $date/lens; then - lens=$(encode $date/lens) + if test -f $page/date; then + date=$(sed 's/\([0-9]\)-\([0-9]\)/\1–\2/g' $page/date | encode) + fi + if test -f $page/body; then + body=$(encode $page/body) + fi + if test -f $page/lens; then + lens=$( + sed ' + s,f/,ƒ/,g + s/\([0-9]\)-\([0-9]\)/\1–\2/g + ' $page/lens | + encode + ) else lens=$( identify -format '%[EXIF:LensModel]' \ - $date/$(ls -1 $date | head -n 1) 2>/dev/null | + $page/$(ls -1 $page | head -n 1) 2>/dev/null | sed ' s/\([A-Z]\)\([0-9]\)/\1 \2/ s,f/,ƒ/, @@ -57,8 +73,14 @@ page_head() { encode ) fi - if test -f $date/film; then - film=$(encode $date/film) + if test -f $page/film; then + film=$(encode $page/film) + fi + if test -f $page/chem; then + chem=$(encode $page/chem) + fi + if test -f $page/note; then + note=$(encode $page/note) fi cat <<-EOF @@ -75,7 +97,8 @@ page_head() { details { max-width: 78ch; margin: 0.5em auto; } </style> <h1>${title}</h1> - <p>📷 ${lens}${film:+ 🎞️ }${film:-}</p> + <p>${date:+📆 }${date:-} 📷 ${body:-}${body:+ 🔘 }${lens:-}${film:+ 🎞️ }${film:-}${chem:+ 🧪 }${chem:-}</p> + ${note:+<p>}${note:-}${note:+</p>} EOF } @@ -101,14 +124,21 @@ photo_id() { page_photo() { local photo=$1 preview=$2 description=$3 - if ! test -f $description; then - description=/dev/null - fi photo_info $photo cat <<-EOF <figure id="$(photo_id $photo)"> <a href="${photo##*/}"> + EOF + if test -f $description; then + cat <<-EOF <img src="../${preview}" alt="$(encode $description)"> + EOF + else + cat <<-EOF + <img src="../${preview}"> + EOF + fi + cat <<-EOF </a> <figcaption> EOF @@ -120,11 +150,15 @@ page_photo() { ${PhotographicSensitivity} ISO EOF fi - cat <<-EOF + if test -f $description; then + cat <<-EOF <details> <summary>description</summary> $(encode $description) </details> + EOF + fi + cat <<-EOF </figcaption> </figure> EOF @@ -205,23 +239,37 @@ atom_tail() { } set -- -for date in 20*; do - mkdir -p static/${date} - page=static/${date}/index.html +for entry in 20* 0*; do + mkdir -p static/${entry} + page=static/${entry}/index.html if ! test -f $page; then echo $page >&2 - page_head $date >$page - for photo in ${date}/*.JPG; do + page_head $entry >$page + for photo in ${entry}/*.[Jj][Pp][Gg]; do preview=$(preview $photo) if ! test -f static/${photo}; then ln $photo static/${photo} fi - page_photo $photo $preview ${photo%.JPG}.txt >>$page + page_photo $photo $preview ${photo%.[Jj][Pp][Gg]}.txt >>$page done fi - set -- $date "$@" + set -- $entry "$@" done +mkdir -p static/leader +page=static/leader/index.html +if [ leader -nt $page ]; then + echo $page >&2 + page_head leader >$page + for photo in leader/*.[Jj][Pp][Gg]; do + preview=$(preview $photo) + if ! test -f static/${photo}; then + ln $photo static/${photo} + fi + page_photo $photo $preview xxx >>$page + done +fi + echo static/index.html >&2 index_head >static/index.html echo static/feed.atom >&2 @@ -229,7 +277,7 @@ atom_head >static/feed.atom for date; do index_page $date >>static/index.html atom_entry_head $date >>static/feed.atom - for photo in ${date}/*.JPG; do + for photo in ${date}/*.[Jj][Pp][Gg]; do thumbnail=$(thumbnail $photo) index_photo $date $photo $thumbnail >>static/index.html index_photo $date $photo $thumbnail $Root | encode >>static/feed.atom diff --git a/www/photo.causal.agency/mastodon.sh b/www/photo.causal.agency/mastodon.sh new file mode 100644 index 00000000..1eaa1114 --- /dev/null +++ b/www/photo.causal.agency/mastodon.sh @@ -0,0 +1,54 @@ +#!/bin/sh +set -eu + +Instance=https://tilde.zone +Root=${1:-static} + +if ! test -f app.json; then + echo 'No app.json!' >&2 + exit 1 +fi +chmod 600 app.json + +if ! test -f token.json; then + client_id=$(jq -r .client_id app.json) + client_secret=$(jq -r .client_secret app.json) + echo "Please open ${Instance}/oauth/authorize?client_id=${client_id}&scope=write&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code" + printf 'Enter code: ' + read -r code + curl -Ss -X POST \ + -F 'grant_type=authorization_code' \ + -F "client_id=${client_id}" \ + -F "client_secret=${client_secret}" \ + -F 'redirect_uri=urn:ietf:wg:oauth:2.0:oob' \ + -F "code=${code}" \ + ${Instance}/oauth/token >token.json +fi +chmod 600 token.json + +access_token=$(jq -r .access_token token.json) + +if ! test -f posted.txt; then + touch posted.txt +fi + +photo=$( + find ${Root} -type f -path '*/0*/*.jpg' | + sort | comm -13 posted.txt - | head -n 1 +) +preview=${Root}/preview/${photo##*/} + +media_id=$( + curl -Ss -X POST \ + -H "Authorization: Bearer ${access_token}" \ + -F "file=@${preview}" \ + ${Instance}/api/v2/media | + jq -r .id +) + +curl -Ss -X POST \ + -H "Authorization: Bearer ${access_token}" \ + -F "media_ids[]=${media_id}" \ + ${Instance}/api/v1/statuses >/dev/null + +echo ${photo} >>posted.txt diff --git a/www/photo.causal.agency/trips.html b/www/photo.causal.agency/trips.html new file mode 100644 index 00000000..e81be6ef --- /dev/null +++ b/www/photo.causal.agency/trips.html @@ -0,0 +1,373 @@ +<!DOCTYPE html> +<title>Photo Trips</title> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width, initial-scale=1.0"> + +<style> +body { + font-family: sans-serif; + line-height: 1.5em; + max-width: 52ch; +} +input, button, select { font-size: 100%; } +form { + display: grid; + grid-template-columns: auto 1fr; + gap: 0.5em 1ch; +} +input[type="number"] { width: 5ch; } +#trip-lens { width: 100%; } +#lens-length { width: 7ch; } +#lens-aperture { width: 8ch; } +</style> + +<section id="rolls"> +<h1>Rolls</h1> +<ul> +</ul> + +<form> +<label for="roll-body">Camera:</label> +<select id="roll-body" class="body" required> +</select> +<label for="roll-film">Film:</label> +<input id="roll-film" list="films" required> +<span>Exposures:</span> +<span> +<input id="roll-36" type="radio" name="roll-exposures" value="36" checked> +<label for="roll-36">36</label> +<input id="roll-27" type="radio" name="roll-exposures" value="27"> +<label for="roll-27">27</label> +<input id="roll-24" type="radio" name="roll-exposures" value="24"> +<label for="roll-24">24</label> +<input id="roll-12" type="radio" name="roll-exposures" value="12"> +<label for="roll-12">12</label> +</span> +<button type="button" onclick="loadRoll()">Load</button> +</form> + +<datalist id="films"> +</datalist> +</section> + +<section id="trips"> +<h1>Trips</h1> + +<form> +<label for="trip-date">Date:</label> +<input id="trip-date" type="date" required> +<label for="trip-body">Camera:</label> +<select id="trip-body" class="body" onchange="setTripBody()" required> +</select> +<label for="trip-lens">Lens:</label> +<select id="trip-lens" required> +</select> +<label for="trip-film">Film:</label> +<input id="trip-film" readonly required> +<label for="trip-first">Exposures:</label> +<span> +<input id="trip-first" type="number" required min="0" max="36"> +– +<input id="trip-last" type="number" required min="0" max="36"> +</span> +<label for="trip-note">Note:</label> +<input id="trip-note"> +<button type="button" onclick="addTrip()">Record</button> +</form> + +<ul> +</ul> +</section> + +<section id="bodies"> +<h1>Cameras</h1> +<ul> +</ul> + +<form> + <label for="body-name">Name:</label> + <input id="body-name" required> + <label for="body-mount">Mount:</label> + <input id="body-mount" list="mounts" required> + <button type="button" onclick="addBody()">Add</button> +</form> + +<datalist id="mounts"> + <option>Contax/Yashica</option> + <option>M42</option> +</datalist> +</section> + +<section id="lenses"> +<h1>Lenses</h1> +<ul> +</ul> + +<form> + <label for="lens-name">Name:</label> + <input id="lens-name" required> + <label for="lens-length">Focal length:</label> + <span><input id="lens-length" required pattern="[0-9-]+">mm</span> + <label for="lens-aperture">Aperture:</label> + <span>ƒ/<input id="lens-aperture" required pattern="[0-9.-]+"></span> + <label for="lens-mount">Mount:</label> + <input id="lens-mount" list="mounts" required> + <button type="button" onclick="addLens()">Add</button> +</form> +</section> + +<script> +let bodies = JSON.parse(localStorage.getItem("bodies")) || []; +let lenses = JSON.parse(localStorage.getItem("lenses")) || []; +let rolls = JSON.parse(localStorage.getItem("rolls")) || {}; +let trips = JSON.parse(localStorage.getItem("trips")) || []; +let nextId = +localStorage.getItem("nextId") || 1; + +document.getElementById("trip-date").valueAsDate = new Date(); + +function removeButton(onclick) { + let remove = document.createElement("a"); + remove.appendChild(document.createTextNode("⛔")); + remove.onclick = onclick; + return remove; +} + +function setBodies() { + localStorage.setItem("bodies", JSON.stringify(bodies)); + let ul = document.querySelector("#bodies > ul"); + let selects = document.querySelectorAll("select.body"); + ul.innerHTML = ""; + selects.forEach(select => select.innerHTML = ""); + for (let [index, body] of bodies.entries()) { + let li = document.createElement("li"); + li.appendChild(document.createTextNode(` + ${body.name} (${body.mount}) + `)); + li.appendChild(removeButton(removeBody.bind(null, index))); + ul.appendChild(li); + for (let select of selects) { + let option = document.createElement("option"); + option.appendChild(document.createTextNode(body.name)); + select.appendChild(option); + } + } + if (trips.length) { + selects.forEach(select => select.value = trips[trips.length-1].body); + } +} +setBodies(); + +function endashify(str) { + return str.replaceAll("-", "–"); +} +function lensString(lens) { + return ` + ${lens.name} + ${endashify(lens.focalLength)}mm + ƒ/${endashify(lens.aperture)} + `.replace(/\s+/g, " ").trim(); +} + +function setLenses() { + localStorage.setItem("lenses", JSON.stringify(lenses)); + let ul = document.querySelector("#lenses > ul"); + ul.innerHTML = ""; + for (let [index, lens] of lenses.entries()) { + let li = document.createElement("li"); + li.appendChild(document.createTextNode(` + ${lensString(lens)} (${lens.mount}) + `)); + li.appendChild(removeButton(removeLens.bind(null, index))); + ul.appendChild(li); + } +} +setLenses(); + +function setRolls() { + localStorage.setItem("rolls", JSON.stringify(rolls)); + let ul = document.querySelector("#rolls > ul"); + ul.innerHTML = ""; + for (body in rolls) { + let roll = rolls[body]; + let li = document.createElement("li"); + li.appendChild(document.createTextNode(` + ${body}: ${roll.film} (${roll.used}/${roll.exposures}) + `)); + if (roll.used == roll.exposures) { + li.style.textDecoration = "line-through"; + } + ul.appendChild(li); + } +} +setRolls(); + +function setTrips() { + localStorage.setItem("trips", JSON.stringify(trips)); + let ul = document.querySelector("#trips > ul"); + ul.innerHTML = ""; + let tripsByRoll = Object.groupBy(trips, trip => trip.rollId); + for (let rollId = nextId - 1; rollId > 0; --rollId) { + let rollTrips = tripsByRoll[rollId]; + if (!rollTrips) continue; + let rollLi = document.createElement("li"); + let rollB = document.createElement("b"); + rollB.appendChild(document.createTextNode(rollTrips[0].film)); + rollLi.appendChild(rollB); + rollLi.appendChild(document.createTextNode(` (${rollTrips[0].body})`)); + let body = bodies.find(body => body.name == rollTrips[0].body); + let rollUl = document.createElement("ul"); + for (let [index, trip] of rollTrips.entries()) { + let li = document.createElement("li"); + let b = document.createElement("b"); + b.appendChild(document.createTextNode(trip.date)); + li.appendChild(b); + li.appendChild(document.createTextNode( + `: ${trip.firstExposure}–${trip.lastExposure}` + )); + if ( + (!body || body.mount != body.name) && + (!index || trip.lens != rollTrips[index-1].lens) + ) { + li.appendChild(document.createElement("br")); + li.appendChild(document.createTextNode(trip.lens)); + } + if (trip.note) { + li.appendChild(document.createElement("br")); + li.appendChild(document.createTextNode(`“${trip.note}”`)); + } + rollUl.appendChild(li); + } + rollLi.appendChild(rollUl); + ul.appendChild(rollLi); + } +} +setTrips(); + +function setTripBody() { + let bodyName = document.getElementById("trip-body").value; + let body = bodies.find(body => body.name == bodyName); + let select = document.getElementById("trip-lens"); + select.innerHTML = ""; + for (lens of lenses.filter(lens => lens.mount == body.mount)) { + let option = document.createElement("option"); + option.appendChild(document.createTextNode(lensString(lens))); + select.appendChild(option); + } + let lastTrip = trips.findLast(trip => trip.body == bodyName); + if (lastTrip) { + select.value = lastTrip.lens; + } + let roll = rolls[body.name]; + if (roll) { + document.getElementById("trip-film").value = roll.film; + let next = (roll.used > 0 ? roll.used + 1 : roll.used); + document.getElementById("trip-first").value = next; + document.getElementById("trip-last").value = next; + } else { + document.getElementById("trip-film").value = ""; + document.getElementById("trip-first").value = ""; + document.getElementById("trip-last").value = ""; + } +} +setTripBody(); + +function clearForm(form) { + let inputs = form.querySelectorAll("input"); + for (input of inputs) { + if (input.type == "radio") continue; + input.value = null; + } +} + +function addBody() { + let form = document.querySelector("#bodies > form"); + if (!form.checkValidity()) return; + let name = document.getElementById("body-name").value; + let mount = document.getElementById("body-mount").value; + bodies.push({ name, mount }); + setBodies(); + clearForm(form); +} + +function removeBody(index) { + let body = bodies[index]; + if (!confirm(`Are you sure you want to remove ${body.name}?`)) { + return; + } + bodies.splice(index, 1); + delete rolls[body.name]; + setBodies(); + setRolls(); +} + +function addLens() { + let form = document.querySelector("#lenses > form"); + if (!form.checkValidity()) return; + let name = document.getElementById("lens-name").value; + let focalLength = document.getElementById("lens-length").value; + let aperture = document.getElementById("lens-aperture").value; + let mount = document.getElementById("lens-mount").value; + lenses.push({ name, focalLength, aperture, mount }); + setLenses(); + clearForm(form); +} + +function removeLens(index) { + let lens = lenses[index]; + if (!confirm(`Are you sure you want to remove ${lensString(lens)}?`)) { + return; + } + lenses.splice(index, 1); + setLenses(); + setTripBody(); +} + +function loadRoll() { + let form = document.querySelector("#rolls > form"); + if (!form.checkValidity()) return; + let body = document.getElementById("roll-body").value; + let film = document.getElementById("roll-film").value; + let exposures = +new FormData(form).get("roll-exposures"); + rolls[body] = { id: nextId++, film, exposures, used: 0 }; + localStorage.setItem("nextId", nextId); + setRolls(); + clearForm(form); + setTripBody(); +} + +function addTrip() { + let form = document.querySelector("#trips > form"); + if (!form.checkValidity()) return; + let date = document.getElementById("trip-date").value; + let body = document.getElementById("trip-body").value; + let lens = document.getElementById("trip-lens").value; + let film = document.getElementById("trip-film").value; + let firstExposure = +document.getElementById("trip-first").value; + let lastExposure = +document.getElementById("trip-last").value; + let note = document.getElementById("trip-note").value; + let trip = { + date, body, lens, film, rollId: rolls[body].id, + firstExposure, lastExposure, note + }; + trips.push(trip); + rolls[body].used = lastExposure; + setTrips(); + setRolls(); + document.getElementById("trip-date").valueAsDate = new Date(); + document.getElementById("trip-note").value = ""; + setTripBody(); +} + +function setFilms() { + let datalist = document.getElementById("films"); + datalist.innerHTML = ""; + let films = new Set(trips.reverse().map(trip => trip.film)); + for (let film of films.values().take(20)) { + let option = document.createElement("option"); + option.innerText = film; + datalist.appendChild(option); + } +} +setFilms(); + +</script> diff --git a/www/text.causal.agency/044-film-review.7 b/www/text.causal.agency/044-film-review.7 new file mode 100644 index 00000000..8e8feca8 --- /dev/null +++ b/www/text.causal.agency/044-film-review.7 @@ -0,0 +1,208 @@ +.Dd October 12, 2024 +.Dt FILM-REVIEW 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm film review +.Nd stock, that is +. +.Sh DESCRIPTION +this summer I got really into analog photography. +I've tried out a bunch of different film stocks, +thanks to the local photo lab, +and I've +.Em developed +(pun intended) +some preferences. +here they are. +. +.Sh BLACK & WHITE +.Bl -enum +.It +Ilford FP4+ (ISO 125, United Kingdom) +.Pp +definitely my favourite b&w film. +I love the fine grain and contrast +with good shadow detail. +really just exactly what I want +out of a b&w film I think. +ISO 125 is quite generous for what it is, +but it's still best suited for sunny days. +.Pp +sample: +.Lk https://photo.causal.agency/2024-09-29/ +. +.It +Fomapan Creative (ISO 200, Czech Republic) +.Pp +I've only shot one roll of this so far, +but I really like the balance it strikes +between fine grain and high speed. +it just seems like a good go-to film +for what I like to do with b&w photography, +given the extra flexibility over FP4. +.Pp +sample: +.Lk https://photo.causal.agency/2024-09-14/ +. +.It +Ferrania P30 (ISO 80, Italy) +.Pp +another that I've only shot one roll of, +but I really like the results. +obviously it swings in the other direction +in terms of film sensitivity, +but more importantly +it has a distinctive look. +that's harder in b&w than it is in colour! +.Pp +sample: +.Lk https://photo.causal.agency/2024-10-05/ +. +.It +Ilford Delta 100 (United Kingdom) +.Pp +as far as I'm concerned this is just more expensive FP4. +it certainly looks good +but I'd rather save the couple extra dollars. +.Pp +sample: +.Lk https://photo.causal.agency/2024-09-22/ +. +.It +Ilford HP5+ (ISO 400, United Kingdom) +.Pp +it's like, ok. +more grainy than I'd like, +but that's to be expected of high speed. +my real problem with it +is the lack of contrast. +maybe I should only be shooting it pushed, +but I don't want to pay the extra fee +to have my local photo lab do that. +.Pp +sample: +.Lk https://photo.causal.agency/2024-09-07/ +. +.It +Fomapan Action (ISO 400, Czech Republic) +.Pp +I almost wonder if something went wrong +either in shooting or processing +the one roll of this I shot. +everything came out very low contrast. +.Pp +sample: +I didn't end up uploading any. +.El +. +.Sh COLOUR +.Bl -enum +.It +Shanghai Color (ISO 400, China) +.Pp +I love the desaturated colours +and the grain on this. +I guess I like fine grain in b&w +and coarse grain in colour. +I think this is well suited +to the subjects I like to photograph, +like old brick buildings, +but it also does nature quite nicely. +I think this will be a good one to capture fall with. +.Pp +ok so this is almost certainly repackaged +Wolfen Color NC500 +(made in germany). +but the thing is, +shanghai does a better job packaging it. +they use real metal cassettes +and add film edge markings. +and their box design is way nicer. +and on top of THAT, +my local photo lab +sells it for cheaper than NC500. +.Pp +sample: +.Lk https://photo.causal.agency/2024-09-22/ +. +.It +Harman Phoenix (ISO 200, United Kingdom) +.Pp +phoenix is a fun film! +the lack of yellow filter +and anti-halation layer +can produce some neat effects. +in the right conditions +it also sometimes looks exceedingly normal. +but it also sometimes just... +doesn't work well. +underexposed areas can get really bad. +apparently it can be better to shoot it at ISO 100. +I should give that a try, +or just be more diligent with +how I'm metering. +.Pp +sample: +.Lk https://photo.causal.agency/2024-08-10/ +. +.It +CineStill 800T (USA?) +.Pp +I can't really say much about this yet. +I don't have much experience with indoor photography. +the lack of anti-halation layer +does tend to make lights look sinister as hell, though. +I'll probably shoot +one of the cheaper repackagings +of ISO 800 cinema film +in the future. +.Pp +sample: +.Lk https://photo.causal.agency/2024-10-06/ +. +.It +Film Washi +.Dq X +(ISO 100, France) +.Pp +this is mostly pretty normal film +without a yellow filter. +not much to say about it. +I'd be more interested to try washi's +other repackaged b&w technical films, +but I think I missed them being in stock here. +.Pp +sample: +.Lk https://photo.causal.agency/2024-08-23/ +. +.It +Fujifilm 400 (Japan?) +.Pp +I shot my two first ever rolls on this. +they were surprisingly good! +the scans did the film dirty though. +that was before I found the good photo lab. +. +.It +Kodak Gold (ISO 200, USA) +.Pp +ok so this is a cheap film, right? +but it's too damn good. +fine grain, accurate colour. +it looks like digital to me, +and that's not what I want. +even fuji has a little more character to it than this. +puts me off kodak. +.Pp +sample: +.Lk https://photo.causal.agency/2024-07-01/ +.El +. +.Sh AUTHORS +.An Juniper Aq Mt june@causal.agency +. +.Pp +if you have suggestions +for film stocks I should try, +send me an email. diff --git a/www/text.causal.agency/045-time-2025.7 b/www/text.causal.agency/045-time-2025.7 new file mode 100644 index 00000000..80fa428b --- /dev/null +++ b/www/text.causal.agency/045-time-2025.7 @@ -0,0 +1,131 @@ +.Dd August 18, 2025 +.Dt TIME-2025 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm time +.Nd 2025 +. +.Sh DESCRIPTION +time has passed. +this blog still exists. +I don't feel bad about not writing. +I haven't had anything I want to say in this form. +. +.Pp +I go back and read my own posts here fairly often. +most recently I looked up how I calculated +.Dq unique lines of code +all the way back in 2018. +I read my own post on apologies a lot. +I'm glad I wrote that down. +. +.Pp +other people, too, +still refer to my old posts. +.Dq operating systems +has been repeatedly referenced +by a friend for years. +I still occasionally get emails in reply to +.Dq inability . +I try to wish those people well. +recently I got asked about +.Dq names . +it was interesting trying to explain +an idea I was playing with four years ago. +. +.Pp +some time in the last year +I had started writing +a semi-ficticious history of my life. +I never finished it +and I don't think I'm interested in the idea anymore. +. +.Pp +I used to write posts about +books I'd read +or albums I'd listened to +in the year. +since 2022 I haven't really listened to new music. +I put a lot of songs I really like +in a big playlist called +.Dq more tunes +and I put that on shuffle +whenever I want music. +I don't know why +music doesn't play the same role +in my life anymore. +. +.Pp +I've read books since 2021, +though not at a very high rate. +I still love Becky Chambers +and Alix E. Harrow. +I still need to finish +the Andrea Stewart trilogy I started. +I read an old collection +of short erotic fiction +by trans authors. +that was really good. +I just finished a novel draft by a friend. +. +.Pp +I've shot a lot more film +since my last post. +I was wrong about a lot. +I don't feel like writing more about it. +. +.Pp +in october of 2022 +I started a relationship +that lasted two years. +we moved in together in 2023. +by early 2024 things were going badly. +in february I posted +.Dq comfort music . +I think someone emailed me +because they didn't think I was doing well. +I wasn't. +from summer 2024 +to summer 2025 +was the worst year I've had. +in october someone I barely knew at the time +messaged me to ask if I was ok. +I think I was sitting in a tim hortons +after getting a blood test. +I felt bad all the time +and I didn't know what to do. +. +.Pp +we broke up 2 weeks after 2 years together. +everything got worse. +it wasn't a clean breakup. +I was still clinging onto +the familiar pieces of the relationship +that had used to make me happy. +they didn't anymore. +it was torture. +I lived in agony for months. +I think I lost my mind a little, +trying to handle things I couldn't. +. +.Pp +in march I went no-contact. +I started going to therapy. +I went on a weekend trip to ottawa by myself. +I looked at art in the national gallery. +I started trying to become myself again. +. +.Pp +in june I invited people out +for my 30th birthday. +I was terrified, +convinced up until the last second +that no one was going to come. +but they did. +and since then I've been doing better. +I think I've picked up where I left off, +at some point in the last few years. +. +.Sh AUTHORS +.Nm june Aq Mt june@causal.agency diff --git a/www/text.causal.agency/Makefile b/www/text.causal.agency/Makefile index a8683a20..c9e86ab2 100644 --- a/www/text.causal.agency/Makefile +++ b/www/text.causal.agency/Makefile @@ -43,6 +43,8 @@ TXTS += 040-sound-memory.txt TXTS += 041-albums-2022.txt TXTS += 042-comfort-music.txt TXTS += 043-little-blessings.txt +TXTS += 044-film-review.txt +TXTS += 045-time-2025.txt all: colb ${TXTS} diff --git a/www/they.causal.agency/Makefile b/www/they.causal.agency/Makefile new file mode 100644 index 00000000..81f47ea9 --- /dev/null +++ b/www/they.causal.agency/Makefile @@ -0,0 +1,4 @@ +ROOT = /var/www/man + +install: post-update.sh + install post-update.sh ${ROOT}/post-update diff --git a/www/they.causal.agency/post-update.sh b/www/they.causal.agency/post-update.sh new file mode 100644 index 00000000..db2d5936 --- /dev/null +++ b/www/they.causal.agency/post-update.sh @@ -0,0 +1,41 @@ +#!/bin/sh +set -eu + +do_tree() { + tree=$1 + manpath=$2 + echo "Copying manuals for ${tree}..." + git ls-tree $tree | while read -r mode type hash name; do + if [ $type != blob ]; then + continue + fi + case "$name" in + (README.7) + continue + ;; + (*.[1-9]) + section=${name##*.} + mkdir -p /var/www/man/${manpath}/man${section} + git cat-file $type $hash \ + >/var/www/man/${manpath}/man${section}/${name} + ;; + esac + done + if test -d /var/www/man/${manpath}; then + makewhatis /var/www/man/${manpath} + if ! fgrep -q ${manpath} /var/www/man/manpath.conf; then + echo $manpath >>/var/www/man/manpath.conf + sort -o /var/www/man/manpath.conf /var/www/man/manpath.conf + fi + fi +} + +do_tree HEAD HEAD + +repo=${PWD##*/} +for tag in $(git tag); do + manpath=${repo%.git}-${tag} + if ! test -d /var/www/man/${manpath}; then + do_tree $tag $manpath + fi +done |