studio status report: 2026-01
Month 01 of 2026 was about not getting the re-release of kintespace.com almost out the ‘door’—even though well over 90% is done! The month was mostly spent on #day-job drama, including:
- a new understanding of DDD aggregates and how Entity Framework supports them
- the very real possibility that the Application Insights
TelemetryClientcan be centralized with Azure Functions middle-ware
…and then more days were used on Studio minutiae like:
- establishing modern, responsive-image conventions for Studio publications (like kintespace.com)
- how Anaconda probably needs to be reinstalled with every minor release of Python
Let’s see how this vicious surprise attack of new things to learn soaked up days in this Obsidian month:

…nine days on Entity Framework…

…which overlaps with one day on Application Insights (and Azure Functions)…

…but Anaconda adds three more days of not working on Studio Publications. So we have 12 days here of not re-releasing a website. Let’s regard those 12 days as ‘all’ of my ‘free’ time for this month.
…and here is a punchline: the Anaconda drama was a self-made blocker in front of establishing the new responsive image conventions aforementioned! I could have worked around my Anaconda problems to get kintespace.com out the door; but, in my luxuriant poverty, I refused to do so 😐🧱
My Studio notes on responsive images start in a Jupyter Notebook. And every sucker for Jupyter knows that Jupyter depends on Python—and, in my case, my Studio uses Python via Anaconda. In my little world, no Anaconda means no updated responsive-image document—and no updated responsive image document means the re-release of kintespace.com is blocked.
Selected Obsidian notes of this month should provide some color:
Testcontainers for .NET: #day-job #to-do
Testcontainers for .NET is a library to support tests with throwaway instances of Docker containers for all compatible .NET Standard versions. The library is built on top of the .NET Docker Remote API and provides a lightweight implementation to support your test environment in all circumstances.
Choose from existing pre-configured modules and start containers within a second, to support and run your tests. Or create your own container images with Dockerfiles and run your containers and tests immediately afterward.
The following video is a not-so-great intro to Testcontainers.MsSql [📖 docs ]:
Angular: “Forms with Angular Signals”
Signal Forms is ==an experimental library== that allows you to manage form state in Angular applications by building on the reactive foundation of signals. With automatic two-way binding, type-safe field access, and schema-based validation, Signal Forms help you create robust forms.
Entity Framework: does the DatabaseFacade class [📖 docs ] replace Dapper? #to-do #day-job
The short answer is, yes 👇
Will This New EF Core Feature Be The End Of Dapper?
Everything You Need To Know About EF Core 8 Raw SQL Queries
.NET Facets over AutoMapper? #day-job #to-do
!Pasted image 20260106092909.png
Think of a diamond. The whole stone is your domain model, it contains everything about the entity. But when you view it from different angles, you see different facets, specific views that show only what matters from that perspective.
Entity Framework: about four ways to see the generated SQL #day-job #to-do
Microsoft.EntityFrameworkCore.Database.Commandinappsettings.jsonToQueryString()extension methodLogTo()call inProgram.cs- Visual Studio debug visualization
Background reading:
- “How to Show the Generated SQL Query in EF Core”
- “3 Ways to View and Log the SQL Generated by Entity Framework Core 5”
- “Enabling Detailed Entity Framework Error Logging for Better Debugging”
Publications: “Why Developers Are Ditching Frameworks for Vanilla JavaScript”
The problem wasn’t frameworks themselves; it was the culture that grew around them. New frameworks emerged monthly, each claiming to fix what the last one broke. Companies refactored entire products just to keep up with the shifting ecosystem. The result? Endless churn, technical debt disguised as innovation, and developers trapped in a loop of constant relearning.
In 2025, the realization hit: The web doesn’t need another layer. It needs a reset. And that reset came in the form of Vanilla JavaScript.
—“Why Developers Are Ditching Frameworks for Vanilla JavaScript”
Songhay Player (C♯) and #day-job: can TelemetryClient be moved to middle-ware?
Today at the #day-job, I learned about IFunctionsWorkerMiddleware as introduced in “Azure Functions – Middleware (dotnet-isolated).” This leads to the following questions:
- can
FunctionContextbe passed correctly with theHttpTriggerAzure Functions signature? (Without this, data cannot be passed from the function method to the middle-ware—e.g.context.Items["MyCustomData"] = "Hello from function!";) - does
FunctionContextactually contain the function parameters—as explained in a StackOverflow answer (see [📖 docs ])?
Internet Products: yes, there are responsive-image testing tools—starting with the browser tools 😐📋 #to-do
- “How to test Responsive Images” (Google Chrome Device Mode and the BrowserStack Responsive Tool)
- TOOLSADAY Responsive Image Checker
.NET C♯: “World's Fastest .NET CSV Parser.” #day-job #to-do 😐
Modern, minimal, fast, zero allocation, reading and writing of separated values (
csv,tsvetc.). Cross-platform, trimmable and AOT/NativeAOT compatible. Featuring an opinionated API design and pragmatic implementation targetted at machine learning use cases.
mystery solved: KDE Plasma does not use the equivalent of the GNOME “keyring” by default 😐💡✨
[!important] By default, KDE Plasma requires calling
ssh-addmanually which is tedious but more secure.
This SuperUser answer finally reveals what has been going on:
…you might want to just start
ssh-agentin your.bash_profileand eval the output instead of starting a subshell, and then usessh-addyourself manually once each time you log in.Another option would be to use the GNOME Keyring's SSH agent emulation instead of using
ssh-agent. Unlikessh-agentthat doesn't save your passphrase, the GNOME Keyring will store the passphrase to the key in a keyring so you don't have to add keys manually.
These revelations lead to comparing GNOME Keyring and KWallet KDE Wallet:
Alright, let’s break down what these two are all about. At their core, GNOME Keyring and KWallet are essentially digital vaults designed to store your sensitive credentials – think usernames, passwords, API keys, and even SSH/GPG keys – in an encrypted format. They act as a central hub, so instead of remembering dozens of complex passwords, you only need to recall one master password.
- GNOME Keyring: This is the default password manager for the GNOME desktop environment, which is common in distributions like Ubuntu and Fedora. It’s designed to work seamlessly in the background, integrating with applications like NetworkManager for Wi-Fi passwords, web browsers, and other GNOME-native apps.
- KWallet KDE Wallet: Similarly, KWallet is the go-to password manager for the KDE Plasma desktop environment, prevalent in Kubuntu and many other distributions. It serves the same purpose: securely storing passwords and other secrets, and integrating with KDE applications, browsers, and system services.
—“Gnome Keyring And KWallet: Your Linux Password Managers Explained”
my biggest Entity Framework talk of 2025 #to-do 😐
related reading
- “Table Splitting in EF Core: When to Use It (and Why It Hurts Sometimes)”
- “Shadow and Indexer Properties”
- “Model configuration for auto-including navigations”
- “Configuring a value converter” (shows the
HasConversionmethod) - “Dynamic EF operations with
EF.Property” - “The Fluent API
HasDiscriminatorMethod” - “EF Core Lazy Loading Explained & Best Practices (2025)” (because Chris Klug consistently doe not recommend lazy loading)
Entity Framework: “the Aggregate pattern is about transactional consistency”
Wow, I had no idea that eventual consistency was related to DDD:
First and foremost the Aggregate pattern is about transactional consistency. At the end of a committed database transaction, a single Aggregate should be completely up to date. That means that any business rules regarding data consistency must be met and the persistence store should hold that consistent state, leaving the Aggregate correct and ready to use by the next use case. Figure 1 illustrates two such consistency boundaries, with two different Aggregates.
…
The problem that many have with designing Aggregates is that they don’t consider the true business constraints that require data to be transactionally consistent and instead design Aggregates in large clusters as shown in Figure 2. Designing Aggregates in this way is a big mistake if you expect them (1) to be used by many thousands of users, (2) to perform well, and (3) to scale to the demands of the Internet.
…
When two or more Aggregates have at least some dependencies on updates, use eventual consistency.
By the way, this article goes on to show me how an interface can be used to define the DDD ‘business-rule’ members to be implemented by the ‘domain model’ class:
I think you get the idea. We create an interface that we want our client to see and we hide the implementation details inside the implementing class.
However, the article turns against the use of interfaces:
There is really no good reason to create a Separated Interface. It would be very unlikely that we would ever create two or more implementations of
IProductor any of the other interfaces. The best reason we have for creating a Separated Interface is when there could be or are multiple implementations, and is just not going to happen in this Core Domain.
Anaconda: “CondaEnvironmentError: cannot remove current environment”
The error "
CondaEnvironmentError: cannot remove current environment" occurs for multiple reasons:
- Trying to delete a
condaenvironment that is currently active.- Using an incorrect command to delete a
condaenvironment.- Trying to delete the
baseconda environment which cannot be deleted.
There we have the first written evidence (from a third party) that the base environment cannot be deleted.
…
The following statements about Anaconda have to be verified ( #to-do ):
- tools like
anaconda-navigatoralways run off thebaseenvironment - environments cannot be upgraded beyond a major release of
python(my observed behavior ofconda update python[📖 docs ]) - the only way to work with the next major release of
python(without reinstalling Anaconda entirely) is to generate a new environment (e.g.conda create -n myenv python=3.14[📖 docs ]) - the
baseenvironment of Anaconda is ‘trapped’ on the major release of python that was available when it was installed
When my last bullet point up there is found to be true, then:
- Why should all of these data science packages like Pandas and Jupyter Notebooks be installed in the
baseenvironment by default? Is there a way to disable this—or is this one of the reasons why Miniconda exists? - Do they expect us to use the
baseenvironment as some kind of read-only guide for adding packages (manually?) to a new environment that we must generate? Is thebaseenvironment the ‘reference environment’?
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
- upgrade
SonghayCore,Songhay.Publications,Songhay.DataAccess, etc. to .NET 10 📦🔝 - consider using Lerna to coordinate the two levels of
npmscripts 🧠👟 - use a Jupyter Notebook to track finding and changing Amazon links to open source links 📓⚙
- use a Jupyter Notebook to convert flickr links to Publications (responsive image) links 📓⚙
- establish
DataAccesslogic for Obsidian markdown metadata 🔨✨ - establish
DataAccesslogic for Index data, including adding and removing Obsidian documents (and Segments) 🔨✨ - package
DataAccesslogic in*Shellproject fornpmscripting 🚜✨ - convert rasx() context repo to the relevant conventions shown in the diagram above 🔨🚜
- retire the old
kinte-spacerepo for kintespace.com 🚜🧊 - convert Songhay Day Path Blog repo to the relevant conventions shown in the diagram above 🔨🚜
- re-release Songhay Dashboard by updating its repo to the relevant conventions shown in the diagram above 🔨🚜
- start development of Songhay Publications Index (F♯) experience for WebAssembly 🍱✨
- start development of Songhay Publications - Data Editor to establish a GUI for
*Shelland provide visualizations and interactions for Publications data 🍱✨