from Meditations

Buttered Toast

What is Buttered Toast? “You have to be kidding me?”, you ask yourself. I'm not. The name evokes toasted bread with butter on it, no? It's also something silly.

Let's go back. Way back to the late 1990's. My brother and a friend conceived this idea that we would make a movie that would be the best thing since, well, buttered toast. Why that? In the show “Ed, Edd, and Eddy”, one of the characters said they're better than buttered toast. We enjoy the show and borrowed the quote.

Now that's out of the way, we decided to make a film. I spent the better part of what free time I had in college composing this script. When I graduated and didn't have any chance of employment, I turned to writing the game. However, it was imperfect. I wrote it from a bad place and a situation caused by a budding mental illness issue. The script was outright terrible. “Terribad” is a better term. It contained sexism and other horrible hate-filled things, but there were still humorous aspects to it. Consequently, I decided to can it for the time being.

Fast forward to 2016, I was bored one evening feeding my daughter and decided to revisit the movie script. And what parts weren't offensive, I found myself laughing at it. It was at this point, I realized, given where Master Films was in life, which is how we styled ourselves, a movie was out of the question. However, a game was a more, albeit still far-fetched, possibility. So, again, I can the project after writing up the start of a game design document.

Now, for the present day. I recently picked up interactive fictions and writing them with Inform 7 as a means of release from the stress of my day job at the advice of multiple individuals. Then, it occurred to me to revisit Buttered Toast, my old love. It was still funny in parts and outright terrible in others. With a sense of gusto, I took it upon myself to chop out the unsavory bits, yet I aimed to retain as much as possible the more funny parts. Thus, was born Buttered Toast: the Interactive Fiction Starring Billy Davis. You can find it, and the second game as of this writing, here:, which are early ventures are to serve as the founding of my Masterful Interactions collective.

Shameless plugs aside, I do enjoy the humor found in the games. I wouldn't have put them out there if I didn't think it was worth your time and effort. More will come. There is an ideas document that outlines hundreds of narbs that my brother and I collected together. Also, the movie script has gems, too, that can be used.


from greum maol stevenson

gary snyder in 2007, at age 77, grey hair and beard, wearing blue button down shirt, loose red tie, speaking into microphone

The poetry of Gary Snyder was a near-lifesaver for me in the the late 1980s and early 1990s. In those days, it was rare to find his work in UK bookshops, whether chain or independent. The books were mailed to me by American friends, or I would visit London and buy them at Compendium bookshop, whose poetry selection was run by the late, great Mike Hart.

It surely says something about Mr Snyder’s brilliance that the poetry of a rural American back-to-the-lander largely focused on deep ecology, work with the hands, and raising a family, could speak profoundly to a young, single, childfree urban man in Scotland for whom changing a lightbulb was an adventure, and whose idea of a hike in the wilderness was a walk along Maryhill Road. All i had in common with Mr Snyder was the practice of Zen Buddhism and the Way of Poetry… and something else, something i still cannot name but found in the poetry that helped me understand why i did not want the life that had been prescribed for me, for all of us in the west, a life of clock-punching, materialism, individuality, procreation, stress and exhaustion, also known as “a family and a career.”

I have been reading Mr Snyder’s Collected Poems, recently published by the Library of America, and my response to them makes me realise that we not only live in better times than the 50 years or so during which he wrote his best-known poems, but better times than 35 and 25 years ago.

Even back then, i was sometimes jarred by the anthropomorphism and self-centredness of the poems; animals and plants exist only to teach “men” things, such as when the hooting of owls is presented as a chorus of agreement with the political opinions of Mr Snyder’s friend Daniel Ellsberg. I was sometimes bemused by Mr Snyder’s naming of his friends, and his accounts of their most ordinary day-to-day activities, but, as someone to whom nothing is more important than friendship, i liked this.

What i am ashamed to say i was oblivious to is his sexism.

It is impossible not to be shocked by it in the year 2022. Women, including Mr Snyder’s wives, are never people; they are devas, goddesses, mothers, wives, sex partners. But, mostly, they are breasts — breasts that feed infants, or breasts that are desired by Mr Snyder. The poem “Alabaster,” dedicated to  “the women carpenters of Kitkitdizze,” ostensibly about men and women doing manual work together outdoors, both sexes stripped to the waist, simply describes the breasts of each woman. When i was 24, i found this poem both romantic and erotic. Reading it now, i hear the cackling of Beavis and Butt-Head, and i laugh with them.

Other examples contain nothing to laugh at, such as a casual reference to violence against a woman (“Because I once beat you up / Drunk, stung with weeks of torment / And saw you no more, / And you had calm talk for me today / I now suppose / I was less sane than you”) in a poem written in his early twenties, and which he claims in a footnote he did not actually do. Horrifyingly, he says he made it up because, in those times, battering a woman seemed the “manly” or “gentlemanly” thing to do. In the 1950s, it seems, a young man would want to be known as a batterer of women, even if he was not.

