add a tagging system to the website

This commit is contained in:
りき萌 2025-08-24 13:18:51 +02:00
parent 701da6bc4b
commit e1b6578b2a
97 changed files with 1025 additions and 979 deletions

11
content/_treehouse/404.dj Normal file
View file

@ -0,0 +1,11 @@
title = "404"
+++
Seems like what you're looking for isn't here.\
Perhaps you pasted in an invalid URL, perhaps it has been removed.\
Perhaps it was never written in the first place.
Care to [go back to the index][page:index]?
~Please feel free to report this if you think you've found a bug.~

View file

@ -1,5 +1,7 @@
%% title = "who that! (about me)"
%% id = "b?01J0KRPMV7SS48B64BFCJZK7VQ"
title = "who that! (about me)"
visibility = "Private"
tags = ["all", "meow"]
% id = "01J09B2BZXJ989S2SGWBNZ397C"
+ my name's *riki!*

View file

@ -1,4 +1,6 @@
title = "Iterating on design for code blocks"
id = "b?01K39ZH9DSF8Q13V47V42HNM3B"
tags = ["all", "design"]
+++

View file

@ -1,4 +1,6 @@
%% title = "animations & perception of sluggishness"
%% id = "b?01JEPCD4EPZJ2ACJX9J15ZBFSG"
title = "animations & perception of sluggishness"
tags = ["all", "design"]
% id = "01JEPBVCJXC6NBJZ90JBHNYKGR"
- there's a thing I always do with my computing devices: I make the animations faster than default.
@ -8,7 +10,7 @@
I have my Transition animation, Window animation, and Animator duration scales set to .5x.
% id = "01JEPBVCJXMC2Q0ZDE64YT991T"
+ on GNOME, you can do that by installing [Just Perfection](https://extensions.gnome.org/extension/3843/just-perfection/).
+ on GNOME, you can do that by installing [Just Perfection](https://extensions.gnome.org/extension/3843/just-perfection/).
% id = "01JEPBVCJXYWY1Q5372NBJREXD"
- here's where in the config panel you can find the relevant setting, as of writing this:
@ -46,7 +48,7 @@ I can move my mouse around quite quickly, and the quicker something appears in m
% id = "01JEPBVCJXJ87A3KDJM4MK2JJ7"
- looking at the statistics they managed to collect, I score pretty well in terms of reaction time, and pretty average in terms of aiming speed.
% id = "01JEPBVCJXJTZYE51PVYEDG0DV"
- take these with a grain of salt though, because they do not correlate these stats with anything (e.g. demographics), and the aim trainer is apparently "new."

View file

@ -1,4 +1,6 @@
%% title = "on digital textures"
%% id = "b?01HQ8KV8T8GRCVFDJ3EP6QE163"
title = "on digital textures"
tags = ["all", "design"]
% id = "01HQ8JHZ5NP1K7PHW4MJQS65ND"
- this is not about textures in the graphics programming sort of way. this is about textures in the _you can feel it under your fingers_ way

View file

@ -1,4 +1,6 @@
%% title = "design for the free soul"
%% id = "b?01JG6Y6JNRQA4SSK3TEZ0RRTEB"
title = "design for the free soul"
tags = ["all", "design", "shower"]
% id = "01JG6Y2YWD4JF34E64W1GK583J"
- as I'm writing this, I'm sitting in the passenger seat of a car, with my girlfriend driving us home.
@ -10,7 +12,7 @@
% id = "01JG6Y2YWDWR5A66J4JD4WV1J1"
- a thought surfaces in my head... "_this car is built like a frickin' Evangelion._"
% id = "01JG6Y2YWDPANQNMJ749RSN0YE"
- armoured to shield you from the elements, protect you from crashes, and provide a comfortable driving experience.

View file

@ -1,4 +1,6 @@
%% title = "idea: freeing the hobby corners"
%% id = "b?01JHGYTZN196N51ZBS4MZGHJ73"
title = "idea: freeing the hobby corners"
tags = ["all", "design", "treehouse"]
% id = "01JHGX51XQMBYYQ5VCV427N169"
- also known as, _freehouse_.

View file

@ -1,4 +1,6 @@
%% title = "maybe don't use sidebars on your website"
%% id = "b?01HR9ZTS8RS4VJNJYSNRQYSKHZ"
title = "maybe don't use sidebars on your website"
tags = ["all", "design"]
% id = "01HR9ZTS6PHTK6VRBF7S0M6MZ7"
- imagine if this page had a distracting bunch of text to the right of regular content. or even worse, advertisements.

View file

@ -1,4 +1,6 @@
%% title = "touch panels"
%% id = "b?01JE75N3B0Y9H53TMJJV7MJY9V"
title = "touch panels"
tags = ["all", "design"]
% id = "01JE246DXAKY4V4S49576JG0P9"
- 2024\. it seems like you can't go on without devices that have capacitive touch panels.
@ -63,7 +65,7 @@
% id = "01JE246DXAETP3Z6G2K31QD1XG"
- instead of something obvious, here's what happens:
% id = "01JE246DXAZ1DC9PCCX2ESRCVZ"
- _when the time left is `0:00` (or when the timer's unset)_, pushing `+` sets the timer to `10:00`, _but_ you can also push `-` to set the timer to `5:00`.
@ -83,7 +85,7 @@
% id = "01JE246DXA13DS8VSC73B64RYN"
+ at best I need 30 seconds, but that is still very sporadic...
% id = "01JE246DXAQKRC5Q0SD0HTSTAP"
- [sencha][] leaves can be infused up to about three times before the taste starts to diminish.
my first brew is 1 minute, the second is 1 minute 30 seconds, and the third is 2 minutes.
@ -152,7 +154,7 @@
% id = "01JE27CBDAWT5RBPVCHWTR30CA"
- now this one I totally get why it _should_ be a touch panel---which doesn't make it any less annoying, but yeah.
% id = "01JE27CBDA8X2FW6CG59WNJXQM"
- UX-wise it's much better to be able to place your cutting board on any part of the surface, _provided it's dry of course_, than having to avoid any buttons annoyingly protruding out its top.

14
content/doc.dj Normal file
View file

@ -0,0 +1,14 @@
title = "Document ID"
id = "doc?2025-08-24-doc"
+++
If you've stumbled upon this page, this means you followed the URL stored in the `<id>` field inside an Atom feed `<entry>`.
I can't blame you.
It _is_ a URL after all.
But the post you're looking for isn't here, as the `https://liquidex.house/doc` namespace is reserved for document IDs, and does not resolve to actual documents.
If your feed reader led you here, it is broken, because `<id>`s are *not meant to be followed.*
To read a post, follow the `<link rel="alternate" type="text/html">` link instead!

View file

@ -1,4 +1,6 @@
title = "A string formatting library in 65 lines of C++"
id = "b?01K39HT2MW0JWTP5MNH1CHGV2Y"
tags = ["all", "programming", "cxx"]
+++

View file

@ -1,4 +1,6 @@
title = "furry! —w—"
id = "b?01K05F3E3DN1PY9ZWN98ZE5HVV"
tags = ["all", "shower"]
+++

View file

@ -1,4 +1,6 @@
%% title = "furry! —w—"
%% id = "b?01JCGVBXW42S8G91SGAKYCQZE1"
title = "furry! —w—"
tags = ["all", "shower"]
% id = "01JCGVBXW35X3965J2MJQH1AFY"
- I like fur!
@ -78,7 +80,7 @@ it's really pleasant to the touch.
% id = "01JCGVBXW3GB041DMXFCWGQK23"
- but the customisation options are just so boooring! everybody looks pretty much the same.
% id = "01JCGVBXW3XQJBGZEJXSW7SET1"
+ you get to customise your shape and color of your hair, but not the size and placement of your ears, or the level and color of your floof?
@ -127,7 +129,7 @@ it's really pleasant to the touch.
% id = "01JCGVBXW3JBY0MSFMKYF2H2WQ"
- why _of course_ furries are not harmful you dumbass!
what even made you think that?
% id = "01JCGVBXW3XMBF58FSAX1BH6TB"
- maybe it's time to swim out of there before the pressure crushes you?

View file

@ -1,4 +1,6 @@
%% title = "reflections on Minecraft"
%% id = "b?01JGSNTVGFX416HFWKFYKR9HZM"
title = "reflections on Minecraft"
tags = ["all", "games"]
% id = "01JGRJPSTR8SPPTVCGCP26YGF7"
- Minecraft has been with me for around 14 years by now; a majority of my life! I first started playing around beta `1.3_01`.
@ -91,7 +93,7 @@
% id = "01JGSC4K515MSY1K9Z2AJXNJER"
- I mean, coming across 3 End Portals and seeing the portal room is glitched is kind of funny, but...
it also feels like a bit of an ass move once you know the full story, doesn't it.
% id = "01JGRJPSTRNMYAKWT96Q2N2JCM"
@ -231,7 +233,7 @@
% id = "01JGSA36C2RPJ1HYF8RTF2M5N4"
- there needs to be a non-tool item next to the axe, so that you can break leaves without using up your axe's durability.
that's food, because hunger in this game is a bitch.
% id = "01JGSMFMQVCF8FHMX18DQG22R4"
- I opted for items on _both_ sides, because I like the fact that I can scroll either up _or_ down to put away my axe, and it works equally well.
@ -389,7 +391,7 @@
% id = "01JGRNC1F4946XGCASYXSNVC4M"
- #### graffiti (31 December)
on New Year's Eve, we built _this_ with [ezioleq][def:person/ezioleq]:
![the boykisser on a map][pic:01JGRW9M3E0YNBY0SN6YT1PN0N]
@ -416,30 +418,30 @@
![][pic:01JGSDKAQ870V71XV9SSNE50R8]
obviously, there's one in my bedroom.
![][pic:01JGSDKWCET10GM0FD5M751VRH]
there's one on the train station... the sign reads "SOUTH CENTRE."
![][pic:01JGSDMD581MF4MRTAWG376FGY]
on the tree in the town square.
![][pic:01JGSDN6XF8QWGEKSR4A944SXK]
on the ceiling in Olek's bedroom.
![][pic:01JGSDNRT56D1AC8W4CKT5HDFP]
in a friend's house.
though, it seems like his is Australian.
![][pic:01JGSDP9RBJ6B47TVGGBKPB306]
in someone's house.
must be Australian too.
![][pic:01JGSDPTY3Z0HW5V9DQNDWQR1W]
in another someone's house.
![][pic:01JGSDR74AQ4MKGC5J23KVTT9C]
in the walls of the [gord](https://en.wikipedia.org/wiki/Gord_%28archaeology%29) at the spawn.
![][pic:01JGSDRMYSBRZMAMHBAJ2QV4N0]
and on my treehouse, of course.
@ -447,13 +449,13 @@
% id = "01JGRNC1F44MMXE1ZP8X1C7HPJ"
- #### billboard (2 January)
the last thing I built was this.
![a huge billboard over the whole town saying COMES][pic:01JGRXJWQH689TJ4HXT00TTJ6G]
whoever knows what this is a reference to, congratulations!
myself, I hold no regrets.
% id = "01JGRNC1F479Y7MNFR41ESGG7J"
@ -502,9 +504,9 @@
- ![a powered rail loop connected to an upwards slope, with a lever that opens the loop. there are a bunch of signs around it.][pic:01JGSFCQBDN6V47SE8SC7WRMAN]
> POLISH BRANCH of CERN - accelerator
> PARTICLE ACCELERATOR
> HADRON COLLIDER
> ACCELERATION DOESN'T KILL YOU\

View file

@ -1,4 +1,6 @@
title = "header files are cool, actually"
id = "b?01K1Y3G5N1KGCN1E9B36QTYMSZ"
tags = ["all", "programming", "c", "cxx"]
+++

View file

@ -1,5 +1,5 @@
title = "riki's house"
include_feed = { name = "new", title = "Blog" }
include_feed = { tag = "all", title = "Blog" }
+++

View file

@ -1,4 +1,6 @@
%% title = "Radiohead - A Moon Shaped Pool"
%% id = "b?01H9JB094CHQHEYEBKBCHFFCKG"
title = "Radiohead - A Moon Shaped Pool"
tags = ["all", "music"]
% id = "01H9JB094C60Q6DR1E7SME7Y0N"
- buy: [Bandcamp](https://radiohead.bandcamp.com/album/a-moon-shaped-pool)

View file

@ -1,4 +1,6 @@
%% title = "Aphex Twin - Blue Calx"
%% id = "b?01JCY18RY6D3CXHQ0JQ56BZH60"
title = "Aphex Twin - Blue Calx"
tags = ["all", "music"]
% id = "01JCY18RY6T32XGTM21T6581Z5"
- overcoming [fear of the unknown][page:philosophy/fear-of-the-unknown], episode 1.

View file

@ -1,4 +1,6 @@
%% title = "the ListenBrainz data set"
%% id = "b?01J73BSWA15KHTQ21T0S14NZW0"
title = "the ListenBrainz data set"
tags = ["all", "programming", "music"]
% id = "01J73BSW7VS69RQ84XWRAEYEHV"
- I've been using [ListenBrainz](https://listenbrainz.org) as my primary way of keeping track of my listens for a couple years now---I

View file

@ -1,4 +1,6 @@
%% title = "the curious case of Amon Tobin's Creatures"
%% id = "b?01JBAGZAZ30K443QYPK0XBNZWM"
title = "the curious case of Amon Tobin's Creatures"
tags = ["all", "music"]
% id = "01JBAGT450TPYYB0W5Q3RB017W"
- I bought Amon Tobin's [Bricolage](https://amontobin.bandcamp.com/album/bricolage) way back in September last year, but only today noticed that my copy seemed to be... corrupted?

View file

@ -1,4 +1,6 @@
%% title = "Kettel - Dubio"
%% id = "b?01JQYKYRF2RRY2DEV2Z8MSYJ4F"
title = "Kettel - Dubio"
tags = ["all", "music"]
% id = "01JQYKNE7YW4VEQQZ9P3ZQEHRC"
- as _Dubio_ opens with its title track, I am taken into the mountains.

View file

@ -1,11 +1,13 @@
%% title = "The Flashbulb - Flacks / aBliss"
%% id = "b?01JHXVRT2HR6TXC2V9JG2XTZVB"
title = "The Flashbulb - Flacks / aBliss"
tags = ["all", "music"]
% id = "01JHXV738MT1DF4T4DQWJ16PED"
- walking in the mountains, you see flags waving in the distance...
% id = "01JHXV738M04MAFAY7XTQKSX9R"
- you take in the majesty of the rocky landscape around you.
% id = "01JHXVEPM9NHMFJND9GRPRQ89R"
- the difficulty of the hike makes your heart pound.

View file

@ -1,4 +1,6 @@
%% title = "Oneohtrix Point Never - I Don't Love Me Anymore"
%% id = "b?01J8ZP2EG9TM8320R9E3K1GQEC"
title = "Oneohtrix Point Never - I Don't Love Me Anymore"
tags = ["all", "music"]
% id = "01J8ZKEB7JNVWZY0CDR7Y3HRA6"
+ a track from Oneohtrix Point Never's _Magic Oneohtrix Point Never_. [bandcamp link](https://oneohtrixpointnever.bandcamp.com/album/magic-oneohtrix-point-never)
@ -7,7 +9,7 @@
- by the way I'm listening to Magic OPN right now as I'm writing this. _Tales from the Trash Stratum_ just started playing and
*(once again)*
I thought I'd gotten a notification on Discord.
I swear to fucking God, this shit gets me every time. xD

View file

@ -1,4 +1,6 @@
%% title = "Telefon Tel Aviv - Map of What Is Effortless"
%% id = "b?01H9R1NKBB7NCQM8GJ3907P7F7"
title = "Telefon Tel Aviv - Map of What Is Effortless"
tags = ["all", "music"]
% id = "01H9R1NKBBVMRYPK024ED8P1CH"
- buy: [Bandcamp](https://telefon-tel-aviv.bandcamp.com/album/map-of-what-is-effortless)

View file

@ -1,4 +1,6 @@
%% title = "Radiohead - OK Computer"
%% id = "b?01H969NN1ACXG26T2NHCM7BHYY"
title = "Radiohead - OK Computer"
tags = ["all", "music"]
% id = "01H969NN1ACMHAYB8QX7SNCVJC"
- buy: [Bandcamp](https://radiohead.bandcamp.com/album/ok-computer)

View file

@ -1,4 +1,6 @@
%% title = "Aphex Twin - Syro"
%% id = "b?01H9DQNG9ARCX91Z15MWTB0A6B"
title = "Aphex Twin - Syro"
tags = ["all", "music"]
% id = "01H9DQNG9AYRET7KY8SBXFCH98"
- buy: [Bandcamp](https://aphextwin.bandcamp.com/album/syro)

View file

@ -1,4 +1,6 @@
%% title = "Floating Points - Tilt Shift / Ablaze"
%% id = "b?01JK5SN2ZBDZTFZ27J3KNT4SQV"
title = "Floating Points - Tilt Shift / Ablaze"
tags = ["all", "music"]
% id = "01JK5SN2WBQ1Y4SR1BQGSKRAKG"
- the two last tracks on Floating Points's latest album, [_Cascade_](https://floatingpoints.bandcamp.com/album/cascade).

View file

@ -1,4 +1,6 @@
%% title = "fear of the unknown"
%% id = "b?01JCGVBXW39D0GJTZY53A25TXT"
title = "fear of the unknown"
tags = ["all", "shower"]
% id = "01JCGVBXW41374C1TEEYH8245B"
+ no matter how long you live, you will always live in fear.

View file

@ -1,4 +1,6 @@
%% title = "hedonic treadmill"
%% id = "b?01HFYZKREV93QY3K7KNNFSW90H"
title = "hedonic treadmill"
tags = ["all", "shower"]
% id = "01HFYZKREVV2CX1GYJQ18BJS78"
- a concept that's incredibly useful in keeping it cool

View file

@ -1,4 +1,6 @@
%% title = '"I build things"'
%% id = "b?01JBAK3T1ZSSTHRN6TTSXXBAKK"
title = '"I build things"'
tags = ["all", "shower"]
% id = "01JBAK3T1ZMTJS5A9Z5VFFQR0V"
- aka how to sound like the most boring software developer ever.

View file

@ -1,4 +1,6 @@
%% title = "in wisdom you become old"
%% id = "b?01J1Q8SBGFYKDATVF85XYWMSV2"
title = "in wisdom you become old"
tags = ["all", "shower"]
% id = "01J1Q8SBGFNS3ZSSA1QXN83SMH"
+ this is kind of weird, but recently I have noticed I no longer keep up with slang

View file

@ -1,4 +1,6 @@
%% title = "my weird stim: writing with light streaks"
%% id = "b?01JG55SF4FRRF9RDW9KMYHAECF"
title = "my weird stim: writing with light streaks"
tags = ["all", "shower"]
% id = "01JG55KYCYD0CHXQ582XTAHMP6"
- a long time ago my brain built up a [stim][] that it likes to perform when bored: I draw words with my eyes.

View file

@ -1,4 +1,6 @@
%% title = "on nicknames"
%% id = "b?01JBWHXTMKYRW5XXDJG9VQNF5E"
title = "on nicknames"
tags = ["all", "shower"]
% id = "01JBWHXTMKTDGDBATFM9H27KZK"
- my given name is Gabriel.
@ -148,7 +150,7 @@ sharing your real data online when you're a kid sounds like a _baaad_ idea.
% id = "01JBWHXTMK9QAJGHHM9VRQ02M3"
- also, while it supposedly helped me protect me as a kid, it also caused _so much_ unnecessary self-hate.
% id = "01JBWHXTMK4SMAMG4W61E02ZSV"
- it instilled [a fear of seeing pictures of myself](https://www.youtube.com/watch?v=aNKrcwOG-SE){.secret}.

View file

@ -1,11 +1,13 @@
%% title = "on responsibility & conformity"
%% id = "b?01JDJ0RH4DJCNS7TPCRZHRPSRF"
title = "on responsibility & conformity"
tags = ["all", "shower"]
% id = "01JDJ0RH4DTY60R2Y0Y3J9FH0W"
- most of us probably can't imagine holding a company talk on a tech conference while wearing a fursuit.
% id = "01JDJ0RH4DBDP937C7CB2CY5EP"
- I had this revelation today that it would be extremely funny if I did something like that, only for the thought of harsh reality to come knocking at my door.
% id = "01JDJ0RH4DVMQ6T3H7EQY86QCD"
- if you're giving a presentation on behalf of your company, you are _representing_ the company, so any clownage you pull will have negative consequences on the company's [PR]{title="public relations"}.
@ -57,7 +59,7 @@ what's wrong with speaking in a fluffy suit on a tech conference?
% id = "01JDJ0RH4DRQW5XR9N7M7QZXCV"
- there are cases where you _have_ to stay serious, where [life's on the line](https://www.youtube.com/watch?v=1QNoygm8bEY){.secret title="And therefur riki did not stay serious and did his usual secret music link shenaniganry, including a furry joke in this very sentence you're reading right now. Splendid."} and some could _fucking die or get permanently hurt_.
% id = "01JDJ0RH4D6FT1Y7M7XGBXM83A"
- but since our species's inception, we as humans have become more than just hunter-gatherers.
we partake in _culture_.

View file

@ -1,4 +1,6 @@
%% title = "nickname change!"
%% id = "b?01JGXQ5E8DHAEYFTHG0RB86VNE"
title = "nickname change!"
tags = ["all", "meow", "shower"]
% id = "01JGXMY094E9AGM67T7EXAW25Z"
- I'm changing my nickname from liquidex to *riki*!

View file

@ -1,4 +1,6 @@
%% title = "just shut up sometimes"
%% id = "b?01HREVZNAH3PMMN29C6HNFQ7P9"
title = "just shut up sometimes"
tags = ["all", "shower"]
% id = "01HREVZNAH8XFRMVB9G58TPV8R"
- I just caught myself writing a few paragraphs long comment on [Lobsters](https://lobste.rs) without really understanding what the author of the comment meant in the broader context of the discussion,

View file

@ -1,4 +1,6 @@
%% title = "Advent of Code feels"
%% id = "b?01JDZKAP3KT4AD36F6HPJTEM4Z"
title = "Advent of Code feels"
tags = ["all", "programming", "shower"]
% id = "01JDZKMFQZS2VVNQ3R9WDS81TS"
- I wonder if I'm the only one who can never get into [Advent of Code](https://adventofcode.com).
@ -35,7 +37,7 @@ there is always something to work on.
% id = "01JDZKMFQZP2723GMYB2HMJFR2"
- I like to build my software to solve real world problems---mostly my own, but I like to imagine it could one day become useful for someone else, too.
% id = "01JDZKMFQZWF0F0G6822298N5Z"
- egoistic altruism, y'know.
it's why all the code I write outside of work is open source.

View file

@ -1,4 +1,6 @@
%% title = "not quite buildless"
%% id = "b?01J7C1KBZ58BR21AVFA1PMWV68"
title = "not quite buildless"
tags = ["all", "programming", "treehouse"]
% id = "01J7BYKQGYPF50050K67N2MP1G"
- ...buildsome?
@ -56,7 +58,7 @@ enjoy!
% id = "01J7BYKQGY7QEAN677Q9AT4T0V"
- I'll put _probably_ the most interesting bit right at the start.
the treehouse is _not quite_ buildless.
% id = "01J7BYKQGYRV6TKEACZ0DXNDG4"
- one might even call it... buildsome?
I mean, it's not quite buildful, and definitely not buildless...?
@ -147,7 +149,7 @@ enjoy!
% id = "01J7BYKQGY0PR13G71PK163976"
- if I _wanted_ to implement incremental builds, I feel like the dependency tracking would get pretty hellish pretty quickly.
% id = "01J7BYKQGY75XN1HBVZ110D16P"
- say a `.tree` file uses the `include_static` template directive to include some file into itself.
now in addition to compiling the `.tree` file when it changes, I'd also need to recompile the `.tree` file when that `include`d`_static` file changes too---and that sort of dependency tracking is ripe for bugs as the codebase grows more complex!
@ -223,7 +225,7 @@ enjoy!
% id = "01J7EMBKN42WH0BKXKDQ020F8M"
- you can also provide source maps to transfer optimal minified sources by default, and let your browser's DevTools display your original sources to the user upon their request.
% id = "01J7EMJYX91P3RE3PEBM2M3MR1"
- the important part is that having _some_ form of readable sources _right on your page_ is really nice!
@ -237,7 +239,7 @@ enjoy!
- the reason is that I don't want to waste time testing my website separately on release mode, so having it behave differently in subtle ways means more bugs!
% id = "01J7BYKQGY6KJ6ZZX4EREEAB79"
- there are only two parts of the treehouse that behaves differently between debug and release mode.
- there are only two parts of the treehouse that behaves differently between debug and release mode.
% id = "01J7BYKQGYB4G0J7TZQCF4X7W6"
- generation speed, and...
@ -316,7 +318,7 @@ enjoy!
async fn back_up() -> String {
"".into()
}
}
```
% id = "01J7BYKQGYDY8E84BEM5V7MMGB"
@ -333,7 +335,7 @@ enjoy!
% id = "01J7BYKQGYVS4CZGVC4ZHGJ7KF"
- also, `tower-livereload` also has a couple disadvantages compared to the solution I've shown here.
% id = "01J7BYKQGY3P95RM10ZZGRP2Y3"
- it's slow, because it only polls the server's `/back-up` endpoint every second, which increases reload latency.
I've bumped that up to polling every 100ms in my script, because I don't like slow.
@ -377,7 +379,7 @@ enjoy!
% id = "01J7BYKQGYM9HD00VY2BVEZPZ0"
- _customized built-in elements_, which extend _any_ built-in element.
these are applied using the `is=""` attribute on a base built-in element, like `<li is="your-element"></li>`.
these are applied using the `is=""` attribute on a base built-in element, like `<li is="your-element"></li>`.
% id = "01J7BYKQGY90D6C0KF9CFSMF1A"
- unfortunately customized built-in elements are practically useless, because Safari doesn't implement them, [and doesn't even plan to do so](https://github.com/WICG/webcomponents/issues/509#issuecomment-222860736)...
@ -408,7 +410,7 @@ enjoy!
```
and off we go!
% id = "01J7BYKQGY6YE329DB9PMY8KNW"
- I've found a couple useful idioms for working with custom elements.
@ -476,7 +478,7 @@ enjoy!
% id = "01J7BYKQGYYBY9RDFJG8BP61QP"
- and that's it! the actual value of the `?cache` parameter is never interpreted by anyone, anyhow.
it's only there so that whenever something _does_ change, we change the URL, and the browser thinks that "hey, that's a different asset! gotta download it."
it's only there so that whenever something _does_ change, we change the URL, and the browser thinks that "hey, that's a different asset! gotta download it."
that way, the browser only ever downloads files that changed since your last visit.
@ -540,7 +542,7 @@ enjoy!
% id = "01J7C16RSZ7NHE5N3KV57NGWT0"
- okay cool we're getting somewhere,
% id = "01J7C16RSZQPMABF0SBDH1RHA7"
- "and then we could even cache that import map with a `?cache` parameter too---"
@ -589,10 +591,10 @@ enjoy!
% id = "01J7BYKQGYMMCAKQX9S8JCTJW6"
- as time went on though, I discovered another light markup language: [_Djot_](https://djot.net/), made by the same person who made Markdown, with _lots_ of lessons learned from his previous attempt.
% id = "01J7BYKQGYQQP0YSWA1TEHRB9S"
- I initially didn't wanna go through with it, because "_sigh_ am I really gonna have to rewrite my entire content to use Djot?"
% id = "01J7BYKQGYSKJNTB7BGKTED4S0"
+ but then I did it anyways, because life's too short to have to deal with poorly designed markup languages :hat_smug:
@ -638,7 +640,7 @@ enjoy!
% id = "01J7C16RSZAECM1G9CD57WX1M6"
- I am pushing into a string, that literally cannot fail! (other than with an OOM, but that's a panic)
% id = "01J7BYKQGYJMRC7DY7SNMAQ538"
- the HTML generation code got cleaner, because the crate I'm using---[`jotdown`](https://lib.rs/crates/jotdown)---does not use a callback for filling in broken links.
a pattern that's best known under the moniker "yeah, don't do that" in the Rust world.
@ -676,14 +678,14 @@ enjoy!
% id = "01J7BYKQGYV3H2WX6VVSR9EFEF"
- what's funny is that it dies dropping a `rustc-ice-YYYY-MM-DDTHH_MM_SS-NNNNN.txt` file into your current working directory, and combined with `cargo-watch` this has the super funny effect of generating tens of those files in the treehouse repo.
% id = "01J7C16RT0H84KPGJMBK1QT84E"
- I have forgotten to remove these before checking in at least once before.
I don't think I ever ended up pushing that commit though, so I can't show you... [but you can see the ICE I have stored in my local Git history here](/static/text/rustc-ice-2024-07-20T21_00_23-69819.txt).
% id = "01J7C16RT0R80J7KN516B06Q05"
- an annoying side effect is that to fix this, I have to `^C` out of `cargo-watch`, run `cargo clean`, run `cargo-watch` again, and wait until the whole project compiles.
% id = "01J7C16RT0XX4PZYRXAAV2M7P9"
- at least it's a debug build...

View file

@ -1,4 +1,6 @@
%% title = "prefix matches with C strings"
%% id = "b?01JCGAM553TJJCEJ96ADEWETQC"
title = "prefix matches with C strings"
tags = ["all", "programming", "c", "cxx"]
% id = "01JCGAM55352EF247HZ358BAJ8"
- one thing I realised while reading some code at work that worked with C strings: it's surprising how easy it is to match a prefix on a C string.

View file

@ -1,4 +1,6 @@
%% title = "C++ without Classes"
%% id = "b?01JN72M4EXSR6M120A6CW2D0X7"
title = "C++ without Classes"
tags = ["all", "programming", "cxx"]
% id = "01JN6EFWCPWY65AQ27BGFDT2DV"
- one thing I often see in people's code in C++ is putting _everything_ into a class.

View file

@ -1,4 +1,6 @@
%% title = "C++ syntactic pitfall: access modifiers as labels"
%% id = "b?01H9R1KJES6FC89NMC7J0FJT6P"
title = "C++ syntactic pitfall: access modifiers as labels"
tags = ["all", "programming", "cxx"]
% id = "01H9R1KJES39Z6RBCKY4E71PYD"
- although Java and C#'s approach to symbol privacy may be verbose, it has one great advantage: it is stateless.

View file

@ -1,4 +1,6 @@
%% title = "freeing C memory automatically using `std::unique_ptr` and `std::shared_ptr`"
%% id = "b?01J0VNHPTRNC1HFXAQ790Y1EZB"
title = "freeing C memory automatically using `std::unique_ptr` and `std::shared_ptr`"
tags = ["all", "programming", "cxx"]
% id = "01J0VN48B2E9WZ4QW0X69N2KB8"
- say you need to interface with a C library such as SDL2 in your C++ code

View file

@ -1,5 +1,7 @@
%% title = "haku - writing a little programming language for fun"
%% id = "b?01J4J5N6WZQ03VTB3TZ51J7QZK"
title = "haku - writing a little programming language for fun"
scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-programming.js"]
tags = ["all", "programming", "plt"]
% id = "01J3K8A0D1774SFDPKDK5G9GPV"
- I've had this idea on my mind as of late, of a little pure functional programming language that would run in your browser.
@ -85,7 +87,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program
| identifier | 9 | 21 | `s-expression` |
| ) | 21 | 22 | `)` |
| end of file | 22 | 22 | |
% id = "01J3K8A0D1GGQ292D4MQBCGHWC"
- to lex the input into tokens, we'll need to know the input string (of course), and where we currently are in the string.
@ -185,7 +187,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program
}
}
}
printTokens(`()((()))`);
```
@ -376,7 +378,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program
lexer.advance(state);
return "error";
};
};
```
% id = "01J3K8A0D1DKA8YCBCJVZXXGR4"
@ -859,7 +861,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program
```
that's... the same string.
% id = "01J3K8A0D1XP4FQB2HZR9GV5CJ"
- let's try something more complicated, with comments and such.
@ -887,10 +889,10 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program
% id = "01J3K8A0D10DRSP49WF8YH5WSH"
- of course this is hardly the _prettiest_ printer in the world.
% id = "01J3K8A0D1VCJ7TV6CN7M07N5J"
- for one, it does not even preserve your comments.
% id = "01J3K8A0D1K3M9223YM96PS68B"
- it does not add indentation either, it just blindly dumps a minimal S-expression into the console.
@ -950,7 +952,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program
% id = "01J3K8A0D1F4R8KPHETV9N08YP"
- it's definitely not how I would write a parser nowadays.
it's pretty similar, but the syntax tree structures are quite different - it doesn't use the [lazy parsing][branch:01J3K8A0D1FYBKJ6X2W17QAK3Z] trick I talked about before.
% id = "01J3K8A0D178J6W49AFCE9HEQ6"
- I mean, it's only a trick I learned last year!
@ -1008,7 +1010,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program
```
for now we'll leave it empty.
% id = "01J3NVV2RX2T5K473GGY3K5VBX"
- in the meantime, let's prepare a couple convenient little wrappers to run our code:
@ -1092,7 +1094,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program
{:program=haku}
```javascript
export const builtins = {};
treewalk.eval = (state, node) => {
switch (node.kind) {
case "integer":
@ -1862,7 +1864,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program
{:program=haku}
```javascript
treewalk.eval = (state, node) => {
treewalk.eval = (state, node) => {
switch (node.kind) {
case "integer":
let sourceString = state.input.substring(node.start, node.end);
@ -2032,7 +2034,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program
throw new Error(`unhandled node kind: ${node.kind}`);
}
};
builtins.fn = (state, node) => {
if (node.children.length != 3)
throw new Error("an `fn` must have an argument list and a result expression");

View file

@ -1,8 +1,10 @@
%% title = "JavaScript is not as bad as people make it out to be"
%% id = "b?01J293BFEBT15W0Z3XF1HEFGZT"
title = "JavaScript is not as bad as people make it out to be"
scripts = [
"treehouse/components/literate-programming.js",
"treehouse/vendor/codejar.js",
]
tags = ["all", "programming", "javascript", "plt"]
% id = "01J291S06DS12DCFTNKJ27BNSQ"
- _ooh I'm sure this one is gonna be really controversial but here I go_

View file

@ -1,4 +1,6 @@
%% title = "Lua - a scripting language you can like"
%% id = "b?01HRG3VN091V715A8T54QK5PVX"
title = "Lua - a scripting language you can like"
tags = ["all", "programming", "plt", "lua"]
% id = "01HRG2RJC1BATZJSGSSSF1XNFZ"
- TODO: this page could really use an interactive Lua interpreter. can we have that?

View file

@ -1,4 +1,6 @@
title = "Classes in Lua"
id = "b?01JKKQZRSG5ZRNH530D75E2660"
tags = ["all", "programming", "lua"]
+++

View file

@ -301,7 +301,7 @@ local Player = Entity:inherit()
```lua
local Cat = {}
-- We still need to override __index, so that the metatable we set in our own constructor
-- has our overridden `speak()` method.
-- has our overridden `speak()` method.
Cat.__index = Cat
-- To be able to call `Animal` methods from `Cat`, we set it as its metatable.
-- Remember that `Animal.__index == Animal`.
@ -380,7 +380,7 @@ local Player = Entity:inherit()
-- insert below the `end` of `function Class:inherit()`
-- By default, let's make the base `Class` impossible to instantiate.
-- This should catch bugs if a subclass forgets to override `initialize`.
-- This should catch bugs if a subclass forgets to override `initialize`.
function Class:initialize()
error("this class cannot be initialized")
end
@ -462,7 +462,7 @@ local Player = Entity:inherit()
% id = "01JKKQHG5DQW7G1HDWYGX4WEYC"
- our class library implements a Ruby-style `Object:new(args)` function for constructing new instances of our class.
Python however, uses the syntax `Object(args)` for constructing instances of objects.
Python however, uses the syntax `Object(args)` for constructing instances of objects.
can you think of a way to make our class library use the Python-style syntax?
% id = "01JKKQHG5D7QN029A3F1B6SYC2"

View file

@ -1,4 +1,6 @@
%% title = "places, or what is up with `*x` not always meaning the same thing in different contexts"
%% id = "b?01HY5R1ZW2PYZSSP2J2KAA23DA"
title = "places, or what is up with `*x` not always meaning the same thing in different contexts"
tags = ["all", "programming", "c", "cxx", "plt"]
% id = "01HY5R1ZV9DD7BV0F66Y0DHAEA"
- I recently got a question from my someone telling me they doesn't understand why `*x` does not read from the pointer `x` when on the left-hand side of an assignment.

View file

@ -1,4 +1,6 @@
%% title = "on changing the Firefox New Tab, and software freedom"
%% id = "b?01JX0GYB1D4W3A6FRPBG738N4F"
title = "on changing the Firefox New Tab, and software freedom"
tags = ["all", "programming"]
% id = "01JX0G5CN5H8S7S3M4619R112A"
- the date is 4th of June, 2025.
@ -69,7 +71,7 @@
"chrome_settings_overrides": {
"homepage": "index.html"
}
}
}
```
% id = "01JX0G5CN5SSANM732FB8M6ZSV"

View file

@ -1,4 +1,6 @@
%% title = "OR-types"
%% id = "b?01HTWNETT2S5NSBF3QR4HYA7HN"
title = "OR-types"
tags = ["all", "programming", "plt"]
% id = "01HTWN4XAD7C41X8XKRBFZMHJ8"
- last night I couldn't fall asleep because I was thinking how sites like [Anilist](https://anilist.co) implement their tag-based search systems.

View file

@ -1,4 +1,6 @@
%% title = "systems are just a bunch of code"
%% id = "b?01HV1DGFHZ65GJVQRSREKR67J9"
title = "systems are just a bunch of code"
tags = ["all", "programming", "shower"]
% id = "01HV1DGFGNV3DXD8A3CW2J4RZP"
- often enough I see people scared to dive deep into the internals of their favorite technologies

View file

@ -1,9 +1,11 @@
%% title = "tairu - an interactive exploration of 2D autotiling techniques"
%% id = "b?01HQ6G30PTVT5H0Z04VVRHEZQF"
title = "tairu - an interactive exploration of 2D autotiling techniques"
scripts = [
"treehouse/components/literate-programming.js",
"treehouse/vendor/codejar.js",
]
styles = ["page/tairu.css"]
tags = ["all", "programming", "graphics", "javascript"]
% id = "01HPD4XQPWM8ECT2QM6AT9YRWB"
- I remember since my early days doing programming, I've been interested in how games like Terraria handle automatically tiling their terrain.
@ -209,7 +211,7 @@ styles = ["page/tairu.css"]
borderWidth: 4,
});
```
{:program=tairu :placeholder=01HQ49TJZFMK719KSE16SG3F7B}
```output
```
@ -436,7 +438,7 @@ styles = ["page/tairu.css"]
```
{:program=tairu :placeholder=01HQ49X8Z57FNMN3E79FYF8CMG}
```output
```output
```
% id = "01HQ162WWA03JAGJYCT0DRZP24"
@ -461,7 +463,7 @@ styles = ["page/tairu.css"]
```
{:program=tairu :placeholder=01HQ49YDPQXYSAT5N6P241DG3C}
```output
```output
```
% id = "01HQ162WWAB0AYSPGB4AEVT03Z"
@ -490,7 +492,7 @@ styles = ["page/tairu.css"]
```
{:program=tairu :placeholder=01HQ49Z8JWR75D85DGHCB34K8E}
```output
```output
```
% id = "01HQ1K39AS4VDW7DVTAGQ03WFM"
@ -514,7 +516,7 @@ styles = ["page/tairu.css"]
% classes.branch = "tileset-four-to-eight-demo"
id = "01HQ1K39ASR81NWMW8Q0MF8QMP"
- enhance!
{% NOTE djot: I don't there's a way to achieve this in Djot alone %}
``` =html
<ul class="directions-square bend">
@ -599,7 +601,7 @@ styles = ["page/tairu.css"]
```
{:program=tairu :placeholder=01HQ4A01MPE6JT5ZZFEN9S635W}
```output
```output
```
% id = "01HQ1K39AS7CRBZ67N1VVHCVME"
@ -953,7 +955,7 @@ styles = ["page/tairu.css"]
```
{:program=tairu :placeholder=01HQ4A11RRXEQ850598GFBJN0B}
```output
```output
```
% id = "01HQ1M84GSCXTPGVPXY840WCQ6"
@ -984,7 +986,7 @@ new TilesetTileEditor({
```
{:program=tairu :placeholder=01HQ4A45WNAEJGCT2WDMQJHK14}
```output
```output
```
:nap: <!--

View file

@ -1,4 +1,6 @@
%% title = "composable virtual file systems"
%% id = "b?01JDJJSEWASRWJGKMBNYMFD9B5"
title = "composable virtual file systems"
tags = ["programming", "treehouse"]
% id = "01JDJGVC7BRZDSYTZCH0S357B8"
- you know what I hate?
@ -92,7 +94,7 @@ like... you know. a _virtual_ file system?
% id = "01JDJGVC7BPEW2NAT7XSB5F97E"
- first of all, from the perspective of the program, do we _really_ need to differentiate between directories and files?
% id = "01JDJGVC7BHQWZDS17DY0096F6"
- from a GUI design standpoint, they're a useful abstraction for us humans---the more concrete an object, the easier it is to grasp.
_files_ and _folders_ seem a lot more easy to grasp than abstract _entries_ which _may_ represent documents, folders, or both.
@ -201,7 +203,7 @@ like... you know. a _virtual_ file system?
% id = "01JDJGVC7BQZAY4TP1WG5N6QR3"
- having a design in mind, I thought it would be interesting to integrate it into a real project.
the treehouse seemed like the right thing to test it out on, since it's effectively a compiler---it transforms a set of source directories into a target directory.
% id = "01JDJH59SN5219QPGJPZS7FMA6"
- and I have to say: so far, I'm liking it!
@ -339,23 +341,23 @@ like... you know. a _virtual_ file system?
`Edit`s take many shapes and forms, but the most important one for us is `Write`: it allows you to write a file to the disk.
the other ones are for composing `Edit`s together into larger ones.
% id = "01JDJGVC7BCT46CXXVKMXATAA3"
- `Seq` can be used to implement transactions, where all edits have to succeed for the parent edit to be considered successful.
% id = "01JDJHDZ8XWEZAA94AW1VS4P53"
- I use this for writing backups.
if writing a backup fails, we wouldn't want to overwrite the original file, because we wouldn't be able to restore it!
% id = "01JDJGVC7B05H6079QHXAXC8Y4"
- `All` can be used to aggregate independent edits together and execute them in parallel.
% id = "01JDJGVC7BKXXJSWYTGX7XA979"
- `Dry` can be used to implement a `--dry-run` command, only printing an edit instead of applying it.
% id = "01JDJGVC7B7MNC3CA5DEP1HXM6"
+ `NoOp` can be used when you need to produce an `Edit`, but don't actually want to perform any operations.
% id = "01JDJGVC7BJRSMS1E4NQRVZ1H2"
- this runs contrary to [my opinion on `None` enums][branch:01HCG7KTGGAFS07QYJXZG6WHJJ], for one reason: would you rather have to handle `Option<Edit>` everywhere, or just assume whatever `Edit` you're being passed is valid?
@ -373,7 +375,7 @@ like... you know. a _virtual_ file system?
% id = "01JDJGVC7BGJQXTVZ6Z9BK12BG"
- of course then you cannot create directories.
% id = "01JDJGVC7B2JTWKJVEE1VP6P68"
- also, [TOCTOU](https://en.wikipedia.org/wiki/Time-of-check_to_time-of-use) bugs are a thing, but I disregard those as they don't really fit into a compiler's threat model.
@ -389,7 +391,7 @@ like... you know. a _virtual_ file system?
% id = "01JDJGVC7BCG0W3SWSYR647ZCC"
- `TreehouseDir` is a file system which renders `.tree` files into HTML lazily.
% id = "01JDJGVC7BBJCR1TQCBKBHMBNS"
- since generating all this HTML is an expensive operation, I have it wrapped in a `ContentCache` adapter, which caches any successfully generated pages in memory.
@ -452,7 +454,7 @@ like... you know. a _virtual_ file system?
% id = "01JDJGVC7BVV81GF2GRTQVCK7E"
- there is one flaw I want to point out with the current implementation of `Dir`: it uses trait methods to add new resource forks.
% id = "01JDJGVC7BJS79G1VJN1G29GRK"
- any time you add a new resource fork that's implemented only by one or two `Dir`s, you have to duplicate a stub across all existing adapters!
this means introducing a new fork means performing up to `N` edits, where `N` is the number of implementers of `Dir`.

View file

@ -1,4 +1,6 @@
title = "Requiem for a Fractal Forest"
id = "b?01K02XZTW3VYKX0Q5NZ17NRVTF"
tags = ["all", "treehouse", "design"]
+++

7
content/tag/c.dj Normal file
View file

@ -0,0 +1,7 @@
title = "#c"
include_feed = { tag = "c", title = "Posts" }
+++
Programming in C.\
Also see [#cpp][page:tags/cpp].

24
content/tag/cxx.dj Normal file
View file

@ -0,0 +1,24 @@
title = "#cxx"
include_feed = { tag = "cxx", title = "Posts" }
+++
Programming in C++.
---
A lot of people don't like C++, and I can't blame them for it.
I don't love it too.
It's just that it's currently the most pragmatic choice for any sort of multi-domain program which follows [the Philosophy][page:tag/programming].
While most C++ code I write is very C-like, I don't limit myself to C, because C++ is a lot more pleasant to program in.
Just the addition of namespaces, `enum class`, references, parsimonious use of templates, and operator overloading, is enough of an improvement over C that I generally tend to prefer C++ for solving my problems.
C++ remains the most pragmatic choice for most long-term projects while [Odin](https://odin-lang.org) and [Zig](https://ziglang.org) are still cooking.
I can rely on the language not changing under my feet, remaining stable and portable for many years to come, with a library ecosystem following a similar philosophy.
Places of unpleasantness in C++ for me include: classes and encapsulation, complicated template metaprogramming, the entire `std` namespace, lack of enum-indexed arrays, and also the Unreal Engine.
~...Seriously though, why does _nobody_ but Odin and Nim implement enum-indexed arrays?\
What is wrong with you people.~

52
content/tag/design.dj Normal file
View file

@ -0,0 +1,52 @@
title = "#design"
include_feed = { tag = "design", title = "Posts" }
+++
Design.
User interface design.\
User experience design.\
Product design.\
Graphic design.
Anything encompassing _design_, by the very definition of the word, goes into this tag.
I decided to start writing about design on this blog, because I like pondering on electronic interfaces.
They're what connects machine to human, and I find it fascinating to see how other people view that very form of art.
But the act of _design_ is a lot wider than just that, which is why you may also find more philosophical musings here.
About anything with _intent_, _thoughtfulness_ behind it.
Naturally, I practice it too.
This website, including its colour palette, layout, illustrations, iconography, is entirely designed by me.
There's also the aspect of [design in programming][page:tag/programming], which goes under its own dedicated tag `#programming` (but `#design` and `#programming` overlap sometimes).
---
As a designer, I value designs which get out of my way, and let me get the thing done.
Not by virtue of minimalism, quite the opposite, actually.
Sometimes minimalism is appropriate, other times it isn't.
In professional software, the last thing I want to see is a hamburger menu.
On a blog, the last thing I want to see is [a sidebar distracting me from the post][page:design/sidebars].
Colourful icons are ugly, but are easier to read than monochrome equivalents.
Bevels, embosses, and drop shadows play an important role in communicating which elements are interactable, and how.
Do not omit them.
Google's products are the opposite of good design.
They look and act like toys for 5-year olds, rather than products for professionals.
Anyone who doesn't respect `@media (prefers-reduced-motion: reduce)` does not deserve my respect.
Including Google.
Dark mode toggled through JavaScript and user settings is bad user experience.
There's a CSS media query for querying dark mode, and it exists for a reason.
_Use it._\
If your light mode looks so bad that system light mode users want to switch away from it, rethink your life choices.
Yadda yadda.
I could go on forever, and you could disagree on any of my points.

16
content/tag/games.dj Normal file
View file

@ -0,0 +1,16 @@
title = "#games"
include_feed = { tag = "games", title = "Posts" }
+++
*Gaming.*
---
I don't really write much about video games, mostly because the games I _really_ get into, I usually get so immersed I can't get out and do anything else.
Such as writing a post.
But if there's a 2nd hobby after programming that I'm really into, it is video games.
Maybe someday I will begin writing up more of my thoughts.
There sure are lots of games I love, and would like to give a tribute to.

8
content/tag/graphics.dj Normal file
View file

@ -0,0 +1,8 @@
title = "#graphics"
include_feed = { tag = "graphics", title = "Posts" }
+++
Graphics programming, and graphics programming _only_.
For graphic design, go to [#design][page:tag/design].

26
content/tag/javascript.dj Normal file
View file

@ -0,0 +1,26 @@
title = "#javascript"
include_feed = { tag = "javascript", title = "Posts" }
+++
Programming in JavaScript.
---
Despite my attraction to lower level programming, I sometimes find myself programming in JavaScript.
It's a decent workhorse language that powers most of the modern web.
Its position as The Language of the Web makes it incredibly useful to know as a modern-day programmer, because sooner or later you'll probably find yourself in a spot where you'll say "gee, I wish I had a way to cobble together a quick and dirty tool with a UI."
It's the one language I keep coming back to, because it's the one language I cannot replace with something that follows [the Philosophy][page:tag/programming].
(No, WebAssembly is not an option.
Have you ever actually tried using it?)
I don't love its design.
I think [Lua][page:tag/lua] is a much more elegant programming language.
But I like it for what it can do for me out of the box.
---
This website purposefully avoids using JavaScript where possible though, because it would be a waste of your computer's resources.
Plain HTML is perfectly fine for most of its functionality.

21
content/tag/lua.dj Normal file
View file

@ -0,0 +1,21 @@
title = "#lua"
include_feed = { tag = "lua", title = "Posts" }
+++
Programming in Lua (_riki_th edition.)
---
I love Lua.
It's a wonderful little scripting language.
I don't generally use Lua in my own projects nowadays, because it doesn't really follow [the Philosophy][page:tag/programming], but it's a wonderful little tool to have in your belt.
Knowing Lua gives you access to tools like [LÖVE](https://love2d.org), which is a nice little audiovisual framework that is executed in an incredibly charming way.
And also the plethora of software which uses Lua for scripting, such as [Neovim](https://neovim.io).
Lua is also [a poster child of brilliant language design][page:programming/lua].
Despite a lot of its archaisms, the language design is beautifully elegant, with each piece fitting neatly into a cohesive whole.
Not to mention its implementation being famously fast for a bytecode interpreter, with [a lot of pieces](https://lua.org/doc/jucs05.pdf) that I borrowed into my own interpreted languages, too.

10
content/tag/meow.dj Normal file
View file

@ -0,0 +1,10 @@
title = "#meow"
include_feed = { tag = "meow", title = "Pages" }
+++
Meowowowow
---
It's called "meow" because it's about *me*-yow!~

28
content/tag/music.dj Normal file
View file

@ -0,0 +1,28 @@
title = "#music"
include_feed = { tag = "music", title = "Posts" }
+++
Whatever---yeah music, music.
[Without the barriers.](https://www.youtube.com/watch?v=l5ufPTvBmHU){.secret}
---
I've been addicted to music for as long as I remember.
And music has always been with me, always been there for me, no matter where I went, or how deep in shambles I was.
Always there, always comforting, as I was\
[Always breaking, always healing.](https://www.youtube.com/watch?v=k0lrgMplH58){.secret}
I owe a great lot to the artists whose music has kept me company all these years.
It is through these blog posts, (as well as direct support through buying there albums), I hope I can give them back a little something precious: a piece of my imagination, through writing.
Something in return for all the emotions they managed to spark within me.\
Something in return for the years of resonance with my heart and soul.
{style="text-align: right;"}
for Her\
my Guardian Angel\
Music

21
content/tag/plt.dj Normal file
View file

@ -0,0 +1,21 @@
title = "#plt"
include_feed = { tag = "plt", title = "Posts" }
+++
Programming language theory and design.
---
One of the more interesting fields of computer science, I believe.
I've been fascinated with programming languages ever since I was a little riki.
There's always been something magical about writing special words into a computer, and the computer being able to _interpret_ them.
So with my tendency for digging deep into any topic I'm interested in, it was only natural that at some point, I started designing and writing those programming languages myself.
An important thing of note is that I'm not an academic.
I'm a practicioner and a humanist.
Therefore, most of my programming language knowledge lives on the more human, design side of things, rather than the theoretical, mathematical side.
I know a lot of the basics behind the theory of it all, but I'm by no means on the cutting edge of language theory and computer science.

View file

@ -0,0 +1,74 @@
title = "#programming"
include_feed = { tag = "programming", title = "Pages" }
+++
Honestly my favourite thing to do.
I've been programming for over 10 years now, and there's no sign of it stopping.
Most of the posts on my website are about programming because of this.
I actually spend so much time programming, I don't have much time for other hobbies!
~It does get kind of sad when you think about it though. When folks around you talk about all the movies or games you didn't see because you were looking at monospaced letters in a text editor...~
---
If I started to describe my whole programming philosophy here, this page would be longer than your favourite roll of toilet paper.
So instead, here are some opinions you may find yourself disagreeing with, given without any further context.
Just so that you can see what sort of programmer I am.
- I write very direct, procedural code.
My programming style is about functions, data structures those functions manipulate, function capabilities expressed through arguments, and encapsulation via modules composed of those things.
- The easier your data is to inspect, the less code you have to write to accomplish a task.
Encapsulation meddles with that directly and prevents direct inspection.
Therefore, encapsulation should be limited mostly to cases where your system interacts with the "outside world," whatever that might mean in your domain of choice.
- Object-oriented programming was [originally meant for simulating distributed systems](https://www.youtube.com/watch?v=wo84LFzx5nI), and it should have stayed in that domain.
The number of invalid state bugs object-oriented programming has inflicted on me in my time as a programmer is miserable.
- I think in groups of things, rather than single elements.
It simplifies reasoning about your program and reduces the number of invalid states (including errors related to memory mismanagement.)
- I value reliability in software very highly.
I like it when I can rely on my software.
For it not to break under its own weight, or pull the rug from under my feet.
This refers both to reliability in terms of the end user side (crashes, bugs, needless UI changes), as well as the programmer side (churn, breaking API changes).
- I prefer code custom-built to a project's needs.
Home-grown game engines are great, and are how you push the industry forward.
And [a little copying is better than a little dependency](https://www.youtube.com/watch?v=PAAkCSZUG1c&t=568s).
Shame on the programmers who choose Unity or Unreal for their game and make my computer sound like a rocket engine.
- I like my software to be fast.
There's too little time in life to be spent [waiting for your tools to load](https://www.unrealengine.com/).
Likewise, I like it when my software _builds_ fast.
There's too little time in life to be spent [waiting for your game code to build and reload](https://www.unrealengine.com/).
Fast software makes it easy to stay in the flow as a creative person.
I think this is something the industry doesn't value enough.
When a piece of software causes you to wait and switch context, it should not be considered a good piece of software.
I rarely have to think about performance though, because software adhering to the rest of my philosophy is generally fast enough not to cause a problem.
It's likely these values will change or grow over time.
I build wisdom slowly, as all of us do.
---
I don't boast about my programming projects very hard online, because I don't seek clout.
I build them for myself and my friends to enjoy, and that is more than enough to satisfy me.
But in case you're curious, here's what I'm currently working on:
- *@@@@*, an untitled, unannounced video game.
- [*rakugaki*][def:rkgk/repo], an online multiplayer painting app with programmable brushes.
- this website!
Any other project you run across from me is probably dead.
Please let it rest in peace and do not resurrect it.
You software necromancer. >w<

19
content/tag/shower.dj Normal file
View file

@ -0,0 +1,19 @@
title = "#shower"
include_feed = { tag = "shower", title = "Posts" }
+++
Shower thoughts.
You didn't think I meant anything weird with that name, did you?
---
Under this tag you will find assorted philosophical thoughts, musings, and everything in between.
Reflections on myself, reality around me, growing up.
Rants, too.
By that, perhaps you could call this the most existential section of the website.
Or perhaps not.
Who knows?

8
content/tag/treehouse.dj Normal file
View file

@ -0,0 +1,8 @@
title = "#treehouse"
include_feed = { tag = "treehouse", title = "Posts" }
+++
`treehouse` is the piece of software that powers riki.house.
This tag aggregates posts related to this website and the tech behind it.

20
content/treehouse/cmd.dj Normal file
View file

@ -0,0 +1,20 @@
title = "Command line"
+++
Press `<kbd>:</kbd>`{=html} or the little `:|` icon in the footer to open the command line.
Type in your command, then press `<kbd>Enter</kbd>`{=html} to run it.
`<kbd>Esc</kbd>`{=html} closes the command line, `<kbd>Tab</kbd>`{=html} cycles through suggestions.
You may also use the mouse (or your touchscreen) to close the command line or pick a suggestion from the list.
Unknown commands to not do anything.
Known commands usually result in immediate feedback.
## riki's commentary
The command line used to be the way to access the news feed (`:new` command), but this has been removed, as the main page serves the same purpose with extra features.
Currently the command line is primarily used for housing developer tools, which are not available in production builds.

View file

@ -6,7 +6,7 @@ visibility = "Private"
% id = "01JEK4XKK27KXP01EK8K890SPK"
- type in your command, then press `<kbd>Enter</kbd>`{=html} to run it.
% id = "01JEM34P84HHBSKFVTYWWKB603"
- `<kbd>Esc</kbd>`{=html} closes the command line.

View file

@ -1,6 +1,5 @@
%% title = "a curated feed of updates to the house"
styles = ["new.css"]
feed = "new"
visibility = "Private"
% id = "01JCGWPM6T73PAC5Q8YHPBEAA1"
@ -338,7 +337,7 @@ if you've been wondering what I've been up to, you've come to the right place.
- I haven't done any of it yet, but I thought it'd be cool to share my ideas anyways!
% id = "01J4J5N6WZQ03VTB3TZ51J7QZK"
tags = ["programming", "plt", "haku"]
tags = ["programming", "plt"]
- ### [haku - writing a little programming language for fun][page:programming/blog/haku]
% id = "01J4J5N6WZQ1316WKDXB1M5W6E"
@ -380,7 +379,7 @@ if you've been wondering what I've been up to, you've come to the right place.
% id = "01J0KRPMV7SS48B64BFCJZK7VQ"
tags = ["meow"]
- ### [about me (version 2)][page:about]
- ### [about me (version 2)][page:about/v2]
% id = "01J0KRPMV73K71D3QXFQ3GNY2N"
- it's updatin' time! I took some time to clean up old pages and update my _about me_.\