about summary refs log tree commit diff
diff options
context:
space:
mode:
-rwxr-xr-x.gitignore1
-rwxr-xr-xserved/bits/time.html105
-rw-r--r--served/cohost/cohost.html17
-rw-r--r--served/cohost/gif-selfies/gif-selfies.html165
-rw-r--r--served/cohost/make-useless-things.html27
-rw-r--r--served/cohost/named-a-thing-feeling.html16
-rwxr-xr-xserved/styles/common.css4
-rwxr-xr-xserved/styles/home.css2
-rwxr-xr-xserved/styles/post.css2
-rw-r--r--served/styles/writing.css77
-rw-r--r--served/words/a-really-long-week.html103
-rwxr-xr-xserved/words/alternate-ifc-formatting.html28
-rw-r--r--served/words/debugging-my-sql-query.html82
-rw-r--r--served/words/weeknotes/2024/48.html44
-rwxr-xr-xserved/words/weeknotes/what.html24
-rwxr-xr-xserved/words/words.css10
-rwxr-xr-xserved/words/words.html11
-rwxr-xr-xserved/words/writing.css6
-rw-r--r--support/atom_new copy.conf28
-rw-r--r--support/atom_new.conf28
20 files changed, 721 insertions, 59 deletions
diff --git a/.gitignore b/.gitignore
index 734f8c9..c79a8a3 100755
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
 *.jpg
 *.gif
 *.nef
+*.webp
 
 # video
 *.mp4