But, like the women he fetishises rather than batters, the victim of the narrator of that poem is not seen as a woman, but as “a Hindu Deva-girl… Breasts like dream breasts… spurting milk,” and as a stone statue he finds in a book of Indian art. To Mr Snyder, nature (or Nature) itself is female, and so is the earth — but, while female, it is a world without women. Only men are people.

Mr Snyder is rightly regarded as a father (note the word) of deep ecology, and as one of the great English-language American poets of the 20th Century. Reading him now, my gratitude to him is undiminished — but if these poems, one collection of which won a Pulitzer Prize, were being published for the first time today, they would (again, rightly) be met with outrage. Reading them now, along with outrage might be a feeling of relief that we have come so far during their author’s lifetime.

#GarySnyder #poetry #sexism #ViolenceAgainstWomen #ObjectificationOfWomen #anthropomorphism #DeepEcology #MalePrivilege #malecentrism

Read more... Discuss...

from Roscoe's Story

Thursday 11/Aug/2022

Prayers, etc.: • 05:00 – Prayer to St. Michael the Archangel • 19:00 – the daily meditation from Magnificat monthly magazine; and the daily meditation from Benedictus. – Fr. Chad Rippberger's Prayer of Command to protect my family, my sons, my daughter and her family, my granddaughters and their families, my great grandchildren, and everyone for whom I have responsibility from any demonic activity; and the Thursday Prayers of the Association of the Auxilium Christianorum. • Tonight's Rosary is the Joyful Mysteries

Diet: • 07:00 – applesauce, toast & butter, 1 ham & cheese sandwich • 12:30 – rice noodle and meatball soup, 2 chocolate chip cookies • 16:00 – fried rice with chicken and pork

Chores, etc.: • 06:00 – listen to [KTSA]() • 08:00 – Biden Inflation Cure: Slash Dollar’s Value, Deploy 87,000 New IRS Agents Against Etsy Sellers – Steve Green's Right Angle • 08:15 – George Soros, Alex Jones, & Brittney Griner – The Liz Wheeler Show Ep. 185 • 09:30 – haircut • 10:30 – business meeting at the STM Rectory • 11:00 – email info to STM admin assistant, and to KofC officers • 12:00 to 13:15 – shopping and lunch at a favorite restaurant with Sylvia • 15:15 – Mar-a-Lago Raided by FBI, Informant On The Inside – Just Human #123 • 16:30 – Steve Bannon's WarRoom • 17:00 – Real America's Voice • 18:00 – local news and weather • 18:30 – Wheel of Fortune

Chess: • 15:50 – moved in all pending CC games

Posted 11/Aug/2020 ~ 19:20 Central Time

#Blog #DailyNotes


from Looped Network

I'm potentially going to be working on a side project at work which would have me using C#... which I'm not particularly familiar with outside of any similarities it lent to PowerShell, which I use frequently. I did some tutorials on C# about a decade ago of which I remember absolutely nothing. As a result, I've been looking for some tutorials or guides that I can use to get up to speed at least a little bit. Maybe I'm terrible at searching, but C# tutorials are... not good.

Microsoft offers a ton of material, but it all seems to mostly assume that you either:

  1. Are completely new to programming.
  2. Are already experienced with C# and just need to know either advanced topics or what's new in the language.

I really need something that shows me the syntax, how code is organized, etc. Then I can start working on some personal projects and familiarizing myself with more of the specifics from there. This gist is very helpful, especially because I do a lot of work in Python right now. However, I don't think it quite had the depth I wanted.

I'm going to try reading Microsoft's slightly longer Tour of C# and see if that provides enough to get me started.


from Anita-Corbo

I logged into my Medium account & found out that there is a green “Listen” button next to my essays. And I never gave anyone permission to make it text-to-speech. Which is bizarre because I think that you are supposed to control those settings yourself. Damn! Is that fair??? 🤔

I never gave anyone permission to make a sound recording & I listened to it briefly to see what it sounded like & it was completely robotic. Like I literally NEVER did anything or turned on a control option or pressed any buttons to make it happen. So I can only assume my account was hacked into & someone else did it or the platform gave themselves the liberty to do it. Hmmm??? 🤔

My thoughts right now…

Dear Medium,

Why are you using a male robot voice? For cripes sake, I'm a child in a woman’s body!!! And people think I sound bossy at times but really I just say what's on my mind & can't censor myself. And I also meditate so sometimes I’m in la-la land feeling deeply at one with God. Don't you have the technology already to come up with a voice for that??? It's 2022, get your shit together!!!


A Pissed Off Subscriber Who Is Not Making Royalties Off Of You (Yet…)


P.S. LOL, just having fun with you, Medium! Thank you for publishing my stories, really & truly. (Even though I did not give you permission to make an audio version). I am humbly & eternally grateful to you for giving me the opportunity to express myself through your outlet. I still cry every day because of the pain but I want to say you've been the biggest help in my healing process from all the hatred. I owe you one.

