Cooking. A new-to-me fruitcake recipe from one of my cookbooks; a dal from the cookbook I am not actually going to manage Making Everything From by the end of the calendar year (but I am pretty close).
Eating. I have now had A Mince Pie. Also a very long lunch at the Gardeners Arms. The brownies that all the reviews of the place we wound up staying in Ardlingy mentioned (which were indeed v good).
Exploring. Wakehurst Place, both at night for Glow Wild and during daylight (a little)!
Growing. Bought curry leaves. Proceeded to strip most of the stems (freezing the leaves) and Treat As Cuttings. There's at least one of them that doesn't look actually dead yet...
Observing. OWL OWL OWL. Very talkative tawny, as we were leaving Wakehurst on Friday night. Snowdrops, also at Wakehurst, to my mild horror. And, blessedly, NOT The Charity Tractor Parade...
ficinabox author reveals have happened! And here is the first of the two stories I wrote.
I wanted to write something set in the later episodes, and gavilan had asked for smut, so I was brainstorming and rewatching things to find a suitable spot to make it happen. And in episode 31, during the Nightmare Master arc, there's this moment when Shen Wei, chained to the Sky Pillar in Dixing, can feel Zhao Yunlan's energies in turmoil even though Zhao Yunlan is far away in Haixing. So I thought, what if ...? I'd always meant to do something with the Nightmare Master's power anyway, because dream manipulation has so much potential! Also gavilan said they like angst, and what is angstier than the whole white energy plan? So I had an opportunity for canon divergence with larger impact ... *g*
With many thanks to china_shop, as usual, for beta-reading. ♥
**
To Make a Dream (9270 words) Fandom:镇魂 | Guardian (TV 2018) Rating: Mature Relationship: Shen Wei/Zhao Yunlan Characters: Shen Wei, Zhao Yunlan, brief appearances by Ye Zun and the SID Content Tags: Alternate Universe - Canon Divergence, Episode Related, Episode 31, Nightmare Master arc, Dream Sharing, Dixing Powers, Black and White Energy, First Kiss, First Time, Pre-Fix-It
Summary:
"You took a while to wake," Shen Wei said gently. "I brought you home." He ran a hand through his hair. "I needed rest, too."
So that was the fantasy: something Zhao Yunlan could almost, almost believe. His heart clenched. Suddenly he understood Zhu Hong's temptation to keep dreaming. But the true Shen Wei was still missing. Zhao Yunlan needed to wake up for real.
Can they use their abilities in the course of their mandatory voluntary community service? Or maybe, the question is, how to use them without running into the bar on endangering other people or themselves?
Secrets Left to Post: 02 pages, 43 secrets from Secret Submission Post #989. Secrets Not Posted: [ 0 - broken links ], [ 0 - not!secrets ], [ 0 - not!fandom ], [ 0 - too big ], [ 0 - repeat ]. Current Secret Submissions Post:here. Suggestions, comments, and concerns should go here.
Today's lunch: lamb chops which I cooked thusly, except that as I had no small bottles of white wine I used red, turned out very well; served with Greek spinach rice and padron peppers.
I adapted these muffins from a recipe in Katarina Cermelj's The Elements of Baking, making them dairy free and reducing the sugar. The result is a tender muffin with a domed top and a fluffy crumb, similar to a bakery muffin, but not as sticky or sweet.
Ingredients:
145 g tapioca starch 72 g sorghum flour 72 g millet flour 170 g granulated sugar 2 tsp baking powder 1 tsp baking soda 1 tsp xanthan gum 1/4 tsp fine salt
160 g non-dairy milk (175 ml) 150 g non-dairy yogurt (5.3 oz) 100 g neutral oil (1/2 cup) 2 large eggs (~100 g out of shell) 1/4 tsp almond extract
[I]n the trenches of trans health care, there is a growing idea that pushes back against the “one true gender for each individual” framing altogether—one that could allow us to resolve the bitterly divisive culture war over the psychological and medical care of transgender children. What if, instead of viewing gender as a fixed trait, we started to think of it as something that could evolve over the course of a lifetime? Or if detransitioning wasn’t considered a sign of failure and was instead regarded as a natural and healthy part of the gender development process?
I recently read Ned Batchelder’s post about Truchet tiles, which are square tiles that make nice patterns when you tile them on the plane.
I was experimenting with alternative headers for this site, and I thought maybe I’d use Truchet tiles.
I decided to scrap those plans, but I still had fun drawing some pretty pictures.
One of the simplest Truchet tiles is a square made of two colours:
These can be arranged in a regular pattern, but they also look nice when arranged randomly:
The tiles that really caught my eye were Christopher Carlson’s.
He created a collection of “winged tiles” that can be arranged with multiple sizes in the same grid.
A tile can be overlaid with four smaller tiles with inverted colours and extra wings, and the pattern still looks seamless.
He defined fifteen tiles, which are seven distinct patterns and then various rotations:
The important thing to notice here is that every tile only really “owns” the red square in the middle.
When laid down, you add the “wings” that extend outside the tile – this is what allows smaller tiles to seamlessly flow into the larger pattern.
Here’s an example of a Carlson Truchet tiling:
<input ... >
Conceptually, we’re giving the computer a bag of tiles, letting it pull tiles out at random, and watching what happens when it places them on the page.
In this post, I’ll explain how to do this: filling the bag of tiles with parametric SVGs, then placing them randomly at different sizes.
I’m assuming you’re familiar with SVG and JavaScript, but I’ll explain the geometry as we go.
Filling the bag of tiles
Although Carlson’s set has fifteen different tiles, they’re made of just four primitives, which I call the base, the slash, the wedge, and the bar.
The first step is to write SVG definitions for each of these primitives that we can reuse.
Whenever I’m doing this sort of generative art, I like to define it parametrically – writing a template that takes inputs I can change, so I can always see the relationship between the inputs and the result, and I can tweak the settings later.
There are lots of templating tools; I’m going to write pseudo-code rather than focus on one in particular.
For these primitives, there are two variables, which I call the inner radius and outer radius.
The outer radius is the radius of the larger wings on the corner of the tile, while the inner radius is the radius of the foreground components on the middle of each edge.
For the slash, the wedge, and the bar, the inner radius is half the width of the shape where it meets the edge of the tile.
This diagram shows the two variables, plus two variables I compute in the template:
outer radiusinner radiustile sizepadding
Here’s the template for these primitives:
<!-- What's the length of one side of the tile, in the red dashed area?
tileSize = (innerR + outerR) * 2 --><!-- How far is the tile offset from the edge of the symbol/path?
padding = max(innerR, outerR) --><symbolid="base"><!--
For the background, draw a square that fills the whole tile, then
four circles on each of the corners.
--><gclass="background"><rectx="{{ padding }}"y="{{ padding }}"width="{{ tileSize }}"height="{{ tileSize }}"/><circlecx="{{ padding }}"cy="{{ padding }}"r="{{ outerR }}"/><circlecx="{{ padding + tileSize }}"cy="{{ padding }}"r="{{ outerR }}"/><circlecx="{{ padding }}"cy="{{ padding + tileSize }}"r="{{ outerR }}"/><circlecx="{{ padding + tileSize }}"cy="{{ padding + tileSize }}"r="{{ outerR }}"/></g><!--
For the foreground, draw four circles on the middle of each tile edge.
--><gclass="foreground"><circlecx="{{ padding }}"cy="{{ tileSize / 2 }}"r="{{ innerR }}"/><circlecx="{{ padding + tileSize }}"cy="{{ tileSize / 2 }}"r="{{ innerR }}"/><circlecx="{{ tileSize / 2 }}"cy="{{ padding }}"r="{{ innerR }}"/><circlecx="{{ tileSize / 2 }}"cy="{{ padding + tileSize }}"r="{{ innerR }}"/></g></symbol><!--
Slash:
- Move to the top edge, left-hand vertex of the slash
- Line to the top edge, right-hand vertex
- Smaller arc to left egde, upper vertex
- Line down to left edge, lower vertex
- Larger arc back to the start
--><pathid="slash"d="M {{ padding + outerR }} {{ padding }}
l {{ 2 * innerR }} 0
a {{ outerR }} {{ outerR }} 0 0 0 {{ outerR }} {{ outerR }}
l 0 {{ 2 * innerR }}
a {{ innerR*2 + outerR }} {{ innerR*2 + outerR }} 0 0 1 {{ -innerR*2 - outerR }} {{ -innerR*2 - outerR }}"/><!--
wedge:
- Move to the top edge, left-hand vertex of the slash
- Line to the top edge, right-hand vertex
- Smaller arc to left egde, upper vertex
- Line to centre of the tile
- Line back to the start
--><pathid="wedge"d="M {{ padding + outerR }} {{ padding }}
l {{ 2 * innerR }} 0
a {{ outerR }} {{ outerR }} 0 0 0 {{ outerR }} {{ outerR }}
l {{ 0 }} {{ 2 * innerR }}
l {{ -innerR*2 - outerR }} 0"/><!--
Bar: horizontal rectangle that spans the tile width and is the same height
as a circle on the centre of an edge.
--><rectid="bar"x="{{ padding }}"y="{{ padding + outerR }}"width="{{ tileSize }}"height="{{ 2 * innerR }}"/>
The foreground/background classes are defined in CSS, so I can choose the colour of each.
This template is more verbose than the rendered SVG, but I can see all the geometric expressions – I find this far more readable than a file full of numbers.
This also allows easy experimentation – I can change an input, re-render the template, and instantly see the new result.
I can then compose the tiles by referencing these primitive shapes with a <use> element.
For example, the “T” tile is made of a base and two wedge shapes:
<!-- The centre of rotation is the centre of the whole tile, including padding.
centreRotation = outerR + innerR --><symbolid="carlsonT"><usehref="#base"/><usehref="#wedge"class="foreground"/><usehref="#wedge"class="foreground"transform="rotate(90 {{ centreRotation }} {{ centreRotation }})"/></symbol>
After this, I write a similar <symbol> definition for all the other tiles, plus inverted versions that swap the background and foreground.
Now we have a bag full of tiles, let’s tell the computer how to place them.
Placing the tiles on the page
Suppose the computer has drawn a tile from the bag.
To place it on the page, it needs to know:
The x, y position, and
The layer – should it place a full-size tile, or is it a smaller tile subdividing a larger tile
From these two properties, it can work out everything else – in particular, whether to invert the tile, and how large to scale it.
The procedure is straightforward: get the position of all the tiles in a layer, then decide if any of those tiles are going to be subdivided into smaller tiles.
Use those to position the next layer, and repeat.
Continue until the next layer is empty, or you hit the maximum number of layers you want.
Here’s an implementation of that procedure in JavaScript:
functiongetTilePositions({columns,rows,tileSize,maxLayers,subdivideChance,}){lettiles = [];// Draw layer 1 of tiles, which is a full-sized tile for// every row and column.
for (i = 0; i < columns; i++){
for (j = 0; j < rows; j++){
tiles.push({ x: i * tileSize, y: j * tileSize, layer:1});}}// Now go through each layer up to maxLayers, and decide which// tiles from the previous layer to subdivide into four smaller tiles.
for (layer = 2; layer <= maxLayers; layer++){letpreviousLayer = tiles.filter(t => t.layer === layer - 1);// The size of tiles halves with each layer.// On layer 2, the tiles are 1/2 the size of the top layer.// On layer 3, the tiles are 1/4 the size of the top layer.// And so on.letlayerTileSize = tileSize * (0.5 ** (layer - 1));
previousLayer.forEach(tile => {
if (Math.random() < subdivideChance){
tiles.push({ layer, x: tile.x, y: tile.y },{ layer, x: tile.x + layerTileSize, y: tile.y },{ layer, x: tile.x, y: tile.y + layerTileSize },{ layer, x: tile.x + layerTileSize, y: tile.y + layerTileSize },)}})}
return tiles;}
Once we know the positions, we can lay them out in our SVG element.
We need to make sure we scale down smaller tiles to fit, and adjust the position – remember each Carlson tile only “owns” the red square in the middle, and the wings are meant to spill out of the tile area.
Here’s the code:
functiondrawTruchetTiles(svg,tileTypes,tilePositions,padding){
tilePositions.forEach(c => {// We need to invert the tiles every time we subdivide, so we use// the inverted tiles on even-numbered layers.lettileName = c.layer % 2 === 0? tileTypes[Math.floor(Math.random() * tileTypes.length)] + "-inverted": tileTypes[Math.floor(Math.random() * tileTypes.length)];// The full-sized tiles are on layer 1, and every layer below// that halves the tile size.constscale = 0.5 ** (c.layer - 1);// We don't want to draw a tile exactly at (x, y) because that// would include the wings -- we add negative padding to offset.//// At layer 1, adjustment = padding// At layer 2, adjustment = padding * 1/2// At layer 3, adjustment = padding * 1/2 + padding * 1/4//constadjustment = -padding * Math.pow(0.5, c.layer - 1);
svg.innerHTML += `
<use
href="${tileName}"
x="${c.x / scale}"
y="${c.y / scale}"
transform="translate(${adjustment}${adjustment}) scale(${scale})"/>`;});}
The padding was fiddly and took me a while to work out, but now it works fine.
The tricky bits are another reason I like defining my SVGs parametrically – it forces me to really understand what’s going on, rather than tweaking values until I get something that looks correct.
Demo
Here’s a drawing that uses this code to draw Carlson truchet tiles:
<input ... >
<input ... >
It was generated by your browser when you loaded the page, and there are so many possible combinations that it’s a unique image.
If you want a different picture, reload the page, or tell the computer to draw some new tiles.
These pictures put me in mind of an alien language – something I’d expect to see etched on the wall in a sci-fi movie.
I can imagine eyes, tentacles, roads, and warnings left by a long-gone civilisation.
It’s fun, but not really the tone I want for this site – I’ve scrapped my plan to use Truchet tiles as header images.
I’ll save them for something else, and in the meantime, I had a lot of fun.
Damned if I know how to summarize this week. Mixed?
Embarrassingly, I managed to confuse two deliveries (see Monday) -- I
think because they had the same last digit or so in their package numbers
-- so I had to delete a couple of annoyed-sounding posts. Hopefully
before anyone noticed. The Roamate
(combo rollator/powered wheelchair) arrived less than an hour later.
Karma, I guess. The device itself seems pretty good, modulo some wierd
design decisions, but will take some getting used to before I can write a
proper review.
On the other hand, Bronx has been becoming an absolute cuddle-bug. He
likes to be picked up and carried, which can be very useful. He
doesn't always settle down into my lap after that, but when he does he has
a nice rumbly purr. And my medication is still being adjusted; I seem to
be getting into somewhat better shape. It's still not great, but I'm not
complaining.
On the gripping hand, (covered mobility scooter)Scarlet the Carlet is
broken, with a circuit breaker that doesn't want to stay reset. N, G, and
j managed to push her home (under a kilometer, and NL is basically flat)
-- we'll call for repairs tomorrow sometime.
In the links: MIT physicists peer inside an atom’s nucleus using the fact that
Radium monofluoride's electron cloud extends inside the Radium's
somewhat pear-shaped nucleus. Wild. Both the technique, and the fact
that that compound exists at all. At least it's nowhere near as unstable
as FOOF.
The Star Gauge is
fascinating. (m sent us a link on the family Discord, but it was to
tumblr -- the wikipedia article is less problematic.)
Title: Pillar Of The Community. Author:lannamichaels Fandom: Wake Up Dead Man (2025) Rating: G Archives:Archive Of Our Own, SquidgeWorld (To be added when the site is back up)
Summary: Martha Grace Wicks, from her first murder to her last.
By now many of you are no doubt in that stress-filled haze of pre-Christmas panic - the one that results from too much shopping and too little eggnog. (Because, seriously, EGGNOG FIXES EVERYTHING.)
So listen, I want you to just sit back, relax, and let allll that holiday stress go. Because this, my friends, is your happy place.
Is this not the sweetest, artsiest bit of edible quilling you've ever seen? So perfect! Now I want to try quilling again just to make this pattern into next year's Christmas cards.
And speaking of cards, doesn't this remind you of all those vintage-styled pretties - the ones on thick cream paper with embossed lettering?
See that pattern on the white? I love that pattern. I want it covered in crystals and made into wrapping paper - which I will then hoard, Smaug-style, along with thousands of rolls of sparkly Christmas ribbon, because I seriously can't stop buying that stuff.
Ahem.
You may have heard that the Three Wise Men brought the baby Jesus gifts of gold, frankincense, and myrrh, but did you know they also brought something a little more festive?
That pop of lime green in the middle with the teal is just about the cheeriest thing ever, and I love the dusting of powered sugar snow on the chocolate pinecones. And did you notice this is an anniversary cake? SO SWEET.
This next one is as cozy as your favorite Christmas sweater:
It's also baffling the heck out of me, since I have no idea how the baker did it. She couldn't have individually piped every single "stitch," right? Right?? Please, someone tell me; I may lose sleep over this.
You know, I've seen a lot of cakes, and I generally pride myself on being able to spot what's edible and what's not. This next one, though? Completely fooled me:
I thought those were stacked hat boxes, but nope; it's cake, and everything on it is edible. The bells, the silky gold robe, and of course the sheet music sides. Plus the solid side has this gorgeous shimmer you can really only see up close:
Wowza.
And if you thought that was stunning, then hold on to your giant pearly antlers:
It turns out if you really want to raise the profile of your writers' union, all you need to do is announce LLM-generated works are eligible for awards, as long as they are not entirely LLM-generated.