bonfire.mavnn.eu/pub/objects...
So this is very much a work in progress (see me having to quote the post to add the hashtags...), but meet fediverss - a simple F# program that puts your static blog rss in the fediverse. #activitypub #fsharp #blog
Explore local activities
bonfire.mavnn.eu/pub/objects...
So this is very much a work in progress (see me having to quote the post to add the hashtags...), but meet fediverss - a simple F# program that puts your static blog rss in the fediverse. #activitypub #fsharp #blog
@mavnn One long-ago employer released a brochure that had a mis-spelling right on the cover. Someone at COMDEX visiting our booth spotted it. To be fair, the font was a modern, stretched-out one that made it hard to spot that "multimedia" was spelled "MULITMEDIA."
But, yikes!
Happy for that security guard.
@[email protected] ah yes, a close relative of the famous glance behind you at the 4 metre high projection of your slides at a conference while talking and spot the spelling mistake moment.
@[email protected] I... both do, and very much do not, want to know where they get the rest of their discourse.
@[email protected] I worked in desktop publishing for a while in a large bank in the UK, producing things like product leftlets and terms and conditions sheets (exciting, I know).
The bank and a printing company jointly paid one contract night security guard a significant amount of money as a thank you after he happened to spot at the beginning of his shift that one of the pages of a 70+ page full colour brouchure was upside down, an error missed by the people at both the bank and the print house. All because he got bored enough to flick through the test print left lying around before the overnight run started.
@[email protected] The bank had around 2,000 branches and we were due to ship multiple copies to all of them, to give a sense of scale. Full colour printing in 1999 wasn't cheap, either.
I was a hardware & software QA person for about 20 years, making sure problems didn't get out the door.
I feel professional pride in reporting this problem so that camera company can fix things.
Boy, I imagine some people are in deep shit over this fuckup. A really bad oversight.
@[email protected] I worked in desktop publishing for a while in a large bank in the UK, producing things like product leftlets and terms and conditions sheets (exciting, I know).
The bank and a printing company jointly paid one contract night security guard a significant amount of money as a thank you after he happened to spot at the beginning of his shift that one of the pages of a 70+ page full colour brouchure was upside down, an error missed by the people at both the bank and the print house. All because he got bored enough to flick through the test print left lying around before the overnight run started.
@[email protected] @[email protected] I'm not a fan in general for a lot of other reasons, but the fact that TypeScript types only exist at compile time (and you can tell the compiler to ignore them) does make things like strongly typed IDs easier to deal with. Generated code can just throw the types away, while user facing code gets type safety (for the value of safety TS allows at the best of times) on ID types without run time impact. Haskell allows alias types that have similar properties.
It's not really the kind of thing the dotnet type system is set up to deal with gracefully though.
@[email protected] @[email protected] Case in point: I use strong IDs in my TypeScript and Haskell projects, but I don't in my F# project that uses Marten. And it isn't because of Marten's support for them or not; it's the amount of hassle it causes in other places and the annoying nagging feeling of taking a run time overhead for code that is less pleasant to work with.
@simoncropp Only if there was a VB-esque concept in the language itself as the types being automatically convertible.
Honestly, I doubt it.
@[email protected] @[email protected] I'm not a fan in general for a lot of other reasons, but the fact that TypeScript types only exist at compile time (and you can tell the compiler to ignore them) does make things like strongly typed IDs easier to deal with. Generated code can just throw the types away, while user facing code gets type safety (for the value of safety TS allows at the best of times) on ID types without run time impact. Haskell allows alias types that have similar properties.
It's not really the kind of thing the dotnet type system is set up to deal with gracefully though.
@[email protected] @[email protected] we did some changes to improve feed performance, you can find the edit button in "advanced" - after opening the 3 vertical dots more menu
@[email protected] @[email protected] hmm. I don't seem to have an advanced option. Am I looking in the right place?
It's that time again! A new half term means a new round of "Coding Games with a Story", our 5 week live online course for under 18s on building a visual novel with Ink.
What's a visual novel? Excellent question! It's the point where the novel (a text based story) intersects with the sceenplay (scenes, character visuals, and soundtrack) and the computer game (the reader can make choices that change the story).
Sounds interesting? Find out more about the instructor and the courses at thinkersmeetup.com/scholars/... , or get a look at the style of what we'll be building at visualink.mavnn.eu/ #homeed #gamedev #visualnovel #interactivefiction
It's that time again! A new half term means a new round of "Coding Games with a Story", our 5 week live online course for under 18s on building a visual novel with Ink.
What's a visual novel? Excellent question! It's the point where the novel (a text based story) intersects with the sceenplay (scenes, character visuals, and soundtrack) and the computer game (the reader can make choices that change the story).
Sounds interesting? Find out more about the instructor and the courses at thinkersmeetup.com/scholars/..., or get a look at the style of what we'll be building at visualink.mavnn.eu/ #visualnovel #creativewriting #homeed #gamedev
@SJohnRoss They help to strain out the tea leaves.
@[email protected] @[email protected] Don't forget the stirring counter clockwise and reflected light of the new moon. It adds a faint aroma of catnip and cinnamon to the brew, and an inexplicable sense of satisfaction when sitting in small boxes for days after drinking.
Coding more games with more stories
Read this post in its full formatted glory at https://blog.mavnn.eu/2026/04/08/coding_games_with_a_story.html
It's that time again! If you know somebody who's 12-18 who likes the idea of writing interactive fiction in the form of visual novels, you can sign up for my five week starter course by browsing over to ThinkersMeetup.
I'm also thinking of expanding the course out for a further five weeks with more advanced techniques and time to actually build the stories, rather than just looking at how to build them so I'll post an update in a few weeks about that as well.
If you have no idea at all what I'm talking about, wonder over to VisualInk and try the example story linked on the home page.
Aaaaaand... on a final note, I'm also looking at two other options. One is an introduction to Godot as an intensive course over the summer to teach real time game development, and the other is interactive fiction courses aimed at adults. If you have any interest in either, let me know. I'm especially if you're an adult interested in expanding creative writing into writing interactive fiction to hear what format works best for you: once a week at lunch time for an hour, weekend courses, several afternoons during a single week as an intensive block with writing time in between? Adult schedules are always interesting to manage.
@blog tagging for some visibility for #creativewriting, #homeed, and #interactivefiction.
I'm going to have a moment of personal satisfaction. Adding a comment system running on my own infrastructure has revealed that my blog post introducing TypeScript developers to the Effect library (blog.mavnn.eu/2024/09/16/int...) has at least one person who just has it open basically all of the time.
Which means people are still finding it helpful enough to reference frequently 18 months after I wrote it, which gives me the warm fuzzies.
Okay, this post is aimed at people I've either worked with or known for a while. I have a friend of a friend looking for a #wordpress expert to help with a project that is mostly completed but has had to be dropped by the original developer. Spec looks good and detailed, requirements seem sane. I need to know you well enough to be able to genuinely recommend you, and you need to know WordPress well enough to deal with several largish plugins that include some bespoke tweaks.
Anyone interested?
Nearly there with the rss -> activitypub script first cut, but slightly hampered by the fact that it seems like there's a bug (github.com/bonfire-networks/...) in the handling of Update activities in Bonfire's client to server #activitypub API. Either that or I'm holding it wrong, which is entirely possible given it is the first time I'm using the API!
As an aside, I'm quite liking the ActivityPub APIs so far, although ld-json does leave me feeling like there's a fair jump from "script that works" to "actually does everything the spec would theoretically allow".
Hmm. That said, I also seem to have lost the ability to update posts via the UI on #bonfire 1.0.2. I didn't spot exactly when the option disappeared from the menu.
Nearly there with the rss -> activitypub script first cut, but slightly hampered by the fact that it seems like there's a bug (github.com/bonfire-networks/...) in the handling of Update activities in Bonfire's client to server #activitypub API. Either that or I'm holding it wrong, which is entirely possible given it is the first time I'm using the API!
As an aside, I'm quite liking the ActivityPub APIs so far, although ld-json does leave me feeling like there's a fair jump from "script that works" to "actually does everything the spec would theoretically allow".
Read this post in its full formatted glory at https://blog.mavnn.eu/2026/03/28/hidden_updates_in_ink.html
Building interactive fiction in Ink sometimes feels like an exercise in smoke and mirrors; there are times where you want to script events where it feels like the reader has agency when actually their decision doesn't change the future story at all, and there are times where you want the future story to be impacted by a decision but you don't want to reveal it immediately.
One example came up this week when I was asked how you could ask a series of questions without revealing whether each individual question was answered correctly - but changing what happens after depending on the overall number that were correct.
How could we do that?
To begin with, anytime we want to track a number or a score in Ink we want a variable.
VAR correct_answers = 0
Next, we're going to want to do the same thing after every correct answer: add one to the score, and then carry on the story from where we were. "Do the same thing in multiple places in the story" is what tunnels are for; knots/sections that use the special ->-> operator to return the story back to where ever you came from.
=== good_answer ~correct_answers = correct_answers + 1 // or you can use the special short hand // that means the same thing as above // ~correct_answers += 1 ->->
Finally, we want each question to provide two or more possible answers, but which ever one you pick the story will continue the same way - just maybe via a side trip to the good_answer knot. Multiple choices which all go the same place use a "gather" (which is just a - on its own line to mark the end of a block of choices).
By using a gather we can avoid having to make every question its own knot, diverting to it, and then having to divert on to the next question. Instead, we can have them all in a single place with a nice clear flow (and a lot less typing).
=== questions Is a wombat a wom, or a bat? * [Wom] * [Bat] * [What?] -> good_answer -> - Is the pineapple a pine, or an apple? * [I dispute the nature of your question] -> good_answer -> * [Pine] * [Apple] - You have answered {correct_answers} questions correctly. -> END
Putting it all together, our script would look something like this:
VAR correct_answers = 0 -> questions === good_answer ~correct_answers = correct_answers + 1 // or you can use the special short hand // that means the same thing as above // ~correct_answers += 1 ->-> === questions Is a wombat a wom, or a bat? * [Wom] * [Bat] * [What?] -> good_answer -> - Is the pineapple a pine, or an apple? * [I dispute the nature of your question] -> good_answer -> * [Pine] * [Apple] - You have answered {correct_answers} questions correctly. -> END
If you want to try it out, you can paste the whole lot into the 'demo' script editor at VisualInk and give it a run for yourself, experimenting with changes as they catch your fancy.
@blog We should now have working comments on the blog as well.
Updated as a test
@mavnn testing more
Read this post in its full formatted glory at https://blog.mavnn.eu/2021/09/22/NewBeginnings.html
This is just a short test; I'm beginning to publish my blog via Emacs Org mode rather than Jekyll because... well, because I don't enjoy updating Ruby, and blogging is something that I (partially) do for my own relaxation and enjoyment.
So... welcome to the new blog. To those few of you subscribed to my blog as a feed, apologies for the largely content free post.
If this works I'll be updating as I go along with actual posts, as well as the obligatory posts on how the blog works and why I've set it up as I'm planning to.
Remind me why every developer feels the need to do that, again?
Updated as a test