I love you always…



from Libraries and Learning Links of the Week

Happy Friday! Today's links are a little meatier than the last few editions – block out some time in your calendar to check them out properly.

Eight case studies

The full title for this is Eight case studies show opportunities, challenges, and needs of low-capacity and non-Western cultural heritage institutions, and although that terminology feels slightly icky to me, it seems that the institutions in question self-described or at least self-identified that way.

Looking through these case studies, what struck me is that many of these challenges also affect a lot of “western” GLAMS, even in organisations that are perceived as high capacity and wealthy. Maintaining, sharing and growing cultural heritage takes a lot of resources. I guess that's why traditionally humans have expended most of their energy on it.

ALIA Professional Pathways Frameworks Project Presentation

I know, right – you did a double take there. It's fair to say that I probably have a bit of a reputation as a critic of ALIA. I am, however, quite impressed by the work that has been undertaken for the Professional Pathways project, and what looks to be a concerted and thoughtful effort to consult widely and genuinely. This is a hugely important piece of work, addressing head on the key existential question about librarianship as a profession in Australia. In some ways this is long overdue, but on the other hand the fact that it has been rolling out concurrently with half of Australia's LIS degrees being discontinued has really rammed home one of the reasons this is so crucial.

You can find the “presentation” (A PDF of a slide deck that is terrible as slides but excellent as a summary of the rather hefty technical and consultation reports) and a form to have your say on the special ALIA website set up for this work. Anyone with an interest in this work can contribute to the consultation – you don not have to be an ALIA member.

Course Materials for Educators (OER)

The BCcampus Open Collection is a directory of open educational resources in a wide range of disciplines. It has everything from Introduction to Oceanography to Barbering Techniques for Hairstylists.

The “BC” stands for British Columbia, so you're also going to find things like Digging in to Canadian Soils and Building a Competitive First Nation Business Environment that are obviously tailored to the BC context. But that's the point when it comes to OER. One of the things I find exciting about it is that a way to drive OER use and creation is to use the consolidation and Americanisation of global publishing in English as a weapon against itself – a kind of Jiu Jitsu move to say “well it's unprofitable for Gigantic Publishing Inc to publish this niche textbook, so why don't you publish it openly with us?” Anyway check out the directory because there is also plenty of stuff that's not particularly specific to Canada or BC.

Have a great weekend, and I'll be in your inbox next week!


from Believe and Disbelieve Nothing

The road to hell is paved with good intentions.

A lot of people who advocate for equality seemingly aren't interested in unity, because they actively and consciously refuse to unify with those they disagree with and denounce as less morally virtuous than they are.

This observation alone sets a clear distinction between equality and unity.

Equality is a political concept and, a lot of the time, does nothing to inform people’s philosophical outlooks, standards or codes. It sounds good on paper at first glance.

Another clear distinction is that people have to be divided for the concept of equality to become relevant, whereas people can’t be divided for there to be a state of unity.

There’s been an observable “backfire effect” from all this equality-hustling, and that’s inadvertently alienating people from one another by bringing various arbitrary differences to the forefront of their attention.

Unity; human beings deciding to no longer live as a splintered, fragmented species, gaining the philosophical and scientific insight necessary to give rise to that, and deciding to work together rather than fighting.

Politics without philosophy keeps on proving to be nothing but a bunch of self-defeating, self-righteous experiments that hijack people’s genuine human concern and use it both to get paid, and for social control.

This is also one of the causes of people moralising at each other; social control.

“World unification, working toward common good for all human beings and without anyone being subservient to anyone else. Without social stratification whether it be technical elitism or any other kind of elitism, eradicated from the face of the earth. The State does nothing because there is no State.” – Jacque Fresco

“The old appeals to racial, sexual and religious chauvinism, to rabid nationalist fervor, are beginning not to work. A new consciousness is developing which sees the Earth as a single organism, and recognises that an organism at war with itself is doomed.” – Carl Sagan

#Equality #Unity #Politics #Philosophy #Division

Read more... Discuss...

from mountain flesh, mountain bones

Caught a boat out into the archipelago. Coastline of thick Oak trees. Exposed bedrock plunging into the Baltic.

Walked around the islands. Watched the tall reeds, grasses billowing.

Faint smell of sea-weed rising from brackish water.


from Micro Matt

A couple weeks ago, I started working on a personal marketplace for selling JPEGs — or NFPs (Neat, Fun Pictures), as I jokingly call them, to poke fun at web3.

Today, I finished the basic application and added it to my site on baer works. Basically, anyone who buys a photo there gets both a high-resolution version for personal use, plus some recognition on the storefront as a patron (listing your name is optional).

In that spirit, I’m calling the tiny application powering it “Fund Your Friends” and I’ve created a GitHub repo for it — I’ll release the source code once I’ve cleaned it up and made it easier to manage.

Read more... Discuss...

from Musings

I got back last week from Alaska. I was only there for a week, but I saw enough. Well, not enough, but enough for what I needed from the trip.

