studio status report: 2025-02
month 02 of 2025 was about upgrading Songhay.Publications
to .NET 8.0 and working directly on kintespace.com
I continue to fiddle and struggle with my Obsidian graph view of the month:
I notice that most of nodes labeled with dates hover around the Songhay Publications topics of this Studio which indicates what should be obvious but is actually novel: this Studio works on Publications. It has taken easily over a decade to achieve the obvious. The release of Songhay.Publications
release 8.0.0📦 [GitHub] (which includes the completion of issue #54, struck off below in “sketching out development projects”) represents the last major barrier between me and the obvious.
Below, in “sketching out development projects,” I have added and struck off the following line:
change
Songhay.Player.YouTube
[GitHub] to support deep linking into thumb sets 🔨🐎✨
This change to Songhay.Player.YouTube
occurred last month, represented by the release of the version 8.0.1 NuGet package. A rough prototype of this deep linking can be found at https://staging.kintespace.com/b-roll/yt/set. Importantly, this deep-linking feature makes it possible to replace the index page of kintespace.com with a more static, primal design—finally free of an ancient JavaScript framework called Angular JS.
The bottom line is that the way forward is obvious. Selected notes from this month are below:
[[Songhay Publications (C♯)]]: issue #54 (upgrade to [[dotnet|.NET 8.0]])
I will add the following to issue #54:
It is not recommended to completely remove the Songhay.Publications.DataAccess
project from the [[Songhay Publications - KinteSpace|kintespace.com]] repo because this repo should apply PublicationsDbContext
for the specific [[SQLite]] needs of this publication. All of the EF migration files and direct references to a [[SQLite]] file should be kept in the kintespace.com repo.
By moving PublicationsDbContext
out of the kintespace.com repo, the dotnet ef migrations add
command can no longer use the --project
option [📖 docs ] when run from this repo. The --context
option would be the replacement:
The
DbContext
class to use. Class name only or fully qualified with namespaces. If this option is omitted, EF Core will find the context class. If there are multiple context classes, this option is required.
[[Songhay Publications - KinteSpace|Songhay Publications: kinté space]]
the results of the upgrade to [[dotnet|.NET 8.0]]
It is now clear to me that ‘everything’ I have been working on consistently in this Studio for at least the last 15 years comes together in the [[Songhay Publications - KinteSpace|kintespace.com]] repo, namely all of the ‘cores’:
SonghayCore
[GitHub]Songhay.Modules
[GitHub]Songhay.Modules.Bolero
[GitHub]Songhay.Publications
[GitHub]
[[Songhay Publications - KinteSpace|kinté space]]: “What really happens inside a dating app”
I think that if you are a marketing person and have a bit of a shady personality, you can create a dating app that has significant revenue easily. What you have to do is to create fake girls' profiles; you don't really have to make them talk or match, just be visible on the feed. Then you make guys pay for similar things that Tinder is doing (you can just copy their plans). The best would be to communicate around being an app for sex. When a guy pays, you would just not do anything different than non-paying users. You will probably end up with 90% real guys and 10% real girls, but I would be surprised if you don't make a lot of money with that. Probably a lot of not really popular dating apps you find on the Play Store/Apple Store are just that, and that have no girls.
[[Songhay Publications|Publications]]: “Minimal viable service worker”
From 2018:
The thing is, every website is different. So the service worker strategy for every website needs to be different too.
Still, I was wondering if it would be possible to create a service worker script that would work for most websites. Here’s the script I came up with.
Is this the kind of investigation that led to [[Google Workbox]] (noted [[2024-12-06#Google Google Workbox promises to make browser-based caching easy and useful ❓ to-do day-job|previously]])? In spite of what [[Google]] is doing, here is another article from 2024 yearning for “minimum interesting service worker”:
Basic idea:
You have a service worker (and “offline” HTML page) on your personal site, installed from any page on your site, that all it does is cache the offline page, and on future requests to your site checks to see if the requested page is available, and if so serves it, otherwise it displays your offline page with a “site appears to be unreachable” message that a lot of service workers provide, AND provides an algorithmically constructed link to the page on an archive (e.g. Internet Archive) or static mirror of your site (typically at another domain).
—https://tantek.com/2024/151/t1/minimum-interesting-service-worker
[[Songhay Publications|Publications]]: “A Gentle Introduction to CRDTs”
CRDTs are needed in situations where you want multiple processes to modify the same state without coordinating their writes to that state.

CRDTs - Stop Worrying About Write Conflicts | Systems Design 0 to 1 with Ex-Google SWE

Martin Kleppmann — CRDTs: The hard parts
[[dotnet|.NET]] System.Threading.Channels
The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consumers asynchronously. The library targets .NET Standard and works on all .NET implementations.
…
Channels are an implementation of the producer/consumer conceptual programming model. In this programming model, producers asynchronously produce data, and consumers asynchronously consume that data.
[[Nick Chapsas]] insists that we should have been using Channels instead of [[MediatR]] and the like:
Also, see “An Introduction to System.Threading.Channels” #to-do
[[dotnet|.NET]]: “4 C# features that you (probably) shouldn't be using”
goto
and labels (probably there for translating Bill’s BASIC code) ✅- lambda-based getter [📹 watch ] (effectively hides methods that are invoked with every access to the getter)
- default implementation of interface members [📹 watch ] (slippery slope toward entangling interfaces with inheritance; use extension methods on the interface instead)
- regions [📹 watch ] 😐 (re-factor instead)
[[Songhay Player - YouTube (F♯)]]: caching with service workers will help after initial loading ⏱👀
My [[2024-12-06#Google Google Workbox promises to make browser-based caching easy and useful ❓ to-do day-job|previous]] note about the [[Google]] approach to service workers [📖 docs ] can servcei to remind me that a fundamental use case of service workers is caching—and caching is what [[Songhay Player - YouTube (F♯)|the b-roll player for YouTube 🎥 content]] seriously needs.
In order to address the problem of initial loading, I prioritized finding a service-based way toward caching. But in the particular design of [[Songhay Publications - KinteSpace|kintespace.com]] there should be a static-HTML based ‘splash’ page that should be loaded before the player. This convention suggests that most visitors will discover the player from this ‘splash’ page—this means the ‘splash’ page can call a service worker to cache the data for the player.
[!important] The ‘splash’ page can call a service worker to cache the data for the player.
This convention implies that this Studio should not encourage “deep linking” directly to the player(s).
[[WebAssembly]]: “Rust is Eating JavaScript”
WebAssembly (WASM) is a portable low-level language that Rust can compile to. It runs in the browser, is interoperable with JavaScript, and is supported in all major modern browsers.
WASM is definitely a lot faster than JS, but not quite native speed. In our tests, Parcel runs 10-20x slower when compiled to WASM than with native binaries. – Devon Govett
While WASM isn't the perfect solution yet, it can help developers create extremely fast web experiences. The Rust team is committed to a high-quality and cutting-edge WASM implementation. For developers, this means you could have the performance advantages of Rust (vs. Go) while still compiling for the web (using WASM).
[[Songhay Publications - KinteSpace|the kinté space]] repos are now working together
The ‘legacy’ repo, kinte-space
, is positioned to maintain the current kintespace.com under HTTPS and the new repo, Songhay.Publications.KinteSpace
, recognizes the existence of staging.kintespace.com
, representing the next version of kintespace.com. It is [[2025-02-03#next steps|now ready]] to move forward:
- generating Publication indices from SQLite for the kintespace.com static index experience
builddescribe an [[Songhay Activity|Activity]] that generates existingdata/index*.json
files 🚜✨ ✅- attempt to load
data/index*.json
files witheleventyConfig.addGlobalData
🔨✨ [📖 docs ] - change the Activity that generates existing
data/index*.json
files to generate ‘defaults’ forDocument.ResponsiveImages
🔨🖼✨ - use [[eleventy]] to generate
app-staging/index.html
withdata/index*.json
🔨🍱✨ - copy all images from the legacy repo (
app/images
) 🚜 - change eleventy template for
app-staging/index.html
to add:- [[Songhay Player - YouTube (F♯)]] deep link to thumb set 🔨🐎✨
lunr
search 🔨🍱✨ (==not needed for initial re-release==)- [[Songhay Publications Index (F♯)]] link🔨🐎✨
- generating a new repo for [[Songhay Publications Index (F♯)]] with proposed name,
Songhay.Modules.Bolero.Index
✨🚧 and add a GitHub Project (==not needed for initial re-release==) - building the eleventy template for
kp_*.html
files 🔨🍱✨ - building the eleventy template for
p_*.html
files 🔨🍱✨ - building the eleventy template for
rasx*.html
files 🔨🍱✨ - migrating [[Songhay Publications - KinteSpace|rasx() context]] content from its legacy repo to
app-staging/rasxlog/
🚜
This is pretty much >90% of kintespace.com content.
[[dotnet|.NET 6.0]]: “7 awesome improvements for LINQ in .NET 6”
[[Nick Chapsas]] reports from the .NET 6 era:
Enumerable.Chunk<TSource>
[📖 docs ]Enumerable.TryGetNonEnumeratedCount<TSource>
[📖 docs ] [📹 watch ]IEnumerable.Zip<TFirst,TSecond,TThird>
[📖 docs ] (new support for three-tuple zips)MaxBy
[📖 docs ],MinBy
,*By
[📹 watch ]ElementAt<TSource>(IEnumerable<TSource>, Index)
[📖 docs ] [📹 watch ] (supports theIndex
struct [📖 docs ], including its Index from end operator ^)Take<TSource>(IEnumerable<TSource>, Range)
[📖 docs ] [📹 watch ] (supports theRange
struct [📖 docs ] and its operators)
[[NuGet]]: “20 Nuget packages that every .NET developer should be familiar with”
- [[xUnit.net]]
- NUnit
- [[moq]]
- NSubstitute [📹 watch ]
- [[Polly]]
- Fluent Assertions
- [[BenchmarkDotNet]]
- Serilog
- Autofixture
- [[Bogus]]
- Scrutor
- Automapper [📖 docs ]
- [[Dapper]]
- [[Entity Framework|Entity Framework Core]]
- MediatR (see [[2025-02-11#dotnet .NET “You Probably Don't Need to Worry About MediatR”]])
- Brighter [📹 watch ] #to-do
- [[FluentValidation]]
- Refit #to-do
- RestSharp [📹 watch ]
- Json.NET 😐
[[Songhay Publications - KinteSpace|kintespace.com]]: my cousin, Gozié Ojini, is showing at The Hammer 🎊
“Alice Coltrane, Monument Eternal”:
…also see “Alice Coltrane’s ashram — and her ‘Black radical imagination’ — lives on at the Hammer Museum” 📰
[[hardware]]: “Toyota reveals new fuel-cell stack, isn't giving up on hydrogen cars”
In a press release, the automaker promised improved durability and efficiency, as well as lower production costs for the new stack, which Toyota plans to debut in passenger vehicles and heavy-duty commercial trucks in North America, Europe, China, and Japan by 2026.
Toyota claims the third-generation fuel-cell stack is 1.2 times more fuel-efficient than the previous generation, allowing for a 20% improvement in range between fueling stops. And it claims durability comparable to diesel engines—the powertrain tech that Toyota sees fuel cells replacing in commercial semi trucks.
—“Toyota reveals new fuel-cell stack, isn't giving up on hydrogen cars”
[[dotnet|.NET]]: AutoFixture ✨ #to-do
From https://autofixture.github.io/:
AutoFixture is a tool designed to make Test-Driven Development more productive and unit tests more refactoring-safe. It does so by removing the need for hand-coding anonymous variables as part of a test’s Arrange phase:
[Fact]
public void IntroductoryTest()
{
// Arrange
Fixture fixture = new Fixture();
int expectedNumber = fixture.Create<int>();
MyClass sut = fixture.Create<MyClass>();
// Act
int result = sut.Echo(expectedNumber);
// Assert
Assert.Equal(expectedNumber, result);
}
The AutoData
feature for the Theory
attribute is interesting:
[Theory, AutoData]
public void IntroductoryTest(int expectedNumber, MyClass sut)
{
int result = sut.Echo(expectedNumber);
Assert.Equal(expectedNumber, result);
}
[[Obsidian]]: “Obsidian is now free for work”
People in over 10,000 organizations use Obsidian. Many work in high-security environments, like government, cybersecurity, healthcare, and finance. Some of the largest organizations in the world, including Amazon and Google, have thousands of employees using Obsidian every day. These teams rely on Obsidian to think more effectively and keep total ownership over private data.
Previously, people at companies with two or more employees were required to purchase a Commercial license to use Obsidian for work. Going forward, the Commercial license is no longer required, but remains an optional way for organizations to support Obsidian, similar to the Catalyst license for individuals.
[[Songhay Publications|Publications]]: “Ńdébé: A Modern Writing System for Ìgbò ”
Invented by Lotanna Igwe-Odunze in 2009 and refined over more than a decade, the Ńdébé script is the first truly usable, writeable, and readable indigenous writing system for the Ìgbò language. It masterfully blends ancient Ìgbò designs with modern practicality, creating a script that celebrates cultural heritage while addressing the challenges of contemporary communication.
[[Songhay System Studio]]: “Nigerians are building affordable alternatives to AWS and Google Cloud”
Nigerian entrepreneur Fara Ashiru built her fintech platform, Okra, on Amazon Web Services in 2020. She would pay AWS in dollars even as Okra earned in naira because American cloud providers did not accept payments in local currency at the time.
…
Ashiru took things into her own hands, and Okra set up cloud infrastructure with servers in data centers in Nigeria and South Africa in 2024. Later that year, the cloud operations were spun off into ==a new company called Nebula,== which allows anyone in Nigeria to run their website, app, or workflow on its cloud and pay in naira.
…
Global leaders appear to have noticed the threat. In January, AWS started accepting payments in naira. “Local currencies are important in localizing the payment experience for customers,” AWS said at the time.
—“Nigerians are building affordable alternatives to AWS and Google Cloud”
open pull requests on GitHub 🐙🐈
- https://github.com/BryanWilhite/Songhay.HelloWorlds.Activities/pull/14
- https://github.com/BryanWilhite/dotnet-core/pull/67
sketching out development projects
The current, unfinished public projects on GitHub:
-
replacing the Angular app in
http://kintespace.com/player.html
with a Bolero app 🚜🔥 depends on:
The proposed project items:
- switch Studio from Material Design to Bulma 💄 ➡️ 💄✨
- generating a new repo with proposed name,
Songhay.Modules.Bolero.Index
✨🚧 and add a GitHub Project