Compare commits

..

64 Commits
main ... main

Author SHA1 Message Date
nat
d57e14101c add thought; fix figure css 2025-03-25 19:31:31 -07:00
gnat
9f3a6984e4 add homepage statement 2025-02-18 12:11:19 -08:00
gnat
2dff6ab8d4 Merge branch 'main' of https://git.natalieee.net/nat/webbed-site 2025-02-01 14:57:42 -08:00
gnat
1ff5f94bd6 add misty's 88x31; update syntax highlighting styles 2025-02-01 14:56:04 -08:00
gnat
1deaac37cf update syntax highlighting to include classes for html 2025-01-11 20:26:52 -08:00
gnat
3b901e297d add servfail.network 88x31 2024-12-04 03:40:49 -08:00
gnat
28e837cf6a fix unclosed metadata comment in thought 2024-11-29 01:25:05 -08:00
gnat
46c24d03c8 add script to add 88x31s of all fedi accounts it follows that implement .well-known/button.json 2024-11-25 01:20:14 -08:00
gnat
37fe11059a add 88x31s of sites from things it follows on mastodon 2024-11-24 23:59:55 -08:00
gnat
613c53dee6 add .well-known/button.json 2024-11-20 14:40:11 -08:00
gnat
7c22b4aba8 update changelog 2024-11-13 16:27:50 -08:00
gnat
304789af94 add regular png 88x31 2024-11-12 02:34:59 -08:00
gnat
83aca8b85b add thought 2024-11-05 15:24:31 -08:00
gnat
165cf69bcb amend category tag on last thought 2024-11-03 02:20:26 -08:00
gnat
8e69079b74 (finally) add thought 2024-11-03 02:18:52 -08:00
gnat
42834bdfd1 block ai scrapers in robots.txt 2024-11-03 01:58:51 -08:00
gnat
ed878fe922 improve accessibility, vaguely 2024-11-01 14:03:01 -07:00
gnat
f6a8c62104 get around to adding its vcard 2024-10-30 04:51:47 -07:00
gnat
61bc2a0ad1 minor css changes 2024-10-30 03:51:42 -07:00
gnat
3a05b09a3b 'replace \' with " in category names 2024-10-26 04:09:27 -07:00
gnat
30db8e3920 update thought metadata 2024-10-26 03:53:03 -07:00
gnat
d31af30ec3 fix formatting error in last thought 2024-10-25 00:50:30 -07:00
gnat
0ce6cf4d6c add thought 2024-10-25 00:37:26 -07:00
gnat
69870de6ec add style for blockquotes; add thought 2024-10-23 10:44:35 -07:00
gnat
d8b6d38414 add thought 2024-10-21 05:50:24 -07:00
gnat
cc0cab843a missed one 2024-10-21 04:59:50 -07:00
gnat
803c95892b update changelog 2024-10-20 22:05:59 -07:00
gnat
2514ede93c update site-info 2024-10-20 00:31:24 -07:00
gnat
553436b27c remove name 2024-10-19 22:18:45 -07:00
gnat
4db86fd144 add thought 2024-10-19 01:06:45 -07:00
nat
507f7d6d2f Merge pull request 'update gramatical personhood of its pronouns to match its internal monologue' (#4) from 3pp into main 2024-10-08 21:42:11 -07:00
gnat
6290968666 missed a few 2024-10-08 20:48:20 -07:00
gnat
38437203d7 initial 2024-10-08 17:35:24 -07:00
gnat
3ac80c39c8 update changelog; add thought 2024-10-06 23:48:45 -07:00
gnat
d66d449d60 add optional name argument to make-link script 2024-10-06 06:13:48 -07:00
gnat
a6e4056d57 add natalie sighting; update natalie-info.html 2024-10-04 23:26:14 -07:00
gnat
1895e0aca3 fix thing cinnabar was complaining about 2024-10-01 19:56:21 -07:00
gnat
e64df089f6 add natalie sighting 2024-09-27 21:49:31 -07:00
gnat
7b7273c0fe fix footnote formatting 2024-09-20 05:23:06 -07:00
gnat
a3c35fc2af add thought 2024-09-20 05:20:28 -07:00
gnat
dcc2d8f67f update changelog 2024-09-14 04:38:08 -07:00
gnat
48fd08dad7 add support for footnotes 2024-09-14 03:49:33 -07:00
gnat
6cf11513d6 restore blanchard.html 2024-09-14 02:23:42 -07:00
gnat
00fcf81381 Merge branch 'main' of https://git.natalieee.net/nat/webbed-site 2024-09-12 10:00:47 -07:00
gnat
a2323f29e4 add thought; update css to support syntax highlighting 2024-09-12 09:58:20 -07:00
nat
5cfe217bba add files my friend requests the presence of to .gitignore 2024-09-12 05:18:21 -07:00
gnat
941449bb61 add thought 2024-09-10 20:14:16 -07:00
gnat
004ffdcc32 add thought 2024-09-07 11:42:06 -07:00
gnat
4e2ac44296 add license 2024-09-07 11:31:17 -07:00
gnat
c02f19b5aa add thought; add statements 2024-09-07 06:17:48 -07:00
gnat
2d0c930566 add thought 2024-09-07 00:19:13 -07:00
gnat
193c2a75c7 oops I didn't add media for the thought 2024-09-05 05:58:30 -07:00
gnat
3c6632b650 add thought 2024-09-05 05:55:46 -07:00
gnat
6b2b902499 update changelog to reflect htmlgen commit 2024-09-05 05:15:14 -07:00
gnat
49c82d40bb add homepage statements 2024-09-03 05:23:55 -07:00
gnat
99d538b9e0 add thought 2024-09-03 04:37:51 -07:00
gnat
f00495e1de fix error in thought 2024-09-03 04:05:39 -07:00
gnat
7a5830a6ef add thought, update css 2024-09-03 04:05:13 -07:00
gnat
90664163a0 switch to htmlgen for content creation 2024-09-01 15:07:27 -07:00
gnat
9e1f368742 prepare for migration to using htmlgen for html 2024-09-01 14:49:50 -07:00
gnat
3eec270fe0 oops, I forgot to add this thought when I wrote it 2024-09-01 13:58:01 -07:00
gnat
334274ef66 fix home.html not having the correct links 2024-08-29 21:55:29 -07:00
gnat
1c513e135c fix responsiveness issue in home.html 2024-08-27 21:43:04 -07:00
gnat
ce810b69e5 test html compiled from lisp 2024-08-27 20:47:00 -07:00
91 changed files with 1386 additions and 14418 deletions

8
.gitignore vendored
View File

@ -5,3 +5,11 @@ graph*
__pycache__/ __pycache__/
files/stats/song files/stats/song
files/home_visit_counter files/home_visit_counter
files/puppygirl.systems-uptime*
home.html
dir_index.html
html/*
!html/thoughts/
!html/blog
!html/blanchard.html

13
.well-known/button.json Normal file
View File

@ -0,0 +1,13 @@
{
"$schema": "https://codeberg.org/LunarEclipse/well-known-button/raw/branch/main/drafts/button-2024-06.schema.json",
"default": "natalieee.net",
"buttons": [
{
"id": "natalieee.net",
"uri": "https://natalieee.net/files/natalieee.net.png",
"alt": "natalieee.net 88x31",
"link": "https://natalieee.net",
"sha256": "1ff45434606ed76769bcc0b4f5a6bb8f86e9e1ab07550a48eb6977b3cf285963"
}
]
}

View File

@ -1,25 +1,25 @@
2024-02-18: Cleaned up header css, added changelog. 2024-02-18: cleaned up header css, added changelog.
2024-02-24: Made dir_index.html slightly less cursed server side 2024-02-24: made dir_index.html slightly less cursed server side
2024-04-10: Fix albert hacking my website by rewriting the entire backend (lol) 2024-04-10: fix unnamed friend entity hacking its website by rewriting the entire backend (lol)
2024-04-12: Add "natalie-sightings.html" 2024-04-12: add "natalie-sightings.html"
2024-04-14: Add "cool-sites.html", update home.html to actually be html compliant, updated comment system, add 88x31 collection, minor modification to "natalie-info.html". 2024-04-14: add "cool-sites.html", update home.html to actually be html compliant, updated comment system, add 88x31 collection, minor modification to "natalie-info.html".
2024-04-25: Move hosting to server taken from school basement, (somewhat notable) 2024-04-25: move hosting to server taken from school basement, (somewhat notable)
2024-04-26: Updated server-migration.html, site-info.html. 2024-04-26: updated server-migration.html, site-info.html.
2024-05-03: Added link to blog page in home.html, added random statement to home page upon each load 2024-05-03: added link to blog page in home.html, added random statement to home page upon each load
2024-05-11: Rewrote the webserver code, again. Fixed a few things in home.html. 2024-05-11: rewrote the webserver code, again. Fixed a few things in home.html.
2024-05-19: update theme to be in compliance with new laptop. depricate laptop page 2024-05-19: update theme to be in compliance with new laptop. depricate laptop page
2024-07-06: Now supports http and https. This creates a race condition in theory. Don't care 2024-07-06: now supports http and https. this creates a race condition in theory. don't care
2024-07-09: updated natalie-info.html at the request of cinnabar, who was annoyed at the small number of incorrect things 2024-07-09: updated natalie-info.html at the request of cinnabar, who was annoyed at the small number of incorrect things
2024-07-18: create & add header to all pages, changes to css so as to scale with vw 2024-07-18: create & add header to all pages, changes to css so as to scale with vw
2024-07-24: Append to list of interesting sights, add page complaining about discord 2024-07-24: append to list of interesting sights, add page complaining about discord
2024-07-24: add thoughts page in /html/, update natalie info page 2024-07-24: add thoughts page in /html/, update natalie info page
2024-07-24: updated wording in site-info.html, add /stats/ routes, update home.html to make filetree hidden by default because it is big 2024-07-24: updated wording in site-info.html, add /stats/ routes, update home.html to make filetree hidden by default because it is big
2024-07-25: rewrite css because winter told me to. Now has dark mode based on a media query. 2024-07-25: rewrite css because winter told it to. now has dark mode based on a media query.
2024-07-25: add subdomain proxying with nginx. 2024-07-25: add subdomain proxying with nginx.
2024-07-26: add <a href='https://git.natalieee.net'>git.natalieee.net</a> 2024-07-26: add <a href='https://git.natalieee.net'>git.natalieee.net</a>
2024-07-26: update site-info.html 2024-07-26: update site-info.html
2024-07-26: I have a dns server now. oops. there go my sleeping plans. email me if you want to use it for some insane reason. 2024-07-26: it has a dns server now. oops. there go its sleeping plans. email it if you want to use it for some insane reason.
2024-07-27: Update style on non blog posts 2024-07-27: update style on non blog posts
2024-07-27: modernize /html/site-info.html, finally 2024-07-27: modernize /html/site-info.html, finally
2024-07-27: improve image accessibility, update blog posts to be compliant with new style 2024-07-27: improve image accessibility, update blog posts to be compliant with new style
2024-07-28: add support for planned footer in all relevant html documents, simplify inclusion of other documents in a document using include script 2024-07-28: add support for planned footer in all relevant html documents, simplify inclusion of other documents in a document using include script
@ -29,4 +29,22 @@
2024-08-09: fix css issue on homepage 2024-08-09: fix css issue on homepage
2024-08-09: fix thoughts not displaying in correct order 2024-08-09: fix thoughts not displaying in correct order
2024-08-19: rewrite .*-info pages, add footer, update home.html, make all* images links 2024-08-19: rewrite .*-info pages, add footer, update home.html, make all* images links
2024-08-20: update my-laptop.html, create my-old-laptop.html 2024-08-20: update its-laptop.html, create its-old-laptop.html
2024-08-27: test new home.html compiled from lisp code.
2024-09-01: switch to <a href='https://git.natalieee.net/nat/htmlgen>htmlgen'>htmlgen</a> for content
2024-09-03: fix issue with changelog; update site-info.html; update style; add thought
2024-09-05: hopefully? fix issue with natalie-info.html, update home.html
2024-09-07: add additional random homepage statements
2024-09-07: add license, finally; edit site-info
2024-09-12: update style.css to support syntax highlighting
2024-09-14: add autolinking wikipedia style footnotes, update some pages
2024-09-27: add new natalie sighting
2024-10-03: add new natalie sighting
2024-10-04: update natalie-info.html
2024-10-04: update natalie-info.html again
2024-10-19: remove references to friends name until she picks a different one
2024-10-20: add <a href='https://status.natalieee.net'>status.natalieee.net</a>, running <a href='https://git.osmarks.net/osmarks/onstat'>osmarks status thingy</a>
2024-10-20: add <a href='/html/view-thought.html'>alternative thought viewing frontend</a>
2024-11-01: minor accessibility improvements to style.css; general minor changes
2024-11-13: add cryptography, technical specifications sections to natalie-info
2024-11-20: add /.well-known/button.json

View File

@ -0,0 +1 @@
<a href="https://999eagle.moe" id="⛧-440729"><img src="https://999eagle.moe/images/88x31/440729.png" alt="⛧-440729's button"></a>

View File

@ -1,2 +1,2 @@
<a href='https://bunbun.dev'><img src='data:image/gif;base64,R0lGODlhWAAfAPAAAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh/wtJbWFnZU1hZ2ljaw1nYW1tYT0wLjQ1NDU1ACH5BAAjAP8ALAAAAABYAB8AAAKphI+py+0Po5y02ouz3rz7D4biSJbmiabqOgWB5opxOGP1d3t5tXP99pMEM0Pbi3gEFS+u5rEWc86kz2RUqqAasABo8kF9ebvaMPlw5W7LbPTXMY5bxfPz2o7HX936d0POB3gnmCeHNRZBuDdYp/hl6NQn1EgZWMnIl3m200Tmx2AWSnnYhinKhaqVoOrZCekVKajK2rmmxoKbq7vL2+v7CxwsPExcbExSAAAh/wtJbWFnZU1hZ2ljaw1nYW1tYT0wLjQ1NDU1ACH5BAAjAP8ALAAAAABYAB8AAAKmhI+py+0Po5y02ouz3rz7D4biSJbmiabqOgWB5opxOGP1d3t5tXP99pMEM0Pbi3gEFS+u5rEWc86kz2RUqqAasABo8kF9ebvaMPlw5W7LbPTXMY5bxfPz2o7HX936d0POB3gnmCeHNRZBuDdYp/hl6NQn1EgZWMnIl3m200Tmx2AWSnnYhinKpQahtRYJ6dV6ubrqyVJre4ubq7vL2+v7CxwsPJxbAAA7' alt='bunbun.dev'></a> <a href='https://bunbun.dev'><img src='data:image/gif;base64,R0lGODlhWAAfAPAAAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh/wtJbWFnZU1hZ2ljaw1nYW1tYT0wLjQ1NDU1ACH5BAAjAP8ALAAAAABYAB8AAAKphI+py+0Po5y02ouz3rz7D4biSJbmiabqOgWB5opxOGP1d3t5tXP99pMEM0Pbi3gEFS+u5rEWc86kz2RUqqAasABo8kF9ebvaMPlw5W7LbPTXMY5bxfPz2o7HX936d0POB3gnmCeHNRZBuDdYp/hl6NQn1EgZWMnIl3m200Tmx2AWSnnYhinKhaqVoOrZCekVKajK2rmmxoKbq7vL2+v7CxwsPExcbExSAAAh/wtJbWFnZU1hZ2ljaw1nYW1tYT0wLjQ1NDU1ACH5BAAjAP8ALAAAAABYAB8AAAKmhI+py+0Po5y02ouz3rz7D4biSJbmiabqOgWB5opxOGP1d3t5tXP99pMEM0Pbi3gEFS+u5rEWc86kz2RUqqAasABo8kF9ebvaMPlw5W7LbPTXMY5bxfPz2o7HX936d0POB3gnmCeHNRZBuDdYp/hl6NQn1EgZWMnIl3m200Tmx2AWSnnYhinKpQahtRYJ6dV6ubrqyVJre4ubq7vL2+v7CxwsPJxbAAA7' alt='88x31 bunbun.dev'></a>

View File

@ -0,0 +1 @@
<a href="https://dimension.sh/~minekpo1/buttons.html#404" id="minekpo1//404"><img src="https://dimension.sh/~minekpo1/res/88x31-404.png" alt="404 Button not found button"></a>

View File

@ -0,0 +1 @@
<a href="https://girlthi.ng/~thermia" id="thermia"><img src="https://girlthi.ng/~thermia/img/88x31/thermia.gif" alt="thermias button"></a>

View File

@ -1 +1 @@
<a href='/status'><img src="data:image/png;base64, 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"></a> <a href='/status'><img src="data:image/png;base64, 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" alt='88x31 powered by lesbian'></a>

View File

@ -1 +1 @@
<a href='https://hellzone.org'><img src='https://hellzone.org/src/images/88x31.gif'></a> <a href='https://hellzone.org'><img src='https://hellzone.org/src/images/88x31.gif' alt='88x31 hellzone.org' width=88 height=31></a>

View File

@ -1 +1 @@
<a href='https://luxen.neocities.org/'><img src='https://luxen.neocities.org/88x31.gif'></a> <a href='https://luxen.neocities.org/'><img src='https://luxen.neocities.org/88x31.gif' alt='88x31 luxen.neocities.org' width=88 height=31></a>

View File

@ -0,0 +1,3 @@
<a href="https://lynx-library.neocities.org/">
<img src="data:image/gif;base64,R0lGODlhWAAfAAcAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQAGQAAACwAAAAAWAAfAIcAAAAAADMA AGYAAJkAAMwAAP8AKwAAKzMAK2YAK5kAK8wAK/8AVQAAVTMAVWYAVZkAVcwAVf8AgAAAgDMAgGYA gJkAgMwAgP8AqgAAqjMAqmYAqpkAqswAqv8A1QAA1TMA1WYA1ZkA1cwA1f8A/wAA/zMA/2YA/5kA /8wA//8zAAAzADMzAGYzAJkzAMwzAP8zKwAzKzMzK2YzK5kzK8wzK/8zVQAzVTMzVWYzVZkzVcwz Vf8zgAAzgDMzgGYzgJkzgMwzgP8zqgAzqjMzqmYzqpkzqswzqv8z1QAz1TMz1WYz1Zkz1cwz1f8z /wAz/zMz/2Yz/5kz/8wz//9mAABmADNmAGZmAJlmAMxmAP9mKwBmKzNmK2ZmK5lmK8xmK/9mVQBm VTNmVWZmVZlmVcxmVf9mgABmgDNmgGZmgJlmgMxmgP9mqgBmqjNmqmZmqplmqsxmqv9m1QBm1TNm 1WZm1Zlm1cxm1f9m/wBm/zNm/2Zm/5lm/8xm//+ZAACZADOZAGaZAJmZAMyZAP+ZKwCZKzOZK2aZ K5mZK8yZK/+ZVQCZVTOZVWaZVZmZVcyZVf+ZgACZgDOZgGaZgJmZgMyZgP+ZqgCZqjOZqmaZqpmZ qsyZqv+Z1QCZ1TOZ1WaZ1ZmZ1cyZ1f+Z/wCZ/zOZ/2aZ/5mZ/8yZ///MAADMADPMAGbMAJnMAMzM AP/MKwDMKzPMK2bMK5nMK8zMK//MVQDMVTPMVWbMVZnMVczMVf/MgADMgDPMgGbMgJnMgMzMgP/M qgDMqjPMqmbMqpnMqszMqv/M1QDM1TPM1WbM1ZnM1czM1f/M/wDM/zPM/2bM/5nM/8zM////AAD/ ADP/AGb/AJn/AMz/AP//KwD/KzP/K2b/K5n/K8z/K///VQD/VTP/VWb/VZn/Vcz/Vf//gAD/gDP/ gGb/gJn/gMz/gP//qgD/qjP/qmb/qpn/qsz/qv//1QD/1TP/1Wb/1Zn/1cz/1f///wD//zP//2b/ /5n//8z///8AAAAAAAAAAAAAAAAI/wABCBxIsKDBgwgTKlzIsGHBGAshOpxIseJCAxIRYrTIsWPF GBkPgjTgsaTJgys2IoyxAuTJlyZjTJokZuXMAzBzcpSZqeZBMTN9Tty3T2BRowCOIiU6UKlOAEBp IowqdehRpkmTKr1a1OlToJmGCSWIRlJQili1cr3a1OtXmpPQ/JwZF61TrEy7tn1KMCrYsVDNmq06 MGTBtFqNclWcNWdGNDT3iRlGU4wYNIzQWNZMGIDhw0TzLl66VadEoGL0SZ4UlrXrTK7FCvzM9ymj SURdz9xHd/drwLUdn4Y9UxJsTK8nmSXeszDt4CbFHNedqdck5IJZW2e0EHFo0WsJpv8NjbT8RKqw ezFXTlfLpAMw5MJIiDgx4656Ey/Gb76hGOPULTeJe5NAsw8MkwhE0xb0eTUeXvnldZ9ibk2lmXTF aQFbDAhmgqAWMMBABTT1ZGLWfAjV92BW5FEY3l7+TUKZbggmCMBMWsSwzzL7REMFDDHk2Jl4Dm6l l4T28WfkeTOZCJuGyakQDT0ABAAkSEQZB5xa4IHHGIts4fWlf5bdRhcM6g0Iwz5UzgZfAEnRMyR0 J4HF2okg1jNlNCqGtiWdHQmo246qffcdl5IBClNUsBnaJXl5/amoRVGFRo8YhiJqpKSTUgQUidDQ E40+lh0KGlGcdnoem9FYVg+olmEc6qhklqn60oU+xSoGd1DpGqutOTGSKrDEFgtdQAA7" alt="lynx-library.neocities.org 88x31" width="88" height="31" />
</a>

View File

@ -1 +1 @@
<a href='https://natalieee.net'><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAYAAABjyArgAAABb2lDQ1BpY2MAACiRdZG7S8NQFMa/PqRFKx10EHHIUB9DC0VBHKWCXapDW8GqS3KbtEKShpsUKa6Ci0PBQXTxNfgf6Cq4KgiCIog4OvtapMRzm0KLtCecnB/fPd/h5gTwZ3Rm2MEkYJgOz6ZT0mphTQq9IwwfgpSTMrOtpdxiHj3j55H6KB4SYlbvvq4xUFRtBvjCxLPM4g7xPHFmy7EE7xEPs7JcJD4hjnO6IPGt0BWP3wSXPP4SzPPZBcAvZkqlDlY6mJW5QTxFHDP0KmvdR3xJRDVXclRHKcdgI4s0UpCgoIpN6HCQoGrSzrr7kk3fMirkYfS2UAMnRwll8sZJrdJUlapGukqPjprY+/992trMtDc9kgL6Xl33cxwI7QONuuv+nrpu4wwIvADXZttfoT3NfZNeb2uxYyC6A1zetDXlALjaBUaeLZnLTSlA6dc04OMCGCwAQ/dA/7q3q9Y5zp+A/Db9ojvg8AiYoP7oxh+f12feK5ElyAAAAAlwSFlzAAALEgAACxIB0t1+/AAAApdJREFUaEPtWktOAzEMnSJOwYYFp0GITS9RCXXDgpsgJC7RDUKchgUbrlHwjFycjJMXx5OpWmakolL7+fPG4yRuV13X7X9fyzU9AysyeUl/Pr++pzf/jy3eXF8dsu8JXq4mDPSd4aKFaXkHrfYJi/BIbvU5tf56ve7o1YxgMvzx/lYVN7crhEfyKucNQE0quEGcgclTWjOCHqw9enEysU5Kvn3Y/JKyGS2gCJ+7ORKbIhnZ98qtxTNa5J5fXgMbFJBMht7Lx1OT02dsh3Rv7+4PNhE+lwBj6ebFdgnHsaTi88qt5JK+uouQhFAVymS0KteSJeOhnSE8C15LaLBJT4d+jWMJ4/fKrSSbtmlaBQytoOzy4ku8cGtK6XrlJTFIHRPBBNQqwOLUi0e+4hYX63vlyH8sNxMsDXj3o158KlmtNUldr9xCsolgWmQGUoa28Pd/6FLqxQukFc9+4qS0XUocH2M4Bq/cQizr0kBiL0nQFqz4M7lKUzWkFjnWiyvGiqdgkQ2ZvHYIkXivHBH99LjtVXa7XTciGIEXOWZAEgxPcjV9sgaDwy7XOLZ/GSkkmJRrzv01mHIKseax/XOERQTjdBaNFAOjXQR6vErP8qlZRO5WzDELmbsURsOeeFYgT2roLC+3bqlZBEowNwuZwz+KzyofVTA6aaGzvAwAbehTweZmIXP4t5KY0zcdNKZ0XGsLzRJq7bbCnRzBaJbQiqhau1mC0YJX69SLq209Xr81+IBgNGvQzvLxoigXOu0bjZogGYNmCZresb9eUo/KaFYQb+JTFZWaReRIts5C2JYWQ41/TwEwdplFTMFixoZpFtE4lrM33/dgXsz4xxJnn/WMCdIsgvpw/0O15ZqeAUns8ivL6fntfgARjrcUTOE2HQAAAA5lWElmTU0AKgAAAAgAAAAAAAAA0lOTAAAAAElFTkSuQmCC"/></a> <a href='https://natalieee.net'><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAYAAABjyArgAAABb2lDQ1BpY2MAACiRdZG7S8NQFMa/PqRFKx10EHHIUB9DC0VBHKWCXapDW8GqS3KbtEKShpsUKa6Ci0PBQXTxNfgf6Cq4KgiCIog4OvtapMRzm0KLtCecnB/fPd/h5gTwZ3Rm2MEkYJgOz6ZT0mphTQq9IwwfgpSTMrOtpdxiHj3j55H6KB4SYlbvvq4xUFRtBvjCxLPM4g7xPHFmy7EE7xEPs7JcJD4hjnO6IPGt0BWP3wSXPP4SzPPZBcAvZkqlDlY6mJW5QTxFHDP0KmvdR3xJRDVXclRHKcdgI4s0UpCgoIpN6HCQoGrSzrr7kk3fMirkYfS2UAMnRwll8sZJrdJUlapGukqPjprY+/992trMtDc9kgL6Xl33cxwI7QONuuv+nrpu4wwIvADXZttfoT3NfZNeb2uxYyC6A1zetDXlALjaBUaeLZnLTSlA6dc04OMCGCwAQ/dA/7q3q9Y5zp+A/Db9ojvg8AiYoP7oxh+f12feK5ElyAAAAAlwSFlzAAALEgAACxIB0t1+/AAAApdJREFUaEPtWktOAzEMnSJOwYYFp0GITS9RCXXDgpsgJC7RDUKchgUbrlHwjFycjJMXx5OpWmakolL7+fPG4yRuV13X7X9fyzU9AysyeUl/Pr++pzf/jy3eXF8dsu8JXq4mDPSd4aKFaXkHrfYJi/BIbvU5tf56ve7o1YxgMvzx/lYVN7crhEfyKucNQE0quEGcgclTWjOCHqw9enEysU5Kvn3Y/JKyGS2gCJ+7ORKbIhnZ98qtxTNa5J5fXgMbFJBMht7Lx1OT02dsh3Rv7+4PNhE+lwBj6ebFdgnHsaTi88qt5JK+uouQhFAVymS0KteSJeOhnSE8C15LaLBJT4d+jWMJ4/fKrSSbtmlaBQytoOzy4ku8cGtK6XrlJTFIHRPBBNQqwOLUi0e+4hYX63vlyH8sNxMsDXj3o158KlmtNUldr9xCsolgWmQGUoa28Pd/6FLqxQukFc9+4qS0XUocH2M4Bq/cQizr0kBiL0nQFqz4M7lKUzWkFjnWiyvGiqdgkQ2ZvHYIkXivHBH99LjtVXa7XTciGIEXOWZAEgxPcjV9sgaDwy7XOLZ/GSkkmJRrzv01mHIKseax/XOERQTjdBaNFAOjXQR6vErP8qlZRO5WzDELmbsURsOeeFYgT2roLC+3bqlZBEowNwuZwz+KzyofVTA6aaGzvAwAbehTweZmIXP4t5KY0zcdNKZ0XGsLzRJq7bbCnRzBaJbQiqhau1mC0YJX69SLq209Xr81+IBgNGvQzvLxoigXOu0bjZogGYNmCZresb9eUo/KaFYQb+JTFZWaReRIts5C2JYWQ41/TwEwdplFTMFixoZpFtE4lrM33/dgXsz4xxJnn/WMCdIsgvpw/0O15ZqeAUns8ivL6fntfgARjrcUTOE2HQAAAA5lWElmTU0AKgAAAAgAAAAAAAAA0lOTAAAAAElFTkSuQmCC" alt="88x31 natalieee.net"/></a>

View File

@ -0,0 +1 @@
<a href="https://beta.servfail.network"><img src="https://beta.servfail.network/servfail-88_31.png" alt="SERVFAIL DNS written on a 14 segment display. Next to it is a pentagram made out of burning servers."></a>

BIN
files/by-nc-sa.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1 +1 @@
I hate computers it hates computers

View File

@ -9,5 +9,5 @@
\ || || / \ || || /
\_oo__oo_/#######o \_oo__oo_/#######o
(portrait of Natalie[ee]) (portrait of Natalie[ee])
-- albert -- unnamed friend entity
</pre> </pre>

View File

@ -1 +1 @@
by viewing this website you agree to give me no less than two hundred dollars by viewing this website you agree to give natalie no less than two hundred dollars

View File

@ -1 +1 @@
by viewing this website, you agree to the <a href='https://en.wikipedia.org/wiki/Special:Random/Category'>terms & conditionss</a> by viewing this website, you agree to the <a href='https://en.wikipedia.org/wiki/Special:Random/Category'>terms & conditions</a>

View File

@ -0,0 +1 @@
nonfunctional webmistress

View File

@ -0,0 +1 @@
it should learn toki pona

View File

@ -0,0 +1 @@
reluctant and accursed fullstack developer

View File

@ -0,0 +1 @@
technical debt collector

View File

@ -0,0 +1 @@
queering the beep/boop binary

View File

@ -0,0 +1 @@
the embodyment of xkcd 1172

View File

@ -1 +1 @@
apparently I am like a ferret? apparently it is like a ferret?

View File

@ -1 +1 @@
so called "functional human" so called "functional entity"

View File

Before

Width:  |  Height:  |  Size: 208 KiB

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 KiB

View File

Before

Width:  |  Height:  |  Size: 377 KiB

After

Width:  |  Height:  |  Size: 377 KiB

BIN
files/natalieee.net.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

20
files/nrc.vcf Normal file
View File

@ -0,0 +1,20 @@
BEGIN:VCARD
VERSION:4.0
SOURCE:https://natalieee.net/files/natalie-roentgen-connolly.vcf
KIND:individual
FN:natalie roentgen connolly
N:connolly;natalie;roentgen
NICKNAME:nat,0x6e6174,▖▖▖▖▘▖▖▖▖▘▌▖▖▖▘,6e6174b8-4dcb-4323-b5ca-c217425e13a7
PHOTO:https://natalieee.net/files/vcard-photo-field.jpg
GENDER:N;preferrably not
X-PRONOUNS:it/its
TZ:Los Angeles/North America
LANG:en
BDAY:20070401
EMAIL;type=home:natalie@natalieee.net
URL:https://natalieeee.net
UID:urn:uuid:6e6174b8-4dcb-4323-b5ca-c217425e13a7
KEY:data:application/pgp-keys;base64,mDMEZyF+dhYJKwYBBAHaRw8BAQdAuh3EVhqODqs4DQasm/jUILG+4cNj0Q3Gb8SITEhqNNu0PW5hdGFsaWUgcm9lbnRnZW4gY29ubm9sbHkgKGJlZXAgYm9vcCkgPG5hdGFsaWVAbmF0YWxpZWVlLm5ldD6ImQQTFgoAQRYhBJo0/NsX3ToM9ZBiC6HD1we8+QjlBQJnIX52AhsDBQkDwmcABQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAAAoJEKHD1we8+Qjl0VYBAKrJtKM2bJj6hsU+kTt8HXxDNdCY37eSL6GxzQ4fGBqJAP9NuysVDyyFVL7HOkUa3XbNFkxgSNNfDSXnyXG1/JnZDrg4BGchfnYSCisGAQQBl1UBBQEBB0CebBBPcowxbCbOIAM9aJAe2kHbNZ4bIxZT7klRjf0+WgMBCAeIfgQYFgoAJhYhBJo0/NsX3ToM9ZBiC6HD1we8+QjlBQJnIX52AhsMBQkDwmcAAAoJEKHD1we8+QjldDoBAIj3f2uA6AWu08lWSBkEDKrzKMduShD/Pv8jvDyznHvHAP0VskOMQSFg9MBrwZ+7azZzgnCs2FSiZvHJW7HTo4v9Bw==
NOTE:beep boop
REV:2024-10-24T06:41:28.100Z
END:VCARD

View File

@ -1 +1 @@
<i style='font-family: MapleMonoItalic'>natalie</i>@2024-04-10_17:31:12-327<br>dammit albert<br><br> <i style='font-family: MapleMonoItalic'>natalie</i>@2024-04-10_17:31:12-327<br>dammit unnamed friend entity<br><br>

BIN
files/thought-issues.mp4 Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

BIN
files/vcard-photo-field.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

View File

@ -1,98 +0,0 @@
$[echo visit >> files/home_visit_counter]
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta property="og:title" content="Natalieee.net" />
<meta property="og:image" content="natalieee.net/files/natalieee.net.png" />
<style>
$[cat style.css]
/* appended to maintain html spec compliance while maintaining the consequences of albert's hack */
.rainbow-text {
animation:rainbow-text 5s ease-in-out infinite
}
@keyframes rainbow-text {
0% {
color:red
}
20% {
color:orange
}
40% {
color:green
}
60% {
color:blue
}
80% {
color:purple
}
to {
color:red
}
}
</style>
<title>Natalie website</title>
</head>
<body>
$[include html/header.html]
<main>
<section>
<p>
I'm Natalie[ee].<br>
$[find files/homepage-statements/* | shuf -n1 | xargs -I % cat %]<br>
I am not sure what I am going to use this site for, it only exists because I was <del>procrastinating my calculus homework</del> bored one day.<br>
Website homepage visit counter: $[cat files/home_visit_counter | wc -l]
</p>
<a href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fnatalieee.net%2F" class="88x31" rel="nofollow">
<img alt="W3C HTML5" src="/files/html5.png" width="88" height="31">
</a>
</section>
<section>
<h2>Particularly noteable pages</h2>
<a href='/html/site-info.html'>Information about this website</a>
<a href='/html/natalie-info.html'>Information about me</a>
<a href='/html/blog/index.html'>There is also a blog. I do not use it frequently.</a>
<a href='/html/random-thoughts.html'>There are also random natalie thoughts. sometimes they might be interesting</a>
<a href='/html/cool-sites.html'>other webloci</a>
</section>
<section>
<h2>Directories</h2>
<span>$[find -maxdepth 1 -type d | sed 1d | xargs -I% echo '<a href=%>%</a>' | sed 's/\.\///g' | grep -v pycache | grep -v .git]</span>
</section>
<section>
<h2>Changelog</h2>
<pre>$[cat changelog]</pre>
</section>
<section>
<h2>Site file tree</h2>
<details>
<summary>File tree hidden for brevity</summary>
$[tree . | sed 's/^\./site/; s/─/-/g; s/├/|/g; s/└/\\/g; s/│/|/g' | sed '1i\<pre>' | sed '$a\</pre>']
</details>
</section>
<section>
<h2>Autistic collection of 88x31s</h2>
<span>$[for file in ./files/88x31/*; do (file -i "$file" | grep -qE 'image/') && echo "<img src=\"$file\" width=\"88\" height=\"31\"/>" || cat "$file"; done | shuf]</span>
</section>
<section>
<h2>Post arbitrary data to my website to be displayed here</h2>
Yes, I do sanitize this. <a href='/html/albert-hack-1.html' ><del>(No you don't --sanitization tester)</del></a> Yes, I do.
</section>
<section class='ignore-section'>
<form action="#" method="post">
<label for="postText">post text: </label>
<input type="text" id="postText" name="text" required>
<label for="postName">username: </label>
<input type="text" id="postName" name="name" required>
<button type="submit">Submit</button>
</form>
<div>
$[ls -r ./files/posts-to-homepage/* | while read -r file; do echo "<div class=post>$(cat $file)</div>"; done ]
</div>
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,119 +0,0 @@
<html>
<head>
<title>Not a fan of IT</title>
<style>
$[cat style.css]
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>My school district's IT is mean :(</h1>
My school district has a very silly IT department. I am reasonably annoyed by this and have thus decided to tell whoever looks at my website about it.<br>
I-dont-like-IT.html was last modified on $[stat -c %y ./html/I-dont-like-IT.html | head -c 10].<hr>
</section>
<section>
<h2>"""Cuban malware""" incident</h2>
<p>
It is really going to sound like I am exaggerating or making things up here. I am not, PPS IT is really like this.
Last year, the school district accused me of installing what they claimed was "Cuban malware" that had been "used in attacks against the FBI and the LA school district" on a school laptop that I fixed for a teacher.
While it was technically against IT policy to repair the laptop, I could do it in 10 minutes (the battery connector had just popped out of the connector for it on the mainboard), whereas IT would have taken like a week through the power of beaurocracy.
I of course, did not install any malware on this computer, that would be mean. The fact that I did not install malware on that computer did not stop IT from persecuting me, nor did the fact that there were not in fact any viruses on the computer I repaired.<br>
This occurrence is primarily funny due to how they went about investigating me for whatever it was they thought I did.
</p><br>
<p>
I will provide an approximate list of events because&mdash;as mentioned on the natalie info page&mdash;I am really bad at writing.
<ul>
<li>Day one: I repaired the broken laptop. A friend of mine was present during this process</li>
<li><p>
Day two: I am pulled out of class by the IT employee local to my school.
She asks to see my laptop.
I schedule a shutdown for 30 seconds from the current time and hand it to her.
She just sort of blankly stares at it (???) for 30 seconds, observes it shut down, and just hands it back to me. (I have no idea why she wanted to see it, lmao. To be clear, she never touched any input device on it.)
I proceed to my next class, uninstall my ssd, and tape it to my thigh (I was somewhat worried they would later try to take my laptop).
I get called out of class by security and escorted to the dean's office.
She is on the phone with someone at the IT department who is vaguely in charge of cybersecurity.
Cybersecurity lady says the Cuban malware line, I am interviewed by her and the dean for some amount of time.
I am told to go back to class
</p>
</li>
<li>
<p>
Day three: I am called down to the office again, with a security escort (I am perhaps the least likely person to require a security escort).
Another interview occures, the IT security lady says lots of things that demonstrate a general misunderstanding of computers.
They also interview the friend that was present when I repaired the computer.
</p>
</li>
<li>
<p>
Day eighteen (after winter break):
I get called down to the deans office again.
The dean apologizes for the hassle and states that no evidence against me was found (shocking).
</p>
</li>
</ul>
Unfortunately, while Oregon is a two party consent state for recording conversations and I would never think to violate the law, this interaction occured before the dean failed to file the paperwork to keep the kid that sent me unwanted sexual messages and followed me home away from me.
While I would never think to record conversations with someone without their consent of course, failing to file paperwork that is arguably required for my safety and then denying the meeting in which one stated they would file paperwork is certainly the sort of thing that would prompt me to begin recording all conversations I had with someone, were I the type of person to break the law of course.<br>
I really wish I had a recording of the IT security lady saying the cuban malware line. alas.
</p>
</section>
<section>
<h2>Leaking the wifi creds</h2>
<p>
To be fair, this one is my fault.
For context, during the summer of 2022, the IT department set up a new secure network.
Previously, there was pps-wifi and pps-wifi-guest.
pps-wifi used boring old wpa2 and every student ever knew the password.
The new network, pps-wireless, used MSCHAPv2 PEAP certificate based authentication.
It should be noted that this took place before any negative interactions I had with IT.
I was aware that the IT department used to offer summer jobs/internships to students, and, given I am reasonably interested in enterprise networks, emailed some guy at the IT department inquiring about the way they were setting up their new network.
Rather rudely, in his response he stated he was disappointed in me (I am not sure why he said this).
This of course prompted the completely reasonable response of deciding I would gain unauthorized access to the new network out of spite.
I will not go in to detail about how this was achieved, but I will state that I genuinely actually seriously (this comes off as sarcastic maybe, I am actually being serious though.) did not commit any crimes in doing so.
I was successful in getting credentials to the network, of course.
</p>
<p>
Now, this year, I was following my standard practice of paying little attention in class and instead working on some random computer thing.
IT had, for whatever reason, blocked the documentation on zsh.
I thought this was stupid and dumb and out of sheer boredom posted the credentials for pps-wireless in a school discord server.
Should I have done this? No, it was fully stupid, but oh well.
Anyways, I got interviewed by the dean and cybersecurity lady from IT.
For whatever reason, the dean said the word "human" 9 times in the interview, 6 of these times were consecutively.
The dean also kept talking down to me, which is probably because I'm autistic or something so naturally I mustn't understand anything ever.
</p>
<p>
Now then, funny part: They decided to suspend me for one day, which like sure, whatever, I'm fine with that, I did break the rules and actions like that do generally have consequences.
They did not however revoke the network certificate I had used and posted. I have no idea why they did not do this and thus given my previous encounters with IT, I must assume incompetence.
If my understanding of their network is correct (which is reasonably likely), they would have very easily been able to revoke the leaked cert and issue a new one. No clue why they didn't.
Anyways, the important part is I received this email:
</p>
$[img-caption "/files/dean-email-why-it-matters.png" "Email to my parents from the dean of students where she blatantly lies"]
<p>
Problems with this email:<ul>
<li>The person the dean describes as the director of IT is not the director of IT.</li>
<li>"the password of PPS"</li>
<li>
<p>
Claiming that she is not trying to fearmonger whilst blatantly fearmongering.<br>
The IT department does not have a reasonable means of determining if someone is trying to find the personal information of transgender staff and students that I can conceive of, the dean is clearly making things up.<br>
The claim does not even make sense, the answer to does a school contain transgender students or staff is just "yes."<br>
She is almost certainly only mentioning anything to do with transgender people because I am transgender. This seems mildly inappropriate to me as she is either trying to guilt me with the fact that my actions could have harmed other transgender people or implying that I wish harm upon other transgender people.
</p>
</li>
</ul>
Ridiculous email, 10/10, made me laugh.<br><br>
</p>
</section>
<section>
<h2>Misc</h2>
<ul>
<li>Freshman year, I gained access to multiple staff member's credentials. Given that I am not a particularly malicious person and only did this out of boredom, I did not do anything bad with them and instead reported the means by which I got them to IT.
I will leave guessing whether or not they fixed the issue I exploited as an exercise for the reader.</li>
</ul>
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,32 +0,0 @@
<html>
<head>
<title>Albert</title>
<style>
$[cat style.css]
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>Friend hacked my website lol</h1>
<p>But how?</p>
</section>
<section>
<p>
Prior to me rewriting the backend of my website, there was a bug that would allow a bash command in a comment inside $[echo \$\[\]] and not containing &lt; or &rt; to be executed if you querried the url /html/%2e%2e/files/posts-to-homepage/{post file}.
This was due to any url beginning with '/html/' being unconditionally put through parse_file(), which generates static content from the embedded bash in the html (see <a href='/html/site-info.html'></a>).
In addition to this, the source code of the server could be attained via a similar method, requesting the path of the file, but with /files/ or /html/ in front of it, followed by %2e%2e.
</p>
<p>
Albert was able to exploit this by first getting the source code of the webserver via the second method discussed above, examining it, and deducing the first vulnerability mentioned above.
Upon discovering the RCE available via the comment untrusted command evaluation, they were able to add an ssh key to my server and thus gain a shell.
Amazingly, at the same time that they did this, my other friend's girlfriend (appearing in the comments as gexfan) was halfheartedly trying to mess with my site.
This ended with around 15 messages on discord telling me my site had been hacked, only around two of which were from albert.
</p>
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,29 +0,0 @@
<html>
<head>
<title>Subunit of the blogosphere</title>
<style>
$[cat style.css]
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>My subunit of the blogosphere</h1>
<p>I don't know if I will use this, but I am bored and thus making a blog system.</p>
</section>
<section>
<h2>Posts</h2>
<table>
<tbody><tr><th><p>Title</p></th><th><p>Editted</p></th><th><p>Posted</p></th><th><p>Size</p></th></tr>
<tr><th colspan="4"><hr></th></tr>
$[for file in $(ls html/blog/posts --time=creation); do echo "<tr><td><a href=\"/html/blog/posts/$file\">$file</a></td><td>$(stat -c %y "html/blog/posts/$file" | head -c 16)</td><td><p>$(stat -c %y html/blog/posts/$file | head -c 10)</p></td><td align=\"right\">$(numfmt --to=iec --suffix=B $(stat -c %s "html/blog/posts/$file"))</td></tr>"; done | sed 's/\/\//\//g']
<tr><th colspan="4"><hr></th></tr>
</tbody>
</table>
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,47 +0,0 @@
<html>
<head>
<style>
$[cat style.css]
.image-container {
column-count: 3;
}
.image-container img, .caption {
width: 60%;
}
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Belt sander maintenance</title>
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>I fixed cool equipment my school has</h1>
<p>That is neat, I guess. I should start using the blog feature of my site more.</p>
<hr>
<p>
My school has a big wide belt sander in the wood shop, it is fancy and has electronic controls and whatnot.
There are two contactors that control the movement of the table, one for up, one for down.
The contactor to move the table down has failed twice, once due to general lack of maintenance, and once because the person that replaced it the first time damaged the new contactor during the replacement.
Luckily, for whatever reason the person that replaced the contactor for whatever reason replaced both the up and down contactor, only one of which was bad.
Because of this there was a spare contactor that was good lying around somewhere in the wood shop, thus I was able to replace the damaged replacement contactor.
</p>
</section>
<section>
<flex-grid>
<flex-grid-item>
$[img-caption "/files/blog-files/pictures/kingwood-bad-contactor.jpg" "The damaged \"table down\" contactor in the kingwood belt sander."]
</flex-grid-item>
<flex-grid-item>
$[img-caption "/files/blog-files/pictures/natalie-kingwood.jpg" "Unexpected photograph of me my friend took while fixing the belt sander."]
</flex-grid-item>
<flex-grid-item>
$[img-caption "/files/blog-files/pictures/kingwood-wiring-mess.jpg" "Contactor spaghetti."]
</flex-grid-item>
</flex-grid>
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,32 +0,0 @@
<html>
<head>
<style>
$[cat style.css]
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>My Framework 16 arrived :)</title>
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>I got my Framework 16.</h1>
<p>
Her name is Lavinia, which is a stupid reference probably 2 people who see this website will get.
I love her so.
</p>
</section>
<section>
<p>
My website looks different now. Lavinia has a new colorscheme and thus so does my website.
$[img-caption "/files/fw16-new-colorscheme.png" "new colorscheme for my framework"]
Now (2024-07-06) it has a different colorscheme:
$[img-caption "/files/fw16-new-new-colorscheme.png" "new new colorscheme for my framework"]
I'm not going to update the website's colorscheme because I am lazy.<br>
as of 2024-07-27, I have made a media query that will use a dark colorscheme matching my laptop should you have a dark browser theme set.
</p>
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,19 +0,0 @@
<html>
<head>
<title>aoeu</title>
<style>
$[cat style.css]
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>Wowee! a blogpost</h1>
aoeu
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,45 +0,0 @@
<html>
<head>
<style>
$[cat style.css]
</style>
<title>Neat/odd/cool/relatively unknown/other adjective websites</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>Websites that I think are interesting or just odd, with varying obscurity and in no particular order</h1>
<ul>
<li><a href='https://eightyeightthirty.one/'>eightyeightthirty.one</a> A graph of website badges.</li>
<li><a href='http://lena.kiev.ua/'>lena.kiev.ua</a> Cool transgender ukranian lady who makes bathtub estrogen.</li>
<li><a href='https://www.webcoves.com/tgring.html'>transgendering</a> This one is interesting to explore.</li>
<li><a href='https://he.net/'>he.net</a> I don't remember how or why I found this, but its home page is sort of cool.</li>
<li><a href='https://ftp.cdc.gov/pub/GOODMAN/'>ftp.cdc.gov/pub/GOODMAN/</a> cdc saul goodman</li>
<li><a href='https://wiki.alquds.edu/?query=Main_Page'> wiki.alquds.edu/?query=Main_Page</a> Weird wikipedia mirror</li>
<li><a href='https://lhohq.info/'>lhohq.info</a> Who knows</li>
<li><a href='http://plaza.ufl.edu/virus86'>plaza.ufl.edu/virus86</a> A random UFL student's files sitting on some university server somewhere, for some reason.</li>
<li><a href='https://www.cs.arizona.edu/icon'>www.cs.arizona.edu/icon</a> A cool programming language.</li>
<li><a href='https://observatory.db.erau.edu/generators/signs/'>observatory.db.erau.edu/generators/signs/</a> Warning sign generator.</li>
<li><a href='https://adams.nrc.gov/wba/'>adams.nrc.gov/wba</a> Nuclear Regulatory Commission Agencywide Documents Access and Management System</li>
<li><a href='https://owd.tcnj.edu/~hofmann/'>owd.tcnj.edu/~hofmann</a> Random professor's homepage</li>
<li><a href='https://citrons.xyz'>citrons.xyz</a> This entity seems odd</li>
<li><a href='https://w3.pppl.gov'>w3.pppl.gov</a> I quite like the w3 subdomain of the princeton plasma physics laboratory.</li>
<li><a href='https://eda.gay'>eday.gay</a> She owns less thinkpads than I do. Brainwormed.</li>
<li><a href='https://www.yourworldoftext.com/apionet'>https://www.yourworldoftext.com/apionet</a> buzzzzzzzzzzzzzzzzzzz</li>
</ul>
This web page compelled me to put it somewhere:
<a href="https://citrons.xyz/a/memetic-apioform-page.html"><img src="https://citrons.xyz/a/static/apiopage.png"/></a>
</section>
<section>
<h1>entities I sometimes interact with physically</h1>
<span>winter: <a href='https://bunbun.dev'>bunbun.dev</a><a href='https://bunbun.dev'><img style='float: right' src='../files/88x31/bunbun.dev.gif'></a></span>
<span>odette: <a href='http://puppygirl.systems'>puppygirl.systems</a> Semi functional now</span>
<span>albert: <a href='https://iso-9995-9.com'>iso-9995-9.com</a> (down? dns issue maybe)</span>
<span>sam: <a href='https://hellzone.org'>hellzone.org</a><a href='https://hellzone.org'><img style='float: right' src='https://hellzone.org/src/images/88x31.gif'></a></span>
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,21 +0,0 @@
<html>
<head>
<title>Discord</title>
<style>
$[cat style.css]
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>Discord</h1>
As one who is not particularly partial to internet centralization, and seeing as I have had discord accounts get banned for seemingly nothing in the past, I am not particularly fond of using discord.
Unfortunately, humans that I like speaking to use discord in large enough volumes that it is likely to be rather challenging to convince all of the ones I particularly care about to migrate to some other platform.
This is not a very nice state of things.
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,4 +0,0 @@
<footer>
page rendered at $[date +%s]<br>
$[include ./files/88x31/natalieee.net.html]
</footer>

View File

@ -1,11 +0,0 @@
<header>
<nav>
<ul>
<li><h1>$[(for i in {0..10}; do echo Natalieee.net; done; echo Catalieee.net) | shuf -n1]</h1></li>
<li><a href='/'>home</a></li>
<li><a href='..'>back</a>
<li><a href='/html/site-info.html'>site info</a></li>
<li><a href='/html/natalie-info.html'>natalie info</a></li>
</ul>
</nav>
</header>

View File

@ -1,100 +0,0 @@
<html>
<head>
<title>laptop</title>
<style>
$[cat style.css]
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>my laptop is rather haunted</h1>
I am bad at using technology.<br>
this is not due to lack of technical ability, but instead due to the accumulation of unreasonable quirks over time in every computer I exert any degree of control over.
</section>
<section>
<h2>booting and the operating system</h2>
<p>
I do not use a bootloader.
instead, I have a custom kernel build based off the arch kernel with filesystem and compression drivers such that I can boot straight from my kernel.
I also do not have an initramfs.
</p>
<p>
technically, I don't use arch linux.
I use [a custom build of] the arch kernel and arch package repos, but actually run artix.
a function of this is that instead of systemd, I use openrc.
</p>
</section>
<section>
<h2>seat management and hardware issue mitigation</h2>
<p>
I once thought it would be entertaining to remove elogind from my system.
of course, I still needed it installed as a library, but disabling it was trivial.
it was replaced with seatd for seat management and acpid to suspend my computer when I close the lid.
this worked for a time, however after a couple months of this setup, elogind inexplicably began to be started by my init system.
I do not know how or why, I did not change anything, nor is there anything matching 'elogind' in /etc/init.d/.
this was bad because it would interfere with acpid.
</p>
<h3>the solution</h3>
<pre>
~ &lambda; cat /etc/acpi/lid.sh
#!/bin/sh
cat /proc/acpi/button/lid/LID0/state | grep open && (modprobe i2c_hid_acpi) || (
killall elogind-daemon
rmmod i2c_hid_acpi
(test -e /home/catalie/.should-power-off) && s2ram
) </pre>
<p>
I overcame this issue simply by attempting to kill elogind every time I close the lid of my computer.
</p>
<p>
you may wonder, why is it running rmmod i2c_hid_acpi every time it close its laptop's lid.
you see, the framework 16 has an issue in which the trackpad and keyboard are not properly barred from waking the computer from suspend while the lid is closed.
in addition to this, the screen can flex just enough to press a key or bump the trackpad.
this causes the laptop to wake in my bag and attempt to boil the contents of my backpack.
the keyboard waking the computer from suspend can be ammended by running
<pre>sudo acpitool -w | grep enabled | awk '{print $1}' | sed 's/\.//' | xargs -I{} sudo acpitool -W {}</pre>
however, the trackpad is not in the list of acpi wakeup devices for whatever reason.
thus, upon the lid being closed, I simply unload the kernel module the trackpad requires and load it again upon opening the lid.
</p>
</section>
<section>
<h2>environment</h2>
<p>
I use wayland, specifically hyprland.
this is unfortunate because it is bad software (this will be elaborated upon), but I like the special workspace system.
my status bar and notification system are written in gjs with ags. I resent this because it involves javascript, but oh well.
when libastal gets documentation, I will probably rewrite my ui in that.
my terminal emulator is my own build of st.
I have yet to find a good terminal that supports all the things I want for wayland, so xwayland it is.
</p>
</section>
<section>
<h2>keyboard</h2>
<p>
unlike my previous laptop, I had the option to buy this laptop such that it came with a blank keyboard.
in accordance with this, I have not sanded my keyboard.
the framework 16 keyboard runs qmk, this is very nice.
the keyboard firmware is now hardcoded to be dvorak instead of using a custom console and xkb map.
on one hand this is nice because it means I do not need to edit xkb files to remap caps lock to control, but on the other hand if I plug an external keyboard in to my laptop, it will be qwerty and I will have to load my xkb map or type in qwerty. I can probably type in qwerty.
I need to remember to finish my keyboard config at some point. also, I should make the button that breaks the keyboard until I remove it and put it back in harder to press.
</p>
</section>
<section>
<h2>irregular bugs</h2>
<ul>
<li>killing firefox kills my compositor what I would estimate to be 20% of the time</li>
<li>killing firefox causes my headphones to disconnect what I would estimate to be 40% of the time</li>
<li>no audio devices other than my headphones are recognized after boot until I run <pre>unfuck audio</pre></li>
<li>when displaying https://wiki.gnuradio.org/index.php/Embedded_Python_Block in any web browser, or a screenshot of this webpage fullscreen on my laptop in any wayland compositor, my screen starts flickering. it only occures with this page. unplugging my computer causes the flickering to reduce in frequency. this will not occur if my mouse pointer is not in the top 2/5ths of the screen.</li>
<li>closing my computer causes network manager to become inoperable. it does not crash, it just stops working.</li>
<li>closing my computer causes firefox to be unable to retrieve data regardless of if network manager is working</li>
<li>sometimes, pipewire ceases to function. this typically happens after several days of uptime</li>
</ul>
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,105 +0,0 @@
<html>
<head>
<title>laptop</title>
<style>
$[cat style.css]
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>DEPRECATED My laptop</h1>
<p>see <a href='/html/blog/posts/new-laptop.html'>blog post</a>
<p>
Currently, I am using a T530 that has been heavily modified.
I used to use a W530, but I fucked it up trying to get tianocore on it and haven't bothered fixing the bios on it yet.
I have preordered a Framework 16 because I am the definition of their target audience.
Since W530s and T530s are basically identical baring the mainboard, there is no external difference between my W530 and T530 because I just yoinked all the parts from the W530.<br>
my-laptop.html was last modified on $[stat -c %y ./html/my-laptop.html | head -c 10].<br>
</p>
</section>
<section>
<image-column-container>
<image-container>
<flex-column style='margin-right: 10px;'>
$[img-caption "/files/laptop-keyboard.png" "photograph of my laptops keyboard, which is blank because I sanded it."]
$[img-caption "/files/laptop-radio.jpg" "The software defined radio that goes in my laptop's disc drive."]
$[img-caption "/files/keybinds_graph.png" "Graph of my keybindings, they are hard to see"]
$[img-caption "/files/laptop-charger-barrel.jpg" "charger barrel size adapter sticking out the back of my laptop"]
</flex-column>
</image-container>
<text-column>
<p>I have put an unreasonable amount of time in to messing with my laptop and as such am equally unreasonably proud of it.<br></p>
<h3>Hardware modifications I have made to my laptop:</h3>
<p>
<ul>
<li>Installed an older model's keyboard</li>
<li>Sanded the keyboard such that it is blank.</li>
<li>Upgraded most of its parts.</li>
<li>Put an SDR in its disc drive</li>
<li>Replaced the charging barrel with a worst bodge ever contest finalist because I left my charger at school for a weekend once and wanted to use my laptop.</li>
</ul>
Additionally, I have written a custom xkb file. Unfortunately the geometry file hasn't been updated since I modded in the new keyboard, but here it is anyways: <br>
</p>
$[img-caption "/files/laptop-xkb-geometry.png" "my xkb geometry file compiled to a pdf"]
<p>
Disregard the fucked up escape key, I was messing with it earlier. My keyboard isn't that notable beyond binding control to caps lock and binding the old control key to mode_switch.
Additionally, when mode_switch is pressed while an alphabetic key is pressed, it types a greek letter instead.
</p>
<p>
I run artix (for the anti systemd meme), though upon getting my framework I intend to switch to gentoo.
I use i3 as my window manager with a somewhat cursed script to programatically generate it's config from a yaml file.
This script is vaguely necessary because <ul>
<li> I wanted a (programatically generated) graph of all my keybinds as leaf nodes with different modes as trunk nodes and individual keys as edges </li>
<li> I wanted to easily nest an arbitrarily large number of modes without it being a hassle </li>
</ul><br>
an example of the function of this script is something like<br><br>
<div class="code-container">
<div class="io-container">
<h3>Input (yaml):</h3>
<pre><code>
keybinds:
a: !Mode
name: a
keybinds:
b: !Mode
name: b
keybinds: ...
</code></pre>
</div>
<div class="io-container">
<h3>Output (i3config):</h3>
<pre><code>
mode a {
bindsym b mode b
}
mode b {
bindsym ... ...
}
bindsym a mode a
</code></pre>
</div>
</div>
From the yaml config, my python script can parse it either in to a (really bad) graph of keybinds (using the graphviz library or something like that) or in to a valid i3 config file.
In my real config, I have a mode 'base' which is the default mode with no keybinds other than mod4+space, followed by a mode 'space' reached by pressing mod4+space.
From 'space' mode, other modes may be accessed, such as 'workspaces or windows' mode, bound under w.
This gets rather absurd (intentionally so) very quickly.
The combination to move to workspace 0 while in 'base' mode is to press mod4+space ('space' mode), w ('workspaces_or_windows' mode), s ('workspaces'), g ('workspaces_goto'), 0 (move to workspace 0).
</p>
<p>
This system results in horrible user experience (but I don't care), great security (close to least intuitive setup possible), and&mdash;most importantly&mdash;an incredibly stupid graph of keybinds.
I find this unreasonably amusing.
</p>
<p>to my endless amusement, I may be partially to blame for the niri compositor having keybinding modes</p>
$[img-caption /files/niri-dev-keybind-graph.png 'YaLTeR, the niri dev, seeing my keybind graph and deciding to implement keybinding modes']
</text-column>
</image-column-container>
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,63 +0,0 @@
<html>
<head>
<title>Natalie information</title>
<style>
$[cat style.css]
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>what is a "natalie?"</h1>
<span>I am <a href='/html/natalie-sightings.html'>natalie</a>. obviously.</span>
<p>
words are not a thing I am good at. this is exacerbaited when the words are about myself.
despite this, I shall attempt a suitable description of myself.
</p>
<br>
ideally, I am to be referred to as an "it" or a "she". the former is preferred to some degree.<br>
timezone I am in: $[date "+%Z (UTC%z)"].<br>
age: $[echo $(( $(date +%s) - $(date -d "2007-04-01" +%s) ))] seconds. that is $[echo "scale=8; ($(date +%s) - $(date -d '2007-04-01' +%s)) / (365.25*24*3600)" | bc] [earth] years.<br>
I am kind of a college student. it is complicated. I will be a college student with less complications by fall of 2025.<br>
I like systems. particularly ones that have reasonably consistent behavior based on a set of rules. this is omnipresent in my interests.
<br>
list of interests: <ul>
<li>technical computer things, so long as they do not involve javascript</li>
<li>infrastrusture, particularly pertaining to trains</li>
<li>languistics, especially conlangs</li>
<li>key making and lock picking</li>
<li>math</li>
</ul>
things that I enjoy: <ul>
<li>friends</li>
<li>going on long walks</li>
<li>utilizing public transportation</li>
<li>train tracks</li>
</ul>
things I find displeasing: <ul>
<li>grease or oil on my skin</li>
<li>non friend people</li>
<li>ultraviolet radiation</li>
<li>busywork</li>
</ul>
</section>
<section>
<h2>somewhat irregular natalie facts</h2>
<ul>
<li>I own 12 thinkpads, all of which were manufactured prior to 2014</li>
<li>the number of people that can effectively use my computer is, to my knowledge, 1</li>
<li>I can replace the screen on my first generation iphone se a1662 in 70 seconds</li>
</ul>
</section>
<section>
<h2>contact information</h2>
<a href='/html/discord.html'>Discord: _natalieeee_</a>
email: natalie at natalieee.net<br>
xmpp: nat@natalieee.net
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,22 +0,0 @@
<html>
<head>
<style>
$[cat style.css]
</style>
<title>Natalie sightings</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>Natalie Sightings</h1>
<p>They are reasonably rare. <br>These photographs are uneditted, my various cameras are just fucked up. Ignore the annoying aspect ratio.</p>
</section>
<section>
<flex-grid>$[for file in files/natalie-sightings/*; do echo "<flex-grid-item>$(img-caption "/$file")</flex-grid-item>"; done]</flex-grid>
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,20 +0,0 @@
<html>
<head>
<title>Natalie "thoughts"</title>
<style>
$[cat style.css]
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>arbitrary thoughts generated by natalie</h1>
I am bad at thinking of things to make blog posts for. this webpage might contain things that I would put in a blog post if I was more proficient at writing filler. It might also contain other things.
</section>
$[for file in ./html/thoughts/*; do echo $(grep DATE $file | awk '{print $3 $4}') $file; done | sort -k1,1 -r | cut -d' ' -f2 | while read -r file; do echo "<section><details id='$(basename $file)'><summary>$(grep '^<!-- DATE:' $file | sed 's/^<!-- DATE: //; s/-->$//'): $(grep '^<!-- TITLE:' $file | sed 's/^<!-- TITLE: //; s/-->$//')</summary><div>$(include $file)</details></section>"; done]
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,45 +0,0 @@
<html>
<head>
<title>server migration</title>
<style>
$[cat style.css]
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>This website runs on a big server now.</h1>
<p>It used to run on a dell optiplex 3040 I had laying around, but I got a server from the school basement (you can just take them, apparently).</p>
</section>
<section>
<image-column-container>
<image-container>
<flex-column>
$[img-caption "/files/natalie-holding-server.png" "me holding the server I got from the school basement"]
</flex-column>
</image-container>
<text-column>
<h2>Why do I have a server from my schools basement?</h2>
<p>
My school is currently at a temporary campus while our regular campus is being renovated.
I hope this means there will be less lead in the water when they are done, but given how the district is, who knows.
The current campus is notably smaller than the regular campus, thus a large amount of things are in storage.
The man who is in charge of the storage and moving stored items back to the new campus does not like moving items.
For this reason, when I ask him to let me in to the school's basement to just take random cool things, he says yes.
</p>
<h2>It's actually kind of horrible that I have this server.</h2>
<p>
This server used to be part of the district's network infrastructure.
When I got it, it had an unencrypted raid array on the disks that contained district information.
It should not have been stored like this, and I definitely should not have been allowed to take it.
I did of course wipe the drives and didn't even look at what was on them beyond identifying that it was from the district because I am not evil.
</p>
</text-column>
</image-column-container>
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,70 +0,0 @@
<html>
<style>
$[cat style.css]
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
<body>
$[include html/header.html]
<main>
<section>
<h1>Information about this website</h1>
site-info.html was last modified on $[stat -c %y ./html/site-info.html | head -c 10].<br>
</section>
<section>
<h2>/(.*\.)?natalieee.net/</h2>
<h3>why?</h3>
<p>
I was displeased with my former status of not having a website
</p>
<h3>how?</h3>
<p>
requests to /(.*\.)?natalieee.net/ get routed to nginx, which acts as a proxy for my subdomains.
nginx routes requests requests to /^natalieee.net/ to this webserver, which is named <a href='https://git.natalieee.net/nat/sludge'>sludge</a>.
requests to /.*\.natalieee.net/ are routed according to the /.*\.natalieee.net/ section.
</p>
</section>
<section>
<h2>/^natalieee.net/</h2>
<p>
the root domain of this website, which you are currently observing, is running sludge.
the colors of both the light and dark mode are based off of the colorscheme of my laptop.
</p>
</section>
<section>
<h2>sludge</h2>
<h3>what is a sludge?</h3>
<p>s[ite][k]ludge is my from-scratch webserver. it has features.</p>
<h3>why?</h3>
<p>I dislike "web development". also, I was bored.</p>
<h3>what does sludge do?</h3>
<ul>
<li>send data</li>
<li>receive data</li>
<li>process data</li>
<li>create new data</li>
<li>move data</li>
<li>coerce data[types]</li>
<li>other verbs prepended to data</li>
</ul>
<h3>how does sludge?</h3>
<p>
sludge receives requests for paths. if these paths are in the routing table, it determines what it should respond with. generally, if the path starts with /html/, it will read an html document from the filesystem.
following this, it will locate any instance of "{key}" and replace these instances with a value determined by a function associated to the route being requested in the routing table.
after substituting these values, it will find any instances of the pattern "$[echo \$\[...]]", where ... is a valid bash expression. for each match, it replaces the original matching text with the output of said text executed in bash.
this functions as a static sight generator. an example of this is the headers on this site, which are included via the following expression: "$[echo \$\[include ./html/header.html]]"
</p>
<p>
sludge also has the ability to apply arbitrary edits to outgoing data prior to said data being sent, but after it has been generated. you may observe this <a href='?uwu=true'>here</a>.
</p>
</section>
<section>
<h2>/.*\.natalieee.net/</h2>
<ul>
<li>$[make-link https://git.natalieee.net]: Gitea instance. You may use it if you feel so inclined for some reason. I wouldn't.</li>
<li>$[make-link https://dns.natalieee.net]: Pointless CNAME record to my main domain so that entities using my dns (A number greater than 0!) can put dns.natalieee.net down as their nameserver instead of natalieee.net.</li>
</ul>
</section>
</main>
$[include html/footer.html]
</body>
</html>

View File

@ -1,22 +0,0 @@
<html>
<head>
<title>woah, data</title>
<style>$[cat style.css]</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
$[include html/header.html]
<main>
<section>
<h1>Stats! Data! Wow!</h1>
Boring information about me and my computers, delivered right to your web browser (or terminal)!<br>
Why collect information about your users when your users could collect information about you?
</section>
<section>
<h2>Currently available information:</h2>
$[for line in $(cat sludge/src/lib/router.py | grep Route -A1 | grep '/stats/' | sed "s/'//g; s/,//g" | cut -d= -f3); do echo "$(make-link $line)"; done]
</section>
</main>
$[include html/footer.html]
<body>
</html>

28
html/thoughts/attraction Normal file
View File

@ -0,0 +1,28 @@
<!-- vim: ft=html -->
<!-- TITLE: romantic relationships are made up, it thinks -->
<!-- DATE: 2024-09-05 05:22:24 -->
<!-- CATEGORIES: natalie being multiple words that start with "a";rambling -->
this concept simply does not make sense to it.
<br><br>
it understands the idea of wanting beings that one is close to. this makes perfect sense to it.<br>
what is the difference between a friend you are close with and a romantic partner? it does not understand.<br>
it does not think it has ever genuinely experienced romantic attraction. it has been informed that this is irregular.
perhaps it is aromantic (note: requires further investigation, alternative explanation: is extremely autistic).
it supposes it is functionally in more or less two(?) qprs. this is ideal and it does not understand why such a state is not more common.
<br><br>
what is the point of a romantic relationship when it can have social exposure quotas met simply by having friends?
it feels it must be missing something.
<br><br>
it being abnormally close with its friends has the rather amusing consequence of people asking of an arbitrary friend of mine and this natalie are dating.
it is not entirely sure why this occures.
it understands if someone makes such an inquiry after observing a friend and natalie performing an action typically associated with romantic relationships, such as holding hands, however sometimes people ask with no clear reason. baffling.
here is the count for how many times people have asked such a question regarding all of its friends it has happened with:
<ul>
<li>cecilie: 21</li>
<li>odette: 13</li>
<li>unnamed friend entity: 1</li>
</ul>
recently, cecilie was happy about the 20th increment to this count because it means that the interlocking metal hearts with notches for each time someone has asked this question that it made this (with a forge and anvil! very cool) would have both a multiple of 10 total notches and the same number of notches on each heart.
the indicator shall be pictured below, because natalie thinks it is very cool.
$[img-caption '/files/thoughts/the-indicator.jpg']

View File

@ -1,7 +1,8 @@
<!-- TITLE: Audio is bad. So is my computer. --> <!-- vim: ft=html -->
<!-- TITLE: audio is bad. so is computer. -->
<!-- DATE: 2024-07-24 17:18:11 --> <!-- DATE: 2024-07-24 17:18:11 -->
While I was making $[make-link /stats/what-song-is-it-listening-to], specifically while I was writing the service that would send song updates to the server from my laptop, I decided to make mpd started by my init system (openrc). <!-- CATEGORIES: complaining;computers -->
This quickly devolved in to also making pipewire start from my init system. Prior to now, it was start by my compositor, which would run <code>unfuck audio</code>. For some reason, likely due to the fact that I use seatd instead of elogind for session management on this laptop, the default artix init scripts for all pipewire related services and mpd did not work. while natalie was making $[make-link /stats/what-song-is-it-listening-to], specifically while it was writing the service that would send song updates to the server from its laptop, it decided to make mpd started by its init system (openrc).
I spent like two hours hacking on these, and now have arrived at a system which vaguely works. Both mpd and {pipewire,pipewire-pulse,wireplumber} are started by my init, however, for some reason which is entirely obscure to me, pipewire does not recognize anything other than my bluetooth headphones. this quickly devolved in to also making pipewire start from its init system. prior to now, it was start by an init script ran by the compositor natalie uses, which would run <code>unfuck audio</code>. for some reason, likely due to the fact that natalie uses seatd instead of elogind for session management on its primary laptop, the default artix init scripts for all pipewire related services and mpd did not work.
This doesn't actually matter, because I functionally never use the speakers in this laptop, but it is still quite stupid.<br><br> it spent around two hours hacking on these, and now have arrived at a system which vaguely works. both mpd and {pipewire,pipewire-pulse,wireplumber} are started by init, however, for some reason which is entirely obscure to it, pipewire does not recognize anything other than its bluetooth headphones.
I hate computers. I should get back to making random information about me available on the internet. this doesn't actually matter, because natalie functionally never use the speakers in its laptop, but such an issue is still quite stupid.

View File

@ -1,7 +1,9 @@
<!-- vim: ft=html -->
<!-- TITLE: dns --> <!-- TITLE: dns -->
<!-- DATE: 2024-07-26 07:18:22 --> <!-- DATE: 2024-07-26 07:18:22 -->
Odette, one of my meat friends (not computer friends) (though she is a computery friend) just <a href='https://puppygirl.systems'>bought a domain</a>. Apparently the registrar she bought it from didn't have an api, which was problematic because she doesn't have a static ip. <!-- CATEGORIES: rambling;computers -->
Because I am a reasonable person, I decided to start hosting dns for her. Now I know (some) things about dns! odette, one of natalie's meat friends (not computer friends) (though she is a computery friend) just <a href='https://puppygirl.systems'>bought a domain</a>. apparently the registrar she bought it from didn't have an api, which was problematic because she does not have a static ip.
I like learning things. because natalie is a reasonable being, it decided to start hosting dns for her. now it knows (some) things about dns!
it likes learning things.
<br><br> <br><br>
As stated in the changelog, should any random website tourist wish to use my dns setup for their own website (I do not recomend this, nor do I know why you would want to do this.) you can email me. I might even respond. as stated in the changelog, should any random website tourist wish to use its dns setup for one's website (natalie does not recommend this, nor does it know why you would want to do this.) you can email it. it might even respond.

101
html/thoughts/dollcode Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,27 @@
<!-- vim: ft=html -->
<!-- TITLE: nearly all educational institutions exist to mildly inconvenience natalie -->
<!-- DATE: 2024-10-18 23:48:55 -->
<!-- CATEGORIES: rambling;complaining;school -->
there is simply no other explanation.
<br><br>
the only time this one felt as though it was in an environment that valued learning was before it was in high school, when it was still going to a school that followed montessori principles (read: let it do whatever it wanted).
in high school, all of its classes (other than the dual credit or AP ones) were entirely busywork.
then, it dropped out of highschool because it did not like busywork and went to college, because it hoped there would be less busywork.
there was in fact more busywork in college, somehow.
it thought that reading 115 would not contain material from its second grade english class, yet evidently it was wrong.
<br><br>
because college contained even more busywork than high school, it has also dropped out of the college program to get its high school diploma.
this is for some reason an intelligent decision, as it can just take the GED immediately, and then go back to college as a regular college student the next term.
for some reason that is absolutely incomprehensible to natalie, with a GED, the college will not require it to take reading 115.
it is not sure why they will not just allow it to take the language arts placement test to skip that class, this seems as though it would be a lot less convoluted than dropping out of college, applying to the program that will make the college pay for the GED exam, and then immediately starting as a regular college student next term.
<br><br>
portland community college is such a baffling institution.
it scored a 97 on their math placement exam. it scored a 680 on the SAT math section. it has AP credit for math 251 from taking AP calc. it has math credit for math 243 from taking AP statistics. it has PCC credit from taking math 111 under a dual credit program.
the only two math classes they said it was allowed to take under the high school diploma program were MATH 111 (which it did in sophomore year! come on) and ALC 60 (remedial math).
fortunately, there was a secret third option where they just let it not take any math class. this is stupid, what is the point of a placement test if they ignore the result? what is the point of taking the SAT if they ignore the result? what is the point of having AP credit if they ignore it?
why are they like this?
what is the point of taking an english class in which one learns what an adjective is? this is a thing that everyone learned already in second grade.
<br><br>
it is excited to be free of the high school diploma program.
hopefully the amount of stupid busywork is lower once it starts actual college classes next term.
it probably wont be, so hopefully it gets prescribed adderall.

View File

@ -1,6 +1,8 @@
<!-- vim: ft=html -->
<!-- TITLE: this website is bad and fonts are worse --> <!-- TITLE: this website is bad and fonts are worse -->
<!-- DATE: 2024-07-24 03:12:19 --> <!-- DATE: 2024-07-24 03:12:19 -->
I am unsure as to what is going on?<br> <!-- CATEGORIES: complaining;computers -->
on $[make-link /html/natalie-sightings.html], the font never loads. I have failed to ascertain why it is that this occurs, as this has only become an issue today and no edits have been made to that page remotely recently. What on earth.<br><br> natalie is unsure as to what is going on?<br>
on $[make-link /html/natalie-sightings.html], the font never loads. natalie has failed to ascertain why it is that this occurs, as this has only become an issue today and no edits have been made to that page remotely recently. what on earth.<br><br>
I have an unfortunate habit of accruing computer ghosts that break things in horribly unclear ways. it has an unfortunate habit of accruing computer ghosts that break things in horribly unclear ways.

36
html/thoughts/healthcare Normal file
View File

@ -0,0 +1,36 @@
<!-- vim: ft=html -->
<!-- TITLE: the medical system -->
<!-- DATE: 2024-09-07 05:44:47 -->
<!-- CATEGORIES: rambling;complaining;healthcare -->
<h2>how is it this bad?</h2>
<hr>
<h3>endocrinological</h3>
natalie takes estrogen (tablets, 2mg, 3/day), spironolactone (tablets, 50mg, 2/day), and progesterone (gel capsuls, 100mg, 1/day) because it is transgender.
here are the associated costs for the above medications:
<ul>
<li>estrogen: $14.05/month, $168.6/year</li>
<li>spironolactone: $6/month, $72/year</li>
<li>progesterone: $15/month, $180/year</li>
<li>total: $420.6/year</li>
</ul>
one will note that estrogen and an anti androgen are responsible for 57.2% of the yearly cost.
this is ridiculous.<br>
it did some calculations:<br>
cost of diy estrogen injectable solution (estradiol enanthate, 40mg/ml, 10ml): $70-$100<br>
necessary doseage for estrogen monotherapy: ~.13ml<br>
injection timing: every 7 days<br>
10ml/.13ml = 74.9 weeks of estrogen<br>
52 weeks in a year.<br>
100*1/(10/.13/52) = $67.6/year for estrogen (upper bound)<br>
70*1/(10/.13/52) = $47.32/year for estrogen (lower bound)<br>
<br>
why is diy cheaper than having healthcare?
this does not account for cost of needles and alcohol wipes, but that is negligible.
<hr>
<h3>neurological</h3>
the psychologist that did natalie's autism evaluation thinks that it is depressed.
this is based on 0 evidence other than its consistently high score on the PHQ-9.
it would like to contend that the PHQ-9 is not a useful tool of assessment for neurodivergent people.
<br><br>
apparently, it is somehow more conceiveable that this thing is autistic and depressed than it is that it could be autistic and have adhd.
it is very clearly not depressed, in fact, it would say that other than the negative impacts of the very obvious and DSM-V compliant signs of ADHD it exhibits, it is doing quite well.

View File

@ -0,0 +1,18 @@
<!-- vim: ft=html -->
<!-- TITLE: it hates debian -->
<!-- DATE: 2024-09-03 04:19:03 -->
<!-- CATEGORIES: complaining;computers;why is debian? -->
much to natalie's detriment, this server runs debian.
<br><br>
such circumstances would most likely be acceptable if its computers were not cursed with not working in hard to explain ways.<br>
issues it has with debian:
<ul>
<li>the package manager does not work.</li>
<li>it cannot install a modern python version without jumping through at least 12 very small and inconvienently located hoops.</li>
<li>it has to use nix as a package manager to reasonably do anything.</li>
<li>it has to interact with systemd without a layer of abstraction</li>
</ul>
<br>
it really needs to migrate to nixos for its server.
normally, such an idea as installing nixos would seem abhorrent to it, however nixos actually seems extremely reasonable for servers.
it does not understand how it is that people can run nixos on a computer that they use outside of a server application. ridiculous.

View File

@ -1,17 +1,19 @@
<!-- vim: ft=html -->
<!-- TITLE: there is less technical debt now. --> <!-- TITLE: there is less technical debt now. -->
<!-- DATE: 2024-07-27 17:24:16 --> <!-- DATE: 2024-07-27 17:24:16 -->
<p>I modified almost every html file in the site. there are less problems now. </p> <!-- CATEGORIES: computers;change to site -->
<p>it modified almost every html file in the site. there are less problems now. </p>
<p>thoughts like these are no longer viewed as iframes, images are now handled by my img-caption script: <p>thoughts like these are no longer viewed as iframes, images are now handled by its img-caption script:
<pre><xmp> <pre><xmp>
$[cat ./scripts/img-caption] $[cat ./scripts/img-caption]
</xmp></pre> </xmp></pre>
Have I mentioned how much I love that a significant portion of the content on this site is generated by bash script?<br><br> has it mentioned how much it loves that a significant portion of the content on this site is generated by bash script?<br><br>
The above file is included here with <code>$[echo \$[cat ./scripts/img-caption]]</code>. I greatly enjoy this. the above file is included here with <code>$\[echo $\[cat ./scripts/img-caption]]</code>. it greatly enjoys this.
</p> </p>
<p>Given that the css that is included in every site has now been standardized, I should probably start generalizing the start of each html document such that I can change one file to update the head section of all documents. <p>given that the css that is included in every page has now been standardized, natalie should probably start generalizing the start of each html document such that it can change one file to update the head section of all documents.
Also, I should implement a header.</p> also, it should implement a header.</p>
<p>Over the past 3 days, I have increased the number of entries in the changelog by approximately 1.8 times. I am amused by this.</p> <p>over the past 3 days, it has increased the number of entries in the changelog by approximately 1.8 times. it is amused by this.</p>

View File

@ -0,0 +1,25 @@
<!-- vim: ft=html -->
<!-- TITLE: do not under any circumstances expect anyone to join a stupid fucking discord server to read documentation. fuck you. -->
<!-- DATE: 2025-03-25 18:51:46 -->
<!-- CATEGORIES: rambling;angry, either rationally or irrationally -->
<h2>documentation is meant to be read</h2>
do not make it harder for this one, or anyone else to read. if you do, it will hate you forever.
$[img-caption /files/thoughts/fuck-you-make-your-docs-public.png "a warning in a github readme, advising users to read the pinned post in the project discord for help with a recent issue"]
$[make-footnote "font antialiasing is disabled on its computer. the image will look bad unless at a certain size."]
<br><br>
do not make anyone ever join a discord server to read documentation.
if you can write a message about a problem in discord and pin it, you can copy that information in to a markdown document and push it to git.
it does not want to join your discord server. it does not want to join your matrix room. it does not want to join your arcane and non-publicly-indexed forum of any kind.
it wants to fix the issue it is having.
<br><br>
it is perfectly willing to join community forums in cases where it is interested in the project. this is not the issue.
the issue is someone arbitrarily deciding that&mdash;instead of simply providing one with the relevant information&mdash;that one must first solve some poorly constructed riddle made out of group invite links and login portals first, at no benefit to literally anyone.
<br><br>
it cannot understand the thought process that leads to doing this.
unfortunately, it seems to be a common one, as this one has encountered many instances of this.
it cannot fathom how utterly muffin-brained someone must be to write documentation on how to solve an issue and then deliberately obfuscate said documentation.
this makes it more annoyed than scientific articles being paywalled, because it can't even blame the capitalist greed.
publish documentation or don't write it in the first place.$[make-footnote "the particular instance pictured made it annoyed enough to write a \"thought\" for the first time in months."]
<br>
$[put-footnotes]

40
html/thoughts/meta Normal file
View File

@ -0,0 +1,40 @@
<!-- vim: ft=html -->
<!-- TITLE: metapost -->
<!-- DATE: 2024-09-20 04:22:41 -->
<!-- CATEGORIES: rambling;complaining;computers -->
<h2>it is annoyed by this medium</h2>
<hr>
this medium presents thoughts in a 1 dimensional manor without an ergonomic way to link between different posts.
this annoys it because it generally tends to think of information such that each concept is a node and each relationship between concepts is an edge between those nodes on a two dimensional graph.
the format of this webpage does not allow for such structure due to the linearity.
<hr>
perhaps a "digital garden" or similar system would be a better means of managing this page.
<hr>
<h3>issues with implementing a digital garden style approach to a webpage like this one</h3>
natalie is allergic to organizational tools.
unfortunately, if it were to make a digital garden, it would probably write software to generate pages based on norg,$[make-footnote "natalie is only diagnosed with level 1 ASD and thus it does not have a build compliant with using emacs (requires ASD level 2+). also, neovim is already well integrated in to the way it does things."] which counts as an organizational tool.
<br>
why is it bad at organizational tools?
<br>
it assumes this is due to its marginally above average ability to remember information.
<br>
can this be mitigated by being very stuborn in its useage of such a tool?
<br>
maybe.
<hr>
making software that integrates with the way that this website already runs would be rather annoying due to the nest of complexity natalie has built up.
it supposes that it could have software similar to htmlgen that writes norg documents converted to html to natalieee.net/garden or something.
it could have even more symlinks floating around directories associated with this website, which would be kind of funny.
<hr>
another option would be to simply run a garden on a subdomain.
something like garden.natalieee.net would work, though then it must either retool its current webserver to be less horribly tied to this one specific project,$[make-footnote "thing it should do anyways"] or write an entirely different webserver.$[make-footnote "it starts college on monday, it should not do this"]
<hr>
another issue with doing such a thing is figuring out a reasonable schema for nodes in the graph.
it is sure there are things that are more intelligent than it that have thought about such issues before, but it thinks it would probably be more interesting to create its own.
it supposes it could keep everything in a flat directory. this seems silly, however it doubts its future predicting abilities when it comes to what categories it should put things in.
<hr>
implementing a digital garden seems as though it would probably demand redoing the whole website, actually.
it has already done that three to six times (depending on how one counts), and is not particularly keen on doing so again.
<br><br>
oh well, it shall consider alternatives for the structure of this webpage.
$[put-footnotes]

46
html/thoughts/meta-2 Normal file
View File

@ -0,0 +1,46 @@
<!-- vim: ft=html -->
<!-- TITLE: re: metapost; things resembling an improvement -->
<!-- DATE: 2024-10-21 05:01:21 -->
<!-- CATEGORIES: change to site;computers;rambling -->
natalie has created an alternative means of viewing thoughts. $[make-footnote "$(make-link '/html/view-thought.html' 'find it here')"]
this new method improves upon its complaint regarding linearity in the last metapost by creating a system by which each post can be viewed as its own page.
this in theory adds for ergonomic linking between posts, though doing so would somewhat deprecate the prior means of viewing them in favor of the new means.
it is not sure how to feel about this.
$[put-footnotes]
<hr>
its new means of thought viewing relies on some absolutely cursed code, it is very amused by this.
<pre>
<span class="-punctuation-bracket">(</span><span class="-function-macro">defun</span> <span class="-variable"><span class="-function">html</span></span> <span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span>
<span class="-punctuation-bracket">(</span><span class="-variable">page</span> <span class="String">&quot;$[echo '$'][test \&quot;$(echo '{' 'thought' '}' | sed 's/ //g')\&quot; != '{thought}' &amp;&amp; echo '{thought}' || echo thoughts index]&quot;</span>
<span class="-string-escape">`</span><span class="-punctuation-bracket">(</span><span class="-variable">section</span> <span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span>
<span class="String">&quot;$[echo '$'][echo &gt; /tmp/footnote_count]&quot;</span>
<span class="-punctuation-bracket">(</span><span class="-variable">h1</span> <span class="-punctuation-bracket">(</span><span class="SpecialChar"><span class="-punctuation-special">:</span>style</span> <span class="String">&quot;display: $[echo '$'][test \&quot;$(echo '{' 'thought' '}' | sed 's/ //g')\&quot; != '{thought}' &amp;&amp; echo block || echo none]&quot;</span><span class="-punctuation-bracket">)</span> <span class="String">&quot;$[echo '$'][cat ./html/thoughts/$(basename '{thought}') | grep '&lt;!-- TITLE:' | sed 's/&lt;!-- TITLE://; s/--&gt;//']&quot;</span><span class="-punctuation-bracket">)</span>
<span class="String">&quot;$[echo '$'][cat ./html/thoughts/$(basename '{thought}') | grep '&lt;!-- DATE:' | sed 's/&lt;!-- DATE://; s/--&gt;//']&quot;</span> <span class="-punctuation-bracket">(</span><span class="-variable">br</span><span class="-punctuation-bracket">)</span>
<span class="-punctuation-bracket">(</span><span class="-variable">div</span> <span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span> <span class="String">&quot;$[echo '$'][include \&quot;./html/thoughts/$(basename '{thought}')\&quot;]&quot;</span><span class="-punctuation-bracket">)</span>
<span class="String">&quot;$[echo '$'][test \&quot;$(echo '{' 'thought' '}' | sed 's/ //g')\&quot; != '{thought}' || (echo '&lt;h1&gt;thoughts:&lt;/h1&gt;'; ls ./html/thoughts | while read -r file; do echo \&quot;&lt;p&gt;$(cat ./html/thoughts/$file | grep '&lt;!-- DATE:' | sed 's/&lt;!-- DATE://; s/--&gt;//') &lt;a href=?thought=$file&gt;$(cat ./html/thoughts/$file | grep '&lt;!-- TITLE:' | sed 's/&lt;!-- TITLE://; s/--&gt;//')&lt;/a&gt;&lt;/p&gt;\&quot;; done | sort --numeric --reverse)]&quot;</span><span class="-punctuation-bracket">)</span><span class="-punctuation-bracket">)</span><span class="-punctuation-bracket">)</span>
</pre>
<details>
<summary>
this compiles to the following:
</summary>
<pre><xmp>
$[cat ./html/view-thought.html]
</xmp></pre>
</details>
a particularly amusing bit of this is <pre>
<span class="String">&quot;$[echo '$'][test \&quot;$(echo '{' 'thought' '}' | sed 's/ //g')\&quot; != '{thought}'</span>
</pre>
the reason the presence of the thought being set via the url parameter is checked like that is because comparing '{thought}' to '{thought}' would always be true.
when an html file contains a variable that the server does not have present when parsing the file, the variable is left as it is instead of being set to ''.
accordingly, we cannot do something like <code>test -z '{thought}'.</code>
<br><br>
one may think "natalie, is it not dangerous to run bash on user input supplied via url param? could one not send a request like the following: <pre>https://natalieee.net/html/view-thought.html?thought=python-goto%27;while%20true;%20do%20echo%20foo%20%3E%3E%20aoeu;%20done;%27</pre>"
the answer to such a thought is "yes, this is bad".
this badness should(?) be mitigated by the fact that it is impossible to get the server to process a ' in the request params. this hopefully makes RCE impossible, if not email it, please.
<hr>
another interesting feature of this new format is that it would allow for reasonable per-post comments.
this seems like it would be a good feature.
of course, no one actually reads these, but whatever.
per post comments would still be interesting, it could continue its tradition of refusing to use a database for absolutely no reason.
per post comments would also make the view-thought.html file even more cursed, which is amusing to it.

4
html/thoughts/monorepo Normal file
View File

@ -0,0 +1,4 @@
<!-- vim: ft=html -->
<!-- TITLE: this should really probably be made in to a monorepo. -->
<!-- DATE: 2024-10-06 23:47:51 -->
<!-- CATEGORIES: no body -->

31
html/thoughts/phones Normal file
View File

@ -0,0 +1,31 @@
<!-- vim: ft=html -->
<!-- TITLE: why are phones so bad? -->
<!-- DATE: 2024-10-23 10:10:10 -->
<!-- CATEGORIES: complaining;computers;natalie specific issues -->
in its experience, there are 0 phones that do not break every 2-4 months.
this is stupid because society made the baffling and frankly quite bad near unilateral decision that phones would be largely required to be a functional being.
<hr>
natalie used to have an iphone SE 1st gen (a1662).
this phone was awful by virtue of being a phone, but it worked.
unfortunately, phones are garbage, so this one probably spent $160 on screen replacements for it$[make-footnote 'how on earth can phones not survive being in a pocket? this is very easy'] because the screen would break every 2-4 months.
also, its home button, both cameras, and speakers all ceased to function and were accordingly removed.
<br><br>
eventually, its father gave it his old phone. this was a samsung galaxy s10e.
this phone managed to be worse than the iphone SE 1st gen a1662.
why on earth would anything design a phone the screen of which protrudes past the body of the phone such that if one dares to even observe it, the screen breaks?
this is like if they asked an engineer to design a phone and then did the exact opposite.
also, the corners were rounded.
not the corners of the case (though those were too), but the corners of the actual screen.
why on earth would one ever do this?
<blockquote>hello, LCD manufacturer? we would like a more expensive and worse screen please.</blockquote>
nonsense.
<br><br>
anyways, the s10e stopped charging and gives an overheat warning 80% of the time that natalie tries to turn it on (just being plugged in to usb-c).
it got this phone in july, so that is within the predicted range of 2-4 months.
<br><br>
why are phones like this?
it wants to not own a phone but they are so necessary.
it really is not sure why people need to be able to {text,call} it.
if one wants to communicate with it, they can send it an email.
this is not a difficult concept, and yet it still regularly receives text messages and phone calls.
$[put-footnotes]

172
html/thoughts/python-goto Normal file
View File

@ -0,0 +1,172 @@
<!-- vim: ft=html -->
<!-- TITLE: implementing goto statements in python (in under 50 lines)-->
<!-- DATE: 2024-09-12 08:43:04 -->
<!-- CATEGORIES: hacks;computers -->
python is extremely extensible, though natalie is not sure that is intentional.
<hr>
firstly, here is the end product of this venture:
<pre>
<span class="-keyword">from</span> <span class="-variable"><span class="DiagnosticUnderlineError">goto_label</span></span> <span class="-keyword">import</span> <span class="Operator"><span class="SpecialChar">*</span></span>
<span class="-variable">count</span> <span class="Operator">=</span> <span class="Number">0</span>
<span class="Comment"><span class="-spell">#LABEL lol</span></span>
<span class="-variable"><span class="-function"><span class="-function-builtin">print</span></span></span><span class="-punctuation-bracket">(</span><span class="String">'this prints twice'</span><span class="-punctuation-bracket">)</span>
<span class="-variable">count</span> <span class="Operator">+=</span> <span class="Number">1</span>
<span class="-variable"><span class="DiagnosticUnderlineError">goto</span></span> <span class="Operator">&amp;</span><span class="-variable"><span class="DiagnosticUnderlineError">lol</span></span> <span class="-keyword">if</span> <span class="-punctuation-bracket">(</span><span class="-variable">count</span> <span class="Operator">&lt;=</span> <span class="Number">1</span><span class="-punctuation-bracket">)</span> <span class="-keyword">else</span> <span class="-variable"><span class="DiagnosticUnderlineError">goto</span></span> <span class="Operator">&amp;</span><span class="-variable"><span class="DiagnosticUnderlineError">goto_statements_are_a_perfectly_reasonable_thing_to_have_in_python</span></span>
<span class="Comment"><span class="-spell">#LABEL last_print</span></span>
<span class="-variable"><span class="-function"><span class="-function-builtin">print</span></span></span><span class="-punctuation-bracket">(</span><span class="String">'this prints last'</span><span class="-punctuation-bracket">)</span>
<span class="-variable"><span class="DiagnosticUnderlineWarn"><span class="DiagnosticUnderlineError">goto</span></span></span><span class="DiagnosticUnderlineWarn"> <span class="Operator">&amp;</span><span class="-variable"><span class="DiagnosticUnderlineError">stop</span></span></span><span class="-variable"></span>
<span class="Comment"><span class="-spell">#LABEL ellipsis</span></span>
<span class="-variable"><span class="-function"><span class="-function-builtin">print</span></span></span><span class="-punctuation-bracket">(</span><span class="String">'at least Ellipsis() has some use now, for normal reasons that make sense'</span><span class="-punctuation-bracket">)</span>
<span class="-variable"><span class="DiagnosticUnderlineWarn"><span class="DiagnosticUnderlineError">goto</span></span></span><span class="DiagnosticUnderlineWarn"> <span class="Operator">&amp;</span><span class="-variable"><span class="DiagnosticUnderlineError">last_print</span></span></span><span class="-variable"></span>
<span class="Comment"><span class="-spell">#LABEL goto_statements_are_a_perfectly_reasonable_thing_to_have_in_python</span></span>
<span class="-variable"><span class="-function"><span class="-function-builtin">print</span></span></span><span class="-punctuation-bracket">(</span><span class="String">'it is sure this is how the variety of language features it is abusing were intended to be used'</span><span class="-punctuation-bracket">)</span>
<span class="-variable"><span class="DiagnosticUnderlineWarn"><span class="DiagnosticUnderlineError">goto</span></span></span><span class="DiagnosticUnderlineWarn"> <span class="Operator">&amp;</span><span class="-variable">ellipsis</span></span><span class="-variable"></span>
<span class="Comment"><span class="-spell">#LABEL stop</span></span>
<span class="-punctuation-delimiter">...</span>
</pre>
its beautiful.<br>
this outputs the following:
<pre>
this prints twice
this prints twice
it is sure this is how the variety of language features it is abusing were intended to be used
at least Ellipsis() has some use now, for normal reasons that make sense
this prints last
</pre>
<hr>
now then, how does this work?
<h3>design decisions</h3>
given that evidence suggests python programs can be edited, natalie decided not to use line number based gotos and instead define labels that could be jumped to.
this makes things less annoying to edit and maintain, and developer experience is obviously a very important consideration with this project.<br>
additionally, to maximize ease with which this ""library"" can be utilized, one must only import the file to experience the wonder of python with goto statements.
<h3>technical implementation</h3>
firstly, labels: <br>
goto_label.py has a function prepare_labels(fp, scope).
this function looks for any labels (defined via /^#LABEL labelname/) in the file at fp, and defines them under the scope scope.
each label is defined as a label object. natalie resents using an object for this (which you can see by its not using the class keyword), but python is python and you cannot override operators without having a class.
it could just not override the operators, but it wanted goto to be called in a unique way that is separate from how a function would be called.
label objects have only one attribute: lineno, which is determined by an extremely rudimentary parser and then offset by 2 to account for the fact that lines are 0 indexed in the "parser" but not in real life and the fact that the label definition comment takes its own line.
<br><br>
the actual goto implementation:<br>
it does not remember how this works because it wrote most of the _goto function like 3 months ago after reading the sys and inspect module docs.
its projects have this fun property wherein they are in one of three states: done; not touched or thought about for 2-36 months; and done.
oh well, the goto function is vaguely self explanatory anyways.
<br>
there is some weirdness with operator overloading and how every goto statement is actually just calling what would normally be the bitwise and operator on an instance of the class _goto (not to be confused with the function _goto) and a label object, but that is both very simple and not required to understand this.<br>
also, it does not want to explain that because it is tired.
<br><br>
automatically parsing the importing file on import:<br>
normally, globals are not shared between modules, but python has this cool feature where if there is a general statement to be made about it then this statement can be invalidated using either the sys, inspect, or ctypes library.
this is easily the simplest part as we just grab the filename and global scope of the importing file via the inspect library and pass them to prepare_labels().
<hr>
<h3>goto_label.py</h3>
<pre>
<span class="-keyword">import</span> <span class="-variable">sys</span><span class="-punctuation-delimiter">,</span> <span class="-variable">inspect</span>
<span class="-variable">debug</span> <span class="Operator">=</span> <span class="Boolean">False</span>
<span class="-keyword-function">def</span> <span class="-variable"><span class="-function">prepare_labels</span></span><span class="-punctuation-bracket">(</span><span class="-variable"><span class="-variable">fp</span></span><span class="-punctuation-delimiter">,</span> <span class="-variable"><span class="-variable">scope</span></span><span class="-punctuation-bracket">)</span><span class="-punctuation-delimiter">:</span>
<span class="-keyword">with</span> <span class="-variable"><span class="-function"><span class="-function-builtin">open</span></span></span><span class="-punctuation-bracket">(</span><span class="-variable">fp</span><span class="-punctuation-delimiter">,</span> <span class="String">'r'</span><span class="-punctuation-bracket">)</span> <span class="-keyword">as</span> <span class="-variable">f</span><span class="-punctuation-delimiter">:</span>
<span class="-variable">lines</span> <span class="Operator">=</span> <span class="-variable">f</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable"><span class="-function">readlines</span></span></span><span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span>
<span class="-keyword">for</span> <span class="-variable">lineno</span><span class="-punctuation-delimiter">,</span> <span class="-variable">line</span> <span class="-keyword-operator">in</span> <span class="-variable"><span class="-function"><span class="-function-builtin">enumerate</span></span></span><span class="-punctuation-bracket">(</span><span class="-variable">lines</span><span class="-punctuation-bracket">)</span><span class="-punctuation-delimiter">:</span>
<span class="-keyword">if</span> <span class="-variable">line</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable"><span class="-function">startswith</span></span></span><span class="-punctuation-bracket">(</span><span class="String">'#LABEL'</span><span class="-punctuation-bracket">)</span><span class="-punctuation-delimiter">:</span>
<span class="Comment"><span class="-spell"># 1 + 1, first to account for 0 index then to account for comment line</span></span>
<span class="-variable">scope</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-constant-builtin"><span class="-variable"><span class="-function">__setitem__</span></span></span></span><span class="-punctuation-bracket">(</span><span class="-variable">line</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable"><span class="-function">split</span></span></span><span class="-punctuation-bracket">(</span><span class="String">' '</span><span class="-punctuation-bracket">)</span><span class="-punctuation-bracket">[</span><span class="Number">1</span><span class="-punctuation-bracket">]</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable"><span class="-function">strip</span></span></span><span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span><span class="-punctuation-delimiter">,</span> <span class="-variable"><span class="-function"><span class="-function-builtin"><span class="Type">type</span></span></span></span><span class="-punctuation-bracket">(</span>
<span class="String">'label'</span><span class="-punctuation-delimiter">,</span>
<span class="-punctuation-bracket">(</span><span class="-variable"><span class="Type">object</span></span><span class="-punctuation-delimiter">,</span><span class="-punctuation-bracket">)</span><span class="-punctuation-delimiter">,</span>
<span class="-variable"><span class="-function"><span class="-function-builtin"><span class="Type">dict</span></span></span></span><span class="-punctuation-bracket">(</span><span class="-variable"><span class="-variable">line</span></span><span class="Operator">=</span><span class="-variable">lineno</span><span class="Operator">+</span><span class="Number">2</span><span class="-punctuation-bracket">)</span>
<span class="-punctuation-bracket">)</span><span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span><span class="-punctuation-bracket">)</span>
<span class="-variable">_goto</span> <span class="Operator">=</span> <span class="-variable"><span class="-function"><span class="-function-builtin"><span class="Type"><span class="DiagnosticUnderlineError"><span class="DiagnosticUnderlineError">type</span></span></span><span class="DiagnosticUnderlineError"><span class="DiagnosticUnderlineError"></span></span></span><span class="DiagnosticUnderlineError"><span class="DiagnosticUnderlineError"></span></span></span><span class="DiagnosticUnderlineError"><span class="DiagnosticUnderlineError"></span></span></span><span class="DiagnosticUnderlineError"><span class="DiagnosticUnderlineError"><span class="-punctuation-bracket">(</span><span class="String">'goto'</span><span class="-punctuation-delimiter">,</span> <span class="-punctuation-bracket">(</span><span class="-variable"><span class="Type">object</span></span><span class="-punctuation-delimiter">,</span><span class="-punctuation-bracket">)</span><span class="-punctuation-delimiter">,</span> <span class="-variable"><span class="-function"><span class="-function-builtin"><span class="Type">dict</span></span></span></span><span class="-punctuation-bracket">(</span><span class="-variable"><span class="-constant-builtin"><span class="-variable">__and__</span></span></span><span class="Operator">=</span><span class="-keyword-function">lambda</span> <span class="-variable"><span class="-variable">_</span></span><span class="-punctuation-delimiter">,</span> <span class="-variable"><span class="-variable">other</span></span><span class="-punctuation-delimiter">:</span> <span class="-variable"><span class="-function">_goto</span></span><span class="-punctuation-bracket">(</span><span class="-variable">other</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable">line</span></span><span class="-punctuation-bracket">)</span><span class="-punctuation-bracket">)</span><span class="-punctuation-bracket">)</span></span><span class="-punctuation-bracket"></span></span><span class="-punctuation-bracket"></span>
<span class="-variable">goto</span> <span class="Operator">=</span> <span class="-variable"><span class="-function"><span class="DiagnosticUnderlineError">_goto</span></span><span class="DiagnosticUnderlineError"></span></span><span class="DiagnosticUnderlineError"><span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span></span><span class="-punctuation-bracket"></span>
<span class="-keyword-function">def</span> <span class="-variable"><span class="-function">_goto</span></span><span class="-punctuation-bracket">(</span><span class="-variable"><span class="-variable">lineno</span></span><span class="-punctuation-bracket">)</span><span class="-punctuation-delimiter">:</span>
<span class="-keyword">if</span> <span class="-variable">debug</span><span class="-punctuation-delimiter">:</span> <span class="-variable"><span class="-function"><span class="-function-builtin">print</span></span></span><span class="-punctuation-bracket">(</span><span class="-variable">lineno</span><span class="-punctuation-bracket">)</span>
<span class="-variable">frame</span> <span class="Operator">=</span> <span class="-variable">sys</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable"><span class="-function">_getframe</span></span></span><span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable">f_back</span></span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable"><span class="DiagnosticUnderlineError">f_back</span></span></span>
<span class="-variable">called_from</span> <span class="Operator">=</span> <span class="-variable">frame</span>
<span class="-keyword-function">def</span> <span class="-variable"><span class="-function">hook</span></span><span class="-punctuation-bracket">(</span><span class="-variable"><span class="-variable">frame</span></span><span class="-punctuation-delimiter">,</span> <span class="-variable"><span class="-variable">event</span></span><span class="-punctuation-delimiter">,</span> <span class="-variable"><span class="-variable"><span class="Comment">arg</span></span></span><span class="-punctuation-bracket">)</span><span class="-punctuation-delimiter">:</span>
<span class="-keyword">if</span> <span class="-variable">event</span> <span class="Operator">==</span> <span class="String">'line'</span> <span class="-keyword-operator">and</span> <span class="-variable">frame</span> <span class="Operator">==</span> <span class="-variable">called_from</span><span class="-punctuation-delimiter">:</span>
<span class="-keyword">try</span><span class="-punctuation-delimiter">:</span>
<span class="-variable">frame</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable">f_lineno</span></span> <span class="Operator">=</span> <span class="-variable">lineno</span>
<span class="-keyword">except</span> <span class="-variable"><span class="Type"><span class="Type">ValueError</span></span></span> <span class="-keyword">as</span> <span class="-variable">e</span><span class="-punctuation-delimiter">:</span>
<span class="-variable"><span class="-function"><span class="-function-builtin">print</span></span></span><span class="-punctuation-bracket">(</span><span class="String">&quot;jump failed:&quot;</span><span class="-punctuation-delimiter">,</span> <span class="-variable">e</span><span class="-punctuation-bracket">)</span>
<span class="-keyword">while</span> <span class="-variable">frame</span><span class="-punctuation-delimiter">:</span>
<span class="-variable">frame</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable">f_trace</span></span> <span class="Operator">=</span> <span class="-constant-builtin">None</span>
<span class="-variable">frame</span> <span class="Operator">=</span> <span class="-variable">frame</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable">f_back</span></span>
<span class="-keyword">return</span> <span class="-constant-builtin">None</span>
<span class="-keyword">return</span> <span class="-variable">hook</span>
<span class="-keyword">while</span> <span class="-variable">frame</span><span class="-punctuation-delimiter">:</span>
<span class="-variable">frame</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable">f_trace</span></span> <span class="Operator">=</span> <span class="-variable">hook</span>
<span class="-variable">frame</span> <span class="Operator">=</span> <span class="-variable">frame</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable">f_back</span></span>
<span class="-variable">sys</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable"><span class="-function">settrace</span></span></span><span class="-punctuation-bracket">(</span><span class="-variable">hook</span><span class="-punctuation-bracket">)</span>
<span class="-variable"><span class="-function">prepare_labels</span></span><span class="-punctuation-bracket">(</span><span class="-variable">inspect</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable"><span class="-function">stack</span></span></span><span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span><span class="-punctuation-bracket">[</span><span class="Operator">-</span><span class="Number">1</span><span class="-punctuation-bracket">]</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable">frame</span></span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable">f_code</span></span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable">co_filename</span></span><span class="-punctuation-delimiter">,</span> <span class="-variable">inspect</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable"><span class="-function">stack</span></span></span><span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span><span class="-punctuation-bracket">[</span><span class="Operator">-</span><span class="Number">1</span><span class="-punctuation-bracket">]</span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable">frame</span></span><span class="-punctuation-delimiter">.</span><span class="-variable"><span class="-variable">f_globals</span></span><span class="-punctuation-bracket">)</span>
</pre>
<hr>
natalie finds much enjoyment in the syntax for calling a goto statement being goto &label. it looks like something that thoroughly does not belong in python.
<br><br>
ideas for future improvement:
making label names override builtin function names (unreasonably possible) and making a __call__ method on label objects that jumps to that label.
hopefully no one creates any labels named "print".
<hr>
random other programs it (badly) implemented using if conditions only for goto statements out of boredom:
<h3>fibonacci</h3>
<pre>
<span class="-keyword">from</span> <span class="-variable"><span class="DiagnosticUnderlineError">goto_label</span></span> <span class="-keyword">import</span> <span class="Operator"><span class="SpecialChar">*</span></span>
<span class="-keyword-function">def</span> <span class="-variable"><span class="-function">fib</span></span><span class="-punctuation-bracket">(</span><span class="-variable"><span class="-variable">n</span></span><span class="-punctuation-bracket">)</span><span class="-punctuation-delimiter">:</span>
<span class="-variable">depth</span> <span class="Operator">=</span> <span class="Number">0</span>
<span class="-variable">a</span> <span class="Operator">=</span> <span class="Number">1</span>
<span class="-variable">b</span> <span class="Operator">=</span> <span class="Number">0</span>
<span class="Comment"><span class="-spell">#LABEL fib_start</span></span>
<span class="-variable"><span class="-function"><span class="-function-builtin">print</span></span></span><span class="-punctuation-bracket">(</span><span class="-variable">a</span><span class="-punctuation-bracket">)</span>
<span class="-variable">a</span><span class="-punctuation-delimiter">,</span> <span class="-variable">b</span><span class="-punctuation-delimiter">,</span> <span class="-variable">depth</span> <span class="Operator">=</span> <span class="-variable">b</span><span class="-punctuation-delimiter">,</span> <span class="-variable">b</span> <span class="Operator">+</span> <span class="-variable">a</span><span class="-punctuation-delimiter">,</span> <span class="-variable">depth</span> <span class="Operator">+</span> <span class="Number">1</span>
<span class="-keyword">if</span> <span class="-variable">depth</span> <span class="Operator">&gt;</span> <span class="-variable">n</span><span class="Operator">+</span><span class="Number">1</span><span class="-punctuation-delimiter">:</span> <span class="-variable"><span class="DiagnosticUnderlineWarn"><span class="DiagnosticUnderlineError">goto</span></span></span><span class="DiagnosticUnderlineWarn"> <span class="Operator">&amp;</span><span class="-variable"><span class="DiagnosticUnderlineError">fib_end</span></span></span><span class="-variable"></span>
<span class="-variable"><span class="DiagnosticUnderlineWarn"><span class="DiagnosticUnderlineError">goto</span></span></span><span class="DiagnosticUnderlineWarn"> <span class="Operator">&amp;</span><span class="-variable"><span class="DiagnosticUnderlineError">fib_start</span></span></span><span class="-variable"></span>
<span class="Comment"><span class="-spell">#LABEL fib_end</span></span>
<span class="-punctuation-delimiter">...</span>
<span class="-variable"><span class="-function">fib</span></span><span class="-punctuation-bracket"><span class="MatchParen">(</span></span><span class="Number">20</span><span class="-punctuation-bracket"><span class="MatchParen">)</span></span>
</pre>
<h3>fizzbuzz</h3>
<pre>
<span class="-keyword">from</span> <span class="-variable"><span class="DiagnosticUnderlineError">goto_label</span></span> <span class="-keyword">import</span> <span class="Operator"><span class="SpecialChar">*</span></span>
<span class="-keyword-function">def</span> <span class="-variable"><span class="-function">fizzbuzz</span></span><span class="-punctuation-bracket">(</span><span class="-variable"><span class="-variable">n</span></span><span class="-punctuation-bracket">)</span><span class="-punctuation-delimiter">:</span>
<span class="-variable">count</span> <span class="Operator">=</span> <span class="Number">0</span>
<span class="Comment"><span class="-spell">#LABEL fizz_start</span></span>
<span class="-variable"><span class="Type">str</span></span> <span class="Operator">=</span> <span class="String">''</span>
<span class="-keyword">if</span> <span class="-variable">n</span> <span class="Operator">==</span> <span class="-variable">count</span><span class="-punctuation-delimiter">:</span> <span class="-variable"><span class="DiagnosticUnderlineWarn"><span class="DiagnosticUnderlineError">goto</span></span></span><span class="DiagnosticUnderlineWarn"> <span class="Operator">&amp;</span><span class="-variable"><span class="DiagnosticUnderlineError">fizz_end</span></span></span><span class="-variable"></span><span class="-punctuation-delimiter">;</span>
<span class="-variable">count</span> <span class="Operator">+=</span> <span class="Number">1</span>
<span class="-keyword">if</span> <span class="-variable">count</span> <span class="Operator">%</span> <span class="Number">3</span> <span class="Operator">==</span> <span class="Number">0</span><span class="-punctuation-delimiter">:</span> <span class="-variable"><span class="DiagnosticUnderlineWarn"><span class="DiagnosticUnderlineError">goto</span></span></span><span class="DiagnosticUnderlineWarn"> <span class="Operator">&amp;</span><span class="-variable"><span class="DiagnosticUnderlineError">fizz</span></span></span><span class="-variable"></span><span class="-punctuation-delimiter">;</span>
<span class="Comment"><span class="-spell">#LABEL buzz_check</span></span>
<span class="-keyword">if</span> <span class="-variable">count</span> <span class="Operator">%</span> <span class="Number">5</span> <span class="Operator">==</span> <span class="Number">0</span><span class="-punctuation-delimiter">:</span> <span class="-variable"><span class="DiagnosticUnderlineWarn"><span class="DiagnosticUnderlineError">goto</span></span></span><span class="DiagnosticUnderlineWarn"> <span class="Operator">&amp;</span><span class="-variable"><span class="DiagnosticUnderlineError">buzz</span></span></span><span class="-variable"></span><span class="-punctuation-delimiter">;</span>
<span class="-variable"><span class="DiagnosticUnderlineWarn"><span class="DiagnosticUnderlineError">goto</span></span></span><span class="DiagnosticUnderlineWarn"> <span class="Operator">&amp;</span><span class="-variable"><span class="DiagnosticUnderlineError">output</span></span></span><span class="-variable"></span><span class="-punctuation-delimiter">;</span>
<span class="Comment"><span class="-spell">#LABEL fizz</span></span>
<span class="-variable"><span class="Type">str</span></span> <span class="Operator">+=</span> <span class="String">'fizz'</span>
<span class="-variable"><span class="DiagnosticUnderlineWarn"><span class="DiagnosticUnderlineError">goto</span></span></span><span class="DiagnosticUnderlineWarn"> <span class="Operator">&amp;</span><span class="-variable"><span class="DiagnosticUnderlineError">buzz_check</span></span></span><span class="-variable"></span><span class="-punctuation-delimiter">;</span>
<span class="Comment"><span class="-spell">#LABEL buzz </span></span>
<span class="-variable"><span class="Type">str</span></span> <span class="Operator">+=</span> <span class="String">'buzz'</span>
<span class="Comment"><span class="-spell">#LABEL output</span></span>
<span class="-variable"><span class="-function"><span class="-function-builtin">print</span></span></span><span class="-punctuation-bracket">(</span><span class="-variable"><span class="Type">str</span></span> <span class="-keyword">if</span> <span class="-variable"><span class="Type">str</span></span> <span class="-keyword">else</span> <span class="-variable">count</span><span class="-punctuation-bracket">)</span>
<span class="-variable"><span class="DiagnosticUnderlineWarn"><span class="DiagnosticUnderlineError">goto</span></span></span><span class="DiagnosticUnderlineWarn"> <span class="Operator">&amp;</span><span class="-variable"><span class="DiagnosticUnderlineError">fizz_start</span></span></span><span class="-variable"></span><span class="-punctuation-delimiter">;</span>
<span class="Comment"><span class="-spell">#LABEL fizz_end </span></span>
<span class="-punctuation-delimiter">...</span>
<span class="-variable"><span class="-function">fizzbuzz</span></span><span class="-punctuation-bracket"><span class="MatchParen">(</span></span><span class="Number">100</span><span class="-punctuation-bracket"><span class="MatchParen">)</span></span>
</pre>
<hr>
<footnote>number of times the python interpreter segfaulted today: 7</footnote><br>
<footnote>syntax highlighting here is done via :TOhtml in vim. it should work?</footnote>

View File

@ -1,3 +1,5 @@
<!-- vim: ft=html -->
<!-- TITLE: re: post from 2024-07-24 10:12:19 --> <!-- TITLE: re: post from 2024-07-24 10:12:19 -->
<!-- DATE: 2024-07-28 11:25:45 --> <!-- DATE: 2024-07-28 11:25:45 -->
This issue has fixed itself. I do not know why. I did not do anything that would have fixed this. I am mildly perturbed. <!-- CATEGORIES: followup to prior post -->
this issue has fixed itself. it does not know why. it did not do anything that would have fixed this. it is mildly perturbed.

View File

@ -0,0 +1,42 @@
<!-- vim: ft=html -->
<!-- DATE: 2024-09-01 17:38:24 -->
<!-- TITLE: re: last thought; changes have been implemented -->
<!-- CATEGORIES: computers;change to site;followup to prior post -->
this site now uses <a href='https://git.natalieee.net/nat/htmlgen'>htmlgen</a> to generate html from common lisp and bash commands at compile time.
this has massively improved loading times on nearly all pages by cutting the number of bash commands that need to be used.
<hr>
examples:
<pre>
~/src/webbed-site λ hyperfine 'curl http://localhost:5002/html/random-thoughts-old.html' -m30 -M30
Benchmark 1: curl http://localhost:5002/html/random-thoughts-old.html
Time (mean ± σ): 2.654 s ± 0.030 s [User: 0.002 s, System: 0.003 s]
Range (min … max): 2.590 s … 2.728 s 30 runs
~/src/webbed-site λ hyperfine 'curl http://localhost:5002/html/random-thoughts.html' -m30 -M30
Benchmark 1: curl http://localhost:5002/html/random-thoughts.html
Time (mean ± σ): 11.4 ms ± 0.8 ms [User: 1.5 ms, System: 2.8 ms]
Range (min … max): 10.2 ms … 13.1 ms 30 runs
</pre>
and
<pre>
~/src/webbed-site λ hyperfine 'curl http://localhost:5002/html/natalie-info-old.html' -m30 -M30
Benchmark 1: curl http://localhost:5002/html/natalie-info-old.html
Time (mean ± σ): 528.3 ms ± 8.4 ms [User: 1.8 ms, System: 2.7 ms]
Range (min … max): 508.3 ms … 545.3 ms 30 runs
~/src/webbed-site λ hyperfine 'curl http://localhost:5002/html/natalie-info.html' -m30 -M30
Benchmark 1: curl http://localhost:5002/html/natalie-info.html
Time (mean ± σ): 16.7 ms ± 1.2 ms [User: 1.1 ms, System: 3.2 ms]
Range (min … max): 15.0 ms … 20.6 ms 30 runs
</pre>
<hr>
overall, this is a very significant performance improvement. now, it needs to update site-info again.<br>
unfortunately, it broke its blog. maybe it will fix it at some point.<br>
todo: edit html/blog/index.html to state this
<hr>
here is an amusing video of the code for this web page being broken during the migration to this system.
natalie did not actually fix this, it only removed the problematic code from the first post here.<br>
<video controls>
<source src='/files/thought-issues.mp4'/>
</video>

View File

@ -0,0 +1,4 @@
<!-- vim: ft=html -->
<!-- TITLE: note to itself: develop better sleep schedule -->
<!-- DATE: 2024-09-07 11:41:41 -->
<!-- CATEGORIES: no body -->

View File

@ -1,5 +1,7 @@
<!-- TITLE: my friend made me a shirt! --> <!-- vim: ft=html -->
<!-- TITLE: its friend made it a shirt! -->
<!-- DATE: 2024-08-09 20:22:38 --> <!-- DATE: 2024-08-09 20:22:38 -->
<!-- CATEGORIES: natalie being only one word that starts with "a" -->
<image-column-container> <image-column-container>
<image-container> <image-container>
<flex-column> <flex-column>
@ -8,14 +10,14 @@
</flex-column> </flex-column>
</image-container> </image-container>
<text-column> <text-column>
<h2>this is my favorite shirt!</h2> <h2>this is its favorite shirt!</h2>
<p>it is so good! and my friend made it!</p> <p>it is so good! and its friend made it!</p>
<p>it is purported to be made with a cnc vinyl cutter and a heat press.</p> <p>it is purported to be made with a cnc vinyl cutter and a heat press.</p>
<p> <p>
I very much enjoy the talgo 8 trainsets that are operated by amtrak here. it very much enjoys the talgo 8 trainsets that are operated by amtrak here.
I find the shared bogie design of the cars to be interesting. it finds the shared bogie design of the cars to be interesting.
I greatly enjoy the fact that I have fake talgo merchandise now. it greatly enjoys the fact that it has fake talgo merchandise now.
this friend and I rode this model of train to seattle somewhat recently, it was much nicer than the other amtrak rolling stock, which we rode on our return journey. this friend and natalie rode this model of train to seattle somewhat recently, it was much nicer than the other amtrak rolling stock, which the two of us rode on our return journey.
</p> </p>
</text-column> </text-column>
</image-column-container> </image-column-container>

View File

@ -1,17 +1,19 @@
<!-- TITLE: This website has a lot of technical debt and I should rewrite it --> <!-- vim: ft=html -->
<!-- TITLE: this website has a lot of technical debt and natalie should rewrite it -->
<!-- DATE: 2024-07-26 01:41:42 --> <!-- DATE: 2024-07-26 01:41:42 -->
This is horrible and bad. The html of just about every webpage is utter garbage because I am me. <!-- CATEGORIES: complaining;computers;rambling -->
Rewriting everything is going to be such a task, a task that I really should do. this is horrible and bad. the html of just about every webpage is utter garbage because the author is natalie.
rewriting everything is going to be such a task, a task that it really should do.
<br><br> <br><br>
Woo! woo!
<br><br> <br><br>
I should really unbodge the css at some point, too. Also, I need to remember to add a license and probably also a footer at some point. it should really unbodge the css at some point, too. also, it needs to remember to add a license and probably also a footer at some point.
<br><br> <br><br>
I have at the very least fixed some of the horrendous practices seen on this website by the implementation of nginx as a proxy service. it has at the very least fixed some of the horrendous practices seen on this website by the implementation of nginx as a proxy service.
Now, when not having a valid ssl cert (for a good reason, this will be fixed when there ceases to be a good reason) breaks my webserver (for some reason), not everything breaks! now, when not having a valid ssl cert (for a good reason, this will be fixed when there ceases to be a good reason) breaks its webserver (for some reason), not everything breaks!
hooray. hooray.
<br><br> <br><br>
I need to stop using an iframe for these, this page was designed prior to caving to my friends demand that I make my website "have" "consistent styling" and also "not use the whole page width for text," it needs to stop using an iframe for these, this page was designed prior to it caving to its friends demand that it makes its website "have" "consistent styling" and also "not use the whole page width for text,"
thus it used to be that these posts would take up the entire body width, but now there are just two margins. thus it used to be that these posts would take up the entire body width, but now there are just two margins.
<br><br> <br><br>
I should probably update site-info.html now. it should probably update site-info.html now.

View File

@ -0,0 +1,55 @@
<!-- vim: ft=html -->
<!-- TITLE: terminal emulators -->
<!-- DATE: 2024-09-06 23:18:59 -->
<!-- CATEGORIES: computers;rambling -->
natalie thinks that its requirements for a terminal emulator are very simple. apparently they are not.
<hr>
things that it does not want in a terminal:
<ul>
<li>startup times exceeding 75ms</li>
<li>memory leaks (while it was testing wezterm, the terminal process once got to 9.8 gigabytes of memory useage)</li>
<li>tab/multiplexing features. tmux exists.</li>
</ul>
things that it does want in a terminal emulator:
<ul>
<li>w3m image rendering</li>
<li>reasonable text rendering</li>
<li>resizeable such that text doesn't disappear</li>
</ul>
a nice bonus is a terminal being wayland native.
<hr>
prior to now, it had been using its own build of st.<br>
today, it got annoyed about text being lost when it shrinks the window.<br>
now, it will use foot.
<hr>
it is mildly annoyed by this because foot does not support w3m images, only sixel images.
it does not actually use w3m images very often, but it does like being able to look at pictures of the wuppertal schwebebahn using w3m in its terminal.
<hr>
on the other hand, foot's ability to have different fonts for different faces is very nice.
it likes its friend's bitmap font inspired by ibm selectric, but it also likes gohufont. now it gets to use both.
also, it keeps hearing about suckless developers being nazis.
it does not know if that's the case (it tends towards not believing such claims, given it has yet to see evidence of such a thing (not that it has researched the topic)), but if it is the case it would generally prefer not to use software made by people that would likely want it dead.
additionally, foot seems to be faster:
<pre>
~ λ hyperfine "st -e '/tmp/aoeu.sh'" -m30 -M30
Benchmark 1: st -e '/tmp/aoeu.sh'
Time (mean ± σ): 53.3 ms ± 41.5 ms [User: 19.7 ms, System: 10.9 ms]
Range (min … max): 27.4 ms … 233.4 ms 30 runs
</pre>
<pre>
~ λ hyperfine "foot '/tmp/aoeu.sh'" -m30 -M30
Benchmark 1: foot '/tmp/aoeu.sh'
Time (mean ± σ): 25.3 ms ± 1.8 ms [User: 19.5 ms, System: 9.4 ms]
Range (min … max): 22.8 ms … 32.1 ms 30 runs
</pre>
this is even more apparent when using the client:
<pre>
~ (130) λ hyperfine "footclient '/tmp/aoeu.sh'" -m30 -M30
Benchmark 1: footclient '/tmp/aoeu.sh'
Time (mean ± σ): 10.9 ms ± 1.0 ms [User: 0.7 ms, System: 0.5 ms]
Range (min … max): 9.9 ms … 14.3 ms 30 runs
</pre>
<hr>
addendum as of 2024-09-07 06:13:54:
<br>
foot supports the relevant escape codes for vim's spell hlgroups. this is ideal as now misspelled words are underlined in red, whereas improperly capitalized words are underlined in yellow.

View File

@ -1,5 +1,7 @@
<!-- TITLE: things I should do --> <!-- vim: ft=html -->
<!-- TITLE: things it should do -->
<!-- DATE: 2024-08-09 17:22:38 --> <!-- DATE: 2024-08-09 17:22:38 -->
<!-- CATEGORIES: irregular lists -->
<h2>things to do:</h2> <h2>things to do:</h2>
<ul> <ul>
<li>send email</li> <li>send email</li>
@ -10,12 +12,12 @@
<li>relocate moth</li> <li>relocate moth</li>
<li>per location config</li> <li>per location config</li>
<li>make thought posts be managed by a system other than git, such that each thought does not require a new commit</li> <li>make thought posts be managed by a system other than git, such that each thought does not require a new commit</li>
<li>make it harder to press the key that puts my keyboard in to bootloader mode</li> <li>make it harder to press the key that puts its keyboard in to bootloader mode</li>
</ul> </ul>
<h2>things I have done:</h2> <h2>things it has done:</h2>
<ul> <ul>
<li>tidy</li> <li>tidy</li>
<li>move server source code to its own git repository seperate from this website, and bestow upon it a reasonable name.</li> <li>move server source code to its own git repository seperate from this website, and bestow upon it a reasonable name.</li>
<li>add more support metadata tags to thought posts</li> <li>add more support metadata tags to thought posts</li>
<li>make thoughts render in chronological order of creation date, which I am not convinced they do.</li> <li>make thoughts render in chronological order of creation date, which it is not convinced they do.</li>
</ul> </ul>

View File

@ -1,15 +1,22 @@
<!-- vim: ft=html -->
<!-- TITLE: wow! --> <!-- TITLE: wow! -->
<!-- DATE: 2024-07-23 20:26:07 --> <!-- DATE: 2024-07-23 20:26:07 -->
This post is confusing and might be a marginally abnormal quine. in html*. Have fun.<br> <!-- CATEGORIES: change to site;computers -->
This is a thing that works now. this post has been edited to remove behavior that would cause breakage at compile time in compliance with changes to site architecture discussed in "2024-08-21 00:25:12: this site serves pages slowly and with asymetric lag times" and the following post. <br>
The format in which I can write these posts as well as how they work is reasonably interesting. one may think: "but posts don't get compiled". one would be correct, however they get included in documents at the compile time of those documents. <br>
I am most displeased due to my inability to figure out a reasonable means of having iframes such that their height is that of their respective content. this caused behavior where every time the /html/random-thoughts.html page was rendered, it would render approximately 8 times the content. not ideal. <br>
instead of fixing the issue with the lisp to html converter (dubiously possible) natalie has simply escaped the commands in this post. use your imagination if you are really that curious as to how it originally looked.
<br><br><br>
this post is confusing and might be a marginally abnormal quine. in html*. have fun.<br>
this is a thing that works now.
the format in which it can write these posts as well as how they work is reasonably interesting.
it is most displeased due to its inability to figure out a reasonable means of having iframes such that their height is that of their respective content.
below you will find the code for this web page. it is interesting, especially if you haven't read <a href=/html/site-info.html> the site info page</a>. below you will find the code for this web page. it is interesting, especially if you haven't read <a href=/html/site-info.html> the site info page</a>.
<pre><xmp>$[cat ./html/random-thoughts.html]</xmp></pre> <pre><xmp>$[echo "\$\[cat ./html/random-thoughts.html"]]</xmp></pre>
<br> <br>
you may ask: natalie[ee], why are you using iframes?<br> one may ask: natalie[ee], why are you using iframes?<br>
the answer to such a question would of course be "by using iframes, I may make a post contain bash commands as detailed on <a href=/html/site-info.html> the site info page</a> while also being arbitrarily invalid html. Plain text would make a valid thought post. the answer to such a question would of course be "by using iframes, natalie can may make a post contain bash commands as detailed on <a href=/html/site-info.html> the site info page</a> while also being arbitrarily invalid html. plain text would make a valid thought post.
<br> <br>
an example of such, this post: an example of such, this post:
<pre>$[cat ./html/thoughts/this-is-a-thought | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g']</pre> <pre>$[echo "\$\[cat ./html/thoughts/this-is-a-thought | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g'"]]</pre>
As can be observed, the title is set via a rather kludgy comment in the post file. This allows for filenames that differ from titles, which I implemented for no particular reason. as can be observed, the title is set via a rather kludgy comment in the post file. This allows for filenames that differ from titles, which natalie implemented for no particular reason.

View File

@ -0,0 +1,16 @@
<!-- vim: ft=html -->
<!-- TITLE: managing this website is complicated now -->
<!-- DATE: 2024-09-10 19:47:59 -->
<!-- CATEGORIES: complaining;computers;rambling -->
to keep this website up to date, natalie now has to manage three separate github repositories.
this is not ideal, but the previous system was not either.
<hr>
originally, this webloci was a singular repository. it found this to be annoying as the <a href='https://git.natalieee.net/nat/sludge'>webserver</a> is what it would classify as a different (but related) project, thus its separation to its own repository.
then, recently, it created another separate but related project to support this site, <a href='https://git.natalieee.net/nat/htmlgen'>htmlgen</a>.
the main repository for this site's only job is now managing these thought posts, as anything that htmlgen generates is in its .gitignore and instead managed by the natalieee.net branch of htmlgen.
<hr>
it should probably devise a better system of implementing this management. the main obstacle to its doing so is that it do not want to write these thought posts in lisp because doing so is more challenging than the "html" it uses here.
such complication is to be avoided as these thought posts are meant to be a reasonable transcription of the author's actual thoughts while typing them and having to think about lisp syntax would interfere with this goal.<br>
perhaps it should modify htmlgen such that it copies files that already end in .html to out/.
the problem then is that it would then need to devise a means of handling the site (media) files in a version controlled manner.
it supposes it could make a similar modification to htmlgen such that it also manages these files.

View File

@ -0,0 +1,24 @@
<!-- vim: ft=html -->
<!-- TITLE: this site serves pages slowly and with asymetric lag times -->
<!-- DATE: 2024-08-21 00:25:12 -->
<!-- CATEGORIES: complaining;computers -->
at the moment, page load times for some pages on this website are quite bad.
<pre>
curl http://localhost:5000/html/random-thoughts.html 0.00s user 0.01s system 0% cpu 2.889 total
</pre>
ridiculous. part of this is because of reasons which natalie is not aware of. the other part is because the way it generates webpages is not very performant.
the process explained <a href='/html/site-info.html'>here</a> is slow, because reading from streams is slow and bash is slow.
<br><br>
compare this two a request to a page that uses a small number of bash commands:
<pre>
curl http://localhost:5000/html/my-laptop.html 0.00s user 0.00s system 0% cpu 0.475 total
</pre>
<br>
the need for an improvement in page serving times is apparent.
accordingly, one must wonder how such a thing can be achieved.
analyzing the cases in which bash commands are used in the content of this site, we see two cases:<ol>
<li>bash commands are used as a macro for generating html that does not depend on external factors. ex: calls to img-caption.</li>
<li>bash cammands are used to generate html that does depend on external factors. ex: the comment system on the home page.</li>
</ol>
given that there are two cases, only one of which is required for content that changes how a page renders based on user input, natalie intends to implement a system such that it writes its webpages in a language that will compile to html, and on every update to its website's content simply rebuild these files.
this allows for bash commands currently used to generate static html to be replaced by something that will be executed at compile time such that the only bash commands executed at runtime are those that interact with the state of the website.

View File

@ -0,0 +1,15 @@
<!-- TITLE: why is it it? -->
<!-- DATE: 2024-11-05 15:11:14 -->
<!-- CATEGORIES: natalie information -->
<!-- vim: ft=html -->
<blockquote>
why is it it?
</blockquote>
it is asked something vaguely similar to this with notable enough frequency to justify writing an explanation that it can link to for all future instances of such a query.
it is it for about 3 reasons:
<ol>
<li>it thinks the grammatical implications of not using first or second perspective pronouns are neat</li>
<li>it would rather be an object than a person</li>
<li>its internal monologue is just sort of like that. this makes speaking "normally" annoying because it needs to pass internal thoughts through a translation layer to speak "normally" (with standard perspective pronouns). it thought this was how most things thought. recently it was informed that most things do not think that way. following this, it decided to give up on translating its internal monologue to first or second perspective.$[make-footnote 'when referring to others, must the reader consult their internal lookup table that maps entities to pronouns? it has been told that this is also an irregular means of thinking.']</li>
</ol>
$[put-footnotes]

View File

@ -1,14 +1,16 @@
<!-- vim: ft=html -->
<!-- TITLE: why is wireless headphone firmware so bad? --> <!-- TITLE: why is wireless headphone firmware so bad? -->
<!-- DATE: 2024-07-29 00:26:54 --> <!-- DATE: 2024-07-29 00:26:54 -->
I am writing this at 12am on a termux session on my phone, on a bus home from my friend's house. that is neat. <!-- CATEGORIES: complaining;computers;rambling -->
it is writing this at 12:30am on a termux session on its phone, on a bus home from its friend's house. it will probably be formatted poorly.
<br> <br>
<br> <br>
My current headphones, and all the wireless ones I have ever had have used what can only be described as the worse firmware. why is this? how is it possible that there are 0 headphone firmware engineers that are competent? I do not understand. its current headphones, and all the wireless ones it has ever had have used what can only be described as the worst firmware. why is this? how is it possible that there are 0 headphone firmware engineers that are competent? it does not understand.
<br> <br>
<br> <br>
My headphones:<ul its headphones:<ul>
<li>repeat "disconnected" infinitely at random intervals when disconnected from a device, or just when they feel like it. they do not cease unless power cycled.</li> <li>repeat "disconnected" infinitely at random intervals when disconnected from a device, or just when they feel like it. they do not cease unless power cycled.</li>
<li>always report a charge of 80% over bluetooth.</li> <li>always report a charge of 80% over bluetooth.</li>
<li>only report their charge when low sometimes. there have been exactly three instances in which they have given a low battery warning prior to powering off</li> <li>inconsistently announce low batteries. there have been exactly three instances in which they have given a low battery warning prior to powering off</li>
</ul> </ul>
sorry if formatting bad. phone. sorry if formatting bad. phone.

View File

@ -0,0 +1,33 @@
<!-- TITLE: {blog,random-thoughts} deprecation -->
<!-- DATE: 2024-10-31 12:43:27 -->
<!-- CATEGORIES: change to site -->
<!-- vim: ft=html -->
it rewrote the thought viewing interface. it is now comically slow, but a 2.3 second page load time really isn't that bad.
upon seeing the source code for the new interface ($[make-link "/html/view-thought.html"], replacing $[make-link "/html/random-thoughts.html"]), it is sure one will understand why it is so slow.
<pre>
<span class="-punctuation-bracket"><span class="MatchParen">(</span></span><span class="-function-macro">defun</span> <span class="-variable"><span class="-function">html</span></span> <span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span>
<span class="-punctuation-bracket">(</span><span class="-variable">page</span> <span class="String">&quot;$[echo $][test \&quot;$(echo '{' 'thought' '}' | sed 's/ //g')\&quot; != '{thought}' &amp;&amp; echo '{thought}' || echo thoughts index]&quot;</span>
<span class="-string-escape">`</span><span class="-punctuation-bracket">(</span><span class="-variable">section</span> <span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span>
<span class="String">&quot;$[echo $][echo &gt; /tmp/footnote_count]&quot;</span>
<span class="-punctuation-bracket">(</span><span class="-variable">h1</span> <span class="-punctuation-bracket">(</span><span class="SpecialChar"><span class="-punctuation-special">:</span>style</span> <span class="String">&quot;display: $[echo $][test \&quot;$(echo '{' 'thought' '}' | sed 's/ //g')\&quot; != '{thought}' &amp;&amp; echo block || echo none]&quot;</span><span class="-punctuation-bracket">)</span> <span class="String">&quot;$[echo $][cat ./html/thoughts/$(basename '{thought}') | grep '&lt;!-- TITLE:' | sed 's/&lt;!-- TITLE://; s/--&gt;//']&quot;</span><span class="-punctuation-bracket">)</span>
<span class="-punctuation-bracket">(</span><span class="-variable">div</span> <span class="-punctuation-bracket">(</span><span class="SpecialChar"><span class="-punctuation-special">:</span>style</span> <span class="String">&quot;height: 0; margin-top: 5px; justify-content: space-between; align-items: center; display: $[echo $][test \&quot;$(echo '{' 'thought' '}' | sed 's/ //g')\&quot; != '{thought}' &amp;&amp; echo flex || echo none;]&quot;</span><span class="-punctuation-bracket">)</span>
<span class="-punctuation-bracket">(</span><span class="-variable">p</span> <span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span> <span class="String">&quot;$[echo $][cat ./html/thoughts/$(basename '{thought}') | grep '&lt;!-- DATE:' | sed 's/&lt;!-- DATE://; s/--&gt;//']&quot;</span><span class="-punctuation-bracket">)</span>
<span class="-punctuation-bracket">(</span><span class="-variable">p</span> <span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span> <span class="String">&quot;categories: $[echo $][cat ./html/thoughts/$(basename '{thought}') | grep '&lt;!-- CATEGORIES: ' | sed 's/&lt;!-- CATEGORIES: //; s/--&gt;//' | awk -F';' '{ for (i=1; i&lt;=NF; i++) { sub(/^ +| +$/, \&quot;\&quot;, $i); if ($i != \&quot;\&quot;) printf \&quot;&lt;a href=\\\&quot;?filter-category=%s\\\&quot;&gt;%s&lt;/a&gt;, \&quot;, $i, $i } }' | sed 's/, $//']&quot;</span><span class="-punctuation-bracket">)</span><span class="-punctuation-bracket">)</span>
<span class="String">&quot;$[echo $][test \&quot;$(echo '{' 'thought' '}' | sed 's/ //g')\&quot; != '{thought}' &amp;&amp; echo '&lt;br&gt;' || true]&quot;</span>
<span class="-punctuation-bracket">(</span><span class="-variable">div</span> <span class="-punctuation-bracket">(</span><span class="-punctuation-bracket">)</span> <span class="String">&quot;$[echo $][include \&quot;./html/thoughts/$(basename '{thought}')\&quot;]&quot;</span><span class="-punctuation-bracket">)</span>
<span class="String">&quot;$[echo $][test \&quot;$(echo '{' 'thought' '}' | sed 's/ //g')\&quot; != '{thought}' || echo '&lt;h1&gt;posts:&lt;/h1&gt;']&quot;</span>
<span class="String">&quot;$[echo $][test \&quot;$(echo '{' 'filter-category' '}' | sed 's/ //g')\&quot; != '{filter-category}' || test \&quot;$(echo '{' 'thought' '}' | sed 's/ //g')\&quot; != '{thought}' || (ls ./html/thoughts | while read -r file; do echo \&quot;&lt;div&gt;$(cat ./html/thoughts/$file | grep '&lt;!-- DATE:' | sed 's/&lt;!-- DATE://; s/--&gt;//') &lt;a href=?thought=$file&gt;$(cat ./html/thoughts/$file | grep '&lt;!-- TITLE:' | sed 's/&lt;!-- TITLE://; s/--&gt;//')&lt;/a&gt;&lt;br&gt;categories: $(cat ./html/thoughts/$file | grep '&lt;!-- CATEGORIES: ' | sed 's/&lt;!-- CATEGORIES: //; s/--&gt;//' | awk -F';' '{ for (i=1; i&lt;=NF; i++) { sub(/^ +| +$/, \&quot;\&quot;, $i); if ($i != \&quot;\&quot;) printf \&quot;&lt;a href=\\\&quot;?filter-category=%s\\\&quot;&gt;%s&lt;/a&gt;, \&quot;, $i, $i } }' | sed 's/, $//')&lt;/div&gt;\&quot;; done | sort --numeric --reverse)]&quot;</span>
<span class="String">&quot;$[echo $][test \&quot;$(echo '{' 'filter-category' '}' | sed 's/ //g')\&quot; != '{filter-category}' &amp;&amp; test \&quot;$(echo '{' 'thought' '}' | sed 's/ //g')\&quot; != '{thought}' || (ls ./html/thoughts | while read -r file; do grep '&lt;!-- CATEGORIES: ' ./html/thoughts/$file | grep '{filter-category}' &amp;&amp; echo \&quot;&lt;div&gt;$(cat ./html/thoughts/$file | grep '&lt;!-- DATE:' | sed 's/&lt;!-- DATE://; s/--&gt;//') &lt;a href=?thought=$file&gt;$(cat ./html/thoughts/$file | grep '&lt;!-- TITLE:' | sed 's/&lt;!-- TITLE://; s/--&gt;//')&lt;/a&gt;&lt;br&gt;categories: $(cat ./html/thoughts/$file | grep '&lt;!-- CATEGORIES: ' | sed 's/&lt;!-- CATEGORIES: //; s/--&gt;//' | awk -F';' '{ for (i=1; i&lt;=NF; i++) { sub(/^ +| +$/, \&quot;\&quot;, $i); if ($i != \&quot;\&quot;) printf \&quot;&lt;a href=\\\&quot;?filter-category=%s\\\&quot;&gt;%s&lt;/a&gt;, \&quot;, $i, $i } }' | sed 's/, $//')&lt;/div&gt;\&quot;; done | sort --numeric --reverse)]&quot;</span><span class="-punctuation-bracket">)</span><span class="-punctuation-bracket">)</span><span class="-punctuation-bracket"><span class="MatchParen">)</span></span>
</pre>
bash is very slow. they should make bash, but with a JIT compiler. maybe natalie[ee] will invent a syntax for running lua code serverside instead of bash.
it has been thinking of rewriting sludge in lua, anyways.
<hr>
ignoring the prior tangent, it has decided it will never fix the blog. this will function as the new blog (which it is basically doing already). the old thought viewing interface will no longer be maintained, but will probably still mostly function.
<hr>
<pre>
~ λ hyperfine -m30 -M30 'curl https://natalieee.net/html/view-thought.html'
Benchmark 1: curl https://natalieee.net/html/view-thought.html
Time (mean ± σ): 2.354 s ± 0.170 s [User: 0.011 s, System: 0.006 s]
Range (min … max): 2.147 s … 2.964 s 30 runs
</pre>
amusing.

42
robots.txt Normal file
View File

@ -0,0 +1,42 @@
User-agent: AI2Bot
User-agent: Ai2Bot-Dolma
User-agent: Amazonbot
User-agent: anthropic-ai
User-agent: Applebot
User-agent: Applebot-Extended
User-agent: Bytespider
User-agent: CCBot
User-agent: ChatGPT-User
User-agent: Claude-Web
User-agent: ClaudeBot
User-agent: cohere-ai
User-agent: Diffbot
User-agent: DuckAssistBot
User-agent: FacebookBot
User-agent: facebookexternalhit
User-agent: FriendlyCrawler
User-agent: Google-Extended
User-agent: GoogleOther
User-agent: GoogleOther-Image
User-agent: GoogleOther-Video
User-agent: GPTBot
User-agent: iaskspider/2.0
User-agent: ICC-Crawler
User-agent: ImagesiftBot
User-agent: img2dataset
User-agent: ISSCyberRiskCrawler
User-agent: Kangaroo Bot
User-agent: Meta-ExternalAgent
User-agent: Meta-ExternalFetcher
User-agent: OAI-SearchBot
User-agent: omgili
User-agent: omgilibot
User-agent: PerplexityBot
User-agent: PetalBot
User-agent: Scrapy
User-agent: Sidetrade indexer bot
User-agent: Timpibot
User-agent: VelenPublicWebCrawler
User-agent: Webzio-Extended
User-agent: YouBot
Disallow: /

7
scripts/add-following-88x31s Executable file
View File

@ -0,0 +1,7 @@
toot following 0x6e6174 | cut -d' ' -f2 | while read -r account; do
url="$(toot whois $account | grep -i site -A1 | grep -E 'https?://')/.well-known/button.json";
[ -n "${url}" ] && response="$(curl -s -o /dev/null -w '%{http_code}' "${url}")";
[ "$response" -eq "200" ] && body="$(curl -s "${url}" | jq -r '.default as $default | .buttons[] | select(.id == $default) | "<a href=\"\(.link)\" id=\"\(.id)\"><img src=\"\(.uri)\" alt=\"\(.alt)\"></a>"' 2>/dev/null)"
[ -n "${body}" ] && echo "${body}" > ./files/88x31/$(echo $url | sed 's/https:\/\///g; s/.well-known\/button.json//; s/\//-/g; s/.$//').html
body=''
done

View File

@ -1,3 +1,8 @@
#!/bin/sh #!/bin/sh
python3 -u -c "import sludge.src.lib.content; print(sludge.src.lib.content.parse_file('$1'))" output="$(python3 -u -c "import sludge.src.lib.content; print(sludge.src.lib.content.parse_file('$1'))")"
if [ -z "${2}" ]; then
echo "${output}" | sed "${2}"
else
echo "${output}"
fi

5
scripts/make-footnote Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
id="$(wc -l /tmp/footnote_count | cut -d' ' -f1 | tr -d '\n')"
echo -n "<sup>[<a id=\"${id}_backref\" href=\"#${id}_ref\">${id}</a>]</sup>"
echo "<br><footnote style=\"margin: 0\" id=\"${id}_ref\">${1}<sup>[<a href=\"#${id}_backref\">${id}</a>]</sup></footnote>" >> /tmp/footnotes
echo ' ' >> /tmp/footnote_count

View File

@ -1 +1,5 @@
echo "<a href='$1'>$1</a>" if [ -z "${2}" ]; then
echo "<a href='$1'>$1</a>"
else
echo "<a href='$1'>$2</a>"
fi

3
scripts/put-footnotes Executable file
View File

@ -0,0 +1,3 @@
#!/bin/sh
cat /tmp/footnotes
echo > /tmp/footnotes

13855
style.css

File diff suppressed because it is too large Load Diff