I wanted answers and clarity.

Last year I went to Egypt before starting on a new team at work.

On that trip, I chose to be true to myself and I took that home with me. The lessons I learned did not fare well for the station in life I found myself in when I came back.

After gestating for nine months, I was birthed out of the industry and into my new life.

I was reincarnated two months ago and only went through one round of modern technical interviewing. I banged a uey and got the hell out of dodge.

I don't deal well with limitations imposed by labels. My life is not a rubric anymore and I do not want it to be one again.

In Alaska, everyone cut it on their own with nature; not against it.

The thing I learned in my time spent between Da Nile and Denali is that I was in denial. You cannot dismantle the master's house with the master's tools.

It is time to change the game. I'm not alone. I'm with everyone that stands tall on their own.


from Now Listening to... 🎧

Here's one from a band I just discovered in 2022. They have a number of songs that I feel are really good. This is one of them.

Oh, dance with me, feel the beat, follow my lead Put your hands on my shoulders as I pull you closer Now I can feel your words come true Tonight I've changed, yeah I'm only me because of you

Calming embrace, it's the first time I've felt something real When we stand face to face the world stops and lies still Had nothing left to lose Now I've been saved, yeah I'm only me because of you ♪ ♫ ♪


Read more... Discuss...

from Kroeber

#001077 – 10 de Agosto de 2022

Cresci na Figueira da Foz. A norte a Serra da Estrela. O estuário do Mondego a sul. Assim aprendi o mar, como um sítio a que se chega, vindo do interior. Uma praia, um local aconchegado pela geografia, separado do mundo. Gosto destas viagens ao longo do litoral, no gume da fronteira entre continente e oceano. São uma descoberta tardia. Ensinam-me o território, alimentam-me de beleza.

Leia mais...

from Kroeber

#001076 – 09 de Agosto de 2022

Vou a Aveiro e regresso rapidamente. Há milhares de pessoas na Praia da Barra. Habituado ao silêncio, esta confusão agride-me. Passo pelas Gafanhas, zona em Portugal onde mais se pedala. A chegada ao Furadouro enche-me de energia e sossego. Ovar é uma base perfeita para férias de bicicleta. Chego, quase como a uma casa. Ao final do dia tomo um banho de mar e pôr do sol.

Leia mais...

from Dad vs Videogames 🎮

I started playing Minecraft with my eldest son at his request. I previously played it solo before and never really got into it. But playing split-screen co-op with my son, is a totally different experience. I underestimated how much fun it can be playing it with your kids.

One of the two entrances to our shelter. This is a look at the entrance to our first shelter in the game. This world we are playing in, was created a year or two ago, when I first played the game solo. This shelter was previously just made up of dirt blocks for walls and a fence gate for a door. When I had my son join me in the game, we found out how fragile our shelter was against Creeper explosions. So our first mission was to upgrade our shelter to be more sturdy. So we mined some Cobblestones, figured out how to turn it into Stone and upgraded our shelter with Stone walls and a Wooden door. Apparently in higher difficulty, Zombies can break down a Wooden door, but we were playing in “Easy” difficulty, so that's not an issue.

This is my bed in our shelter. This is a look at my bed inside our shelter. Yes the inside walls were still made of dirt, we were cheap and decided to fortify the entrances first 😄.

This is my son's bed inside our shelter. Yes, we each had our own Crafting Table and Furnace. Not as cost efficient as far as resources go, but hey we're playing to have fun. It also allows us to craft items at our own leisure.

This is the view from the inside of the second entrance to our shelter. Eventually we decided to add another entrance to our shelter. Since our shelter was built into a hill, we decided to just mine all the way to the other side of the hill. This is what the second entrance to the shelter looks like from the inside.

This is the second entrance to our shelter. And a look at the second entrance to our shelter from the outside.

Tags: #GameScreenshots #Minecraft

Read more... Discuss...

from Caught in the Balance

Episode 36.

CW: Self harm

Back | Next image shows the letters C, I, T, B, in bold red type.

Walking down the hill from their campfire to the small camp down at the water’s edge, checking on his fire there and bringing food, Tristin hoped that this would be a night Kayn would talk. Agitated by Reed’s continued questioning about The Validity of the Island, and the disbelief he still held despite it being in plain sight, his challenge had stepped up significantly in the last days of Axel's self containment.

Asking him to take some charcoal and paper down, their leader had wanted a report after he'd checked Kayn’s fire too, not welcome himself after a spat between them during his last visit. Wondering aloud if it were possible to create some diagrams for reference so that he'd have something to look back over, he explained how and why he was trying to remember everything he was doing in one go.

Reluctant, to begin with, something in Axel’s expression urged him, and it wasn't just the impatience from Reeds constant inquiry. After he'd voiced an initial reluctance to leave Issané, his command was laced with a mild threat too.

