diff options
Diffstat (limited to 'www')
555 files changed, 9389 insertions, 1113 deletions
diff --git a/www/causal.agency/.gitignore b/www/causal.agency/.gitignore index 7935a3c1..b00b1c3c 100644 --- a/www/causal.agency/.gitignore +++ b/www/causal.agency/.gitignore @@ -1,3 +1,4 @@ -*.html +index.html +leveler.html scheme.css scheme.png diff --git a/www/causal.agency/Makefile b/www/causal.agency/Makefile index 407a85d8..8c74f8f1 100644 --- a/www/causal.agency/Makefile +++ b/www/causal.agency/Makefile @@ -1,30 +1,23 @@ -WEBROOT = /usr/local/www/causal.agency +WEBROOT = /var/www/causal.agency -FILES = index.html scheme.png +GEN = index.html scheme.css scheme.png +FILES = ${GEN} style.css alpha.html lands.html all: ${FILES} -install: ${FILES} - install -C -m 644 ${FILES} ${WEBROOT} - -INCLUDES = scheme.css torus.html play.html catgirl.html scheme.html - -index.html: index.html.in index.sed ${INCLUDES} - sed -f index.sed index.html.in > index.html - -FLAGS_torus.pty = -n -h 25 -FLAGS_scheme.pty = -n -h 10 +.SUFFIXES: .7 .html -.SUFFIXES: .html .pty +.7.html: + mandoc -T html -O style=style.css $< > $@ -.pty.html: - shotty ${FLAGS_$<} $< > $@ - -scheme.css: scheme.sed - scheme -s | sed -f scheme.sed > scheme.css +scheme.css: + scheme -st > scheme.css scheme.png: scheme -g > scheme.png +install: ${FILES} + install -C -m 644 ${FILES} ${WEBROOT} + clean: - rm -f *.html scheme.css scheme.png + rm -f ${GEN} diff --git a/www/causal.agency/alpha.html b/www/causal.agency/alpha.html new file mode 100644 index 00000000..0d83f530 --- /dev/null +++ b/www/causal.agency/alpha.html @@ -0,0 +1,92 @@ +<!DOCTYPE html> +<meta name="viewport" content="width=device-width, initial-scale=1.0"> +<title>all 26 letters of the alphabet RANKED</title> +<style> +body, button { font-size: 200%; text-align: center; } +button { margin: 1em; padding: 1ch; } +button#shuffle { font-size: 100%; } +</style> + +which letter do you like more? +<p> +<button id="a">A</button> +<button id="b">B</button> +<p> +<details> +<summary>current ranking</summary> +<p> +<span id="ranking">ABCDEFGHIJKLMNOPQRSTUVWXYZ</span> +<p> +<button id="shuffle">reshuffle</button> +</details> + +<script> +let buttonA = document.getElementById("a"); +let buttonB = document.getElementById("b"); +let ranking = document.getElementById("ranking"); + +let alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""); +let rand = (bound) => Math.floor(Math.random() * bound); +function shuffle() { + for (let i = alpha.length - 1; i > 0; --i) { + let j = rand(i + 1); + let x = alpha[i]; + alpha[i] = alpha[j]; + alpha[j] = x; + } +} +if (localStorage.getItem("alpha")) { + alpha = localStorage.getItem("alpha").split(""); +} else { + shuffle(); +} + +let index = 0; +let even = true; +function choose(o) { + if (o == "b") { + let x = alpha[index]; + alpha[index] = alpha[index + 1]; + alpha[index + 1] = x; + } + index += 2; + if (index > alpha.length - 2) { + even = !even; + index = (even ? 0 : 1); + } + update(); +} + +document.onkeydown = function(event) { + if (event.key.toUpperCase() == alpha[index]) { + choose("a"); + } else if (event.key.toUpperCase() == alpha[index + 1]) { + choose("b"); + } +} + +function update() { + localStorage.setItem("alpha", alpha.join("")); + ranking.innerText = alpha.join(""); + let a = buttonA; + let b = buttonB; + if (rand(2)) { + a = buttonB; + b = buttonA; + } + let lc = (c) => c; + if (rand(2)) lc = (c) => c.toLowerCase(); + a.innerText = lc(alpha[index]); + b.innerText = lc(alpha[index + 1]); + a.onclick = () => choose("a"); + b.onclick = () => choose("b"); +} +update(); + +document.getElementById("shuffle").onclick = function() { + if (confirm("Are you SURE you want to throw away all your hard work?")) { + shuffle(); + update(); + } +} +</script> diff --git a/www/causal.agency/catgirl.pty b/www/causal.agency/catgirl.pty deleted file mode 100644 index 651e83db..00000000 --- a/www/causal.agency/catgirl.pty +++ /dev/null @@ -1,97 +0,0 @@ -[?1049h[22;0;0t[1;24r(B[m[4l[?7h[39;49m[?1h=[?1004h[?2004h[39;49m(B[m[H[2J(B[0;7m[90m 0 <network> [21d(B[0m[95mcatgirl[39m(B[m is GPLv3 fwee softwawe ^w^ code is avaiwable fwom[22;9Hhttps://git.causal.agency/catgirl -Traveling... -]2;chat.freenode.net <network>[H -[3M[21d[31m-adams.freenode.net-[37m *** Looking up your hostname... -[31m-adams.freenode.net-[37m *** Checking Ident -[31m-adams.freenode.net-[37m *** Couldn't look up your hostname -[39m(B[m[H -[M[23d[31m-adams.freenode.net-[37m *** No Ident response -[39m(B[m[H -[M[23dYou arrive in freenode -[H -[6M[18d[90m-[39m(B[m Welcome to adams.freenode.net. Thanks to ATW Internet Kft -[90m-[39m(B[m (http://www.atw.hu) for sponsoring this server! -[90m- --[39m(B[m ADAMS, DOUGLAS (1952-2001). Author of The Hitch Hikers Guide -[90m-[39m(B[m to the Galaxy and many other witty and humourous books, -[90m-[39m(B[m portrayed in his uniquely British irony. He is sorely missed -[H -[6M[18d[90m-[39m(B[m by many millions of devoted fans. "So long and thanks for all -[90m-[39m(B[m the books!" -[90m- --[39m(B[m Welcome to freenode - supporting the free and open source -[90m-[39m(B[m software communities since 1998. -[90m- -[39m(B[m[H -[3M[21d[90m-[39m(B[m By connecting to freenode you indicate that you have read and -[90m-[39m(B[m accept our policies and guidelines as set out on https://freenode.net -[90m- -[39m(B[m[H -[3M[21d[90m-[39m(B[m In the event that you observe behaviour that contravenes our policies, -[90m-[39m(B[m please notify a volunteer staff member via private message, or send us an -[90m-[39m(B[m e-mail to complaints@freenode.net -- we will do our best to address the -[H -[4M[20d[90m-[39m(B[m situation within a reasonable period of time, and we may request further -[90m-[39m(B[m information or, as appropriate, involve other parties such as channel - operators -[90m-[39m(B[m Group Contacts representing an on-topic group. -[H -[6M[18d[90m- --[39m(B[m freenode runs an open proxy scanner. -[90m- --[39m(B[m If you are looking for assistance, you may be able to find a list of -[90m-[39m(B[m volunteer staff on '/stats p' (shows only on-call staff) or by joining -[90m-[39m(B[m #freenode and using the '/who freenode/staff/*' command. You may message -[H -[5M[19d[90m-[39m(B[m any of us at any time. Please note that freenode predominantly provides -[90m-[39m(B[m assistance via private message, and while we have a network channel the -[90m-[39m(B[m primary venue for support requests is via private message to a member -[90m-[39m(B[m of the volunteer staff team. -[90m- -[39m(B[m[H -[5M[19d[90m-[39m(B[m From time to time, volunteer staff may send server-wide notices relating to -[90m-[39m(B[m the project, or the communities that we host. The majority of such notices -[90m-[39m(B[m will be sent as wallops, and you can '/mode <yournick> +w' to ensure that you -[90m-[39m(B[m do not miss them. Important messages relating to the freenode project, - including -[H -[7M[17d[90m-[39m(B[m notices of upcoming maintenance and other scheduled downtime will be issued - as -[90m-[39m(B[m global notices. -[90m- --[39m(B[m Representing an on-topic project? Don't forget to register, more information -[90m-[39m(B[m can be found on the https://freenode.net website under "Group Registration". -[90m- -[39m(B[m[H -[5M[19d[90m-[39m(B[m Thank you also to our server sponsors for the sustained support in keeping - the -[90m-[39m(B[m network going for close to two decades. -[90m- --[39m(B[m Thank you for using freenode! -[1;14H[95m 1 freenode-connect ([97m2[95m) [24d[39m(B[m]2;freenode <network> (+2!)[H[95m 1 freenode-connect ([97m2[95m) (B[0;7m[31m 2 #ascii.town -[39m(B[m[K -[K -[K -[K -[K -[K -[K -[K -[K -[K -[K -[K -[K -[K -[K -[K -[K -[96mcatgirl[39m(B[m arrives in [31m#ascii.town[39m(B[m[K -The sign in [31m#ascii.town[39m(B[m reads: https://ascii.town public SSH services and IRC -things <3 AGPL[K -In [31m#ascii.town[39m(B[m are catgirl, gjabell, danopia, larbob, ep, nonlinear, epilys, -benharri, june, yourfate, josuah -[96m<catgirl> [39m(B[m]2;freenode #ascii.town (+2!) /[Kclose 1[H(B[0;7m[31m 1[39m(B[m[24P [24d[96m<catgirl> [39m(B[m]2;freenode #ascii.townhello, world![H -[M[23;10H -[96m<catgirl> [39m(B[m[2;23r[23;1H[1S[1;24r[1;16H(B[0;7m[31m(1) [23d(B[0m[3m[34m* june[39m(B[0m[3m waves -(B[m]2;freenode #ascii.town (1)[1;16H[K[24;11H]2;freenode #ascii.town \ No newline at end of file diff --git a/www/causal.agency/index.7 b/www/causal.agency/index.7 new file mode 100644 index 00000000..75c37d87 --- /dev/null +++ b/www/causal.agency/index.7 @@ -0,0 +1,75 @@ +.Dd June 16, 2024 +.Dt CAUSAL.AGENCY 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm june +.Nd enthusiast (she/they) +. +.Sh SYNOPSIS +.Nm mail +.Mt june@causal.agency +.Nm +in +.Li #ascii.town +on tilde.chat +. +.Sh DESCRIPTION +I like photography, +Magic: The Gathering +and making mostly IRC software in C. +I like +.Ox +but also the GPL. +I'm learning how to be a person. +. +.Pp +.Lk https://git.causal.agency code +\(em +.Lk https://text.causal.agency words +\(em +.Lk https://photo.causal.agency photos +\(em +.Lk /list/ mailist +. +.Pp +These are some things I've done: +.Bl -tag -width Ds +.It Lk https://git.causal.agency/pounce/about pounce +a multi-client-first IRC bouncer +.It Lk https://git.causal.agency/catgirl/about catgirl +a cosy IRC client +.It Lk https://git.causal.agency/litterbox/about litterbox +a full-text search IRC logger +.It Lk https://git.causal.agency/scooper/about scooper +a web interface for litterbox +.It Lk https://git.causal.agency/kitd/about kitd +a process supervisor +.It Lk https://git.causal.agency/imbox/about "imbox & git-fetch-email" +a tool to pull patches out of IMAP +.It Lk https://git.causal.agency/bubger/about bubger +a mailing list archive generator for IMAP +.It Lk https://git.causal.agency/notemap/about notemap +a tool to mirror text files to IMAP notes +.It Lk https://ascii.town/explore.html torus@ascii.town +a collaborative ASCII art project +.It Lk ssh://play@ascii.town play@ascii.town +some games to play over +.Xr ssh 1 +.It Lk https://git.causal.agency/cards/about cards +a +.Pa CARDS.DLL +loader for SDL +.It Lk scheme.png scheme +an earthy terminal colour scheme +.El +. +.Sh SEE ALSO +.Bl -bullet +.It +.Lk /bin/ bin +.It +.Lk lands.html "Magic lands quiz" +.It +.Lk alpha.html "alphabet ranking game" +.El diff --git a/www/causal.agency/index.html.in b/www/causal.agency/index.html.in deleted file mode 100644 index a8f95926..00000000 --- a/www/causal.agency/index.html.in +++ /dev/null @@ -1,101 +0,0 @@ -<!DOCTYPE html> -<title>Causal Agency</title> -<meta name="viewport" content="width=device-width, initial-scale=1.0"> -<style> -body { - font-family: monospace; - max-width: 80ch; - margin: 2em auto; - padding: 0 1ch; -} -h1 { - font-size: inherit; - margin: 1em 0 0; -} -p { margin: 0 0 1em 4ch; } -a { text-decoration: none; } -/* scheme.css */ -</style> - -<p> -Hi. -I'm an aspiring person. -I'm still trying to figure out how to be. -<p> -You can find me in -<a href="ircs://chat.freenode.net:6697/#ascii.town">#ascii.town</a> -on freenode -or send mail to june@. -<p> -These are things I've made. - -<h1><a href="https://git.causal.agency/pounce/about">pounce</a></h1> -<p> -multi-client IRC bouncer - -<h1><a href="https://git.causal.agency/litterbox/about">litterbox</a></h1> -<p> -full-text search IRC logger - -<h1>catgirl</h1> -<p> -artisanal IRC client -<p> -<a href="ssh://chat@ascii.town">ssh chat@ascii.town</a> --- -<a href="https://git.causal.agency/catgirl/about">git</a> -<p> -<!-- catgirl.html --> - -<h1><a href="https://git.causal.agency/imbox/about">imbox & git-fetch-email</a></h1> -<p> -IMAP to mbox - -<h1><a href="https://git.causal.agency/notemap/about">notemap</a></h1> -<p> -IMAP notes mirror - -<h1>torus</h1> -<p> -collaborative ASCII art project -<p> -<a href="ssh://torus@ascii.town">ssh torus@ascii.town</a> --- -<a href="https://ascii.town/explore.html">explore</a> --- -<a href="https://git.causal.agency/torus">git</a> -<p> -<!-- torus.html --> - -<h1>play</h1> -<p> -2048 clone with scoreboard -<p> -<a href="ssh://play@ascii.town">ssh play@ascii.town</a> --- -<a href="https://git.causal.agency/play">git</a> -<p> -<!-- play.html --> - -<h1><a href="https://git.causal.agency/cards/about">cards</a></h1> -<p> -CARDS.DLL loader for SDL - -<h1>scheme</h1> -<p> -earthy terminal colours -<p> -<a href="scheme.png">palette</a> --- -<a href="bin/scheme.html">src</a> -<!-- scheme.html --> - -<h1><a href="bin/">bin</a></h1> -<p> -little utilities - -<h1>text</h1> -<p> -words about code -<p> -<a href="https://text.causal.agency">text.causal.agency</a> diff --git a/www/causal.agency/index.sed b/www/causal.agency/index.sed deleted file mode 100644 index 0123ec1e..00000000 --- a/www/causal.agency/index.sed +++ /dev/null @@ -1,5 +0,0 @@ -/[*] scheme[.]css/r scheme.css -/!-- torus[.]html/r torus.html -/!-- play[.]html/r play.html -/!-- catgirl[.]html/r catgirl.html -/!-- scheme[.]html/r scheme.html diff --git a/www/causal.agency/lands.html b/www/causal.agency/lands.html new file mode 100644 index 00000000..7aaadd80 --- /dev/null +++ b/www/causal.agency/lands.html @@ -0,0 +1,176 @@ +<!DOCTYPE html> +<title>Lands Quiz</title> +<meta name="viewport" content="width=device-width, initial-scale=1.0"> +<style> +html { font: 14pt sans-serif; line-height: 1.5em; } +body { padding: 1em 1ch; max-width: 78ch; margin: auto; } +h1 { text-align: center; } +h2 { margin-top: 0; } +button { font-size: 100%; padding: 0.5em 1ch; } +img { max-width: 100%; } +div.cols { display: grid; grid-template-columns: 1fr 1fr; gap: 2ch; } +</style> + +<h1 id="loading">Loading...</h1> +<h1 id="error" hidden>Failed to load cards :(</h1> + +<div id="game" hidden> +<h1>Magic Lands Quiz</h1> +<p>Try to guess the colours of mana each land produces!</p> +<div class="cols"> + <div> + <img id="back" src="https://backs.scryfall.io/normal/0/a/0aeebaf5-8c7d-4636-9e82-8c27447861f7.jpg"> + <a id="link" target="_blank"> + <img id="image1" hidden> + <img id="image2" hidden> + </a> + </div> + <div> + <h2 id="name"></h2> + <input type="checkbox" id="w"> <label for="w">White</label><br> + <input type="checkbox" id="u"> <label for="u">Blue</label><br> + <input type="checkbox" id="b"> <label for="b">Black</label><br> + <input type="checkbox" id="r"> <label for="r">Red</label><br> + <input type="checkbox" id="g"> <label for="g">Green</label><br> + <p><button id="submit">Submit</button></p> + <h3>Score: <span id="score">0</span>/<span id="total">0</span></h3> + </div> +</div> +</div> + +<script> +function shuffle(arr) { + let rand = (bound) => Math.floor(Math.random() * bound); + for (let i = arr.length-1; i > 0; --i) { + let j = rand(i+1); + let x = arr[i]; + arr[i] = arr[j]; + arr[j] = x; + } +} + +const CardBack = +"https://backs.scryfall.io/normal/0/a/0aeebaf5-8c7d-4636-9e82-8c27447861f7.jpg"; + +function hideCard() { + document.getElementById("back").hidden = false; + document.getElementById("image1").hidden = true; + document.getElementById("image2").hidden = true; +} + +function showCard(card) { + document.getElementById("back").hidden = true; + document.getElementById("link").href = card.scryfall_uri; + let image1 = document.getElementById("image1"); + let image2 = document.getElementById("image2"); + if (card.card_faces) { + image1.src = card.card_faces[0].image_uris.normal; + image2.src = card.card_faces[1].image_uris.normal; + image1.hidden = false; + image2.hidden = false; + } else { + image1.src = card.image_uris.normal; + image1.hidden = false; + } +} + +function resetChecks() { + for (let c of "wubrg") { + let input = document.getElementById(c); + input.checked = false; + input.disabled = false; + input.labels[0].style.fontWeight = "normal"; + } +} + +function checkChecks(card) { + let score = 0; + let total = 0; + let checked = 0; + for (let c of "wubrg") { + let input = document.getElementById(c); + let produced = card.produced_mana.includes(c.toUpperCase()); + if (produced) { + total++; + input.labels[0].style.fontWeight = "bold"; + if (input.checked) score++; + } + if (input.checked) checked++; + input.disabled = true; + } + if (checked > total) score -= (checked - total); + if (score < 0) score = 0; + return { score: score, total: total }; +} + +document.onkeydown = function(event) { + for (let c of "wubrg") { + if (event.key == c) { + let input = document.getElementById(c); + if (!input.disabled) input.checked ^= true; + } + } + if (event.key == "Enter") { + document.getElementById("submit").click(); + } +} + +let score = 0; +let total = 0; +let cards = []; +let card = null; + +function nextCard() { + hideCard(); + resetChecks(); + card = cards.shift(); + document.getElementById("name").innerText = card.name; +} + +document.getElementById("submit").onclick = function() { + if (card) { + let { score: cardScore, total: cardTotal } = checkChecks(card); + total += cardTotal; + score += cardScore; + document.getElementById("score").innerText = score; + document.getElementById("total").innerText = total; + showCard(card); + card = null; + if (cards.length) { + this.innerText = "Next card"; + } else { + this.disabled = true; + this.innerText = "No more cards"; + } + } else { + nextCard(); + this.innerText = "Submit"; + } +} + +function loadCards(resp) { + let loading = document.getElementById("loading"); + let error = document.getElementById("error"); + let game = document.getElementById("game"); + if (resp.status != 200) { + loading.hidden = true; + error.hidden = false; + } + resp.json().then((json) => { + cards.push(...json.data); + if (json.has_more) { + setTimeout(() => fetch(json.next_page).then(loadCards), 50); + } else { + loading.hidden = true; + game.hidden = false; + shuffle(cards); + nextCard(); + } + }); +} + +const Search = +"https://api.scryfall.com/cards/search?q=t:land+id>=2+produces>=2+produces!=wubrg"; +fetch(Search).then(loadCards); + +</script> diff --git a/www/causal.agency/play.pty b/www/causal.agency/play.pty deleted file mode 100644 index 3da44fb7..00000000 --- a/www/causal.agency/play.pty +++ /dev/null @@ -1,23 +0,0 @@ -[1;24r[m[4l[?12l[?25h[?1h=[39;49m[?25l[?1h=[39;49m[m[H[2J[1;30H0 - - [38;5;7m[48;5;0m [7C[39;49m[mUse the arrow keys to - [38;5;7m[48;5;0m . . . . [7C[39;49m[mslide and merge tiles. - [38;5;7m[48;5;0m [7C[39;49m[mPress q to quit. - [38;5;7m[48;5;0m -[28D . . . . -[28D -[28D [38;5;15m[48;5;1m[1m -[28D[m[38;5;7m[48;5;0m . . [38;5;15m[48;5;1m[1m 2 2 -[28D[m[38;5;7m[48;5;0m [38;5;15m[48;5;1m[1m -[28D[m[38;5;7m[48;5;0m -[28D . . . . -[28D [39;49m[m[1;30H4[6;10H[38;5;15m[48;5;1m[1m [7;10H 2 [8;10H -[14D[38;5;15m[48;5;2m [7C[m[38;5;7m[48;5;0m -[28D[38;5;15m[48;5;2m[1m 4 [7C[m[38;5;7m[48;5;0m . . -[28D[38;5;15m[48;5;2m[1m [7C[m[38;5;7m[48;5;0m [39;49m[m[3;24H[38;5;15m[48;5;1m[1m [4;24H 2 [5;24H [6;10H[m[38;5;7m[48;5;0m [7;10H . [8;10H -[14D -[7D . -[7D -[7D[38;5;15m[48;5;2m[1m [38;5;15m[48;5;1m -[14D[38;5;15m[48;5;2m 4 [38;5;15m[48;5;1m 2 -[14D[38;5;15m[48;5;2m [38;5;15m[48;5;1m [39;49m[m \ No newline at end of file diff --git a/www/causal.agency/scheme.pty b/www/causal.agency/scheme.pty deleted file mode 100644 index 74be2196..00000000 --- a/www/causal.agency/scheme.pty +++ /dev/null @@ -1,10 +0,0 @@ -[40m [41m [42m [43m [44m [45m [46m [47m [m -[40m [41m [42m [43m [44m [45m [46m [47m [m -[40m [41m [42m [43m [44m [45m [46m [47m [m -[40m [41m [42m [43m [44m [45m [46m [47m [m -[40m [41m [42m [43m [44m [45m [46m [47m [m -[100m [101m [102m [103m [104m [105m [106m [107m [m -[100m [101m [102m [103m [104m [105m [106m [107m [m -[100m [101m [102m [103m [104m [105m [106m [107m [m -[100m [101m [102m [103m [104m [105m [106m [107m [m -[100m [101m [102m [103m [104m [105m [106m [107m [m[H diff --git a/www/causal.agency/scheme.sed b/www/causal.agency/scheme.sed deleted file mode 100644 index bf18085b..00000000 --- a/www/causal.agency/scheme.sed +++ /dev/null @@ -1,6 +0,0 @@ -s/[.]bg0/html, &/ -s/[.]fg15/html, &/ -s/[.]fg12/a, &/ -s/[.]fg13/a:visited, &/ - -s/[.]fg8 { color: \([^;]*\); }/pre { border: 1px dashed \1; } &/ diff --git a/www/causal.agency/style.css b/www/causal.agency/style.css new file mode 100644 index 00000000..265c62c2 --- /dev/null +++ b/www/causal.agency/style.css @@ -0,0 +1,28 @@ +@import url("scheme.css"); + +table.head, table.foot { width: 100%; } +td.head-rtitle, td.foot-os { text-align: right; } +td.head-vol { text-align: center; } +div.Pp { margin: 1ex 0ex; } +div.Nd, div.Bf, div.Op { display: inline; } +span.Pa, span.Ad { font-style: italic; } +span.Ms { font-weight: bold; } +dl.Bl-diag > dt { font-weight: bold; } +code.Nm, code.Fl, code.Cm, code.Ic, code.In, code.Fd, code.Fn, +code.Cd { font-weight: bold; font-family: inherit; } + +div.head, div.foot { display: flex; justify-content: space-between; } +.head-ltitle, .foot-date { flex: 1; } +.head-vol { flex: 0 1 auto; text-align: center; } +.head-rtitle, .foot-os { flex: 1; text-align: right; } + +html { font-family: monospace; line-height: 1.25em; } +body { max-width: 80ch; margin: 1em auto; padding: 0 1ch; } +table { border-collapse: collapse; } +table.Nm code.Nm { padding-right: 1ch; } +table.foot { margin-top: 1em; } + +html { background-color: var(--ansi16); color: var(--ansi17); } +a { color: var(--ansi4); } +a:visited { color: var(--ansi5); } +a.permalink { color: var(--ansi3); text-decoration: none; } diff --git a/www/causal.agency/torus.pty b/www/causal.agency/torus.pty deleted file mode 100644 index 1e147970..00000000 --- a/www/causal.agency/torus.pty +++ /dev/null @@ -1,774 +0,0 @@ -[1;25r[m[4l[39;49m[?1h=[?25l[39;49m[38;5;0m[48;5;0m[m[39;49m[38;5;0m[48;5;0m[H[2J[38;5;3m[48;5;0m┌──────────────────────────────────────────────────────────────────────────────┐[2;1H│[38;5;7m[48;5;0m Welcome to [38;5;12m[48;5;0ma[38;5;14m[48;5;0ms[38;5;10m[48;5;0mc[38;5;11m[48;5;0mi[38;5;9m[48;5;0mi[38;5;13m[48;5;0m.[38;5;12m[48;5;0mt[38;5;14m[48;5;0mo[38;5;10m[48;5;0mw[38;5;11m[48;5;0mn[38;5;7m[48;5;0m! [38;5;15m[48;5;0mq[38;5;7m[48;5;0m quit [38;5;15m[48;5;0mQ[38;5;7m[48;5;0m teleport [38;5;15m[48;5;0mm[38;5;7m[48;5;0m mini-map [38;5;15m[48;5;0m?[38;5;7m[48;5;0m help [38;5;3m[48;5;0m│[3;1H│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[4;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mk[38;5;7m[48;5;0m [38;5;8m[48;5;0m0[38;5;7m[48;5;0m [38;5;1m[48;5;0m1[38;5;7m[48;5;0m [38;5;2m[48;5;0m2[38;5;7m[48;5;0m [38;5;3m[48;5;0m3[38;5;7m[48;5;0m [38;5;4m[48;5;0m4[38;5;7m[48;5;0m [38;5;5m[48;5;0m5[38;5;7m[48;5;0m [38;5;6m[48;5;0m6[38;5;7m[48;5;0m 7 [38;5;15m[48;5;0mesc[38;5;7m[48;5;0m navigation mode [38;5;15m[48;5;0ms[38;5;7m[48;5;0m copy [38;5;3m[48;5;0m│[5;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0my[38;5;7m[48;5;0m ↑ [38;5;15m[48;5;0mu[38;5;7m[48;5;0m [38;5;15m[48;5;0mi[38;5;7m[48;5;0m insert mode [38;5;15m[48;5;0mp[38;5;7m[48;5;0m paste [38;5;3m[48;5;0m│[6;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mh[38;5;7m[48;5;0m ←∙→ [38;5;15m[48;5;0ml[38;5;7m[48;5;0m [38;5;8m[48;5;0m)[38;5;7m[48;5;0m [38;5;0m[48;5;1m![38;5;7m[48;5;0m [38;5;0m[48;5;2m@[38;5;7m[48;5;0m [38;5;0m[48;5;3m#[38;5;7m[48;5;0m [38;5;0m[48;5;4m$[38;5;7m[48;5;0m [38;5;0m[48;5;5m%[38;5;7m[48;5;0m [38;5;0m[48;5;6m^[38;5;7m[48;5;0m [38;5;0m[48;5;7m&[38;5;7m[48;5;0m [38;5;15m[48;5;0ma[38;5;7m[48;5;0m insert after [38;5;15m[48;5;0m~[38;5;7m[48;5;0m paint color [38;5;3m[48;5;0m│[7;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mb[38;5;7m[48;5;0m ↓ [38;5;15m[48;5;0mn[38;5;7m[48;5;0m [38;5;15m[48;5;0mI[38;5;7m[48;5;0m insert direction [38;5;15m[48;5;0m*[38;5;7m[48;5;0m paint bright [38;5;3m[48;5;0m│[8;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mj[38;5;7m[48;5;0m [38;5;15m[48;5;0m8[38;5;7m[48;5;0m bright [38;5;15m[48;5;0m9[38;5;7m[48;5;0m invert [38;5;15m[48;5;0mR[38;5;7m[48;5;0m draw mode [38;5;15m[48;5;0m([38;5;7m[48;5;0m paint invert [38;5;3m[48;5;0m│[9;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0m`[38;5;7m[48;5;0m pipette [38;5;15m[48;5;0m.[38;5;7m[48;5;0m line mode [38;5;15m[48;5;0mC-a[38;5;7m[48;5;0m increment [38;5;3m[48;5;0m│[10;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0m\[38;5;7m[48;5;0m fast [38;5;15m[48;5;0mr[38;5;7m[48;5;0m replace [38;5;15m[48;5;0mC-x[38;5;7m[48;5;0m decrement [38;5;3m[48;5;0m│[11;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mx[38;5;7m[48;5;0m erase [38;5;15m[48;5;0mHJKLYUBN[38;5;7m[48;5;0m swap cell [38;5;3m[48;5;0m│[12;1H│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[13;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mF1[38;5;7m[48;5;0m @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno [38;5;3m[48;5;0m│[14;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mF2[38;5;7m[48;5;0m ☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ [38;5;3m[48;5;0m│[15;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mF3[38;5;7m[48;5;0m αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ [38;5;3m[48;5;0m│[16;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mF4[38;5;7m[48;5;0m ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ [38;5;3m[48;5;0m│[17;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mF5[38;5;7m[48;5;0m ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«» [38;5;3m[48;5;0m│[18;1H│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[19;1H│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[20;1H│[38;5;7m[48;5;0m This is [38;5;3m[48;5;0mAGPLv3[38;5;7m[48;5;0m Free Software! [38;5;3m[48;5;0m│[21;1H│[38;5;7m[48;5;0m Code is available from [38;5;6m[48;5;0m<https://code.causal.agency/june/torus>[38;5;7m[48;5;0m. [38;5;3m[48;5;0m│[22;1H│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[23;1H│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[24;1H│[38;5;7m[48;5;0m Press [38;5;15m[48;5;0m? [38;5;7m[48;5;0mto open this help again. Press any key to continue... [38;5;3m[48;5;0m│[25;1H└──────────────────────────────────────────────────────────────────────────────┘[4h─[4l[m[39;49m[38;5;0m[48;5;0m[?12l[?25h[H[38;5;7m[48;5;0mPress [38;5;15m[48;5;0m?[38;5;7m[48;5;0m for help![38;5;3m[48;5;0m│[38;5;7m[48;5;0m this space now frees [38;5;9m[48;5;0m [38;5;5m[48;5;0m\[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m\[38;5;7m[48;5;0m [38;5;6m[48;5;0mCP437[38;5;14m[48;5;0m [38;5;11m[48;5;0m☻ [38;5;9m[48;5;7m♥♦[38;5;0m[48;5;7m♣♠[38;5;14m[48;5;0m [38;5;4m[48;5;0m░▒▓█[38;5;3m[48;5;0m [38;5;6m[48;5;0m [38;5;7m[48;5;0m(000,000)[2;1H[38;5;3m[48;5;0m─────────────────┘ [38;5;7m[48;5;0m [38;5;11m[48;5;0mIt's Free Real Estate[38;5;7m[48;5;0m [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;5m[48;5;0m\[38;5;3m[48;5;0m [38;5;5m[48;5;0my[38;5;3m[48;5;0m [38;5;5m[48;5;0m\ [38;5;3m[48;5;0m ╒══════════════════════╕[K -[38;5;9m[48;5;0mFor a good [3;25H[38;5;5m[48;5;0m(0_0)[3;41H[m[39;49m[38;5;0m[48;5;0m [7C[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;13m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;15m[48;5;0mascii.town guestbook[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;1m[48;5;0m [38;5;7m[48;5;0m[K -[38;5;9m[48;5;0mtime, go in[38;5;7m[48;5;0m a [m[39;49m[38;5;0m[48;5;0m [38;5;3m[48;5;0m [38;5;5m[48;5;0m|[38;5;3m[48;5;0m [38;5;5m[48;5;0my[38;5;3m[48;5;0m [38;5;5m[48;5;0m|[38;5;3m[48;5;0m ╞[38;5;7m[48;5;0m══════════════════════[38;5;3m[48;5;0m╡[38;5;7m[48;5;0m[K -[38;5;9m[48;5;0many direction.[5;31H[38;5;10m[48;5;0m [38;5;7m[48;5;0m RR w [38;5;5m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;6m[48;5;0m-[38;5;7m[48;5;0m [38;5;6m[48;5;0mjune [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m[2P -[38;5;12m[48;5;0mPls don't[38;5;7m[48;5;0m publicg@conferencRRRRuRRRRR.forsale [38;5;5m[48;5;0m |[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;13m[48;5;0m-[38;5;5m[48;5;0m [38;5;13m[48;5;0mscott [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m[2P -[38;5;12m[48;5;0mvandal. There[7;28H[38;5;7m[48;5;0mRRRRRRRRRR [38;5;5m[48;5;0m | | [38;5;3m[48;5;0m│ [38;5;4m[48;5;0m- cjm [38;5;3m[48;5;0m [38;5;7m[48;5;0m[2P -[38;5;12m[48;5;0mare huuuuuge[38;5;15m[48;5;0m [38;5;7m[48;5;0m [38;5;4m[48;5;0mhelo woldr[38;5;7m[48;5;0m RRRRRRRR r a [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0ml[38;5;2m[48;5;0m?[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;10m[48;5;0m-[38;5;7m[48;5;0m [38;5;10m[48;5;0merik[38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m[2P -[38;5;12m[48;5;0mtracts of [6C[38;5;7m[48;5;0m aaaac RRRRRR What's up?j[38;5;2m[48;5;0m/[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;7m[48;5;5m-[38;5;10m[48;5;0m [38;5;3m[48;5;0mswgillespie[38;5;7m[48;5;0m[2P -[38;5;12m[48;5;0munused land.[10;31H[38;5;7m[48;5;0mRRRR [38;5;9m[48;5;0m [38;5;7m[48;5;0m poop [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0ma[38;5;2m[48;5;0m▼[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[38;5;3m[48;5;0m [38;5;7m[48;5;0mdikaiosune[2P -[38;5;10m[48;5;0mif u do vandal[38;5;3m[48;5;0m [38;5;7m[48;5;0mRR[38;5;3m[48;5;0m [38;5;7m[48;5;0mtest[38;5;3m[48;5;0m [38;5;5m[48;5;0m |[38;5;7m[48;5;0m [38;5;5m[48;5;0mo[38;5;7m[48;5;0m [38;5;12m[48;5;0m-[38;5;7m[48;5;0m [38;5;12m[48;5;0mdanopia[38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m[2P -[38;5;10m[48;5;0mmake it funny[38;5;7m[48;5;0m [38;5;7m[48;5;5mbut maybe dont[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0mhey [m[39;49m[38;5;0m[48;5;0m [38;5;1m[48;5;0m000[38;5;7m[48;5;0m sdddddd[38;5;5m[48;5;0m| |[38;5;7m[48;5;3m [38;5;3m[48;5;0m│[38;5;8m[48;5;0m - [38;5;7m[48;5;0mConnor[38;5;8m[48;5;0m_____[38;5;7m[48;5;0m[2P -PROTIP: Press [38;5;15m[48;5;0mESC[38;5;7m[48;5;0m to escape input modes [38;5;1m[48;5;0m [38;5;7m[48;5;0mq,,,,,,[38;5;5m[48;5;0m| a[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;2m[48;5;0m- tokenrove [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K -[38;5;3m[48;5;0m2048 clone: [38;5;11m[48;5;0mssh play@ascii.town[38;5;7m[48;5;0m <3 aa [38;5;5m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m-[38;5;7m[48;5;0m [38;5;3m[48;5;0mmykey[14;72H[38;5;5m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;1m[48;5;0m [38;5;5m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K -[38;5;5m[48;5;0m [38;5;7m[48;5;0mG O O D B Y E W I T C H E S . T Os[38;5;5m[48;5;0mjjj[38;5;7m[48;5;0m :( [38;5;5m[48;5;0m | y |[m[39;49m[38;5;0m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m [38;5;7m[48;5;0m-[38;5;2m[48;5;0m [38;5;7m[48;5;0mdmrd[38;5;9m[48;5;0m [38;5;1m[48;5;0m [38;5;5m[48;5;0m [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;3m[48;5;0m│[38;5;5m[48;5;0m [38;5;7m[48;5;0m[K -[38;5;1m[48;5;0mvim controls, eh?[38;5;7m[48;5;0m.__________________. Con[38;5;5m[48;5;0mj[38;5;7m[48;5;0mor [38;5;5m[48;5;0m |[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - hiya [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;9m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[C[K -[38;5;11m[48;5;0m [38;5;10m[48;5;0m.[38;5;11m[48;5;0m [38;5;10m[48;5;0m.[38;5;11m[48;5;0m [38;5;10m[48;5;0m.[38;5;13m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m |[38;5;15m[48;5;0m Out of space? [38;5;7m[48;5;0m|[38;5;15m[48;5;0m [38;5;7m[48;5;0mWas[38;5;5m[48;5;0mj[38;5;7m[48;5;0m whut?[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;1m[48;5;0marke [38;5;7m[48;5;0m[2P -[38;5;10m[48;5;0m.[38;5;13m[48;5;0m [38;5;10m[48;5;0mWelcome to.[38;5;14m[48;5;0m [38;5;10m[48;5;0m.[38;5;14m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m|[38;5;15m[48;5;0mTry typing[38;5;11m[48;5;0m [38;5;9m[48;5;0m1Q[38;5;15m[48;5;0m,[38;5;11m[48;5;0m [38;5;10m[48;5;0m2Q[38;5;15m[48;5;0m,[38;5;7m[48;5;0m|[38;5;11m[48;5;0m [38;5;7m[48;5;0mHer[38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - cmr[2P - [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m. the [38;5;12m[48;5;0mT[38;5;9m[48;5;0mO[38;5;11m[48;5;0mW[38;5;14m[48;5;0mN[38;5;10m[48;5;0m.[38;5;7m[48;5;0m |[38;5;11m[48;5;0m3Q[38;5;15m[48;5;0m or [38;5;12m[48;5;0m4Q[38;5;15m[48;5;0m to travel[38;5;7m[48;5;0m|[38;5;15m[48;5;0m [38;5;10m[48;5;0m [38;5;4m[48;5;0mw[38;5;5m[48;5;0mj[38;5;4m[48;5;0mof[38;5;7m[48;5;0mt[38;5;11m[48;5;0m [38;5;5m[48;5;0m | y | [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;5m[48;5;0mGrissess (:D)[38;5;6m[48;5;0m [38;5;7m[48;5;0m [38;5;6m[48;5;0m [38;5;9m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K - [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m|[38;5;15m[48;5;0mto far-away lands [38;5;7m[48;5;0m|[38;5;15m[48;5;0m [38;5;7m[48;5;0m [38;5;10m[48;5;0m [38;5;4m[48;5;0ma[38;5;5m[48;5;0mj[38;5;4m[48;5;0moo[38;5;15m[48;5;0m [38;5;6m[48;5;0m [38;5;5m[48;5;0m |[38;5;7m[48;5;0m [38;5;5m[48;5;0my | [38;5;3m[48;5;0m│[38;5;5m[48;5;0m [38;5;7m[48;5;0m- [38;5;12m[48;5;0meternale[38;5;7m[48;5;0my[38;5;12m[48;5;0me[38;5;7m[48;5;0m [38;5;0m[48;5;7m(ipv6)[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K -[38;5;12m[48;5;0m [38;5;10m[48;5;0m [38;5;2m[48;5;0m.. . . . . .[38;5;10m[48;5;0m .[38;5;7m[48;5;0m '------------------' [38;5;5m[48;5;0mj [38;5;7m[48;5;0mtest[38;5;5m[48;5;0m |[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - meena [38;5;3m[48;5;0m [38;5;7m[48;5;0m[2P - sad[38;5;2m[48;5;0m [38;5;7m[48;5;0m hi friends [38;5;3m[48;5;0mhello[38;5;7m[48;5;0m [38;5;8m[48;5;0m [38;5;7m[48;5;0mcybre[38;5;7m[48;5;6m![38;5;7m[48;5;0m [38;5;7m[48;5;6m^Yes?[38;5;7m[48;5;0m [38;5;5m[48;5;0m j [38;5;7m[48;5;0mni [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;6m[48;5;0m- b0rk[38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;7m[48;5;0m boy [38;5;15m[48;5;0m__ [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K - nethack [38;5;3m[48;5;0myo how do i select black???[38;5;7m[48;5;0m [38;5;1m[48;5;0ma[38;5;5m[48;5;0mj[38;5;14m[48;5;0m [38;5;7m[48;5;0msxD [38;5;5m[48;5;0m |[38;5;7m[48;5;0m [38;5;5m[48;5;0my | [38;5;3m[48;5;0m│[38;5;5m[48;5;0m [38;5;7m[48;5;0m- fbernier[38;5;5m[48;5;0m [38;5;15m[48;5;0m / '[38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K -[38;5;12m[48;5;0m [38;5;7m[48;5;0mboi[38;5;12m[48;5;0m [38;5;7m[48;5;0m [38;5;9m[48;5;0mc[38;5;10m[48;5;0ml[38;5;11m[48;5;0mo[38;5;12m[48;5;0mw[38;5;13m[48;5;0mn[38;5;3m[48;5;0m [38;5;14m[48;5;0mt[38;5;9m[48;5;0mo[38;5;10m[48;5;0mw[38;5;11m[48;5;0mn[38;5;7m[48;5;0mjj [38;5;1m[48;5;0mthis is as wired [38;5;8m[48;5;0m0[38;5;5m[48;5;0mj[38;5;1m[48;5;0m [38;5;7m[48;5;0mdasdksajklj[38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[38;5;5m[48;5;0m mguaypaq[38;5;2m[48;5;0m [38;5;3m[48;5;0m [38;5;15m[48;5;0m [38;5;3m[48;5;0m [38;5;15m[48;5;0m| [38;5;2m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K -[38;5;1m[48;5;0m [38;5;9m[48;5;0m [38;5;12m[48;5;0m* [38;5;5m[48;5;0m [38;5;8m[48;5;1mhot tip:[38;5;7m[48;5;1m [38;5;0m[48;5;1mdon't[38;5;7m[48;5;1m [38;5;8m[48;5;1mruin sh[38;5;7m[48;5;0mit [38;5;12m[48;5;0m [38;5;7m[48;5;0m [38;5;12m[48;5;0m* [38;5;5m[48;5;0m [38;5;3m[48;5;0m [38;5;5m[48;5;0m [38;5;12m[48;5;0m*[38;5;7m[48;5;0m [38;5;5m[48;5;0mj [38;5;12m[48;5;0m* [38;5;5m[48;5;0m /[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0mq[38;5;5m[48;5;0m/ [38;5;12m[48;5;0m*[38;5;5m[48;5;0m [38;5;3m[48;5;0m│[38;5;5m[48;5;0m [38;5;7m[48;5;0m- [38;5;2m[48;5;0mrkallos[38;5;7m[48;5;0m [38;5;15m[48;5;0m [38;5;3m[48;5;0m [38;5;15m[48;5;0mV [38;5;3m[48;5;0m │[38;5;7m[48;5;0m[K[H[m[39;49m[38;5;0m[48;5;0m[13;41H - - - - - - - - - - - -[1;41H [38;5;6m[48;5;0m(The client tries to check if you'll[38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;15m[48;5;0m-[38;5;7m[48;5;0m [38;5;15m[48;5;0mfsj[38;5;7m[48;5;0m [38;5;14m[48;5;0m [38;5;3m[48;5;0m│[7C[38;5;7m[48;5;0m1 -[38;5;6m[48;5;0mbe able to see all the colours now.)[38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;6m[48;5;0m-[38;5;7m[48;5;0m [38;5;6m[48;5;0mSylvhem[38;5;7m[48;5;0m [38;5;3m[48;5;0m└──────┐[38;5;2m[48;5;0m//[3;1H[38;5;6m[48;5;0m [38;5;7m[48;5;0m [38;5;9m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;1m[48;5;0m- iliana[38;5;3m[48;5;0m [38;5;1m[48;5;0m<3[38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[4;1H[38;5;6m[48;5;0m [38;5;15m[48;5;0m][m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0mgas pedal ┐ this is just [38;5;15m[48;5;0m\[38;5;7m[48;5;0m [38;5;11m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;14m[48;5;0m- tjk[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[5;1H[38;5;7m[48;5;0m [38;5;15m[48;5;0m.__[38;5;7m[48;5;0m [38;5;14m[48;5;0m [38;5;15m[48;5;0m[[m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0mbrakes ┘ to toggle fast now[38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - duckinator [7C[38;5;2m[48;5;0m\\[6;1H[38;5;7m[48;5;0m [38;5;15m[48;5;0m|\[38;5;7m[48;5;0m } curly gas pedal [38;5;1m[48;5;0m:)[38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;1m[48;5;1m [m[39;49m[38;5;0m[48;5;0melo[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m (pup@mastodon.social)[38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[7;1H[38;5;7m[48;5;0m [38;5;15m[48;5;0m\[38;5;7m[48;5;0m { curly brakes [38;5;6m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;1m[48;5;1m [38;5;6m[48;5;0m [38;5;1m[48;5;1m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;6m[48;5;0m [38;5;3m[48;5;0m- bug[38;5;0m[48;5;3m(@chitter.xyz)[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[8;1H[38;5;7m[48;5;0m Looking for something [38;5;15m[48;5;0minteresting[38;5;11m[48;5;0m?[38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;1m[48;5;1m [38;5;7m[48;5;0m [38;5;1m[48;5;1m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - peidran [9C[38;5;2m[48;5;0m//[9;1H[38;5;7m[48;5;0m Aside from scattered pages all over, [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;1m[48;5;1m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[38;5;3m[48;5;0m [38;5;7m[48;5;0mKitRedgrave[9C[38;5;2m[48;5;0m\\[10;1H[38;5;7m[48;5;0m there's some development [38;5;12m[48;5;0mleft[38;5;7m[48;5;0m and [38;5;10m[48;5;0mup[38;5;7m[48;5;0m fro[38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;4m[48;5;0mvimtingu[38;5;7m[48;5;0m [10C[38;5;2m[48;5;0m//[11;1H[38;5;7m[48;5;0m here. The bulletin is over to the [38;5;9m[48;5;0mright[38;5;5m[48;5;0mj[38;5;15m[48;5;0m->[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - thomas@touhey.org [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[12;1H[38;5;7m[48;5;0m somewhere. And there's stuff all along [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - frewsxcv \.fr [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[13;1H[38;5;7m[48;5;0m the [38;5;13m[48;5;0mtorus[38;5;7m[48;5;0m if you follow it around. [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[38;5;3m[48;5;0m NecroTechno <3[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[14;1H[38;5;7m[48;5;0m [38;5;15m[48;5;0m\[38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│ [38;5;7m[48;5;0m-[38;5;5m[48;5;0m er1n[38;5;7m[48;5;0m [14;72H [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[15;1H [38;5;11m[48;5;0mNEW: press [38;5;15m[48;5;0mm[38;5;11m[48;5;0m to open the mini-map[38;5;7m[48;5;0m [38;5;15m[48;5;0m_\|[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;5m[48;5;0m- quantified [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[16;1H[38;5;7m[48;5;0m [38;5;11m[48;5;0mand see what's nearby[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;5m[48;5;0m@cybre.space[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[17;1H[38;5;7m[48;5;0m [38;5;15m[48;5;0m [38;5;10m[48;5;0m [38;5;15m[48;5;0m [38;5;7m[48;5;0m [38;5;10m[48;5;0m [38;5;7m[48;5;0myoooooo yw! [38;5;10m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;10m[48;5;0m- nightpool (cybre) [38;5;3m[48;5;0m│[38;5;10m[48;5;0m\[38;5;2m[48;5;0m\[18;1H[38;5;7m[48;5;0m [38;5;10m[48;5;0m [38;5;2m[48;5;0maaa\]\\[38;5;12m[48;5;0my wat[38;5;10m[48;5;0m [38;5;7m[48;5;0mhey vanta [38;5;10m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - ghosty[14C[38;5;2m[48;5;0m//[19;2H[38;5;7m[48;5;0m [38;5;15m[48;5;0m [38;5;7m[48;5;0mUrFU !d[38;5;10m[48;5;0m [38;5;7m[48;5;0mthis is dope[38;5;10m[48;5;0m [38;5;7m[48;5;0m [38;5;10m[48;5;0m [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;10m[48;5;0m- lynn (@chordbug)[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[20;1H[38;5;10m[48;5;0m [38;5;7m[48;5;0mRTF - chempion![38;5;10m[48;5;0m [38;5;7m[48;5;0mthx 4 sharing [38;5;10m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;5m[48;5;0m [38;5;7m[48;5;0m-[38;5;5m[48;5;0m [38;5;7m[48;5;0mvantablack [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[21;1H[38;5;7m[48;5;0m This is actually amazing. [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;5m[48;5;0m//wxyzzyrd [38;5;7m[48;5;0m [9C[38;5;2m[48;5;0m\\[22;2H[38;5;7m[48;5;0mDon't forget to grab the source: [38;5;14m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m //international <3 [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[23;2H[38;5;7m[48;5;0m hi RC! [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;13m[48;5;0mmaren[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[24;1H[38;5;7m[48;5;0m $ git clone \ [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;14m[48;5;0m [38;5;13m[48;5;0m- [38;5;0m[48;5;2mrose[38;5;14m[48;5;0m [38;5;2m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[25;1H[38;5;7m[48;5;0m https://code.causal.agency/june/torus.git [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;13m[48;5;0m(@BLASTPROCESSlNG)[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m/\[4h/[4l[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H [38;5;4m[48;5;0m~~[38;5;7m[48;5;0m~[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;1m[48;5;0m [38;5;5m[48;5;0m- grainloom[38;5;7m[48;5;0m [8C2 -[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;12m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;5m[48;5;0m@cybre.space[8C[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[3;1H~~~~~~~[38;5;7m[48;5;0mhi[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;1m[48;5;2m@slimelia[38;5;7m[48;5;0m [9C[38;5;4m[48;5;0m~~[4;1H[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;5m[48;5;5m~[38;5;4m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - jfo[17C[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[5;1H[38;5;4m[48;5;0m~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;5m[48;5;5m~~~jh[38;5;4m[48;5;0m~~~~[38;5;5m[48;5;5m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;1m[48;5;0m@Phairupegiont[6C[38;5;4m[48;5;0m~~[6;1H~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~~[38;5;4m[48;5;0m~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m- [38;5;2m[48;5;0mchr@cybre.space[38;5;7m[48;5;0m [38;5;5m[48;5;0m<3[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[7;1H[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;7m[48;5;0m i want to marry lynn [38;5;4m[48;5;0m~~~~~~~~~~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - elomatreb :3 [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[8;1H~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~[38;5;14m[48;5;0msame[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - minerobber[10C[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[9;1H[38;5;4m[48;5;0m~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~[38;5;7m[48;5;0msame tbh [38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;7m[48;5;0m [38;5;12m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m @tilde.town[9C[38;5;4m[48;5;0m~~[10;1H~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~[38;5;7m[48;5;0m I iiiiikhjk been [38;5;4m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;13m[48;5;3mselfsame[38;5;7m[48;5;0m(~town) [38;5;3m[48;5;0m│[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[11;1H[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~[38;5;7m[48;5;0m moving around [38;5;4m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;6m[48;5;0mZhorken[38;5;7m[48;5;0m@awoo.space [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[12;1H~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;7m[48;5;0m I am bad at VIM [38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;7m[48;5;0m I didnt know [38;5;4m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;1m[48;5;0mnoiob[38;5;2m[48;5;0m@[38;5;3m[48;5;0mawoo[38;5;4m[48;5;0m.[38;5;5m[48;5;0mspace[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[13;1H[38;5;4m[48;5;0m~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~[38;5;7m[48;5;0m this is[38;5;4m[48;5;0m~[38;5;7m[48;5;0mvim[38;5;12m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[38;5;2m[48;5;0m [38;5;4m[48;5;2m [38;5;2m[48;5;0m [38;5;3m[48;5;2m [38;5;7m[48;5;0m [6C[38;5;4m[48;5;0m~~[14;1H~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;7m[48;5;3mit's vim[38;5;4m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - aeon[16C[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[15;1H~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~~[38;5;7m[48;5;0mvim is [38;5;2m[48;5;0m bad[38;5;7m[48;5;0m hello lynn[38;5;4m[48;5;0m~~~~~~~~~[38;5;7m[48;5;0m [38;5;4m[48;5;0m~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;2m[48;5;0m- unascribed[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[16;1H~~~~~~~~[38;5;7m[48;5;0m(lovely application, this)[38;5;4m[48;5;0m~~~~~~~~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;12m[48;5;0m~ nee (hidamari.blue)[38;5;3m[48;5;0m│[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[17;1H~[38;5;4m[48;5;0m~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m ~ curiouser [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[18;1H~~~~~~[38;5;7m[48;5;0mthis is as much nethack[38;5;5m[48;5;3m [38;5;4m[48;5;0m~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - clouded[38;5;8m[48;5;0m [11C[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[19;1H~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;7m[48;5;0mas it is vim [38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~[38;5;5m[48;5;3m [38;5;0m[48;5;2msry i cnt drw[38;5;5m[48;5;3m [38;5;4m[48;5;0m~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - flacs (@f1ac5) [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[20;1H~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;7m[48;5;0m [38;5;4m[48;5;0m~~~~~~~[38;5;5m[48;5;3m [38;5;4m[48;5;0m~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;4m[48;5;0m- xenonnsmb (~town) [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[21;1H[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~~[38;5;7m[48;5;0memacs keys pls[38;5;4m[48;5;0m~[38;5;7m[48;5;0m+[38;5;2m[48;5;0m2[38;5;4m[48;5;0m~~~~~~~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - Jakob [38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;2m[48;5;0m [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[22;1H~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;13m[48;5;0mrose! [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[23;1H[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;7m[48;5;0moh no its vim[38;5;4m[48;5;0m~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;5m[48;5;3mwhoops[38;5;4m[48;5;0m~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;3m[48;5;0m│ [38;5;13m[48;5;0m(@mahoushoujorose)[38;5;3m[48;5;0m │[38;5;4m[48;5;0m~~[24;1H~~~~~~[38;5;7m[48;5;0mhelp im trapped in a vim factory[38;5;4m[48;5;0m~~~~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;5m[48;5;0mjess (@dogs ~town)[m[39;49m[38;5;0m[48;5;0m [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[25;1H[38;5;4m[48;5;0m~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~[38;5;7m[48;5;0mI messed[38;5;5m[48;5;0m| y[38;5;7m[48;5;0mq[38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[38;5;5m[48;5;0m [38;5;13m[48;5;0mrachel (@arjache)[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[4h~[4l[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H [38;5;6m[48;5;6m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m - Falkreon[38;5;7m[48;5;0m [11C3 - Roses are [38;5;9m[48;5;0mred[38;5;7m[48;5;0m. [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;7m[48;5;6m- mitosis@manhater.io[38;5;3m[48;5;0m│[K -[38;5;7m[48;5;0m Violets are [38;5;12m[48;5;0mblue[38;5;7m[48;5;0m. [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;5m[48;5;0m- yrgfm[38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [11C[K -Some people don't think [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;6m[48;5;0m- felix[38;5;7m[48;5;0m [38;5;3m[48;5;0m [12C[38;5;7m[48;5;0m[K - ascii.town be like it is. [38;5;7m[48;5;6m [38;5;7m[48;5;0m [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - ndiesslin [6C[K - But it [38;5;13m[48;5;0mdo[38;5;7m[48;5;0m! [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- matth [38;5;3m[48;5;0m [38;5;7m[48;5;0m [2C[K - [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;1m[48;5;0m- timi[38;5;3m[48;5;0m [38;5;7m[48;5;0m [8C[K - .-. .-. .-. .-. .-..-. .----. .-. .-. [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;3m[48;5;0m │ [38;5;2m[48;5;0m- @andwhatnot2[38;5;3m[48;5;0m [7C[38;5;7m[48;5;0m[K - } \/ { \ \/ / | ' / } |__} \ \ / [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;3m[48;5;0m │ [38;5;7m[48;5;0m- Spocky [9C[K - | { } | `-\ } | . \ } '__} `- } [38;5;7m[48;5;6m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;3m[48;5;0m │ [38;5;2m[48;5;0m-[38;5;3m[48;5;0m [38;5;2m[48;5;0mKid Iccurus[38;5;3m[48;5;0m [38;5;7m[48;5;0m [5C[K - `-' `-' `-' `-'`-` `----' -' [38;5;7m[48;5;6m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;3m[48;5;0m │ [38;5;7m[48;5;0m- tom@slime.global :3[C[K - [38;5;7m[48;5;6m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;4m[48;5;1m-[38;5;7m[48;5;0m [38;5;0m[48;5;1m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m[K -[38;5;7m[48;5;6m [38;5;6m[48;5;6m [38;5;7m[48;5;6m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;0m[48;5;1m lr[38;5;7m[48;5;0m [38;5;3m[48;5;0m [8C[38;5;7m[48;5;0m [38;5;3m[48;5;0m[K -[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - fennecs (helo)[6C[K - [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m this poem sd [38;5;4m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- @amsomniac (mastod[2C[K - [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m is factually [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m on) [C[K - incorrect[38;5;8m[48;5;0m, but[38;5;15m[48;5;0m [38;5;7m[48;5;0m [38;5;2m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- maxj [11C[K - [38;5;8m[48;5;0mat least it rhymes[38;5;15m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m| y |[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;1m [38;5;7m[48;5;0m AdamThePhantump was[C[K - [38;5;2m[48;5;0m [38;5;7m[48;5;0mi love this place [38;5;2m[48;5;0m [38;5;5m[48;5;0m | y[38;5;7m[48;5;0m [38;5;5m[48;5;0m| [38;5;3m[48;5;0m│ [38;5;7m[48;5;0mhere. Boo! :)[38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m└┐[38;5;7m[48;5;0m[K - [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0mTsuki "Hello guys !"[38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K - now I can't sleep [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- @dejawu_ [38;5;3m[48;5;0m┌┘[38;5;7m[48;5;0m[K - [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- @eal [14C[K - zzzz [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;2m@social.sakamoto.gq[C[38;5;7m[48;5;0m[K -[38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- frenata [C[K -[38;5;11m[48;5;0mwe are addicts. we need an intervention [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0mq[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- banjo [3C[K[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H [38;5;7m[48;5;0mWhat is this big fucking line of 'y'? [1;56H [38;5;1m[48;5;0m-Ethan[38;5;12m[48;5;0m [38;5;7m[48;5;0m [12C4 - [38;5;13m[48;5;0mWhat is this big fucking line of 'y', you [2;57H[38;5;3m[48;5;0m- [38;5;2m[48;5;0mProfpatsch[38;5;7m[48;5;0m [38;5;3m[48;5;0m└──────┐[38;5;7m[48;5;0m[K - [38;5;13m[48;5;0mmay ask yourself? It's the torus ouroboros,[3;59H[38;5;5m[48;5;0mviv@cybre.space -[38;5;7m[48;5;0m [38;5;13m[48;5;0mayying its own lmao. [38;5;9m[48;5;0m [38;5;7m[48;5;0m [38;5;13m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [6C- dom96 ;)[5;18H [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [5;59Hcloin[38;5;3m[48;5;0m [38;5;7m[48;5;0m [6;15H [6;44H [6;56H [38;5;5m[48;5;0m- dbucklin[38;5;7m[48;5;0m [11C[38;5;2m[48;5;0m[K[7;10Hi went all the way around the[38;5;7m[48;5;0m [7;56H[38;5;4m[48;5;0m - hiljusti[38;5;7m[48;5;0m - [38;5;7m[48;5;3m [38;5;2m[48;5;0mros[38;5;7m[48;5;0m [7C [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;1m[48;5;0m- @ercts_mxms [38;5;7m[48;5;0m - [38;5;2m[48;5;0m leave some notes on the[38;5;7m[48;5;0m [7C [38;5;3m[48;5;0m│[38;5;7m[48;5;0m -f@r4ch0 - [38;5;2m[48;5;0mway for your fellow travellersr[38;5;7m[48;5;0m [7C [38;5;3m[48;5;0m│[38;5;7m[48;5;0m ffffff[38;5;3m[48;5;0m -[C[38;5;7m[48;5;0m [38;5;2m[48;5;0m~chr[38;5;7m[48;5;0m [7C [38;5;3m[48;5;0m│[38;5;7m[48;5;0m -Harper -[73D[38;5;8m[48;5;0m [38;5;9m[48;5;0mthis is pretty sweet [12;44H[38;5;7m[48;5;0m [12;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m -@discordalert[8C[K - [38;5;9m[48;5;0m -meena[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;2m[48;5;0mvon [7C[38;5;7m[48;5;0m [8C[K[14;52H[38;5;5m[48;5;0m [6C[38;5;7m[48;5;0mShadowRZ [15;11Hworld wide web! [15;44H [15;56H (@ShadowRZ@mastodon[16;13Hinternet [16;56H [11C.xyz - [38;5;2m[48;5;0mYour journey begins now. [38;5;7m[48;5;0m [17;50H [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;8m[48;5;0mQB[38;5;6m[48;5;0mFr[38;5;15m[48;5;0meak -[38;5;2m[48;5;0m [38;5;7m[48;5;0m [18;48H [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;6m[48;5;0m@scanlime[38;5;7m[48;5;0m +Tuco [38;5;1m[48;5;0m<3[19;15H[38;5;7m[48;5;0mwow this is very exciting [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;6m[48;5;0m@diode.zone[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K[20;29H-b0rk[20;56H [38;5;10m[48;5;0m- zer00[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K[21;14H O [21;50H [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;5m[48;5;0m- kokakoda[11C[38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K - ifdfd[22;21H\|/[22;37H[38;5;9m[48;5;0m([38;5;15m[48;5;0m![38;5;9m[48;5;0m)[22;48H[38;5;7m[48;5;0m [7C[38;5;2m[48;5;0m - m3tax -[70D[38;5;7m[48;5;0mo_O[23;22H|[7C [38;5;9m[48;5;0m([38;5;15m[48;5;0m!!!!![38;5;9m[48;5;0m)[23;56H[38;5;7m[48;5;0m ~~~zgebiit~~~ - [24;21H/ \[24;32H[38;5;12m[48;5;0mhey b0rk!![24;56H[38;5;7m[48;5;0m - gauntlet - a - lastrik[K[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H [38;5;7m[48;5;0m [1;57H- CX [14C5 -[38;5;6m[48;5;0m [38;5;4m[48;5;0m######################################[38;5;7m[48;5;0m [2;57H- tomjschwanke [7C[38;5;3m[48;5;0m[K -[C[38;5;4m[48;5;0m# [38;5;7m[48;5;0m [38;5;4m[48;5;0m#[38;5;7m[48;5;0m [3;57H- @aliasless -[38;5;4m[48;5;0m #[38;5;7m[48;5;0m [38;5;4m[48;5;0mMastodon #[38;5;7m[48;5;0m [4;57H @awoo.wolfgirl. - [38;5;4m[48;5;0m#[5;12H[38;5;6m[48;5;0m [5;39H[38;5;4m[48;5;0m#[5;57H[38;5;7m[48;5;0m engineering - [38;5;4m[48;5;0m# Giving social networks back to you[38;5;6m[48;5;0m [38;5;4m[48;5;0m#[38;5;6m[48;5;0m [6;57H[38;5;7m[48;5;0m- cosine [12C[K - [38;5;4m[48;5;0m# Free, decentralized microblogging #[38;5;6m[48;5;0m [7;56H[38;5;7m[48;5;0m [38;5;0m[48;5;1m- stevenleeg -[C[38;5;4m[48;5;0m#[8;17H[38;5;7m[48;5;0m [8;39H[38;5;4m[48;5;0m#[8;57H[38;5;7m[48;5;0m- steampunc - [38;5;4m[48;5;0m# https://joinmastodon.org #[9;57H[38;5;2m[48;5;0m- @blinry -[C[38;5;4m[48;5;0m######################################[38;5;7m[48;5;0m [10;57H- ben@tilde.team [11;35H [11;56H[38;5;1m[48;5;0m [38;5;7m[48;5;0m- Alpatron#6158 -[67D [38;5;4m[48;5;0m [38;5;5m[48;5;0m####################################[12;58H[38;5;7m[48;5;0m Calamitous -[63D[38;5;5m[48;5;0m# [13;43H#[6C[38;5;7m[48;5;0m [6C [38;5;1m[48;5;0m [38;5;7m[48;5;0m -[55D[38;5;5m[48;5;0m#[14;19HWitches Town[14;43H#[14;52H[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m -[59D[38;5;5m[48;5;0m# #[15;59H[38;5;1m[48;5;0m [38;5;7m[48;5;0m -[70D[38;5;5m[48;5;0m# Mastodon insta[38;5;7m[48;5;0mn[38;5;5m[48;5;0mce for [38;5;7m[48;5;0m [38;5;5m[48;5;0m# [16;59H[38;5;1m[48;5;0m [14C[38;5;7m[48;5;0m - [38;5;5m[48;5;0m#[38;5;7m[48;5;0m [38;5;5m[48;5;0mqueer[38;5;2m[48;5;0m [38;5;5m[48;5;0m feminist[6Canarchists #[17;57H[38;5;7m[48;5;0m - [38;5;5m[48;5;0m# [38;5;7m[48;5;0m [18;43H[38;5;5m[48;5;0m#[18;57H[38;5;7m[48;5;0m -[70D[38;5;5m[48;5;0m# https://witches.town # [19;59H[38;5;7m[48;5;0m -[62D[38;5;5m[48;5;0m####################################[20;57H[38;5;7m[48;5;0m -<<<more advertising goes over there<<<[21;57H - [38;5;3m[48;5;7m ,-._.~~~^-v^v^v**=>[38;5;7m[48;5;0m [22;37H [22;56H - [38;5;3m[48;5;7m/[38;5;4m[48;5;7mlife is better on[38;5;3m[48;5;7m/ [7C[38;5;9m[48;5;0m<3[38;5;7m[48;5;0m [23;60H - [38;5;3m[48;5;7m*[38;5;4m[48;5;7m/a.weirder.earth/[38;5;3m[48;5;7m* [38;5;7m[48;5;0m [24;32H [24;57H - [38;5;3m[48;5;7m \______________/* [38;5;7m[48;5;0m love you[25;47H[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0mq[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [12C[38;5;3m[48;5;0m│[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[1;57H[38;5;7m[48;5;0m [18C6 - [38;5;9m[48;5;0msomeone.. feel free to reuse this space.[2;57H[38;5;7m[48;5;0m [38;5;3m[48;5;0m└[7C[38;5;7m[48;5;0m[K - [38;5;9m[48;5;0mit's uh... i wouldn't feel bad about [3;57H[38;5;7m[48;5;0m - [38;5;9m[48;5;0merasing[38;5;1m[48;5;0m [38;5;9m[48;5;0mwhatever this is [38;5;7m[48;5;0m [4;60H - [5;12H[38;5;2m[48;5;0m [38;5;7m[48;5;0m [38;5;11m[48;5;0m [5;39H[38;5;7m[48;5;0m [5;61H - [38;5;9m[48;5;0m [38;5;7m[48;5;0m [38;5;15m[48;5;0m [38;5;8m[48;5;0mTidied. The ASCII Janitor.[38;5;15m[48;5;0m [38;5;7m[48;5;0m [6;57H - [38;5;6m[48;5;0m [38;5;7m[48;5;0m [38;5;11m[48;5;0m [38;5;7m[48;5;0m [7;57H - [8;15H[38;5;6m[48;5;0m [38;5;11m[48;5;0m [38;5;6m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;6m[48;5;0m [8;57H[38;5;7m[48;5;0m - WHATS UP MY GLIB GLOBS?[38;5;11m[48;5;0m [38;5;7m[48;5;0m [9;57H - W U B A L U B A D U B D U B[38;5;11m[48;5;0m [10;57H[38;5;7m[48;5;0m [11;12H*~~~~~~~~~~~~~~~~~~~[38;5;15m[48;5;0m~~~~[38;5;11m[48;5;0m* [11;56H[38;5;7m[48;5;0m -[65D < tilde.town <3s u > [12;57H -[61D *~~~~~~~~~~~~~~~~~~~~~~~*[6C [13;58H [38;5;3m[48;5;0m . -[59D[38;5;7m[48;5;0m [14;19H< shell in today >[6C [14;58H -[59D *[38;5;15m[48;5;0m~~~~~~~~~~~~~~~~*[38;5;7m[48;5;0m [15;59H -[52D [38;5;11m[48;5;0m [38;5;15m[48;5;0m < :3 >[38;5;7m[48;5;0m [16;57H[38;5;3m[48;5;0mi want to avoid -[64D[38;5;7m[48;5;0m *[38;5;15m[48;5;0m~~~~*[38;5;7m[48;5;0m [17;57H[38;5;3m[48;5;0mconfusion for new -[66D[38;5;7m[48;5;0m [18;43H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0mpeople though[9C[38;5;12m[48;5;0m[K -[71D[38;5;7m[48;5;0m [38;5;1m[48;5;0mthis thing is cool[38;5;7m[48;5;0m [19;57H[38;5;4m[48;5;0mor make the guestbook -[C[38;5;1m[48;5;0mtoo bad i[38;5;7m[48;5;0m [38;5;2m[48;5;0mssss[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mk[38;5;7m[48;5;0m [38;5;2m[48;5;0mk[38;5;7m[48;5;0m [20;56H[38;5;4m[48;5;0m go AROUNDWAYS[38;5;7m[48;5;0m [38;5;11m[48;5;0m [38;5;3m[48;5;0m│[38;5;11m[48;5;0m -[38;5;7m[48;5;0m [38;5;2m[48;5;0ms[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mkk [38;5;7m[48;5;0m [21;57H[38;5;3m[48;5;0mto be continued... -[72D[38;5;7m[48;5;0m [38;5;2m[48;5;0mssss[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mkk [22;51H[38;5;5m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0mwe need to move the -[73D[38;5;7m[48;5;0m [38;5;2m[48;5;0ms u[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mk k[38;5;7m[48;5;0m [23;51H[38;5;3m[48;5;0m├───┘[38;5;7m[48;5;0m [38;5;3m[48;5;0mtext below elsewhere[38;5;7m[48;5;0m [38;5;3m[48;5;0m└─┐[24;3H[38;5;7m[48;5;0m [38;5;2m[48;5;0mssss[38;5;7m[48;5;0m [38;5;2m[48;5;0muuuu[38;5;7m[48;5;0m [38;5;2m[48;5;0mk[38;5;7m[48;5;0m [38;5;2m[48;5;0m k[38;5;7m[48;5;0m [38;5;1m[48;5;0mat ascii art[24;51H[38;5;5m[48;5;0m│[38;5;7m[48;5;0m (Snek petting dude moved to[38;5;3m[48;5;0m│[25;3H[38;5;7m[48;5;0m [38;5;1m[48;5;0m-xenonnsmb, from ~town[25;54H[38;5;7m[48;5;0m000,009.)[15C [38;5;3m[48;5;0m│[4h[38;5;7m[48;5;0m [4l[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[1;24H [1;37H[38;5;3m[48;5;0m [41C[38;5;7m[48;5;0m7 - [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m - [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [3;57H[38;5;3m[48;5;0mShrine of the church -[75D[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [4;37H[38;5;3m[48;5;0m [4;60H [5;10H[38;5;7m[48;5;0mempty lot [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [6C[38;5;3m[48;5;0m [5;61H[38;5;12m[48;5;4mo o o o -[66D[38;5;7m[48;5;0m COME ON DOWN [38;5;3m[48;5;0m [38;5;7m[48;5;0m [6;60H[38;5;12m[48;5;4mo[38;5;12m[48;5;5m [38;5;12m[48;5;4mo[7;15H[38;5;7m[48;5;0mTO ASCII TOWN~~~[6C[38;5;3m[48;5;0m [7;59H[38;5;12m[48;5;4mo[38;5;12m[48;5;5m [38;5;15m[48;5;5m..[38;5;12m[48;5;5m [38;5;12m[48;5;4mo[8;15H[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [8;58H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m |----[38;5;12m[48;5;5m [38;5;12m[48;5;4mo -[65D[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [6C[38;5;3m[48;5;0m [9;58H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m ||[38;5;12m[48;5;5m [38;5;15m[48;5;5m [38;5;12m[48;5;4mo -[64D[38;5;7m[48;5;0m uiwiidr [38;5;3m[48;5;0m [38;5;7m[48;5;0m [10;58H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m --- [38;5;12m[48;5;4mo[38;5;7m[48;5;0m [38;5;3m[48;5;0mof[11;12H[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [11;58H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m |. [38;5;12m[48;5;4mo[12;12H[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [6C [38;5;3m[48;5;0m [12;58H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m .. [38;5;12m[48;5;4mo[13;12H[38;5;7m[48;5;0m [38;5;6m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [13;58H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m \--- [38;5;12m[48;5;4mo[14;13H[38;5;7m[48;5;0mI walked the [38;5;3m[48;5;0m [14;50H[38;5;5m[48;5;0m [7C[38;5;12m[48;5;4mo[38;5;15m[48;5;5m ,/ [38;5;12m[48;5;4mo[15;16H[38;5;5m[48;5;0mourobouros[38;5;7m[48;5;0m [38;5;3m[48;5;0m [15;48H[38;5;5m[48;5;0m [15;59H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m ' [38;5;12m[48;5;4mo[16;18H[38;5;7m[48;5;0mand all I got was this[16;57H [38;5;12m[48;5;4mo o[38;5;15m[48;5;5m [38;5;12m[48;5;4mo o[38;5;7m[48;5;0m [17;23Hlousy t-shirt [38;5;3m[48;5;0m [17;57H[38;5;7m[48;5;0m [38;5;12m[48;5;4m o [38;5;7m[48;5;0m -[68D_---.___,---_ [m[39;49m[38;5;0m[48;5;0m [18;37H[38;5;3m[48;5;0m [18;47H[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;12m[48;5;0m┌[38;5;7m[48;5;0m┘[38;5;3m[48;5;0m GNU Emacs [6C[38;5;7m[48;5;0m└[38;5;12m[48;5;0m─┐[19;5H[38;5;7m[48;5;0m/ \ [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [19;37H[38;5;3m[48;5;0m [19;54H[38;5;12m[48;5;0m│[38;5;12m[48;5;5m=========================[38;5;12m[48;5;0m│[20;2H[38;5;7m[48;5;0m /| [38;5;5m[48;5;0m|y|[38;5;7m[48;5;0m |\ [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [20;37H[38;5;3m[48;5;0m [20;54H[38;5;12m[48;5;0m│[38;5;12m[48;5;4m https://gnu.org/s/emacs [38;5;12m[48;5;0m│[21;8H[38;5;7m[48;5;0m| | [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [21;37H[38;5;3m[48;5;0m [21;54H[38;5;12m[48;5;0m│[38;5;12m[48;5;5m=========================[38;5;12m[48;5;0m│[22;8H[38;5;7m[48;5;0m| | <- amazing shirt[22;51H[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;12m[48;5;0m└[38;5;7m[48;5;0m┐ ┌[38;5;12m[48;5;0m─┘[23;8H[38;5;7m[48;5;0m|_______| would i buy it?[23;51H[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0mEmacs faithfuls [38;5;7m[48;5;0m [38;5;6m[48;5;0m| [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K[24;14H [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [24;51H[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;6m[48;5;0m\|/[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K[25;16H maybe [38;5;3m[48;5;0m [25;54H[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0msign[m[39;49m[38;5;0m[48;5;0mq[38;5;3m[48;5;0mbelow:[6C[38;5;6m[48;5;0mv[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[1;24H[38;5;7m[48;5;0m [1;38H[38;5;3m[48;5;0m [1;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m- [X] [38;5;6m[48;5;0mnee [8C[38;5;7m[48;5;0m8 - [38;5;1m[48;5;0mi may prefer vim, but emacs[38;5;7m[48;5;0m [38;5;1m[48;5;0mhas tetris[38;5;3m[48;5;0m [2;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m- [X] [38;5;2m[48;5;0mbyxor[11C[38;5;5m[48;5;5m[K -[C[38;5;1m[48;5;0mwhich is a stellar feature[3;38H[38;5;3m[48;5;0m [3;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;3m[48;5;0m[X[38;5;7m[48;5;0m [38;5;3m[48;5;0m @amsomniac ([38;5;7m[48;5;0m [C[38;5;5m[48;5;5m[K -[38;5;1m[48;5;0mhonestly makes me like emacs[4;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m ][38;5;3m[48;5;0mmastodon[38;5;4m[48;5;0m [38;5;3m[48;5;0m) [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K[5;10H[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [5;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [X[38;5;2m[48;5;0m][38;5;7m[48;5;0m tokenrove[7C[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K -[76D[38;5;1m[48;5;0ml[38;5;7m[48;5;0m [38;5;5m[48;5;0mshame it doesn't have[6;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;2m[48;5;0m- [X[38;5;7m[48;5;0m][38;5;2m[48;5;0m rkallos[9C[38;5;7m[48;5;5m [38;5;7m[48;5;4mG[7;4H[38;5;1m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0ma text editor[38;5;7m[48;5;0m [7;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [X[m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m nephariuz[7C[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K -[38;5;5m[48;5;0m fucking heretics[38;5;7m[48;5;0m SHAME!!! [38;5;3m[48;5;0m [38;5;7m[48;5;0m [8;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0mevoxel [7C[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K -[C[38;5;7m[48;5;0memacs doesn't have :smile though :)[9;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;6m[48;5;0m- :wq!<CR> [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5mM[38;5;7m[48;5;4m[K[10;18H[38;5;7m[48;5;0m [10;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K[11;24H[38;5;7m[48;5;0m l[11;42Hi[11;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [7C[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K[12;24H[38;5;7m[48;5;0m [12;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;1m[48;5;0m - [M-x] zge[38;5;7m[48;5;0m [7C[38;5;7m[48;5;5m [38;5;7m[48;5;4mN[13;15H[38;5;7m[48;5;0m [13;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;1m[48;5;0m [6C[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K[14;13H[38;5;7m[48;5;0m [14;38H [14;50H [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [8C[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K -[38;5;7m[48;5;0mo---------o o----o [15;48H [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [9C[38;5;7m[48;5;5mA[38;5;7m[48;5;4m[K -[38;5;7m[48;5;0m|[16;11H| | [38;5;8m[48;5;4m [38;5;7m[48;5;0m | [38;5;3m[48;5;0m [38;5;7m[48;5;0m [16;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [10C[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K -[38;5;7m[48;5;0m|[17;11H| |[38;5;8m[48;5;0m [38;5;8m[48;5;4m [38;5;7m[48;5;0m | [17;53H[38;5;7m[48;5;5m [17;63H[38;5;7m[48;5;0m [13C[38;5;7m[48;5;5m [38;5;7m[48;5;4mU[18;1H[38;5;7m[48;5;0m| [38;5;7m[48;5;2m [38;5;7m[48;5;0m [38;5;7m[48;5;3m [38;5;7m[48;5;0m | | | [18;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [6C[38;5;3m[48;5;0m│[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K -[38;5;7m[48;5;0m| [38;5;8m[48;5;3m [38;5;7m[48;5;0m [38;5;7m[48;5;2m [38;5;7m[48;5;0m [38;5;7m[48;5;3m [38;5;7m[48;5;0m | o----o [19;38Hstop here[6C[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K -[38;5;7m[48;5;0m| [38;5;8m[48;5;3m [38;5;7m[48;5;0m [38;5;7m[48;5;2m [38;5;7m[48;5;0m [38;5;7m[48;5;5m [38;5;7m[48;5;3m [38;5;7m[48;5;0m| [6C [20;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5mC[38;5;7m[48;5;3m[K -[38;5;7m[48;5;0m|[38;5;8m[48;5;0m [38;5;8m[48;5;3m [38;5;7m[48;5;4m [38;5;7m[48;5;5m [38;5;7m[48;5;0m [38;5;7m[48;5;5m [38;5;7m[48;5;0m| 000129 go down until you[7C[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K -[38;5;7m[48;5;0m| [38;5;7m[48;5;3m [38;5;7m[48;5;4m [38;5;7m[48;5;5m [38;5;7m[48;5;6m [38;5;7m[48;5;5m [38;5;7m[48;5;0m| reach ok[22;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[22C│[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K -[38;5;7m[48;5;0m| [38;5;7m[48;5;1m [38;5;7m[48;5;6m [38;5;7m[48;5;5m [38;5;7m[48;5;0m| [23;26H100 [23;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K -[38;5;7m[48;5;0mo---------o[24;24H [24;50H[38;5;0m[48;5;7me[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;7m[48;5;5m [38;5;3m[48;5;0m│ [m[39;49m[38;5;0m[48;5;0mq[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5mS[38;5;7m[48;5;3m[K -[38;5;0m[48;5;7m U:%*- *Tetris* Top (1,0) (Tetris Proj[38;5;7m[48;5;0mq[38;5;0m[48;5;7mctile[rms])[K[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[38;5;7m[48;5;0m [1;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [8C9 -[38;5;2m[48;5;0m +/////////////////+[38;5;7m[48;5;0m [2;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [11C[K - [38;5;2m[48;5;0m //you@cybre.space//[38;5;7m[48;5;0m [3;37H [3;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [4C[K - [38;5;2m[48;5;0m +/////////////////+[38;5;7m[48;5;0m [4;37H [4;53H [6C [5C[K -[74D[38;5;3m[48;5;0m/\/\/\/\/[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m/\/\/\/\/\[38;5;7m[48;5;0m [5;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [7C[K - [38;5;3m[48;5;0m/ / [6;37H[38;5;7m[48;5;0m [6;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [9C[K - [38;5;3m[48;5;0m \ pleroma.soykaf.com \[7;37H[38;5;7m[48;5;0m [7;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [7C[K - [38;5;3m[48;5;0m/[38;5;7m[48;5;0m [38;5;3m[48;5;0msee the[38;5;7m[48;5;0m [38;5;3m[48;5;0m /[38;5;7m[48;5;0m [8;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [9C[K - [38;5;3m[48;5;0m\[38;5;7m[48;5;0m [38;5;2m[48;5;0m- entire -[38;5;7m[48;5;0m [38;5;3m[48;5;0m \[38;5;7m[48;5;0m I miss Karl...[9;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [4C[K - [38;5;3m[48;5;0m/[38;5;7m[48;5;0m [38;5;3m[48;5;0mfediverse[6C /[10;37H[38;5;7m[48;5;0m [10;53H [24C[K - [38;5;3m[48;5;0m\[11;25H \[38;5;7m[48;5;0m [6C [11;53H [24C[K - [38;5;3m[48;5;0m \/\/\/\/\[38;5;2m[48;5;0m///[38;5;3m[48;5;0m\/\/\/\/\/[12;37H[38;5;7m[48;5;0m [12;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [11C[K[13;37H [13;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m.[38;5;7m[48;5;0m [6C[K[14;21H[38;5;12m[48;5;0m/---------------------\[14;53H[38;5;7m[48;5;0m [24C[K - [38;5;12m[48;5;0m|I'm petting the snek.| [15;53H[38;5;7m[48;5;0m [24C[K - [16;11H [38;5;12m[48;5;0m| |[16;53H[38;5;7m[48;5;0m [24C[K - [17;11H [38;5;12m[48;5;0m| ^U^ |[17;53H[38;5;7m[48;5;0m [24C[K - [38;5;12m[48;5;0m\---------------------/[18;53H[38;5;7m[48;5;0m [24C[K - [X] TODO: move this too[38;5;12m[48;5;0m \[38;5;7m[48;5;0m [6C [24C[K - [m[39;49m[38;5;0m[48;5;0m[ ] TODO: write todo list[38;5;7m[48;5;0m [38;5;12m[48;5;0m [38;5;7m[48;5;0m [38;5;4m[48;5;0m@/[6C[38;5;7m[48;5;0m [21C[38;5;6m[48;5;0m [2C[38;5;7m[48;5;0m[K - [X] TODO: hey, me too [38;5;4m[48;5;0m/| [6C[38;5;7m[48;5;0m [24C[K - [22;28H [22;41H [38;5;4m[48;5;0m/ \[6C[38;5;7m[48;5;0m [24C[K - ##########################[23;53H [24C[K - # TODO: advertise things # [24;50H [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [17C[K - ########################## [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0mq[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0mq[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[1;55H[38;5;0m[48;5;3m│[1;71H│[6C[38;5;7m[48;5;0m10 - [2;55H[38;5;0m[48;5;3m│[2;71H└──────┐ -[C[38;5;7m[48;5;0m [3;55H[38;5;0m[48;5;3m│[22C│ -[38;5;1m[48;5;0m [38;5;7m[48;5;0m # [4;55H[38;5;0m[48;5;3m│[22C│ -[74D[38;5;7m[48;5;0m ## # ## [5;55H[38;5;0m[48;5;3m│[22C│ -[75D[38;5;7m[48;5;0m ## # ## [6;55H[38;5;0m[48;5;3m│[22C│ -[76D[38;5;7m[48;5;0m # [7;55H[38;5;0m[48;5;3m│[22C│ -[75D[38;5;7m[48;5;0m #### [6C [8;55H[38;5;0m[48;5;3m│[22C│ -[75D[38;5;7m[48;5;0m ## [9;55H[38;5;0m[48;5;3m│[22C│ -[75D[38;5;7m[48;5;0m # ### ## [10;55H[38;5;0m[48;5;3m│[38;5;7m[48;5;0m [38;5;3m[48;5;0ma[16C[38;5;0m[48;5;3m│ -[75D[38;5;7m[48;5;0m ## ## ## ## [11;55H[38;5;0m[48;5;3m│[38;5;3m[48;5;0m(hells [7C[38;5;0m[48;5;3m│ -[75D[38;5;7m[48;5;0m ### ### Capouet[12;55H[38;5;0m[48;5;3m│[38;5;3m[48;5;0m guettbook [6C[38;5;0m[48;5;3m│ -[76D[38;5;7m[48;5;0mlol this is awesome[13;55H[38;5;0m[48;5;3m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m s retch[11C[38;5;0m[48;5;3m│[14;21H[38;5;7m[48;5;0m [14;55H[38;5;0m[48;5;3m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0mgoals)[10C[38;5;0m[48;5;3m│[15;21H[38;5;7m[48;5;0m [15;55H[38;5;0m[48;5;3m│[22C│[16;21H[38;5;7m[48;5;0m [16;55H[38;5;0m[48;5;3m│[22C│[17;21H[38;5;7m[48;5;0m [17;55H[38;5;0m[48;5;3m│[22C│[18;21H[38;5;7m[48;5;0m [18;55H[38;5;0m[48;5;3m│[22C│ -[71D[38;5;7m[48;5;0m [19;55H[38;5;0m[48;5;3m│[22C│ -[71D[38;5;7m[48;5;0m [20;43H [20;55H[38;5;0m[48;5;3m│[20C[38;5;7m[48;5;0m [38;5;0m[48;5;3m│ -[72D[38;5;7m[48;5;0mtodo: write todo list [21;44H [21;55H[38;5;0m[48;5;3m│[22C│[22;44H[38;5;7m[48;5;0m [22;55H[38;5;3m[48;5;0m▓[22C▓ -[71D[38;5;7m[48;5;0m [23;55H[38;5;3m[48;5;0m▒[22C▒ -[71D[38;5;7m[48;5;0m [24;55H[38;5;3m[48;5;0m░[22C░ -[71D[38;5;7m[48;5;0m [25;55H [6C[K[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H [1;55H[38;5;3m[48;5;0m [1;71H[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m(000,011)[2;37H [2;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[3;37H[m[39;49m[38;5;0m[48;5;0m [3;46H[38;5;7m[48;5;0mW[3;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K - [4;13H [4;37H[m[39;49m[38;5;0m[48;5;0m [4;46H[38;5;7m[48;5;0mE[4;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K -[48D [7C [5;37H[m[39;49m[38;5;0m[48;5;0m [5;46H[38;5;7m[48;5;0mE[5;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K -[48D [38;5;6m[48;5;0m3[38;5;5m[48;5;0m333333[38;5;3m[48;5;0m3[38;5;6m[48;5;0m33333333[6;37H[m[39;49m[38;5;0m[48;5;0m [6;46H[38;5;7m[48;5;0mE[6;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[7;9H[38;5;6m[48;5;0m3[38;5;9m[48;5;0m33333333333[38;5;7m[48;5;0m [38;5;6m[48;5;0m3[7;37H[m[39;49m[38;5;0m[48;5;0m [7;46H[38;5;7m[48;5;0mE[7;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[8;9H[38;5;6m[48;5;0m3[38;5;9m[48;5;0m33[38;5;7m[48;5;0m [38;5;13m[48;5;0m3[38;5;15m[48;5;0m3[38;5;7m[48;5;0m33 [38;5;6m[48;5;0m3[38;5;7m[48;5;0m [38;5;6m[48;5;0m3[8;37H[m[39;49m[38;5;0m[48;5;0m [8;46H[38;5;7m[48;5;0mE[8;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[9;9H[38;5;6m[48;5;0m333333333333[38;5;3m[48;5;0m3333[9;37H[m[39;49m[38;5;0m[48;5;0m [9;46H[38;5;7m[48;5;0mE[9;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[10;10H [10;37H[m[39;49m[38;5;0m[48;5;0m [10;46H[38;5;7m[48;5;0mE[10;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[11;10H [11;37H[m[39;49m[38;5;0m[48;5;0m [11;46H[38;5;7m[48;5;0mH[11;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[12;11H [12;37H[m[39;49m[38;5;0m[48;5;0m [12;46H[38;5;7m[48;5;0mE[12;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K - [13;37H[m[39;49m[38;5;0m[48;5;0m [13;46H[38;5;7m[48;5;0mE[13;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;4m[48;5;0m.[38;5;7m[48;5;0m[K[14;37H[m[39;49m[38;5;0m[48;5;0m [14;46H[38;5;7m[48;5;0mH[14;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[15;37H[m[39;49m[38;5;0m[48;5;0m [15;46H[38;5;7m[48;5;0mE[15;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K - [38;5;6m[48;5;0mvi[38;5;7m[48;5;0m for the [38;5;6m[48;5;0mvi[38;5;7m[48;5;0mn![16;37H[m[39;49m[38;5;0m[48;5;0m [16;46H[38;5;7m[48;5;0mE[16;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[17;15H[38;5;6m[48;5;0m [17;37H[m[39;49m[38;5;0m[48;5;0m [17;46H[38;5;7m[48;5;0mE[17;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[18;37H[m[39;49m[38;5;0m[48;5;0m [7C[38;5;7m[48;5;0mE[18;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[19;37H[m[39;49m[38;5;0m[48;5;0m [19;46H[38;5;7m[48;5;0mE[19;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[20;37H[m[39;49m[38;5;0m[48;5;0m [20;46H[38;5;7m[48;5;0mE[20;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K -[49D [38;5;0m[48;5;1m [38;5;7m[48;5;0m [21;37H[m[39;49m[38;5;0m[48;5;0m [21;46H[38;5;7m[48;5;0mE[21;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[22;13H[38;5;0m[48;5;1m [38;5;0m[48;5;2m [38;5;0m[48;5;1m [38;5;0m[48;5;2m [38;5;0m[48;5;1m [22;37H[m[39;49m[38;5;0m[48;5;0m [22;46H[38;5;7m[48;5;0mE[22;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[23;13H[38;5;0m[48;5;1m [23;37H[m[39;49m[38;5;0m[48;5;0m [23;46H[38;5;7m[48;5;0mE[23;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[24;13H[38;5;0m[48;5;1m [38;5;0m[48;5;2m [38;5;0m[48;5;1m [24;37H[m[39;49m[38;5;0m[48;5;0m [24;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[25;13H[38;5;0m[48;5;1m [25;37H[m[39;49m[38;5;0m[48;5;0m [25;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[1;14H[38;5;0m[48;5;1m [1;55H[38;5;7m[48;5;0m [23C[m[39;49m[38;5;0m[48;5;0m2[2;55H[38;5;7m[48;5;0m [3;46H [5C[K[4;17Hiiit[4;38H[m[39;49m[38;5;0m[48;5;0m [7C[38;5;7m[48;5;0m [5C[K[5;19Hllgwfth[5;46H [5C[K[6;9H [6;38H[m[39;49m[38;5;0m[48;5;0m [7C[38;5;7m[48;5;0m [5C[K[7;9H [7;46H [5C[K[8;9H [8;46H [5C[K[9;9H [38;5;5m[48;5;0mAcme is best editor :P[9;46H[38;5;7m[48;5;0m [5C[K -[6D [5C[K[11;18His that a plan9 reference [5C[K -[6D [5C[K[13;22His that a Jojo's referenc[13;55H [13;65H [38;5;3m[48;5;0m.[14;37H[38;5;7m[48;5;0m [14;46H [5C[K[15;25His that a let's encryp[5C [38;5;3m[48;5;0m -[58D[38;5;7m[48;5;0m [16;46H [5C[K[17;15H [17;46H [5C[K[18;38H [7C [18;55H[38;5;2m[48;5;0md[19;46H[38;5;7m[48;5;0m [19;55H[38;5;2m[48;5;0ms[20;46H[38;5;7m[48;5;0m [20;55H[38;5;2m[48;5;0mf[21;13H[38;5;7m[48;5;0m [21;46H [21;55H[38;5;2m[48;5;0ms[22;13H[38;5;7m[48;5;0m [22;46H [22;55H[38;5;2m[48;5;0mffd[38;5;7m[48;5;0m [38;5;2m[48;5;0mhello[38;5;7m[48;5;0m [38;5;2m[48;5;0mthere[23;13H[38;5;7m[48;5;0m [23;46H [23;55H[38;5;2m[48;5;0mo[38;5;7m[48;5;0m [38;5;2m[48;5;0mf[38;5;7m[48;5;0m [38;5;2m[48;5;0ml [24;13H[38;5;7m[48;5;0m eGenre l?[24;38H [24;55H[38;5;2m[48;5;0md[25;13H[38;5;7m[48;5;0m [25;55H[38;5;2m[48;5;0mj[38;5;3m[48;5;0m[1P[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[1;14H[38;5;7m[48;5;0m [1;37H [1;55H[38;5;2m[48;5;0mp[23C[m[39;49m[38;5;0m[48;5;0m3[2;37H[38;5;7m[48;5;0m [2;52H[38;5;3m[48;5;0m[1P[3;37H[38;5;7m[48;5;0m [3;59H[38;5;2m[48;5;0mx[38;5;3m[48;5;0m[1P[4;17H[38;5;7m[48;5;0m [4;37H [4;59H[38;5;2m[48;5;0mm[38;5;3m[48;5;0m[1P[5;19H[38;5;7m[48;5;0m [5;37H [5;59H[38;5;2m[48;5;0mp[6;37H[38;5;7m[48;5;0m [6;59H[38;5;2m[48;5;0mp[7;37H[38;5;7m[48;5;0m [7;59H[38;5;2m[48;5;0m -[53D[38;5;7m[48;5;0mi want to pet a soft girl [8;59H[38;5;2m[48;5;0mp -[52D[38;5;7m[48;5;0mand call her by her first name[9;59H[38;5;2m[48;5;0mu -[52D[38;5;7m[48;5;0mgod, i'm so lonely.[10;37H [10;59H[38;5;2m[48;5;0mb[11;18H[38;5;7m[48;5;0m [11;59H[38;5;2m[48;5;0ml -[54D[38;5;10m[48;5;0mYou can do it[12;37H[38;5;7m[48;5;0m [12;59H[38;5;2m[48;5;0mi[13;22H[38;5;7m[48;5;0m [13;59H[38;5;2m[48;5;0mc -[54D[38;5;10m[48;5;0mGo out there and talk to people[14;59H[38;5;2m[48;5;0mg[15;25H[38;5;7m[48;5;0m [15;59H[38;5;2m[48;5;0m@[38;5;7m[48;5;0m[K -[54D[38;5;10m[48;5;0mEven if it doesnt go anywhere, don't[16;59H[38;5;2m[48;5;0mc -[54D[38;5;10m[48;5;0msee it as a loss, see it as practice[17;59H[38;5;2m[48;5;0mo[18;37H[38;5;7m[48;5;0m [18;55H [38;5;2m[48;5;0mn -[54D[38;5;10m[48;5;0mI believe in you[19;37H[38;5;7m[48;5;0m [19;55H [38;5;2m[48;5;0mf[20;37H[38;5;7m[48;5;0m [20;55H [38;5;2m[48;5;0me -[54D[38;5;10m[48;5;0mYou will be succesful[21;37H[38;5;7m[48;5;0m [21;55H [38;5;2m[48;5;0mr[22;37H[38;5;7m[48;5;0m [22;55H [38;5;2m[48;5;0me[38;5;7m[48;5;0m[K -[54D[38;5;10m[48;5;0mYou just have to try...[23;37H[38;5;7m[48;5;0m [23;55H [38;5;2m[48;5;0mn[38;5;7m[48;5;0m[K[24;15H [24;37H [24;55H [38;5;2m[48;5;0mc -[54D[38;5;7m[48;5;0mUwU[25;37H [25;55H [38;5;2m[48;5;0me[38;5;7m[48;5;0m[K[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[1;55H[38;5;7m[48;5;0m [38;5;2m[48;5;0m.[19C[m[39;49m[38;5;0m[48;5;0m4[2;59H[38;5;2m[48;5;0my[38;5;7m[48;5;0m[K -[38;5;2m[48;5;0mo[38;5;7m[48;5;0m[K -[38;5;2m[48;5;0mu[38;5;7m[48;5;0m[K -[38;5;2m[48;5;0mr -d -a -[53D[38;5;7m[48;5;0m [8;59H[38;5;2m[48;5;0mt -[52D[38;5;7m[48;5;0m [9;59H[38;5;2m[48;5;0ma -[52D[38;5;7m[48;5;0m [10;59H[38;5;2m[48;5;0m. -f -[54D[38;5;7m[48;5;0m [12;59H[38;5;2m[48;5;0mo -r -[54D[38;5;7m[48;5;0m [38;5;10m[48;5;0mwhere[14;59H[38;5;2m[48;5;0ms[6C[38;5;3m[48;5;0m [15;36H[38;5;10m[48;5;0mare[15;59H[38;5;2m[48;5;0ma -[54D[38;5;7m[48;5;0m [38;5;10m[48;5;0myou[38;5;7m[48;5;0m [16;59H[38;5;2m[48;5;0ml -[54D[38;5;7m[48;5;0m [38;5;10m[48;5;0mgoing[38;5;7m[48;5;0m [17;59H[38;5;2m[48;5;0me[18;36H[38;5;10m[48;5;0mthere[18;52H[38;5;7m[48;5;0m[K -[46D [19;36H[38;5;10m[48;5;0mis[19;52H[38;5;7m[48;5;0m[K[20;36H[38;5;10m[48;5;0mnothing[20;52H[38;5;7m[48;5;0m[K -[46D [21;36H[38;5;10m[48;5;0mdown[21;52H[38;5;7m[48;5;0m[K[22;36H[38;5;10m[48;5;0mhere[22;52H[38;5;7m[48;5;0m[K -[46D [7C[38;5;10m[48;5;0mi [23;52H[38;5;7m[48;5;0m[K[24;36H[38;5;10m[48;5;0mpromise[24;52H[38;5;7m[48;5;0m[K -[46D [25;36H(there is)[6C[K[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[1;59H[38;5;7m[48;5;0m [1;72H 015[K[2;59H - -[6D[38;5;1m[48;5;0mor is there?[5;59H[38;5;7m[48;5;0m -[5Dwow[K - -[5Dyou all just[9;59H -[5Dbb[K[11;19Hhello[11;52H[K[12;59H - [14;36H [38;5;3m[48;5;0m| |[5C[38;5;7m[48;5;0m[K[15;36H [15;52H[K[16;36H [16;52H[K[17;36H [17;52H[K -[46DRewrite this in Nim for better -[35Dperformance and easier maintenance. -[35Dhttps://nim-lang.org[20;36H -[37DSorry, couldn't resist :P [22;10HRewrite it in Idris to prove its[23;10Hcorrectness :P[23;36H -[32DRemove it :P[24;36H -[35Ddasdasdasdsa[25;36H [1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[38C[38;5;7m[48;5;0m6[4;54H[K[5;36Hwrite.[6;55H[K - -[K[9;39Hjjjjjjjjjjj -[5C[K[11;19H [13;35H[38;5;10m[48;5;0msee[38;5;7m[48;5;0m,[13;54HWhat's that creeping[14;35Hi told you [7Cwaaaaayyy over there?[15;54H-------------------->[18;6H -[30D -[35D -[20D [22;10H [23;10H -[18D -[10D[m[39;49m[38;5;0m[48;5;0mq[38;5;7m[48;5;0m [1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[38C[38;5;7m[48;5;0m7[4;27HWhat is this ?:wq[5;27Hq[5;36H [7;57H[38;5;12m[48;5;0mthere is[8;57Htrust me[9;39H[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[7C[38;5;12m[48;5;0mi wrapped[13;35H[38;5;7m[48;5;0m [13;54H [38;5;3m[48;5;0m.[38;5;7m[48;5;0m[K[14;35H [7C[K - [K[25;8H [1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[38C[38;5;7m[48;5;0m8[4;27H -[38;5;11m[48;5;0mAncient legend tells of the treasure -of the legendary pirate, -Cap'n Jasmine Sharkbait![7;52H[38;5;7m[48;5;0m[K -[38;5;11m[48;5;0mNo one knows where its shiny and well shaded[7C[38;5;7m[48;5;0m[K -[38;5;11m[48;5;0mglory is hidden, and many have perished[9;52H[38;5;7m[48;5;0m[K -[38;5;11m[48;5;0mtrying to find it. - - [15;28H[38;5;1m[48;5;0mstuff is here[17;26H[38;5;6m[48;5;0m [38;5;5m[48;5;0m |[38;5;6m[48;5;0m [1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[1;72H[38;5;7m[48;5;0m(000,019)[3;29H[38;5;7m[48;5;1mMDG - boi - -[38;5;7m[48;5;0m [38;5;15m[48;5;0m [38;5;7m[48;5;0m - - - [8;62Hwhy though -======================================D - - - [15;28H [15;63H[38;5;3m[48;5;0m(i legit[16;63Hput tape[17;26H[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [17;63H[38;5;3m[48;5;0mon my [18;63Hscreen -[6Dto do[38;5;7m[48;5;0m [38;5;3m[48;5;0mthis)[20;63H[38;5;1m[48;5;0myou are crazy[22;55H[38;5;4m[48;5;0myou will be seen as[23;55Ha visionary[24;24H[38;5;7m[48;5;0mhello tilde.town here[25;37H[m[39;49m[38;5;0m[48;5;0mq[25;58H[38;5;7m[48;5;0mweird flex but ok[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H[1;72H[38;5;7m[48;5;0m 020[K[3;29H -[38;5;10m[48;5;0mplease [5;15H[38;5;7m[48;5;0m [38;5;10m[48;5;0mstop -this -is -silly[8;52H[38;5;7m[48;5;0m[K - [9;59H[38;5;12m[48;5;0mit[6C[38;5;3m[48;5;0mllllllllllllll[10;27H[38;5;1m[48;5;0m [6C[38;5;7m[48;5;0mno[10;59H[38;5;12m[48;5;0mis[11;12H[38;5;1m[48;5;0m [11;59H[38;5;12m[48;5;0mlovely -[59D[38;5;7m[48;5;0m"Root? Where we're going we[12;54Ht -[48Ddon't need root!"[15;63H[K[16;34Hpeople have[7C[K[17;34Hdied trying[7C[K[18;34Hdon't try :([6C[K - [38;5;9m[48;5;0mdon't stop![38;5;7m[48;5;0m[K[20;55H[38;5;9m[48;5;0mthere's nice art[38;5;7m[48;5;0m[K[21;37Huwu[21;55H[38;5;9m[48;5;0mjust ahead[22;55H [38;5;7m[48;5;0m[K -[38;5;9m[48;5;0m|||[38;5;7m[48;5;0m[K[24;24H [24;55H[38;5;9m[48;5;0mvvv[25;37H[38;5;7m[48;5;0m [25;52H[K[1;41H[m[39;49m[38;5;0m[48;5;0m - - - - - - - - - - - - - - - - - - - - - - - -[1;41H [38;5;12m[48;5;6m [38;5;4m[48;5;6m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;10m[48;5;0m comment space!!! [38;5;9m[48;5;0m<3[38;5;7m[48;5;0m(000,021)[2;1H[38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@ -[38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;9m[48;5;0m__________________ -[38;5;0m[48;5;4m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;9m[48;5;0m|[38;5;2m[48;5;0m [38;5;9m[48;5;0m | -[38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;9m[48;5;0m|[38;5;2m[48;5;0m [38;5;9m[48;5;0m>[38;5;10m[48;5;0m>[38;5;14m[48;5;0m> [38;5;11m[48;5;0mM[38;5;3m[48;5;0mORE[38;5;14m[48;5;0m [38;5;11m[48;5;0mA[38;5;3m[48;5;0mRT[38;5;14m[48;5;0m >[38;5;10m[48;5;0m>[38;5;9m[48;5;0m>[38;5;2m[48;5;0m [38;5;9m[48;5;0m| -[38;5;0m[48;5;4m [38;5;2m[48;5;7m [38;5;0m[48;5;4m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;9m[48;5;0m| [38;5;3m[48;5;0m(on (001, 021)) [38;5;2m[48;5;0m [38;5;9m[48;5;0m|[38;5;2m[48;5;0m -[38;5;0m[48;5;4m [38;5;2m[48;5;7m [38;5;8m[48;5;7m#[38;5;2m[48;5;7m [38;5;0m[48;5;4m [38;5;2m[48;5;7m [38;5;0m[48;5;4m [38;5;2m[48;5;7m [38;5;0m[48;5;4m [38;5;5m[48;5;0m> @[38;5;7m[48;5;0m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;9m[48;5;0m|___________[38;5;7m[48;5;0m [38;5;9m[48;5;0m_____|[38;5;2m[48;5;0m -[38;5;0m[48;5;4m [38;5;8m[48;5;7m#############[38;5;0m[48;5;4m [38;5;8m[48;5;7m#[38;5;0m[48;5;4m [38;5;8m[48;5;7m##############[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[23C[38;5;2m[48;5;0m -[38;5;0m[48;5;4m [38;5;8m[48;5;4m [38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;9m[48;5;0m [38;5;2m[48;5;0m [38;5;1m[48;5;2mooh what you drawing[38;5;7m[48;5;0m[K -[38;5;0m[48;5;4m [38;5;8m[48;5;4m [38;5;6m[48;5;4m/[38;5;8m[48;5;4m [38;5;6m[48;5;4m [38;5;4m[48;5;4m [38;5;6m[48;5;4m /[38;5;8m[48;5;4m [38;5;6m[48;5;4m [38;5;8m[48;5;4m [38;5;14m[48;5;4m/[38;5;8m[48;5;4m [38;5;6m[48;5;4m/[38;5;8m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;8m[48;5;4m [38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;0m[48;5;1mjust a little landscape -[38;5;0m[48;5;4m [38;5;6m[48;5;4m [38;5;0m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;1m[48;5;2mnice!! keep it up ^o^ -[38;5;0m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;14m[48;5;4m/[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;0m[48;5;1mthank you =v= -[38;5;0m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[13;67H[38;5;3m[48;5;0m -[38;5;0m[48;5;4m [38;5;14m[48;5;4m/[38;5;0m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[14;60H[38;5;1m[48;5;2moh wait hi rose -[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m this is wonderful -[38;5;0m[48;5;4m [38;5;14m[48;5;4m/[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[7C[38;5;8m[48;5;7mhi alice!! -[38;5;0m[48;5;4m [38;5;10m[48;5;4m####[38;5;0m[48;5;4m [38;5;10m[48;5;4m####[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m -[38;5;0m[48;5;4m [38;5;10m[48;5;4m#[38;5;2m[48;5;4m#####[38;5;10m[48;5;4m#[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;12m[48;5;0mart restored to its[38;5;5m[48;5;0m[K -[38;5;0m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;10m[48;5;4m#[38;5;2m[48;5;4m#[38;5;8m[48;5;4m|[38;5;2m[48;5;4m#[38;5;10m[48;5;4m#[38;5;0m[48;5;4m [38;5;14m[48;5;4m/[38;5;0m[48;5;4m [38;5;4m[48;5;4m [38;5;0m[48;5;4m [38;5;4m[48;5;4m [38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;12m[48;5;0mformer glory[38;5;5m[48;5;0m [38;5;4m[48;5;0m -[38;5;0m[48;5;4m [38;5;10m[48;5;4m##[38;5;2m[48;5;4m##[38;5;8m[48;5;4m|[38;5;2m[48;5;4m##[38;5;10m[48;5;4m##[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;12m[48;5;0mcmon, play nice yall -[38;5;0m[48;5;4m [38;5;10m[48;5;4m##[38;5;0m[48;5;4m |[38;5;10m[48;5;4m [38;5;0m[48;5;4m [38;5;10m[48;5;4m##[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [7C[38;5;2m[48;5;0myeah! -[38;5;2m[48;5;4m||||||||||||||||||||[38;5;0m[48;5;4m\[38;5;2m[48;5;4m|||||||||||||||||||||||||[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[2C[38;5;7m[48;5;0m[K -[38;5;8m[48;5;2m#####################[38;5;0m[48;5;2m\[38;5;8m[48;5;2m########################[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m| [38;5;2m[48;5;0mthanks for watching -[38;5;8m[48;5;2m######################[38;5;0m[48;5;2m\[38;5;8m[48;5;2m#######################[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;2m[48;5;0m i guess it's done now -[38;5;8m[48;5;2m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0mq[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;9m[48;5;0mwonderful :) [38;5;2m[48;5;0mmight do more[4hr[4l[1;41H[m[39;49m[38;5;0m[48;5;0m \ No newline at end of file diff --git a/www/git.causal.agency/.gitignore b/www/git.causal.agency/.gitignore index 8d20f25d..eaed8039 100644 --- a/www/git.causal.agency/.gitignore +++ b/www/git.causal.agency/.gitignore @@ -1,3 +1,13 @@ +*.html about-filter -hi +compress +ctags +email-filter +filter +gzip +hilex +htagml +mandoc +mtags +owner-filter source-filter diff --git a/www/git.causal.agency/Makefile b/www/git.causal.agency/Makefile index 28e08ba5..86b9f3eb 100644 --- a/www/git.causal.agency/Makefile +++ b/www/git.causal.agency/Makefile @@ -1,18 +1,53 @@ -ETC = /usr/local/etc -WWW = /usr/local/www/cgit -LIBEXEC = /usr/local/libexec +PREFIX = /var/www +CONFDIR = ${PREFIX}/conf +DATADIR = ${PREFIX}/cgit +BINDIR = ${PREFIX}/bin +WEBROOT = ${PREIFX}/git.causal.agency -BIN = ../../bin -BINS = about-filter source-filter hi +CFLAGS += -Wall -Wextra +LDFLAGS = -static -pie -install: cgitrc custom.css ${BINS} - install -m 644 cgitrc ${ETC} - install -m 644 custom.css ${WWW} - install ${BINS} ${LIBEXEC} +BINS += about-filter +BINS += ctags +BINS += email-filter +BINS += gzip +BINS += hilex +BINS += htagml +BINS += mandoc +BINS += mtags +BINS += owner-filter +BINS += source-filter + +HTMLS = index.html + +all: ${BINS} ${HTMLS} + +compress ctags mandoc: + ${MAKE} -C /usr/src/usr.bin/$@ LDFLAGS='${LDFLAGS}' + mv /usr/src/usr.bin/$@/$@ $@ + ${MAKE} -C /usr/src/usr.bin/$@ clean + +gzip: compress + ln -f compress $@ -hi: ${BIN}/hi.c - ${MAKE} -C ${BIN} $@ - cp ${BIN}/$@ $@ +hilex htagml mtags: + rm -f ../../bin/$@ + ${MAKE} -C ../../bin $@ LDFLAGS='${LDFLAGS}' + mv ../../bin/$@ $@ + +about-filter email-filter owner-filter source-filter: filter + ln -f filter $@ + +index.html: index.7 + mandoc -Thtml -Ostyle=https://causal.agency/style.css index.7 >index.html + +install: cgitrc custom.css ${BINS} + install -m 644 cgitrc ${CONFDIR} + install -m 644 custom.css ${DATADIR} + install -d -o www -g daemon ${PREFIX}/cache/cgit + install -d -m 1700 -o www -g daemon ${PREFIX}/tmp + install -s ${BINS} ${BINDIR} + install -m 644 ${HTMLS} ${WEBROOT} clean: - rm -f ${BINS} + rm -f compress filter ${BINS} ${HTMLS} diff --git a/www/git.causal.agency/about-filter.sh b/www/git.causal.agency/about-filter.sh deleted file mode 100644 index c7161006..00000000 --- a/www/git.causal.agency/about-filter.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -case "$1" in - (*.[1-9]) - /usr/bin/mandoc -T html -O fragment,man=%N.%S,includes=../tree/%I - ;; - (*) - exec /usr/local/libexec/hi -l text -f html - ;; -esac diff --git a/www/git.causal.agency/cgitrc b/www/git.causal.agency/cgitrc index c187e1ee..0666fd28 100644 --- a/www/git.causal.agency/cgitrc +++ b/www/git.causal.agency/cgitrc @@ -1,5 +1,6 @@ root-title=causal agency -root-desc=“then I'm sorry, no offence, but you write toy programs.” +root-desc=“I think some people from the Gentoo project are behind this.” +logo= clone-url=https://$HTTP_HOST/$CGIT_REPO_URL snapshots=tar.gz zip @@ -13,15 +14,17 @@ repository-sort=age branch-sort=age css=/custom.css -email-filter=/usr/local/libexec/cgit-email -about-filter=/usr/local/libexec/about-filter -source-filter=/usr/local/libexec/source-filter +about-filter=/bin/about-filter +source-filter=/bin/source-filter +#owner-filter=/bin/owner-filter +email-filter=/bin/email-filter readme=:README.7 readme=:README remove-suffix=1 enable-git-config=1 -scan-path=/home/june/pub +scan-path=/git.causal.agency +cache-root=/cache/cgit cache-size=1024 diff --git a/www/git.causal.agency/custom.css b/www/git.causal.agency/custom.css index 80892b36..b3f4f425 100644 --- a/www/git.causal.agency/custom.css +++ b/www/git.causal.agency/custom.css @@ -14,12 +14,12 @@ div#cgit { tab-size: 4; } -div#cgit table#header td.logo { - display: none; -} div#cgit table#header td.sub { border-top: none; } +div#cgit table#header td.sub.right { + padding-right: 1em; +} div#cgit table.tabs { border-bottom: none; } @@ -49,20 +49,19 @@ div#cgit div#summary { max-width: 80ch; } -/* from hi(1) */ -div#cgit .hi.Keyword { color: dimgray; } -div#cgit .hi.Macro { color: green; } -div#cgit .hi.Tag { color: inherit; text-decoration: underline; } -div#cgit .hi.String { color: teal; } -div#cgit .hi.Format { color: teal; font-weight: bold; } -div#cgit .hi.Interp { color: olive; } -div#cgit .hi.Comment { color: navy; } -div#cgit .hi.Todo { color: navy; font-weight: bold; } -div#cgit .hi.DiffOld { color: red; } -div#cgit .hi.DiffNew { color: green; } -div#cgit .hi.Tag:target { color: goldenrod; outline: none; } +/* for hilex(1) */ +div#cgit pre .Ke { color: dimgray; } +div#cgit pre .Ma { color: green; } +div#cgit pre .Co { color: navy; } +div#cgit pre .St { color: teal; } +div#cgit pre .Fo { color: teal; font-weight: bold; } +div#cgit pre .Su { color: olive; } + +/* for htagml(1) */ +div#cgit pre a.tag { color: inherit; text-decoration: underline; } +div#cgit pre a.tag:target { color: goldenrod; outline: none; } -/* from mandoc(1) */ +/* for mandoc(1) */ table.head, table.foot { width: 100%; } td.head-rtitle, td.foot-os { text-align: right; } td.head-vol { text-align: center; } @@ -74,11 +73,12 @@ dl.Bl-diag > dt { font-weight: bold; } code.Nm, code.Fl, code.Cm, code.Ic, code.In, code.Fd, code.Fn, code.Cd { font-weight: bold; font-family: inherit; } +h1.Sh { font-size: 1.5em; } table.Nm td:first-child { padding-right: 1ch; } code.Fl { white-space: nowrap; } span.RsT { font-style: italic; } -dl.Bl-tag:not(.Bl-compact) dt { margin-top: 1em; } -ul.Bl-bullet:not(.Bl-compact) li { margin-top: 1em; } +dl.Bl-tag:not(.Bl-compact) > dt { margin-top: 1em; } +ul.Bl-bullet:not(.Bl-compact) > li { margin-top: 1em; } div.Bd-indent { margin-left: 4ch; } table.Bl-column { width: 100%; } table.foot { margin-top: 1em; } diff --git a/www/git.causal.agency/filter.c b/www/git.causal.agency/filter.c new file mode 100644 index 00000000..7c7e9320 --- /dev/null +++ b/www/git.causal.agency/filter.c @@ -0,0 +1,158 @@ +#include <err.h> +#include <fcntl.h> +#include <fnmatch.h> +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/wait.h> +#include <unistd.h> + +#define Q(...) #__VA_ARGS__ + +#define MANDOC_OPTIONS "fragment,man=%N.%S,includes=../tree/%I" + +static int about(int argc, char *argv[]) { + if (argc < 2) return 1; + if (!fnmatch("README.[1-9]", argv[1], 0)) { + execlp("mandoc", "mandoc", "-T", "html", "-O", MANDOC_OPTIONS, NULL); + err(127, "mandoc"); + } else if (!fnmatch("*.[1-9]", argv[1], 0)) { + execlp( + "mandoc", "mandoc", "-T", "html", "-O", "toc," MANDOC_OPTIONS, NULL + ); + err(127, "mandoc"); + } else { + execlp("hilex", "hilex", "-l", "text", "-f", "html", "-o", "pre", NULL); + err(127, "hilex"); + } +} + +static int email(void) { + size_t cap = 0; + char *buf = NULL; + if (getline(&buf, &cap, stdin) < 0) err(1, "getline"); + if (buf[0] == 'C' && !strncmp(&buf[strcspn(buf, " ")], " McEnroe", 8)) { + printf("June%s", &buf[strcspn(buf, " ")]); + } else { + printf("%s", buf); + } + return 0; +} + +static int owner(void) { + printf(Q(<a href="https://liberapay.com/june/donate"><img alt="Donate using Liberapay" src="https://liberapay.com/assets/widgets/donate.svg"></a>)); + return 0; +} + +#define CTAGS_PATTERN "*.[chlmy]" +#define TEMPLATE "/tmp/filter.XXXXXXXXXX" + +static char tmp[PATH_MAX]; +static char tags[] = TEMPLATE; +static void cleanup(void) { + unlink(tmp); + unlink(tags); +} + +static int source(int argc, char *argv[]) { + if (argc < 2) return 1; + if ( + strcmp("Makefile", argv[1]) && + strcmp(".profile", argv[1]) && + strcmp(".shrc", argv[1]) && + fnmatch(CTAGS_PATTERN, argv[1], 0) && + fnmatch("*.mk", argv[1], 0) && + fnmatch("*.[1-9]", argv[1], 0) && + fnmatch("*.sh", argv[1], 0) + ) { + execlp("hilex", "hilex", "-t", "-n", argv[1], "-f", "html", NULL); + err(127, "hilex"); + } + + const char *ext = strrchr(argv[1], '.'); + if (!strcmp(argv[1], ".profile") || !strcmp(argv[1], ".shrc")) { + ext = ".sh"; + } else if (!strcmp(argv[1], "Makefile")) { + ext = ".mk"; + } else if (!ext) { + ext = ""; + } + + snprintf(tmp, sizeof(tmp), TEMPLATE "%s", ext); + int fd = mkstemps(tmp, strlen(ext)); + if (fd < 0) err(1, "%s", tmp); + atexit(cleanup); + + char buf[4096]; + for (ssize_t len; 0 < (len = read(STDIN_FILENO, buf, sizeof(buf)));) { + if (write(fd, buf, len) < 0) err(1, "%s", tmp); + } + if (close(fd) < 0) err(1, "%s", tmp); + + fd = mkstemp(tags); + if (fd < 0) err(1, "%s", tags); + close(fd); + pid_t pid = fork(); + if (pid < 0) err(1, "fork"); + if (!pid) { + if (!fnmatch(CTAGS_PATTERN, argv[1], 0)) { + execlp("ctags", "ctags", "-w", "-f", tags, tmp, NULL); + warn("ctags"); + } else { + execlp("mtags", "mtags", "-f", tags, tmp, NULL); + warn("mtags"); + } + _exit(127); + } + int status; + if (wait(&status) < 0) err(1, "wait"); + + int rw[2]; + if (pipe(rw) < 0) err(1, "pipe"); + pid = fork(); + if (pid < 0) err(1, "fork"); + if (!pid) { + dup2(rw[1], STDOUT_FILENO); + close(rw[0]); + close(rw[1]); + execlp("hilex", "hilex", "-f", "html", tmp, NULL); + warn("hilex"); + _exit(127); + } + pid = fork(); + if (pid < 0) err(1, "fork"); + if (!pid) { + dup2(rw[0], STDIN_FILENO); + close(rw[0]); + close(rw[1]); + execlp("htagml", "htagml", "-im", "-f", tags, tmp, NULL); + warn("htagml"); + _exit(127); + } + close(rw[0]); + close(rw[1]); + + if (wait(&status) < 0) err(1, "wait"); + if (wait(&status) < 0) err(1, "wait"); + return status; +} + +int main(int argc, char *argv[]) { +#ifdef __OpenBSD__ + int error; + switch (getprogname()[0]) { + break; case 'a': error = pledge("stdio exec", NULL); + break; case 's': error = pledge("stdio tmppath proc exec", NULL); + break; default: error = pledge("stdio", NULL); + } + if (error) err(1, "pledge"); +#endif + switch (getprogname()[0]) { + case 'a': return about(argc, argv); + case 'e': return email(); + case 'o': return owner(); + case 's': return source(argc, argv); + default: return 1; + } +} diff --git a/www/git.causal.agency/index.7 b/www/git.causal.agency/index.7 new file mode 100644 index 00000000..58a40dfe --- /dev/null +++ b/www/git.causal.agency/index.7 @@ -0,0 +1,81 @@ +.Dd January 12, 2024 +.Dt GIT.CAUSAL.AGENCY 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm causal agency +.Nd \(dqI think some people from the Gentoo project are behind this.\(dq +. +.Sh DESCRIPTION +basically cgit (awful software) +getting hammered by web crawlers +keeps making my machine crash. +this static page will be here +until I can find a better solution. +clone urls and tarball urls are still functional. +. +.Bl -tag +.It src \(em dontfiles +.Dl git clone https://git.causal.agency/src +.It ascii.town +.Bl -tag +.It torus \(em collaborative ASCII art +.Dl git clone https://git.causal.agency/torus +.It play \(em some games for SSH +.Dl git clone https://git.causal.agency/play +.El +.It email +.Bl -tag +.It imbox \(em IMAP to mbox +.Dl git clone https://git.causal.agency/imbox +.It bubger \(em IMAP archive generator +.Dl git clone https://git.causal.agency/bubger +.It notemap \(em notemap +.Dl git clone https://git.causal.agency/notemap +.El +.It forks +.Bl -tag +.It shulker \(em Discord to vanilla Minecraft bridge +.Dl git clone https://git.causal.agency/shulker +.It cgit-pink \(em web frontend for git +.Dl git clone https://git.causal.agency/cgit-pink +.It dash \(em patched shell with cmake build +.Dl git clone https://git.causal.agency/dash +.El +.It games +.Bl -tag +.It wep \(em Windows Entertainment Pack recreations +.Dl git clone https://git.causal.agency/wep +.It cards \(em CARDS.DLL loader for SDL +.Dl git clone https://git.causal.agency/cards +.El +.It irc +.Bl -tag +.It scooper \(em web interface for litterbox +.Dl git clone https://git.causal.agency/scooper +.It litterbox \(em IRC logger +.Dl git clone https://git.causal.agency/litterbox +.It pounce \(em IRC bouncer +.Dl git clone https://git.causal.agency/pounce +.It catgirl \(em IRC client +.Dl git clone https://git.causal.agency/catgirl +.El +.It ports +.Bl -tag +.It jorts \(em my own ports tree for macOS +.Dl git clone https://git.causal.agency/jorts +.It exman \(em manuals for other systems +.Dl git clone https://git.causal.agency/exman +.It libretls \(em libtls for OpenSSL +.Dl git clone https://git.causal.agency/libretls +.It ports \(em Fx and Ox ports for this software +.Dl git clone https://git.causal.agency/ports +.El +.It system +.Bl -tag +.It kitd \(em process supervisor for OpenBSD +.Dl git clone https://git.causal.agency/kitd +.It catsit \(em (deprecated) process supervisor +.Dl git clone https://git.causal.agency/catsit +.El +.El diff --git a/www/git.causal.agency/source-filter.sh b/www/git.causal.agency/source-filter.sh deleted file mode 100644 index 4febc2e0..00000000 --- a/www/git.causal.agency/source-filter.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -exec /usr/local/libexec/hi -t -n "$1" -f html -o anchor diff --git a/www/photo.causal.agency/.gitignore b/www/photo.causal.agency/.gitignore new file mode 100644 index 00000000..e6e1a830 --- /dev/null +++ b/www/photo.causal.agency/.gitignore @@ -0,0 +1,6 @@ +*.jpg +*.JPG +app.json +posted.txt +static/ +token.json diff --git a/www/photo.causal.agency/0062/body b/www/photo.causal.agency/0062/body new file mode 100644 index 00000000..3676b877 --- /dev/null +++ b/www/photo.causal.agency/0062/body @@ -0,0 +1 @@ +Konica C35 Automatic diff --git a/www/photo.causal.agency/0062/date b/www/photo.causal.agency/0062/date new file mode 100644 index 00000000..26d2ee87 --- /dev/null +++ b/www/photo.causal.agency/0062/date @@ -0,0 +1 @@ +April 5-6, 2025 diff --git a/www/photo.causal.agency/0062/film b/www/photo.causal.agency/0062/film new file mode 100644 index 00000000..24c56374 --- /dev/null +++ b/www/photo.causal.agency/0062/film @@ -0,0 +1 @@ +Kodak UltraMax 400 diff --git a/www/photo.causal.agency/0062/lens b/www/photo.causal.agency/0062/lens new file mode 100644 index 00000000..3fef9a43 --- /dev/null +++ b/www/photo.causal.agency/0062/lens @@ -0,0 +1 @@ +Konica Hexanon 38mm f/2.8 diff --git a/www/photo.causal.agency/0063/body b/www/photo.causal.agency/0063/body new file mode 100644 index 00000000..3676b877 --- /dev/null +++ b/www/photo.causal.agency/0063/body @@ -0,0 +1 @@ +Konica C35 Automatic diff --git a/www/photo.causal.agency/0063/date b/www/photo.causal.agency/0063/date new file mode 100644 index 00000000..c85682d5 --- /dev/null +++ b/www/photo.causal.agency/0063/date @@ -0,0 +1 @@ +April 6, 2025 diff --git a/www/photo.causal.agency/0063/film b/www/photo.causal.agency/0063/film new file mode 100644 index 00000000..24c56374 --- /dev/null +++ b/www/photo.causal.agency/0063/film @@ -0,0 +1 @@ +Kodak UltraMax 400 diff --git a/www/photo.causal.agency/0063/lens b/www/photo.causal.agency/0063/lens new file mode 100644 index 00000000..3fef9a43 --- /dev/null +++ b/www/photo.causal.agency/0063/lens @@ -0,0 +1 @@ +Konica Hexanon 38mm f/2.8 diff --git a/www/photo.causal.agency/0064/body b/www/photo.causal.agency/0064/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/0064/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/0064/date b/www/photo.causal.agency/0064/date new file mode 100644 index 00000000..f1ec6872 --- /dev/null +++ b/www/photo.causal.agency/0064/date @@ -0,0 +1 @@ +April 4-6, 2025 diff --git a/www/photo.causal.agency/0064/film b/www/photo.causal.agency/0064/film new file mode 100644 index 00000000..42423702 --- /dev/null +++ b/www/photo.causal.agency/0064/film @@ -0,0 +1 @@ +BT21 Star 400 diff --git a/www/photo.causal.agency/0064/lens b/www/photo.causal.agency/0064/lens new file mode 100644 index 00000000..fcf3c232 --- /dev/null +++ b/www/photo.causal.agency/0064/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7, Yashica ML 42-75 f/3.5-4.5 diff --git a/www/photo.causal.agency/0065/body b/www/photo.causal.agency/0065/body new file mode 100644 index 00000000..3676b877 --- /dev/null +++ b/www/photo.causal.agency/0065/body @@ -0,0 +1 @@ +Konica C35 Automatic diff --git a/www/photo.causal.agency/0065/date b/www/photo.causal.agency/0065/date new file mode 100644 index 00000000..de490c39 --- /dev/null +++ b/www/photo.causal.agency/0065/date @@ -0,0 +1 @@ +April 6-12, 2025 diff --git a/www/photo.causal.agency/0065/film b/www/photo.causal.agency/0065/film new file mode 100644 index 00000000..75a90c86 --- /dev/null +++ b/www/photo.causal.agency/0065/film @@ -0,0 +1 @@ +Ilford FP4 Plus 125 diff --git a/www/photo.causal.agency/0065/lens b/www/photo.causal.agency/0065/lens new file mode 100644 index 00000000..3fef9a43 --- /dev/null +++ b/www/photo.causal.agency/0065/lens @@ -0,0 +1 @@ +Konica Hexanon 38mm f/2.8 diff --git a/www/photo.causal.agency/0066/body b/www/photo.causal.agency/0066/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/0066/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/0066/date b/www/photo.causal.agency/0066/date new file mode 100644 index 00000000..803a4b62 --- /dev/null +++ b/www/photo.causal.agency/0066/date @@ -0,0 +1 @@ +April 12, 2025 diff --git a/www/photo.causal.agency/0066/film b/www/photo.causal.agency/0066/film new file mode 100644 index 00000000..f07cfc3e --- /dev/null +++ b/www/photo.causal.agency/0066/film @@ -0,0 +1 @@ +Lomography CN 400 diff --git a/www/photo.causal.agency/0066/lens b/www/photo.causal.agency/0066/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/0066/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 diff --git a/www/photo.causal.agency/0067/body b/www/photo.causal.agency/0067/body new file mode 100644 index 00000000..3676b877 --- /dev/null +++ b/www/photo.causal.agency/0067/body @@ -0,0 +1 @@ +Konica C35 Automatic diff --git a/www/photo.causal.agency/0067/date b/www/photo.causal.agency/0067/date new file mode 100644 index 00000000..bbfc292a --- /dev/null +++ b/www/photo.causal.agency/0067/date @@ -0,0 +1 @@ +April 12-13, 2025 diff --git a/www/photo.causal.agency/0067/film b/www/photo.causal.agency/0067/film new file mode 100644 index 00000000..1a1b1714 --- /dev/null +++ b/www/photo.causal.agency/0067/film @@ -0,0 +1 @@ +Astrum Foto 200 diff --git a/www/photo.causal.agency/0067/lens b/www/photo.causal.agency/0067/lens new file mode 100644 index 00000000..3fef9a43 --- /dev/null +++ b/www/photo.causal.agency/0067/lens @@ -0,0 +1 @@ +Konica Hexanon 38mm f/2.8 diff --git a/www/photo.causal.agency/0068/body b/www/photo.causal.agency/0068/body new file mode 100644 index 00000000..3676b877 --- /dev/null +++ b/www/photo.causal.agency/0068/body @@ -0,0 +1 @@ +Konica C35 Automatic diff --git a/www/photo.causal.agency/0068/date b/www/photo.causal.agency/0068/date new file mode 100644 index 00000000..c460408f --- /dev/null +++ b/www/photo.causal.agency/0068/date @@ -0,0 +1 @@ +April 13-17, 2025 diff --git a/www/photo.causal.agency/0068/film b/www/photo.causal.agency/0068/film new file mode 100644 index 00000000..6227f2a9 --- /dev/null +++ b/www/photo.causal.agency/0068/film @@ -0,0 +1 @@ +Wolfen UN 54 diff --git a/www/photo.causal.agency/0068/lens b/www/photo.causal.agency/0068/lens new file mode 100644 index 00000000..3fef9a43 --- /dev/null +++ b/www/photo.causal.agency/0068/lens @@ -0,0 +1 @@ +Konica Hexanon 38mm f/2.8 diff --git a/www/photo.causal.agency/0069/body b/www/photo.causal.agency/0069/body new file mode 100644 index 00000000..3676b877 --- /dev/null +++ b/www/photo.causal.agency/0069/body @@ -0,0 +1 @@ +Konica C35 Automatic diff --git a/www/photo.causal.agency/0069/date b/www/photo.causal.agency/0069/date new file mode 100644 index 00000000..939dfe29 --- /dev/null +++ b/www/photo.causal.agency/0069/date @@ -0,0 +1 @@ +April 17, 2025 diff --git a/www/photo.causal.agency/0069/film b/www/photo.causal.agency/0069/film new file mode 100644 index 00000000..cb06f7ff --- /dev/null +++ b/www/photo.causal.agency/0069/film @@ -0,0 +1 @@ +Konica VX 400 Super (exp. 2008) diff --git a/www/photo.causal.agency/0069/lens b/www/photo.causal.agency/0069/lens new file mode 100644 index 00000000..3fef9a43 --- /dev/null +++ b/www/photo.causal.agency/0069/lens @@ -0,0 +1 @@ +Konica Hexanon 38mm f/2.8 diff --git a/www/photo.causal.agency/0070/body b/www/photo.causal.agency/0070/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/0070/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/0070/date b/www/photo.causal.agency/0070/date new file mode 100644 index 00000000..d0bfb87b --- /dev/null +++ b/www/photo.causal.agency/0070/date @@ -0,0 +1 @@ +April 18, 2025 diff --git a/www/photo.causal.agency/0070/film b/www/photo.causal.agency/0070/film new file mode 100644 index 00000000..24e393c6 --- /dev/null +++ b/www/photo.causal.agency/0070/film @@ -0,0 +1 @@ +JCH Streetpan 400 diff --git a/www/photo.causal.agency/0070/lens b/www/photo.causal.agency/0070/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/0070/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 diff --git a/www/photo.causal.agency/0071/body b/www/photo.causal.agency/0071/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/0071/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/0071/date b/www/photo.causal.agency/0071/date new file mode 100644 index 00000000..8eaecd35 --- /dev/null +++ b/www/photo.causal.agency/0071/date @@ -0,0 +1 @@ +April 18-20, 2025 diff --git a/www/photo.causal.agency/0071/film b/www/photo.causal.agency/0071/film new file mode 100644 index 00000000..d41d547a --- /dev/null +++ b/www/photo.causal.agency/0071/film @@ -0,0 +1 @@ +Rollei Reinhold 640 diff --git a/www/photo.causal.agency/0071/lens b/www/photo.causal.agency/0071/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/0071/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 diff --git a/www/photo.causal.agency/0072/body b/www/photo.causal.agency/0072/body new file mode 100644 index 00000000..3676b877 --- /dev/null +++ b/www/photo.causal.agency/0072/body @@ -0,0 +1 @@ +Konica C35 Automatic diff --git a/www/photo.causal.agency/0072/date b/www/photo.causal.agency/0072/date new file mode 100644 index 00000000..8eaecd35 --- /dev/null +++ b/www/photo.causal.agency/0072/date @@ -0,0 +1 @@ +April 18-20, 2025 diff --git a/www/photo.causal.agency/0072/film b/www/photo.causal.agency/0072/film new file mode 100644 index 00000000..24c56374 --- /dev/null +++ b/www/photo.causal.agency/0072/film @@ -0,0 +1 @@ +Kodak UltraMax 400 diff --git a/www/photo.causal.agency/0072/lens b/www/photo.causal.agency/0072/lens new file mode 100644 index 00000000..3fef9a43 --- /dev/null +++ b/www/photo.causal.agency/0072/lens @@ -0,0 +1 @@ +Konica Hexanon 38mm f/2.8 diff --git a/www/photo.causal.agency/0073/body b/www/photo.causal.agency/0073/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/0073/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/0073/date b/www/photo.causal.agency/0073/date new file mode 100644 index 00000000..668a1ac5 --- /dev/null +++ b/www/photo.causal.agency/0073/date @@ -0,0 +1 @@ +April 20, 2025 diff --git a/www/photo.causal.agency/0073/film b/www/photo.causal.agency/0073/film new file mode 100644 index 00000000..6968664d --- /dev/null +++ b/www/photo.causal.agency/0073/film @@ -0,0 +1 @@ +Ilford Ortho Plus 80 diff --git a/www/photo.causal.agency/0073/lens b/www/photo.causal.agency/0073/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/0073/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 diff --git a/www/photo.causal.agency/0074/body b/www/photo.causal.agency/0074/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/0074/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/0074/date b/www/photo.causal.agency/0074/date new file mode 100644 index 00000000..0aec6293 --- /dev/null +++ b/www/photo.causal.agency/0074/date @@ -0,0 +1 @@ +April 20-27, 2025 diff --git a/www/photo.causal.agency/0074/film b/www/photo.causal.agency/0074/film new file mode 100644 index 00000000..326aaee3 --- /dev/null +++ b/www/photo.causal.agency/0074/film @@ -0,0 +1 @@ +Wolfen NP100 diff --git a/www/photo.causal.agency/0074/lens b/www/photo.causal.agency/0074/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/0074/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 diff --git a/www/photo.causal.agency/0075/body b/www/photo.causal.agency/0075/body new file mode 100644 index 00000000..3676b877 --- /dev/null +++ b/www/photo.causal.agency/0075/body @@ -0,0 +1 @@ +Konica C35 Automatic diff --git a/www/photo.causal.agency/0075/date b/www/photo.causal.agency/0075/date new file mode 100644 index 00000000..0aec6293 --- /dev/null +++ b/www/photo.causal.agency/0075/date @@ -0,0 +1 @@ +April 20-27, 2025 diff --git a/www/photo.causal.agency/0075/film b/www/photo.causal.agency/0075/film new file mode 100644 index 00000000..dd589471 --- /dev/null +++ b/www/photo.causal.agency/0075/film @@ -0,0 +1 @@ +Harman Phoenix 200 diff --git a/www/photo.causal.agency/0075/lens b/www/photo.causal.agency/0075/lens new file mode 100644 index 00000000..3fef9a43 --- /dev/null +++ b/www/photo.causal.agency/0075/lens @@ -0,0 +1 @@ +Konica Hexanon 38mm f/2.8 diff --git a/www/photo.causal.agency/0076/body b/www/photo.causal.agency/0076/body new file mode 100644 index 00000000..3676b877 --- /dev/null +++ b/www/photo.causal.agency/0076/body @@ -0,0 +1 @@ +Konica C35 Automatic diff --git a/www/photo.causal.agency/0076/date b/www/photo.causal.agency/0076/date new file mode 100644 index 00000000..3a8a41d3 --- /dev/null +++ b/www/photo.causal.agency/0076/date @@ -0,0 +1 @@ +April 27, 2025 diff --git a/www/photo.causal.agency/0076/film b/www/photo.causal.agency/0076/film new file mode 100644 index 00000000..cb06f7ff --- /dev/null +++ b/www/photo.causal.agency/0076/film @@ -0,0 +1 @@ +Konica VX 400 Super (exp. 2008) diff --git a/www/photo.causal.agency/0076/lens b/www/photo.causal.agency/0076/lens new file mode 100644 index 00000000..3fef9a43 --- /dev/null +++ b/www/photo.causal.agency/0076/lens @@ -0,0 +1 @@ +Konica Hexanon 38mm f/2.8 diff --git a/www/photo.causal.agency/0077/body b/www/photo.causal.agency/0077/body new file mode 100644 index 00000000..3676b877 --- /dev/null +++ b/www/photo.causal.agency/0077/body @@ -0,0 +1 @@ +Konica C35 Automatic diff --git a/www/photo.causal.agency/0077/date b/www/photo.causal.agency/0077/date new file mode 100644 index 00000000..a35d7362 --- /dev/null +++ b/www/photo.causal.agency/0077/date @@ -0,0 +1 @@ +April 27 – May 4, 2025 diff --git a/www/photo.causal.agency/0077/film b/www/photo.causal.agency/0077/film new file mode 100644 index 00000000..ffcc1ab6 --- /dev/null +++ b/www/photo.causal.agency/0077/film @@ -0,0 +1 @@ +Flic Film Aurora 400 diff --git a/www/photo.causal.agency/0077/lens b/www/photo.causal.agency/0077/lens new file mode 100644 index 00000000..3fef9a43 --- /dev/null +++ b/www/photo.causal.agency/0077/lens @@ -0,0 +1 @@ +Konica Hexanon 38mm f/2.8 diff --git a/www/photo.causal.agency/0078/body b/www/photo.causal.agency/0078/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/0078/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/0078/date b/www/photo.causal.agency/0078/date new file mode 100644 index 00000000..7e2a323a --- /dev/null +++ b/www/photo.causal.agency/0078/date @@ -0,0 +1 @@ +April 27 – May 3, 2025 diff --git a/www/photo.causal.agency/0078/film b/www/photo.causal.agency/0078/film new file mode 100644 index 00000000..6a2f64b6 --- /dev/null +++ b/www/photo.causal.agency/0078/film @@ -0,0 +1 @@ +AristaEDU Ultra 200 diff --git a/www/photo.causal.agency/0078/lens b/www/photo.causal.agency/0078/lens new file mode 100644 index 00000000..ad833bed --- /dev/null +++ b/www/photo.causal.agency/0078/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7, Yashica ML Macro 55mm f/2.8 diff --git a/www/photo.causal.agency/0079/body b/www/photo.causal.agency/0079/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/0079/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/0079/date b/www/photo.causal.agency/0079/date new file mode 100644 index 00000000..d44c408e --- /dev/null +++ b/www/photo.causal.agency/0079/date @@ -0,0 +1 @@ +May 3, 2025 diff --git a/www/photo.causal.agency/0079/film b/www/photo.causal.agency/0079/film new file mode 100644 index 00000000..7438f38e --- /dev/null +++ b/www/photo.causal.agency/0079/film @@ -0,0 +1 @@ +Lucky SHD 400 diff --git a/www/photo.causal.agency/0079/lens b/www/photo.causal.agency/0079/lens new file mode 100644 index 00000000..197595bc --- /dev/null +++ b/www/photo.causal.agency/0079/lens @@ -0,0 +1 @@ +Yashica ML Macro 55mm f/2.8 diff --git a/www/photo.causal.agency/0080/body b/www/photo.causal.agency/0080/body new file mode 100644 index 00000000..3676b877 --- /dev/null +++ b/www/photo.causal.agency/0080/body @@ -0,0 +1 @@ +Konica C35 Automatic diff --git a/www/photo.causal.agency/0080/date b/www/photo.causal.agency/0080/date new file mode 100644 index 00000000..17eb8868 --- /dev/null +++ b/www/photo.causal.agency/0080/date @@ -0,0 +1 @@ +May 4-14, 2025 diff --git a/www/photo.causal.agency/0080/film b/www/photo.causal.agency/0080/film new file mode 100644 index 00000000..a87ca638 --- /dev/null +++ b/www/photo.causal.agency/0080/film @@ -0,0 +1 @@ +Konica 400 VX Super (exp. 2005) diff --git a/www/photo.causal.agency/0080/lens b/www/photo.causal.agency/0080/lens new file mode 100644 index 00000000..3fef9a43 --- /dev/null +++ b/www/photo.causal.agency/0080/lens @@ -0,0 +1 @@ +Konica Hexanon 38mm f/2.8 diff --git a/www/photo.causal.agency/0080/note b/www/photo.causal.agency/0080/note new file mode 100644 index 00000000..72945eda --- /dev/null +++ b/www/photo.causal.agency/0080/note @@ -0,0 +1,3 @@ +first roll I didn't even have the lab scan as a backup! +shot at EI 100 and clearly overexposed. +is the one-stop-per-decade rule even real? diff --git a/www/photo.causal.agency/2024-04-10/IMG_0832.txt b/www/photo.causal.agency/2024-04-10/IMG_0832.txt new file mode 100644 index 00000000..65724024 --- /dev/null +++ b/www/photo.causal.agency/2024-04-10/IMG_0832.txt @@ -0,0 +1,6 @@ +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 new file mode 100644 index 00000000..4cbb3def --- /dev/null +++ b/www/photo.causal.agency/2024-04-10/IMG_0850.txt @@ -0,0 +1,6 @@ +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 new file mode 100644 index 00000000..707d7cd6 --- /dev/null +++ b/www/photo.causal.agency/2024-04-10/IMG_0852.txt @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000..42f243e4 --- /dev/null +++ b/www/photo.causal.agency/2024-04-10/IMG_0858.txt @@ -0,0 +1,6 @@ +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 new file mode 100644 index 00000000..ca33d7e0 --- /dev/null +++ b/www/photo.causal.agency/2024-04-10/IMG_0859.txt @@ -0,0 +1,6 @@ +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 new file mode 100644 index 00000000..7a955fc2 --- /dev/null +++ b/www/photo.causal.agency/2024-04-10/IMG_0865.txt @@ -0,0 +1,2 @@ +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 new file mode 100644 index 00000000..9d2cdc43 --- /dev/null +++ b/www/photo.causal.agency/2024-04-10/IMG_0890.txt @@ -0,0 +1,9 @@ +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 new file mode 100644 index 00000000..f4803ee2 --- /dev/null +++ b/www/photo.causal.agency/2024-04-14/IMG_1054.txt @@ -0,0 +1,5 @@ +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 new file mode 100644 index 00000000..21aeb189 --- /dev/null +++ b/www/photo.causal.agency/2024-04-14/IMG_1058.txt @@ -0,0 +1,6 @@ +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 new file mode 100644 index 00000000..81747287 --- /dev/null +++ b/www/photo.causal.agency/2024-04-14/IMG_1066.txt @@ -0,0 +1,10 @@ +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 new file mode 100644 index 00000000..e18bd6c7 --- /dev/null +++ b/www/photo.causal.agency/2024-04-19/IMG_1158.txt @@ -0,0 +1,6 @@ +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 new file mode 100644 index 00000000..525a4bf3 --- /dev/null +++ b/www/photo.causal.agency/2024-04-20/IMG_1225.txt @@ -0,0 +1,8 @@ +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 new file mode 100644 index 00000000..faee1be9 --- /dev/null +++ b/www/photo.causal.agency/2024-04-20/IMG_1234.txt @@ -0,0 +1,8 @@ +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 new file mode 100644 index 00000000..c971da91 --- /dev/null +++ b/www/photo.causal.agency/2024-04-20/IMG_1245.txt @@ -0,0 +1,17 @@ +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 new file mode 100644 index 00000000..5158c533 --- /dev/null +++ b/www/photo.causal.agency/2024-04-20/IMG_1253.txt @@ -0,0 +1,7 @@ +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 new file mode 100644 index 00000000..4780f8b5 --- /dev/null +++ b/www/photo.causal.agency/2024-04-20/IMG_1254.txt @@ -0,0 +1,8 @@ +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 new file mode 100644 index 00000000..27f87311 --- /dev/null +++ b/www/photo.causal.agency/2024-04-30/IMG_1619.txt @@ -0,0 +1,8 @@ +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 new file mode 100644 index 00000000..08624d6e --- /dev/null +++ b/www/photo.causal.agency/2024-05-03/IMG_1684.txt @@ -0,0 +1,7 @@ +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 new file mode 100644 index 00000000..182319f2 --- /dev/null +++ b/www/photo.causal.agency/2024-05-03/IMG_1692.txt @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000..d325d518 --- /dev/null +++ b/www/photo.causal.agency/2024-05-03/IMG_1706.txt @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000..2dd5bb3d --- /dev/null +++ b/www/photo.causal.agency/2024-05-03/IMG_1724.txt @@ -0,0 +1,3 @@ +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 new file mode 100644 index 00000000..ca51034b --- /dev/null +++ b/www/photo.causal.agency/2024-05-03/IMG_1730.txt @@ -0,0 +1,9 @@ +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 new file mode 100644 index 00000000..29bc3a76 --- /dev/null +++ b/www/photo.causal.agency/2024-05-03/IMG_1748.txt @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000..78fe46a7 --- /dev/null +++ b/www/photo.causal.agency/2024-05-06/IMG_1951.txt @@ -0,0 +1,12 @@ +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 new file mode 100644 index 00000000..6276a710 --- /dev/null +++ b/www/photo.causal.agency/2024-05-06/IMG_1969.txt @@ -0,0 +1,7 @@ +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 new file mode 100644 index 00000000..b23e190b --- /dev/null +++ b/www/photo.causal.agency/2024-05-06/IMG_1973.txt @@ -0,0 +1,3 @@ +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 new file mode 100644 index 00000000..ddbc0a2b --- /dev/null +++ b/www/photo.causal.agency/2024-05-06/IMG_1996.txt @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000..42cf62cc --- /dev/null +++ b/www/photo.causal.agency/2024-05-06/IMG_1998.txt @@ -0,0 +1,3 @@ +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 new file mode 100644 index 00000000..60518f52 --- /dev/null +++ b/www/photo.causal.agency/2024-05-06/IMG_2009.txt @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000..48494b77 --- /dev/null +++ b/www/photo.causal.agency/2024-05-06/IMG_2015.txt @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000..5a08757c --- /dev/null +++ b/www/photo.causal.agency/2024-05-31/IMG_2078.txt @@ -0,0 +1,5 @@ +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 new file mode 100644 index 00000000..d88645c5 --- /dev/null +++ b/www/photo.causal.agency/2024-05-31/IMG_2079.txt @@ -0,0 +1,7 @@ +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 new file mode 100644 index 00000000..b8ed4fc5 --- /dev/null +++ b/www/photo.causal.agency/2024-05-31/IMG_2084.txt @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000..26b1e1cd --- /dev/null +++ b/www/photo.causal.agency/2024-05-31/IMG_2103.txt @@ -0,0 +1,8 @@ +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 new file mode 100644 index 00000000..7702a374 --- /dev/null +++ b/www/photo.causal.agency/2024-05-31/IMG_2114.txt @@ -0,0 +1,6 @@ +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-009A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-009A.txt new file mode 100644 index 00000000..7affb93a --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/R1-07534-009A.txt @@ -0,0 +1,9 @@ +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 new file mode 100644 index 00000000..4628a2c2 --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/R1-07534-011A.txt @@ -0,0 +1,6 @@ +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 new file mode 100644 index 00000000..aabe2b40 --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/R1-07534-012A.txt @@ -0,0 +1,9 @@ +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 new file mode 100644 index 00000000..57fb909b --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/R1-07534-015A.txt @@ -0,0 +1,6 @@ +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 new file mode 100644 index 00000000..a5bb9fa0 --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/R1-07534-016A.txt @@ -0,0 +1,5 @@ +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 new file mode 100644 index 00000000..5da2a186 --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/R1-07534-020A.txt @@ -0,0 +1,12 @@ +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 new file mode 100644 index 00000000..d82ec10e --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/R1-07534-024A.txt @@ -0,0 +1,5 @@ +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 new file mode 100644 index 00000000..e891695b --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/R1-07534-026A.txt @@ -0,0 +1,2 @@ +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 new file mode 100644 index 00000000..dd732a64 --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/R1-07534-028A.txt @@ -0,0 +1,5 @@ +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 new file mode 100644 index 00000000..f8be350d --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/R1-07534-030A.txt @@ -0,0 +1,7 @@ +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 new file mode 100644 index 00000000..3614056a --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/R1-07534-031A.txt @@ -0,0 +1,7 @@ +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 new file mode 100644 index 00000000..24678e0f --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/R1-07534-032A.txt @@ -0,0 +1,7 @@ +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 new file mode 100644 index 00000000..b9fbf500 --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/R1-07534-036A.txt @@ -0,0 +1,12 @@ +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 new file mode 100644 index 00000000..0555f564 --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/film @@ -0,0 +1 @@ +Fujifilm 400 diff --git a/www/photo.causal.agency/2024-06-08/lens b/www/photo.causal.agency/2024-06-08/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-06-08/lens @@ -0,0 +1 @@ +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 new file mode 100644 index 00000000..a233035e --- /dev/null +++ b/www/photo.causal.agency/2024-06-12/R1-07671-002A.txt @@ -0,0 +1,14 @@ +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 new file mode 100644 index 00000000..db048266 --- /dev/null +++ b/www/photo.causal.agency/2024-06-12/R1-07671-003A.txt @@ -0,0 +1,6 @@ +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 new file mode 100644 index 00000000..c6e673d9 --- /dev/null +++ b/www/photo.causal.agency/2024-06-12/R1-07671-007A.txt @@ -0,0 +1,5 @@ +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 new file mode 100644 index 00000000..fa47b704 --- /dev/null +++ b/www/photo.causal.agency/2024-06-12/R1-07671-009A.txt @@ -0,0 +1,7 @@ +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 new file mode 100644 index 00000000..c71a81ac --- /dev/null +++ b/www/photo.causal.agency/2024-06-12/R1-07671-010A.txt @@ -0,0 +1,8 @@ +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 new file mode 100644 index 00000000..5d2096fa --- /dev/null +++ b/www/photo.causal.agency/2024-06-12/R1-07671-012A.txt @@ -0,0 +1,3 @@ +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 new file mode 100644 index 00000000..56d6d814 --- /dev/null +++ b/www/photo.causal.agency/2024-06-12/R1-07671-013A.txt @@ -0,0 +1,7 @@ +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 new file mode 100644 index 00000000..a3cb3fcf --- /dev/null +++ b/www/photo.causal.agency/2024-06-12/R1-07671-015A.txt @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000..7c94196c --- /dev/null +++ b/www/photo.causal.agency/2024-06-12/R1-07671-016A.txt @@ -0,0 +1,4 @@ +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-029A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-029A.txt new file mode 100644 index 00000000..c4383804 --- /dev/null +++ b/www/photo.causal.agency/2024-06-12/R1-07671-029A.txt @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000..12b5fc48 --- /dev/null +++ b/www/photo.causal.agency/2024-06-12/R1-07671-031A.txt @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000..0555f564 --- /dev/null +++ b/www/photo.causal.agency/2024-06-12/film @@ -0,0 +1 @@ +Fujifilm 400 diff --git a/www/photo.causal.agency/2024-06-12/lens b/www/photo.causal.agency/2024-06-12/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-06-12/lens @@ -0,0 +1 @@ +Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-06-22/000093910004.txt b/www/photo.causal.agency/2024-06-22/000093910004.txt new file mode 100644 index 00000000..d5678989 --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910004.txt @@ -0,0 +1,5 @@ +the trunk of a large tree, +with two hefty branches +splitting off. +the bark is in vertical lines +with deep texture. diff --git a/www/photo.causal.agency/2024-06-22/000093910008.txt b/www/photo.causal.agency/2024-06-22/000093910008.txt new file mode 100644 index 00000000..33e1f56d --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910008.txt @@ -0,0 +1,3 @@ +a piece of stone on the ground +with moss growing in a little +indent in its side. diff --git a/www/photo.causal.agency/2024-06-22/000093910009.txt b/www/photo.causal.agency/2024-06-22/000093910009.txt new file mode 100644 index 00000000..d67283fe --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910009.txt @@ -0,0 +1,7 @@ +Ayla in a light coloured tshirt, +short jorts, +small backpack, +white baseball cap +from behind walking up stone steps +towards a small stone building +with a green door. diff --git a/www/photo.causal.agency/2024-06-22/000093910014.txt b/www/photo.causal.agency/2024-06-22/000093910014.txt new file mode 100644 index 00000000..1d61a0ca --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910014.txt @@ -0,0 +1,4 @@ +a stone path +leading towards +stone steps leading up +surrounded by trees. diff --git a/www/photo.causal.agency/2024-06-22/000093910015.txt b/www/photo.causal.agency/2024-06-22/000093910015.txt new file mode 100644 index 00000000..8dfe4fdc --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910015.txt @@ -0,0 +1,4 @@ +a view of the montreal skyline +from the lookout on the mountain. +the sky is white. +there is so much film grain. diff --git a/www/photo.causal.agency/2024-06-22/000093910016.txt b/www/photo.causal.agency/2024-06-22/000093910016.txt new file mode 100644 index 00000000..b47910ee --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910016.txt @@ -0,0 +1,2 @@ +a pile of discarded ductwork +and scraps of wood. diff --git a/www/photo.causal.agency/2024-06-22/000093910017.txt b/www/photo.causal.agency/2024-06-22/000093910017.txt new file mode 100644 index 00000000..c96be2fc --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910017.txt @@ -0,0 +1,3 @@ +vines on a telephone pole +in front of a brick building +painted blue. diff --git a/www/photo.causal.agency/2024-06-22/000093910019.txt b/www/photo.causal.agency/2024-06-22/000093910019.txt new file mode 100644 index 00000000..1fc0cccf --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910019.txt @@ -0,0 +1,5 @@ +a selfie in a convex mirror. +the mirror is off to the top right. +I'm wearing a green shirt. +behind me is a somewhat decaying +short brick building. diff --git a/www/photo.causal.agency/2024-06-22/000093910021.txt b/www/photo.causal.agency/2024-06-22/000093910021.txt new file mode 100644 index 00000000..e8e23272 --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910021.txt @@ -0,0 +1,6 @@ +a mismatched arrangement +of rectangular window panes +in a space roughly the size +of a garage door. +it is being slowly reclaimed +by vines and bushes. diff --git a/www/photo.causal.agency/2024-06-22/000093910022.txt b/www/photo.causal.agency/2024-06-22/000093910022.txt new file mode 100644 index 00000000..6040fbc9 --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910022.txt @@ -0,0 +1,4 @@ +a view up between two buildings +at a metal truss in silhouette +against the almost white sky +and some cables running between them. diff --git a/www/photo.causal.agency/2024-06-22/000093910023.txt b/www/photo.causal.agency/2024-06-22/000093910023.txt new file mode 100644 index 00000000..1313869d --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910023.txt @@ -0,0 +1,4 @@ +moss and little plants +growing on pavement in an alley +at the base of rusty metal stairs, +behind which is a large shallow puddle. diff --git a/www/photo.causal.agency/2024-06-22/000093910026.txt b/www/photo.causal.agency/2024-06-22/000093910026.txt new file mode 100644 index 00000000..2a6f4f9f --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910026.txt @@ -0,0 +1,10 @@ +a set of metal doors +in a blue brick building +with what looks like a big duct pipe +above them. +it's not attached to anything +it's just sitting over the doors +like a giant unibrow. +there is a little bridge leading towards the doors. +to the right of the doors +is the address number 2111. diff --git a/www/photo.causal.agency/2024-06-22/000093910027.txt b/www/photo.causal.agency/2024-06-22/000093910027.txt new file mode 100644 index 00000000..fb69223e --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910027.txt @@ -0,0 +1,2 @@ +a cat in an alley, +looking off to the left. diff --git a/www/photo.causal.agency/2024-06-22/000093910031.txt b/www/photo.causal.agency/2024-06-22/000093910031.txt new file mode 100644 index 00000000..b9c53122 --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910031.txt @@ -0,0 +1,3 @@ +a set of metal fence doors +blocking a double-wide staircase +up the side of a building. diff --git a/www/photo.causal.agency/2024-06-22/000093910032.txt b/www/photo.causal.agency/2024-06-22/000093910032.txt new file mode 100644 index 00000000..a0d13629 --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/000093910032.txt @@ -0,0 +1,10 @@ +natural gas pipework +on a beige brick wall. +there is a line of pipe +going horizontal across +the bottom of the frame, +with one pipe coming off +in the middle +and going upwards, +with a zig-zag +and then continuing up at an angle. diff --git a/www/photo.causal.agency/2024-06-22/film b/www/photo.causal.agency/2024-06-22/film new file mode 100644 index 00000000..97a445ae --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/film @@ -0,0 +1 @@ +Shanghai Color Film 400 diff --git a/www/photo.causal.agency/2024-06-22/lens b/www/photo.causal.agency/2024-06-22/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-06-22/lens @@ -0,0 +1 @@ +Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-06-25/000099820005.txt b/www/photo.causal.agency/2024-06-25/000099820005.txt new file mode 100644 index 00000000..4f1f8d0d --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820005.txt @@ -0,0 +1,8 @@ +the side of a building +that's been covered in +some sort of construction fabric, +perhaps tyvek, +then had horizontal boards of wood +nailed over it. +the fabric is torn in places +and hanging down over itself. diff --git a/www/photo.causal.agency/2024-06-25/000099820006.txt b/www/photo.causal.agency/2024-06-25/000099820006.txt new file mode 100644 index 00000000..8cd526f2 --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820006.txt @@ -0,0 +1,7 @@ +the front of a large apartment block +under construction +which hasn't yet +had its exterior wall installed. +there are balcony platforms +jutting out from the building +with no walls or railings. diff --git a/www/photo.causal.agency/2024-06-25/000099820008.txt b/www/photo.causal.agency/2024-06-25/000099820008.txt new file mode 100644 index 00000000..05293f76 --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820008.txt @@ -0,0 +1,9 @@ +a backyard with spiral staircase +descending into it, +a wooden fence +and brick dividing wall, +lights hanging between +the staircase and somewhere unseen. +the back door +has a small "beware of dog" sign +in the bottom corner. diff --git a/www/photo.causal.agency/2024-06-25/000099820010.txt b/www/photo.causal.agency/2024-06-25/000099820010.txt new file mode 100644 index 00000000..e256a668 --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820010.txt @@ -0,0 +1,9 @@ +a low, +short and wide +window into a basement +in a stone wall. +there is a metal grate +in front of the window +with a pattern of three +sideways H shapes +separated by straight vertical bars. diff --git a/www/photo.causal.agency/2024-06-25/000099820011.txt b/www/photo.causal.agency/2024-06-25/000099820011.txt new file mode 100644 index 00000000..d04f2e30 --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820011.txt @@ -0,0 +1,10 @@ +a small horizontal metal door +in a plaster wall +with very flaky paint. +there are two holes +in the small door, +a smaller one in the top left +and a larger one in the bottom right. +there are stars, +possibly stickers, +placed around the opening. diff --git a/www/photo.causal.agency/2024-06-25/000099820012.txt b/www/photo.causal.agency/2024-06-25/000099820012.txt new file mode 100644 index 00000000..03064297 --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820012.txt @@ -0,0 +1,3 @@ +four large flexible fabric tubes +coming out of various windows +in the side of a school building. diff --git a/www/photo.causal.agency/2024-06-25/000099820013.txt b/www/photo.causal.agency/2024-06-25/000099820013.txt new file mode 100644 index 00000000..f46ce8c0 --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820013.txt @@ -0,0 +1,7 @@ +the top of a building +where a weirdly small +cube sticks up above +the rest of the roof, +with a full size window +in the side. +cloudy sky behind the protrusion. diff --git a/www/photo.causal.agency/2024-06-25/000099820018.txt b/www/photo.causal.agency/2024-06-25/000099820018.txt new file mode 100644 index 00000000..cfd4089a --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820018.txt @@ -0,0 +1,5 @@ +a cat sitting up +in the open window +of a weird tall garage extension type thing. +its fur is sticking through the chicken wire +that covers the bottom half of the window. diff --git a/www/photo.causal.agency/2024-06-25/000099820019.txt b/www/photo.causal.agency/2024-06-25/000099820019.txt new file mode 100644 index 00000000..b9c2a31a --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820019.txt @@ -0,0 +1,2 @@ +an automatic sprinkler fire alarm +on an external brick wall. diff --git a/www/photo.causal.agency/2024-06-25/000099820022.txt b/www/photo.causal.agency/2024-06-25/000099820022.txt new file mode 100644 index 00000000..4dd6cc34 --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820022.txt @@ -0,0 +1,4 @@ +a flat trolley +with rope sitting on it. +the floor of the trolley +is warped upwards. diff --git a/www/photo.causal.agency/2024-06-25/000099820023.txt b/www/photo.causal.agency/2024-06-25/000099820023.txt new file mode 100644 index 00000000..ce39c313 --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820023.txt @@ -0,0 +1,3 @@ +a view into the interior courtyard +of an abandoned building +with a haphazardly boarded up window. diff --git a/www/photo.causal.agency/2024-06-25/000099820026.txt b/www/photo.causal.agency/2024-06-25/000099820026.txt new file mode 100644 index 00000000..965f97cc --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820026.txt @@ -0,0 +1,3 @@ +an old style street lamp post +in the middle of some leafy vines +on a wooden alley wall. diff --git a/www/photo.causal.agency/2024-06-25/000099820029.txt b/www/photo.causal.agency/2024-06-25/000099820029.txt new file mode 100644 index 00000000..9a29161d --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820029.txt @@ -0,0 +1,3 @@ +a little lantern house thing +hanging from a tree, +viewed from the corner. diff --git a/www/photo.causal.agency/2024-06-25/000099820033.txt b/www/photo.causal.agency/2024-06-25/000099820033.txt new file mode 100644 index 00000000..5c591d15 --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820033.txt @@ -0,0 +1,3 @@ +some piece of broken mechanical equipment +lying on the ground next to a tree +among little plants. diff --git a/www/photo.causal.agency/2024-06-25/000099820035.txt b/www/photo.causal.agency/2024-06-25/000099820035.txt new file mode 100644 index 00000000..75ff71b5 --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820035.txt @@ -0,0 +1,7 @@ +a cat looking sleepy +lying on a little bench +with a blanket over it +on someone's porch. +behind it is a window +with a cat flap +and to the right is a bicycle. diff --git a/www/photo.causal.agency/2024-06-25/000099820038.txt b/www/photo.causal.agency/2024-06-25/000099820038.txt new file mode 100644 index 00000000..925e3597 --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/000099820038.txt @@ -0,0 +1,5 @@ +mechanical bits +at the bottom corner +of a big metal dumpster bin +you use to dispose of +construction detritus. diff --git a/www/photo.causal.agency/2024-06-25/film b/www/photo.causal.agency/2024-06-25/film new file mode 100644 index 00000000..919ded67 --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/film @@ -0,0 +1 @@ +Ilford HP5 Plus 400 diff --git a/www/photo.causal.agency/2024-06-25/lens b/www/photo.causal.agency/2024-06-25/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-06-25/lens @@ -0,0 +1 @@ +Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-07-01/000099800001.txt b/www/photo.causal.agency/2024-07-01/000099800001.txt new file mode 100644 index 00000000..fe6ea42d --- /dev/null +++ b/www/photo.causal.agency/2024-07-01/000099800001.txt @@ -0,0 +1,11 @@ +a floor of a building raised on stilts, +though they aren't in frame. +it's a beige plaster wall +with a set of doors +in the centre +guarded by just a fence +with no balcony. +the doors are flanked +by windows on either side. +the doors and windows +have oversized outlines in grey. diff --git a/www/photo.causal.agency/2024-07-01/000099800002.txt b/www/photo.causal.agency/2024-07-01/000099800002.txt new file mode 100644 index 00000000..3f06a708 --- /dev/null +++ b/www/photo.causal.agency/2024-07-01/000099800002.txt @@ -0,0 +1,4 @@ +a smashed glass bottle +on the curb. +there are dead leaves +and a tissue mixed in there. diff --git a/www/photo.causal.agency/2024-07-01/000099800007.txt b/www/photo.causal.agency/2024-07-01/000099800007.txt new file mode 100644 index 00000000..955e3e2b --- /dev/null +++ b/www/photo.causal.agency/2024-07-01/000099800007.txt @@ -0,0 +1,4 @@ +vines on a wooden lattice +separating two white garage doors +each with a row of windows +behind grates in their top segments. diff --git a/www/photo.causal.agency/2024-07-01/000099800008.txt b/www/photo.causal.agency/2024-07-01/000099800008.txt new file mode 100644 index 00000000..01949d67 --- /dev/null +++ b/www/photo.causal.agency/2024-07-01/000099800008.txt @@ -0,0 +1,4 @@ +a green leafy plant +on a dark red, almost brown wall. +the paint of the wall is chipped. +the tops of the leaves are directly in the sun. diff --git a/www/photo.causal.agency/2024-07-01/000099800011.txt b/www/photo.causal.agency/2024-07-01/000099800011.txt new file mode 100644 index 00000000..942d94fd --- /dev/null +++ b/www/photo.causal.agency/2024-07-01/000099800011.txt @@ -0,0 +1,3 @@ +some kind of weird bushy thing +on the end of a tree branch +glowing in the sun. diff --git a/www/photo.causal.agency/2024-07-01/000099800017.txt b/www/photo.causal.agency/2024-07-01/000099800017.txt new file mode 100644 index 00000000..eac31685 --- /dev/null +++ b/www/photo.causal.agency/2024-07-01/000099800017.txt @@ -0,0 +1,2 @@ +the side of an old red convertible car. +it seems to be decaying a little bit. diff --git a/www/photo.causal.agency/2024-07-01/000099800020.txt b/www/photo.causal.agency/2024-07-01/000099800020.txt new file mode 100644 index 00000000..0b09138f --- /dev/null +++ b/www/photo.causal.agency/2024-07-01/000099800020.txt @@ -0,0 +1,7 @@ +the front of an old red pickup truck +parked in an alley +surrounded by overgrown plants +indicating it has not moved in a long time. +the spot on the front grill +where the ford badge should be +is empty. diff --git a/www/photo.causal.agency/2024-07-01/000099800021.txt b/www/photo.causal.agency/2024-07-01/000099800021.txt new file mode 100644 index 00000000..09e406bf --- /dev/null +++ b/www/photo.causal.agency/2024-07-01/000099800021.txt @@ -0,0 +1,4 @@ +a stripey cat sneaking +in an alley in front of a wooden fence +and behind a big blue hose +on the ground. diff --git a/www/photo.causal.agency/2024-07-01/film b/www/photo.causal.agency/2024-07-01/film new file mode 100644 index 00000000..dcb63ffb --- /dev/null +++ b/www/photo.causal.agency/2024-07-01/film @@ -0,0 +1 @@ +Kodak Gold 200 diff --git a/www/photo.causal.agency/2024-07-01/lens b/www/photo.causal.agency/2024-07-01/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-07-01/lens @@ -0,0 +1 @@ +Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-07-03/000099800022.txt b/www/photo.causal.agency/2024-07-03/000099800022.txt new file mode 100644 index 00000000..32311eec --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/000099800022.txt @@ -0,0 +1,6 @@ +a large moss-covered rock +with the sun hitting +a surface near the middle. +right in the bottom right +corner beside the rock +is an old discarded soda can. diff --git a/www/photo.causal.agency/2024-07-03/000099800023.txt b/www/photo.causal.agency/2024-07-03/000099800023.txt new file mode 100644 index 00000000..0fa3459e --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/000099800023.txt @@ -0,0 +1,4 @@ +an old discarded soda can +with a faded red label +lying on a bed of dead leaves +next to a large moss-covered rock. diff --git a/www/photo.causal.agency/2024-07-03/000099800032.txt b/www/photo.causal.agency/2024-07-03/000099800032.txt new file mode 100644 index 00000000..6c9606aa --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/000099800032.txt @@ -0,0 +1,9 @@ +view of the richelieu river +from one of the peaks of +mont saint-hilaire. +there is a bridge +crossing the river +and a surrounding town. +the horizon is hazy +fading into an overcast sky +in the distance. diff --git a/www/photo.causal.agency/2024-07-03/000099800036.txt b/www/photo.causal.agency/2024-07-03/000099800036.txt new file mode 100644 index 00000000..1889fdc9 --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/000099800036.txt @@ -0,0 +1,3 @@ +another view of the richelieu river, +looking further into the distance +at mont saint-bruno. diff --git a/www/photo.causal.agency/2024-07-03/000099810001.txt b/www/photo.causal.agency/2024-07-03/000099810001.txt new file mode 100644 index 00000000..d4518651 --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/000099810001.txt @@ -0,0 +1,4 @@ +a view of the richelieu river +between some trees. +the greens are much deeper +on this film stock. diff --git a/www/photo.causal.agency/2024-07-03/000099810002.txt b/www/photo.causal.agency/2024-07-03/000099810002.txt new file mode 100644 index 00000000..4669d861 --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/000099810002.txt @@ -0,0 +1,4 @@ +Ayla on a peak of mont saint-hilaire +looking down at her phone. +she's wearing a pink tshirt +and a white ballcap. diff --git a/www/photo.causal.agency/2024-07-03/000099810008.txt b/www/photo.causal.agency/2024-07-03/000099810008.txt new file mode 100644 index 00000000..9ef302f8 --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/000099810008.txt @@ -0,0 +1,3 @@ +a short wooden signpost +without a sign on it, +planted in a mound of rocks. diff --git a/www/photo.causal.agency/2024-07-03/000099810013.txt b/www/photo.causal.agency/2024-07-03/000099810013.txt new file mode 100644 index 00000000..39f75d2e --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/000099810013.txt @@ -0,0 +1,6 @@ +a view past the river +of the town surrounding it +and the farmland beyond. +the leaves of a tree +in the lower left +are blowing hard in the wind. diff --git a/www/photo.causal.agency/2024-07-03/000099810014.txt b/www/photo.causal.agency/2024-07-03/000099810014.txt new file mode 100644 index 00000000..1a49f2ce --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/000099810014.txt @@ -0,0 +1,7 @@ +view of the road +(and rail?) +leading out of town, +above a wooden sign post +pointing left for "Accueil", +which is like several kilometres +away from this peak. diff --git a/www/photo.causal.agency/2024-07-03/000099810017.txt b/www/photo.causal.agency/2024-07-03/000099810017.txt new file mode 100644 index 00000000..c95c121e --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/000099810017.txt @@ -0,0 +1,6 @@ +view of the richelieu river +snaking away into the distance +from a rocky peak +of mont saint-hilaire. +a small wooden signpost +is stuck into a rock. diff --git a/www/photo.causal.agency/2024-07-03/000099810019.txt b/www/photo.causal.agency/2024-07-03/000099810019.txt new file mode 100644 index 00000000..a2e47562 --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/000099810019.txt @@ -0,0 +1,5 @@ +a view of the richelieu river +to the north. +the town on this side +appears to have many cookie-cutter houses. +there is farmland not far beyond. diff --git a/www/photo.causal.agency/2024-07-03/000099810021.txt b/www/photo.causal.agency/2024-07-03/000099810021.txt new file mode 100644 index 00000000..64537e52 --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/000099810021.txt @@ -0,0 +1,4 @@ +a large bird of prey +gliding across the horizon +with the town below +and the river to the left. diff --git a/www/photo.causal.agency/2024-07-03/000099810022.txt b/www/photo.causal.agency/2024-07-03/000099810022.txt new file mode 100644 index 00000000..2dbaabd3 --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/000099810022.txt @@ -0,0 +1,4 @@ +a view from one peak, +across another covered in trees, +to the river, town and farmland +in the distance. diff --git a/www/photo.causal.agency/2024-07-03/film b/www/photo.causal.agency/2024-07-03/film new file mode 100644 index 00000000..eca5ad01 --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/film @@ -0,0 +1 @@ +Kodak Gold 200, Harman Phoenix 200 diff --git a/www/photo.causal.agency/2024-07-03/lens b/www/photo.causal.agency/2024-07-03/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-07-03/lens @@ -0,0 +1 @@ +Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-07-04/000099810029.txt b/www/photo.causal.agency/2024-07-04/000099810029.txt new file mode 100644 index 00000000..d3201be9 --- /dev/null +++ b/www/photo.causal.agency/2024-07-04/000099810029.txt @@ -0,0 +1,6 @@ +a cluster of small pink flowers +on a bush. +there are other clusters in the background. +one is nearer to the camera +but only some of its buds +have started blooming. diff --git a/www/photo.causal.agency/2024-07-04/000099810033.txt b/www/photo.causal.agency/2024-07-04/000099810033.txt new file mode 100644 index 00000000..da44c8ce --- /dev/null +++ b/www/photo.causal.agency/2024-07-04/000099810033.txt @@ -0,0 +1,6 @@ +a brick house crowded by trees. +the front face is painted a light blue. +there's a tall narrow window +above a garage door, +and a balcony +with some cloth draped over its railing. diff --git a/www/photo.causal.agency/2024-07-04/000099810036.txt b/www/photo.causal.agency/2024-07-04/000099810036.txt new file mode 100644 index 00000000..fa3bba11 --- /dev/null +++ b/www/photo.causal.agency/2024-07-04/000099810036.txt @@ -0,0 +1,2 @@ +a standard issue red fire hydrant +crowded by green leaves. diff --git a/www/photo.causal.agency/2024-07-04/film b/www/photo.causal.agency/2024-07-04/film new file mode 100644 index 00000000..dd589471 --- /dev/null +++ b/www/photo.causal.agency/2024-07-04/film @@ -0,0 +1 @@ +Harman Phoenix 200 diff --git a/www/photo.causal.agency/2024-07-04/lens b/www/photo.causal.agency/2024-07-04/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-07-04/lens @@ -0,0 +1 @@ +Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-07-06/000005110004.txt b/www/photo.causal.agency/2024-07-06/000005110004.txt new file mode 100644 index 00000000..67518ba3 --- /dev/null +++ b/www/photo.causal.agency/2024-07-06/000005110004.txt @@ -0,0 +1,8 @@ +view looking up +at the corner of a weird bit +of a house's balcony type thing. +the top edge of the roof +extends over the edge of the inset balcony. +I have no idea how to explain it. +there are trees around it +and sky behind it. diff --git a/www/photo.causal.agency/2024-07-06/000005110005.txt b/www/photo.causal.agency/2024-07-06/000005110005.txt new file mode 100644 index 00000000..5ce7cd82 --- /dev/null +++ b/www/photo.causal.agency/2024-07-06/000005110005.txt @@ -0,0 +1,5 @@ +two small shattered lightbulbs +on a sidewalk. +they appear to be actual bulbs +surrounded by plastic, +and it's the plastic that's shattered. diff --git a/www/photo.causal.agency/2024-07-06/000005110012.txt b/www/photo.causal.agency/2024-07-06/000005110012.txt new file mode 100644 index 00000000..89e6e8df --- /dev/null +++ b/www/photo.causal.agency/2024-07-06/000005110012.txt @@ -0,0 +1,3 @@ +the reflection of +a big concrete block factory-turned-office building +in a large puddle. diff --git a/www/photo.causal.agency/2024-07-06/000005110013.txt b/www/photo.causal.agency/2024-07-06/000005110013.txt new file mode 100644 index 00000000..75fc3284 --- /dev/null +++ b/www/photo.causal.agency/2024-07-06/000005110013.txt @@ -0,0 +1,7 @@ +an unnecessarily large concrete block +of a building +that I'm pretty sure was once factories +but is now office space. +there are two sections about 11 storeys tall +separated by a narrow section +that is only 3. diff --git a/www/photo.causal.agency/2024-07-06/000005110014.txt b/www/photo.causal.agency/2024-07-06/000005110014.txt new file mode 100644 index 00000000..bf423e19 --- /dev/null +++ b/www/photo.causal.agency/2024-07-06/000005110014.txt @@ -0,0 +1,3 @@ +a view close to the ground +on some railroad tracks +right before they go around a bend. diff --git a/www/photo.causal.agency/2024-07-06/000005110017.txt b/www/photo.causal.agency/2024-07-06/000005110017.txt new file mode 100644 index 00000000..ea58b0bb --- /dev/null +++ b/www/photo.causal.agency/2024-07-06/000005110017.txt @@ -0,0 +1,2 @@ +a broken wooden picture frame +on a wet sidewalk diff --git a/www/photo.causal.agency/2024-07-06/film b/www/photo.causal.agency/2024-07-06/film new file mode 100644 index 00000000..919ded67 --- /dev/null +++ b/www/photo.causal.agency/2024-07-06/film @@ -0,0 +1 @@ +Ilford HP5 Plus 400 diff --git a/www/photo.causal.agency/2024-07-06/lens b/www/photo.causal.agency/2024-07-06/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-07-06/lens @@ -0,0 +1 @@ +Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-07-09/000005110025.txt b/www/photo.causal.agency/2024-07-09/000005110025.txt new file mode 100644 index 00000000..ecc57512 --- /dev/null +++ b/www/photo.causal.agency/2024-07-09/000005110025.txt @@ -0,0 +1,5 @@ +close up of a a flower +with a bee on it. +the bee is reaching down +between the petals +and you can see its fuzzy butt. diff --git a/www/photo.causal.agency/2024-07-09/000005110026.txt b/www/photo.causal.agency/2024-07-09/000005110026.txt new file mode 100644 index 00000000..fe3296d2 --- /dev/null +++ b/www/photo.causal.agency/2024-07-09/000005110026.txt @@ -0,0 +1,8 @@ +the top edge of +the corner of a stone building +covered in vines. +there are two pillars +going up towards the top. +the left one is covered in vines +and the right one is bare. +between the pillars is the top of a window. diff --git a/www/photo.causal.agency/2024-07-09/000005110028.txt b/www/photo.causal.agency/2024-07-09/000005110028.txt new file mode 100644 index 00000000..1e808379 --- /dev/null +++ b/www/photo.causal.agency/2024-07-09/000005110028.txt @@ -0,0 +1,3 @@ +a small bird perched atop a roof peak, +looking towards me. +I believe this was a cardinal. diff --git a/www/photo.causal.agency/2024-07-09/000005110029.txt b/www/photo.causal.agency/2024-07-09/000005110029.txt new file mode 100644 index 00000000..f5d38a6b --- /dev/null +++ b/www/photo.causal.agency/2024-07-09/000005110029.txt @@ -0,0 +1,9 @@ +the side of a brick building +centred around the brick +bearing the erection year. +the raised portions of the 19 +have fallen off, +and only the 08 is left. +above this is the edge of the roof +and below it are two ornamental bricks +at the tops of windows. diff --git a/www/photo.causal.agency/2024-07-09/000005110030.txt b/www/photo.causal.agency/2024-07-09/000005110030.txt new file mode 100644 index 00000000..cff02d83 --- /dev/null +++ b/www/photo.causal.agency/2024-07-09/000005110030.txt @@ -0,0 +1,5 @@ +close up of a spiky ball flower. +on the left a butterfly is perched on it, +on the bottom right a bee. +there is another spiky ball flower +below the butterfly. diff --git a/www/photo.causal.agency/2024-07-09/000005110033.txt b/www/photo.causal.agency/2024-07-09/000005110033.txt new file mode 100644 index 00000000..688546f6 --- /dev/null +++ b/www/photo.causal.agency/2024-07-09/000005110033.txt @@ -0,0 +1,6 @@ +three vertically stacked power lines +at a junction where two sets +of three smaller cables +go off in opposite directions. +the dark lines contrast nicely +against the lighter background. diff --git a/www/photo.causal.agency/2024-07-09/000005110035.txt b/www/photo.causal.agency/2024-07-09/000005110035.txt new file mode 100644 index 00000000..fb7226c6 --- /dev/null +++ b/www/photo.causal.agency/2024-07-09/000005110035.txt @@ -0,0 +1,6 @@ +a ladder leading to the top of a roof +against the sky. +the ladder is quite a bit taller +than it needs to be +so it ascends into the sky +a little bit. diff --git a/www/photo.causal.agency/2024-07-09/000005110036.txt b/www/photo.causal.agency/2024-07-09/000005110036.txt new file mode 100644 index 00000000..d0628000 --- /dev/null +++ b/www/photo.causal.agency/2024-07-09/000005110036.txt @@ -0,0 +1,8 @@ +the column of bricks +that was once a chimney +on the side of a triangular roofed house. +the bricks are painted a light colour +but it is peeling in many places. +there is one of those wireframe +rectangular sort of satellite dish things +on the side of the column. diff --git a/www/photo.causal.agency/2024-07-09/film b/www/photo.causal.agency/2024-07-09/film new file mode 100644 index 00000000..919ded67 --- /dev/null +++ b/www/photo.causal.agency/2024-07-09/film @@ -0,0 +1 @@ +Ilford HP5 Plus 400 diff --git a/www/photo.causal.agency/2024-07-09/lens b/www/photo.causal.agency/2024-07-09/lens new file mode 100644 index 00000000..96b4d0a0 --- /dev/null +++ b/www/photo.causal.agency/2024-07-09/lens @@ -0,0 +1 @@ +Osawa MC 70–210mm ƒ/4–5 diff --git a/www/photo.causal.agency/2024-07-14/000009180002.txt b/www/photo.causal.agency/2024-07-14/000009180002.txt new file mode 100644 index 00000000..57ce6c98 --- /dev/null +++ b/www/photo.causal.agency/2024-07-14/000009180002.txt @@ -0,0 +1,3 @@ +a big red flower +in the centre of the frame +with a dark green blurred background. diff --git a/www/photo.causal.agency/2024-07-14/000009180006.txt b/www/photo.causal.agency/2024-07-14/000009180006.txt new file mode 100644 index 00000000..938ec690 --- /dev/null +++ b/www/photo.causal.agency/2024-07-14/000009180006.txt @@ -0,0 +1,10 @@ +a weird plant with +like long stalks of I guess seeds +with little crowns of white flowers on the ends. +the depth of field is really shallow +so they come in and out of focus +from the blurred green background. +in the centre there's a bee +on one of the flowered ends +but it's too close to the camera +it's not in focus. diff --git a/www/photo.causal.agency/2024-07-14/000009180010.txt b/www/photo.causal.agency/2024-07-14/000009180010.txt new file mode 100644 index 00000000..f1e891de --- /dev/null +++ b/www/photo.causal.agency/2024-07-14/000009180010.txt @@ -0,0 +1,8 @@ +two windows at the top of a plateau building. +the base of the building is green brick +and the top roof part is orange shingles +that appear very shiny in this photo. +the windows set into the shingled part +have big flattened triangle +thingies on top. +made of wood, you know. diff --git a/www/photo.causal.agency/2024-07-14/000009180014.txt b/www/photo.causal.agency/2024-07-14/000009180014.txt new file mode 100644 index 00000000..bf98a26b --- /dev/null +++ b/www/photo.causal.agency/2024-07-14/000009180014.txt @@ -0,0 +1,3 @@ +close up of an orange and white cat's head +looking away from the camera +on a blurred green background. diff --git a/www/photo.causal.agency/2024-07-14/000009180020.txt b/www/photo.causal.agency/2024-07-14/000009180020.txt new file mode 100644 index 00000000..1f3763ae --- /dev/null +++ b/www/photo.causal.agency/2024-07-14/000009180020.txt @@ -0,0 +1,11 @@ +a flower cluster +in the shape of a ball +where all the tiny flowers +come out of a centre point +on long stems. +the flowers themselves +are either green or closed. +the depth of field is shallow +so there's a nice effect +as the stems pop out +at different angles to the lens. diff --git a/www/photo.causal.agency/2024-07-14/000009180023.txt b/www/photo.causal.agency/2024-07-14/000009180023.txt new file mode 100644 index 00000000..3cc28e4d --- /dev/null +++ b/www/photo.causal.agency/2024-07-14/000009180023.txt @@ -0,0 +1,5 @@ +an array of small whitish flowers +some of which are too close to the camera +to be in focus +and some of which are too far from the camera +to be in focus. diff --git a/www/photo.causal.agency/2024-07-14/000009180025.txt b/www/photo.causal.agency/2024-07-14/000009180025.txt new file mode 100644 index 00000000..6f0e7e9c --- /dev/null +++ b/www/photo.causal.agency/2024-07-14/000009180025.txt @@ -0,0 +1,6 @@ +a building extension +whose exterior walls +are made of severely rusting metal. +the building is viewed from its corner, +looking at its top +against a blue sky. diff --git a/www/photo.causal.agency/2024-07-14/000009180028.txt b/www/photo.causal.agency/2024-07-14/000009180028.txt new file mode 100644 index 00000000..5dcc0fa4 --- /dev/null +++ b/www/photo.causal.agency/2024-07-14/000009180028.txt @@ -0,0 +1,3 @@ +a painted spiral staircase +enclosed on three sides +by exterior walls. diff --git a/www/photo.causal.agency/2024-07-14/film b/www/photo.causal.agency/2024-07-14/film new file mode 100644 index 00000000..dd589471 --- /dev/null +++ b/www/photo.causal.agency/2024-07-14/film @@ -0,0 +1 @@ +Harman Phoenix 200 diff --git a/www/photo.causal.agency/2024-07-14/lens b/www/photo.causal.agency/2024-07-14/lens new file mode 100644 index 00000000..96b4d0a0 --- /dev/null +++ b/www/photo.causal.agency/2024-07-14/lens @@ -0,0 +1 @@ +Osawa MC 70–210mm ƒ/4–5 diff --git a/www/photo.causal.agency/2024-07-27/000025480003.txt b/www/photo.causal.agency/2024-07-27/000025480003.txt new file mode 100644 index 00000000..159a8688 --- /dev/null +++ b/www/photo.causal.agency/2024-07-27/000025480003.txt @@ -0,0 +1,5 @@ +geese on the water. +there's a group of three in the foreground. +two on the left have their heads underwater +and the one on the right looks like it's about to stick its head under. +there are a handful more in the background. diff --git a/www/photo.causal.agency/2024-07-27/000025480009.txt b/www/photo.causal.agency/2024-07-27/000025480009.txt new file mode 100644 index 00000000..53856b80 --- /dev/null +++ b/www/photo.causal.agency/2024-07-27/000025480009.txt @@ -0,0 +1,2 @@ +a green buoy in the middle of the river. +the far shore is rocky with some trees. diff --git a/www/photo.causal.agency/2024-07-27/000025480010.txt b/www/photo.causal.agency/2024-07-27/000025480010.txt new file mode 100644 index 00000000..8d46b7f5 --- /dev/null +++ b/www/photo.causal.agency/2024-07-27/000025480010.txt @@ -0,0 +1,5 @@ +the jacques-cartier bridge +viewed from a perpendicular angle, +right at the middle of it. +a roller coaster can be seen behind it on the right +and a cargo boat on the left. diff --git a/www/photo.causal.agency/2024-07-27/000025480012.txt b/www/photo.causal.agency/2024-07-27/000025480012.txt new file mode 100644 index 00000000..34555365 --- /dev/null +++ b/www/photo.causal.agency/2024-07-27/000025480012.txt @@ -0,0 +1,7 @@ +an outdoor electrical outlet +mounted on a big piece of stone, +nestled in a corner +made by other big pieces of stone. +there are pine needles and white fluff +on the ground in front of it. +its door has come off. diff --git a/www/photo.causal.agency/2024-07-27/film b/www/photo.causal.agency/2024-07-27/film new file mode 100644 index 00000000..97a445ae --- /dev/null +++ b/www/photo.causal.agency/2024-07-27/film @@ -0,0 +1 @@ +Shanghai Color Film 400 diff --git a/www/photo.causal.agency/2024-07-27/lens b/www/photo.causal.agency/2024-07-27/lens new file mode 100644 index 00000000..96b4d0a0 --- /dev/null +++ b/www/photo.causal.agency/2024-07-27/lens @@ -0,0 +1 @@ +Osawa MC 70–210mm ƒ/4–5 diff --git a/www/photo.causal.agency/2024-07-29/000025480014.txt b/www/photo.causal.agency/2024-07-29/000025480014.txt new file mode 100644 index 00000000..7d3094e0 --- /dev/null +++ b/www/photo.causal.agency/2024-07-29/000025480014.txt @@ -0,0 +1,3 @@ +a green spiral metal staircase +going up a brick wall +absolutely covered in leafy vines. diff --git a/www/photo.causal.agency/2024-07-29/000025480017.txt b/www/photo.causal.agency/2024-07-29/000025480017.txt new file mode 100644 index 00000000..19137d80 --- /dev/null +++ b/www/photo.causal.agency/2024-07-29/000025480017.txt @@ -0,0 +1,5 @@ +the back or side of a building, +probably a short office building, +with columns of windows +separated by uh, +protruding bits of the building. diff --git a/www/photo.causal.agency/2024-07-29/000025480018.txt b/www/photo.causal.agency/2024-07-29/000025480018.txt new file mode 100644 index 00000000..2712fe2f --- /dev/null +++ b/www/photo.causal.agency/2024-07-29/000025480018.txt @@ -0,0 +1,5 @@ +the top edge of a building, +including power line pole +on the roof, +metal beam sticking out the side, +and a little stone chimney. diff --git a/www/photo.causal.agency/2024-07-29/000025480028.txt b/www/photo.causal.agency/2024-07-29/000025480028.txt new file mode 100644 index 00000000..0a56a06c --- /dev/null +++ b/www/photo.causal.agency/2024-07-29/000025480028.txt @@ -0,0 +1,11 @@ +a view all the way up the side +of an old brick factory building, +7 storeys tall. +all of the windows on the far right +have been filled in with cement. +some of the other windows +have been filled in with +what looks like corrugated metal. +some of the remaining windows +are the original 6x3 pane +and some are single pane. diff --git a/www/photo.causal.agency/2024-07-29/000025480030.txt b/www/photo.causal.agency/2024-07-29/000025480030.txt new file mode 100644 index 00000000..3ac51b0d --- /dev/null +++ b/www/photo.causal.agency/2024-07-29/000025480030.txt @@ -0,0 +1,21 @@ +the intersection or interior corner +of old brick factory buildings. +we're sort of looking at a vertical W shape, +with two buildings on either side +at a right angle, +and one corner peice of building +jutting out between the other two. +the old factory windows +of these buildings +are in various states of boarded up +or filled in with concrete +or left as-is. +there are pipes and ducts and conduits +crawling all over the buildings. +the right side wall +of the middle building piece +is covered in leafy vines. +the middle section +is shorter than the others +and light is coming over top of it +hitting the leftmost building. diff --git a/www/photo.causal.agency/2024-07-29/000025480033.txt b/www/photo.causal.agency/2024-07-29/000025480033.txt new file mode 100644 index 00000000..41594319 --- /dev/null +++ b/www/photo.causal.agency/2024-07-29/000025480033.txt @@ -0,0 +1,7 @@ +detail of the centre corner piece of building +from the previous photo, +with pipes going up along +the left building where it intersects +with the middle building, +and a conduit going across +the top of where the vines reach. diff --git a/www/photo.causal.agency/2024-07-29/000025480034.txt b/www/photo.causal.agency/2024-07-29/000025480034.txt new file mode 100644 index 00000000..8a2c3227 --- /dev/null +++ b/www/photo.causal.agency/2024-07-29/000025480034.txt @@ -0,0 +1,8 @@ +part of an old factory building, +a storey or two up. +what used to be a window +has been filled in with big grey stone bricks, +but the metal cage over the outside +has been left in place. +a whole array of pipes climbs +the building to the left. diff --git a/www/photo.causal.agency/2024-07-29/000025480035.txt b/www/photo.causal.agency/2024-07-29/000025480035.txt new file mode 100644 index 00000000..4ec13a5e --- /dev/null +++ b/www/photo.causal.agency/2024-07-29/000025480035.txt @@ -0,0 +1,7 @@ +the intersection of some old brick factory buildings. +windows are variously boarded up or filled in. +one of the walls has leafy vines climbing up it, +stopping at a conduit that's going across. +a large duct goes up the building +next to the vines. +light is pouring over the top edge of the building. diff --git a/www/photo.causal.agency/2024-07-29/000025480036.txt b/www/photo.causal.agency/2024-07-29/000025480036.txt new file mode 100644 index 00000000..0554a5de --- /dev/null +++ b/www/photo.causal.agency/2024-07-29/000025480036.txt @@ -0,0 +1,15 @@ +the brick wall of an old factory building +with sets of 6x4 pane windows, +where it looks like the middle 4x2 +panes swivel open. +a round duct or chimney +has been installed +in one of the lower windows +and goes up the outside of the building. +two of the other windows +have been filled in, +one with brick +and one with metal. +they both have vents embedded in them. +an array of pipes climbs halfway up +the far right edge of this wall. diff --git a/www/photo.causal.agency/2024-07-29/film b/www/photo.causal.agency/2024-07-29/film new file mode 100644 index 00000000..97a445ae --- /dev/null +++ b/www/photo.causal.agency/2024-07-29/film @@ -0,0 +1 @@ +Shanghai Color Film 400 diff --git a/www/photo.causal.agency/2024-07-29/lens b/www/photo.causal.agency/2024-07-29/lens new file mode 100644 index 00000000..705b4e57 --- /dev/null +++ b/www/photo.causal.agency/2024-07-29/lens @@ -0,0 +1 @@ +Yashica ML Zoom 28–85mm ƒ/3.5–4.5 diff --git a/www/photo.causal.agency/2024-07-30/000025490001.txt b/www/photo.causal.agency/2024-07-30/000025490001.txt new file mode 100644 index 00000000..290ac209 --- /dev/null +++ b/www/photo.causal.agency/2024-07-30/000025490001.txt @@ -0,0 +1,2 @@ +two empty swings in a park. +beyond there is a bench and a trash can. diff --git a/www/photo.causal.agency/2024-07-30/000025490002.txt b/www/photo.causal.agency/2024-07-30/000025490002.txt new file mode 100644 index 00000000..5554d178 --- /dev/null +++ b/www/photo.causal.agency/2024-07-30/000025490002.txt @@ -0,0 +1,4 @@ +some sort of small power station type building. +its address is 4131, +and there's a lamp above that number. +to the right there's a fenced off area. diff --git a/www/photo.causal.agency/2024-07-30/000025490003.txt b/www/photo.causal.agency/2024-07-30/000025490003.txt new file mode 100644 index 00000000..4b2573af --- /dev/null +++ b/www/photo.causal.agency/2024-07-30/000025490003.txt @@ -0,0 +1,2 @@ +some round white paper lantern type things +hanging under an elevated deck. diff --git a/www/photo.causal.agency/2024-07-30/000025490004.txt b/www/photo.causal.agency/2024-07-30/000025490004.txt new file mode 100644 index 00000000..81409be3 --- /dev/null +++ b/www/photo.causal.agency/2024-07-30/000025490004.txt @@ -0,0 +1,6 @@ +two wooden construction barriers at angles to each other +at the edge of a park. +neither are supported on both sides. +one is coming towards the camera, +the other is going across. +it says ABF on it. diff --git a/www/photo.causal.agency/2024-07-30/000025490009.txt b/www/photo.causal.agency/2024-07-30/000025490009.txt new file mode 100644 index 00000000..6e38b667 --- /dev/null +++ b/www/photo.causal.agency/2024-07-30/000025490009.txt @@ -0,0 +1,4 @@ +a series of 4 power line poles +in close proximity +against a grey sky +in front of a completely shadowed building. diff --git a/www/photo.causal.agency/2024-07-30/000025490010.txt b/www/photo.causal.agency/2024-07-30/000025490010.txt new file mode 100644 index 00000000..75853ca8 --- /dev/null +++ b/www/photo.causal.agency/2024-07-30/000025490010.txt @@ -0,0 +1,3 @@ +an empty field with some sort of small tripod structure +in the middle. +beyond it are condo buildings. diff --git a/www/photo.causal.agency/2024-07-30/000025490012.txt b/www/photo.causal.agency/2024-07-30/000025490012.txt new file mode 100644 index 00000000..6d3bc3c4 --- /dev/null +++ b/www/photo.causal.agency/2024-07-30/000025490012.txt @@ -0,0 +1,5 @@ +a public pool in a park +at night illuminated by flood light above. +in the centre of the frame +are two diving boards side by side +with metal railings. diff --git a/www/photo.causal.agency/2024-07-30/000025490014.txt b/www/photo.causal.agency/2024-07-30/000025490014.txt new file mode 100644 index 00000000..a85000f9 --- /dev/null +++ b/www/photo.causal.agency/2024-07-30/000025490014.txt @@ -0,0 +1,5 @@ +a blinking red traffic light suspended above an intersection. +it's completely dark +except for the traffic light +and some other source in the bottom left. +the shape of a building and tree can be made out. diff --git a/www/photo.causal.agency/2024-07-30/film b/www/photo.causal.agency/2024-07-30/film new file mode 100644 index 00000000..919ded67 --- /dev/null +++ b/www/photo.causal.agency/2024-07-30/film @@ -0,0 +1 @@ +Ilford HP5 Plus 400 diff --git a/www/photo.causal.agency/2024-07-30/lens b/www/photo.causal.agency/2024-07-30/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-07-30/lens @@ -0,0 +1 @@ +Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-08-02/000025490019.txt b/www/photo.causal.agency/2024-08-02/000025490019.txt new file mode 100644 index 00000000..b8e3a89f --- /dev/null +++ b/www/photo.causal.agency/2024-08-02/000025490019.txt @@ -0,0 +1,5 @@ +close up of a bundle of small pipes +that come up out of the ground +around person height +and curve downwards at the top, +with the ends covered by a rough metal mesh. diff --git a/www/photo.causal.agency/2024-08-02/000025490026.txt b/www/photo.causal.agency/2024-08-02/000025490026.txt new file mode 100644 index 00000000..dd5049e7 --- /dev/null +++ b/www/photo.causal.agency/2024-08-02/000025490026.txt @@ -0,0 +1,5 @@ +the side of a concrete building +with an intricate pattern +of concrete and narrow windows. +the windows are reflecting a light sky. +good contrast and shadows here. diff --git a/www/photo.causal.agency/2024-08-02/000025490027.txt b/www/photo.causal.agency/2024-08-02/000025490027.txt new file mode 100644 index 00000000..15d6847a --- /dev/null +++ b/www/photo.causal.agency/2024-08-02/000025490027.txt @@ -0,0 +1,6 @@ +a wider view of +the side of a concrete building +with an intricate pattern +of concrete and narrow windows. +the windows are reflecting a light sky. +good contrast and shadows here. diff --git a/www/photo.causal.agency/2024-08-02/000025490029.txt b/www/photo.causal.agency/2024-08-02/000025490029.txt new file mode 100644 index 00000000..f9f86887 --- /dev/null +++ b/www/photo.causal.agency/2024-08-02/000025490029.txt @@ -0,0 +1,6 @@ +the back of a haphazard +building extension +with walls of corrugated metal, +vines growing lazily all over it. +the right side appears to +be covered only by a canvas roof. diff --git a/www/photo.causal.agency/2024-08-02/000025490030.txt b/www/photo.causal.agency/2024-08-02/000025490030.txt new file mode 100644 index 00000000..eb7a4b13 --- /dev/null +++ b/www/photo.causal.agency/2024-08-02/000025490030.txt @@ -0,0 +1,5 @@ +a metal cylinder +with a thick cable going through it +suspended against a brick wall +by a smaller steel cable +bolted into the wall. diff --git a/www/photo.causal.agency/2024-08-02/000025490031.txt b/www/photo.causal.agency/2024-08-02/000025490031.txt new file mode 100644 index 00000000..3a6e576e --- /dev/null +++ b/www/photo.causal.agency/2024-08-02/000025490031.txt @@ -0,0 +1,4 @@ +the shallow sloped roof +of a house with a single window +protruding from it on the right. +trees beyond the roof. diff --git a/www/photo.causal.agency/2024-08-02/000025490035.txt b/www/photo.causal.agency/2024-08-02/000025490035.txt new file mode 100644 index 00000000..60ac4e32 --- /dev/null +++ b/www/photo.causal.agency/2024-08-02/000025490035.txt @@ -0,0 +1,7 @@ +the side of a brick building +that is featureless until a couple storeys up +where there are squares of glass cube grids +with small actuall windows +embedded in them off-centre. +the windows are separated by columns of bricks +that go down the outside of the building. diff --git a/www/photo.causal.agency/2024-08-02/000025490036.txt b/www/photo.causal.agency/2024-08-02/000025490036.txt new file mode 100644 index 00000000..4de137fb --- /dev/null +++ b/www/photo.causal.agency/2024-08-02/000025490036.txt @@ -0,0 +1,11 @@ +the cube. +the rectangle. +it's a modern part of a building +that's been added onto over time. +and it's just a big rectangle +with like a dev texture on it +and some weirdly placed windows. +we're looking up at it +from an angle +and the sun is hitting the top corner of it. +it looks imposing. diff --git a/www/photo.causal.agency/2024-08-02/film b/www/photo.causal.agency/2024-08-02/film new file mode 100644 index 00000000..919ded67 --- /dev/null +++ b/www/photo.causal.agency/2024-08-02/film @@ -0,0 +1 @@ +Ilford HP5 Plus 400 diff --git a/www/photo.causal.agency/2024-08-02/lens b/www/photo.causal.agency/2024-08-02/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-08-02/lens @@ -0,0 +1 @@ +Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-08-10/000031420002.txt b/www/photo.causal.agency/2024-08-10/000031420002.txt new file mode 100644 index 00000000..e9eac877 --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420002.txt @@ -0,0 +1,5 @@ +close up of a bundle of small pipes +that come up out of the ground around person height +and curve downwards at the top, +with the ends covered by a rough metal mesh. +they're sort of pale greenish coloured. diff --git a/www/photo.causal.agency/2024-08-10/000031420005.txt b/www/photo.causal.agency/2024-08-10/000031420005.txt new file mode 100644 index 00000000..dbc7c12a --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420005.txt @@ -0,0 +1,4 @@ +a big bush of yellow flowers +with flat petals that don't touch +and big brown balls in the centre. +they're glowing in the sunlight. diff --git a/www/photo.causal.agency/2024-08-10/000031420007.txt b/www/photo.causal.agency/2024-08-10/000031420007.txt new file mode 100644 index 00000000..6138ee21 --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420007.txt @@ -0,0 +1,3 @@ +one big flower with white petals +that are deep red only right near the centre +and a long plant reproductive bit. diff --git a/www/photo.causal.agency/2024-08-10/000031420011.txt b/www/photo.causal.agency/2024-08-10/000031420011.txt new file mode 100644 index 00000000..4dcc7c39 --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420011.txt @@ -0,0 +1,2 @@ +a cat lying down in an alley next to a little ball, +looking at the camera. diff --git a/www/photo.causal.agency/2024-08-10/000031420012.txt b/www/photo.causal.agency/2024-08-10/000031420012.txt new file mode 100644 index 00000000..3d0b928c --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420012.txt @@ -0,0 +1,4 @@ +close up of a cat in an alley +with its eyes closed. +it's lying next to a small ball. +it has thumbs! diff --git a/www/photo.causal.agency/2024-08-10/000031420015.txt b/www/photo.causal.agency/2024-08-10/000031420015.txt new file mode 100644 index 00000000..7c116097 --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420015.txt @@ -0,0 +1,4 @@ +the top of a discarded hot water tank +with two severed pipes coming out. +the top appears green, +though it may have been blue. diff --git a/www/photo.causal.agency/2024-08-10/000031420016.txt b/www/photo.causal.agency/2024-08-10/000031420016.txt new file mode 100644 index 00000000..ea0af1e7 --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420016.txt @@ -0,0 +1,8 @@ +what is perhaps a planter +among overgrowing plants, +with two little wagon wheels +seemingly broken off. +one is leaning against the near side +of the planter +and the other is flat on the ground +half under it. diff --git a/www/photo.causal.agency/2024-08-10/000031420020.txt b/www/photo.causal.agency/2024-08-10/000031420020.txt new file mode 100644 index 00000000..8ce4c5c1 --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420020.txt @@ -0,0 +1,2 @@ +power lines atop a wooden pole with 3 drums +against a blue sky with white clouds. diff --git a/www/photo.causal.agency/2024-08-10/000031420024.txt b/www/photo.causal.agency/2024-08-10/000031420024.txt new file mode 100644 index 00000000..6d4ec555 --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420024.txt @@ -0,0 +1,3 @@ +a street lamp in an alley +under the shade of a tree +with two large spherical lamps. diff --git a/www/photo.causal.agency/2024-08-10/000031420026.txt b/www/photo.causal.agency/2024-08-10/000031420026.txt new file mode 100644 index 00000000..77297a74 --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420026.txt @@ -0,0 +1,3 @@ +a big ball of clustered tiny white flowers +glowing in the sun +on a bright blue sky. diff --git a/www/photo.causal.agency/2024-08-10/000031420027.txt b/www/photo.causal.agency/2024-08-10/000031420027.txt new file mode 100644 index 00000000..d31920e8 --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420027.txt @@ -0,0 +1,8 @@ +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". +the car is in worse shape +than the last time I photographed it. diff --git a/www/photo.causal.agency/2024-08-10/000031420028.txt b/www/photo.causal.agency/2024-08-10/000031420028.txt new file mode 100644 index 00000000..e4cbd11f --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420028.txt @@ -0,0 +1,2 @@ +the steering wheel of an old presumably european car +that has been left to rot in an alley. diff --git a/www/photo.causal.agency/2024-08-10/000031420029.txt b/www/photo.causal.agency/2024-08-10/000031420029.txt new file mode 100644 index 00000000..ea3361fb --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420029.txt @@ -0,0 +1,3 @@ +a discarded bicycle tire +in front of a mound of dirt and dead leaves +in an alley. diff --git a/www/photo.causal.agency/2024-08-10/000031420034.txt b/www/photo.causal.agency/2024-08-10/000031420034.txt new file mode 100644 index 00000000..542924f3 --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/000031420034.txt @@ -0,0 +1,4 @@ +the top halves of some classic plateau rowhouses +against a light blue sky with some clouds. +the top windows are painted in a sequence of +dark purple, orange, dark green, some kind of red. diff --git a/www/photo.causal.agency/2024-08-10/body b/www/photo.causal.agency/2024-08-10/body new file mode 100644 index 00000000..1828b2a2 --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/body @@ -0,0 +1 @@ +Zenit-122 diff --git a/www/photo.causal.agency/2024-08-10/film b/www/photo.causal.agency/2024-08-10/film new file mode 100644 index 00000000..dd589471 --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/film @@ -0,0 +1 @@ +Harman Phoenix 200 diff --git a/www/photo.causal.agency/2024-08-10/lens b/www/photo.causal.agency/2024-08-10/lens new file mode 100644 index 00000000..dcd0812c --- /dev/null +++ b/www/photo.causal.agency/2024-08-10/lens @@ -0,0 +1 @@ +Helios-44M-5 58mm ƒ/2 diff --git a/www/photo.causal.agency/2024-08-22/000044750004.txt b/www/photo.causal.agency/2024-08-22/000044750004.txt new file mode 100644 index 00000000..a6d758bd --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/000044750004.txt @@ -0,0 +1,2 @@ +a broken and fallen limb of a tree +laying in a puddle in an alley. diff --git a/www/photo.causal.agency/2024-08-22/000044750007.txt b/www/photo.causal.agency/2024-08-22/000044750007.txt new file mode 100644 index 00000000..faf48f72 --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/000044750007.txt @@ -0,0 +1,7 @@ +some kind of motor +attached to some kind of machinery. +it looks like a cable runs +from a box on its sidee +to another box not far +with what looks like +an ordinary light switch on it. diff --git a/www/photo.causal.agency/2024-08-22/000044750008.txt b/www/photo.causal.agency/2024-08-22/000044750008.txt new file mode 100644 index 00000000..1475b9e1 --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/000044750008.txt @@ -0,0 +1,3 @@ +wrought iron fence detail. +it's got swirly bits +and squiggly pointy bits. diff --git a/www/photo.causal.agency/2024-08-22/000044750009.txt b/www/photo.causal.agency/2024-08-22/000044750009.txt new file mode 100644 index 00000000..a8c887cc --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/000044750009.txt @@ -0,0 +1,2 @@ +wider view of wrought iron fence +showing two instances of its repeated pattern. diff --git a/www/photo.causal.agency/2024-08-22/000044750010.txt b/www/photo.causal.agency/2024-08-22/000044750010.txt new file mode 100644 index 00000000..8e275e06 --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/000044750010.txt @@ -0,0 +1,3 @@ +a bike locked to a fence +being overgrown by bushes +and weeds and other plants. diff --git a/www/photo.causal.agency/2024-08-22/000044750013.txt b/www/photo.causal.agency/2024-08-22/000044750013.txt new file mode 100644 index 00000000..d89c3ac1 --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/000044750013.txt @@ -0,0 +1,5 @@ +a bee sitting on a flower +that has thin sort of curled up petals +spaced far apart. +sort of looks like the bee +is humping the middle of the flower. diff --git a/www/photo.causal.agency/2024-08-22/000044750014.txt b/www/photo.causal.agency/2024-08-22/000044750014.txt new file mode 100644 index 00000000..0e591c1f --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/000044750014.txt @@ -0,0 +1,8 @@ +a metal frame structure +in the shape of half a cyllinder +suspended, +presumably over a walkway, +on square concrete pillars. +the pillars have three notches +in them near the top. +this is just outside a large stone building. diff --git a/www/photo.causal.agency/2024-08-22/000044750016.txt b/www/photo.causal.agency/2024-08-22/000044750016.txt new file mode 100644 index 00000000..ef9a68a3 --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/000044750016.txt @@ -0,0 +1,7 @@ +the top of a large building +with a pointed roof. +some of the windows are intact +while some have beams of wood +across them on the outside +seemingly holding boards of wood +against the insides? diff --git a/www/photo.causal.agency/2024-08-22/000044750024.txt b/www/photo.causal.agency/2024-08-22/000044750024.txt new file mode 100644 index 00000000..b3c14768 --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/000044750024.txt @@ -0,0 +1,6 @@ +a single cable, +probably telephone, +suspended by a pole +in an upside-down L shape +with a truss between +the two pieces. diff --git a/www/photo.causal.agency/2024-08-22/000044750027.txt b/www/photo.causal.agency/2024-08-22/000044750027.txt new file mode 100644 index 00000000..3c614db2 --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/000044750027.txt @@ -0,0 +1,5 @@ +a weird cube of building +covered in a metal diamond tiling pattern +with one wide window in the side +and some cables under tension +going down it. diff --git a/www/photo.causal.agency/2024-08-22/000044750028.txt b/www/photo.causal.agency/2024-08-22/000044750028.txt new file mode 100644 index 00000000..f6998321 --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/000044750028.txt @@ -0,0 +1,3 @@ +a row of back to back park benches +among trees continuing +into the distance away to the right. diff --git a/www/photo.causal.agency/2024-08-22/body b/www/photo.causal.agency/2024-08-22/body new file mode 100644 index 00000000..1828b2a2 --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/body @@ -0,0 +1 @@ +Zenit-122 diff --git a/www/photo.causal.agency/2024-08-22/film b/www/photo.causal.agency/2024-08-22/film new file mode 100644 index 00000000..919ded67 --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/film @@ -0,0 +1 @@ +Ilford HP5 Plus 400 diff --git a/www/photo.causal.agency/2024-08-22/lens b/www/photo.causal.agency/2024-08-22/lens new file mode 100644 index 00000000..dcd0812c --- /dev/null +++ b/www/photo.causal.agency/2024-08-22/lens @@ -0,0 +1 @@ +Helios-44M-5 58mm ƒ/2 diff --git a/www/photo.causal.agency/2024-08-23/000044740001.txt b/www/photo.causal.agency/2024-08-23/000044740001.txt new file mode 100644 index 00000000..dcc7e42f --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/000044740001.txt @@ -0,0 +1,8 @@ +an old-style metal lamp post +on a solid wooden fence +with vines growing over it. +the left side of the frame +and the bottom and top edges +have red light bleeding into them +from the film being exposed +during loading. diff --git a/www/photo.causal.agency/2024-08-23/000044740002.txt b/www/photo.causal.agency/2024-08-23/000044740002.txt new file mode 100644 index 00000000..821c0b5b --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/000044740002.txt @@ -0,0 +1,5 @@ +a view down an alley +past a tree with hanging leaves. +bright sunlight is +coming through a branch +off the alley to the left. diff --git a/www/photo.causal.agency/2024-08-23/000044740010.txt b/www/photo.causal.agency/2024-08-23/000044740010.txt new file mode 100644 index 00000000..428ffe8f --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/000044740010.txt @@ -0,0 +1,5 @@ +close up of a cluster +of some kind of berries +on a plant with nice green leaves. +the stems appear red +and the berries a dark blue. diff --git a/www/photo.causal.agency/2024-08-23/000044740014.txt b/www/photo.causal.agency/2024-08-23/000044740014.txt new file mode 100644 index 00000000..f04e5615 --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/000044740014.txt @@ -0,0 +1,4 @@ +a big tall tree +with branches that +all point very upwards +rather than outwards. diff --git a/www/photo.causal.agency/2024-08-23/000044740017.txt b/www/photo.causal.agency/2024-08-23/000044740017.txt new file mode 100644 index 00000000..ac8e4ba9 --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/000044740017.txt @@ -0,0 +1,2 @@ +the top half of a big tree +with many branching thick limbs. diff --git a/www/photo.causal.agency/2024-08-23/000044740021.txt b/www/photo.causal.agency/2024-08-23/000044740021.txt new file mode 100644 index 00000000..6ee78b65 --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/000044740021.txt @@ -0,0 +1,5 @@ +view up at a huge old stone building +with lots of 3D shape going on +and lots of windows. +past it is a blue sky +with a big white fluffy cloud. diff --git a/www/photo.causal.agency/2024-08-23/000044740024.txt b/www/photo.causal.agency/2024-08-23/000044740024.txt new file mode 100644 index 00000000..f344f290 --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/000044740024.txt @@ -0,0 +1,8 @@ +a completely empty bit of +road or parking lot +surrounded by trees, +curving away and downward in the distance. +on one side, +behind construction fences, +there's a tall street light +with a blue P-5 sign attached. diff --git a/www/photo.causal.agency/2024-08-23/000044740030.txt b/www/photo.causal.agency/2024-08-23/000044740030.txt new file mode 100644 index 00000000..42d3ef1a --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/000044740030.txt @@ -0,0 +1,8 @@ +a wide set of concrete stairs +divided by 4 sets of white metal railings +ascending out into the sun +from under a low concrete ceiling +with a large square grid pattern. +the ceiling is being lit +by a sort of bluish-green light +from behind. diff --git a/www/photo.causal.agency/2024-08-23/000044740031.txt b/www/photo.causal.agency/2024-08-23/000044740031.txt new file mode 100644 index 00000000..e566e86f --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/000044740031.txt @@ -0,0 +1,4 @@ +a tall brutalist-ish apartment building +on a mostly clear blue sky, +with one white cloud in the bottom left. +the building appears orange. diff --git a/www/photo.causal.agency/2024-08-23/000044740033.txt b/www/photo.causal.agency/2024-08-23/000044740033.txt new file mode 100644 index 00000000..44d1d1f5 --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/000044740033.txt @@ -0,0 +1,6 @@ +the back of an old brick building +that is probably being renovated. +the ground is descending +behind the building as if to underground parking, +and there is a space for a door +that is blocked with plywood. diff --git a/www/photo.causal.agency/2024-08-23/000044740034.txt b/www/photo.causal.agency/2024-08-23/000044740034.txt new file mode 100644 index 00000000..5492db03 --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/000044740034.txt @@ -0,0 +1,6 @@ +looking up at an old red brick building +from the ground. +there are three rows of windows. +there are also two doors +with no handles and little square windows +that would open onto nothing. diff --git a/www/photo.causal.agency/2024-08-23/000044740035.txt b/www/photo.causal.agency/2024-08-23/000044740035.txt new file mode 100644 index 00000000..3cf7a14f --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/000044740035.txt @@ -0,0 +1,4 @@ +a pile of palettes stacked with slabs of stone +sitting at the side of a brick building. +based on how plants are growing around them, +they haven't been touched in a while. diff --git a/www/photo.causal.agency/2024-08-23/000044740036.txt b/www/photo.causal.agency/2024-08-23/000044740036.txt new file mode 100644 index 00000000..c87ba240 --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/000044740036.txt @@ -0,0 +1,14 @@ +the back of a very strange +residential building +that's clearly been built onto. +on the right is a regular red wooden door. +on the left is a painted brown metal door +with a circular window in it +like a porthole. +this is at the bottom of a metal column, +presumably containing stairs, +with one more porthole +not far above the door. +slid right between this weird extension +and the side of the adjacent building +is a very tall ladder. diff --git a/www/photo.causal.agency/2024-08-23/body b/www/photo.causal.agency/2024-08-23/body new file mode 100644 index 00000000..6a2a5ad8 --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/body @@ -0,0 +1 @@ +Yashica FX-2 diff --git a/www/photo.causal.agency/2024-08-23/film b/www/photo.causal.agency/2024-08-23/film new file mode 100644 index 00000000..2340483a --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/film @@ -0,0 +1 @@ +Film Washi “X” 100 diff --git a/www/photo.causal.agency/2024-08-23/lens b/www/photo.causal.agency/2024-08-23/lens new file mode 100644 index 00000000..465336d3 --- /dev/null +++ b/www/photo.causal.agency/2024-08-23/lens @@ -0,0 +1 @@ +Makinon 28mm ƒ/2.8 diff --git a/www/photo.causal.agency/2024-08-24/000044730001.txt b/www/photo.causal.agency/2024-08-24/000044730001.txt new file mode 100644 index 00000000..9481f22a --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/000044730001.txt @@ -0,0 +1,6 @@ +overhead lines for electric trains +silhouetted against a blue sky. +there's a train partially visible +behind a concrete barrier. +there's a pentagonal lens flare +in the sky. diff --git a/www/photo.causal.agency/2024-08-24/000044730002.txt b/www/photo.causal.agency/2024-08-24/000044730002.txt new file mode 100644 index 00000000..c2290e3c --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/000044730002.txt @@ -0,0 +1,4 @@ +overhead lines for electric trains +silhouetted against a blue sky +with sparse clouds +as a train goes past. diff --git a/www/photo.causal.agency/2024-08-24/000044730004.txt b/www/photo.causal.agency/2024-08-24/000044730004.txt new file mode 100644 index 00000000..5874fc87 --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/000044730004.txt @@ -0,0 +1,5 @@ +a vast and empty parking lot +under a blue sky with clouds in the distance. +the parking lot extends at an angle +away from a crosswalk in the foreground. +behind the lot is a large shed. diff --git a/www/photo.causal.agency/2024-08-24/000044730008.txt b/www/photo.causal.agency/2024-08-24/000044730008.txt new file mode 100644 index 00000000..86ac6f65 --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/000044730008.txt @@ -0,0 +1,6 @@ +a vast and empty parking lot +under a blue sky fading into clouds. +we are looking down a line of crosswalks +that cross the lot. +there are rows of young trees +and lots of signs on metal poles. diff --git a/www/photo.causal.agency/2024-08-24/000044730012.txt b/www/photo.causal.agency/2024-08-24/000044730012.txt new file mode 100644 index 00000000..6311d731 --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/000044730012.txt @@ -0,0 +1,3 @@ +some sort of device atop +overhead lines for electric trains +against a grey-blue sky. diff --git a/www/photo.causal.agency/2024-08-24/000044730014.txt b/www/photo.causal.agency/2024-08-24/000044730014.txt new file mode 100644 index 00000000..96e5e4dd --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/000044730014.txt @@ -0,0 +1,3 @@ +train tracks with overhead lines +inside a fenced area. +there are three parallel tracks. diff --git a/www/photo.causal.agency/2024-08-24/000044730018.txt b/www/photo.causal.agency/2024-08-24/000044730018.txt new file mode 100644 index 00000000..ae0ea59d --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/000044730018.txt @@ -0,0 +1,4 @@ +the wall of the base under a track, +close at the left side of the frame +and quickly stretching into the distance +to the right. diff --git a/www/photo.causal.agency/2024-08-24/000044730026.txt b/www/photo.causal.agency/2024-08-24/000044730026.txt new file mode 100644 index 00000000..d646f8e5 --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/000044730026.txt @@ -0,0 +1,8 @@ +the inside of a train station, +with walls of orange-brown tile. +there is a stairway leading up to the left, +and one in shadow at the end of a short tunnel +to the right. +in the centre is a green sign +pointing up the left stairs towards +quai 1 and quai 3. diff --git a/www/photo.causal.agency/2024-08-24/000044730028.txt b/www/photo.causal.agency/2024-08-24/000044730028.txt new file mode 100644 index 00000000..3978d978 --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/000044730028.txt @@ -0,0 +1,2 @@ +the tops of grass that has grown untended +and has produced seeds and gone yellow/brown. diff --git a/www/photo.causal.agency/2024-08-24/000044730029.txt b/www/photo.causal.agency/2024-08-24/000044730029.txt new file mode 100644 index 00000000..52d3c975 --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/000044730029.txt @@ -0,0 +1,2 @@ +a short set of curved wooden steps +surrounded by leaves. diff --git a/www/photo.causal.agency/2024-08-24/000044730030.txt b/www/photo.causal.agency/2024-08-24/000044730030.txt new file mode 100644 index 00000000..de6ef2ff --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/000044730030.txt @@ -0,0 +1 @@ +close up of a cluster of little pink flowers. diff --git a/www/photo.causal.agency/2024-08-24/000044730035.txt b/www/photo.causal.agency/2024-08-24/000044730035.txt new file mode 100644 index 00000000..70b7e7ef --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/000044730035.txt @@ -0,0 +1,4 @@ +an orange and white cat sitting in an alley +looking off to the left. +it's got a collar on +with a little heard shaped tag on it. diff --git a/www/photo.causal.agency/2024-08-24/body b/www/photo.causal.agency/2024-08-24/body new file mode 100644 index 00000000..1828b2a2 --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/body @@ -0,0 +1 @@ +Zenit-122 diff --git a/www/photo.causal.agency/2024-08-24/film b/www/photo.causal.agency/2024-08-24/film new file mode 100644 index 00000000..dd589471 --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/film @@ -0,0 +1 @@ +Harman Phoenix 200 diff --git a/www/photo.causal.agency/2024-08-24/lens b/www/photo.causal.agency/2024-08-24/lens new file mode 100644 index 00000000..19fafffb --- /dev/null +++ b/www/photo.causal.agency/2024-08-24/lens @@ -0,0 +1 @@ +Takumar 35mm ƒ/3.5, Helios-44M-5 58mm ƒ/2 diff --git a/www/photo.causal.agency/2024-08-29/000054970002.txt b/www/photo.causal.agency/2024-08-29/000054970002.txt new file mode 100644 index 00000000..e58bb3c3 --- /dev/null +++ b/www/photo.causal.agency/2024-08-29/000054970002.txt @@ -0,0 +1,3 @@ +reflection of trees and sky +in water with ripples +at early evening. diff --git a/www/photo.causal.agency/2024-08-29/000054970004.txt b/www/photo.causal.agency/2024-08-29/000054970004.txt new file mode 100644 index 00000000..b8ca6fc6 --- /dev/null +++ b/www/photo.causal.agency/2024-08-29/000054970004.txt @@ -0,0 +1,5 @@ +rough concrete blocks +stacked 3 by 3 except +the top right one is missing. +they're heavily weathered +and have trees overhanging them. diff --git a/www/photo.causal.agency/2024-08-29/body b/www/photo.causal.agency/2024-08-29/body new file mode 100644 index 00000000..6a2a5ad8 --- /dev/null +++ b/www/photo.causal.agency/2024-08-29/body @@ -0,0 +1 @@ +Yashica FX-2 diff --git a/www/photo.causal.agency/2024-08-29/film b/www/photo.causal.agency/2024-08-29/film new file mode 100644 index 00000000..dd589471 --- /dev/null +++ b/www/photo.causal.agency/2024-08-29/film @@ -0,0 +1 @@ +Harman Phoenix 200 diff --git a/www/photo.causal.agency/2024-08-29/lens b/www/photo.causal.agency/2024-08-29/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-08-29/lens @@ -0,0 +1 @@ +Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-09-02/000054970017.txt b/www/photo.causal.agency/2024-09-02/000054970017.txt new file mode 100644 index 00000000..a90825a9 --- /dev/null +++ b/www/photo.causal.agency/2024-09-02/000054970017.txt @@ -0,0 +1,11 @@ +a block of windows in a school building, +viewed from a slight angle. +the wall of the building is beige brick +and the block of windows +is bordered by grey stone. +there are two rows of windows, +and below each row are panels that appear brown, +though they're orange in person. +the top row of windows +is reflecting some blue sky and clouds, +while the bottom row is reflecting only cloud. diff --git a/www/photo.causal.agency/2024-09-02/000054970018.txt b/www/photo.causal.agency/2024-09-02/000054970018.txt new file mode 100644 index 00000000..db65ac6c --- /dev/null +++ b/www/photo.causal.agency/2024-09-02/000054970018.txt @@ -0,0 +1,7 @@ +a row of three benches on the front lawn of a school building. +each bench is separated by bushes and trees. +they're made up of planks of wood painted blue +bolted to concrete supports. +the school building behind them is beige brick +and there are window AC units installed +in each window of the second floor. diff --git a/www/photo.causal.agency/2024-09-02/000054970019.txt b/www/photo.causal.agency/2024-09-02/000054970019.txt new file mode 100644 index 00000000..18b9c733 --- /dev/null +++ b/www/photo.causal.agency/2024-09-02/000054970019.txt @@ -0,0 +1,6 @@ +numerous stacks of wooden picnic tables +on a lawn of grass in front of some trees. +most of the stacks are piled three high, +some four. +the light coming through the branches and leaves +of the trees in the background is glowing gold. diff --git a/www/photo.causal.agency/2024-09-02/000054970021.txt b/www/photo.causal.agency/2024-09-02/000054970021.txt new file mode 100644 index 00000000..2aac2c6f --- /dev/null +++ b/www/photo.causal.agency/2024-09-02/000054970021.txt @@ -0,0 +1,11 @@ +fancy windows on the side of a school building. +it's a repeating pattern of three windows +in the middle of a house-shaped design +of yellow panels on the second floor. +the middle windows are higher than the other two. +the triangle at the top of the window design +is followed by the profile of the roof. +below that, separated by a row of even short windows, +are red panels. +the upper windows are reflecting blue sky and clouds, +while the lower red panels are reflecting trees and clouds. diff --git a/www/photo.causal.agency/2024-09-02/000054970022.txt b/www/photo.causal.agency/2024-09-02/000054970022.txt new file mode 100644 index 00000000..df959a2c --- /dev/null +++ b/www/photo.causal.agency/2024-09-02/000054970022.txt @@ -0,0 +1,3 @@ +a light brown or beige brick school building +with its rows of windows. +the trim around the windows is sort of red-brown. diff --git a/www/photo.causal.agency/2024-09-02/000054970023.txt b/www/photo.causal.agency/2024-09-02/000054970023.txt new file mode 100644 index 00000000..976a4054 --- /dev/null +++ b/www/photo.causal.agency/2024-09-02/000054970023.txt @@ -0,0 +1,3 @@ +a haphazard pile of broken and discarded park benches. +they're nice ones made of wooden slats and black metal supports. +some are nice warm brown and others are more grey. diff --git a/www/photo.causal.agency/2024-09-02/000054970029.txt b/www/photo.causal.agency/2024-09-02/000054970029.txt new file mode 100644 index 00000000..53907b76 --- /dev/null +++ b/www/photo.causal.agency/2024-09-02/000054970029.txt @@ -0,0 +1,6 @@ +the wall of some kind of concrete structure +surrounding a big white metal tank. +I think the wall is actually metal, +but the outline of the structure is concrete. +it's got a lot of interesting marks and texture on it. +it's very hard to describe. diff --git a/www/photo.causal.agency/2024-09-02/body b/www/photo.causal.agency/2024-09-02/body new file mode 100644 index 00000000..6a2a5ad8 --- /dev/null +++ b/www/photo.causal.agency/2024-09-02/body @@ -0,0 +1 @@ +Yashica FX-2 diff --git a/www/photo.causal.agency/2024-09-02/film b/www/photo.causal.agency/2024-09-02/film new file mode 100644 index 00000000..dd589471 --- /dev/null +++ b/www/photo.causal.agency/2024-09-02/film @@ -0,0 +1 @@ +Harman Phoenix 200 diff --git a/www/photo.causal.agency/2024-09-02/lens b/www/photo.causal.agency/2024-09-02/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-09-02/lens @@ -0,0 +1 @@ +Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-09-05/06124000003.txt b/www/photo.causal.agency/2024-09-05/06124000003.txt new file mode 100644 index 00000000..7b3b59e9 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000003.txt @@ -0,0 +1,6 @@ +looking up at the corner of a grey office building +of at least 18 floors that we can see, +on a clear blue sky. +the sun is on the left, +illuminating that side of the building brightly +and leaving the other side in relative shadow. diff --git a/www/photo.causal.agency/2024-09-05/06124000009.txt b/www/photo.causal.agency/2024-09-05/06124000009.txt new file mode 100644 index 00000000..acee212d --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000009.txt @@ -0,0 +1,5 @@ +a huge dark brown brick building +that is part of a hospital complex. +it is in the sun, +but the smaller building behind the camera +is casting a big shadow in the middle. diff --git a/www/photo.causal.agency/2024-09-05/06124000010.txt b/www/photo.causal.agency/2024-09-05/06124000010.txt new file mode 100644 index 00000000..d280e6b5 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000010.txt @@ -0,0 +1,3 @@ +some really tall, thin trees +with branches only really high up. +their dark green leaves are against a bright sky. diff --git a/www/photo.causal.agency/2024-09-05/06124000014.txt b/www/photo.causal.agency/2024-09-05/06124000014.txt new file mode 100644 index 00000000..b45b6c58 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000014.txt @@ -0,0 +1,4 @@ +nine small square windows in a grid +on a brown brick wall. +a conduit runs under them +with a light on either side. diff --git a/www/photo.causal.agency/2024-09-05/06124000017.txt b/www/photo.causal.agency/2024-09-05/06124000017.txt new file mode 100644 index 00000000..8b4d2ae5 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000017.txt @@ -0,0 +1,4 @@ +a closeup of some old walkup stairs. +the metal frame of the staircase is rusted +and the wooden steps are decaying. +they were once painted but almost all of it has come off. diff --git a/www/photo.causal.agency/2024-09-05/06124000018.txt b/www/photo.causal.agency/2024-09-05/06124000018.txt new file mode 100644 index 00000000..0a184588 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000018.txt @@ -0,0 +1,5 @@ +a covered driveway under a building. +the near wall is in shadow +but the sun is playing nicely on the far part, +out from the covered portion. +beyond is a tree and a wooden fence. diff --git a/www/photo.causal.agency/2024-09-05/06124000023.txt b/www/photo.causal.agency/2024-09-05/06124000023.txt new file mode 100644 index 00000000..655ad84e --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000023.txt @@ -0,0 +1,5 @@ +a brick wall that has a hole in it, +which is covered by wooden planks, +except bricks are missing from below it, +and generally don't seem to be holding together. +all of that behind a chain link fence right in front of it. diff --git a/www/photo.causal.agency/2024-09-05/06124000024.txt b/www/photo.causal.agency/2024-09-05/06124000024.txt new file mode 100644 index 00000000..65ff67be --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000024.txt @@ -0,0 +1,5 @@ +a grey utility door on the back of a building +below ground level, +surrounded by vegetation on all sides, +and a little white wooden fence +to the left. diff --git a/www/photo.causal.agency/2024-09-05/06124000025.txt b/www/photo.causal.agency/2024-09-05/06124000025.txt new file mode 100644 index 00000000..66cb1aaa --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000025.txt @@ -0,0 +1,5 @@ +a metal box affixed to a light brick wall +with the number 1786 in black raised lettering on it. +the surface of the metal is rusting a light orange. +just to the right of the box, +a bundle of black wires climbs straight up the wall. diff --git a/www/photo.causal.agency/2024-09-05/06124000026.txt b/www/photo.causal.agency/2024-09-05/06124000026.txt new file mode 100644 index 00000000..765411fe --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000026.txt @@ -0,0 +1,4 @@ +what may have been a storefront +with the address 1107. +it's a door set into the building +behind a locked metal grate. diff --git a/www/photo.causal.agency/2024-09-05/06124000027.txt b/www/photo.causal.agency/2024-09-05/06124000027.txt new file mode 100644 index 00000000..1695ade9 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000027.txt @@ -0,0 +1,3 @@ +a metal wire sphere +suspended by two crossing metal bars +below some trees. diff --git a/www/photo.causal.agency/2024-09-05/06124000032.txt b/www/photo.causal.agency/2024-09-05/06124000032.txt new file mode 100644 index 00000000..fb83f216 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000032.txt @@ -0,0 +1,4 @@ +looking up at a concrete building in the sun. +it's got a detailed pattern of depth +around the windows. +the sky is blue. diff --git a/www/photo.causal.agency/2024-09-05/06124000033.txt b/www/photo.causal.agency/2024-09-05/06124000033.txt new file mode 100644 index 00000000..fb83f216 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000033.txt @@ -0,0 +1,4 @@ +looking up at a concrete building in the sun. +it's got a detailed pattern of depth +around the windows. +the sky is blue. diff --git a/www/photo.causal.agency/2024-09-05/06124000038.txt b/www/photo.causal.agency/2024-09-05/06124000038.txt new file mode 100644 index 00000000..30c9eb53 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000038.txt @@ -0,0 +1,4 @@ +a selfie in some dirty reflective surface I found on the street. +I’m holding up an analog camera to my face +and wearing a light coloured tshirt and green little shorts. +there’s a blue car behind me. diff --git a/www/photo.causal.agency/2024-09-05/06124000042.txt b/www/photo.causal.agency/2024-09-05/06124000042.txt new file mode 100644 index 00000000..535d76b0 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000042.txt @@ -0,0 +1,3 @@ +the side of an old brick factory building +with a fire escape going up to one window. +the building is in shadow and the sky is white. diff --git a/www/photo.causal.agency/2024-09-05/06124000044.txt b/www/photo.causal.agency/2024-09-05/06124000044.txt new file mode 100644 index 00000000..67ac2df5 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/06124000044.txt @@ -0,0 +1,8 @@ +the back of something like a building over a garage, +with a high short window +and a door with some steps leading down. +the building is mostly in shadow +except an area on the left side of the window, +where the sun must be reflecting off something, +given the orientation of this particular building +and the time of day. diff --git a/www/photo.causal.agency/2024-09-05/body b/www/photo.causal.agency/2024-09-05/body new file mode 100644 index 00000000..6a2a5ad8 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/body @@ -0,0 +1 @@ +Yashica FX-2 diff --git a/www/photo.causal.agency/2024-09-05/film b/www/photo.causal.agency/2024-09-05/film new file mode 100644 index 00000000..7c8bf080 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/film @@ -0,0 +1 @@ +Shanghai Color 400 diff --git a/www/photo.causal.agency/2024-09-05/lens b/www/photo.causal.agency/2024-09-05/lens new file mode 100644 index 00000000..61e7cfd8 --- /dev/null +++ b/www/photo.causal.agency/2024-09-05/lens @@ -0,0 +1 @@ +Yashica ML 28–85mm ƒ/3.5-4.5 diff --git a/www/photo.causal.agency/2024-09-07/body b/www/photo.causal.agency/2024-09-07/body new file mode 100644 index 00000000..1828b2a2 --- /dev/null +++ b/www/photo.causal.agency/2024-09-07/body @@ -0,0 +1 @@ +Zenit-122 diff --git a/www/photo.causal.agency/2024-09-07/film b/www/photo.causal.agency/2024-09-07/film new file mode 100644 index 00000000..bf3453cb --- /dev/null +++ b/www/photo.causal.agency/2024-09-07/film @@ -0,0 +1 @@ +Ilford HP5+ 400 diff --git a/www/photo.causal.agency/2024-09-07/lens b/www/photo.causal.agency/2024-09-07/lens new file mode 100644 index 00000000..dcd0812c --- /dev/null +++ b/www/photo.causal.agency/2024-09-07/lens @@ -0,0 +1 @@ +Helios-44M-5 58mm ƒ/2 diff --git a/www/photo.causal.agency/2024-09-12/body b/www/photo.causal.agency/2024-09-12/body new file mode 100644 index 00000000..6a2a5ad8 --- /dev/null +++ b/www/photo.causal.agency/2024-09-12/body @@ -0,0 +1 @@ +Yashica FX-2 diff --git a/www/photo.causal.agency/2024-09-12/film b/www/photo.causal.agency/2024-09-12/film new file mode 100644 index 00000000..7c8bf080 --- /dev/null +++ b/www/photo.causal.agency/2024-09-12/film @@ -0,0 +1 @@ +Shanghai Color 400 diff --git a/www/photo.causal.agency/2024-09-12/lens b/www/photo.causal.agency/2024-09-12/lens new file mode 100644 index 00000000..b7c8829c --- /dev/null +++ b/www/photo.causal.agency/2024-09-12/lens @@ -0,0 +1 @@ +Yashica ML 42–75mm ƒ/3.5–4.5 diff --git a/www/photo.causal.agency/2024-09-14/body b/www/photo.causal.agency/2024-09-14/body new file mode 100644 index 00000000..6a2a5ad8 --- /dev/null +++ b/www/photo.causal.agency/2024-09-14/body @@ -0,0 +1 @@ +Yashica FX-2 diff --git a/www/photo.causal.agency/2024-09-14/film b/www/photo.causal.agency/2024-09-14/film new file mode 100644 index 00000000..0fb06431 --- /dev/null +++ b/www/photo.causal.agency/2024-09-14/film @@ -0,0 +1 @@ +Fomapan Creative 200, Harman Phoenix 200 diff --git a/www/photo.causal.agency/2024-09-14/lens b/www/photo.causal.agency/2024-09-14/lens new file mode 100644 index 00000000..b7c8829c --- /dev/null +++ b/www/photo.causal.agency/2024-09-14/lens @@ -0,0 +1 @@ +Yashica ML 42–75mm ƒ/3.5–4.5 diff --git a/www/photo.causal.agency/2024-09-15/body b/www/photo.causal.agency/2024-09-15/body new file mode 100644 index 00000000..6a2a5ad8 --- /dev/null +++ b/www/photo.causal.agency/2024-09-15/body @@ -0,0 +1 @@ +Yashica FX-2 diff --git a/www/photo.causal.agency/2024-09-15/film b/www/photo.causal.agency/2024-09-15/film new file mode 100644 index 00000000..c3e0e2b4 --- /dev/null +++ b/www/photo.causal.agency/2024-09-15/film @@ -0,0 +1 @@ +Harman Phoenix 200, Ilford FP4 Plus 125 diff --git a/www/photo.causal.agency/2024-09-15/lens b/www/photo.causal.agency/2024-09-15/lens new file mode 100644 index 00000000..b7c8829c --- /dev/null +++ b/www/photo.causal.agency/2024-09-15/lens @@ -0,0 +1 @@ +Yashica ML 42–75mm ƒ/3.5–4.5 diff --git a/www/photo.causal.agency/2024-09-22/body b/www/photo.causal.agency/2024-09-22/body new file mode 100644 index 00000000..eafb759d --- /dev/null +++ b/www/photo.causal.agency/2024-09-22/body @@ -0,0 +1 @@ +Praktica MTL3 diff --git a/www/photo.causal.agency/2024-09-22/film b/www/photo.causal.agency/2024-09-22/film new file mode 100644 index 00000000..44fd8200 --- /dev/null +++ b/www/photo.causal.agency/2024-09-22/film @@ -0,0 +1 @@ +Shanghai Color 400, Ilford Delta 100 diff --git a/www/photo.causal.agency/2024-09-22/lens b/www/photo.causal.agency/2024-09-22/lens new file mode 100644 index 00000000..d1617296 --- /dev/null +++ b/www/photo.causal.agency/2024-09-22/lens @@ -0,0 +1 @@ +Pentacon 50mm ƒ/1.8 diff --git a/www/photo.causal.agency/2024-09-28/body b/www/photo.causal.agency/2024-09-28/body new file mode 100644 index 00000000..eafb759d --- /dev/null +++ b/www/photo.causal.agency/2024-09-28/body @@ -0,0 +1 @@ +Praktica MTL3 diff --git a/www/photo.causal.agency/2024-09-28/film b/www/photo.causal.agency/2024-09-28/film new file mode 100644 index 00000000..186deeaa --- /dev/null +++ b/www/photo.causal.agency/2024-09-28/film @@ -0,0 +1 @@ +Wolfen NC500 diff --git a/www/photo.causal.agency/2024-09-28/lens b/www/photo.causal.agency/2024-09-28/lens new file mode 100644 index 00000000..d1617296 --- /dev/null +++ b/www/photo.causal.agency/2024-09-28/lens @@ -0,0 +1 @@ +Pentacon 50mm ƒ/1.8 diff --git a/www/photo.causal.agency/2024-09-29/body b/www/photo.causal.agency/2024-09-29/body new file mode 100644 index 00000000..eafb759d --- /dev/null +++ b/www/photo.causal.agency/2024-09-29/body @@ -0,0 +1 @@ +Praktica MTL3 diff --git a/www/photo.causal.agency/2024-09-29/film b/www/photo.causal.agency/2024-09-29/film new file mode 100644 index 00000000..75a90c86 --- /dev/null +++ b/www/photo.causal.agency/2024-09-29/film @@ -0,0 +1 @@ +Ilford FP4 Plus 125 diff --git a/www/photo.causal.agency/2024-09-29/lens b/www/photo.causal.agency/2024-09-29/lens new file mode 100644 index 00000000..038971f7 --- /dev/null +++ b/www/photo.causal.agency/2024-09-29/lens @@ -0,0 +1 @@ +Takumar 35mm ƒ/3.5, Takumar 135mm ƒ/3.5 diff --git a/www/photo.causal.agency/2024-10-01/body b/www/photo.causal.agency/2024-10-01/body new file mode 100644 index 00000000..eafb759d --- /dev/null +++ b/www/photo.causal.agency/2024-10-01/body @@ -0,0 +1 @@ +Praktica MTL3 diff --git a/www/photo.causal.agency/2024-10-01/film b/www/photo.causal.agency/2024-10-01/film new file mode 100644 index 00000000..dd589471 --- /dev/null +++ b/www/photo.causal.agency/2024-10-01/film @@ -0,0 +1 @@ +Harman Phoenix 200 diff --git a/www/photo.causal.agency/2024-10-01/lens b/www/photo.causal.agency/2024-10-01/lens new file mode 100644 index 00000000..a88822d3 --- /dev/null +++ b/www/photo.causal.agency/2024-10-01/lens @@ -0,0 +1 @@ +Takumar 135mm ƒ/3.5, Pentacon 50mm ƒ/1.8 diff --git a/www/photo.causal.agency/2024-10-05/body b/www/photo.causal.agency/2024-10-05/body new file mode 100644 index 00000000..eafb759d --- /dev/null +++ b/www/photo.causal.agency/2024-10-05/body @@ -0,0 +1 @@ +Praktica MTL3 diff --git a/www/photo.causal.agency/2024-10-05/film b/www/photo.causal.agency/2024-10-05/film new file mode 100644 index 00000000..6bb4ba69 --- /dev/null +++ b/www/photo.causal.agency/2024-10-05/film @@ -0,0 +1 @@ +Ferrania P30, Harman Phoenix diff --git a/www/photo.causal.agency/2024-10-05/lens b/www/photo.causal.agency/2024-10-05/lens new file mode 100644 index 00000000..d1617296 --- /dev/null +++ b/www/photo.causal.agency/2024-10-05/lens @@ -0,0 +1 @@ +Pentacon 50mm ƒ/1.8 diff --git a/www/photo.causal.agency/2024-10-06/body b/www/photo.causal.agency/2024-10-06/body new file mode 100644 index 00000000..eafb759d --- /dev/null +++ b/www/photo.causal.agency/2024-10-06/body @@ -0,0 +1 @@ +Praktica MTL3 diff --git a/www/photo.causal.agency/2024-10-06/film b/www/photo.causal.agency/2024-10-06/film new file mode 100644 index 00000000..968fca45 --- /dev/null +++ b/www/photo.causal.agency/2024-10-06/film @@ -0,0 +1 @@ +CineStill 800T diff --git a/www/photo.causal.agency/2024-10-06/lens b/www/photo.causal.agency/2024-10-06/lens new file mode 100644 index 00000000..d1617296 --- /dev/null +++ b/www/photo.causal.agency/2024-10-06/lens @@ -0,0 +1 @@ +Pentacon 50mm ƒ/1.8 diff --git a/www/photo.causal.agency/2024-10-12/body b/www/photo.causal.agency/2024-10-12/body new file mode 100644 index 00000000..6a2a5ad8 --- /dev/null +++ b/www/photo.causal.agency/2024-10-12/body @@ -0,0 +1 @@ +Yashica FX-2 diff --git a/www/photo.causal.agency/2024-10-12/film b/www/photo.causal.agency/2024-10-12/film new file mode 100644 index 00000000..7c8bf080 --- /dev/null +++ b/www/photo.causal.agency/2024-10-12/film @@ -0,0 +1 @@ +Shanghai Color 400 diff --git a/www/photo.causal.agency/2024-10-12/lens b/www/photo.causal.agency/2024-10-12/lens new file mode 100644 index 00000000..87eda797 --- /dev/null +++ b/www/photo.causal.agency/2024-10-12/lens @@ -0,0 +1 @@ +Yashica MC 35–70mm ƒ/3.5–4.5 diff --git a/www/photo.causal.agency/2024-10-17/body b/www/photo.causal.agency/2024-10-17/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2024-10-17/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2024-10-17/film b/www/photo.causal.agency/2024-10-17/film new file mode 100644 index 00000000..fb690ad8 --- /dev/null +++ b/www/photo.causal.agency/2024-10-17/film @@ -0,0 +1 @@ +Fomapan Creative 200 diff --git a/www/photo.causal.agency/2024-10-17/lens b/www/photo.causal.agency/2024-10-17/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-10-17/lens @@ -0,0 +1 @@ +Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-10-20/body b/www/photo.causal.agency/2024-10-20/body new file mode 100644 index 00000000..1828b2a2 --- /dev/null +++ b/www/photo.causal.agency/2024-10-20/body @@ -0,0 +1 @@ +Zenit-122 diff --git a/www/photo.causal.agency/2024-10-20/film b/www/photo.causal.agency/2024-10-20/film new file mode 100644 index 00000000..7c8bf080 --- /dev/null +++ b/www/photo.causal.agency/2024-10-20/film @@ -0,0 +1 @@ +Shanghai Color 400 diff --git a/www/photo.causal.agency/2024-10-20/lens b/www/photo.causal.agency/2024-10-20/lens new file mode 100644 index 00000000..cf233451 --- /dev/null +++ b/www/photo.causal.agency/2024-10-20/lens @@ -0,0 +1 @@ +Helios 44M-5 58mm ƒ/2, SMC Takumar 35mm ƒ/3.5 diff --git a/www/photo.causal.agency/2024-10-23/body b/www/photo.causal.agency/2024-10-23/body new file mode 100644 index 00000000..eafb759d --- /dev/null +++ b/www/photo.causal.agency/2024-10-23/body @@ -0,0 +1 @@ +Praktica MTL3 diff --git a/www/photo.causal.agency/2024-10-23/film b/www/photo.causal.agency/2024-10-23/film new file mode 100644 index 00000000..7c8bf080 --- /dev/null +++ b/www/photo.causal.agency/2024-10-23/film @@ -0,0 +1 @@ +Shanghai Color 400 diff --git a/www/photo.causal.agency/2024-10-23/lens b/www/photo.causal.agency/2024-10-23/lens new file mode 100644 index 00000000..abcaed38 --- /dev/null +++ b/www/photo.causal.agency/2024-10-23/lens @@ -0,0 +1 @@ +Super-Takumar 135mm ƒ/3.5, Pentacon 50mm ƒ/1.8 diff --git a/www/photo.causal.agency/2024-10-27/body b/www/photo.causal.agency/2024-10-27/body new file mode 100644 index 00000000..eafb759d --- /dev/null +++ b/www/photo.causal.agency/2024-10-27/body @@ -0,0 +1 @@ +Praktica MTL3 diff --git a/www/photo.causal.agency/2024-10-27/film b/www/photo.causal.agency/2024-10-27/film new file mode 100644 index 00000000..ad59eb5e --- /dev/null +++ b/www/photo.causal.agency/2024-10-27/film @@ -0,0 +1 @@ +Reflx Lab 800T diff --git a/www/photo.causal.agency/2024-10-27/lens b/www/photo.causal.agency/2024-10-27/lens new file mode 100644 index 00000000..d1617296 --- /dev/null +++ b/www/photo.causal.agency/2024-10-27/lens @@ -0,0 +1 @@ +Pentacon 50mm ƒ/1.8 diff --git a/www/photo.causal.agency/2024-11-02/body b/www/photo.causal.agency/2024-11-02/body new file mode 100644 index 00000000..6a2a5ad8 --- /dev/null +++ b/www/photo.causal.agency/2024-11-02/body @@ -0,0 +1 @@ +Yashica FX-2 diff --git a/www/photo.causal.agency/2024-11-02/film b/www/photo.causal.agency/2024-11-02/film new file mode 100644 index 00000000..cea1eb40 --- /dev/null +++ b/www/photo.causal.agency/2024-11-02/film @@ -0,0 +1 @@ +Kodak Portra 800 (shot at 1600) diff --git a/www/photo.causal.agency/2024-11-02/lens b/www/photo.causal.agency/2024-11-02/lens new file mode 100644 index 00000000..13f1fc49 --- /dev/null +++ b/www/photo.causal.agency/2024-11-02/lens @@ -0,0 +1 @@ +Yashica DSB 50mm ƒ/1.9 diff --git a/www/photo.causal.agency/2024-11-06/body b/www/photo.causal.agency/2024-11-06/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2024-11-06/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2024-11-06/film b/www/photo.causal.agency/2024-11-06/film new file mode 100644 index 00000000..7c8bf080 --- /dev/null +++ b/www/photo.causal.agency/2024-11-06/film @@ -0,0 +1 @@ +Shanghai Color 400 diff --git a/www/photo.causal.agency/2024-11-06/lens b/www/photo.causal.agency/2024-11-06/lens new file mode 100644 index 00000000..f4270bba --- /dev/null +++ b/www/photo.causal.agency/2024-11-06/lens @@ -0,0 +1 @@ +Yashica ML 50mm ƒ/2 diff --git a/www/photo.causal.agency/2024-11-09/body b/www/photo.causal.agency/2024-11-09/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2024-11-09/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2024-11-09/film b/www/photo.causal.agency/2024-11-09/film new file mode 100644 index 00000000..fb690ad8 --- /dev/null +++ b/www/photo.causal.agency/2024-11-09/film @@ -0,0 +1 @@ +Fomapan Creative 200 diff --git a/www/photo.causal.agency/2024-11-09/lens b/www/photo.causal.agency/2024-11-09/lens new file mode 100644 index 00000000..f4270bba --- /dev/null +++ b/www/photo.causal.agency/2024-11-09/lens @@ -0,0 +1 @@ +Yashica ML 50mm ƒ/2 diff --git a/www/photo.causal.agency/2024-11-12/body b/www/photo.causal.agency/2024-11-12/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2024-11-12/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2024-11-12/film b/www/photo.causal.agency/2024-11-12/film new file mode 100644 index 00000000..cf9df85c --- /dev/null +++ b/www/photo.causal.agency/2024-11-12/film @@ -0,0 +1 @@ +Flic Film Elektra 100 (Kodak Aerocolor IV) diff --git a/www/photo.causal.agency/2024-11-12/lens b/www/photo.causal.agency/2024-11-12/lens new file mode 100644 index 00000000..31116f95 --- /dev/null +++ b/www/photo.causal.agency/2024-11-12/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm ƒ/1.7 diff --git a/www/photo.causal.agency/2024-11-16/body b/www/photo.causal.agency/2024-11-16/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2024-11-16/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2024-11-16/film b/www/photo.causal.agency/2024-11-16/film new file mode 100644 index 00000000..c0f6ee30 --- /dev/null +++ b/www/photo.causal.agency/2024-11-16/film @@ -0,0 +1 @@ +Flic Film Elektra 100 (Kodak Aerocolor IV), Harman Phoenix 200 diff --git a/www/photo.causal.agency/2024-11-16/lens b/www/photo.causal.agency/2024-11-16/lens new file mode 100644 index 00000000..31116f95 --- /dev/null +++ b/www/photo.causal.agency/2024-11-16/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm ƒ/1.7 diff --git a/www/photo.causal.agency/2024-11-18/body b/www/photo.causal.agency/2024-11-18/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2024-11-18/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2024-11-18/film b/www/photo.causal.agency/2024-11-18/film new file mode 100644 index 00000000..ada88ac3 --- /dev/null +++ b/www/photo.causal.agency/2024-11-18/film @@ -0,0 +1 @@ +Ferrania P30 diff --git a/www/photo.causal.agency/2024-11-18/lens b/www/photo.causal.agency/2024-11-18/lens new file mode 100644 index 00000000..31116f95 --- /dev/null +++ b/www/photo.causal.agency/2024-11-18/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm ƒ/1.7 diff --git a/www/photo.causal.agency/2024-11-23/body b/www/photo.causal.agency/2024-11-23/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2024-11-23/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2024-11-23/film b/www/photo.causal.agency/2024-11-23/film new file mode 100644 index 00000000..d198f26d --- /dev/null +++ b/www/photo.causal.agency/2024-11-23/film @@ -0,0 +1 @@ +Ferrania P33 diff --git a/www/photo.causal.agency/2024-11-23/lens b/www/photo.causal.agency/2024-11-23/lens new file mode 100644 index 00000000..f4270bba --- /dev/null +++ b/www/photo.causal.agency/2024-11-23/lens @@ -0,0 +1 @@ +Yashica ML 50mm ƒ/2 diff --git a/www/photo.causal.agency/2024-12-21/body b/www/photo.causal.agency/2024-12-21/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2024-12-21/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2024-12-21/film b/www/photo.causal.agency/2024-12-21/film new file mode 100644 index 00000000..fb690ad8 --- /dev/null +++ b/www/photo.causal.agency/2024-12-21/film @@ -0,0 +1 @@ +Fomapan Creative 200 diff --git a/www/photo.causal.agency/2024-12-21/lens b/www/photo.causal.agency/2024-12-21/lens new file mode 100644 index 00000000..3bee8822 --- /dev/null +++ b/www/photo.causal.agency/2024-12-21/lens @@ -0,0 +1 @@ +Yashica ML 50mm ƒ/2, Yashica DSB 28mm ƒ/2.8 diff --git a/www/photo.causal.agency/2024-12-28/body b/www/photo.causal.agency/2024-12-28/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2024-12-28/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2024-12-28/film b/www/photo.causal.agency/2024-12-28/film new file mode 100644 index 00000000..ad59eb5e --- /dev/null +++ b/www/photo.causal.agency/2024-12-28/film @@ -0,0 +1 @@ +Reflx Lab 800T diff --git a/www/photo.causal.agency/2024-12-28/lens b/www/photo.causal.agency/2024-12-28/lens new file mode 100644 index 00000000..a64ba4b7 --- /dev/null +++ b/www/photo.causal.agency/2024-12-28/lens @@ -0,0 +1 @@ +Yashica DSB 28mm f/2.8 diff --git a/www/photo.causal.agency/2025-01-18/body b/www/photo.causal.agency/2025-01-18/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2025-01-18/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2025-01-18/film b/www/photo.causal.agency/2025-01-18/film new file mode 100644 index 00000000..c20afa1a --- /dev/null +++ b/www/photo.causal.agency/2025-01-18/film @@ -0,0 +1 @@ +Reflx Lab 400D diff --git a/www/photo.causal.agency/2025-01-18/lens b/www/photo.causal.agency/2025-01-18/lens new file mode 100644 index 00000000..10ce84b5 --- /dev/null +++ b/www/photo.causal.agency/2025-01-18/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7, Yashica DSB 135mm f/2.8 diff --git a/www/photo.causal.agency/2025-01-26/body b/www/photo.causal.agency/2025-01-26/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2025-01-26/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2025-01-26/film b/www/photo.causal.agency/2025-01-26/film new file mode 100644 index 00000000..0d5a24a4 --- /dev/null +++ b/www/photo.causal.agency/2025-01-26/film @@ -0,0 +1 @@ +Street Candy ATM400 diff --git a/www/photo.causal.agency/2025-01-26/lens b/www/photo.causal.agency/2025-01-26/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/2025-01-26/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 diff --git a/www/photo.causal.agency/2025-02-08/body b/www/photo.causal.agency/2025-02-08/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2025-02-08/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2025-02-08/film b/www/photo.causal.agency/2025-02-08/film new file mode 100644 index 00000000..6b8ba9dc --- /dev/null +++ b/www/photo.causal.agency/2025-02-08/film @@ -0,0 +1 @@ +Kodak Portra 800 diff --git a/www/photo.causal.agency/2025-02-08/lens b/www/photo.causal.agency/2025-02-08/lens new file mode 100644 index 00000000..08cc1075 --- /dev/null +++ b/www/photo.causal.agency/2025-02-08/lens @@ -0,0 +1 @@ +Yashica ML 42-75mm f/3.5-4.5 diff --git a/www/photo.causal.agency/2025-02-11/body b/www/photo.causal.agency/2025-02-11/body new file mode 100644 index 00000000..1828b2a2 --- /dev/null +++ b/www/photo.causal.agency/2025-02-11/body @@ -0,0 +1 @@ +Zenit-122 diff --git a/www/photo.causal.agency/2025-02-11/film b/www/photo.causal.agency/2025-02-11/film new file mode 100644 index 00000000..fb690ad8 --- /dev/null +++ b/www/photo.causal.agency/2025-02-11/film @@ -0,0 +1 @@ +Fomapan Creative 200 diff --git a/www/photo.causal.agency/2025-02-11/lens b/www/photo.causal.agency/2025-02-11/lens new file mode 100644 index 00000000..25cae06f --- /dev/null +++ b/www/photo.causal.agency/2025-02-11/lens @@ -0,0 +1 @@ +Helios-44M-5 58mm f/2 diff --git a/www/photo.causal.agency/2025-02-17/body b/www/photo.causal.agency/2025-02-17/body new file mode 100644 index 00000000..1828b2a2 --- /dev/null +++ b/www/photo.causal.agency/2025-02-17/body @@ -0,0 +1 @@ +Zenit-122 diff --git a/www/photo.causal.agency/2025-02-17/film b/www/photo.causal.agency/2025-02-17/film new file mode 100644 index 00000000..8cf5c5b8 --- /dev/null +++ b/www/photo.causal.agency/2025-02-17/film @@ -0,0 +1 @@ +Fomapan Classic 100 diff --git a/www/photo.causal.agency/2025-02-17/lens b/www/photo.causal.agency/2025-02-17/lens new file mode 100644 index 00000000..25cae06f --- /dev/null +++ b/www/photo.causal.agency/2025-02-17/lens @@ -0,0 +1 @@ +Helios-44M-5 58mm f/2 diff --git a/www/photo.causal.agency/2025-02-23/body b/www/photo.causal.agency/2025-02-23/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2025-02-23/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2025-02-23/film b/www/photo.causal.agency/2025-02-23/film new file mode 100644 index 00000000..75a90c86 --- /dev/null +++ b/www/photo.causal.agency/2025-02-23/film @@ -0,0 +1 @@ +Ilford FP4 Plus 125 diff --git a/www/photo.causal.agency/2025-02-23/lens b/www/photo.causal.agency/2025-02-23/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/2025-02-23/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 diff --git a/www/photo.causal.agency/2025-02-25/body b/www/photo.causal.agency/2025-02-25/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2025-02-25/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2025-02-25/film b/www/photo.causal.agency/2025-02-25/film new file mode 100644 index 00000000..ea743873 --- /dev/null +++ b/www/photo.causal.agency/2025-02-25/film @@ -0,0 +1 @@ +Flic Film Elektra (Kodak Aerocolor) diff --git a/www/photo.causal.agency/2025-02-25/lens b/www/photo.causal.agency/2025-02-25/lens new file mode 100644 index 00000000..033bc748 --- /dev/null +++ b/www/photo.causal.agency/2025-02-25/lens @@ -0,0 +1 @@ +Yashica ML 50mm f/2 diff --git a/www/photo.causal.agency/2025-03-15/body b/www/photo.causal.agency/2025-03-15/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2025-03-15/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2025-03-15/film b/www/photo.causal.agency/2025-03-15/film new file mode 100644 index 00000000..58e2f25c --- /dev/null +++ b/www/photo.causal.agency/2025-03-15/film @@ -0,0 +1 @@ +Kodak Ektar 100, Shanghai Color 400 diff --git a/www/photo.causal.agency/2025-03-15/lens b/www/photo.causal.agency/2025-03-15/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/2025-03-15/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 diff --git a/www/photo.causal.agency/2025-03-16/body b/www/photo.causal.agency/2025-03-16/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2025-03-16/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2025-03-16/film b/www/photo.causal.agency/2025-03-16/film new file mode 100644 index 00000000..c2518f1e --- /dev/null +++ b/www/photo.causal.agency/2025-03-16/film @@ -0,0 +1 @@ +Shanghai Color 400, Fomapan Creative 200 diff --git a/www/photo.causal.agency/2025-03-16/lens b/www/photo.causal.agency/2025-03-16/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/2025-03-16/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 diff --git a/www/photo.causal.agency/2025-03-18/body b/www/photo.causal.agency/2025-03-18/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2025-03-18/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2025-03-18/film b/www/photo.causal.agency/2025-03-18/film new file mode 100644 index 00000000..fb690ad8 --- /dev/null +++ b/www/photo.causal.agency/2025-03-18/film @@ -0,0 +1 @@ +Fomapan Creative 200 diff --git a/www/photo.causal.agency/2025-03-18/lens b/www/photo.causal.agency/2025-03-18/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/2025-03-18/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 diff --git a/www/photo.causal.agency/2025-03-19/body b/www/photo.causal.agency/2025-03-19/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2025-03-19/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2025-03-19/film b/www/photo.causal.agency/2025-03-19/film new file mode 100644 index 00000000..ada88ac3 --- /dev/null +++ b/www/photo.causal.agency/2025-03-19/film @@ -0,0 +1 @@ +Ferrania P30 diff --git a/www/photo.causal.agency/2025-03-19/lens b/www/photo.causal.agency/2025-03-19/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/2025-03-19/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 diff --git a/www/photo.causal.agency/2025-03-22/body b/www/photo.causal.agency/2025-03-22/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2025-03-22/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2025-03-22/film b/www/photo.causal.agency/2025-03-22/film new file mode 100644 index 00000000..618ed9ba --- /dev/null +++ b/www/photo.causal.agency/2025-03-22/film @@ -0,0 +1 @@ +Ferrania P30, Shanghai GP3 100, AristaEDU Ultra 400 diff --git a/www/photo.causal.agency/2025-03-22/lens b/www/photo.causal.agency/2025-03-22/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/2025-03-22/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 diff --git a/www/photo.causal.agency/2025-03-23/body b/www/photo.causal.agency/2025-03-23/body new file mode 100644 index 00000000..0962ee7d --- /dev/null +++ b/www/photo.causal.agency/2025-03-23/body @@ -0,0 +1 @@ +Yashica FX-3 diff --git a/www/photo.causal.agency/2025-03-23/film b/www/photo.causal.agency/2025-03-23/film new file mode 100644 index 00000000..0352ae38 --- /dev/null +++ b/www/photo.causal.agency/2025-03-23/film @@ -0,0 +1 @@ +Fujifilm Acros 100 II, Rollei Superpan 200 diff --git a/www/photo.causal.agency/2025-03-23/lens b/www/photo.causal.agency/2025-03-23/lens new file mode 100644 index 00000000..eaab4375 --- /dev/null +++ b/www/photo.causal.agency/2025-03-23/lens @@ -0,0 +1 @@ +Carl Zeiss Planar T* 50mm f/1.7 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..e058d341 --- /dev/null +++ b/www/photo.causal.agency/gear.html @@ -0,0 +1,65 @@ +<!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) (every day) +<li>Praktica MTL3 (probably on loan to a friend) +<li>Zenit-122 +<li>Yashica FX-2 +</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>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>Canon EOS Rebel SL3 +<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-EF adapter +<li>Skier CS-700 copy stand +<li>Valoi 135 film holder +<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 new file mode 100644 index 00000000..83a3128b --- /dev/null +++ b/www/photo.causal.agency/generate.sh @@ -0,0 +1,284 @@ +#!/bin/sh +set -eu + +mkdir -p static/preview static/thumbnail + +resize() { + local photo=$1 size=$2 output=$3 + if ! test -f $output; then + # FIXME: convert complains about not understanding XML + echo $output >&2 + convert $photo -auto-orient -thumbnail $size $output 2>/dev/null ||: + fi +} + +preview() { + local photo=$1 + local preview=preview/${photo##*/} + resize $photo 1500000@ static/$preview + echo $preview +} + +thumbnail() { + local photo=$1 + local thumbnail=thumbnail/${photo##*/} + resize $photo 60000@ static/$thumbnail + echo $thumbnail +} + +encode() { + sed ' + s/&/\&/g + s/</\</g + s/"/\"/g + ' "$@" +} + +page_title() { + 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 page=$1 + local title=$(page_title $page) + local date body lens film note + + 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]' \ + $page/$(ls -1 $page | head -n 1) 2>/dev/null | + sed ' + s/\([A-Z]\)\([0-9]\)/\1 \2/ + s,f/,ƒ/, + s/\([0-9]\)-\([0-9]\)/\1–\2/g + ' | + encode + ) + fi + if test -f $page/film; then + film=$(encode $page/film) + fi + if test -f $page/note; then + note=$(encode $page/note) + fi + + cat <<-EOF + <!DOCTYPE html> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link rel="alternate" type="application/atom+xml" href="../feed.atom"> + <title>${title}</title> + <style> + html { color: #bbb; background-color: black; font-family: monospace; } + p { text-align: center; } + figure { margin: 1em; padding-top: 0.5em; text-align: center; } + img { max-width: calc(100vw - 2.5em); max-height: calc(100vh - 2.5em); } + details { max-width: 78ch; margin: 0.5em auto; } + </style> + <h1>${title}</h1> + <p>${date:+📆 }${date:-} 📷 ${body:-}${body:+ 🔘 }${lens:-}${film:+ 🎞️ }${film:-}</p> + ${note:+<p>}${note:-}${note:+</p>} + EOF +} + +photo_info() { + local photo=$1 + ExposureTime= + FNumber= + FocalLength= + PhotographicSensitivity= + eval $( + identify -format '%[EXIF:*]' $photo 2>/dev/null | + grep -E 'ExposureTime|FNumber|FocalLength|PhotographicSensitivity' | + sed 's/^exif://' + ) +} + +photo_id() { + local photo=$1 + photo=${photo##*/} + photo=${photo%%.*} + echo $photo +} + +page_photo() { + local photo=$1 preview=$2 description=$3 + 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 + if test -n "${ExposureTime}"; then + cat <<-EOF + ${ExposureTime} · + ƒ/$(bc -S 1 -e ${FNumber}) · + $(bc -e ${FocalLength}) mm · + ${PhotographicSensitivity} ISO + EOF + fi + if test -f $description; then + cat <<-EOF + <details> + <summary>description</summary> + $(encode $description) + </details> + EOF + fi + cat <<-EOF + </figcaption> + </figure> + EOF +} + +index_head() { + cat <<-EOF + <!DOCTYPE html> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link rel="alternate" type="application/atom+xml" href="feed.atom"> + <title>Photos</title> + <style> + html { color: #bbb; background-color: black; font-family: sans-serif; } + a { text-decoration: none; color: inherit; } + </style> + EOF +} + +index_page() { + local date=$1 root=${2:-} + cat <<-EOF + <h1><a href="${root}${root:+/}${date}/">$(page_title $date)</a></h1> + EOF +} + +index_photo() { + local date=$1 photo=$2 thumbnail=$3 root=${4:-} + cat <<-EOF + <a href="${root}${root:+/}${date}/#$(photo_id $photo)"> + <img src="${root}${root:+/}${thumbnail}"> + </a> + EOF +} + +Root=https://photo.causal.agency + +atom_head() { + local updated=$(date -u '+%FT%TZ') + cat <<-EOF + <?xml version="1.0" encoding="utf-8"?> + <feed xmlns="http://www.w3.org/2005/Atom"> + <title>Photos</title> + <author><name>june</name><email>june@causal.agency</email></author> + <link href="${Root}"/> + <link rel="self" href="${Root}/feed.atom"/> + <id>${Root}/</id> + <updated>${updated}</updated> + EOF +} + +atom_entry_head() { + local date=$1 + local updated=$( + date -ju -f '%s' $(stat -f '%m' static/${date}/index.html) '+%FT%TZ' + ) + cat <<-EOF + <entry> + <title>$(page_title $date)</title> + <link href="${Root}/${date}/"/> + <id>${Root}/${date}/</id> + <updated>${updated}</updated> + <content type="html"> + EOF +} + +atom_entry_tail() { + cat <<-EOF + </content> + </entry> + EOF +} + +atom_tail() { + cat <<-EOF + </feed> + EOF +} + +set -- +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 $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%.[Jj][Pp][Gg]}.txt >>$page + done + fi + 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 +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}/*.[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 + done + atom_entry_tail >>static/feed.atom +done +atom_tail >>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/rsync.sh b/www/photo.causal.agency/rsync.sh new file mode 100644 index 00000000..957911d2 --- /dev/null +++ b/www/photo.causal.agency/rsync.sh @@ -0,0 +1,5 @@ +#!/bin/sh +set -eu + +sh generate.sh +rsync -av static/ scout:/var/www/photo.causal.agency diff --git a/www/photo.causal.agency/trips.html b/www/photo.causal.agency/trips.html new file mode 100644 index 00000000..d65aeaef --- /dev/null +++ b/www/photo.causal.agency/trips.html @@ -0,0 +1,365 @@ +<!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"> + <option>Ferrania P30 80</option> + <option>Flic Film Elektra 100</option> + <option>Ilford FP4 Plus 125</option> + <option>Fomapan Creative 200</option> + <option>Harman Phoenix 200</option> + <option>Shanghai Color 400</option> + <option>Reflx Lab 800T</option> +</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); + } + } +} +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.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(); +} + +</script> diff --git a/www/temp.causal.agency/.gitignore b/www/temp.causal.agency/.gitignore new file mode 100644 index 00000000..e31ee94e --- /dev/null +++ b/www/temp.causal.agency/.gitignore @@ -0,0 +1 @@ +up diff --git a/www/temp.causal.agency/Makefile b/www/temp.causal.agency/Makefile new file mode 100644 index 00000000..a69a2b48 --- /dev/null +++ b/www/temp.causal.agency/Makefile @@ -0,0 +1,15 @@ +CGI_BIN = /var/www/cgi-bin + +CFLAGS += -std=c11 -Wall -Wextra -Wpedantic $$(pkg-config --cflags kcgi) +LDLIBS = -static $$(pkg-config --static --libs kcgi-html) + +up: + +clean: + rm -f up + +install: up + install up ${CGI_BIN}/up + +uninstall: + rm -f ${CGI_BIN}/up diff --git a/www/temp.causal.agency/up.c b/www/temp.causal.agency/up.c new file mode 100644 index 00000000..561a8901 --- /dev/null +++ b/www/temp.causal.agency/up.c @@ -0,0 +1,193 @@ +/* Copyright (C) 2020 June McEnroe <june@causal.agency> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <err.h> +#include <fcntl.h> +#include <stdarg.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sysexits.h> +#include <time.h> +#include <unistd.h> + +#include <kcgi.h> +#include <kcgihtml.h> + +static const char *Page = "up"; +static const struct kvalid Key = { NULL, "file" }; + +static enum kcgi_err head(struct kreq *req, enum khttp http, enum kmime mime) { + return khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[http]) + || khttp_head(req, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[mime]); +} + +static enum kcgi_err fail(struct kreq *req, enum khttp http) { + return head(req, http, KMIME_TEXT_PLAIN) + || khttp_body(req) + || khttp_printf(req, "%s\n", khttps[http]); +} + +static int dir = -1; +static const char *upload(const char *ext, void *ptr, size_t len) { + static char name[256]; + snprintf( + name, sizeof(name), "%jx%08x%s%s", + (intmax_t)time(NULL), arc4random(), + (ext && ext[0] != '.' ? "." : ""), (ext ? ext : "") + ); + int fd = openat(dir, name, O_CREAT | O_EXCL | O_WRONLY, 0644); + if (fd < 0) { + warn("%s", name); + return NULL; + } + ssize_t n = write(fd, ptr, len); + int error = close(fd); + if (n < 0 || error) { + warn("%s", name); + return NULL; + } + return name; +} + +static enum kcgi_err handle(struct kreq *req) { + if (req->page) return fail(req, KHTTP_404); + + if (req->method == KMETHOD_GET) { + struct khtmlreq html; + struct khtmlreq *h = &html; + return head(req, KHTTP_200, KMIME_TEXT_HTML) + || khttp_body(req) + || khtml_open(h, req, 0) + || khtml_elem(h, KELEM_DOCTYPE) + || khtml_elem(h, KELEM_TITLE) + || khtml_puts(h, "Upload") + || khtml_closeelem(h, 1) + || khtml_attr( + h, KELEM_FORM, + KATTR_METHOD, "post", + KATTR_ACTION, "", + KATTR_ENCTYPE, "multipart/form-data", + KATTR__MAX + ) + || khtml_attr( + h, KELEM_INPUT, + KATTR_TYPE, "file", + KATTR_NAME, Key.name, + KATTR__MAX + ) + || khtml_attr( + h, KELEM_INPUT, + KATTR_TYPE, "submit", + KATTR_VALUE, "Upload", + KATTR__MAX + ) + || khtml_close(h); + + } else if (req->method == KMETHOD_POST) { + struct kpair *field = req->fieldmap[0]; + if (!field || !field->valsz) return fail(req, KHTTP_400); + + const char *ext = strrchr(field->file, '.'); + const char *name = upload(ext, field->val, field->valsz); + if (!name) return fail(req, KHTTP_507); + + return head(req, KHTTP_303, KMIME_TEXT_PLAIN) + || khttp_head(req, kresps[KRESP_LOCATION], "/%s", name) + || khttp_body(req) + || khttp_puts(req, name); + + } else if (req->method == KMETHOD_PUT) { + struct kpair *field = req->fields; + if (!field || !field->valsz) return fail(req, KHTTP_400); + + const char *ext = req->suffix; + if (!ext[0]) ext = strrchr(field->file, '.'); + const char *name = upload(ext, field->val, field->valsz); + if (!name) return fail(req, KHTTP_507); + + return head(req, KHTTP_200, KMIME_TEXT_PLAIN) + || khttp_body(req) + || khttp_printf( + req, "%s://%s/%s\n", kschemes[req->scheme], req->host, name + ); + + } else { + return fail(req, KHTTP_405); + } +} + +int main(int argc, char *argv[]) { + int error; + const char *path = (argc > 1 ? argv[1] : "."); + dir = open(path, O_DIRECTORY); + if (dir < 0) err(EX_NOINPUT, "%s", path); + +#ifdef __OpenBSD__ + error = unveil(path, "wc"); + if (error) err(EX_OSERR, "unveil"); +#endif + + if (!khttp_fcgi_test()) { +#ifdef __OpenBSD__ + error = pledge("stdio wpath cpath proc", NULL); + if (error) err(EX_OSERR, "pledge"); +#endif + + struct kreq req; + error = khttp_parse(&req, &Key, 1, &Page, 1, 0); + if (error) errx(EX_PROTOCOL, "khttp_parse: %s", kcgi_strerror(error)); + +#ifdef __OpenBSD__ + error = pledge("stdio wpath cpath", NULL); + if (error) err(EX_OSERR, "pledge"); +#endif + + error = handle(&req); + if (error) errx(EX_PROTOCOL, "%s", kcgi_strerror(error)); + khttp_free(&req); + return EX_OK; + } + +#ifdef __OpenBSD__ + error = pledge("stdio wpath cpath unix sendfd recvfd proc", NULL); + if (error) err(EX_OSERR, "pledge"); +#endif + + struct kfcgi *fcgi; + error = khttp_fcgi_init(&fcgi, &Key, 1, &Page, 1, 0); + if (error) errx(EX_CONFIG, "khttp_fcgi_init: %s", kcgi_strerror(error)); + +#ifdef __OpenBSD__ + error = pledge("stdio wpath cpath recvfd", NULL); + if (error) err(EX_OSERR, "pledge"); +#endif + + for ( + struct kreq req; + !(error = khttp_fcgi_parse(fcgi, &req)); + khttp_free(&req) + ) { + error = handle(&req); + if (error && error != KCGI_HUP) break; + } + if (error != KCGI_EXIT) { + errx(EX_PROTOCOL, "khttp_fcgi_parse: %s", kcgi_strerror(error)); + } + khttp_fcgi_free(fcgi); +} diff --git a/www/text.causal.agency/.gitignore b/www/text.causal.agency/.gitignore index 37dd51ef..66b3e637 100644 --- a/www/text.causal.agency/.gitignore +++ b/www/text.causal.agency/.gitignore @@ -1,2 +1,4 @@ *.txt +colb feed.atom +igp diff --git a/www/text.causal.agency/001-make.7 b/www/text.causal.agency/001-make.7 index 51a702cf..b4805729 100644 --- a/www/text.causal.agency/001-make.7 +++ b/www/text.causal.agency/001-make.7 @@ -156,4 +156,4 @@ clean: This document is produced from .Xr mdoc 7 source available from -.Lk https://code.causal.agency/june/src/src/branch/master/www/text.causal.agency "Code Toilet" +.Lk https://git.causal.agency/src/tree/www/text.causal.agency diff --git a/www/text.causal.agency/002-writing-mdoc.7 b/www/text.causal.agency/002-writing-mdoc.7 index 15fdf89f..b377d364 100644 --- a/www/text.causal.agency/002-writing-mdoc.7 +++ b/www/text.causal.agency/002-writing-mdoc.7 @@ -135,4 +135,4 @@ as you can see here. This document is produced from .Xr mdoc 7 source available from -.Lk https://code.causal.agency/june/src/src/branch/master/www/text.causal.agency "Code Toilet" +.Lk https://git.causal.agency/src/tree/www/text.causal.agency diff --git a/www/text.causal.agency/003-pleasant-c.7 b/www/text.causal.agency/003-pleasant-c.7 index 538f1c07..16030b7e 100644 --- a/www/text.causal.agency/003-pleasant-c.7 +++ b/www/text.causal.agency/003-pleasant-c.7 @@ -110,7 +110,7 @@ while (0 < (opt = getopt(argc, argv, "h:w:"))) { This document is produced from .Xr mdoc 7 source available from -.Lk https://code.causal.agency/june/src/src/branch/master/www/text.causal.agency "Code Toilet" +.Lk https://git.causal.agency/src/tree/www/text.causal.agency . .Sh CAVEATS This isn't meant to be advice. diff --git a/www/text.causal.agency/004-uloc.7 b/www/text.causal.agency/004-uloc.7 index df907eb7..edd78d80 100644 --- a/www/text.causal.agency/004-uloc.7 +++ b/www/text.causal.agency/004-uloc.7 @@ -56,7 +56,7 @@ to read all of your code sorted alphabetically. This document is produced from .Xr mdoc 7 source available from -.Lk https://code.causal.agency/june/src/src/branch/master/www/text.causal.agency "Code Toilet" +.Lk https://git.causal.agency/src/tree/www/text.causal.agency . .Sh CAVEATS Estimates such as these diff --git a/www/text.causal.agency/005-testing-c.7 b/www/text.causal.agency/005-testing-c.7 index 964e22bc..d0c636ff 100644 --- a/www/text.causal.agency/005-testing-c.7 +++ b/www/text.causal.agency/005-testing-c.7 @@ -69,11 +69,5 @@ contains a useful line number and the expected output rather than just variable names. . -.Pp -For a real example, -check -.Lk https://code.causal.agency/june/catgirl/src/branch/master/term.c term.c -from my IRC client project. -. .Sh AUTHORS .An Mt june@causal.agency diff --git a/www/text.causal.agency/010-irc-suite.7 b/www/text.causal.agency/010-irc-suite.7 new file mode 100644 index 00000000..515a30ab --- /dev/null +++ b/www/text.causal.agency/010-irc-suite.7 @@ -0,0 +1,409 @@ +.Dd June 19, 2020 +.Dt IRC-SUITE 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm IRC suite +.Nd my own IRC software +. +.Sh DESCRIPTION +Over the past months +.Po +eight of them, according to +.Xr git-log 1 +.Pc +I developed a new +.Dq suite +of IRC software +that I now use full-time, +consisting of a bouncer, +a new logging and search solution, +and a terminal client. +These new programs share some characteristics: +they are all TLS-only +and use the libtls API from LibreSSL, +they can all be entirely configured from the command line +or with equivalent configuration files, +they are all designed as +a one process to one IRC connection mapping, +and they all take advantage of IRCv3 features. +. +.Pp +For context, +I was previously running +the znc IRC bouncer +and using the Textual IRC client +with its plain text logs. +I also continue to use +the Palaver IRC client for iOS. +. +.Ss Background +A bouncer is a piece of server software +that stays connected to IRC at all times +and acts as a relay +between your client and the IRC server. +When the client is disconnected, +the bouncer buffers incoming messages +to send to the client when it reconnects. +. +.Pp +Aside from this, +bouncers have another advantage: +client multiplexing. +Several clients, +for instance on different computers +or a phone, +should be able to connect to the same bouncer, +and send and receive messages under the same nick. +Unfortunately, +znc does not handle this use-case well at all. +Out of the box it offers two options: +either any client connection totally clears the buffer, +causing other clients to miss chat history; +or the buffer is never cleared, +causing every client connection +to be repeatedly spammed with redundant history. +There is also a znc wiki page +that suggests one way to solve this issue +is to connect znc to itself multiple times over. +Yikes. +. +.Ss pounce +My dissatisfaction with +connecting multiple clients to znc +directly motivated me to start working +on a new multi-client-focused IRC bouncer. +The result is +.Xr pounce 1 , +based on a rather straightforward +single-producer (the IRC server) +multiple-consumer (each IRC client) +ring buffer. +Each client has its own +independent position in the buffer +so can properly be brought up to date +whenever it connects. +. +.Pp +Additionally, +by assuming support for the IRCv3 +.Sy server-time +extension, +all IRC events can be accurately +relayed to clients at any time, +and the internals of +.Xr pounce 1 +can be kept very simple. +In fact, +it completely avoids parsing most IRC messages, +simply pushing them into the buffer +with an associated timestamp. +. +.Pp +The usernames sent by clients during registration +are used as opaque identifiers for buffer consumers. +This was chosen since most clients +can be configured to send an arbitrary username, +and those that don't often default +to the name of the client itself, +making it an appropriate identifier. +. +.Pp +Later, +I added a way for clients +to be informed of their own buffer positions +using a vendor-specific IRCv3 capability. +This means a client +can save the position +of the last message it actually received, +and request to set its position +when it reconnects, +ensuring no messages are lost +to network issues +or software crashes. +. +.Ss calico +Due to the simple design of mapping +one process to one IRC (server) connection, +it is necessary to run several instances of +.Xr pounce 1 . +Initially I simply used different ports for each, +but as I connected to more networks +and even ran some instances for friends, +it became less feasible. +. +.Pp +The solution I came up with +was to dispatch incoming connections +using Server Name Indication, or SNI. +This way, +multiple domains pointing to the same host +could be used with only one port +to connect to different instances of +.Xr pounce 1 . +For example, +I use a +.Li *.irc.causal.agency +wildcard DNS entry +and a subdomain for each IRC network, +all on port 6697. +. +.Pp +The +.Xr calico 1 +daemon included with pounce +accomplishes this dispatch +using the +.Dv MSG_PEEK +flag of +.Xr recvmsg(2) +on incoming connections. +Since SNI is immediately sent by TLS clients +as part of the ClientHello message in clear-text, +it can be processed +without doing any actual TLS. +The connection itself is then +sent to the corresponding +.Xr pounce 1 +instance +over UNIX-domain socket, +which handles TLS as normal. +This means that +.Xr calico 1 +and +.Xr pounce 1 +operate entirely independently of each other. +. +.Ss litterbox +Based on the multiple-consumer ring buffer design, +I realized it would be easy +to implement additional functionality +as independent purpose-built clients +which connect to +.Xr pounce 1 +alongside regular clients. +This could allow dedicated OTR or DCC software +to operate in parallel with a basic client, +or for more passive software +to provide notifications +or dedicated logging. +. +.Pp +For the latter, +I wanted to do better than +plain text log files. +.Xr grep 1 +over files works fine, +but search could be faster and smarter, +and the text format is +more lossy and less structured +than I'd like it to be. +Conveniently, +SQLite provides an extension +(actually two) +for full-text search. +. +.Pp +The litterbox project +is my dedicated logging solution +using SQLite FTS5. +It consists of three tools: +the +.Xr litterbox 1 +daemon itself which connects to pounce +and logs messages to SQLite, +the +.Xr scoop 1 +command line query tool, +and the +.Xr unscoop 1 +plain text import tool. +The +.Xr scoop 1 +tool constructs SQL queries +and formats the results for viewing, +with coloured nicks +and piped to a pager +by default. +. +.Pp +The +.Xr litterbox 1 +daemon +can also provide a simple +.Dq online +.Pq over IRC +search query interface +to other connected clients. +The simplest way to allow different +.Xr pounce 1 +clients to talk to each other +was to route private messages to self +internally without sending them to the IRC server. +So from any client +I can simply message myself +a full-text search query +and +.Xr litterbox 1 +responds with the results. +. +.Pp +Along with routing self-messages, +.Xr pounce 1 +also provides a vendor-specific IRCv3 capability +for passive clients such as +.Xr litterbox 1 +to indicate that they should not influence +the automatic away status, +which is normally only set +when no clients are connected. +. +.Pp +An advantage of this architecture +of dedicated clients +rather than bouncer modules +is that they need not run +on the same host. +I run my bouncers on a VPS, +but I'd rather not store my private logs there, +so +.Xr litterbox 1 +runs instead on a Raspberry Pi +in my apartment. +Also, +since it is essentially +just a regular IRC bot, +it could be used independently +for keeping public logs for a channel. +. +.Ss catgirl +There's not really that much to say +about the client, +.Xr catgirl 1 . +Of the three projects +it contains the most code +but is also the least interesting, +in my opinion. +It just does what I want a client to do, +and gets the details right. +. +.Pp +Tab complete is ordered by most recently seen or used, +and completing several nicks +inserts commas between them +as well as the colon following the final nick. +In the input line, +the prompt is updated +to reflect whether the input +will be interpreted as a command or as a message. +Messages are automatically scanned for URLs, +which can be opened or copied with commands +specifying the nick or a substring of the URL. +. +.Pp +Scrolling in a window creates a split view, +keeping the latest messages visible. +Nick colours are based instead on usernames, +keeping them more stable across renames, +and mentions in messages are coloured +to make the conversation easier to follow. +The visibility of ignored messages +can be toggled at any time. +Channels can be muted +so their activity is hidden +from the status line +unless you are pinged. +. +.Pp +.Xr catgirl 1 +is configured entirely on the command line +or in equivalent simple configuration files. +There's no dynamic manipulation of state +using complex +.Ql / +commands like in some other clients. +. +.Pp +The major caveat is that +.Xr catgirl 1 +connects to only one network at a time. +This keeps the configuration, the interface +and the code much simpler. +.Xr tmux 1 , +.Xr screen 1 +or a tabbed terminal emulator +are good options to run several instances. +. +.Pp +If you're interested in giving +.Xr catgirl 1 +a quick (and necessarily limited) try, +you can +.Li ssh chat@ascii.town . +. +.Ss Future +I think I'm done with IRC software for now. +As mentioned above, +there are a few more pieces +that could fit in to this setup, +but I don't really want or need them right now. +One thing I definitely want to try +at some point +is adding a litterbox component +to index the contents of URLs +to make finding previously shared links easier. +. +.Pp +If you try any of this software +and have feedback, +let me know in +.Li #ascii.town +on tilde.chat +or by email. +And of course, +patches are always welcome. +. +.Ss Update: scooper +Somehow I had the motivation +to create a web interface for litterbox: +.Xr scooper 1 . +It can be used either as CGI +or as a FastCGI worker, +and I used the excellent +.Xr kcgi 3 +library for it. +. +.Pp +The main advantage of this interface +is that you can click on a search result +to be brought to its context in the log viewer. +I also added an option to +.Xr litterbox 1 +to provide a corresponding scooper link +in response to its query interface. +. +.Pp +A small demo of scooper is hosted at +.Aq Lk "https://causal.agency/scooper/" . +It publicly logs the +.Li #litterbox +channel on tilde.chat. +. +.Sh SEE ALSO +.Bl -item -compact +.It +.Lk "https://git.causal.agency/pounce" pounce +.It +.Lk "https://git.causal.agency/litterbox" litterbox +.It +.Lk "https://git.causal.agency/catgirl" catgirl +.It +.Lk "https://www.sqlite.org/fts5.html" "SQLite FTS5 Extension" +.It +.Lk "https://git.causal.agency/scooper" scooper +.It +.Lk "https://kristaps.bsd.lv/kcgi/" kcgi +.El +. +.Sh AUTHORS +.An June Bug Aq Mt june@causal.agency diff --git a/www/text.causal.agency/011-libretls.7 b/www/text.causal.agency/011-libretls.7 new file mode 100644 index 00000000..c29c325e --- /dev/null +++ b/www/text.causal.agency/011-libretls.7 @@ -0,0 +1,220 @@ +.Dd August 9, 2020 +.Dt LIBRETLS 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm LibreTLS +.Nd libtls for OpenSSL +. +.Sh DESCRIPTION +This is a sort of announcement post about LibreTLS, +my port of libtls from LibreSSL to OpenSSL. +If you've wanted to try any of my software +but have been unable to because of LibreSSL, +LibreTLS is an option that will likely work for you. +I'm including instructions +for building it and my IRC software +on Debian as an example, +since manually installing libraries +is less straightforward than it could be. +. +.Pp +libtls is +.Do +a new TLS library, +designed to make it easier to write foolproof applications +.Dc . +It was developed as part of LibreSSL, +.Ox Ap s +fork of OpenSSL, +and is implemented against their version of libssl. +It provides a nice high-level API +for TLS sockets, +with functions like +.Xr tls_connect 3 , +.Xr tls_read 3 +and +.Xr tls_write 3 . +This is a vast improvement over libssl's +confusing mess of an API! +Its relative obscurity is a real shame +for C programmers. +. +.Pp +An obvious cause of its obscurity +is that it is tied to LibreSSL. +Although LibreSSL is available +for platforms other than +.Ox , +it conflicts with OpenSSL +so is difficult to install alongside it +and is often not packaged at all. +Additionally, +even if a user manually installs LibreSSL, +libtls is likely not to work on some distros +due to its hardcoded CA bundle file path. +. +.Pp +Since libtls is implemented against libssl, +which originates in OpenSSL, +it should be possible to use libtls with it. +This is what I set out to do in LibreTLS. +I started by importing the sources +from a LibreSSL-portable release, +then worked on porting the portions +that were incompatible with OpenSSL. +. +.Pp +The simpler changes just involved +replacing internal struct field accesses +with public APIs. +libtls accesses libssl internals +using a hack to get the header files +to declare private struct fields, +and for basically no reason. +The bigger changes involved +reimplementing some functions +which only exist in LibreSSL, +but these were still quite small. +I also imported the necessary compatibility functions +from LibreSSL's libcrypto +and adapated the autotools build files +to produce only a libtls +which depends on OpenSSL. +. +.Pp +Along the way +I decided to make one small behavioural change +in order for LibreTLS to be more likely +to work for everyone. +I removed the hardcoded CA file path +and changed the default configuration +to use OpenSSL's default CA paths, +which include a CA directory. +This seems to be the preferred CA source +on systems such as Debian, +where the default CA file path doesn't exist. +. +.Pp +I think the reason LibreSSL +wants to avoid using a CA directory +is so that it can fully load the CA file +once before being sandboxed. +However, +using OpenSSL's default configuration, +the CA file will still be loaded immediately +if it exists. +If it doesn't exist, +sandboxed applications +will fail when trying to +load certificates from the directory, +but unsandboxed applications +will work just fine. +Since LibreSSL's libtls +would fail either way, +I think the new behaviour +is an improvement. +. +.Pp +Another advantage of separating libtls from LibreSSL +is that it is unencumbered by OpenSSL's +awkward double-license, +both of which are incompatible with the GPL. +libtls is all new ISC-licensed code, +and future versions of OpenSSL (3.0) +will be released under the Apache 2.0 license, +which is compatible with GPLv3. +In the future, +GPL software will be able to link with +libtls and OpenSSL without additional permissions. +. +.Pp +It's also worth noting that LibreSSL +likely will not be able to import any code +from future versions of OpenSSL, +since Apache 2.0 is on +.Ox Ap s +license shitlist. +LLVM is also slowly changing their license +to Apache 2.0, +so it'll be interesting to see what +.Ox +does. +. +.Ss Installing Manually +To install LibreTLS on Debian, +for example, +fetch a release tarball from +.Lk https://causal.agency/libretls/ +and install the build dependencies: +.Bd -literal -offset indent +sudo apt-get install build-essential libssl-dev pkgconf +.Ed +. +.Pp +.Xr pkgconf 1 +isn't a dependency of LibreTLS itself, +but it's how my software +configures its build +for a dependency on libtls. +The usual build steps +will install the library: +.Bd -literal -offset indent +\&./configure +make all +sudo make install +.Ed +. +.Pp +The library will be installed in +.Pa /usr/local/lib +by default, +and you need to make sure +the dynamic linker +will be able to find it there. +On Debian, +.Pa /usr/local/lib +already appears in +.Pa /etc/ld.so.conf.d/libc.conf , +but on other systems +you'll probably need to add it to either +.Pa /etc/ld.so.conf +or a new file such as +.Pa /etc/ld.so.conf.d/local.conf . +Once the library is installed +and the path is configured, +the linker cache needs to be refreshed: +.Bd -literal -offset indent +sudo ldconfig +.Ed +. +.Pp +You'll probably also need to set +.Ev PKG_CONFIG_PATH +for the configure scripts +of my software: +.Bd -literal -offset indent +PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure +.Ed +. +.Pp +On +.Fx , +LibreTLS and some of my IRC software +can be installed from my own +.Lk https://git.causal.agency/ports/ "ports tree" +. +.Sh SEE ALSO +.Bl -item -compact +.It +.Lk https://git.causal.agency/libretls/about LibreTLS +.It +.Lk https://man.openbsd.org/tls_init.3 "libtls API documentation" +.El +. +.Pp +Another alternative libtls implementation, +.Lk https://sr.ht/~mcf/libtls-bearssl/ "libtls-bearssl" +. +.Sh AUTHORS +.An June Bug Aq Mt june@causal.agency diff --git a/www/text.causal.agency/012-inability.7 b/www/text.causal.agency/012-inability.7 new file mode 100644 index 00000000..d352143b --- /dev/null +++ b/www/text.causal.agency/012-inability.7 @@ -0,0 +1,39 @@ +.Dd November 26, 2020 +.Dt INABILITY 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Inability +.Nd losing the ability to create +. +.Sh DESCRIPTION +For often weeks, sometimes months at a time, +I lose the ability to write new code. +I can still make fixes +and little cleanups +in my existing projects, +but if I try to work on something new, +nothing happens. +I can't get anything done. +. +.Pp +I think it's now been +over 3 months +since I've created anything. +I don't know what to do about it. +In the past I've eventually +regained the ability to code, +but it's unclear to me how or why. +I also don't know what +I should be doing instead. +Writing code is the only hobby +I've ever really developed, +so without it I basically +don't do anything. +. +.Pp +Does this happen to anyone else? +How do you cope? +. +.Sh AUTHORS +.Mt june@causal.agency diff --git a/www/text.causal.agency/013-hot-tips.7 b/www/text.causal.agency/013-hot-tips.7 new file mode 100644 index 00000000..63b6e353 --- /dev/null +++ b/www/text.causal.agency/013-hot-tips.7 @@ -0,0 +1,156 @@ +.Dd December 2, 2020 +.Dt HOT-TIPS 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm hot tips +.Nd from my files +. +.Sh DESCRIPTION +This is a short list of tips +from my configuration files and code +that might be useful. +. +.Ss Shell +.Bl -tag -width Ds +.It CDPATH=:~ +This is useful if you sometimes type, +for example, +.Ql cd src/bin +wanting to go to +.Pa ~/src/bin +but you aren't in +.Pa ~ . +If the path doesn't exist +in the current directory, +.Ic cd +will try it in +.Pa ~ +as well. +. +.It alias ls='LC_COLLATE=C ls' +This makes it so that +.Xr ls 1 +lists files in ASCIIbetical order, +which puts capitalized names like +.Pa README +and +.Pa Makefile +first. +. +.It git config --global commit.verbose true +Not shell but close enough. +This makes it so the entire diff is shown +below the usual summary +in the editor for a +.Xr git-commit(1) +message. +Useful for doing a quick review +of what you're committing. +.El +. +.Ss (neo)vim +.Bl -tag -width Ds +.It set inccommand=nosplit +This is the only +.Xr nvim 1 +feature I really care about +aside from the improved defaults. +This provides a live preview of what a +.Ic :s +substitution command will do. +It makes it much easier to +write complex substitutions. +. +.It nmap <leader>s vip:sort<CR> +This mapping sorts the lines of a paragraph, +or block of text separated by blank lines. +I use this a lot to sort +#include directives. +. +.It nmap <leader>S $vi{:sort<CR> +Similar to the last mapping, +this one sorts lines inside braces. +I use this to sort +switch statement cases +or array initializers. +. +.It nmap <leader>a m':0/^#include <<CR>:nohlsearch<CR>O#include < +I use this mapping to add new +#include directives, +usually followed by +.Ic <leader>s +and +.Ic '' +to sort them +and return to where I was. +. +.It nmap <leader>d :0delete<CR>:0read !date +'.Dd \e%B \e%e, \e%Y'<CR> +I use this to replace the first line of +.Xr mdoc 7 +files with the current date. +.El +. +.Ss C +.Bl -tag -width Ds +.It #define Q(...) #__VA_ARGS__ +This is what I've started using +to quote things like SQL statements +or HTML fragments in C. +Anything that happens to be valid C tokens, +which is most code, +can be quoted this way. +Macros are not expanded +inside the quoted part. +You can embed (matched) quotes +without having to escape them. +Whitespace gets collapsed, +so you can write nicely formatted multi-line SQL +that doesn't mess up your debug logging, +for example. +.Bd -literal -offset indent +const char *sql = Q( + INSERT OR IGNORE INTO names (nick, user, host) + VALUES (:nick, :user, :host); +); +.Ed +. +.It #define BIT(x) x##Bit, x = 1 << x##Bit, x##Bit_ = x##Bit +I use this macro to declare bitflag enums. +It takes advantage of +auto-incrementing enum items +so you don't need to set the values manually. +You also get constants +for both the bit index +and the flag value +for each item. +.Bd -literal -offset indent +enum Attr { + BIT(Bold), + BIT(Reverse), + BIT(Italic), + BIT(Underline), +}; +.Ed +.Pp +For example, +defines +.Sy ItalicBit = 2 +and +.Sy Italic = 1 << 2 . +Ignore the extraneous constants. +. +.It typedef int FnType(const char *str, size_t len); +You can just typedef function types! +It annoys me more than it probably should +that everyone writes ugly +function pointer typedefs. +Just stick +.Sy typedef +on the front of a function declaration +and use +.Vt FnType * . +.El +. +.Sh AUTHORS +.Mt june@causal.agency diff --git a/www/text.causal.agency/014-using-vi.7 b/www/text.causal.agency/014-using-vi.7 new file mode 100644 index 00000000..e6a6a7a0 --- /dev/null +++ b/www/text.causal.agency/014-using-vi.7 @@ -0,0 +1,135 @@ +.Dd January 11, 2021 +.Dt USING-VI 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Using vi +.Nd simpler tools +. +.Sh DESCRIPTION +Happy new year +and hello from +.Xr vi 1 ! +I'm in the mood to post something +but not in the mood for +.Dq social +media. +This one will probably be short. +. +.Pp +Yesterday I was trying to work on sandboxing +.Xr catgirl 1 +(that's the IRC client I work on) +with +.Xr pledge 2 +and +.Xr unveil 2 +on +.Ox , +as suggested by the maintainer of its port. +I've done similar things before, +but only on server software +rather than user software. +. +.Pp +Anyway I was in +.Xr ssh 1 +to my +.Ox +VM +.Po +sadly I don't currently have any hardware to run +.Ox +on +.Pc +using my usual editor, +which is +.Xr nvim 1 . +I'm honestly not very thrilled +with what neovim is doing lately, +but the cleaned up defaults +make my configuration files happier. +. +.Pp +The real problem with +.Xr nvim 1 , +though, +is that it's laggy as hell on +.Ox . +There is significant delay +on every single keystroke, +as if I'm typing remotely to a server +on the other side of the world, +but this is on a local VM! +. +.Pp +So I did the only reasonable thing: +I typed +.Sy :qa +followed by +.Sy vi . +The difference was astonishing. +Typing and editing suddenly felt +.Em physical +again. +(I put that in italics even though I know it won't render.) +Not only was it a vast improvement over +.Xr nvim 1 +in +.Xr ssh 1 +in a VM, +it was a marked improvement over +.Xr nvim 1 +running locally and natively. +. +.Pp +Now obviously +.Xr vi 1 +doesn't have all the bells and whistles +of newer editors, +but of course the core editing model +that makes +.Xr vim 1 +and +.Xr nvim 1 +so good is there, +and in purer form, +I think. +The +.Xr vi 1 +manual page +is feasible to just sit down and read, +and learn everything there is to know about the editor. +I set up a basic configuration +and got coding. +.Bd -literal -offset indent +export EXINIT='set ai ic sm sw=4 ts=4' +.Ed +. +.Pp +After I finished my +.Xr pledge 2 +and +.Xr unveil 2 +patch, +I was so pleased with +.Xr vi 1 +that I kept on using it +yesterday and today +for other work, +and obviously to write this post. +Despite the lack of editor amenities, +its responsiveness and simplicity +are enough to make using it +.Em comfortable +and perhaps +.Em cosy . +I'm not sure I'll ever use +.Xr vi 1 +full-time, +but for now I am much less likely +to launch +.Xr nvim 1 . +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency diff --git a/www/text.causal.agency/015-reusing-tags.7 b/www/text.causal.agency/015-reusing-tags.7 new file mode 100644 index 00000000..19546496 --- /dev/null +++ b/www/text.causal.agency/015-reusing-tags.7 @@ -0,0 +1,155 @@ +.Dd January 17, 2021 +.Dt REUSING-TAGS 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm reusing tags +.Nd beyond ctags +. +.Sh DESCRIPTION +I've tried to start writing this post a couple times now +and I keep getting bogged down in explanations, +so I'm just going to tell you +about some cool things I did +and hope they make sense. +. +.Pp +When I wrote my first syntax highlighter, +I decided that function definitions +should have anchor links, +because line number anchor links +are entirely useless +if you expect the file to change at all. +Since the syntax highlighter +was somewhat deliberately just a big pile of regex, +I hacked in more regex to try +to identify function and type definitions. +It wasn't elegant and it didn't always work well. +It did work though, +and I found the links very useful. +. +.Pp +Recently I was thinking about +the lexer generator +.Xr lex 1 +and decided to +rewrite the syntax highlighter +using it. +Really syntax highlighting +is no different than lexical analysis. +I ran into a problem though, +trying to preserve my anchor link function, +because really that should involve +some amount of parsing. +Trying to port my regex hacks to +.Xr lex 1 +made the lexers way more complicated +and less reliable, +so I gave up on it for a while. +. +.Pp +And then, +probably in the shower, +I realized I was approaching it +completely from the wrong direction. +There's already a tool that does what I want, +and I already use it: +.Xr ctags 1 . +All I need to do is use its output +to insert anchor links +into my syntax highlighter output. +In an afternoon I wrote +.Xr htagml 1 , +which loads tag definitions for its input file, +then scans through the input for where they match. +It can either HTML-escape +the input as it goes, +or use already formatted HTML +being piped into it from a syntax highlighter. +. +.Pp +The result is three simple tools +working together to accomplish +what a more complex tool +couldn't reliably achieve. +I'm very pleased with it, +and I've updated my site and cgit +to use the new +.Xr lex 1 Ns -based +highlighter, +.Xr ctags 1 +and +.Xr htagml 1 . +I'm currently missing a lexer for +.Xr sh 1 , +but I plan to write it eventually. +I also want to write a tool +to generate tags for +.Xr make 1 , +.Xr mdoc 7 +and perhaps +.Xr sh 1 . +The cool thing about generating more kinds of tags +is that they'll not only improve +the HTML output, +they'll also be usable in my editor. +. +.Pp +Speaking of generating different kinds of tags, +I also wrote some scripts not too long ago +for reading IETF RFCs offline. +The plain text files are available to +.Xr rsync 1 , +but they're hard to navigate on their own. +By scanning the files for headings +and generating tags, +it allows jumping to sections using +.Ic :ta +or +.Ic ^] +in +.Xr vi 1 . +For +.Xr nvim 1 +I also added an +.Ic :RFC +command to open an RFC by number +and set up +.Ic ^] +to work optimally for them. +. +.Pp +I'm still using +.Xr vi 1 +for most of my editing, +by the way. +And of course +.Xr ctags 1 +was made to work with it! +Simple old tools +are really doing it for me lately. +. +.Sh SEE ALSO +.Bl -item -compact +.It +.Lk https://causal.agency/bin/htagml.html htagml +.It +.Lk https://causal.agency/bin/hilex.html hilex +.It +.Lk https://git.causal.agency/src/tree/doc/rfc rfctags +.El +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +. +.Sh ADDENDUM +.Xr catgirl 1 , +.Xr pounce 1 , +.Xr litterbox 1 +and +.Xr scooper 1 +all have new releases, +if you're using any of them. +Also, this space is now +available over gopher, +if that's your sort of thing. diff --git a/www/text.causal.agency/016-using-openbsd.7 b/www/text.causal.agency/016-using-openbsd.7 new file mode 100644 index 00000000..b843e3c3 --- /dev/null +++ b/www/text.causal.agency/016-using-openbsd.7 @@ -0,0 +1,505 @@ +.Dd February 14, 2021 +.Dt USING-OPENBSD 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Using OpenBSD +.Nd for real +. +.Sh DESCRIPTION +Hello from +.Ox ! +After wishing one too many times +that I had a real BSD +on a physical machine, +I finally got around to +just installing one on my +mid-2014 MacBook Pro. +I hadn't done it sooner +because I didn't realize +how easy it would be. +It helped that I already had a +.Dq Boot Camp +partition with a disused Windows 8 install +that I could replace. +. +.Pp +I roughly followed an old jcs gist +along with the +.Ox +Disk Setup guide. +I'm once again happy +that I bought a printer\(em +they're very useful for instructions +to install an operating system +on your only usable computer. +I set up encrypted softraid +and the operating system +installed smoothly. +. +.Pp +Next I had to install rEFInd, +since the default Mac boot manager +is really not keen on booting much. +Installing it requires using the +macOS recovery partition these days. +But there was a problem +with my new boot menu: +I was promised a picture of Puffy, +and instead I just got some abstract coloured circles! +Turns out a bunch of OS icons +got removed from rEFInd at some point, +and I had to rescue Puffy +from the git history. +. +.Pp +So I could happily boot +.Ox +by selecting Puffy, +but I had no networking. +I thought the wifi chip might be supported by +.Xr bwfm 4 , +but I got unlucky and it's a BCM4360, +which everything hates. +Based on the jcs gist, +I checked the list of hardware +supported by the +.Xr urtwn 4 +driver for a wifi dongle to order. +Just having a clear list +in the driver manual is wonderful. +I went with the Edimax EW-7811Un v2, +which I could get for around $20. +It's nice and tiny, +though it has a piercing blue LED +(destroy all blue LEDs) +which I had to cover with electrical tape. +. +.Pp +I had to do one other thing +before I could get it all working, though. +When I had checked the +.Xr urtwn 4 +hardware list, +I had been looking at +.Ox Ns -current , +but I had installed +.Ox 6.8 , +and support for the v2 hardware +I had bought was added after that release. +So I downloaded a snapshot +.Pa bsd.rd +along with the +.Xr urtwn 4 +firmware file +to a USB drive +and upgraded the system. +. +.Pp +Connecting to wifi with +.Xr ifconfig 8 +is a breeze, by the way, +and then you just write the same thing to a +.Xr hostname.if 5 +file to make it automatic. +I wanted to use +.Ox +for exactly this reason: +simple, consistent, cohesive, well-documented tools. +. +.Pp +Finally, I got to configuring. +The console is configured with +.Xr wsconsctl 8 , +and similarly you can put the commands in +.Xr wsconsctl.conf 5 +to have them run at boot. +I added +.Li display.brightness=50% +to tone down the brightness, +which is initially 100%, +and +.Li keyboard.backlight=0% +to turn off those annoying lights. +.Xr wsconsctl.conf 5 +is also where you can set +trackpad settings if you're not using +.Xr synaptics 4 . +I ended up using: +.Bd -literal -offset indent +mouse1.tp.tapping=1 +mouse1.tp.scaling=0.2 +mouse1.reverse_scrolling=1 +.Ed +.Pp +This enables tapping with several fingers +to simulate different mouse buttons, +makes the cursor move at a reasonable speed +and scrolling move in the right direction. +I also set up my usual modified QWERTY layout. +. +.Pp +For +.Xr X 7 +I had enabled +.Xr xenodm 1 , +which seems quite nice. +It automatically prompts you to add your +.Xr ssh 1 +keys to +.Xr ssh-agent 1 +when you log in. +One of the reasons I had not wanted +to set up another graphical system +is that I thought +I would have to make too many choices, +and that I would have to choose least bad options +rather than actually good options, +but +.Ox +already includes reasonable choices. +I wanted to use +.Xr cwm 1 , +so I started a basic +.Pa .xsession +file: +.Bd -literal -offset indent +\&. ~/.profile +export LC_CTYPE=en_US.UTF-8 +xset r rate 175 m 5/4 0 +xmodmap ~/.config/X/modmap +xrdb -load ~/.config/X/resources +exec cwm -c ~/.config/cwm/cwmrc +.Ed +. +.Pp +The +.Xr xset 1 +command sets keyboard repeat rate +and mouse acceleration. +I spent some time going through +.Xr cwm 1 Ap s +functions and writing up bindings +that would get me something close enough +to what I'm used to in macOS. +Most importantly, +putting everything on the 4 modifier (command key). +. +.Pp +I also added key bindings on F1 and F2 +to adjust the brightness with +.Xr xbacklight 1 , +and on F10, F11 and F12 +to adjust volume with +.Xr sndioctl 1 . +I'm not sure why the F keys +just send regular F1, F2, etc.\& +regardless of the Fn key. +I don't use F keys for anything else though, +so I'm not too concerned. +Once again, +.Xr sndioctl 1 +is such an easy straightforward tool: +.Bd -literal -offset indent +bind-key F10 "sndioctl output.mute=!" +bind-key F11 "sndioctl output.level=-0.05" +bind-key F12 "sndioctl output.level=+0.05" +.Ed +. +.Pp +For aesthetic configuration, +I added a new output to my +.Xr scheme 1 +colour scheme tool for +.Xr X 7 Ns -style +RGB and +.Xr xterm 1 +resources. +Normally I use the +.Em Go Mono +font, +but since +.Ox +already includes +.Em Luxi Mono , +which +.Em Go Mono +is based on, +I used that. +The most important configuration +to make anything readable on a high-DPI display is: +.Bd -literal -offset indent +Xft.dpi: 144 +Xft.antialias: true +Xft.hinting: false +.Ed +. +.Pp +I'm annoyed that I haven't found +where these resources are actually documented. +I would hope they'd be in +.Xr Xft 3 +or something, +but they're not. +Anyway, +turning off hinting +seems absolutely necessary +to prevent text from looking like garbage. +. +.Pp +It seems that to get a reasonably sized cursor +I need to install +.Sy xcursor-dmz . +I'd prefer if there wasn't this one +extra package that I needed +for a reasonable setup. +Tangentially, +I've never understood why +the black versions of dmz cursors +are called +.Dq aa +when it seems like that +would stand for antialiasing +or something. +.Bd -literal -offset indent +Xcursor.size: 64 +Xcursor.theme: dmz-aa +.Ed +. +.Pp +For a desktop background, +I found a cute bitmap (little picture) +of snowflakes already in the system +and used colours from my usual scheme: +.Bd -literal -offset indent +xsetroot -bitmap /usr/X11R6/include/X11/bitmaps/xsnow \e + -bg rgb:14/13/0E -fg rgb:7A/49/55 +.Ed +. +.Pp +Since I'd rather not install anything +I don't have to, +I went with the default +.Xr xterm 1 . +It seems more than adequate, honestly. +I read through its RESOURCES +section to configure it how I like. +The important settings are +.Sy XTerm*utf8 +and +.Sy XTerm*metaSendsEscape . +Since I'm used to copying and pasting on macOS, +I added equivalent +.Dq translations : +.Bd -literal -offset indent +XTerm*VT100*translations: #override \en\e + Super <Key>C: copy-selection(CLIPBOARD) \en\e + Super <Key>V: insert-selection(CLIPBOARD) +.Ed +. +.Pp +The next thing I needed +was a clock and battery indicator. +I actually had my battery die on me +while I was doing all this, +which reminded me. +.Xr xclock 1 +would be perfect, +but then I'd need something else +for battery. +There are a couple basic battery indicators +for X in ports, +but they're terribly ugly. +I wanted something as simple as +.Xr xclock 1 , +but that I could add some other text to. +Then I realized I could just use +.Xr xterm 1 +for that. +To my +.Pa xsession +I added: +.Bd -literal -offset indent +xterm -name clock -geometry 14x1-0+0 -sl 0 -e clock & +.Ed +.Pp +This places a little terminal +in the top-right corner of the screen +with no scrollback lines, +running a script called +.Pa clock . +To have +.Xr cwm 1 +treat it like a +.Dq panel +and show it on every desktop, +I added this to my +.Pa cwmrc : +.Bd -literal -offset indent +ignore clock +autogroup 0 clock,XTerm +.Ed +.Pp +The +.Pa clock +script simply uses +.Xr date 1 +and +.Xr apm 8 +to print the time and battery charge +every minute: +.Bd -literal -offset indent +tput civis +sleep=$(( 60 - $(date +'%S' | sed 's/^0//') )) +while :; do + if [ $(apm -a) -eq 1 ]; then + printf '%3s%%' "$(apm -l)" + else + test $(apm -b) -eq 2 && tput setaf 1 bold + printf '%3.3sm' "$(apm -m)" + tput sgr0 + fi + printf ' %s\r' "$(date +'%a %H:%M')" + sleep $sleep + sleep=60 +done +.Ed +.Pp +The initial setting of +.Va sleep +is to align the updates +with the minute ticking over. +I made the battery output +a bit fancier by showing +percentage while charging, +minutes left while discharging, +and highlighting in red +when the battery is +.Dq critical . +. +.Pp +Now is a good time to mention adding +.Ql apmd_flags=-A +to +.Pa /etc/rc.conf.local +to enable +.Dq automatic performance adjustment , +or not running your battery flat +as fast as possible mode. +It seems like I can get up to 3 hours +of battery life depending on the screen brightness, +but this is quite an old battery by now. +. +.Pp +The other thing I needed +was something to tone down +that awful, evil blue light from the screen. +I asked around and someone told me about +.Xr sct 1 , +originally written by tedu. +The package also includes a little +.Xr sctd 1 +script that you can add to your +.Pa .xsession +to have it automatically adjust +the colour temperature throughout the day. +My eyes are no longer being assaulted. +. +.Pp +While I was doing all this, +I of course needed to talk about it on IRC, +and it was very nice to be able to +install my own IRC client with: +.Bd -literal -offset indent +doas pkg_add catgirl +.Ed +.Pp +I don't plan to do +general Web Browsing on +.Ox , +and there is definitely +no good choice for browser, +so I just installed +.Xr imv 1 , +.Xr mpv 1 , +.Xr youtube-dl 1 +and +.Xr w3m 1 . +I wrote a script +to open images by piping +.Xr curl 1 +into +.Xr imv 1 , +videos with +.Xr mpv 1 , +and everything else with +.Xr w3m 1 +in a new +.Xr xterm 1 . +Annoyingly, +.Xr mpv 1 +seems incapable of exiting +without segfaulting. +That's quality. +. +.Pp +One thing I am still missing +is automatic brightness adjustment +based on ambient light +like macOS can do. +I can read the sensor with +.Xr sysctl 8 +.Cm hw.sensors.asmc0.illuminance0 , +which is measured in lux. +I tried doing something with it in a script, +but it seems tricky to map its value +to brightness adjustments +and to play nice with manual brightness changes, +so I'll just keep doing it manually for now. +. +.Pp +Update: +prx sent mail to let me know about +.Aq Lk https://github.com/jcs/xdimmer . +I should've guessed jcs had written something. +. +.Pp +And that's my current +.Ox +setup after a week of using it. +I'm quite enjoying it, +and still being pleasantly surprised +by the quality-of-life from +.Ox +tools and documentation. +For a small example, +I can jump to sections +or flag definitions in +.Xr man 1 +using +.Ic :t . +Systems without basic usability like that +should be ashamed. +. +.Pp +I would post a screenshot, +but this is +.Li text.causal.agency +;) +. +.Sh SEE ALSO +.Lk https://gist.github.com/jcs/5573685 +.Pp +My full configurations are in +.Aq Lk https://git.causal.agency/src . +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +. +.Sh BUGS +There's a red LED +inside the headphone jack +that is always on +and I have no idea how to turn off. +If anyone knows +please send me an email. diff --git a/www/text.causal.agency/017-unpasswords.7 b/www/text.causal.agency/017-unpasswords.7 new file mode 100644 index 00000000..f9643f2f --- /dev/null +++ b/www/text.causal.agency/017-unpasswords.7 @@ -0,0 +1,153 @@ +.Dd February 20, 2021 +.Dt UNPASSWORDS 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Unpasswords +.Nd password anti-management +. +.Sh DESCRIPTION +Right away I want to say +that I'm not trying to tell anyone +how to manage their online authentication. +This is just how I do it, +and I haven't seen anyone else write about it. +. +.Pp +I don't use a password manager. +It's not a type of software +I want to deal with. +For the small handful of sites +that I use regularly +and that actually matter, +I use strong passwords +(stored in my noggin) +and TOTP. +For everything else, +I simply do not know the password, +and neither does any software. +. +.Pp +I think I started doing this one time +when I had legitimately forgotten +the password to some old account. +I clicked on +.Dq forgot my password +and opened the email, +but I didn't want to +come up with a new password +I would just forget again. +Instead I set a random one +.Po +I usually use +.Ql openssl rand -base64 33 +for this +.Pc +and immediately used that to log in +while it was still in my clipboard. +Next time I wanted to log in, +I could use +.Dq forgot my password +again. +. +.Pp +Thinking about it, +I realized that any web authentication +with an email password reset flow +is only ever as strong as +the authentication for your email account. +So what is the point of having +all these passwords set on different sites? +They all answer to your email account, +and storing them in a password manager +seems to add another potential point of failure. +May as well have no other passwords at all, +or as close as possible. +.Po +Shout out to sites like Liberapay +and asciienema +which let me not set a password at all. +.Pc +. +.Pp +So I started doing that for any site +that I don't regularly log in to. +Going through the password reset flow +can be a bit slow, +but it doesn't need to be done often. +And I can do it from anywhere +I have access to my email, +which I feel is more easily reliable +than syncing password management databases. +It's quite stress-free. +. +.Pp +After doing this manually for years, +this week I finally got around to +writing some automation for it. +A while ago I had written +.Xr imbox 1 , +a tool to directly export mail +in mboxrd format from IMAP, +along with +.Xr git-fetch-email 1 , +a wrapper which offloads configuration to +.Xr git-config 1 . +It can match emails by +Subject, From, To and Cc. +This week I added a flag +to use IMAP IDLE +to wait for a matching message +if there isn't one already, +and a flag to move matching messages +(for example to Trash) +after exporting them. +. +.Pp +With those two new flags, +I started writing some shell scripts +to automate the password reset flow +using +.Xr curl 1 +to submit forms and +.Xr git-fetch-email 1 +with +.Xr sed 1 +to pull the reset tokens +from my inbox. +At the end of the script, +the random password it set +is copied to the clipboard +and the login page for the site is opened. +So now logging in is as simple +as running a command, +waiting for the login page to open, +and pasting. +. +.Pp +The script isn't sophisticated, +but I don't think it needs to be. +I've written functions +for a couple different sites already, +and they all work in mostly the same way. +Writing a new one is just a matter +of identifying the form URLs and fields +along with where the token is in the email. +I'm not going to turn this automation +into any kind of generally usable project, +because I don't want to have to +maintain functions for tonnes of different services. +If you're interested in this idea, +I encourage you to use my script as a template +and implement the functions for services you use. +. +.Sh SEE ALSO +.Bl -item -compact +.It +.Lk https://git.causal.agency/imbox +.It +.Lk https://causal.agency/bin/sup.html +.El +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency diff --git a/www/text.causal.agency/018-operating-systems.7 b/www/text.causal.agency/018-operating-systems.7 new file mode 100644 index 00000000..691102e2 --- /dev/null +++ b/www/text.causal.agency/018-operating-systems.7 @@ -0,0 +1,86 @@ +.Dd February 22, 2021 +.Dt OPERATING-SYSTEMS 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Operating systems +.Nd criteria +. +.Sh DESCRIPTION +Sometimes in conversation +I use the term +.Dq real operating system +which people, +perhaps rightfully, +take as inflammatory. +But I have actually thought about +what I mean when I say +.Dq real operating system +and come up with +this list of criteria. +. +.Pp +An operating system should be... +.Bl -bullet +.It +Consistent and cohesive: +all parts of the system should have similar +usage, configuration, documentation and so on. +Parts of the system should naturally work together, +because they were designed to do so. +. +.It +Documented: +the system should include its own documentation. +A user should not have to +search some external wiki +to learn how the system works. +It should be obvious +where to find documentation +on a particular topic. +. +.It +Programmable: +the system should provide +a way to program the computer. +A computer which cannot be programmed +is not a computer at all. +Usually this takes the form +of a C compiler +and the tools that go with it. +In earlier times, +it might have been +a BASIC interpreter. +. +.It +Examinable and modifiable: +the full source tree +for the system should be included, +or easily obtainable +through official means. +A user should have no trouble +finding the corresponding source +for a part of the system. +Together with the previous point, +the source tree should be +compiled by the included toolchain, +allowing local modification. +.El +. +.Pp +Some things that may be parts +of real operating systems, +but are not themselves operating systems: +a kernel, +a package manager, +a collection of packages. +. +.Pp +I will leave it as an +.Dq exercise for the reader +to guess which operating systems +meet these criteria +and which don't. +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency diff --git a/www/text.causal.agency/019-mailing-list.7 b/www/text.causal.agency/019-mailing-list.7 new file mode 100644 index 00000000..b3490a94 --- /dev/null +++ b/www/text.causal.agency/019-mailing-list.7 @@ -0,0 +1,286 @@ +.Dd March 4, 2021 +.Dt MAILING-LIST 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Mailing List +.Nd a small-scale approach +. +.Sh DESCRIPTION +When I initially published +some software I expected +other people to use, +I just asked that patches +be mailed directly to me, +but I figured that +if more people were interested, +it would be better +to have a mailing list. +Unfortunately +email software, +mailing list options in particular, +are quite daunting. +I wanted a light-weight option +that would require me to host +as little software as possible. +. +.Pp +My regular email is hosted by Fastmail, +and I poked around its settings +to see what I could do. +It turns out Fastmail lets you +configure address aliases to +.Dq also send to all contacts in +a contacts group. +That's a mailing list! +I created a group called +.Dq List +and an alias called +.Mt list@causal.agency +configured to deliver to that group. +So it's really just an alias +for my regular address +that happens to also +deliver to another group of people. +. +.Pp +It's easier to just configure +and manage one mailing list, +so what I do is ask patches and feedback +to be sent to +.Mt list+catgirl@causal.agency , +for example. +Fastmail treats any +.Ar +suffix +the same as the base address, +but the full address can be used +by subscribers to filter mail by topic +if they wish. +. +.Pp +To subscribe someone to the list, +I add their contact to the group. +For a long time I was planning +to write some software +to manage these subscriptions. +It should be possible +to process subscription requests from IMAP +and manipulate the contact group with CardDAV. +When I went to start implementing this, +however, +I found CardDAV (and WebDAV in general) +completely inscrutable. +It's the kind of protocol +that is split across like 20 +different RFCs +and you can't understand anything +by just reading +the one you actually care about. +So I've given up on that +and will keep manually subscribing people +on request. +. +.Pp +The only thing missing, then, +is a way for people to read +mail sent to the list +while they aren't subscribed. +All the existing +mailing list archive software +I know of +expects to have the mail locally, +but I'd rather keep all my mail in IMAP. +First, +in order to make sure +I keep a complete archive +of the mailing list in IMAP, +I added a small amount +of Sieve code +to my Fastmail filters configuration: +.Bd -literal -offset indent +if address :matches ["To", "Cc"] "list*@causal.agency" { + fileinto :copy :flags "\e\eSeen" "INBOX.List"; +} +.Ed +. +.Pp +Sieve is a small standard language +specifically for filtering mail. +This bit of code matches +anything sent to the list +and adds a copy of it +(the original is going into my inbox) +to the +.Dq List +folder +and marks the copy as read. +. +.Pp +With a pristine IMAP mailbox +to export from, +I wrote a new archive generator. +It's called +.Xr bubger 1 +kirg (have it in a way). +My goal was to render directly from IMAP +and produce only static files as output, +making it not only easy to serve, +but also to run in one place +and copy the files elsewhere. +That's important to me +because it has access to my email, +so I'd rather run it +on my local network and +.Xr rsync 1 +its output into The Cloud. +The static files are in +HTML, Atom and mboxrd formats. +. +.Pp +The architecture of +.Xr bubger 1 +is that for each piece of mail, +identified by its UID in the mailbox, +HTML and Atom fragments +are exported along with the mboxrd. +Those fragments are then stitched together +using the IMAP SORT and THREAD extensions +to make full pages and feeds +for each thread. +The fragments act as a cache +for subsequent runs. +. +.Pp +I admit I did some +pretty questionable things +to achieve this. +Namely, +I wrote a small string templating engine in C. +I use it to produce the HTML +and XML for Atom, +as well as to generate URLs +and paths. +I'm really happy with how it works, actually. +This is also where +I really started using +one of my favourite C hacks: +.Bd -literal -offset indent +#define Q(...) #__VA_ARGS__ +.Ed +. +.Pp +I quote all my HTML/XML templates +with this and it's lovely. +. +.Pp +I've been working on +.Xr bubger 1 +on and off for almost a year now, +and it's been interesting. +I learned a lot about how email +works from having to deal with +all the ways a message can be. +Thankfully a lot of that dealing +is done by the IMAP server. +. +.Pp +As for running it, +I initially just ran it with +.Xr cron 8 , +and that's still a good way to go. +To hook it up to +.Xr rsync 1 , +pipe it like so: +.Bd -literal -offset indent +bubger -C list [...] | rsync -a --files-from=- list remote:list +.Ed +. +.Pp +Later, +I got a little annoyed +with having to wait +for the next run +if I wanted to link +to some mail I just received. +I added an option +to use IMAP IDLE +to wait for new mail continuously +and I started running it +under my process supervisor, +.Xr catsitd 8 . +. +.Pp +The setup is a little more complex +to feed the list of updated files to +.Xr rsync 1 . +I added the +.Xr catsit-watch 1 +utility to run a command +when a file changes, +and in my +.Xr catsit.conf 5 +I have the following: +.Bd -literal -offset indent +bubger ~/.local/libexec/bubger +rsync catsit-watch -i -f ~/list/UIDNEXT ~/.local/libexec/rsync +.Ed +. +.Pp +The +.Pa ~/.local/libexec/bubger +script runs +.Xr bubger 1 , +writing the list of updated paths to +.Pa ~/list/FILES : +.Bd -literal -offset indent +exec bubger -i -C ~/list [...] >~/list/FILES +.Ed +. +.Pp +And the +.Pa ~/.local/libexec/rsync +script gets run each time a +.Xr bubger 1 +update completes +.Po +.Pa UIDNEXT +is always the last file written +.Pc +and copies the listed files +to the remote host: +.Bd -literal -offset indent +exec rsync -a --files-from=$HOME/list/FILES ~/list remote:list +.Ed +. +.Pp +I haven't tagged any +.Xr bubger 1 +releases yet +because it hasn't gotten +a huge amount of testing, +and I'm not sure anyone but me +would even want to use it. +But I'm happy +with how it's working right now, +so I might tag 1.0 soon +just for fun. +. +.Sh SEE ALSO +.Bl -item -compact +.It +.Lk https://causal.agency/list/ +.It +.Lk https://git.causal.agency/bubger/about +.It +.Lk https://git.causal.agency/catsit/about +.El +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +. +.Sh BUGS +Almost every time +I try to type +.Dq mailing list +I instead type +.Dq mailist list . diff --git a/www/text.causal.agency/020-c-style.7 b/www/text.causal.agency/020-c-style.7 new file mode 100644 index 00000000..9816dbc3 --- /dev/null +++ b/www/text.causal.agency/020-c-style.7 @@ -0,0 +1,172 @@ +.Dd March 16, 2021 +.Dt C-STYLE 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm C Style +.Nd a rough description +. +.Sh DESCRIPTION +This is a rough description +of the style in which I write C, +since it's uncommon +but some people seem to like it. +I don't have any hard rules, +it just needs to look right. +. +.Ss Superficialities +I use tabs +and they're set to 4 characters wide +in my editor. +I keep my lines shorter than 80 columns, +which I enforce by +not resizing my terminal's width. +I use block indentation only, +meaning I write long function calls +like this: +.Bd -literal -offset indent +fprintf( + imap.w, "%s UID THREAD %s UTF-8 %s\er\en", + Atoms[thread], algo, search +); +.Ed +.Pp +Anything that can be sorted +should be sorted, +with trailing commas where possible. +This and block indentation +make for simpler diffs. +.Pp +I either write single-line ifs +or always use braces. +I put parentheses +around ternary expressions. +I use camelCase +for functions and variables, +and PascalCase for types and constants. +When an acronym appears +in an identifier, +it's in either all lower case +or all upper case. +The despicable SCREAMING_SNAKE_CASE +is reserved for macros. +I don't set globals or statics to zero +since that is already the default. +I don't compare against zero or NULL +unnecessarily. +. +.Ss \&No side-effects in control flow +I never write a function call +with side-effects +inside the condition of an if statement. +I find this makes following the +.Dq happy path +through functions +much easier. +I write things like this: +.Bd -literal -offset indent +pidFile = open(pidPath, O_WRONLY | O_CREAT | O_CLOEXEC, 0600); +if (pidFile < 0) err(EX_CANTCREAT, "%s", pidPath); + +error = flock(pidFile, LOCK_EX | LOCK_NB); +if (error && errno != EWOULDBLOCK) err(EX_IOERR, "%s", pidPath); +if (error) errx(EX_CANTCREAT, "%s: file is locked", pidPath); +.Ed +.Pp +I do write side-effects +inside for and while statement heads, +since that's generally expected. +For some reason +I like to write the constant first +if I'm comparing the result of an assignment +with a side-effect. +.Bd -literal -offset indent +for (ssize_t len; 0 <= (len = getline(&buf, &cap, file)); ++line) +.Ed +. +.Ss Paragraphs +I leave blank lines +between logical chunks of +.Dq things happening . +This is usually between side-effects +with their related error handling, +or between groups of closely related side-effects. +I try to keep variable declarations +glued to the top of the bit of code +they're used in. +. +.Ss Leading break +I've mentioned this previously. +I write my switch statement breaks +before each case label. +Doing this aligns nicely, +and being in the habit +means I always avoid +accidental fallthrough. +.Bd -literal -offset indent +switch (opt) { + break; case 'a': append = 1; + break; case 'd': delay = strtol(optarg, NULL, 10); + break; case 'f': watch(kq, optarg); + break; case 'i': init = 1; + break; default: return EX_USAGE; +} +.Ed +. +.Ss Function type definitions +Function types are always typedef'd, +and it's the function type itself +that is defined, +not a function pointer type! +I put the typedef above any functions +that are supposed to be of that type +so it's clear what the pattern is. +.Bd -literal -offset indent +typedef void Action(struct Service *service); +Action *fn = NULL; +.Ed +. +.Ss Constants +I prefer enums over #defines +for integer constants, +and static const strings over #defines +unless I want to do concatenation. +.Bd -literal -offset indent +enum { Cap = 1024 }; +.Ed +.Pp +I avoid the preprocessor +wherever possible, +with the notable exception of X macros, +which I've talked about previously. +Doing things in the actual language +makes for easier debugging. +. +.Ss Organization +I usually use only one header file +in each project. +The dependency is easy to declare +and the complete rebuild +when the header changes +isn't a problem for small projects. +Unless it's a single-file program, +I name the file which contains main +something generic, +since the name of the project +isn't relevant to its function. +I name functions like +.Ar nounVerb , +and all the functions for a +.Ar noun +are defined in +.Pa noun.c . +Not really to do with C, +but I always put a FILES section +in my README pages +to briefly describe +the layout of the code +for anyone looking to +read or make changes to it. +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency diff --git a/www/text.causal.agency/021-time-machine.7 b/www/text.causal.agency/021-time-machine.7 new file mode 100644 index 00000000..93d35c1e --- /dev/null +++ b/www/text.causal.agency/021-time-machine.7 @@ -0,0 +1,144 @@ +.Dd April 25, 2021 +.Dt TIME-MACHINE 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Time Machine +.Nd an awful one +. +.Sh DESCRIPTION +If, like me, +you have a Raspberry Pi 3 at home +that you've just upgraded to +.Fx 13.0 +which has a hard drive +from an old laptop +attached to it by USB adapter +with ZFS on it +and you want to +use that as a Time Machine +backup destination +over SMB using +.Xr samba 8 , +despite +.Xr samba 8 +being awful software +and using ZFS on a system +with only 1 GB of RAM +being a terrible idea, +this is how to do it. +. +.Pp +In +.Pa /usr/local/etc/smb4.conf : +.Bd -literal -offset indent +[global] +vfs objects = zfsacl catia fruit streams_xattr +fruit:metadata = stream +fruit:model = Macmini + +[TimeMachine] +read only = no +path = /media/zhdd/backup/TimeMachine +fruit:time machine = yes +fruit:time machine max size = 250G +.Ed +. +.Pp +The important thing here is +.Sy zfsacl +in the vfs objects list. +Most pages will tell you about the others, +but without +.Sy zfsacl +Time Machine will just fail to +create the backup +and not provide any useful error. +I'm not actually sure if the +.Sy fruit:metadata +setting is required, +but a bunch of pages recommend it. +The +.Sy fruit:model +just makes it look nice in Finder. +The rest creates an SMB share called +.Dq TimeMachine +that macOS will be willing to use. +You can limit the size of the share that +.Xr samba 8 +reports so that Time Machine +doesn't fill up the whole drive. +. +.Pp +The other important thing to do +is to create some swap space. +When I first tried backing up +to this share, +it stopped after a while +because +.Xr smbd 8 +got killed +when there was nowhere to swap pages to. +A wiki page told me to +create swap on ZFS like this: +.Bd -literal -offset indent +zfs create -V 2G \e + -o org.freebsd:swap=on \e + -o checksum=off \e + -o compression=off \e + -o dedup=off \e + -o sync=disabled \e + -o primarycache=none \e + zhdd/swap +swapon /dev/zvol/zhdd/swap +.Ed +. +.Pp +To be fair to +.Xr samba 8 , +most of the memory +is being used by the ZFS ARC +.Po +which you can see in +.Xr top 1 +.Pc , +but +.Xr smbd 8 +still seems to be using +far more memory than is reasonable. +It's interesting seeing processes +with 0 RES in +.Xr htop 1 +because they're all being swapped out +while the ARC takes half the available RAM. +And having to wait for my shell +to be paged back in when I quit +.Xr htop 1 . +. +.Pp +Anyway, +as expected this whole thing +is terribly slow. +On my initial backup, +I'm currently at 26.49 GB +of 104.22 GB +with an estimate of 8 hours remaining. +Normally transfer time estimates +are wildly inaccurate, +but I think in this case it's right. +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +. +.Sh BUGS +.Fx +doesn't seem to want to mount +the ZFS volumes on the hard-drive-over-USB +automatically at boot. +I have to +.Xr zpool-import 8 +the drive manually each time. +I don't know if there's a workaround for this, +but I don't have anything essential +to the system on the drive, +and it doesn't need to reboot often. diff --git a/www/text.causal.agency/022-swans-are-dead.7 b/www/text.causal.agency/022-swans-are-dead.7 new file mode 100644 index 00000000..8664e886 --- /dev/null +++ b/www/text.causal.agency/022-swans-are-dead.7 @@ -0,0 +1,164 @@ +.Dd May 5, 2021 +.Dt SWANS-ARE-DEAD 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Swans Are Dead +.Nd album by Swans +. +.Sh DESCRIPTION +Swans Are Dead +is the best Swans album. +Among my favourites are +Soundtracks for the Blind, +To Be Kind +and Love of Life, +but Swans Are Dead +is the one I come back to +most consistently. +I'm always in the mood +to listen to these tunes. +. +.Pp +It's interesting to me +that I enjoy it so much, +I think because I had the expectation +that live albums +are not of the same quality +as studio albums, +but that's just completely untrue +in the case of Swans. +The performances are excellent +and the recording is +for the most part perfect. +The album feels live, +without any distracting deficiencies +of live recording +that would take you out +of just enjoying the music. +. +.Bl -ohang +.It Dq Feel Happiness +This track feels kind of special +since it's the only song on the album +that was never released +as part of another project. +I absolutely love this format of song. +It's like 10 minutes of build +before any lyrics happen, +which you only get after +the wave of the first part +of the song collapses. +It bookends the first disc nicely with +.Dq Blood Promise, +I think, +which is sort of the reverse. +. +.It Dq Blood On Yr Hands +This is such a great start +to the Jarboe-focused +section of the black disc. +A cappella apart from the hum +of the equipment on stage, +I love this vocal performance. +I sing this song, +terribly, +in the shower. +The lack of instrumental +seems to make it stick in my mind even more. +. +.It Dq I Crawled +This is another great vocal performance +by Jarboe. +It's so much more dynamic and intense +than the version of this song +released much earlier on Young God +with Gira's vocals. +I remember seeing a bad comment +somewhere online +from someone who couldn't stand +any Swans song Jarboe sang on. +They must have never heard +this version of +.Dq I Crawled. +Incredible. +. +.It Dq Blood Promise +My favourite track on +Swans Are Dead, +by far. +I had actually never heard of +.Dq The Whiffenpoof Song +until I looked up +the recording they use +to introduce this song +and indicate it's the last of the show. +Anyway, +this track highlights +what makes Swans live albums +so interesting. +This performance of the song +has evolved so much +from the studio recording on +The Great Annihilator. +They share the same lyrics, +but the earlier version is only 4:15, +to the live version's fifteen and a half minutes! +And it sucks me in the whole time. +As the song winds down +you can hear an audience member yell, +.Dq Don't stop! +and I agree. +. +.It Dq The Sound +One of my all-time favourite songs. +It's the one that got me to listen to +Soundtracks for the Blind, +and might've gotten me into Swans altogether. +I don't quite remember +what order I started listening to things in. +This version of it is great. +I don't think I could choose +between this and the studio recording. +There are just +two ways to enjoy it. +I love how frantic the guitars get +at the height of this track. +. +.It Dq I See Them All Lined Up +This version of the song +is way more harsh +than the version on Soundtracks. +It loses some contrast +between the verses +and the explosions of sound +punctuating them, +it just hits hard +the whole time. +. +.It Dq Yum Yab +An absolute banger. +The drums sound so good on this +and they really get me moving. +The whole thing is delightfully nasty and fun. +.El +. +.Pp +Everything else on the album +is good too, +of course, +I just don't have as much to say. +There's almost two and a half hours of music +on this thing! +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +.Pp +I want to try writing +about different kinds of things here, +and this is my first attempt +at doing so. +There's more music +I want to write about, +and maybe some other +non-computer topics. diff --git a/www/text.causal.agency/023-sparse-checkout.7 b/www/text.causal.agency/023-sparse-checkout.7 new file mode 100644 index 00000000..925bc043 --- /dev/null +++ b/www/text.causal.agency/023-sparse-checkout.7 @@ -0,0 +1,144 @@ +.Dd June 9, 2021 +.Dt SPARSE-CHECKOUT 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Sparse Checkout +.Nd a cool git feature +. +.Sh DESCRIPTION +I was going to write a post about +.Xr git-subtree 1 +(and I still plan to!) +but while talking about it +with a friend +I came across another command: +.Xr git-sparse-checkout 1 . +I got pretty excited because +I already had a use case for it. +. +.Pp +.Xr git-sparse-checkout 1 +does pretty much what it sounds like. +It lets you only have +a subset of files in the repository actually +.Dq checked out . +This is really useful +for huge respositories +where you are only interested in +some part of it. +Any operation touching the working tree +is much faster because +it can skip all the files you don't care about. +. +.Pp +My use case is with the +.Fx +.Xr ports 7 +tree, +which recently moved to git +and contains almost 14 thousand files. +Working with the whole repository +was super painful. +.Xr git-status 1 , +which I run as a habit +when my shell is idle, +would take dozens of seconds +to check the whole working tree +and report back. +(I didn't get any real time measurements +before enabling +.Xr git-sparse-checkout 1 , +and I'm not about to disable it now, +since it'd have to check out +all those files again.) +I'm only actually working on +a small handful of ports, +so all that work is wasted. +Time to turn on sparse checkout: +.Bd -literal -offset indent +git sparse-checkout init --cone +.Ed +. +.Pp +The +.Fl \-cone +option here +(which I keep reading as +.Dq clone +because it's git) +restricts the kinds of patterns +you can use to select files to check out, +but makes the calculation more efficient. +Basically it means you can only select +paths along with everything below them, +which I think is pretty much +always what you want anyway. +Enabling sparse checkout +can take quite a while +because it has to do a lot of un-checking-out. +I should mention +that you can pass +.Fl \-sparse +to +.Xr git-clone 1 +to avoid ever checking out +the whole tree. +. +.Pp +The default selection when you run +.Cm init +is to check out all the files +at the root of the repository, +but none of the subdirectories. +For +.Xr ports 7 , +I also want to check out +the shared scripts and Makefiles: +.Bd -literal -offset indent +git sparse-checkout add Keywords Mk Templates Tools +.Ed +. +.Pp +And then I can selectively check out +just the ports I'm working on: +.Bd -literal -offset indent +git sparse-checkout add irc/catgirl irc/pounce +.Ed +. +.Pp +After enabling sparse checkout, +.Xr git-status 1 +takes what I'd call +a normal amount of time. +I also did this on +a couple-weeks-out-of-date copy of the +.Xr ports 7 +tree, +and when I ran +.Xr git-pull 1 +it was also really quick, +because it didn't have to bother +updating all those files +I'm not interested in. +It still downloads all the git objects, +of course, +and you can just add any new paths you need +to the sparse checkout list. +My disk usage also went down +by about a gigabyte. +. +.Pp +I'm super pleased to discover this part of git, +because it makes working with huge +and/or monorepo-style repositories +so much more feasible! +You can see how I came across it, +since +.Xr git-subtree 1 +is also a useful tool for monorepos. +Stay tuned for that post, +I guess :) +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency diff --git a/www/text.causal.agency/024-seprintf.7 b/www/text.causal.agency/024-seprintf.7 new file mode 100644 index 00000000..d1af2e1a --- /dev/null +++ b/www/text.causal.agency/024-seprintf.7 @@ -0,0 +1,137 @@ +.Dd June 12, 2021 +.Dt SEPRINTF 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm seprintf +.Nd an snprintf alternative +. +.Sh SYNOPSIS +.Ft "char *" +.Fn seprintf "char *ptr" "char *end" "const char *fmt" "..." +. +.Sh DESCRIPTION +While discussing string building in C recently, +mcf pointed out +.Xr seprint 2 +from Plan 9, +and it kind of blew my mind. +I had implemented my own function in +.Xr catgirl 1 +for building up strings using +.Xr snprintf 3 +and a struct containing +pointer, length and capacity, +but it felt out of place. +.Fn seprintf +(I add the +.Dq f , +Plan 9 doesn't) +is a much simpler +and more +.Dq C-like +interface with really nice usage patterns. +. +.Pp +The obvious difference from +.Xr snprintf 3 +is that +.Fn seprintf +takes an +.Fa end +pointer +rather than a size. +This means you need only calculate it +once for each buffer, +rather than subtracting +the running length from the buffer size. +.Fn seprintf Ap s +return value is a pointer +to the terminating null +of the string it wrote, +so you can pass that back in +to continue appending +to the same buffer. +. +.Pp +I'm not sure of the exact behaviour on Plan 9, +but my implementation indicates truncation occurred +by returning the +.Fa end +pointer. +That makes it both easy to check, +and perfectly fine to keep calling +.Fn seprintf +anyway. +It just won't write anything if +.Fa ptr +== +.Fa end . +. +.Pp +In the case of formatting failure +(which should be prevented by +compile-time format string checking, +but should still be considered), +.Fn seprintf +returns +.Dv NULL . +I'm again not sure if this matches Plan 9. +I like this a lot better than +.Xr snprintf 3 +returning -1, +because an unchecked +.Dv NULL +is likely to quickly cause a crash, +while blindly adding +.Xr snprintf 3 Ap s +return value +to your running length +is a non-obvious logic error. +. +.Sh EXAMPLES +Here's an example of what some code using +.Fn seprintf +might look like: +.Bd -literal -offset indent +char buf[4096]; +char *ptr = buf, *end = &buf[sizeof(buf)]; +ptr = seprintf(ptr, end, "argv: "); +for (int i = 1; i < argc; ++i) { + ptr = seprintf( + ptr, end, "%s%s", + (i > 1 ? ", " : ""), argv[i] + ); +} +if (ptr == end) errx(1, "truncation occurred :("); +.Ed +. +.Pp +And here is the very short implementation of it against +.Xr vsnprintf 3 +which I copy into my project header files: +.Bd -literal -offset indent +#include <stdarg.h> +#include <stdio.h> +static inline char * +seprintf(char *ptr, char *end, const char *fmt, ...) + __attribute__((format(printf, 3, 4))); +static inline char * +seprintf(char *ptr, char *end, const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + int n = vsnprintf(ptr, end - ptr, fmt, ap); + va_end(ap); + if (n < 0) return NULL; + if (n > end - ptr) return end; + return ptr + n; +} +.Ed +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +.Pp +Another short one before +.Xr git-subtree 1 . +I just think this function +is really neat. diff --git a/www/text.causal.agency/025-v6-pwd.7 b/www/text.causal.agency/025-v6-pwd.7 new file mode 100644 index 00000000..90bfd6ac --- /dev/null +++ b/www/text.causal.agency/025-v6-pwd.7 @@ -0,0 +1,330 @@ +.Dd September 1, 2021 +.Dt V6-PWD 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm V6 pwd +.Nd deciphering old code +. +.Sh DESCRIPTION +We were talking about +.Xr wall 1 +on IRC +and how long it had been annoying users. +My manual page says +.Xr wall 1 +appeared in +.At v6 , +which means that +.Xr wall 1 +has been annoying users for 46 years! +. +.Pp +The Wikipedia page links to the source for +.At v6 , +so I was curious to see how the very first +.Xr wall 1 +was implemented. +It's not that surprising, +except that it is hardcoded +to handle only 50 logins, +and it forks to write to each tty, +waiting one second between each. +I think the forking must be to avoid +any of the terminals being opened +from becoming the controlling terminal +of the original +.Xr wall 1 +process. +. +.Pp +Then I started looking +at some of the other source files +and found the implementation of +.Xr pwd 1 , +which was surprising. +There's no +.Xr getcwd 3 +function +(the earlier form of which, +.Xr getwd 3 , +appeared in +.Bx 4.0 ) , +so +.Xr pwd 1 +has to figure out +the path to the working directory itself. +It took me a while to figure out how it works. +. +.Pp +To make it easy to talk about, +I'm just going to include the whole thing here: +.Bd -literal +char dot[] "."; +char dotdot[] ".."; +char root[] "/"; +char name[512]; +int file, off -1; +struct statb {int devn, inum, i[18];}x; +struct entry { int jnum; char name[16];}y; + +main() { + int n; + +loop0: + stat(dot, &x); + if((file = open(dotdot,0)) < 0) prname(); +loop1: + if((n = read(file,&y,16)) < 16) prname(); + if(y.jnum != x.inum)goto loop1; + close(file); + if(y.jnum == 1) ckroot(); + cat(); + chdir(dotdot); + goto loop0; +} +ckroot() { + int i, n; + + if((n = stat(y.name,&x)) < 0) prname(); + i = x.devn; + if((n = chdir(root)) < 0) prname(); + if((file = open(root,0)) < 0) prname(); +loop: + if((n = read(file,&y,16)) < 16) prname(); + if(y.jnum == 0) goto loop; + if((n = stat(y.name,&x)) < 0) prname(); + if(x.devn != i) goto loop; + x.i[0] =& 060000; + if(x.i[0] != 040000) goto loop; + if(y.name[0]=='.')if(((y.name[1]=='.') && (y.name[2]==0)) || + (y.name[1] == 0)) goto pr; + cat(); +pr: + write(1,root,1); + prname(); +} +prname() { + if(off<0)off=0; + name[off] = '\en'; + write(1,name,off+1); + exit(); +} +cat() { + int i, j; + + i = -1; + while(y.name[++i] != 0); + if((off+i+2) > 511) prname(); + for(j=off+1; j>=0; --j) name[j+i+1] = name[j]; + off=i+off+1; + name[i] = root[0]; + for(--i; i>=0; --i) name[i] = y.name[i]; +} +.Ed +. +.Pp +First, some syntax trivia: +it seems you don't need +.Sy = +to give globals values. +I guess that makes sense. +I also noticed that +it avoids giving +.Va inum +and +.Va jnum +the same name. +I think that's because in old C, +struct field names all shared the same namespace. +The last difference I noticed +is the operator +.Sy =& +rather than +.Sy &= . +Honestly I think the former makes more sense, +but I can see that the one we have now +is less ambiguous. +. +.Pp +To get +.Fn prname +and +.Fn cat +out of the way, +it's building up a path from the bottom. +At first I thought it must be +starting at the end of its buffer +and moving back as it adds components, +but no, +it moves the entire path-so-far over +every time it adds a new component +onto the front. +.Fn cat +is just a bunch of manual string copying. +It also gives up +if the new component +would make the path longer than 511 characters. +Fair enough. +. +.Pp +So how does it build up the path? +The loop in +.Fn main +first calls +.Xr stat 2 +on the current directory +.Pa \&. +in order to get its inode number. +I love that +.Vt struct statb +is just declared at the top of this file. +Clearly this code predates the C preprocessor. +. +.Pp +It then opens the parent directory +.Pa .. +and reads directory entries from it. +The inner loop is looking for +a directory entry with the same inode number +as the current directory, +to figure out what the current directory is called. +Curiously, +it reads 16-byte directory entries, +despite declaring a larger struct. +The preprocessor can't be invented soon enough. +. +.Pp +Once it finds the matching directory entry, +it adds the name of the entry +onto the front of the path, +changes directory to +.Pa .. +and starts over. +It stops when the current directory +has an inode number of 1, +which must be the root of a file system, +but then it does something else. +It took me a while to decipher what +.Fn ckroot +is doing. +. +.Pp +The loop in +.Fn main +stops when it gets to the root +of a file system, +but that's not necessarily +.Pa / . +I think what +.Fn ckroot +is doing is trying to figure out +where that file system is mounted. +It starts by checking the device number +that the current directory is on. +Or really it calls +.Xr stat 2 +on the name of the directory entry that +.Fn main +just found, +which I think must be +.Pa \&. +at this point anyway since it's at a root. +. +.Pp +Anyway, +it then changes directory to and opens +.Pa / +and starts reading directory entries from that, +calling +.Xr stat 2 +on each of them +and checking for a matching device number. +I think this implies that file systems +can only be mounted in +.Pa / +and not at any lower level, +at least not if you want +.Xr pwd 1 +to understand it. +I'm not sure what the check for +an inode number of 0 is skipping over +in this loop. +Some kind of special entry in +.Pa / +perhaps. +. +.Pp +Once it finds an entry +with a matching device number, +it checks the flags +to make sure the entry is a directory. +It does so with hardcoded constants, +but it seems they haven't changed +in all these years. +According to +.Xr stat 2 , +040000 is +.Dv S_IFDIR . +The number of file types +clearly has grown since then though, +since +.Dv S_IFMT +is now 0170000 rather than 060000. +. +.Pp +I think the reason it checks +that the entry is a directory +is because if it actually is +on the root file system already, +then any regular file +would have a matching device number. +If the entry is indeed a directory, +it then checks if the entry is +.Pa \&. +or +.Pa \&.. , +which indicates that it really is already at +.Pa / . +If it's not, +it adds the mount point that it found +to the front of the path. +. +.Pp +Finally, +it prints +.Pa / +followed by the path it built up. +If it failed at any point before that, +it would print the path it had built so far +with no leading +.Pa / . +Better than nothing! +. +.Pp +So that's how I think +.Xr pwd 1 +works in +.At v6 . +It was a fun puzzle to work through, +and it was interesting to see +the assumptions it makes. +How simple things were back then... +Actually I find it really cool +that code from 1975 +can still be read and understood +using knowledge of modern C and UNIX-likes. +. +.Sh SEE ALSO +.Lk https://minnie.tuhs.org/cgi-bin/utree.pl?file=V6 +.Pp +.Pa pwd.c +appears in +.Pa V6/usr/source/s2 . +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +.Pp +I regret saying in two previous posts +what I planned to write next, +because this is still not that. diff --git a/www/text.causal.agency/026-git-comment.7 b/www/text.causal.agency/026-git-comment.7 new file mode 100644 index 00000000..fefb497e --- /dev/null +++ b/www/text.causal.agency/026-git-comment.7 @@ -0,0 +1,190 @@ +.Dd September 10, 2021 +.Dt GIT-COMMENT 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm git-comment +.Nd add comments from commit messages +. +.Sh SYNOPSIS +.Nm git comment +.Op Fl \-all +.Op Fl \-comment-start Ar string +.Op Fl \-comment-lead Ar string +.Op Fl \-comment-end Ar string +.Op Fl \-min-group Ar lines +.Op Fl \-min-repeat Ar lines +.Op Fl \-no-repeat +.Op Fl \-pretty Ar format +.Op Ar options ... +.Op Fl \- +.Ar file +. +.Sh DESCRIPTION +The +.Nm +command +adds comments to a file +showing the commit messages +which last modified +each group of lines. +By default only commit messages with bodies +and which modified groups of at least 2 lines +are added. +Each comment contains +the abbreviated commit hash +and the commit summary, +followed by the commit body. +. +.Pp +.Nm +accepts all the options of +.Xr git-blame 1 +in addition to the following: +.Bl -tag -width Ds +.It Fl \-all +Include all commit messages. +The default is to include +only commit messages with bodies +(lines after the summary). +. +.It Fl \-comment-start Ar string +Start comments with +.Ar string . +The default is the value of +.Cm comment.start +or +.Ql /* . +. +.It Fl \-comment-lead Ar string +Continue comments with the leading +.Ar string . +The default is the value of +.Cm comment.lead +or +.Ql " *" . +. +.It Fl \-comment-end Ar string +End comments with +.Ar string . +The default is the value of +.Cm comment.end +or +.Ql " */" . +. +.It Fl \-min-group Ar lines +Add comments only for groups of at least +.Ar lines . +The default is 2 lines. +. +.It Fl \-min-repeat Ar lines +Avoid repeating a comment +if it occurred in the last +.Ar lines . +The default is 30 lines. +. +.It Fl \-no-repeat +Avoid repeating comments entirely. +. +.It Fl \-pretty Ar format +Set the pretty-print format +to use for commit messages. +The default is the value of +.Cm comment.pretty +or +.Ql format:%h\ %s%n%n%-b . +See +.Xr git-show 1 . +.El +. +.Sh EXAMPLES +For files with +.Ql # +comments: +.Bd -literal -offset indent +git config comment.start '#' +git config comment.lead '#' +git config comment.end '' +.Ed +. +.Pp +Add as many comments as possible: +.Bd -literal -offset indent +git comment --all --min-group 1 --min-repeat 1 +.Ed +. +.Pp +Some examples of output from +.Xr catgirl 1 : +.Bd -literal +/* 347e2b4 Don't apply uiThreshold to Network and Debug + * + * Messages don't really need to be hidden from <network> and I think + * it could be confusing. Debug messages are all Cold so everything + * would be hidden, and I want to keep them that way so that <debug> + * doesn't clutter the status line needlessly. + */ +if (id == Network || id == Debug) { + window->thresh = Cold; +} else { + window->thresh = uiThreshold; +} + +/* b4c26a2 Measure timestamp width using ncurses + * + * This allows for non-ASCII characters in timestamps, and simplifies + * things by including the trailing space in the width. + */ +int y; +char buf[TimeCap]; +struct tm *time = localtime(&(time_t) { -22100400 }); +size_t len = strftime(buf, sizeof(buf), uiTime.format, time); +if (!len) errx(EX_CONFIG, "invalid timestamp format: %s", uiTime.format); +waddstr(main, buf); +waddch(main, ' '); +getyx(main, y, uiTime.width); +(void)y; + +/* 43b1dba Restore toggling ignore with M-- + * + * So that pressing M-- repeatedly maintains the previous behavior. + */ +if (n < 0 && window->thresh == Ice) { + window->thresh = Cold; +} else { + window->thresh += n; +} + +/* 1891c77 Preserve colon from previous tab-complete + * + * This fixes the case when pinging multiple nicks and one of them needs to + * be cycled through. + */ +bool colon = (tab.len >= 2 && buf[tab.pos + tab.len - 2] == L':'); +.Ed +. +.Sh SEE ALSO +.Lk https://git.causal.agency/src/tree/bin/git-comment.pl +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +. +.Pp +In case it's unclear, +this is a +.Xr git 1 +subcommand I wrote. +Did you know you can add new +.Xr git 1 +subcommands just by +adding executables named +.Pa git-* +to somewhere in +.Ev PATH ? +. +.Pp +This is also, +I think, +my third Perl script ever. +It's an interestingly shaped language. +Quite neat. diff --git a/www/text.causal.agency/027-openbsd-linode.7 b/www/text.causal.agency/027-openbsd-linode.7 new file mode 100644 index 00000000..9f40de42 --- /dev/null +++ b/www/text.causal.agency/027-openbsd-linode.7 @@ -0,0 +1,202 @@ +.Dd September 26, 2021 +.Dt OPENBSD-LINODE 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Installing OpenBSD on Linode +.Nd a guide +. +.Sh DESCRIPTION +I've been thinking for a while +about moving my servers to Linode, +and also about moving them to +.Ox . +I actually originally got into +.Fx +(and from there, +.Ox ) +only because DigitalOcean +started offering it as a +.Dq droplet +image. +I've been running those servers fine for years, +but now I prefer to run +.Ox , +and some recent DigitalOcean outages +had me thinking about it more, +so I'm giving it a shot. +. +.Pp +As an aside, +running +.Ox +on DigitalOcean +is not really a good option. +It seems more awkward to install your own OS there, +and if you do, +I've heard that IPv6 won't work +because they don't know how to run SLAAC. +Also, +now that I've used +the Linode control panel and LISH a bit, +DigitalOcean kind of feels like a toy +in comparison. +. +.Pp +Here's what I did to install +.Ox +on Linode: +.Bl -enum +.It +Create a Linode with the +.Dq Choose a Distribution +box blank. +. +.It +Under the Storage tab, +create a disk called +.Dq miniroot +of type raw +with size 8 MB. +This will hold the install image. +. +.It +Create another disk called +.Dq root +of type raw +using the remaining available storage. +. +.It +Boot the Linode in rescue mode +from the option in the three-dots menu +next to +.Dq Power On . +Attach +.Dq miniroot +to +.Pa /dev/sda . +. +.It +Log into the LISH console +and obtain the install image: +.Bd -literal +curl -O https://cdn.openbsd.org/pub/OpenBSD/6.9/amd64/miniroot69.img +dd if=miniroot69.img of=/dev/sda +.Ed +.Pp +Power off the Linode. +. +.It +Under the Configurations tab, +create a configuration called +.Dq install +in full virtualization mode. +Paravirtualization works fine once installed, +but for some reason the installer +can't see the root disk +without full virtualization. +Under boot settings, +select direct disk. +Attach +.Dq root +to +.Pa /dev/sda , +.Dq miniroot +to +.Pa /dev/sdb +and set the root device to +.Pa /dev/sdb . +. +.It +Create a similar configuration called +.Dq boot +but using paravirtualiztion +and without +.Dq miniroot +attached. +Set the root device to +.Pa /dev/sda . +. +.It +Boot the +.Dq install +configuration, +launch the LISH console +and switch to Glish. +It's possible +to have the installer use serial console, +but it requires entering commands +at the boot prompt +before the timeout, +and I never managed it. +If you do manage it, +run: +.Bd -literal +stty com0 9600 +set tty com0 +boot +.Ed +. +.It +Proceed through the +.Ox +installer. +When asked to +change the default console to com0, +answer yes +so that regular LISH will work. +Power off the Linode. +. +.It +Boot the +.Dq boot +configuration +and log in to LISH. +Since the installer configured networking +in full virtualization, +rename the file to the paravirtualized interface: +.Bd -literal +mv /etc/hostname.em0 /etc/hostname.vio0 +.Ed +.Pp +In order to get the right public IPv6 address, +disable privacy extensions +by changing the inet6 line of +.Pa hostname.vio0 +to: +.Bd -literal +inet6 autoconf -temporary -soii +.Ed +. +.It +Bring networking up +and run +.Xr syspatch 8 +since +.Pa rc.firsttime +couldn't do it: +.Bd -literal +sh /etc/netstart +syspatch +.Ed +. +.It +Reboot. +.El +. +.Pp +I guess I'll be slowly moving things over +to the new servers +for the next little while. +With any luck the next post here +will not say +.Fx +in its header! +. +.Sh SEE ALSO +I learned the basic idea +of how to do this from +.Lk https://www.subgeniuskitty.com/notes/openbsd_on_linode . +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency diff --git a/www/text.causal.agency/028-names.7 b/www/text.causal.agency/028-names.7 new file mode 100644 index 00000000..de47c074 --- /dev/null +++ b/www/text.causal.agency/028-names.7 @@ -0,0 +1,81 @@ +.Dd October 30, 2021 +.Dt NAMES 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Names +.Nd three types +. +.Sh DESCRIPTION +There are (at least) three +different types of names +a person has. +. +.Pp +First, there are normie names. +These are names usually made up +of several words +each of which is capitalized. +Most people have one of these, +but it's possible to have more. +They're names that might appear on +various types of Documents. +A +.Dq legal name +(dubious) +is a normie name, +but normie names need not be +.Dq legal +(dubious). +I list this category first +not because it's more important, +but because it is by far the most boring. +. +.Pp +Next, there are Real Names. +Most people have at least a few +and will probably go through +different ones over time. +Your Real Names are anything people +use to refer to you. +On the internet these are often not capitalized. +Sometimes that is the only distinction +between a Real Name +and a normie name. +. +.Pp +There was a period of time +when I was playing a lot of TF2 +and not really leaving my apartment. +I had set my steam name to +.Dq gluten product +(yeah, from that dril tweet) +and I talked in the game's voice chat +quite a bit. +Naturally other Gamers in voice chat +called me +.Dq gluten +and at some point I realized +that over the span of months +I had been refered to as +.Dq gluten +more often than any other name. +So that was a Real Name of mine. +People used it and I responded to it. +. +.Pp +Last, there are the True Names. +The kind of name that knowledge of +gives one power over a person. +I don't think any humans +know their own True Names, +but I do believe they exist. +It's possible that other animals +know theirs. +It's probably best not to know though, right? +I think if I knew mine +I would always worry +about accidentally revealing it. +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency diff --git a/www/text.causal.agency/029-topics.7 b/www/text.causal.agency/029-topics.7 new file mode 100644 index 00000000..d071eb67 --- /dev/null +++ b/www/text.causal.agency/029-topics.7 @@ -0,0 +1,116 @@ +.Dd January 8, 2022 +.Dt TOPICS 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Topics +.Nd a bit of a mess +. +.Sh DESCRIPTION +Shortly after my last post +I started writing another one +but I never finished it. +I don't think I had enough to say, +or if I did it meant going into +a whole extra thing. +I also had a list in my mind +of other things to write about, +but inspiration hasn't really struck +for any of them. +I'm currently in the mood +to write something anyway, +so I'm just going to write a bit +about the topics I have in mind. +I may or may not ever +write more about any of them. +. +.Pp +The post I had started writing +(twice, actually) +was about voices. +I like them a lot +and I'm fascinated by them. +The problem is +I don't actually have much +to say about it +without getting into Gender, +which as I say is a whole extra thing, +and not something I've written about here before. +. +.Pp +When I started writing here, +I didn't want to blog about +personal topics or LGBTQ stuff. +But more recently +I want to move away from +only writing about computers. +Or maybe away from +writing about computers entirely. +There are more interesting things, +but I don't have experience +writing about them. +Yet, +I should say. +. +.Pp +I'm honestly still not sure +if writing about gender here +is at all a good idea. +But it turns out to feel like +a bit of a prerequisite +for other things. +I find gender perception +in particular +to be fascinating. +It's interesting. +It's neat. +And I don't know if I can +write anything coherent about it. +. +.Pp +Related to that, +I've been thinking of writing +about how the pandemic +has had a strangely positive effect +on my life. +Or at least, +I've made a lot of positive changes +during it. +I'm in a better place emotionally now +than ever before, +and that obviously runs counter +to most people's experiences. +Additionally with that positive outlook +I want to write about the meaning +of my domain name. +I'm proud of it. +. +.Pp +This week the topic of fetish +has been on my mind. +That actually feels +a bit less risky +to write about than gender. +And it may honestly be more interesting. +I don't know. +There's not enough sex +on computer blogs, +or whatever this is. +Although my main ideas +are not about sex at all. +. +.Pp +Just this turned out to be +harder to write than I thought it would be. +I think I want to populate this space +with more short posts like the previous one. +I wrote that while very sleepy +after 3 AM though, +and I don't exactly +want to repeat that regularly. +We'll see. +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +.Pp +Listening to Kate Bush \(em Hounds of Love. diff --git a/www/text.causal.agency/030-discs.7 b/www/text.causal.agency/030-discs.7 new file mode 100644 index 00000000..df73a750 --- /dev/null +++ b/www/text.causal.agency/030-discs.7 @@ -0,0 +1,114 @@ +.Dd January 8, 2022 +.Dt DISCS 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Desert Island Discs +.Nd we're doing three in this one +. +.Sh DESCRIPTION +In typical fashion +I'm going to write about something +completely different instead. +Something short and simple. +I got thinking about this +after reading a little interview thing +this week. +The question is +which three albums would you want to have +if you were stranded on a desert island. +What could you listen to +for the rest of time? +It's surprisingly easy +to take this question very seriously. +. +.Pp +My immediate thought was +.Em Music for 18 Musicians. +I've literally said this about it +in conversation before. +That's an album +I'd want to have on a desert island. +I find it incredibly soothing, +almost hypnotic. +I really do feel like +I could listen to it forever. +And then maybe I could finally determine +which of its eleven sections +is the best. +. +.Pp +My next thought was +.Em Soundtracks for the Blind . +We already know I'm a huge SWANS fan. +Despite what I've written about +.Em Swans Are Dead , +I instead jumped to SFTB. +I still think that +.Em Dead +has better tunes, +but +.Em Soundtracks +is definitely the better cohesive album. +It has such atmosphere and mood on it. +Like +.Em 18 , +it's an album that sucks me in. +Also, +either SWANS album +is an economical choice +in this hypothetical +since they're each 2 hours and 20 minutes long. +. +.Pp +Choosing a third album is a lot harder. +There's so much other music I like +and only one slot left. +There's no other single album +that stands out above the rest +like the previous two, +for me. +.Em Wildlife , +maybe? +Or +.Em Jane Doe ? +Perhaps a classic like +.Em Aeroplane , +or a boomer classic like +.Em The Wall . +But would I really want to +listen to any of those +to the exclusion of everything else? +They're too mood-dependent. +. +.Pp +Then I realized the perfect choice +for third album. +.Em Mouth Moods . +A mashup album is the perfect wildcard, +and +.Em Moods +is just fun as hell to listen to. +I get songs from it stuck in my head +instead of the originals. +The final track, +.Em Shit , +always gets me moving. +It's a masterpiece. +. +.Bl -enum +.It +Steve Reich Ensemble \(em +.Em Music for 18 Musicians +.It +SWANS \(em +.Em Soundtracks for the Blind +.It +Neil Cicierega \(em +.Em Mouth Moods +.El +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +.Pp +Listening to Steve Reich Ensemble \(em Music for 18 Musicians. diff --git a/www/text.causal.agency/031-books-2021.7 b/www/text.causal.agency/031-books-2021.7 new file mode 100644 index 00000000..d7b46f17 --- /dev/null +++ b/www/text.causal.agency/031-books-2021.7 @@ -0,0 +1,127 @@ +.Dd January 12, 2022 +.Dt BOOKS-2021 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Books 2021 +.Nd a review, I guess +. +.Sh DESCRIPTION +In 2021 I read 26 books. +Finished the 26th right on December 31st. +It's not a lot but it's more than last year. +Here are the ones I loved +(in the order I read them). +I will avoid spoilers, +of course. +. +.Ss Network Effect by Martha Wells +I've been reading the +.Em Murderbot Diaries +series for a while. +They're fun stories. +I liked this full-length novel entry a lot. +I guess it felt like it had more room +for the characters to develop. +This is probably when I started +asking my friends if they'd read it +because I wanted to talk about +Murderbot gender vibes. +.Pp +You may like if: you're trans. +. +.Ss The Once and Future Witches by Alix E. Harrow +Um, +it's about witches! +One of them has the same name as me. +Kind of has some similar vibes to +.%T The Future of Another Timeline , +which was my favourite book I read in 2020. +.Pp +You may like if: you like women. +. +.Ss A Desolation Called Peace by Arkady Martine +I was so excited for this sequel to +.%T A Memory Called Empire , +another previous favourite +and something I've been wanting more of. +I kinda wish there was more fucking in it though honestly. +.Pp +You may like if: you like women. +. +.Ss Piranesi by Susanna Clarke +Really something different. +It turned out to be a different story +than I expected +from reading the first few pages. +.Pp +You may like if: you like statues, I guess? +. +.Ss A Psalm for the Wild-Built by Becky Chambers +Ok yes I do give 3/3 stars +to every Becky Chambers book. +They're so fucking good. +I'm looking forward to +more entries in this novella series. +(Also I'm currently reading +the fourth +.Em Wayfarers +book +and loving it too!) +.Pp +You may like if: your pronouns are they/them <3 +. +.Sh HONOURABLE MENTIONS +.Ss Her Body and Other Parties by Carmen Maria Machado +I really enjoyed the short story +.Dq Especially Heinous: 272 Views of Law & Order SVU +in this collection. +It goes on a bit too long +but the format is unique. +You can read that one online, +actually. +. +.Ss The Hobbit by J. R. R. Tolkien +Yeah I hadn't read this until last year. +I borrowed it after marathoning +the extended editions of the +.%T Lord of the Rings +trilogy during a heat wave. +As I said at the time, +pretty good for something +written by a man +like a hundred years ago. +Kind of hilarious that women +just don't exist +in the world of +.%T The Hobbit . +. +.Ss Earthlings by Sayaka Murata +Pretty fucking wild. +I'd recommend it, +but I have to say it +.Em extremely +needs a child sexual abuse content warning on it. +. +.Ss Six Months, Three Days, Five Others by Charlie Jane Anders +A surprising number of these short stories +are actual stories! +They have beginnings, +middles +and ends! +. +.Ss The City in the Middle of the Night by Charlie Jane Anders +It's got some +.Em Xenogenesis +series vibes. +Sophie is a goddamn lesbian idiot though +and she never even realizes it. +. +.Sh SEE ALSO +.Lk https://git.causal.agency/src/tree/txt/books.txt +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +.Pp +Listening to +.Em Ear Massage with Latex Gloves 100% Sensitivity 40 minute (No Talking) . diff --git a/www/text.causal.agency/032-albums-2021.7 b/www/text.causal.agency/032-albums-2021.7 new file mode 100644 index 00000000..72c1d0d2 --- /dev/null +++ b/www/text.causal.agency/032-albums-2021.7 @@ -0,0 +1,173 @@ +.Dd January 13, 2022 +.Dt ALBUMS-2021 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Albums 2021 +.Nd a review +. +.Sh DESCRIPTION +Every year I create a new playlist +in iTunes +(Music dot app, whatever) +for the albums I listen to that year. +It's usually embarrassingly short. +I don't listen to new music +as much as I'd like, +and usually only one or two +are actually from the current year. +Not that the playlist +is limited to new (to me) music. +If I get really into an album +I've heard before, +more than before, +I also add it to the list. +Anyway, +this is a review +of my 2021 albums playlist. +. +.Ss Black Country, New Road \(em For the First Time (2021) +I first heard the single +.Em Sunglasses +from someone sharing it on IRC, +and I loved it, +so I was looking forward to this album. +What a let down though. +The version of +.Em Sunglasses +on the album is just plain worse +than the single version. +I still got some decent listening +out of the album, +but that just sours it for me. +.Pp +Favourite track: +.Em Track X . +. +.Ss Black Dresses \(em Forever \&In Your Heart (2021) +I fucking love Black Dresses. +.Em Peaceful as Hell +is one of my all-time favourite albums. +I'm glad they put out another one +after it looked like they wouldn't. +The sounds are just so good. +Exactly what my ears crave. +The texture of it +tickles my brain clit. +.Pp +Favourite tracks: +.Em Waiting42moro , +.Em Mistake . +. +.Ss Low \(em Drums and Guns (2007) +I've long loved the song +.Em Breaker +and its music video, +but I only listened to the album +it's on last year. +Something I didn't realize, +I guess because I usually pulled up +the music video +without headphones on, +is how aggressively this album +uses stereo panning. +Vocals are generally +panned hard right throughout, +with much of the instrumentation +panned centre or hard left. +It's bold +and it really works for me. +I especially love the vocal harmony on +.Em Breaker +all the way on the opposite channel. +Bring back stereo separation! +.Pp +Favourite tracks: +.Em Breaker , +.Em Murderer , +.Em Violent Past . +. +.Ss The Armed \(em Ultrapop (2021) +I have to admit +I didn't actually listen to this one much. +I listened to the previous album, +.Em Only Love , +a lot in 2020. +I think this album is good, +but I'll probably only really get into it +in some future year. +. +.Ss Lingua Ignota \(em Caligula (2019) +Dear lord, +why did I wait so long +to listen to this one. +I had heard +.Em "Do You Doubt Me Traitor" +back when it came out, +but somehow I didn't realize +just how much this album +would be my shit. +Fucking incredible vocals. +Lovely sometimes minimal, +sometimes extreme +instrumentals +and exquisite percussion. +The sound of, +I believe, +a lightbulb rolling around on the floor on +.Em Fragrant +is such an interesting addition. +.Pp +Favourite tracks: +.Em "Do You Doubt Me Traitor" , +.Em "Fragrant Is My Many Flower'd Crown" , +.Em "If the Poison Won't Take You My Dogs Will" . +. +.Ss Black Dresses \(em LOVE AND AFFECTION FOR STUPID LITTLE BITCHES (2019) +I wanted even more Black Dresses +and fortunately there was still more +I hadn't yet listened to! +I've already gushed about Black Dresses +so I'll spare you. +They're so good though. +.Pp +Favourite tracks: +.Em STATIC , +.Em HERTZ , +.Em MY HEART BEATS OUT OF TIME . +. +.Ss Barenaked Ladies \(em All Their Greatest Hits: Disc One 1991-2001 +What? +Yeah, +late last year I decided to revisit BNL. +My parents listened to them a lot +when I was growing up, +and I liked them too. +The first show I ever went to was the +.Dq Barenaked for the Holidays +tour with my parents. +It turns out +I still think their '90s stuff +is pretty darn good! +Steven Page is really a great singer. +This is also the first time +I'm listening to these tunes +with fancy headphones +and it sounds great. +Honestly +.Em The Old Apartment +can totally compete +with the favourites +I've accumulated more recently. +\&'90s alt rock was good actually? +.Pp +Favourite tracks: +.Em The Old Apartment , +.Em Brian Wilson , +.Em What a Good Boy , +.Em Too Little Too Late . +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +.Pp +Listening to all my favourite tracks :) diff --git a/www/text.causal.agency/033-jorts.7 b/www/text.causal.agency/033-jorts.7 new file mode 100644 index 00000000..001f877c --- /dev/null +++ b/www/text.causal.agency/033-jorts.7 @@ -0,0 +1,485 @@ +.Dd February 2, 2022 +.Dt JORTS 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Introducing Jorts +.Nd june's ports +. +.Sh DESCRIPTION +Alright so I've gone off the deep end, +maybe. +After continual frustration with MacPorts +culminating in not being able to install +.Xr nvi 1 +on my work MacBook, +I have just gone ahead +and started my own personal ports tree +for macOS. +After a couple of weeks, +I have 32 ports in my tree +and only two remaining requested ports +installed from MacPorts. +. +.Pp +I set out with a couple ideas in mind: +.Bl -bullet +.It +This will be my own personal ports tree. +It only has to work for me. +Since I'm using it on both +my personal Intel MacBook Pro +still running Catalina +and my work M1 MacBook Pro +running Monterey, +it is at least that portable. +. +.It +It's ok to rely on +system libraries and tools +provided by macOS. +I'm not creating a distro, +so it doesn't need to be totally isolated. +This lets me skip really annoying things +like compiler toolchains. +. +.It +Sources get vendored, +either from release tarballs +or with +.Xr git-subtree 1 . +This allows totally pain-free +local patching, +and boy has this paid off. +I can just do what I need to do +to get the thing to build how I want +and commit it in git like anything else. +.Pp +It also means that the tree itself +is entirely self-contained +and doesn't rely on any external sources +or network access. +Honestly with some old and obscure software +it feels like upstream could disappear at any moment, +so this gives me peace of mind too. +.Pp +Another advantage of vendoring upstream sources +is that all of the code installed on my system +(in +.Pa /usr/local +anyway) +is easily inspected, +much like +.Pa /usr/src +on a BSD. +This can be super useful for debugging +or just for reference. +. +.It +Produce simple package tarballs. +They're just the contents of +.Ev DESTDIR +after a staged install. +They get installed for real +by untarring them in +.Pa / . +They can then be uninstalled +(or upgraded) +by removing the paths contained +in the tarball from the system. +. +.It +Track installed packages with symbolic links +to specific package tarballs. +Keep old tarballs around for rollbacks. +This means I can see what's installed +with plain old +.Xr ls 1 ! +.Bd -literal +$ ls */Installed +\&... +libretls/Installed toilet/Installed +mandoc/Installed tree/Installed + +$ ls -l toilet/Installed +lrwxr-xr-x 1 root staff 19 17 Jan 21:45 toilet/Installed -> toilet-0.3~1.tar.gz +.Ed +. +.It +Use +.Xr bmake 1 . +It's scrutable. +It also knows how to bootstrap itself +pretty well. +Since +.Xr bmake 1 +is itself a port in my tree +that would require +.Xr bmake 1 +to build and install, +I wrote a small +.Pa Bootstrap +shell script +to install +.Xr bmake 1 +.Dq manually +then use that +.Xr bmake 1 +to build and install its own port. +It also requires a bit of care +when upgrading the +.Xr bmake 1 +port since macOS +rather doesn't like a binary +deleting itself while it's running. +. +.It +No GNU software. +I simply refuse to do it. +To that end, +prefer configuring/building with +.Xr cmake 1 +where at all possible. +I fell into this early on +since I originally just wanted to install +.Xr nvi 1 +and +.Sy lichray/nvi2 +is a better upstream source these days +that uses +.Xr cmake 1 . +.Pp +With a port and support for +.Xr cmake 1 +in +.Pa Port.mk , +I can make changes to +.Pa CMakeLists.txt +files without issue. +I can also vendor upstreams +directly from git +rather than having to find +release tarballs with generated +.Pa configure +scripts and so on. +When I need to make changes +to the build systems of projects using autotools, +I either have to have autotools installed +(from outside my tree) +or painstakingly reflect my edits by hand +in the generated files, +both of which suck hard. +.El +. +.Pp +Ok so that's actually quite a number of ideas. +But they have come together +into something surprisingly usable +surprisingly quickly! +Like I said, +this is only intended to be +my own personal ports tree, +but I hope that some of these ideas +are interesting +and maybe inspire others +to explore similar approaches. +. +.Pp +But wait, +I'm not done yet! +There are some other interesting things +that I came up with along the way, +and also some complaints +about some upstreams, +but I'll try to keep those to a minimum. +. +.Pp +So it turns out that dependencies are hard. +Who knew? +It's easy enough to enforce +direct dependencies +at build time +by just checking for the required +.Pa Installed +symlinks. +It's less straightforward +to do this recursively, +which you need if +you want to be able to say, +.Do +Install +.Xr nvi +for me! +.Dc +and get +.Xr ncurses 3 , +.Xr cmake 1 +and +.Xr pkgconf 1 +installed first +if they aren't already. +. +.Pp +Rather than trying to do all that in +.Xr bmake 1 , +I wrote a shell script called +.Pa Plan , +which itself produces a shell script. +Given a list of ports +to install or upgrade, +it recursively gathers their dependencies +and feeds them to +.Xr tsort 1 , +which is a neat utility +which topologically sorts a graph. +In other words, +it determines the order +in which the graph of dependencies +should be installed. +The +.Pa Plan +script produces a list of +.Xr bmake 1 +commands to make that happen +on standard output, +which can be piped to +.Xr sh 1 . +So, +the way to say the above is: +.Bd -literal -offset ident +$ ./Plan -j4 nvi | sh -e +.Ed +. +.Pp +Now, +what's missing from this approach +is the ability to automatically +uninstall no-longer-needed dependencies. +It's something I've criticized Homebrew for lacking +and one of the reasons I started using MacPorts, +so it's somewhat ironic that +my own system lacks it as well. +However, +I don't think it's much of a problem, +since I'm only packaging +what I actually want installed +in the first place. +On my personal computer, +I have all 32 of my ports installed, +and I expect that to continue. +I can always keep using MacPorts +to install things I only intend +to use temporarily. +. +.Pp +Another thing I was slightly concerned about +from the beginning was disk usage. +I think the benefits of vendoring sources +far outweigh the cost in storage, +but it would be nice to at least minimize that cost. +Previously, +I wrote about +.Xr git-sparse-checkout 1 , +which allows you to only have certain paths +checked out in your git working tree. +Since port sources aren't always interesting +and only +.Em required +while actually building the port, +it makes sense to not have them always checked out. +. +.Pp +Rather than manipulate +.Xr git-sparse-checkout 1 +myself, +I added support for it +directly into +.Pa Port.mk . +If sparse checkout is enabled, +building a port will automatically +add its source tree to the checkout list, +and cleaning that port will +remove it from the list. +At rest, +only the port system itself +and the package tarballs +need to be present on the file system. +. +.Pp +It turns out that upstream +build system behaviour +is super inconsistent, +even among projects using +the same tools. +I started collecting a list of checks +to perform on the output of my port builds +to make sure they didn't do anything weird. +They live in +.Pa Check.sh , +which gets run +when a package tarball is created. +The current list of checks is: +.Bl -bullet +.It +Check for directories not included by +.Ev PACKAGE_DIRS . +In other words, +make sure the port isn't +trying to install anything +outside of +.Pa /usr/local . +Sometimes this makes sense, +though, +which is what +.Ev PACKAGE_DIRS +is for. +.It +Check for references to PWD, +i.e. the build directory. +This can mean the build +didn't understand +.Ev PREFIX +and +.Ev DESTDIR +correctly, +or that it built with debug info. +.It +Check for binaries without manuals. +If your software installs an executable in +.Pa bin +but not a manual page, +your software is incomplete! +Sometimes this just means +I missed an extra documentation install target. +.It +Check for dynamic linking to outside objects. +In other words, +if something ended up linking to +a library installed by MacPorts +rather than the one from +.Nm jorts +or macOS. +.It +Check for dynamic linking +to system libraries +.Nm jorts +provides instead. +Similar to the last one, +if both macOS and +.Nm jorts +provide a library, +check that ports link with the latter. +.It +Check for scripts with outside interpreters. +This is analogous to the linking checks +but for scripts, +checking that their shebang lines +refer to interpreters installed +by macOS or +.Nm jorts . +.El +. +.Pp +A number of my ports +still fail some of these checks, +but I have fixed a lot of problems +the script called out. +. +.Pp +Speaking of problem ports... +git's build system is truly awful. +I'm sorry, +it's just really disappointing. +On the upside though, +I did manage to patch it +to use +.Xr asciidoctor 1 +directly to generate manual pages +from asciidoc source, +rather than generating docbook or whatever +then converting that. +One less build dependency! +I also fixed up curl's +.Pa CMakeLists.txt +(which I guess are normally only used on Windows) +to build and install documentation properly. +And I got libcaca's Cocoa driver working again! +Very important to be able to run +.Xr cacafire 1 +in a Cocoa window. +. +.Pp +Shout out to SDL2, +which didn't require any patching +or extra options beyond +.Ev USE_CMAKE=yes . +Model upstream. +. +.Pp +Some other odds and ends: +I like being able to name ports how I want +(for example, +.Sy ag ) +and use my own port version convention, +using +.Ql + +to append VCS revisions +and +.Ql ~ +to append port revisions. +I don't think those are likely +to ever clash with upstream versioning schemes. +Not that I even need to follow upstream versioning. +There is no reason the version number of +.Xr dash 1 +should start with a zero. +. +.Pp +Speaking of versions, +a big downside of maintaining your own ports tree +is that you actually need to update it. +Thankfully, +once I packaged +.Xr curl 1 +and +.Xr jq 1 +(which needs a new release dammit, +it's been 4 years and the build is broken +on macOS), +I could use the Repology API +to check if I'm behind everyone else. +Far more reliable than +trying to automate checking upstreams +for new versions. +That lives in the +.Pa Outdated +shell script. +. +.Pp +Phew! +I wrote a lot about this. +It feels a little self-indulgent, +but I've had fun working on this +and want to share. +If anyone else tries anything similar, +or is weird enough to give +.Nm jorts +a try themselves, +I'd love to hear about it! +. +.Sh SEE ALSO +.Lk https://git.causal.agency/jorts/ +.Pp +.Lk https://youtu.be/Sx3ORAO1Y6s +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +.Pp +Listening to +.Em Arcade Fire \(em Arcade Fire (EP) , +.Em Arcade Fire \(em The Suburbs . +.Pp +Typed on a brand new +Leopold FC660M +with Cherry MX Red switches. +Lovely keyboard. diff --git a/www/text.causal.agency/034-voices.7 b/www/text.causal.agency/034-voices.7 new file mode 100644 index 00000000..4990295d --- /dev/null +++ b/www/text.causal.agency/034-voices.7 @@ -0,0 +1,56 @@ +.Dd March 5, 2022 +.Dt VOICES 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Voices +.Nd more kinds of them +. +.Sh DESCRIPTION +Welcome to the third time +I started writing this post! +I think the first time +was after watching a jan Misali video +that had clips of audio interviews in it. +It got me thinking about +how interesting it was +to hear someone's voice +without knowing anything else about them. +. +.Pp +That's pretty much all I managed to write +the first two times I started this. +If I get past this next sentence, +then I can probably finish the post. +What stopped me was that +all my thoughts and feelings about voices +are influenced by being trans +(and being a fan of other trans people), +and I thought, +.Dq I don't write about that here, +but why don't I? +I don't have to come out to my blog. +. +.Pp +So really what I have been wanting to say is this: +every trans woman's voice that I have heard +has sounded genuinely wonderful to me. +Especially if you're reading this +and we've been on a voice call before. +I know, +voices are the object of so much self-consciousness, +but I really wish they didn't have to be. +Most of us do not sound like cis women +and to me that is fine. +Good, actually. +Trans women sound like trans women. +As a voice appreciator, +I am so happy to hear more kinds. +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +.Pp +I've been watching some Vektroid streams lately, +and I love her voice. +It was another thing +reminding me to write this. diff --git a/www/text.causal.agency/035-addendum-2021.7 b/www/text.causal.agency/035-addendum-2021.7 new file mode 100644 index 00000000..262f2178 --- /dev/null +++ b/www/text.causal.agency/035-addendum-2021.7 @@ -0,0 +1,111 @@ +.Dd March 18, 2022 +.Dt ADDENDUM-2021 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Addendum 2021 +.Nd missed music +. +.Sh DESCRIPTION +I just realized that I totally forgot +some important music for me from last year +in my Albums 2021 post, +because it wasn't in my playlist. +Last year I watched +the Berserk anime from 1997, +and its soundtrack is incredible. +. +.Pp +Actually the only reason +I started watching it at all +was because of the music. +I was watching the wayneradiotv stream, +.Do +Mon repas durant un temps de tristesse; +un pizza je n'oublierai jamais +.Dc +and I was mesmerized by the Guts theme. +I had to find out what it was from. +This was also around the time +that Kentaro Miura died +so people were really talking about it. +Anyway just hearing +that part of the soundtrack +got me to start watching the anime, +since you can find it all on youtube. +. +.Pp +The anime in general did not disappoint. +Actually it's really fucking good, +and so is the rest of the soundtrack. +The title sequence and credits tracks +are so good that I let them play +every episode even though +I watched the series over only like 2 days. +. +.Pp +I absolutely love whatever genre this stuff is. +Is '90s anime intros its own genre? +Something about combining +acoustic and electric guitars, +maybe. +I'm also fond of +the poorly written english lyrics. +They're poetic in a distinctive way. +I feel the same about +that Shinsei Kamattechan +song that was used for the credits of +Attack on Titan season 2. +Honestly awesome to write lyrics +in a second language you haven't mastered. +. +.Pp +So, +the intro track, +.Em Tell Me Why . +First off, +that sword sound effect +near the beginning rules. +Put that in more songs. +What I really can't get enough of +on this track are +the quiet shouty vocals +a bit off to the left +during the chorus. +It's such a cool idea +to have clean lead vocals +and shouting in the background. +. +.Pp +And the credits track, +.Em "Waiting So Long" . +That first low note is so good. +This is really a perfect credits song +for the atmosphere of the show. +It's creeping. +The dual vocals +the whole way through +are such an interesting texture. +Both of these tracks +have really cool vocal sounds. +And that dirty final guitar chord +is a great sound to end on. +. +.Sh SEE ALSO +These aren't great quality uploads +but this stuff is sadly hard to find. +.Bl -tag -width Ds +.It "Guts" +.Lk https://youtu.be/vZa0Yh6e7dw +.It "Earth" +.Lk https://youtu.be/5iAViNf9Z4Y +.It "Penpals \(em Tell Me Why" +.Lk https://youtu.be/I2rV8oKWSdM +.It "Silver Fins \(em Waiting So Long" +.Lk https://youtu.be/70GD2SBCq64 +.El +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +.Pp +.Dq I like swinging my sword in battle. diff --git a/www/text.causal.agency/036-compassion.7 b/www/text.causal.agency/036-compassion.7 new file mode 100644 index 00000000..9d0d887d --- /dev/null +++ b/www/text.causal.agency/036-compassion.7 @@ -0,0 +1,105 @@ +.Dd March 31, 2022 +.Dt COMPASSION 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Compassion +.Nd better world fiction +. +.Sh DESCRIPTION +Recently I watched the film +.Em Margarita With a Straw . +I'm not sure how to feel +about some aspects of it, +but it tries to do a lot, +and I was still thinking about it +a couple days later. +. +.Pp +What really sticks out about it, +to me, +is that it is +better world fiction, +for lack of a better term. +It's a film about two characters +with disabilities, +but it doesn't play into tropes. +There's no big dramatic scene +where a character gets treated unfairly. +It doesn't really happen. +In the world of the movie, +most people are accepting, +patient +and compassionate. +That's not to say +there is no conflict. +The film is just telling a different story. +. +.Pp +The story takes place +in a better world. +Or maybe it takes place +in a world that exists +within our own, +hidden between the worse parts. +It's wonderfully subversive. +Because I went into the film +expecting at least one deeply upsetting +scene of discrimination. +What else would you expect +of a story like this one, +right? +But instead of being upset, +I was warmed. +It was so nice to see +the characters work through +their own problems +surrounded by simple kindness. +And when it was over, +I was left wanting +to move our world +closer to that one. +. +.Pp +That's what I love about this kind of fiction. +It's why I love the books of Becky Chambers so much. +They give me hope, +and guidance. +I count the +.Em Murderbot Diaries +series in this as well, +which shows a sort of bad world, +and an alternative. +I think it's so important +to see the good that exists +and the good that could exist. +Rather than something to fight against, +these stories show something to fight for. +A more compassionate world. +. +.Pp +I know, +one person can't change the world. +But they can change their own world, +and the worlds of those around them. +And slowly, +good things can spread. +I'll strive to be +more patient, +more understanding, +more compassionate, +and I hope you will too. +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +. +.Pp +I can't help but worry, +when I write something like this, +that someone I know will read it +and think that I'm lying +because I've hurt them. +If that's the case, +I am sorry, +and I promise +I am trying to do better. diff --git a/www/text.causal.agency/037-care.7 b/www/text.causal.agency/037-care.7 new file mode 100644 index 00000000..052a4727 --- /dev/null +++ b/www/text.causal.agency/037-care.7 @@ -0,0 +1,167 @@ +.Dd April 3, 2022 +.Dt CARE 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Care +.Nd trans stuff in Montreal +. +.Sh DESCRIPTION +This kind of info +is frustratingly hard to find +even from support orgs +and the like. +I think it's unlikely +that anyone in my blog's audience +is also someone who needs this info, +and my blog isn't easy to find either, +but I want to at least +make it available somewhere. +Really this is just like +the posts where I figure out +how to do something with a computer +then I write it down. +. +.Pp +Prices obviously change, +by which I mean they inevitably go up, +but I'm gonna give the amounts I paid +in 2021\(en2022. +Also if you want more details +about any of this +please email me. +I will be happy to tell you all about it. +. +.Ss Medication +I get HRT through +Dr. Gabrielle Landry +at La Clinique A, +which is a private clinic. +I've done everything over the phone. +After the first consultation, +I signed an informed consent form +and had a prescription the next day, +which I could start +after I got an initial blood test. +The information I found +said to contact a specific person +at the clinic with a direct phone number, +which is what I did. +Email me if you want that number. +. +.Pp +I paid $300 for the first consult, +$195 for the first followup, +and $75 for further followups. +I think annual appointments +are more expensive +than the followups. +I've been getting blood tests done at a CLSC, +which is free. +On the public drug insurance plan, +I paid $30-$35 +for my prescriptions +as my dosage increased. +I have private insurance now +that entirely covers prescriptions, +so I'm not sure what I'd be paying +for my current prescription +on the public plan. +. +.Ss Hair removal +I tried laser hair removal, +for longer than I should have. +It was a waste of time and money. +Do not believe any arguments about +its convenience over electrolysis. +. +.Pp +I've started getting electrolysis done +with Dimi. +Again, +feel free to email me for contact info. +He is very good and can do long sessions. +I really don't find it very painful, +which I think is partly my own pain tolerance +and partly good equipment and skill. +I've also found that taking acetaminophen beforehand +and dressing warmly to keep my body relaxed help. +I've paid $85 for hour-long sessions +and $160 for two-hour sessions. +I'm still early in treatment, +but I'm really happy with the results so far! +. +.Ss Sex & name change +The form for this is +.Do +Application to Change the Sex Designation +of a Person 18 Years of Age and Over +.Dc +from the +.Em Directeur de l'\('etat civil . +It's self-ID, +but you have to get it signed by +someone you know +and a commissioner for oaths. +Julien at P10 is qualified for that +and was super nice. +We did it over Zoom. +It's a free service, +so I made a donation to P10. +. +.Pp +I paid $144 to file mine +but it's now FREE +the first time you do it. +Also $17 to mail it. +Surprisingly, +I got an acknowledgment letter +.Po +just saying they got it +and would start looking at it +.Dq shortly +.Pc +like a week and a half +after I mailed the application. +My cheque was cashed +39 days after the date +on the acknowledgment, +and I got a +.Dq favourable decision +a week later. +It takes another 30 days +to get the certificate of change, +after which you can +order a new birth certificate +and RAMQ will (slowly) send you a form +to get a new card. +In all it took about 4 months +from when I mailed the application +to having ID with my name on it. +. +.Ss Therapy +I'm not seeking therapy +for gender specifically, +but I would like to find a good therapist +that's aware of it. +I'll update this +if I find one. +. +.Ss Piercings +Ok I know this isn't trans-specific +but at least for me getting piercings +was gender-affirming. +Cuz I got nipple piercings lol. +Anyway, +I went to Mauve. +They're super nice, +really know what they're doing, +and their website has lots of info. +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +. +.Pp +If somehow you did find this useful, +I'd love for you to email me +and let me know how things went for you. diff --git a/www/text.causal.agency/038-agency.7 b/www/text.causal.agency/038-agency.7 new file mode 100644 index 00000000..f99a070b --- /dev/null +++ b/www/text.causal.agency/038-agency.7 @@ -0,0 +1,85 @@ +.Dd April 14, 2022 +.Dt AGENCY 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Agency +.Nd origin of a name +. +.Sh DESCRIPTION +When I registered this domain name, +it was aspirational. +Intentionally so. +I wanted a new domain +for a new identity, +and I was thinking about personhood. +That's what causal agency means. +. +.Pp +It really was aspirational +for me at the time. +I spent a lot of time +wishing I could be a person, +because I didn't feel like one. +I didn't feel real, +like everyone else was. +I didn't have any power +over my own life. +Things just happened to me, +and I watched. +There wasn't really a +.Dq me +there. +The world was something that happened +but that I couldn't interact with. +I felt like that +for most of my life. +. +.Pp +But at some point +I decided that, +even if I wasn't now, +one day I hoped to be an actual real life person. +Like most programmers +I am dreadful at naming things, +so I didn't come up +with this clever domain name +myself. +I typed +.Dq person +into some thesaurus, +and it gave back +.Dq causal agent , +and I realized +agency is a TLD now. +. +.Pp +Maybe it's a little dramatic +to label myself with the thing +I didn't think I had. +But who knows, +maybe it helped. +Because it took a few years, +but I did become a person. +I feel real now. +I can change my own life +and the world around me. +I have causal agency. +. +.Pp +I am really proud of this domain name. +I'm proud to put it on everything I make. +Every instance of it +is a reminder +that I did what I set out to do, +and that I'm still doing it. +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +. +.Pp +If anything in this post resonates with you, +I want you to know that, +whatever you think you can't do, +it is possible, +and you'll get there one day. diff --git a/www/text.causal.agency/039-apologies.7 b/www/text.causal.agency/039-apologies.7 new file mode 100644 index 00000000..1b15076a --- /dev/null +++ b/www/text.causal.agency/039-apologies.7 @@ -0,0 +1,81 @@ +.Dd September 19, 2022 +.Dt APOLOGIES 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Apologies +.Nd making them +. +.Sh DESCRIPTION +Apologies are very important to me. +Unfortunately +I've only recently realized +how valuable they are. +I've tried to think about +what makes a good apology, +since it's not something +I was ever taught. +This is the advice +I came up with for myself, +on how to apologize. +. +.Bl -enum +.It +Make the apology. +This is the most important part. +If you feel guilty +for something you've done, +or think you might have hurt someone, +apologize. +Even if they don't need an apology, +saying sorry won't hurt. +And start with that. +Literally say +.Dq I'm sorry . +Sometimes people forget that. +.Pp +On the other side, +if you've been hurt by someone, +and you trust them, +let them know. +Give them a chance to apologize. +People don't always realize +they've made a mistake. +. +.It +Explain what you did wrong. +I think it's important +for the other person +to know you understand +how you've messed up. +Really think about this! +It's what will help you learn. +If you know you've hurt someone +but you're not sure why, +you can try asking them. +Take their answer seriously. +. +.It +Don't make excuses. +Do not talk about yourself. +Don't even mention +how you were feeling stressed that day, +or whatever. +It's not relevant. +We all make mistakes, +we all have bad days. +. +.It +Commit to doing better. +Try to learn from your mistakes. +Say it won't happen again. +Literally say +.Dq I won't do that again . +And then try your hardest to make that true. +An apology is a commitment, +not something you're done with +once you've said it. +.El +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency diff --git a/www/text.causal.agency/040-sound-memory.7 b/www/text.causal.agency/040-sound-memory.7 new file mode 100644 index 00000000..c995de08 --- /dev/null +++ b/www/text.causal.agency/040-sound-memory.7 @@ -0,0 +1,165 @@ +.Dd November 14, 2022 +.Dt SOUND-MEMORY 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Sound Memory +.Nd associations +. +.Sh DESCRIPTION +.Ss Talking Heads \(em "Remain In Light" +The first time I gave this album a serious listen +was when I was going for several-hour walks +at 4 in the morning in, +I think, +fall 2020. +I would stay up all night, +go out walking at 4am +for a couple hours, +come home, +eat +.Dq breakfast +and go to sleep. +I listened to this album +walking on completely empty +big city streets +in the dark. +. +.Ss Buffy Sainte-Marie \(em Up Where We Belong +I started listening to this album +after hearing it many mornings +walking into the cafe on my block +back in 2019. +I could tell Vincent was working +if I heard this when I opened the door. +. +.Ss Molasses \(em Trilogie: Toil & Peaceful Life +I listened to this when I had 8am classes +in CEGEP. +In particular my first semester philosophy course, +which was in the forum. +I usually got there even earlier +because of how the bus schedules worked out. +There was another girl in my class, +who I always sat next to, +who also got there early, +but we never spoke outside of class. +. +.Ss Arcade Fire \(em Funeral +This album just feels like walking outside +in fresh snow in early winter, +you know? +. +.Ss Molasses \(em Trouble at Jinx Hotel +I listened to this when I was looking for an apartment. +I specifically remember listening to it +walking down Clark toward my new place +to pick up my keys. +. +.Ss Arcade Fire \(em Neon Bible +The song +.Dq "No Cars Go" +is strongly associated for me +with my earliest gender feelings. +It's how I date when I first +started to feel like something was wrong. +The Suburbs was released in 2010, +so I was probably listening to Neon Bible +in 2011. +Ten years between that +and coming out. +. +.Ss "Do Make Say Think" \(em "You You're a History In Rust" +I remember hearing +.Dq "A Tender History In Rust" +for the first time +at the office of my first job. +Me and my coworkers stayed late, +probably on a Friday night, +drinking free tech startup booze. +. +.Ss mewithoutYou \(em It's All Crazy! It's All False! It's All a Dream! It's Alright +I exclusively listened to this album +on a high school trip to Europe. +Every morning when we got on the bus, +I heard +.Dq Every Thought a Thought of You +and every night before bed +I listened to +.Dq The King Beetle on a Coconut Estate . +. +.Ss Arcade Fire \(em The Suburbs +I listened to this album a tonne +when I was playing +Minecraft and Urban Terror +with my online friends +while I was in high school. +In particular I remember +a backyard shed World of Padman map +and the apartments Minecraft world. +. +.Ss Arcade Fire \(em Reflektor +I associate +.Dq Afterlife +with the walk between Laurier metro +and my first job, +in the winter. +Must've just been how the timing worked out +with my commute at the time. +. +.Ss Swans \(em To Be Kind +I listened to this on one of my playthroughs +of Half-Life 2. +In particular I associate +.Dq Bring the Sun / Toussaint L'Ouverture +with the Water Hazard chapter. +. +.Ss Wrekmeister Harmonies \(em Light Falls +For a while I put this on whenever I +left my apartment to go somewhere +and it was already dark, +so probably winter. +. +.Ss St. Vincent \(em MASSEDUCTION +This, +along with the next one, +I think were all I listened to +on a family vacation +to Quebec City and New Brunswick +some years ago. +. +.Ss SOPHIE \(em Oil of Every Pearl's Un-Insides +Many hours on the road +on that family vacation. +Two albums on repeat. +. +.Ss Julia Holter \(em Aviary +This is another album +I listened to when I was taking +walks at 4am. +I wasn't in a good place. +Yet. +. +.Ss Beep Test \(em Laugh Track +A tape from the first act +at one of my favourite shows +I've ever been to, +at La Sotterenea +in Suoni 2019. +I wish I had been out already. +. +.Ss The Armed \(em Only Love +The third of the albums I listened to +on those dark walks. +I listened to it loud, +this album's mixing needs it. +. +.Ss Eliza Kavtion \(em The Rez That Summer +A favourite local artist. +I remember vividly the first time +I heard her play, +opening for Wrekmeister Harmonies +at La Vitrola in 2018. +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency diff --git a/www/text.causal.agency/041-albums-2022.7 b/www/text.causal.agency/041-albums-2022.7 new file mode 100644 index 00000000..48bd3c3d --- /dev/null +++ b/www/text.causal.agency/041-albums-2022.7 @@ -0,0 +1,185 @@ +.Dd December 21, 2022 +.Dt ALBUMS-2022 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm albums 2022 +.Nd review +. +.Sh DESCRIPTION +it's the year-end review +of albums I listened to. +same as last year, +I added any albums I got into +this year to a playlist. +I've actually done that +every year since 2018. +maybe I'll review +those old playlists some time. +. +.Ss ZHAOZE \(em SUMMER INSECTS TALK ABOUT ICE (2021) +it's a five-and-a-half-minute album! +you can loop it however long you want. +it's really lovely. +.Pp +favourite track: +ON HORSEBACK, TO FARAWAY +. +.Ss KATE BUSH \(em HOUNDS OF LOVE (1985) +first of all I do not watch that one show. +I've known that track for a while actually. +I mean I probably first heard the CHROMATICS cover. +but anyway, +I think someone mentioned this album +on IRC at just the right time +and I put it on. +the second half really shines tbh. +love a concept album. +.Pp +favourite tracks: +RUNNING UP THAT HILL, +HOUNDS OF LOVE, +AND DREAM OF SHEEP, +WATCHING YOU WITHOUT ME, +THE MORNING FOG. +. +.Ss GODSPEED YOU! BLACK EMPEROR \(em ALL LIGHTS FUCKED ON THE HAIRY AMP DROOLING (1994) +didn't expect to hear this probably ever. +still wild that it finally got uploaded. +and to be honest I'm a little mad +that it's actually good. +like yeah it's not a godspeed album +but it holds up as a tape on its own. +it's the kind of shit I listen to. +also can't believe some people +still thought it was fake. +like have you not heard +any other efrim menuck projects? +.Pp +favourite tracks: +$13.13, +DIMINISHING SHINE, +DADMOMDADDY, +333 FRAMES PER SECOND, +ALL ANGELS GONE. +. +.Ss BLACK DRESSES \(em FORGET YOUR OWN FACE (2022) +woops I think I only listened to this like twice. +will need to revisit it later for sure. +I'll like it. +. +.Ss BACKXWASH \(em I LIE HERE BURIED WITH MY RINGS AND MY DRESSES (2021) +only got into this album +after hearing it live this summer. +was the first show I went to in years +and it was really fucking good. +gotta listen to this shit loud. +sampling godspeed for a beat fucks. +honestly back to back bangers. +.Pp +favourite tracks: +I LIE HERE BURIED WITH MY RINGS AND MY DRESSES, +TERROR PACKETS, +SONG OF SINNERS, +BURN TO ASHES. +. +.Ss PHILIP GLASS ENSEMBLE \(em EINSTEIN ON THE BEACH (1979) +actually just the knee plays +because I can't be bothered +listening to all of it. +and I'm embarrassed by how much +I enjoy this avant-garde bullshit. +like ok just sing repeating numbers at me +and my brain is happy. +what is this? +my kink? +anyway I also have kind of an obsession +with the +.Dq story of love +in knee 5. +I fucking hate it. +but it's delivered so well. +and that violin though! +.Pp +favourite tracks: +KNEE 1, +KNEE 5. +. +.Ss KANYE WEST \(em YEEZUS (2013) +ok look I listened to this +before recent events. +what the fuck. +it's a really good album though? +pretty sure I listened to it +because bound 2 kept getting in my head, +because of that minecraft parody parody +wayne did ages ago. +.Pp +favourite tracks: +BLACK SKINHEAD, +HOLD MY LIQUOR, +BLOOD ON THE LEAVES, +BOUND 2. +. +.Ss FLYING RACCOON SUIT \(em AFTERGLOW (2021) +I've listened to the whole album +a few times +but I'm mostly just here +for the title track. +this also happened to be +dropped in IRC at just the right time. +good ska-punk-type shit. +and I like lisps ok. +.Pp +favourite track: +AFTERGLOW. +. +.Ss RAMSHACKLE GLORY \(em LIVE THE DREAM (2011) +one of those albums +I don't know why I took so long +to get to. +I've been listening to johnny hobo +since I was like in high school. +ramshackle is a little more hopeful +and I love that. +your heart is a muscle the size of your fist. +keep on loving. +keep on fighting. +.Pp +favourite tracks: +WE ARE ALL COMPOST IN TRAINING, +NEVER COMING HOME, +YOUR HEART IS A MUSCLE THE SIZE OF YOUR FIST. +. +.Ss LES RALLIZES D\('ENUD\('ES \(em THE OZ TAPES (2022) +a pleasant surprise in someone's playlist. +lately I've been listening to this +in the metro to or from electrolysis. +it's good listening for that. +bold to have two versions +of the same 24-minute song +on the same release. +.Pp +favourite tracks: +A SHADOW ON OUR JOY, +THE LAST ONE_1970 (ver.2). +. +.Ss LINGUA IGNOTA \(em SINNER GET READY (2021) +another I'm only getting into +after hearing it live. +just last sunday actually. +was a good show. +people will go wild +to hear a cover live for real. +.Pp +favourite tracks: +I WHO BEND THE TALL GRASSES, +PENNSYLVANIA FURNACE, +PERPETUAL FLAME OF CENTRALIA. +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +.Pp +I started writing this +before I saw LINGUA IGNOTA. +good thing I waited. diff --git a/www/text.causal.agency/042-comfort-music.7 b/www/text.causal.agency/042-comfort-music.7 new file mode 100644 index 00000000..445e04c3 --- /dev/null +++ b/www/text.causal.agency/042-comfort-music.7 @@ -0,0 +1,62 @@ +.Dd February 23, 2024 +.Dt COMFORT-MUSIC 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm comfort music +.Nd feel better +. +.Sh DESCRIPTION +it's been a while. +and I'm on almost no sleep +and haven't eaten a real meal +since noon. +which is a state I've written +at least a couple posts in before, +so what better time +to return to what has apparently +become this blog's format: +lists of some music I like. +. +.Pp +this is a list of music that comforts me. +. +.Bl -bullet +.It +knee play 5, from einstein on the beach. +I like the organ and the counting and the cadence of the story. +.It +low \(em words. +and I'm tired. +.It +godspeed you! black emperor \(em storm. +this is like my original comfort music. +been listening to it since I was teenage. +the grooves are worn deep in my mind. +.It +set fire to flames \(em love song for 15 ontario (w/ singing police car). +I like how it ends. +.It +va, from the beginner's guide. +I think that's the whole point. +though maybe it's too sad +to be truly comforting. +.It +undertale, from undertale. +what can I say? +.It +wrekmeister harmonies \(em covered in blood from invisible wounds. +I find quite a bit of the album comforting really. +I'm picking this one because I like the cadence +of the lyrics. +.It +lingua ignota \(em pennsylvania furnace and perpetual flame of centralia. +these are really my go to in recent times. +I like waiting for the next line. +.El +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency +.Pp +I don't think I've said anything +very interesting here. diff --git a/www/text.causal.agency/043-little-blessings.7 b/www/text.causal.agency/043-little-blessings.7 new file mode 100644 index 00000000..957c6289 --- /dev/null +++ b/www/text.causal.agency/043-little-blessings.7 @@ -0,0 +1,78 @@ +.Dd March 24, 2024 +.Dt LITTLE-BLESSINGS 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm little blessings +.Nd life's +. +.Sh DESCRIPTION +today I went out to go around. +run some errands and do some shopping. +along the way I was given +several of life's little blessings. +. +.Pp +while walking on ste-cath +between berri and complexe desjardins, +there was a somewhat disheveled man +walking in the same direction and singing. +he had a beautiful voice. +he was singing a sad song in french, +and he sung it well and enunciated every word. +. +.Pp +in the mcdonald's at complexe desjardins, +while waiting for my order, +there were what appeared to be +a teenager and her younger brother, +who must have been +looking at the display of +current happy meal toys. +the teenager was playing smash or pass, +to the amusement of the younger one. +they got ice cream +and ate it across the room from me downstairs. +. +.Pp +later, +taking the 24 home from atwater +carrying my new vacuum cleaner, +the bus got lost. +I think the driver missed the stop +and tried to compensate +by turning north onto peel +and stopping there. +but then he had to keep going up peel. +he turned right onto docteur-penfield, +which just brings you further up the mountain. +when it met des pins, +he turned left and pulled over, +asking for guidance over the radio. +we got moving again, +back towards peel. +that's how I ended up +on a 24 +.Dq sherbrooke +east, +facing west on des pins. +it was actually quite scenic. +and amusing. +I was in no rush. +. +.Pp +after getting back onto sherbrooke, +the bus had to take another detour, +this one planned. +so my ride on the 24, +which normally only drives on sherbrooke, +ended up going on peel, +docteur-penfield, +des pins, +de bleury, +ren\('e-l\('evesque +and saint-laurent. +it was a very exciting bus trip. +. +.Sh AUTHORS +.An june Aq Mt june@causal.agency 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/Makefile b/www/text.causal.agency/Makefile index 34649128..6b1bd02f 100644 --- a/www/text.causal.agency/Makefile +++ b/www/text.causal.agency/Makefile @@ -1,4 +1,4 @@ -WEBROOT = /usr/local/www/text.causal.agency +WEBROOT = /var/www/text.causal.agency TXTS += 001-make.txt TXTS += 002-writing-mdoc.txt @@ -9,19 +9,59 @@ TXTS += 006-some-libs.txt TXTS += 007-cgit-setup.txt TXTS += 008-how-irc.txt TXTS += 009-casual-update.txt +TXTS += 010-irc-suite.txt +TXTS += 011-libretls.txt +TXTS += 012-inability.txt +TXTS += 013-hot-tips.txt +TXTS += 014-using-vi.txt +TXTS += 015-reusing-tags.txt +TXTS += 016-using-openbsd.txt +TXTS += 017-unpasswords.txt +TXTS += 018-operating-systems.txt +TXTS += 019-mailing-list.txt +TXTS += 020-c-style.txt +TXTS += 021-time-machine.txt +TXTS += 022-swans-are-dead.txt +TXTS += 023-sparse-checkout.txt +TXTS += 024-seprintf.txt +TXTS += 025-v6-pwd.txt +TXTS += 026-git-comment.txt +TXTS += 027-openbsd-linode.txt +TXTS += 028-names.txt +TXTS += 029-topics.txt +TXTS += 030-discs.txt +TXTS += 031-books-2021.txt +TXTS += 032-albums-2021.txt +TXTS += 033-jorts.txt +TXTS += 034-voices.txt +TXTS += 035-addendum-2021.txt +TXTS += 036-compassion.txt +TXTS += 037-care.txt +TXTS += 038-agency.txt +TXTS += 039-apologies.txt +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 -all: ${TXTS} +all: colb ${TXTS} -.SUFFIXES: .7 .txt +.SUFFIXES: .7 .fmt .txt .7.txt: - mandoc $< | col -bx > $@ + mandoc -T utf8 $< | ./colb > $@ + touch -m -r $< $@ -feed.atom: feed.sh ${TXTS} +.fmt.txt: + fmt $< | sed '1,/^$$/d' > $@ + touch -m -r $< $@ + +feed.atom: feed.sh colb ${TXTS} sh feed.sh > feed.atom clean: - rm -f ${TXTS} feed.atom + rm -f colb ${TXTS} feed.atom -install: ${TXTS} feed.atom +install: colb ${TXTS} feed.atom install -p -m 644 ${TXTS} feed.atom ${WEBROOT} diff --git a/www/text.causal.agency/colb.c b/www/text.causal.agency/colb.c new file mode 100644 index 00000000..5faabc3a --- /dev/null +++ b/www/text.causal.agency/colb.c @@ -0,0 +1,16 @@ +#include <locale.h> +#include <stdio.h> +#include <wchar.h> +int main(void) { + setlocale(LC_CTYPE, "en_US.UTF-8"); + wint_t next, prev = WEOF; + while (WEOF != (next = getwchar())) { + if (next == L'\b') { + prev = WEOF; + } else { + if (prev != WEOF) putwchar(prev); + prev = next; + } + } + if (prev != WEOF) putwchar(prev); +} diff --git a/www/text.causal.agency/feed.sh b/www/text.causal.agency/feed.sh index de9e7c54..71bbf662 100644 --- a/www/text.causal.agency/feed.sh +++ b/www/text.causal.agency/feed.sh @@ -4,33 +4,53 @@ set -eu readonly Root='https://text.causal.agency' updated=$(date -u '+%FT%TZ') -cat <<- EOF +cat <<-EOF <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <title>Causal Agency</title> <author><name>June</name><email>june@causal.agency</email></author> <link href="${Root}"/> - <id>${Root}</id> + <link rel="self" href="${Root}/feed.atom"/> + <id>${Root}/</id> <updated>${updated}</updated> EOF -for entry in *.7; do - url="${Root}/${entry%.7}.txt" +encode() { + sed ' + s/&/\&/g + s/</\</g + s/"/\"/g + ' "$@" +} + +set -- *.txt +shift $(( $# - 20 )) +for txt; do + entry="${txt%.txt}.7" + test -f "$entry" || entry="${txt%.txt}.fmt" date=$(grep '^[.]Dd' "$entry" | cut -c 5-) - title=$(grep '^[.]Nm' "$entry" | cut -c 5-) - summary=$(grep '^[.]Nd' "$entry" | cut -c 5-) + title=$(grep -m 1 '^[.]Nm' "$entry" | cut -c 5- | encode) + summary=$(grep '^[.]Nd' "$entry" | cut -c 5- | encode) published=$(date -ju -f '%B %d, %Y %T' "${date} 00:00:00" '+%FT%TZ') mtime=$(stat -f '%m' "$entry") updated=$(date -ju -f '%s' "$mtime" '+%FT%TZ') - cat <<- EOF + cat <<-EOF <entry> <title>${title}</title> <summary>${summary}</summary> - <link href="${url}"/> - <id>${url}</id> + <link href="${Root}/${txt}"/> + <id>${Root}/${txt}</id> <published>${published}</published> <updated>${updated}</updated> - <content type="text/plain" src="${url}"/> + <content type="xhtml"> + <div xmlns="http://www.w3.org/1999/xhtml"> + EOF + printf '<pre>' + encode "$txt" + cat <<-EOF + </pre> + </div> + </content> </entry> EOF done |