diff --git a/served/bits/time.html b/served/bits/time.html
new file mode 100755
index 0000000..dc0ea0f
--- /dev/null
+++ b/served/bits/time.html
@@ -0,0 +1,105 @@
+---
+Template post
+Title  
+---
+
+<style>
+	@font-face {
+		font-family: 'Dosis';
+		font-weight: 200;
+		src: url('/Dosis-ExtraLight.otf');
+	}
+
+	#counter {
+		margin: 96px auto;
+		width: 15rem;
+
+		font-weight: normal;
+		font-family: 'Dosis', sans-serif;
+	}
+
+	#days {
+		width: min-content;
+		font-weight: 200;
+		font-size: 5rem;
+		font-family: inherit;
+	}
+
+	#time {
+		width: min-content;
+		font-weight: 200;
+		font-size: 4rem;
+		font-family: inherit;
+	}
+
+	#dates {
+		display: none !important;
+	}
+</style>
+
+<!-- Dosis: https://github.com/impallari/Dosis -->
+
+<section id="counter">
+	<h1 id="days"></h1>
+	<h2 id="time"><span id="hours"></span>:<span id="minutes"></span>:<span id="seconds"></span></h2>
+</section>
+
+<script>
+	const BIRTH = Date.parse("2001-04-13T02:56:00-05:00");
+	const SEC_DAY = 60 * 60 * 24;
+
+	function calculate() {
+		let now = Date.now();
+		let lif = Math.floor((now - BIRTH) / 1000);
+
+		let day = Math.floor(lif / SEC_DAY);
+		let sub_day = lif % (60 * 60 * 24);
+		let hou = Math.floor(sub_day / (60 * 60));
+		let min = Math.floor( (sub_day % (60 * 60)) / 60 );
+		let sec = sub_day % 60;
+
+		return {
+			days: day,
+			hours: hou,
+			minutes: min,
+			seconds: sec
+		}
+	}
+
+	let days_reposition = 0;
+	function display() {
+		let time = calculate();
+
+		let day = document.getElementById('days');
+		let hour = document.getElementById('hours');
+		let minute = document.getElementById('minutes');
+		let second = document.getElementById('seconds');
+
+		day.innerText = time.days;
+		hour.innerText = human(time.hours);
+		minute.innerText = human(time.minutes);
+		second.innerText = human(time.seconds);
+
+		if (days_reposition % 60 == 0) {
+			let time_width = document.getElementById('time').clientWidth;
+			let days = document.getElementById('days');
+
+			// Perfect half looks weird? Cheat left
+			let pad = (time_width - days.clientWidth) / 2.5;
+			days.style.paddingLeft = `${pad}px`;
+		}
+
+		days_reposition++;
+	}
+
+	function human(n) {
+		if (n < 10) {
+			return '0' + n;
+		} else {
+			return n;
+		}
+	}
+
+	setInterval(display, 1000);
+	display();
+</script>
\ No newline at end of file
diff --git a/served/cohost/cohost.html b/served/cohost/cohost.html
new file mode 100644
index 0000000..f39091b
--- /dev/null
+++ b/served/cohost/cohost.html
@@ -0,0 +1,17 @@
+---
+template=post
+title=Cohost
+style=/styles/post.css
+---
+
+Things from <a href="https://cohost.org/gen">cohost.org</a> collected here until
+i maybe sort them further one day. This is to prevent the "where does this go"
+brain-panic.
+
+these are in chronological order.
+
+<ol>
+	<li><a href="gif-selfies/">gif-selfies.html</a></li>
+	<li><a href="make-useless-things.html">make-useless-things.html</a></li>
+	<li><a href="named-a-thing-feeling.html">named-a-thing-feeling.html</a></li>
+</ol>
\ No newline at end of file
diff --git a/served/cohost/gif-selfies/gif-selfies.html b/served/cohost/gif-selfies/gif-selfies.html
new file mode 100644
index 0000000..63134e3
--- /dev/null
+++ b/served/cohost/gif-selfies/gif-selfies.html
@@ -0,0 +1,165 @@
+---
+template=post
+title=Gif Selfies and Colour Quantization
+style=/styles/post.css
+style=/styles/writing.css
+---
+
+<!-- https://cohost.org/gen/post/600484-gif-selfies-and-colo -->
+<!-- Monday, December 22nd, 2022 3:50pm -->
+
+I'm working on a project with gifs because I really do like them very much. The
+beginning of this project is reading from my webcam, downscaling the image, and
+reducing to 256 colors so it can fit in the gif. So that's what this is about!
+
+We'll start at a grayscale selfie. After helping to fix a bug in the webcam
+crate I was using <i>(I don't contribute a lot so it was nice! i liked it)</i>,
+it was pretty easy to shove it into a gif. I used neam to downscale the image
+and gifed to do all the gif related things. Grayscale isn't why we're here
+though, let's get on with colour!
+
+<aside>
+	<code>neam</code> and <code>gifed</code> are two of my image-related projects.
+	neam is used here as a library for downscaling images using Nearest Neighboor
+	and gifed is for encoding gifs. that's all you really need to know about them
+	to make it through :)
+</aside>
+
+<img src="grayscale.gif" style="max-width: 20rem;"
+	alt="A short GIF of me holding a candle close to my face and waving. The candle provides the only light so it and I are all you can see. The apparent framerate is only 1 frame per second." />
+
+<h2>Colour, oh no!</h2>
+
+I'll keep this breif 'cause I don't think I am particularly qualified to talk
+about it but there are images from it I want to show, so it gets a breif mention.
+
+For awhile I thought the colour format was NV12, which is a kind-of-weird
+version of YUV420. This is a good <a href="http://paulbourke.net/dataformats/nv12">explanation of NV12.</a>
+
+
+What I was getting instead was YUV422 in the UYUV format
+(<a href="http://paulbourke.net/dataformats/yuv/">explanation of yuv</a>). Deriving RGB from
+this was not easy, but that's only because I thought it was NV12. Once I figured
+out what I was working with it got a lot easier. Here are a few images from working
+through it. I think they're rather nice.
+
+<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 0px; margin: 1em 0px; width: 100%">
+	<img style="width: 100%; margin: 0px;" src="pngd_nv12_2.webp"
+		alt="A set of four images in a 2x2 grid showing the progress from &quot;entirely wrong&quot; to &quot;almost correct&quot;. We start at a very magenta, nonsensical image. There is a severe screen-door, moire effect covering the entire image, but some semblance of shape can still be made out. The next image looks more correct. It's still highly magenta but now there are islands of darker meganta that seem to want to form objects. The third image fixes the magenta, but now we can see that things are very misaligned and the colour is all in the wrong place. There's patches of yellow and red and green and blue that don't align with any shape. We can see that these are pictures of me and I'm in a room. There's a book in front of half my face and the text is even readable! It's &quot;Untethering The Web&quot; which is a book in the Software For Artists series. In the final image the full frame is finally visible. The colours are still misaligned, but the luma is in the right spot so all the shapes are correct. In addition to the book you can see I'm holding a retractable dog leash and an old RCA vacuum tube box. The colours of these items can't be made out, but I can tell you that they're green, blue, and red. An object for reach RGB channel." />
+	<img style="width: 100%; margin: 0px;" src="pngd_nv12_3.webp" alt="" />
+	<img style="width: 100%; margin: 0px;" src="pngd_nv12_4.webp" alt="" />
+	<img style="width: 100%; margin: 0px;" src="pngd_nv12_5.webp" alt="" />
+</div>
+
+<h2>Colour Quantization</h2>
+
+Before we get into the GIFs, we have to stop at
+<a href="https://en.wikipedia.org/wiki/Color_quantization">colour quantization</a>. It's the
+process of reducing the unique colour count of an image. We
+have to do this because the maximum size of a GIF palette is 256 colours.
+Which is a lot less than images typically have!
+
+The most popular way to do this, I think, is to use an algorithm like k-means
+clustering. I didn't use k-means, so I won't talk about it. But it's nice to
+know what's out there. If you want to know more, the
+<a href="https://github.com/okaneco/kmeans-colors#1-basic-usage">kmeans-colors crate readme</a>
+is pretty good. Also
+<a href="https://en.wikipedia.org/wiki/Image_segmentation#Clustering_methods">this</a>
+bit of Wikipedia.
+
+<h2>colorsquash</h2>
+
+I didn't use k-means. What I did is probably worse, but it was more fun!
+I use a thing I wrote called <a href="https://github.com/mademast/colorsquash">colorsquash</a>.
+
+Maybe the hardest part of quantization is picking the palette. What 256 colours
+out of the ~16.8 million would be good to represent this image?
+
+I don't know, which ones are most common? Yeah, really.
+
+colorsquash counts up how many times each color occurs and then sorts them most common to least.
+We don't want to just take the most common 256, that'd get a lot of very
+similar colours, so it uses a tolerance to exclude some of them.
+
+It will only add another colour to
+the palette if every colour in the palette is no more than 1.3% similar. There
+was no method to choosing this number. I slowly adjusted it until it either
+stopped picking 6 colours, or stopped making the entire image barely different shades of
+the same colour. Those are the two extremes that, I guess, 1.3% sits between.
+
+<aside>
+	1.3% is a specific number to this application. it seems to give different
+	performance based on the contents of the image you're squashing.
+</aside>
+
+There's more work to do after we pick the palette; the image itself still has to
+be mapped to the new, very reduced colourspace. Initially, colorsquash looked
+through the entire palette for every pixel and chose the most similar colour.
+It was written to play with images from my DSLR which're roughly 6000x4000,
+or 24 million pixels. If it checked all 256 selected colours with all those
+pixels then it ends up running 6.1 billion calculations. That's too many!
+
+Good, then, that a lot of the colours are the same. The most common
+colour may occur tens of thousands of times. That's a lot of wasted
+computation that doesn't need to happen; it only needs to compute the color
+difference once really.
+
+So I traded space for time and allocated a <code>Vec&lt;u8&gt;</code> that was 256^3
+in length and then stored the index of the selected colour at a location equal to
+<code>red + green * 256 + blue * 256 * 256</code>. I'm more than happy to take
+~16MB of ram to get an 11x speedup. at least that's what I think it ended up being?
+I did all that awhile ago ^^;;
+
+<h2>There's a problem</h2>
+
+Okay okay I swear there was a point. Every frame from the webcam is decoded
+into RGB and then sent through colorsquash to reduce the color palette. Only
+one palette is used for the entire GIF. It's called the Global Color Table <i>(and
+	I'm mad you can't modify or swap it out on the fly, but whatever)</i>.
+
+If I didn't use a Global Color Table I'd have
+to pass a colour table on every image and that's 768 bytes I don't want to spend.
+At 10fps it's 7.6KB. gif is already inefficient so I really don't need to
+help it use <i>more</i> data.
+
+The palette is picked once on the first frame because it's an expensive operation.
+At my target framerate of 5fps we only get 200ms to do everything we need. That's a
+pretty good bit of time. "Pick a palette", however, is not all that needs to happen, so every frame after the
+first would <i>only</i> map the image <i>(not picking a whole new palette)</i>.
+
+<details>
+	<summary>CW for body horror? The area around my eyes and mouth is just a noisy black, so</summary>
+
+	<img src="close_candle.gif" style="margin: 0px auto;"
+		alt="A very noisy gif of myself looking at and then blowing out a candle. The candle itself is emanating light; it's casting a sphere of light around itself, which you can see in the gif. My white face is lit pretty well, but there is a lot of pure black noise covering the frame especially concentrated around my eyes and mouth. It almost looks like it's coming from the candle. When I blow out the candle, the entire frame goes out." />
+</details>
+
+Well thaaaaat's not right. I fought with this for awhile and produced a number
+of gif in the same style. It's kind of beautiful! Image bugs are my favorite.
+Here's one I liked quite a bit.
+<i>( a friend suggeted I try black lipstick after seeing this one :3 )</i>
+
+<details>
+	<summary>CW for body horror for the same reason.</summary>
+
+	<img src="goth.gif" style="margin: 0px auto;"
+		alt="a similarly broken gif as the last. I have my eyes closed facing the camera, head slowly angling downward. I think I was singing? The black noise appears and covers my eyes and mouth and nose." />
+</details>
+
+I don't know if you can see. Can you? The first frame? It looks fine. Great! in fact. What on earth.
+
+Remember how I said it wasn't picking the palette on every frame?
+Well <i>that</i> has come back to bite! When the colorspace is mapped into the
+really-kind-of-quite-large <code>Vec</code>, it <i>only</i> maps the colors it's
+seen already; it only assigns a palette-index to any colour seen in the first
+frame. The rest are left just as they started: index 0. I set index 0 as
+black myself so I could have the top/bottom bars because then the gif could be
+square <i>(and i like squares)</i>!
+
+So I fixed it! For every unique color in every image, it finds the closest colour
+in the palette and adds it to the colour map. Maybe I'll do the entire
+16.8 million colours on the first frame, it might be smart, but that's how it is
+right now. So here's my good face in glorious 256 colours.
+
+<img src="yay_color.gif" style="margin: 1em auto; width: 100%; max-width: 20em;"
+	alt="My smiling face looking at the camera, waving, and looking back down at my integrated terminal in VS Code (unseen). It actually loops pretty well. The colours are finally correct. There is no kind of disturbing black noise and it looks like a regular, short-fps video. just in 256 colours." />
\ No newline at end of file
diff --git a/served/cohost/make-useless-things.html b/served/cohost/make-useless-things.html
new file mode 100644
index 0000000..d5a4028
--- /dev/null
+++ b/served/cohost/make-useless-things.html
@@ -0,0 +1,27 @@
+---
+template=post
+title=Make Useless Things
+style=/styles/post.css
+style=/styles/writing.css
+---
+
+<!-- https://cohost.org/gen/post/700864-make-useless-things -->
+<!-- Saturday, December 24th, 2022 8:34am -->
+
+<img style="width: unset" src="/bits/sillygifs/0123456789.gif"
+	alt="the numbers 0 to 9 counting up and then down and then up again, forever. they're in a 7-segment kind of font and are an amber colour">
+
+I greatly enjoy the concept of the Useless Machine. A thing made for the joy of it.
+It might do nothing at all and just look neat, or it could do something over and
+over that doesn't provide any "value". But it does provide value.
+Because I look at it and I smile and that's enough.
+
+That's all to say, I made a set of useless things. Just a few GIF that count to some
+numbers. The greatest of which is nearly half a gigabyte large and would take over
+a week to watch.
+
+<div style="text-align: center;">
+	<a href="/bits/sillygifs">sillygifs</a>
+
+	<img style="width: unset" src="/bits/sillygifs/100.gif" alt="gif counting from 0 to 100 a second at a time">
+</div>
\ No newline at end of file
diff --git a/served/cohost/named-a-thing-feeling.html b/served/cohost/named-a-thing-feeling.html
new file mode 100644
index 0000000..212a799
--- /dev/null
+++ b/served/cohost/named-a-thing-feeling.html
@@ -0,0 +1,16 @@
+---
+template=post
+title=I Named a thing "feeling" today
+style=/styles/post.css
+style=/styles/writing.css
+---
+
+<!-- https://cohost.org/gen/post/956113-i-named-a-thing-fee -->
+<!-- Friday, February 3rd, 2023, 9:53am -->
+
+I named a thing "feeling" today and these commands made me think.
+
+<div style="max-width: 20rem; margin: 0 auto; display: flex; flex-direction: column; text-align: center;"><code
+		style="padding-right: 25%;">systemctl start feeling</code>
+	<code style="padding-left: 25%;">journalctl -ru feeling</code>
+</div>
\ No newline at end of file
diff --git a/served/styles/common.css b/served/styles/common.css
index 9d2385e..64067cb 100755
--- a/served/styles/common.css
+++ b/served/styles/common.css
@@ -19,7 +19,7 @@
 		--text-dim: #bbb;
 		--text-link: #ddf;
 		--text-link-visited: #fed;