Conflicted, he needed to chew the fat, his pace quickening down the hill as he rounded the corner, and Kayn was there busy doing nothing sitting at the fire. Uplifted by the sight of him waiting, the next breath almost choked him, a jolt of shock making his body rigid in fear. He had seen him in this position before, and not only him, Axel had stalled in the doorway of his room, watching him cut, before they'd rushed in to stop him the last time. Hunched over in the firelight now, it picked out the silver of his eyes, mirrored in Issané’s blade at his wrist, and a few beads of blood spilt from it, as he gingerly picked at the skin there.

Moving as fast as he could, quietly as possible, he raced with the wind at his back, until he was on his knees in front of him, looking up into his face. It took less than two beats. His eyes glazed over, they were ringed with red and purple and black. He hadn’t slept after all. He had no idea how long for. “Please, Kayn. Can I have this?”

“No, but I’m just... picking... There's a splinter.” He quailed, pressing the flat of the blade against his skin, closing his eyes at the pressure of it.

“I’m going to put my hand on the knife handle, okay? And I’m going to take it out of your hand. I'll be gentle, yeah? Don't flinch.”

“I have to Tris, they’re coming. I have to sto-”

“Not like this. We will stop them, okay? We will. But not like this.”

“Please.” His speech was slurred, speaking with difficulty, and his heart faltered, the crisis severe. “This worry. I’m not- The things I’ve done. You were right not to trust me. Axel shouldn't. Issané knew, I'm just finishing the job. Please... just let me. I'll stop them, and I’ll be out of your way.”

Tristin placed his hand on the blade, the spell broken. The knife had barely cut him, but it was mean enough to draw a little blood without too much effort. Tossing it aside, he sprang into action binding the wound with the necktie he was wearing. “Stay there. Don't move. I will be one second.” Gathering things to make him comfortable, He chose his words with caution, offering to hold him close – mainly so that he wouldn't be able to see the fear in his own face, yet he still resisted his efforts to soothe him. “Kayn. Listen now. You must rest. Just for an hour. I’ll stay to make sure they don’t come while you do. You'll be safe. I’ll be here when you wake up.”

His eyes close, fists still clenched, still fighting to stay awake. “I can’t. I’ll forget where I am. What I’m doing. I’ll forget my place, and they’ll get me. They will. Please don’t let me sleep...”

Tristin smoothed his hair, his voice, he hoped, just as good as honey. “They won't come while I’m here. Rest now, okay?. Remember Sal said to rest a lot, yeah? We’ll stop them now.” He softened, giving in to him, giving in to the embrace. “Tell me where you were, and I’ll remember for you. Look, I've got something to draw on. What if I make some diagrams? Will that help?”

Kayn begins to tell him about the raft and within minutes he is stone cold asleep in his lap. Cursing that knife but blessing his own timing, he held his anger and fear, breathing through it, worrying that if he let it out, he would wake him again. He couldn’t be told to sleep, and he would always fight it during a test he'd set himself like this, but if he didn’t, if he pushed himself too far, if he didn't eat regularly, he was right, they would come for him.

They'd seen him in both states, suffering an attack and a misguided attempt to stop one by cutting himself like this before. The threat was real, and not imagined. They would come, yet Kayn would always deal with threats the same way. And so, he stayed where he was, watching the water's edge glow in the moons-light until the sun rose and when he woke roughly six hours later after that, he relayed back to him as much of the information as he could.

He jumped up, then, back to work, keen to finish what he had started, knowing the next bit of the plan in his head, with a loud “Aha, that's fucking genius, you got it exactly!” at the few lines he'd managed on the parchment in his hand. Getting to his feet himself, casually as he could manage, he reminded him to eat, pointing out the things he had brought with him. Taking his lead he turned to leave as though nothing had happened. He knew this cue well.

Get. Out.

Before walking out of the camp, retrieving the knife he'd thrown, desperate to cast it into the sea, he knows he must return it, the thought of that sparked a dread in him. He was going to have to tell Axel what had happened here, that Kayn had needed regulating, and that he wasn't looking out for his health as diligently as he should. Over his shoulder, he yelled that it will be Jed checking on him later, and Kayn, busily sawing at some wood, waved his acknowledgement, shushing at him without looking up.

Deciding to put that conversation off as long as possible he took the scenic route back to camp, following the shoreline as far as he could go, the water's edge being oddly similar in shape to the weird haze he noticed when-

He didn't want to think about how the earth had almost swallowed them whole, concentrating hard on the shale under his feet, willing the sick feeling of vertigo away from him – praying it wasn't a concussion – grateful that the birdsong meant that at least the wildlife felt comfortable coming back here, even if they were overly loud about it. Watching them swoop over the water, looking for food and home, he marvelled at the number and variety, and sat, skipping stones, laughing while some swooped near thinking they were in for a meal and leaving empty-beaked.

And he pricked his finger on the next stone he took from the sediment around him. Puzzled he looked at it, feeling every single stitch Reed had sewn throb in pity for the new sting. The gold and red of the Cardinal's pin in his hand shocked him as much as the prick but the vermilion glow of the birds-eye on it worried him most. It matched the glow of the Albion guards when they were out for blood, the jewel drawing him in a similar way in the morning sun.

