studio status report: 2025-09
Month 09 of 2025 was about actually working inside of this sketch:
This is a very rough rendering of the brand new Publications stack for kintespace.com. The layers of this stack starts with:
- Markdown with Obsidian
Songhay.Publications.KinteSpace.DataAccess
(over SQLite) to index/tag the Markdown files and provide other meta-data (e.g. responsive-image data) as static JSON- eleventy, to transform Markdown and static JSON into HTML in the conventional staging directory,
/app-staging
- webpack for the Typescript pipeline in the conventional
/src
directory - Sass for Bulma CSS in the conventional
/src
directory - Blazor WebAssembly, the progressive enhancement vector, providing the b-roll player and Index experiences, rooted under
/app-staging/b-roll
- b-roll player cloud APIs (
Songhay.Player
), supporting the b-roll player (Blazor WebAssembly) assets
The Obsidian graph for this month shows about 19 days of work but this number might be a bit inflated due to poor use of categories:
Selected notes of the month:
Songhay System Studio: some “triggered” words from Don Syme 😐
The belief system I’m referring to is what I’ll call “The Symbolic Supremacy”. This is a common and widespread belief system about programming, closely associated with logic, formalism, functional programming and other fields I’ve been involved with in my career, but to be honest most computer scientists in most faculties are adherents to some extent. To a first approximation, the tenets of this belief system are:
Programs should be expressed in symbolic notation following logical mathematical rules.
Programs must have a precise interpretation. The more precise, the better. Precision is the essence of programming.
Anything claiming to implement “natural language programming” is fundamentally invalid, wrong, foolish and/or deceptive.
Publications: Anna’s Archive 😐🐈
Congrats to my daughter for finding this one:
We preserve books, papers, comics, magazines, and more, by bringing these materials from various shadow libraries, official libraries, and other collections together in one place. All this data is preserved forever by making it easy to duplicate it in bulk — using torrents — resulting in many copies around the world. Some shadow libraries already do this themselves (e.g. Sci-Hub, Library Genesis), while Anna’s Archive “liberates” other libraries that don’t offer bulk distribution (e.g. Z-Library) or aren’t shadow libraries at all (e.g. Internet Archive, DuXiu).
This wide distribution, combined with open-source code, makes our website resilient to takedowns, and ensures the long-term preservation of humanity’s knowledge and culture. Learn more about our datasets.
Dapper: the parameter system does not (or no longer) works with LIKE
😐 #day-job
Given an anonymous-object set of parameters:
new { myParam, myOtherParam }
(…or even the “Dynamic Parameters” equivalent), Dapper will ignore a LIKE
pattern in this form:
MY_COLUMN LIKE @myParam
AND
MY_OTHER_COLUMN LIKE @myOtherParam
And, of course everything will work as expected when LIKE
is replaced by =
:
MY_COLUMN = @myParam
AND
MY_OTHER_COLUMN = @myOtherParam
There is a StackOverflow answer that suggests we have to hard-code the wildcards into the string instead of passing them in the parameter(s) 😐⏳
Songhay Player - YouTube (F♯): finally able to record the CSS issue 😐🔎
After a lengthy correction of Mockoon configuration (including the improving of Songhay Player (C♯) automated tests), I can look at the CSS issue like a professional:
[!important] There is no explicit setting for
img.height
undervideo.thumbs.thumbs-container
and defaults toauto
.
Additionally, video.thumbs.thumbs-container > div
needs to have its height set explicitly to 100%
:
.NET 10 is supposed to eliminate the ReadOnlyCollection<T>
performance issues 😐
So what’s going on here? It’s super subtle. First, it’s necessary to know that
ReadOnlyCollection<T>
just wraps an arbitraryIList<T>
, theReadOnlyCollection<T>
‘sGetEnumerator()
returns_list.GetEnumerator()
(I’m ignoring for this discussion the special-case where the list is empty), andReadOnlyCollection<T>
‘s indexer just indexes into theIList<T>
‘s indexer. So far presumably this all sounds like what you’d expect. But where things gets interesting is around what the JIT is able to devirtualize. In .NET 9, it struggles to devirtualize calls to the interface implementations specifically onT[]
, so it won’t devirtualize either the_list.GetEnumerator()
call nor the_list[index]
call. However, the enumerator that’s returned is just a normal type that implementsIEnumerator<T>
, and the JIT has no problem devirtualizing itsMoveNext
andCurrent
members. Which means that we’re actually paying a lot more going through the indexer, because forN
elements, we’re having to makeN
interface calls, whereas with the enumerator, we only need the one withGetEnumerator
interface call and then no more after that.Thankfully, this is now addressed in .NET 10. dotnet/runtime#108153, dotnet/runtime#109209, dotnet/runtime#109237, and dotnet/runtime#116771 all make it possible for the JIT to devirtualize array’s interface method implementations. Now when we run the same benchmark (reverted back to using
ToArray
), we get results much more in line with our expectations, with both benchmarks improving from .NET 9 to .NET 10, and withSumForLoop
on .NET 10 being the fastest.
Publications: “CSS Custom Functions with @function”
If you thought the if() function was cool, hold on to your hats because CSS functions just landed in Chrome 139! This capability is an absolute game-changer for writing more organized and dynamic CSS.
Songhay Publications: kinté space forces new Studio convention for webpack 😐
Time was lost yesterday in an attempt to use webpack with CSS as well as with JavaScript. Going forward, the Studio will respect this statement:
Webpack is a module bundler. ==Its main purpose is to bundle JavaScript files for usage in a browser==, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.
As of right now, I do not know what a CSS “module” is 😐🧠
This Obsidian journal (and the previous Joplin journal) has no detailed history on the use of :
- the
OptimizeCSSAssetsPlugin
- the
CssMinimizerPlugin
- the
MiniCssExtractPlugin
Because of the nature of the “community” and “plug-in” beasts, I replaced OptimizeCSSAssetsPlugin
with CssMinimizerPlugin
[📖 docs ] to (probably) stop peer-dependency failures with npm
. I made no notes about this change. However, the only reason why CssMinimizerPlugin
is needed is because of the desire to have MiniCssExtractPlugin
[📖 docs ] for CSS “module”-bundling.
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
Eliminating Angular JS in the Studio is the top priority. Replacing the Angular JS app (http://kintespace.com/player.html
) for the kinté space depends on:
- generating a new
index.html
page with eleventy - supplementing the index with responsive images
Proposed future items:
- complete upgrade to .NET 8.0
- switch Studio Publications from Material Design to Bulma 💄 ➡️ 💄✨
- start
Songhay.Modules.Bolero.Index
project - generate responsive and social images with AI