-		--background: #001;
+		--background: #112;
 		--background-dim: #333;
 		--color-a: #3a8;
 		--color-a-dim: rgb(158, 228, 208);
@@ -35,7 +35,7 @@ body {
 body {
 	font-size: 1.1rem;
 	line-height: 1.4;
-	font-family: sans-serif;
+	font-family: 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
 	padding: 2rem 5vw;
 
 	color: var(--text);
diff --git a/served/styles/home.css b/served/styles/home.css
index be276b2..d48471a 100755
--- a/served/styles/home.css
+++ b/served/styles/home.css
@@ -121,7 +121,7 @@ ul.thing-list {
 	}
 
 	#greeting p {
-		max-width: 25rem;
+		max-width: 26rem;
 	}
 
 	p#notice {
diff --git a/served/styles/post.css b/served/styles/post.css
index 946336f..f7111dd 100755
--- a/served/styles/post.css
+++ b/served/styles/post.css
@@ -1,5 +1,5 @@
 .sized {
-	--page-width: 34rem;
+	--page-width: 35rem;
 	max-width: var(--page-width);
 	margin: 0 auto;
 }
diff --git a/served/styles/writing.css b/served/styles/writing.css
new file mode 100644
index 0000000..527d434
--- /dev/null
+++ b/served/styles/writing.css
@@ -0,0 +1,77 @@
+.sized {
+	--page-width: 36rem;
+}
+
+body {
+	line-height: 1.6;
+}
+
+h1 {
+	line-height: 1;
+}
+
+h2,
+h3 {
+	line-height: 1;
+	margin-top: 2rem;
+}
+
+a {
+	color: var(--text-link);
+}
+
+a:visited {
+	color: var(--text-link-visited);
+}
+
+aside {
+	border: 1px dashed var(--text);
+	border-radius: 1rem;
+	padding: .25rem .5rem;
+	width: 90%;
+	margin: 1.25rem auto;
+}
+
+img {
+	display: block;
+	width: 100%;
+
+	margin: 1.25rem auto;
+}
+
+code {
+	font-size: 1rem;
+}
+
+details {
+	position: relative;
+	padding: 0.5rem 1rem;
+	width: 80%;
+	margin: 1.25rem auto;
+}
+
+details::before {
+	content: '';
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 2rem;
+	height: 1rem;
+	border-width: 1px 0 0 1px;
+	border-color: var(--text);
+	border-style: solid;
+	z-index: -1;
+}
+
+details::after {
+	content: '';
+	position: absolute;
+	bottom: 0;
+	right: 0;
+	width: 2rem;
+	height: 1rem;
+	border-width: 0 1px 1px 0;
+	border-color: var(--text);
+	border-style: solid;
+	z-index: -1;
+}
\ No newline at end of file
diff --git a/served/words/a-really-long-week.html b/served/words/a-really-long-week.html
new file mode 100644
index 0000000..74bceb6
--- /dev/null
+++ b/served/words/a-really-long-week.html
@@ -0,0 +1,103 @@
+---
+template=post
+title=A Really Long Week
+style=/styles/post.css
+style=writing.css
+
+published=2024-11-13 7:24pm CST
+
+description=What I've done the last 116 days.
+art=images/a-really-long-week.gif
+art_alt=A squirrel standing in leaves. The image only has 19 colours and looks slightly unreal.
+---
+
+<div style="min-height: 25vh; text-align: center; display: flex; justify-content: center;">
+	<p style="display: inline-block; align-self: center; font-style: italic;">space intentionally left blank</p>
+</div>
+
+It has been 116 days since I last wrote a weeknote.<br />(<a href="/words/weeknotes/what.html">weeknotes/what.html</a>)
+
+I like weeknotes. You get little slices of people throughout the year. Get to
+learn a bit about them: what they do, how they write. It's nice.
+
+I meant to be writing weeknotes. I want to! It's hard. But I can do hard things.
+I think I can, anyway. I am learning to do hard things.
+
+Here's what has happened, roughly, in the last 116 days:
+
+I bought a guitar from a garage sale for $75 in what I describe as an
+"unhinged moment". I like the guitar, it is fun! I have not practiced very much
+recently but promise to get back to it. Sometime before the end of the year I
+will post a little audio clip of me plucking out a tune.
+
+<hr />
+
+I started having heart issues, maybe. Well, I had those more than 116 days ago,
+but only just. Since then I have started taking a beta blocker, been to the
+emergency room a few more times, and been anxious almost the entire time. It's
+not very fun, but a lot of dangerous things have been ruled out so it is likely
+I am fine.
+
+<hr />
+
+I switched to estradiol valerate injections from the sublingual tablets. I feel
+overall more mentally stable. It's a lot harder to miss an injection than a
+twice-a-day tablet. This is really good for me; we love this.
+
+<hr />
+
+Cohost shut down. It went read only 73 days after I wrote my last weeknote. It
+was very nice being there and I will miss it. I am slowly reposting things I
+put there, a selection of them, to <a href="/cohost">/cohost</a>. I am trying
+to do it carefully and with purpose, as I care about these things.
+
+<hr />
+
+<img src="images/a-really-long-week.gif"
+	alt="A squirrel standing in leaves. The image only has 19 colours and looks slightly unreal."
+	style="width: 100%;" />
+
+<hr style="margin-top: 0;" />
+
+I've been working on an old project called NailyDumber back then
+<i>(daily number, first letter swapped)</i>, but just called numbers now. It's a
+little betting/gambling game with not-real money, of course, called beans. I am
+conflicted as I do not like gambling, but I wanted to make it nonetheless. It
+will hopefully be fun to play. I will try to get it running by the end of the
+year, but I am not very good at deadlines.
+
+I feel like I am good at programming again when I work on this in a way I have
+not in awhile. Perhaps it's the rapid progress or perhaps I have shed some
+imposter syndrome since I last did any large programming things, which was
+many months ago now.
+
+<hr />
+
+I got a quilt a few days ago. Nothing fancy, just a thing from the supermarket,
+but it is a nice autumn orange and it is warm and I like to lay under it.
+
+<hr />
+
+A friend invited me to a friendsgiving at the end of November and it's so cute
+I might cry. I am disused to knowing people in the physical world and I am very
+excited. He just got a new dog and I am so, so excited to pet the good boy.
+
+<hr />
+
+It's fall. A few days ago I woke up well. It was nice. I walked outside and the
+air was pleasantly cool. It was bright and I was smiling. I went and got coffee
+where my sister works, decaf because caffeine gives me palpitations now I guess,
+and I came home and cracked my window open and worked on numbers. I had a good
+time; I enjoyed it. But I think it would've been nice to walk around a little
+more.
+
+I am slightly afraid of where I live now. Not for any good reason, I think, or
+any reason really at all. Nothing has happened to make me uneasy. It's more or
+less just how I am. I will get over this and I will start walking again.
+
+On November 5th I wrote this in my notebook:<br />
+<blockquote>
+	I want to be genuine in the face of the world&mdash;confident and happy and beautiful and real.
+</blockquote>
+
+Thank you for reading; I love you. I hope you love yourself.
\ No newline at end of file
diff --git a/served/words/alternate-ifc-formatting.html b/served/words/alternate-ifc-formatting.html
deleted file mode 100755
index 41f19bf..0000000
--- a/served/words/alternate-ifc-formatting.html
+++ /dev/null
@@ -1,28 +0,0 @@
----
-template=post
-title=Alternate IFC Formatting
-style=/styles/post.css
-style=writing.css
-
-published=2024-07-20 AHH TODO DATE
----
-
-I really like weird date formats. The kind of stand-out alternate date format
-in my mind is <a href="https://wiki.xxiivv.com/site/arvelie.html">Arvelie</a>
-devised by Devine Lu Linvega.
-
-Arvelie splits the year into 26 months of 14 days each.
-
----
-
-Arvelie splits the year into 26 months of 14 days each. The year is "when you start journaling"
-which I really, very much like. It makes it a kind of relative calendar to whatever you want.
-It makes it feel a little more personal, I think.
-
-Each Arvelie month is a character in the alphabet. The year and day are zero-indexed
-which means, if you started journaling in 2020, January 5rd of 2023 is 02A04.
-
-If you've done the math, 26 * 14, you'll notice there's a day missing&mdash;or
-even two for leap years! Arvelie handles this rather elegantly. The Year Day, the
-last day of the year, is notated with <code>01</code>. So, with the same start year,
-if it was December 31st, 2032, the date would be written was <code>12+01</code>.
\ No newline at end of file
diff --git a/served/words/debugging-my-sql-query.html b/served/words/debugging-my-sql-query.html
new file mode 100644
index 0000000..e9f5643
--- /dev/null
+++ b/served/words/debugging-my-sql-query.html
@@ -0,0 +1,82 @@
+---
+template=post
+title=Debugging My SQL Query
+style=/styles/post.css
+style=writing.css
+
+published=2024-11-13 7:24pm
+
+description=Tiny retelling about debugging a weird SQL problem.
+art=images/awoo.png
+art_alt=Some("no such table: awoo")
+---
+
+working on a project i call naily <i>(or just "numbers")</i> and i had an sql problem :(
+
+i was trying to load a page that ran an sql query. it was this:
+
+<pre><code>SELECT creation_date, state, game, result
+FROM double_dodge
+WHERE player_id = ?1 AND state = ?2;</code></pre>
+
+the error in my terminal read: <code>no such column: creation_date</code>.
+so i went and looked at my create table. it looked fine! the relevant bits:
+
+<pre><code>CREATE TABLE IF NOT EXISTS double_dodge (
+	...,
+	creation_date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
+	...,
+);</code></pre>
+
+so i tried not selecting the <code>creation_date</code> column, but then it got mad at me about
+the <code>state</code> column. i can assure you that <code>state</code>, too, was a real column.
+
+i opened the database in sqlite3. like this, <code>sqlite3 onl.db</code>. after trying to do
+<code>\d double_dodge</code> and it telling me that it didn't know what <code>\</code> meant,
+i ran <code>.help</code> like it suggested i did.
+
+haha, no i didn't. i went to google and searched, apparently, "sqlite cli" which pulled up the
+<a href="https://sqlite.org/cli.html">Command Line Shell For SQLite</a> page. i scrolled for a
+few dozen seconds and saw <code>.schema</code> which looked promising.
+<pre><code>sqlite> sqlite> .schema double_dodge
+CREATE TABLE double_dodge (
+	(lines redacted for brevity)
+	creation_date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,</code></pre>
+
+see, it <i>is</i> real. i'm not loosing it. well, i might be.
+
+next i tried to not run that sql query at all until there was data in it. would that matter? i
+didn't know, i'd never used sqlite before, but i thought it wouldn't matter. mostly because that
+wouldn't make sense for it too, but also because i did something greatly similar elsewhere in
+the project.
+
+i commented the code out and was able to use the webpage to put data into the table without issue.
+more evidence it was real.
+
+i then uncommented the code and it started to panic again. and it was still poisoning the mutex that
+held my database connection <i>(not great probably, the mutex, but)</i>.
+
+does it just say that if it doesn't think the table is real? surely the table is real. we have so
+much evidence it is. i changed the table name.
+<pre><code>SELECT creation_date, state, game, result FROM awoo;</code></pre>
+
+<pre><code>Some("no such table: awoo")</code></pre>
+
+okay, so it knows the table is real. it just doesn't think any of the columns are real.
+i tried removing my where clause.
+
+aha! it ran.
+
+what's wrong with my where clause? let's look at it again
+<pre><code>SELECT creation_date, state, game, result FROM double_dodge WHERE player_id = ?1 AND state = ?2</code></pre>
+
+those are all columns that exist, even if sqlite does not believe me. oh, i'm not selecting
+<code>player_id</code>. that's probably not good.
+
+<pre><code>SELECT player_id, creation_date, state, game, result FROM double_dodge WHERE player_id = ?1 AND state = ?2;</code></pre>
+
+<b><i>success :)</i></b>
+
+i am normally good about remembering to select what i where, but i forgot this time.
+i wish it gave me an error that made sense, though, as the where was for
+<code>player_id</code> which was not anything it was telling me about.
\ No newline at end of file
diff --git a/served/words/weeknotes/2024/48.html b/served/words/weeknotes/2024/48.html
new file mode 100644
index 0000000..d4bc4ac
--- /dev/null
+++ b/served/words/weeknotes/2024/48.html
@@ -0,0 +1,44 @@
+---
+template=post
+title=Week 48; Walking
+style=/styles/post.css
+style=writing.css
+
+published=2024-11-13 7:24pm CST
+
+description=My car broke down and I walked some.
+art=../../images/nov23-geohash-moss.gif
+art_alt=moss growing on a log. The image has only 32 colours. The green of the moss really pops out at you.
+---
+
+It's been 18 days since the last weeknote.
+
+This time-period has been pretty alright, minus the car trouble. Thus is
+car ownership, I guess.
+
+I got a nearby geohash (<a href="https://geohashing.site">geohashing.site</a>)
+on the 23rd. It was in the midst of a forest preserve hiding in brush and grasses
+under a grand, old tree. I bet it looks stunning in the summer and fall. Perhaps
+there'll be a trek back there in four or five months.
+
+It was a very nice walk. After I got the point, I walked down an old-and-overgrown
+path and came upon an old, now-decommissioned <abbr title="United States Geological Survey">USGS</abbr>
+water level measuring thing. I couldn't find it on their map of water-level-measuring-things
+<i>(that's the official name)</i>, and it looked like decommissioned sites were mapped, so
+I emailed them.
+
+They provided me with the number identifying the USGS No. 05527910 as well as the time
+it was active. Then I went down
+
+<hr />
+
+In 1957 North Mill Creek was dammed by the then property owner creating a large lake
+which was named after him: Ramussen Lake. Mister Ramussen passed in 1986 which let
+the Lake County Forest Preserve to purchase it in 2001.
+
+USGS No. 05527910 was active from 2007 until 2019.
+
+It monitors North Mill Creek, which seems
+to be runoff from the Elmwood Farm Lake <i>(called the Ramussen Pond on one GIS map i looked at,
+	potentially in honour of the farm owner who passed in 1986 at the age of 78).</i> This
+lake-pond with a contested name is apparently artificial; it was formed when
\ No newline at end of file
diff --git a/served/words/weeknotes/what.html b/served/words/weeknotes/what.html
index b28a413..7d0f1a4 100755
--- a/served/words/weeknotes/what.html
+++ b/served/words/weeknotes/what.html
@@ -24,26 +24,4 @@ or about stuff that happened at work: a weeknote can be whatever you want it to
 
 a lot of people, myself included, like to use weeknotes to keep track of what
 they're doing. to keep a record and to remember that, yes, you <i>do</i> do things
-no matter how loud your brain is yelling right now.
-
-<h2>the weird dates in my weeknotes</h2>
-
-i like weird date formats, a lot!, so i am using the International Fixed Calendar
-(IFC) to note my weeks. It's pretty easy to understand, but not too easy to convert
-between IFC and the Gregorian Calendar.
-
-The rundown is:<br />
-Every month is 28 days. There is an extra month after June called Sol. The last
-day of the year is extra. It's called the Year Day and it's not part of any week
-but it <i>is</i> December 29th.
-
-During leap years there is a day after June and before Sol: June 29th. It's the
-Leap Day and also does not belong to a week.
-
-\<i>(read about <a href="https://en.wikipedia.org/wiki/International_Fixed_Calendar">IFC on wikipedia</a>)</i>
-
-Since I week-a-note every two, I name the first weeknote "early" and the last two
-"late". So, in rhythm, it'll be something like: Early June, Late June, Early Sol,
-Late Sol, etc.
-
-That's it for <i>What? Weeknotes.</i>. Go read'm? They're listed in <a href="../">words/</a>
\ No newline at end of file
+no matter how loud your brain is yelling right now.
\ No newline at end of file
diff --git a/served/words/words.css b/served/words/words.css
index 90a888b..abe4ee5 100755
--- a/served/words/words.css
+++ b/served/words/words.css
@@ -14,7 +14,8 @@ div {
 	grid-column: 1 / 2;
 }
 
-#weeknotes-list {
+#weeknotes-list,
+.wk-list {
 	padding: 0;
 	margin: 0;
 	display: flex;
@@ -31,12 +32,15 @@ div {
 }
 
 #weeknotes-ifc {
-	padding: 0;
-	margin: 0.25rem 0 0.75rem 0;
+	padding: 0.75rem 0;
+	margin: 0.75rem 0 0.75rem 0;
 	display: grid;
 	grid-template-columns: min-content 1fr 1fr;
 	column-gap: 1rem;
 	list-style: none;
+	border-style: solid;
+	border-color: var(--text-dim);
+	border-width: 1px 0 1px 0;
 }
 
 #weeknotes-early-only {
diff --git a/served/words/words.html b/served/words/words.html
index 76de6f9..587d021 100755
--- a/served/words/words.html
+++ b/served/words/words.html
@@ -16,6 +16,14 @@ The writing is part of the website <a href="/atom.xml">Atom Feed</a>.
 	<section id="weeknotes-section">
 		<h2 id="weeknotes">weeknotes</h2>
 		<h3 id="what-weeknotes"><a href="weeknotes/what.html">what?</a></h3>
+		<ul class="wk-list">
+			<li><a href="weeknotes/48.html">48</a></li>
+			<li class="miss">47</li>
+			<li><a href="a-really-long-week.html">a really long week</a></li>
+			<li class="miss">45</li>
+			<li class="miss">44</li>
+			<li>nov</li>
+		</ul>
 		<ul id="weeknotes-ifc">
 			<li>sol</li>
 			<li class="month"><a href="weeknotes/2024/sol.html">complete</a></li>
@@ -46,6 +54,7 @@ The writing is part of the website <a href="/atom.xml">Atom Feed</a>.
 
 	<section id="written">
 		<h2>technical writings;<br>project updates</h2>
-		<a href="akkoma-postgres-migration.html">Akkoma Postgres Migration</a>
+		<!--<a href="akkoma-postgres-migration.html">Akkoma Postgres Migration</a>-->
+		<a href="debugging-my-sql-query.html">Debugging My SQL Query</a>
 	</section>
 </div>
\ No newline at end of file
diff --git a/served/words/writing.css b/served/words/writing.css
index fbc5050..6983ccc 100755
--- a/served/words/writing.css
+++ b/served/words/writing.css
@@ -22,6 +22,12 @@ code {
 	background-color: var(--background-dim);
 }
 
+pre code {
+	display: block;
+	background-color: var(--background-dim);
+	overflow-x: scroll;
+}
+
 details.tldr {
 	width: 100%;
 	margin: 1rem auto;
diff --git a/support/atom_new copy.conf b/support/atom_new copy.conf
new file mode 100644
index 0000000..0182f25
--- /dev/null
+++ b/support/atom_new copy.conf
@@ -0,0 +1,28 @@
+Template ../support/atom.xml
+
+Feed sitewide
+	Output atom.xml
+
+	Link https://nyble.dev/atom.xml
+	Id https://nyble.dev/atom.xml
+
+	Title gennyble's website board
+	Subtitle Entire site feed: writing; weeknotes; scrap; art
+	Updated 2024-04-13T11:38
+	Author
+		Name gennyble
+		Email gen@nyble.dev
+
+	Entry words/akkoma-postgres-migration.html
+
+	Entry words/weeknotes/2024/14.html
+
+	Entry words/weeknotes/2024/15.html
+
+	Entry words/weeknotes/2024/17.html
+
+	Entry words/weeknotes/2024/20.html
+
+	Entry words/weeknotes/what.html
+
+	Entry words/weeknotes/2024/sol.html
diff --git a/support/atom_new.conf b/support/atom_new.conf
new file mode 100644
index 0000000..31161ce
--- /dev/null
+++ b/support/atom_new.conf
@@ -0,0 +1,28 @@
+Template ../support/atom.xml
+
+Feed sitewide
+	Output atom.xml
+
+	Link https://nyble.dev/atom.xml
+	Id https://nyble.dev/atom.xml
+
+	Title gennyble's website board
+	Subtitle Entire site feed: writing; weeknotes; scrap; art
+	Updated 2024-09-14 05:43
+	Author
+		Name gennyble
+		Email gen@nyble.dev
+
+	Entry words/akkoma-postgres-migration.html
+
+	Entry words/weeknotes/2024/14.html
+
+	Entry words/weeknotes/2024/15.html
+
+	Entry words/weeknotes/2024/17.html
+
+	Entry words/weeknotes/2024/20.html
+
+	Entry words/weeknotes/what.html
+
+	Entry words/weeknotes/2024/sol.html