It would be dangerous to leave it lying around for someone else to find. How a mage was up here and survived the tumult they'd been through was beyond him – unless he hadn't survived and this was all that was left? He looked around, expecting to find evidence and got none. Kayn had been right to worry. Turned out, it wasn't just the loneliness affecting Axel, either. Either way, the crow that had been standing on the rock in front of him took a menacing step forward, and the rest of his optimism evaporated. This crow, plus the one, no two, who'd landed behind him didn't seem like they'd be appeased by a handful of seeds, or perhaps in want of company like others he'd known before.

He closed the pin and pocketed it, wary of the tree stump with about a thousand sparrows on it clacking their beaks in eerie unison as the swifts screamed at him in their circular fashion, and tried to remember whether Sal had said to run or walk calmly when they flocked like this, with their own beady, droplet lenses ruby in the sunlight. Was it better to get up at all, or risk waiting it out until the flock moved on to look for food elsewhere?

He decided to walk, and when the gulls and falcons arrived he ended up running anyway.

A cawing clamour woke Axel, temporarily filling his mind with beaks that ripped and pierced through flesh like it was butter, huge birds well known for winning fights by stamping on the skulls of their prey or aiming for their backs to sever spinal chords and feed from the downed carcasses. Disliking the discord around him, he was grateful to ignore it rudely interrupting him from the setting he'd constructed:

Standing at a stall littered with instruments and their paraphernalia, arms crossed and cheerful, he watched Kayn excitedly talk about a highly superior chunk of resin he'd spotted, explaining about the properties within, and the benefits of using it over another kind, and how you could tell it apart from another similar one, and how and why it was so much more special than all the others, yet still cost next to nothing to buy. The tree it came from. The insects that would live in it's leaves and branches...

In the middle of bartering with its current owner, a barrel chested, double bass shaped, mustachioed salesman, he was too busy talking see them looking, but he wasn't. In the mirror behind the musician's head, he watched, waiting for the guard to turn back and explain there was something for the others with him to check out, and when he did, their leader whistled to scatter. The others took immediate flight from wherever they were in the marketplace, all except the smaller of them. They'd been spotted, and he knew the command, still he could not follow it, rooted to the ground instead.

Skittering through the lanes and into the alleys, Axel turned back in time to see a cart of apples tipped over, the guards waylaid by the mess in the street, the boy he dragged along behind him barely touching the ground. Look up, Kayn. Look up when you're being chased. They're looking at your back... I promise, you'll see the alley before they do. Look up.

The message missed, he concentrated on finding a spot to hide instead, round a corner, and another and another, until he was holding his breath and his hand, pressing him into the wall. Axel's grip tightened with the tension in his face and the breath he restrained, squeezing more and more the closer the sound of studded boots came. Marching past their nook, only one stopped to look inside, and Kayn's forehead met his chest. He felt him fight to control his breath by forcing it further down, not to hide his fear, but in an attempt to dissipate its build up, and placed a hand on the back of his neck, hoping to reassure him. He didn't.

Two or three silent, shallow breathed minutes passed, the red-eyed Guard adamant he wouldn't leave empty handed until a family of bin animals frightened him and met it's untimely demise instead. Kayn used the commotion and distraction to back Axel into the last corner, smaller than him, weaker by far, but still intending to protect him with his own body as far as he could, while he still flinched at the sound of every impact. This guard would get to him first, no matter what, and he would do nothing but face front, pressing him between himself and the wall, tighter, and tighter into the shadows still, until the threat had passed them by. It was pure luck that it was still daylight and the guard wasn't carrying any kind lantern or they'd have been seen. Easily.

When Axel opened his eyes again, Kayn had stepped away, and sapphires glittered up at him, wide as saucers, locked onto his face. Realising that they might be standing too close, he tried to play it cool. “Sorry, I didn't mean to drag you like that. We had to scatter – you froze...” No words came as he backed away, just eyes staring up at him. Endless, azure, unblinking staring.

Moving out, he checked over his shoulder, squicked out by the remains of the small lives stamped into the ground, flippant in admonishing their days threatened like that, and he sucked air through his teeth, imagining it. “He'll use the blood on his boots as proof he got us. We should be safe if we give it half hour or so...” When he turned back, Kayn had not yet let out the breath he was still holding in. He watched him, whistling the low command again, and counting the three responses returned to him. “You okay?”

“Toast...” He kicked himself for the nerves allowing him the only word he could manage out loud. Luckily, none of the other things he was all-of-a-sudden feeling showed, and it seemed to go unnoticed. Even if the sun was about to go down, it being nowhere close to breakfast time.

“Yeah, we nearly were.” He nodded, sage in his agreement. “You want to find something to eat before we get the fuck out of here? Let's find a good spot to take it easy and rest up. Good idea.”

Back one Episode. Skip to next episode.

Thank you for reading, here's my carrd.

If you would like to leave me a tip via cashapp and pay an artist directly, you can do so here.

Don't forget, this series is and will always be available for free, and you are welcome to share this episode directly from your browser menu, and subscribe for updates direct to your inbox!

#NSFW #Fiction #AdultFiction #FreeFiction #CaughtInTheBalance #Season2

©2022 BB Chapman


from automata

Have you played wordle? Yeah, me too. I actually play Xordle everyday now. It’s pretty tough. Anyhow, let me pose you a question and maybe it will spark your imagination. I encourage you to try and program it yourself if you’re interested.

The problem is simple: Out of a list of valid 5-letter words, your task is to assemble a list of five of those words, such that between the five you choose, 25 unique letters are represented amongst them. For example, [Salad, Lunch] only represents 8 letters: [A, C, D, H, L, N, S, U]

Here’s a link to the word list.

So, there’s 12973 words. That’s quite a few. Sadly, we need a rather complex subset, because we need a non-repeating combination of those words. How many combinations are there, anyways?


367 quintillion, as it were.

Wolfram Alpha reports this number as approximately equivalent to 8.5 times the PSPACE of a typical 3x3 Rubik’s cube.

There’s a lot of ways in programming that you might deal with such a large number of possibilities when you need to find only one. One way you might start is by reducing the number of candidates to start with.

We need first a function to determine how many unique letters a word actually has.

def unique_letters(word):
    return sorted(list(set([ltr for ltr in word])))


So, thinking about the problem logically, we know that no matter what words we use, there will be five words in the solution. This means that each word MUST have 5 unique letters in it. So, we can reduce our problem space by just removing all the words like “salad,” which have a letter repeated!

aux_words = open("words.txt").read().split("\n")

words = []
for word in aux_words:
    if len(unique_letters(word)) == 5:

I use “aux_” to show that a variable is still being built. Also, you could totally throw this into a function or a context manager if you wanted to make your solver even cleaner. I chose not to, because it works either way and this is the first way that I wrote it.

If you’ve never written a genetic algorithm before, there are some concepts you need to know.

The premise is to use the principle of natural selection to gradually arrive at a “fit” solution, given some fitness function or approximation. You generate a bunch of possible solutions upfront; these are typically just randomly selected from a generator.

def generate_random_population(n, words):
    return [random.sample(words, 5) for x in range(n)]

That’s the way I chose to do it. Using random.sample ensures that we won’t have duplicate words in our candidates.

The next step is also the first step of the life-cycle of the genetic algorithm. Evaluation. The premise is that all the candidates would have their fitness calculated so that further steps of the algorithm can be executed. I used a very simple fitness function that just counts up the unique letters in each solution.

def fitness(word_list):
    return len(set([c for c in "".join(word_list)]))

As an aside, in most cases, this is where the bottleneck of your program is going to be. You might want to spend some effort making your fitness function as efficient as possible or consider using an approximation.

Historically, genetic algorithms have been effective when searching for single, formulaic solutions to problems that have a lot of possible inputs. One of the coolest known successes is in the case of this space antenna.

This is from the 2006 NASA ST5 satellite. In space, there are special conditions that define the way radio signals interfere with themselves. It’s possible to model this interference function but it’s very difficult for human intuition to approach an optimal solution to what geometry to use for the antenna as a result. Scientists used a special design program to run a genetic algorithm against this interference function and this wonky little antenna is the result. Would you have thought to try this particular shape? In a way, this creativity can set machines apart from humans. They try everything without hesitation and are only acting on what objectively works or not, rather than following intuitions or emotions.

The next step is crossover. Now, in the code we will read shortly, I didn’t end up using a crossover approach, but I might as well explain what it is anyways, in case you end up seeing this approach in the wild.

Crossover involves splitting a candidate up into two or more parts and then recombining those parts into a descendant candidate. In simplistic terms, it’s like taking half of your mother’s DNA, and half of your father’s DNA, and then mashing them together, and that’s *your* DNA. Real life doesn’t really work like that, but the approach can be effective occasionally in implementations of the genetic algorithm.

Mutation is another “genetic operator” that is used in GAs. Mutation is exactly what it sounds like, you are taking candidates and tweaking them just a little bit. Maybe that means slicing a little bit off, maybe that means adding a little bit on, maybe that just means changing the order that some things are in, anything goes.

def mutate_candidate(c):
    # candidate is just a list of 5 strings
    res = list.copy(c)
    return res

So, I used list.copy here to avoid mutating the original candidate. The structure I am using for this is essentially going to be just one big loop in a boring, plain script. To that end, the population will be stored in some variable, and if mutate is changing the original list by-reference, then it throws off the fitness calculation for the next round.

There’s one more function I need to show before we get to the big, juicy part of our program. It’s a simple helper function that just grabs the n most-fit candidates from our population. I will explain why we need it shortly.

def most_fit(pop, n=50):
    return sorted(pop, key=fitness, reverse=True)[:n]

That’s it!

Before we drop head-first into the big function, let’s talk about a few things. I highly recommend that you try to implement this algorithm on your own sometime. It can be on a simpler problem, if that makes it any easier. Start with a sentence, and then evolve random letters until they match the sentence. That sort of thing can be a nice exercise to learn the concept.

I’ve played with this a *lot* and so I know some of the pitfalls and shortcomings of this approach. One of these pertains to the idea of local optima. If we think of all the possible candidates and all the fitness’ of those candidates as a geometric space, it will resemble a mountain range. There will be high peaks where the solution is most fit and low valleys where the solution is least fit, with jagged parts in-between. If we’re not careful, it could be possible for the algorithm to get “stuck” in some of the peaks. Imagine if we were running this program, and the candidates only mutated if their next descendant was fitter. This sounds favorable at first glance, but let’s think about it a little more. If we have picked four words, maybe just [First, Second, Third, Fourth] for example. Ignore the fact that they are different lengths. This might leave us in a position where no possible fifth word can increase the fitness of the candidate as a whole. So every generation, no matter what word is mutated, it will never get more fit and it will never die off.

Our use of random.choice in mutate_candidate technically prevents this, but we can take it a step further and design some categories. There’s probably a technical word for this, in my head I call it “tribes.”

Let’s get into some code now.

def evolve(n, words):
    finished   = False
    highest    = 0
    gen        = 0
    population = generate_random_population(n, words)
    while not finished:
        gen += 1
        print(f"gen: {gen} highest: {highest} pop_size: {len(population)}")
        elites = most_fit(population, 25000)
        babies = generate_random_population(25000, words)
        worsen = [mutate_candidate(c) for c in list.copy(elites)]
        legacy = random.choices(population, k = (n - 75000) + (100 * gen))
        legacy = [mutate_candidate(c) for c in legacy]
        population = elites + babies + legacy + worsen

        gen_highest = max(population, key=fitness)
        if fitness(gen_highest) > highest:
            highest = fitness(gen_highest)
            print(f"new highest is {highest}: {gen_highest}")
        if highest == 25:
            finished = True
            print(f"solution: {gen_highest}")

Don’t panic! It’s simpler than it looks. Let’s start at the beginning.

So, finished, highest, and gen. These are just some pieces of state that we will keep track of to have good output as the solver is running.

Finished is a boolean that tells our loop when to stop running. We know that 5 x 5 is 25, so you’ll see at the bottom of the function

if highest == 25:
            finished = True
            print(f"solution: {gen_highest}")

We stop, and print out the solution. Very simple.

Highest is our state for keeping track of the best fitness found so far. We don’t *need* to do this, but I like to see visually how quickly it’s finding improvements. If we were working on a problem-space that had more complexity then it would be helpful to see if it’s finding improvements every few minutes, or once every 12hrs.

Gen is just our generation counter. We increment it at the beginning of every cycle, and that tells us how many times the natural selection cycle has occurred.

Now, let’s move on to our tribes.

elites = most_fit(population, 25000)
        babies = generate_random_population(25000, words)
        worsen = [mutate_candidate(c) for c in list.copy(elites)]
        legacy = random.choices(population, k = (n - 75000) + (100 * gen))
        legacy = [mutate_candidate(c) for c in legacy] 

So, let’s dig in.

Elites are the fittest candidates out of the bunch. This was what we wrote that helper function for. These candidates are the most fit of the bunch and will likely all be the same fitness. If your highest fitness is 24, likely *all* of these candidates will also have a fitness of 24.

Babies are brand new solutions. I’m including them to ensure additional randomness in the gene pool. These babies are just randomly generated from scratch and will likely not be very fit. However, this means that there is constant “motion” in each generation, because next generation these babies will be mutated into possible fitter descendants.

Worsen is a copy of the list of elites, mutated. This is to help the elites from getting stuck, like we learned about earlier.

Finally, we have the legacy. The legacy group is just the mixing pot of the remaining n candidates. You can see that we are using (100 * gen) in our call to random.choices. This lets the total size of population grow each generation. I run this simulation with 400,000 as the initial population size, you can use any number above 75000 and it should still run as expected.

Those are our tribes. I’ve used these tribes because I have played with them before and I have a half-baked intuition for what will work and what won’t, and I felt confident that these would work.

population = elites + babies + legacy + worsen

Here, we shove all the tribes together as the new population and that completes the cycle.

gen_highest = max(population, key=fitness)
        if fitness(gen_highest) > highest:
            highest = fitness(gen_highest)
            print(f"new highest is {highest}: {gen_highest}")
        if highest == 25:
            finished = True
            print(f"solution: {gen_highest}")

We find out what our highest candidate is, update our highest variable from before and check to see if we’re finished.

You can find a link to this script here. The word list is up at the top.

I hope you enjoyed reading this, maybe you’ve learned something along the way!


Join the writers on

Start writing or create a blog